pub struct TcpSocket {Show 35 fields
state: Mutex<TcpState>,
local_ip: Mutex<Option<Ipv4Address>>,
pub(crate) local_port: AtomicU16,
remote_ip: Mutex<Option<Ipv4Address>>,
remote_port: AtomicU16,
send_seq: AtomicU32,
send_unacked: AtomicU32,
recv_seq: AtomicU32,
recv_ack: AtomicU32,
send_window: AtomicU16,
recv_window: AtomicU16,
send_buffer: Mutex<VecDeque<u8>>,
recv_buffer: Mutex<VecDeque<u8>>,
tcp_layer: Weak<TcpLayer>,
self_weak: Weak<TcpSocket>,
pending_accept: Mutex<VecDeque<Arc<TcpSocket>>>,
max_backlog: AtomicUsize,
bytes_sent: AtomicU64,
bytes_received: AtomicU64,
srtt: AtomicU32,
rttvar: AtomicU32,
rto: AtomicU32,
retrans_count: AtomicU16,
retrans_timer_id: Mutex<Option<u64>>,
last_send_time: AtomicU64,
timing_rtt: AtomicU16,
timed_seq: AtomicU32,
unacked_segments: Mutex<VecDeque<UnackedSegment>>,
out_of_order: Mutex<BTreeMap<u32, OutOfOrderSegment>>,
accept_waker: Mutex<Option<Arc<Waker>>>,
recv_waker: Mutex<Option<Arc<Waker>>>,
send_waker: Mutex<Option<Arc<Waker>>>,
blocking_mode: AtomicBool,
dup_ack_count: AtomicU16,
last_ack_seq: AtomicU32,
}Expand description
TCP socket (full implementation)
Fields§
§state: Mutex<TcpState>TCP connection state
local_ip: Mutex<Option<Ipv4Address>>Local IP address
local_port: AtomicU16Local port
remote_ip: Mutex<Option<Ipv4Address>>Remote IP address
remote_port: AtomicU16Remote port
send_seq: AtomicU32Sequence numbers
send_unacked: AtomicU32§recv_seq: AtomicU32§recv_ack: AtomicU32§send_window: AtomicU16Window size
recv_window: AtomicU16§send_buffer: Mutex<VecDeque<u8>>Data buffers
recv_buffer: Mutex<VecDeque<u8>>§tcp_layer: Weak<TcpLayer>Reference to TCP layer
self_weak: Weak<TcpSocket>Weak self reference for registration
pending_accept: Mutex<VecDeque<Arc<TcpSocket>>>Pending accepted connections (listener only)
max_backlog: AtomicUsizeMaximum backlog size (from listen())
bytes_sent: AtomicU64Statistics
bytes_received: AtomicU64§srtt: AtomicU32RTO (Retransmission Timeout) calculation - RFC 6298 Smoothed RTT (8 * srtt for fixed-point arithmetic)
rttvar: AtomicU32RTT variation (4 * rttvar for fixed-point arithmetic)
rto: AtomicU32Current RTO in ticks (initial: 1 second = 100 ticks @ 10ms)
retrans_count: AtomicU16Retransmission count for exponential backoff
retrans_timer_id: Mutex<Option<u64>>Timer ID for retransmission timer
last_send_time: AtomicU64Timestamp of last segment transmission (for RTT measurement)
timing_rtt: AtomicU16Whether we’re timing an RTT measurement (Karn’s algorithm)
timed_seq: AtomicU32Sequence number being timed
unacked_segments: Mutex<VecDeque<UnackedSegment>>List of unacknowledged segments for retransmission
out_of_order: Mutex<BTreeMap<u32, OutOfOrderSegment>>Out-of-order segments for reassembly (sorted by sequence number)
accept_waker: Mutex<Option<Arc<Waker>>>Waker for blocking accept() operations
recv_waker: Mutex<Option<Arc<Waker>>>Waker for blocking recv() operations
send_waker: Mutex<Option<Arc<Waker>>>Waker for blocking send() operations
blocking_mode: AtomicBoolBlock mode: true for blocking, false for non-blocking
dup_ack_count: AtomicU16Duplicate ACK count for Fast Retransmit
last_ack_seq: AtomicU32Last ACK sequence number for detecting duplicates
Implementations§
Source§impl TcpSocket
impl TcpSocket
Sourcepub fn from_socket_object(socket: &Arc<dyn SocketObject>) -> Option<&Self>
pub fn from_socket_object(socket: &Arc<dyn SocketObject>) -> Option<&Self>
Safely downcast a SocketObject to TcpSocket using Any trait
Returns None if socket is not a TcpSocket. This is completely safe and does not use any unsafe code.
Sourcepub fn accept_blocking(
&self,
task_id: usize,
trapframe: &mut Trapframe,
) -> Result<Arc<dyn SocketObject>, SocketError>
pub fn accept_blocking( &self, task_id: usize, trapframe: &mut Trapframe, ) -> Result<Arc<dyn SocketObject>, SocketError>
Blocking accept - waits for a connection
fn matches_peer(&self, src_ip: Ipv4Address, src_port: u16) -> bool
fn ensure_local_ip(&self)
fn register_local_port(&self, port: u16) -> Result<(), SocketError>
fn allocate_ephemeral_port(&self) -> u16
Sourcepub fn process_segment(
&self,
src_ip: Ipv4Address,
header: TcpHeader,
data: &[u8],
)
pub fn process_segment( &self, src_ip: Ipv4Address, header: TcpHeader, data: &[u8], )
Process incoming TCP segment
Sourcefn handle_syn_received(&self, src_ip: Ipv4Address, header: TcpHeader)
fn handle_syn_received(&self, src_ip: Ipv4Address, header: TcpHeader)
Handle incoming SYN (SYN-RECEIVED state)
Sourcefn handle_syn_ack_received(&self, src_ip: Ipv4Address, header: TcpHeader)
fn handle_syn_ack_received(&self, src_ip: Ipv4Address, header: TcpHeader)
Handle received SYN-ACK (move to ESTABLISHED)
Sourcefn handle_rst(&self)
fn handle_rst(&self)
Handle RST (Reset) - properly cleanup connection
Sourcefn handle_control_segment(&self, src_ip: Ipv4Address, header: TcpHeader)
fn handle_control_segment(&self, src_ip: Ipv4Address, header: TcpHeader)
Handle control segment (ACK, FIN, RST)
Sourcefn handle_data_segment(
&self,
src_ip: Ipv4Address,
header: TcpHeader,
data: &[u8],
)
fn handle_data_segment( &self, src_ip: Ipv4Address, header: TcpHeader, data: &[u8], )
Handle data segment
Sourcefn handle_fin(&self, src_ip: Ipv4Address, header: TcpHeader)
fn handle_fin(&self, src_ip: Ipv4Address, header: TcpHeader)
Handle FIN segment
Sourcefn update_send_window(&self, ack_number: u32)
fn update_send_window(&self, ack_number: u32)
Update send window based on acknowledgment
Sourcefn fast_retransmit(&self)
fn fast_retransmit(&self)
Fast Retransmit - immediately retransmit unacknowledged segments
Sourcefn send_syn(&self, dest_ip: Ipv4Address, dest_port: u16)
fn send_syn(&self, dest_ip: Ipv4Address, dest_port: u16)
Send SYN packet
Sourcefn send_syn_ack(
&self,
dest_ip: Ipv4Address,
dest_port: u16,
their_seq: u32,
ack_seq: u32,
)
fn send_syn_ack( &self, dest_ip: Ipv4Address, dest_port: u16, their_seq: u32, ack_seq: u32, )
Send SYN-ACK packet
Sourcefn send_ack(&self, dest_ip: Ipv4Address, dest_port: u16, ack_seq: u32)
fn send_ack(&self, dest_ip: Ipv4Address, dest_port: u16, ack_seq: u32)
Send ACK packet
Sourcefn send_fin_ack(&self)
fn send_fin_ack(&self)
Send FIN-ACK packet
Sourcefn send_segment(
&self,
dest_ip: Ipv4Address,
header: TcpHeader,
data: &[u8],
update_seq: bool,
is_retransmit: bool,
)
fn send_segment( &self, dest_ip: Ipv4Address, header: TcpHeader, data: &[u8], update_seq: bool, is_retransmit: bool, )
Send TCP segment through IP layer
Sourcepub fn send_data(&self, data: &[u8]) -> Result<usize, SocketError>
pub fn send_data(&self, data: &[u8]) -> Result<usize, SocketError>
Send data through socket
Sourcepub fn send_blocking(
&self,
data: &[u8],
task_id: usize,
trapframe: &mut Trapframe,
) -> Result<usize, SocketError>
pub fn send_blocking( &self, data: &[u8], task_id: usize, trapframe: &mut Trapframe, ) -> Result<usize, SocketError>
Blocking send - waits for buffer space
Sourcepub fn recv_data(&self, buffer: &mut [u8]) -> Result<usize, SocketError>
pub fn recv_data(&self, buffer: &mut [u8]) -> Result<usize, SocketError>
Receive data from socket
Sourcepub fn recv_blocking(
&self,
buffer: &mut [u8],
task_id: usize,
trapframe: &mut Trapframe,
) -> Result<usize, SocketError>
pub fn recv_blocking( &self, buffer: &mut [u8], task_id: usize, trapframe: &mut Trapframe, ) -> Result<usize, SocketError>
Blocking receive - waits for data to be available
Sourcefn update_rto(&self, rtt_ticks: u32)
fn update_rto(&self, rtt_ticks: u32)
Update RTO based on RTT measurement (Jacobson/Karels algorithm) Uses fixed-point arithmetic for better precision in no_std
Sourcefn get_rto_ms(&self) -> u32
fn get_rto_ms(&self) -> u32
Get current RTO in milliseconds
Sourcefn get_rto_ticks(&self) -> u32
fn get_rto_ticks(&self) -> u32
Get current RTO in ticks
Sourcefn start_rtt_measurement(&self, seq: u32)
fn start_rtt_measurement(&self, seq: u32)
Start RTT measurement for a sequence number
Sourcefn stop_rtt_measurement(&self, ack_seq: u32)
fn stop_rtt_measurement(&self, ack_seq: u32)
Stop RTT measurement when ACK is received
Sourcefn backoff_rto(&self)
fn backoff_rto(&self)
Exponential backoff for retransmission
Sourcefn max_retransmissions_exceeded(&self) -> bool
fn max_retransmissions_exceeded(&self) -> bool
Check if maximum retransmissions exceeded
Sourcefn handle_retrans_timeout(&self, seq: u32)
fn handle_retrans_timeout(&self, seq: u32)
Handle retransmission timeout
Sourcefn schedule_retrans_timer(&self, seq: u32)
fn schedule_retrans_timer(&self, seq: u32)
Schedule retransmission timer for a segment
Sourcefn cancel_retrans_timer(&self)
fn cancel_retrans_timer(&self)
Cancel retransmission timer
Sourcefn add_unacked_segment(&self, seq: u32, data: Vec<u8>, flags: u8)
fn add_unacked_segment(&self, seq: u32, data: Vec<u8>, flags: u8)
Add segment to unacked list and schedule retransmission
Sourcefn remove_acked_segments(&self, ack_seq: u32)
fn remove_acked_segments(&self, ack_seq: u32)
Remove acknowledged segments from unacked list