53 |
initialize TCP. */ |
initialize TCP. */ |
54 |
void tcp_tmr (void); /* Must be called every |
void tcp_tmr (void); /* Must be called every |
55 |
TCP_TMR_INTERVAL |
TCP_TMR_INTERVAL |
56 |
ms. (Typically 100 ms). */ |
ms. (Typically 250 ms). */ |
57 |
/* Application program's interface: */ |
/* Application program's interface: */ |
58 |
struct tcp_pcb * tcp_new (void); |
struct tcp_pcb * tcp_new (void); |
59 |
struct tcp_pcb * tcp_alloc (u8_t prio); |
struct tcp_pcb * tcp_alloc (u8_t prio); |
115 |
#define TCP_SEQ_GT(a,b) ((s32_t)((a)-(b)) > 0) |
#define TCP_SEQ_GT(a,b) ((s32_t)((a)-(b)) > 0) |
116 |
#define TCP_SEQ_GEQ(a,b) ((s32_t)((a)-(b)) >= 0) |
#define TCP_SEQ_GEQ(a,b) ((s32_t)((a)-(b)) >= 0) |
117 |
|
|
118 |
#define TCP_FIN 0x01 |
#define TCP_FIN 0x01U |
119 |
#define TCP_SYN 0x02 |
#define TCP_SYN 0x02U |
120 |
#define TCP_RST 0x04 |
#define TCP_RST 0x04U |
121 |
#define TCP_PSH 0x08 |
#define TCP_PSH 0x08U |
122 |
#define TCP_ACK 0x10 |
#define TCP_ACK 0x10U |
123 |
#define TCP_URG 0x20 |
#define TCP_URG 0x20U |
124 |
|
#define TCP_ECE 0x40U |
125 |
|
#define TCP_CWR 0x80U |
126 |
|
|
127 |
#define TCP_FLAGS 0x3f |
#define TCP_FLAGS 0x3fU |
128 |
|
|
129 |
/* Length of the TCP header, excluding options. */ |
/* Length of the TCP header, excluding options. */ |
130 |
#define TCP_HLEN 20 |
#define TCP_HLEN 20 |
131 |
|
|
132 |
#ifndef TCP_TMR_INTERVAL |
#ifndef TCP_TMR_INTERVAL |
133 |
#define TCP_TMR_INTERVAL 100 /* The TCP timer interval in |
#define TCP_TMR_INTERVAL 250 /* The TCP timer interval in |
134 |
milliseconds. */ |
milliseconds. */ |
135 |
#endif /* TCP_TMR_INTERVAL */ |
#endif /* TCP_TMR_INTERVAL */ |
136 |
|
|
137 |
#ifndef TCP_FAST_INTERVAL |
#ifndef TCP_FAST_INTERVAL |
138 |
#define TCP_FAST_INTERVAL 200 /* the fine grained timeout in |
#define TCP_FAST_INTERVAL TCP_TMR_INTERVAL /* the fine grained timeout in |
139 |
milliseconds */ |
milliseconds */ |
140 |
#endif /* TCP_FAST_INTERVAL */ |
#endif /* TCP_FAST_INTERVAL */ |
141 |
|
|
142 |
#ifndef TCP_SLOW_INTERVAL |
#ifndef TCP_SLOW_INTERVAL |
143 |
#define TCP_SLOW_INTERVAL 500 /* the coarse grained timeout in |
#define TCP_SLOW_INTERVAL (2*TCP_TMR_INTERVAL) /* the coarse grained timeout in |
144 |
milliseconds */ |
milliseconds */ |
145 |
#endif /* TCP_SLOW_INTERVAL */ |
#endif /* TCP_SLOW_INTERVAL */ |
146 |
|
|
151 |
|
|
152 |
#define TCP_MSL 60000 /* The maximum segment lifetime in microseconds */ |
#define TCP_MSL 60000 /* The maximum segment lifetime in microseconds */ |
153 |
|
|
154 |
|
/* |
155 |
|
* User-settable options (used with setsockopt). |
156 |
|
*/ |
157 |
|
#define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */ |
158 |
|
#define TCP_KEEPALIVE 0x02 /* send KEEPALIVE probes when idle for pcb->keepalive miliseconds */ |
159 |
|
|
160 |
|
/* Keepalive values */ |
161 |
|
#define TCP_KEEPDEFAULT 7200000 /* KEEPALIVE timer in miliseconds */ |
162 |
|
#define TCP_KEEPINTVL 75000 /* Time between KEEPALIVE probes in miliseconds */ |
163 |
|
#define TCP_KEEPCNT 9 /* Counter for KEEPALIVE probes */ |
164 |
|
#define TCP_MAXIDLE TCP_KEEPCNT * TCP_KEEPINTVL /* Maximum KEEPALIVE probe time */ |
165 |
|
|
166 |
|
|
167 |
#ifdef PACK_STRUCT_USE_INCLUDES |
#ifdef PACK_STRUCT_USE_INCLUDES |
168 |
# include "arch/bpstruct.h" |
# include "arch/bpstruct.h" |
169 |
#endif |
#endif |
173 |
PACK_STRUCT_FIELD(u16_t dest); |
PACK_STRUCT_FIELD(u16_t dest); |
174 |
PACK_STRUCT_FIELD(u32_t seqno); |
PACK_STRUCT_FIELD(u32_t seqno); |
175 |
PACK_STRUCT_FIELD(u32_t ackno); |
PACK_STRUCT_FIELD(u32_t ackno); |
176 |
PACK_STRUCT_FIELD(u16_t _offset_flags); |
PACK_STRUCT_FIELD(u16_t _hdrlen_rsvd_flags); |
177 |
PACK_STRUCT_FIELD(u16_t wnd); |
PACK_STRUCT_FIELD(u16_t wnd); |
178 |
PACK_STRUCT_FIELD(u16_t chksum); |
PACK_STRUCT_FIELD(u16_t chksum); |
179 |
PACK_STRUCT_FIELD(u16_t urgp); |
PACK_STRUCT_FIELD(u16_t urgp); |
183 |
# include "arch/epstruct.h" |
# include "arch/epstruct.h" |
184 |
#endif |
#endif |
185 |
|
|
186 |
#define TCPH_OFFSET(hdr) (ntohs((hdr)->_offset_flags) >> 8) |
#define TCPH_OFFSET(phdr) (ntohs((phdr)->_hdrlen_rsvd_flags) >> 8) |
187 |
#define TCPH_FLAGS(hdr) (ntohs((hdr)->_offset_flags) & 0xff) |
#define TCPH_HDRLEN(phdr) (ntohs((phdr)->_hdrlen_rsvd_flags) >> 12) |
188 |
|
#define TCPH_FLAGS(phdr) (ntohs((phdr)->_hdrlen_rsvd_flags) & TCP_FLAGS) |
189 |
#define TCPH_OFFSET_SET(hdr, offset) (hdr)->_offset_flags = htons(((offset) << 8) | TCPH_FLAGS(hdr)) |
|
190 |
#define TCPH_FLAGS_SET(hdr, flags) (hdr)->_offset_flags = htons((TCPH_OFFSET(hdr) << 8) | (flags)) |
#define TCPH_OFFSET_SET(phdr, offset) (phdr)->_hdrlen_rsvd_flags = htons(((offset) << 8) | TCPH_FLAGS(phdr)) |
191 |
|
#define TCPH_HDRLEN_SET(phdr, len) (phdr)->_hdrlen_rsvd_flags = htons(((len) << 12) | TCPH_FLAGS(phdr)) |
192 |
|
#define TCPH_FLAGS_SET(phdr, flags) (phdr)->_hdrlen_rsvd_flags = htons((ntohs((phdr)->_hdrlen_rsvd_flags) & ~TCP_FLAGS) | (flags)) |
193 |
|
#define TCPH_SET_FLAG(phdr, flags ) (phdr)->_hdrlen_rsvd_flags = htons(ntohs((phdr)->_hdrlen_rsvd_flags) | (flags)) |
194 |
|
#define TCPH_UNSET_FLAG(phdr, flags) (phdr)->_hdrlen_rsvd_flags = htons(ntohs((phdr)->_hdrlen_rsvd_flags) | (TCPH_FLAGS(phdr) & ~(flags)) ) |
195 |
|
|
196 |
#define TCP_TCPLEN(seg) ((seg)->len + ((TCPH_FLAGS((seg)->tcphdr) & TCP_FIN || \ |
#define TCP_TCPLEN(seg) ((seg)->len + ((TCPH_FLAGS((seg)->tcphdr) & TCP_FIN || \ |
197 |
TCPH_FLAGS((seg)->tcphdr) & TCP_SYN)? 1: 0)) |
TCPH_FLAGS((seg)->tcphdr) & TCP_SYN)? 1: 0)) |
213 |
|
|
214 |
/* the TCP protocol control block */ |
/* the TCP protocol control block */ |
215 |
struct tcp_pcb { |
struct tcp_pcb { |
216 |
|
/* Common members of all PCB types */ |
217 |
|
IP_PCB; |
218 |
|
|
219 |
|
/* Protocol specific PCB members */ |
220 |
|
|
221 |
struct tcp_pcb *next; /* for the linked list */ |
struct tcp_pcb *next; /* for the linked list */ |
222 |
|
|
223 |
|
enum tcp_state state; /* TCP state */ |
224 |
|
|
225 |
u8_t prio; |
u8_t prio; |
226 |
void *callback_arg; |
void *callback_arg; |
227 |
|
|
|
struct ip_addr local_ip; |
|
228 |
u16_t local_port; |
u16_t local_port; |
|
enum tcp_state state; /* TCP state */ |
|
|
|
|
|
struct ip_addr remote_ip; |
|
229 |
u16_t remote_port; |
u16_t remote_port; |
230 |
|
|
231 |
|
u8_t flags; |
232 |
|
#define TF_ACK_DELAY (u8_t)0x01U /* Delayed ACK. */ |
233 |
|
#define TF_ACK_NOW (u8_t)0x02U /* Immediate ACK. */ |
234 |
|
#define TF_INFR (u8_t)0x04U /* In fast recovery. */ |
235 |
|
#define TF_RESET (u8_t)0x08U /* Connection was reset. */ |
236 |
|
#define TF_CLOSED (u8_t)0x10U /* Connection was sucessfully closed. */ |
237 |
|
#define TF_GOT_FIN (u8_t)0x20U /* Connection was closed by the remote end. */ |
238 |
|
#define TF_NODELAY (u8_t)0x40U /* Disable Nagle algorithm */ |
239 |
|
|
240 |
/* receiver varables */ |
/* receiver varables */ |
241 |
u32_t rcv_nxt; /* next seqno expected */ |
u32_t rcv_nxt; /* next seqno expected */ |
242 |
u16_t rcv_wnd; /* receiver window */ |
u16_t rcv_wnd; /* receiver window */ |
249 |
u16_t rtime; |
u16_t rtime; |
250 |
|
|
251 |
u16_t mss; /* maximum segment size */ |
u16_t mss; /* maximum segment size */ |
|
|
|
|
u8_t flags; |
|
|
#define TF_ACK_DELAY 0x01U /* Delayed ACK. */ |
|
|
#define TF_ACK_NOW 0x02U /* Immediate ACK. */ |
|
|
#define TF_INFR 0x04U /* In fast recovery. */ |
|
|
#define TF_RESET 0x08U /* Connection was reset. */ |
|
|
#define TF_CLOSED 0x10U /* Connection was sucessfully closed. */ |
|
|
#define TF_GOT_FIN 0x20U /* Connection was closed by the remote end. */ |
|
252 |
|
|
253 |
/* RTT estimation variables. */ |
/* RTT estimation variables. */ |
254 |
u16_t rttest; /* RTT estimate in 500ms ticks */ |
u16_t rttest; /* RTT estimate in 500ms ticks */ |
306 |
/* Function to be called whenever a fatal error occurs. */ |
/* Function to be called whenever a fatal error occurs. */ |
307 |
void (* errf)(void *arg, err_t err); |
void (* errf)(void *arg, err_t err); |
308 |
#endif /* LWIP_CALLBACK_API */ |
#endif /* LWIP_CALLBACK_API */ |
309 |
|
|
310 |
|
/* idle time before KEEPALIVE is sent */ |
311 |
|
u32_t keepalive; |
312 |
|
|
313 |
|
/* KEEPALIVE counter */ |
314 |
|
u8_t keep_cnt; |
315 |
}; |
}; |
316 |
|
|
317 |
struct tcp_pcb_listen { |
struct tcp_pcb_listen { |
318 |
|
/* Common members of all PCB types */ |
319 |
|
IP_PCB; |
320 |
|
|
321 |
|
/* Protocol specific PCB members */ |
322 |
struct tcp_pcb_listen *next; /* for the linked list */ |
struct tcp_pcb_listen *next; /* for the linked list */ |
|
u8_t prio; |
|
|
void *callback_arg; |
|
323 |
|
|
|
struct ip_addr local_ip; |
|
|
u16_t local_port; |
|
324 |
/* Even if state is obviously LISTEN this is here for |
/* Even if state is obviously LISTEN this is here for |
325 |
* field compatibility with tpc_pcb to which it is cast sometimes |
* field compatibility with tpc_pcb to which it is cast sometimes |
326 |
* Until a cleaner solution emerges this is here.FIXME |
* Until a cleaner solution emerges this is here.FIXME |
327 |
*/ |
*/ |
328 |
enum tcp_state state; /* TCP state */ |
enum tcp_state state; /* TCP state */ |
329 |
|
|
330 |
|
u8_t prio; |
331 |
|
void *callback_arg; |
332 |
|
|
333 |
|
u16_t local_port; |
334 |
|
|
335 |
#if LWIP_CALLBACK_API |
#if LWIP_CALLBACK_API |
336 |
/* Function to call when a listener has been connected. */ |
/* Function to call when a listener has been connected. */ |
337 |
err_t (* accept)(void *arg, struct tcp_pcb *newpcb, err_t err); |
err_t (* accept)(void *arg, struct tcp_pcb *newpcb, err_t err); |
431 |
|
|
432 |
u32_t tcp_next_iss(void); |
u32_t tcp_next_iss(void); |
433 |
|
|
434 |
|
void tcp_keepalive(struct tcp_pcb *pcb); |
435 |
|
|
436 |
extern struct tcp_pcb *tcp_input_pcb; |
extern struct tcp_pcb *tcp_input_pcb; |
437 |
extern u32_t tcp_ticks; |
extern u32_t tcp_ticks; |
438 |
|
|
443 |
void tcp_debug_print_pcbs(void); |
void tcp_debug_print_pcbs(void); |
444 |
int tcp_pcbs_sane(void); |
int tcp_pcbs_sane(void); |
445 |
#else |
#else |
446 |
#define tcp_pcbs_sane() 1 |
# define tcp_debug_print(tcphdr) |
447 |
|
# define tcp_debug_print_flags(flags) |
448 |
|
# define tcp_debug_print_state(s) |
449 |
|
# define tcp_debug_print_pcbs() |
450 |
|
# define tcp_pcbs_sane() 1 |
451 |
#endif /* TCP_DEBUG */ |
#endif /* TCP_DEBUG */ |
452 |
|
|
453 |
#if NO_SYS |
#if NO_SYS |