32 #ifndef LWIP_HDR_TCP_H 33 #define LWIP_HDR_TCP_H 62 typedef err_t (*tcp_accept_fn)(
void *arg,
struct tcp_pcb *newpcb,
err_t err);
74 typedef err_t (*tcp_recv_fn)(
void *arg,
struct tcp_pcb *tpcb,
88 typedef err_t (*tcp_sent_fn)(
void *arg,
struct tcp_pcb *tpcb,
100 typedef err_t (*tcp_poll_fn)(
void *arg,
struct tcp_pcb *tpcb);
112 typedef void (*tcp_err_fn)(
void *arg,
err_t err);
126 typedef err_t (*tcp_connected_fn)(
void *arg,
struct tcp_pcb *tpcb,
err_t err);
129 #define RCV_WND_SCALE(pcb, wnd) (((wnd) >> (pcb)->rcv_scale)) 130 #define SND_WND_SCALE(pcb, wnd) (((wnd) << (pcb)->snd_scale)) 131 #define TCPWND16(x) ((u16_t)LWIP_MIN((x), 0xFFFF)) 132 #define TCP_WND_MAX(pcb) ((tcpwnd_size_t)(((pcb)->flags & TF_WND_SCALE) ? TCP_WND : TCPWND16(TCP_WND))) 133 typedef u32_t tcpwnd_size_t;
134 typedef u16_t tcpflags_t;
136 #define RCV_WND_SCALE(pcb, wnd) (wnd) 137 #define SND_WND_SCALE(pcb, wnd) (wnd) 138 #define TCPWND16(x) (x) 139 #define TCP_WND_MAX(pcb) TCP_WND 140 typedef u16_t tcpwnd_size_t;
141 typedef u8_t tcpflags_t;
158 #if LWIP_CALLBACK_API 166 #define DEF_ACCEPT_CALLBACK tcp_accept_fn accept; 168 #define DEF_ACCEPT_CALLBACK 174 #define TCP_PCB_COMMON(type) \ 176 void *callback_arg; \ 178 DEF_ACCEPT_CALLBACK \ 179 enum tcp_state state; \ 190 TCP_PCB_COMMON(
struct tcp_pcb);
196 #define TF_ACK_DELAY 0x01U 197 #define TF_ACK_NOW 0x02U 198 #define TF_INFR 0x04U 199 #define TF_TIMESTAMP 0x08U 200 #define TF_RXCLOSED 0x10U 202 #define TF_NODELAY 0x40U 203 #define TF_NAGLEMEMERR 0x80U 205 #define TF_WND_SCALE 0x0100U 212 u8_t polltmr, pollinterval;
218 tcpwnd_size_t rcv_wnd;
219 tcpwnd_size_t rcv_ann_wnd;
220 u32_t rcv_ann_right_edge;
241 tcpwnd_size_t ssthresh;
245 u32_t snd_wl1, snd_wl2;
248 tcpwnd_size_t snd_wnd;
249 tcpwnd_size_t snd_wnd_max;
253 tcpwnd_size_t snd_buf;
254 #define TCP_SNDQUEUELEN_OVERFLOW (0xffffU-3) 259 u16_t unsent_oversize;
263 struct tcp_seg *unsent;
264 struct tcp_seg *unacked;
266 struct tcp_seg *ooseq;
269 struct pbuf *refused_data;
271 #if LWIP_CALLBACK_API 277 tcp_connected_fn connected;
284 #if LWIP_TCP_TIMESTAMPS 285 u32_t ts_lastacksent;
291 #if LWIP_TCP_KEEPALIVE 299 u8_t persist_backoff;
310 struct tcp_pcb_listen {
314 TCP_PCB_COMMON(
struct tcp_pcb_listen);
316 #if TCP_LISTEN_BACKLOG 318 u8_t accepts_pending;
320 #if LWIP_IPV4 && LWIP_IPV6 321 u8_t accept_any_ip_version;
331 LWIP_EVENT_CONNECTED,
336 err_t lwip_tcp_event(
void *arg,
struct tcp_pcb *pcb,
345 struct tcp_pcb * tcp_new (
void);
347 void tcp_arg (
struct tcp_pcb *pcb,
void *arg);
348 void tcp_accept (
struct tcp_pcb *pcb, tcp_accept_fn accept);
349 void tcp_recv (
struct tcp_pcb *pcb, tcp_recv_fn recv);
350 void tcp_sent (
struct tcp_pcb *pcb, tcp_sent_fn sent);
351 void tcp_poll (
struct tcp_pcb *pcb, tcp_poll_fn poll,
u8_t interval);
352 void tcp_err (
struct tcp_pcb *pcb, tcp_err_fn err);
354 #define tcp_mss(pcb) (((pcb)->flags & TF_TIMESTAMP) ? ((pcb)->mss - 12) : (pcb)->mss) 355 #define tcp_sndbuf(pcb) (TCPWND16((pcb)->snd_buf)) 356 #define tcp_sndqueuelen(pcb) ((pcb)->snd_queuelen) 357 #define tcp_nagle_disable(pcb) ((pcb)->flags |= TF_NODELAY) 358 #define tcp_nagle_enable(pcb) ((pcb)->flags = (tcpflags_t)((pcb)->flags & ~TF_NODELAY)) 359 #define tcp_nagle_disabled(pcb) (((pcb)->flags & TF_NODELAY) != 0) 361 #if TCP_LISTEN_BACKLOG 362 #define tcp_accepted(pcb) do { \ 363 LWIP_ASSERT("pcb->state == LISTEN (called for wrong pcb?)", pcb->state == LISTEN); \ 364 (((struct tcp_pcb_listen *)(pcb))->accepts_pending--); } while(0) 366 #define tcp_accepted(pcb) LWIP_ASSERT("pcb->state == LISTEN (called for wrong pcb?)", \ 367 (pcb)->state == LISTEN) 370 void tcp_recved (
struct tcp_pcb *pcb,
u16_t len);
374 u16_t port, tcp_connected_fn connected);
376 struct tcp_pcb * tcp_listen_with_backlog(
struct tcp_pcb *pcb,
u8_t backlog);
377 #define tcp_listen(pcb) tcp_listen_with_backlog(pcb, TCP_DEFAULT_LISTEN_BACKLOG) 379 void tcp_abort (
struct tcp_pcb *pcb);
380 err_t tcp_close (
struct tcp_pcb *pcb);
381 err_t tcp_shutdown(
struct tcp_pcb *pcb,
int shut_rx,
int shut_tx);
384 #define TCP_WRITE_FLAG_COPY 0x01 385 #define TCP_WRITE_FLAG_MORE 0x02 387 err_t tcp_write (
struct tcp_pcb *pcb,
const void *dataptr,
u16_t len,
390 void tcp_setprio (
struct tcp_pcb *pcb,
u8_t prio);
392 #define TCP_PRIO_MIN 1 393 #define TCP_PRIO_NORMAL 64 394 #define TCP_PRIO_MAX 127 396 err_t tcp_output (
struct tcp_pcb *pcb);
399 const char* tcp_debug_state_str(
enum tcp_state s);
402 struct tcp_pcb * tcp_new_ip6 (
void);
404 #if LWIP_IPV4 && LWIP_IPV6 405 struct tcp_pcb * tcp_listen_dual_with_backlog(
struct tcp_pcb *pcb,
u8_t backlog);
406 #define tcp_listen_dual(pcb) tcp_listen_dual_with_backlog(pcb, TCP_DEFAULT_LISTEN_BACKLOG) 408 #define tcp_listen_dual_with_backlog(pcb, backlog) tcp_listen_with_backlog(pcb, backlog) 409 #define tcp_listen_dual(pcb) tcp_listen(pcb)