40 lines
1.2 KiB
Plaintext
40 lines
1.2 KiB
Plaintext
|
How the new TCP output machine [nyi] works.
|
||
|
|
||
|
|
||
|
Data is kept on a single queue. The skb->users flag tells us if the frame is
|
||
|
one that has been queued already. To add a frame we throw it on the end. Ack
|
||
|
walks down the list from the start.
|
||
|
|
||
|
We keep a set of control flags
|
||
|
|
||
|
|
||
|
sk->tcp_pend_event
|
||
|
|
||
|
TCP_PEND_ACK Ack needed
|
||
|
TCP_ACK_NOW Needed now
|
||
|
TCP_WINDOW Window update check
|
||
|
TCP_WINZERO Zero probing
|
||
|
|
||
|
|
||
|
sk->transmit_queue The transmission frame begin
|
||
|
sk->transmit_new First new frame pointer
|
||
|
sk->transmit_end Where to add frames
|
||
|
|
||
|
sk->tcp_last_tx_ack Last ack seen
|
||
|
sk->tcp_dup_ack Dup ack count for fast retransmit
|
||
|
|
||
|
|
||
|
Frames are queued for output by tcp_write. We do our best to send the frames
|
||
|
off immediately if possible, but otherwise queue and compute the body
|
||
|
checksum in the copy.
|
||
|
|
||
|
When a write is done we try to clear any pending events and piggy back them.
|
||
|
If the window is full we queue full sized frames. On the first timeout in
|
||
|
zero window we split this.
|
||
|
|
||
|
On a timer we walk the retransmit list to send any retransmits, update the
|
||
|
backoff timers etc. A change of route table stamp causes a change of header
|
||
|
and recompute. We add any new tcp level headers and refinish the checksum
|
||
|
before sending.
|
||
|
|