1 /** the TCP protocol control block */
2 struct tcp_pcb {
3 /** common PCB members */
4 IP_PCB;
5 /** protocol specific PCB members */
6 TCP_PCB_COMMON(struct tcp_pcb);
7
8 /* ports are in host byte order */
9 u16_t remote_port;
10
11 tcpflags_t flags;
12 #define TF_ACK_DELAY 0x01U /* Delayed ACK. */
13 #define TF_ACK_NOW 0x02U /* Immediate ACK. */
14 #define TF_INFR 0x04U /* In fast recovery. */
15 #define TF_CLOSEPEND 0x08U /* If this is set, tcp_close failed to enqueue the FIN (retried in tcp_tmr) */
16 #define TF_RXCLOSED 0x10U /* rx closed by tcp_shutdown */
17 #define TF_FIN 0x20U /* Connection was closed locally (FIN segment enqueued). */
18 #define TF_NODELAY 0x40U /* Disable Nagle algorithm */
19 #define TF_NAGLEMEMERR 0x80U /* nagle enabled, memerr, try to output to prevent delayed ACK to happen */
20 #if LWIP_WND_SCALE
21 #define TF_WND_SCALE 0x0100U /* Window Scale option enabled */
22 #endif
23 #if TCP_LISTEN_BACKLOG
24 #define TF_BACKLOGPEND 0x0200U /* If this is set, a connection pcb has increased the backlog on its listener */
25 #endif
26 #if LWIP_TCP_TIMESTAMPS
27 #define TF_TIMESTAMP 0x0400U /* Timestamp option enabled */
28 #endif
29 #define TF_RTO 0x0800U /* RTO timer has fired, in-flight data moved to unsent and being retransmitted */
30 #if LWIP_TCP_SACK_OUT
31 #define TF_SACK 0x1000U /* Selective ACKs enabled */
32 #endif
33
34 /* the rest of the fields are in host byte order
35 as we have to do some math with them */
36
37 /* Timers */
38 u8_t polltmr, pollinterval;
39 u8_t last_timer;
40 u32_t tmr;
41
42 /* receiver variables */
43 u32_t rcv_nxt; /* next seqno expected */
44 tcpwnd_size_t rcv_wnd; /* receiver window available */
45 tcpwnd_size_t rcv_ann_wnd; /* receiver window to announce */
46 u32_t rcv_ann_right_edge; /* announced right edge of window */
47
48 #if LWIP_TCP_SACK_OUT
49 /* SACK ranges to include in ACK packets (entry is invalid if left==right) */
50 struct tcp_sack_range rcv_sacks[LWIP_TCP_MAX_SACK_NUM];
51 #define LWIP_TCP_SACK_VALID(pcb, idx) ((pcb)->rcv_sacks[idx].left != (pcb)->rcv_sacks[idx].right)
52 #endif /* LWIP_TCP_SACK_OUT */
53
54 /* Retransmission timer. */
55 s16_t rtime;
56
57 u16_t mss; /* maximum segment size */
58
59 /* RTT (round trip time) estimation variables */
60 u32_t rttest; /* RTT estimate in 500ms ticks */
61 u32_t rtseq; /* sequence number being timed */
62 s16_t sa, sv; /* @see "Congestion Avoidance and Control" by Van Jacobson and Karels */
63
64 s16_t rto; /* retransmission time-out (in ticks of TCP_SLOW_INTERVAL) */
65 u8_t nrtx; /* number of retransmissions */
66
67 /* fast retransmit/recovery */
68 u8_t dupacks;
69 u32_t lastack; /* Highest acknowledged seqno. */
70
71 /* congestion avoidance/control variables */
72 tcpwnd_size_t cwnd;
73 tcpwnd_size_t ssthresh;
74
75 /* first byte following last rto byte */
76 u32_t rto_end;
77
78 /* sender variables */
79 u32_t snd_nxt; /* next new seqno to be sent */
80 u32_t snd_wl1, snd_wl2; /* Sequence and acknowledgement numbers of last
81 window update. */
82 u32_t snd_lbb; /* Sequence number of next byte to be buffered. */
83 tcpwnd_size_t snd_wnd; /* sender window */
84 tcpwnd_size_t snd_wnd_max; /* the maximum sender window announced by the remote host */
85
86 tcpwnd_size_t snd_buf; /* Available buffer space for sending (in bytes). */
87 #define TCP_SNDQUEUELEN_OVERFLOW (0xffffU-3)
88 u16_t snd_queuelen; /* Number of pbufs currently in the send buffer. */
89
90 #if TCP_OVERSIZE
91 /* Extra bytes available at the end of the last pbuf in unsent. */
92 u16_t unsent_oversize;
93 #endif /* TCP_OVERSIZE */
94
95 tcpwnd_size_t bytes_acked;
96
97 /* These are ordered by sequence number: */
98 struct tcp_seg *unsent; /* Unsent (queued) segments. */
99 struct tcp_seg *unacked; /* Sent but unacknowledged segments. */
100 #if TCP_QUEUE_OOSEQ
101 struct tcp_seg *ooseq; /* Received out of sequence segments. */
102 #endif /* TCP_QUEUE_OOSEQ */
103
104 struct pbuf *refused_data; /* Data previously received but not yet taken by upper layer */
105
106 #if LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG
107 struct tcp_pcb_listen* listener;
108 #endif /* LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG */
109
110 #if LWIP_CALLBACK_API
111 /* Function to be called when more send buffer space is available. */
112 tcp_sent_fn sent;
113 /* Function to be called when (in-sequence) data has arrived. */
114 tcp_recv_fn recv;
115 /* Function to be called when a connection has been set up. */
116 tcp_connected_fn connected;
117 /* Function which is called periodically. */
118 tcp_poll_fn poll;
119 /* Function to be called whenever a fatal error occurs. */
120 tcp_err_fn errf;
121 #endif /* LWIP_CALLBACK_API */
122
123 #if LWIP_TCP_TIMESTAMPS
124 u32_t ts_lastacksent;
125 u32_t ts_recent;
126 #endif /* LWIP_TCP_TIMESTAMPS */
127
128 /* idle time before KEEPALIVE is sent */
129 u32_t keep_idle;
130 #if LWIP_TCP_KEEPALIVE
131 u32_t keep_intvl;
132 u32_t keep_cnt;
133 #endif /* LWIP_TCP_KEEPALIVE */
134
135 /* Persist timer counter */
136 u8_t persist_cnt;
137 /* Persist timer back-off */
138 u8_t persist_backoff;
139 /* Number of persist probes */
140 u8_t persist_probe;
141
142 /* KEEPALIVE counter */
143 u8_t keep_cnt_sent;
144
145 #if LWIP_WND_SCALE
146 u8_t snd_scale;
147 u8_t rcv_scale;
148 #endif
149 };