1da177e4c3
Initial git repository build. I'm not bothering with the full history, even though we have it. We can create a separate "historical" git archive of that later if we want to, and in the meantime it's about 3.2GB when imported into git - space that would just make the early git days unnecessarily complicated, when we don't have a lot of good infrastructure for it. Let it rip!
39 lines
1.2 KiB
Text
39 lines
1.2 KiB
Text
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.
|
|
|