87typedef err_t (*tcp_accept_fn)(
void *arg,
struct tcp_pcb *newpcb,
err_t err);
99typedef err_t (*tcp_recv_fn)(
void *arg,
struct tcp_pcb *tpcb,
113typedef err_t (*tcp_sent_fn)(
void *arg,
struct tcp_pcb *tpcb,
125typedef err_t (*tcp_poll_fn)(
void *arg,
struct tcp_pcb *tpcb);
137typedef void (*tcp_err_fn)(
void *arg,
err_t err);
151typedef err_t (*tcp_connected_fn)(
void *arg,
struct tcp_pcb *tpcb,
err_t err);
154#define RCV_WND_SCALE(pcb, wnd) (((wnd) >> (pcb)->rcv_scale))
155#define SND_WND_SCALE(pcb, wnd) (((wnd) << (pcb)->snd_scale))
156#define TCPWND16(x) ((u16_t)LWIP_MIN((x), 0xFFFF))
157#define TCP_WND_MAX(pcb) ((tcpwnd_size_t)(((pcb)->flags & TF_WND_SCALE) ? TCP_WND : TCPWND16(TCP_WND)))
158typedef u32_t tcpwnd_size_t;
160#define RCV_WND_SCALE(pcb, wnd) (wnd)
161#define SND_WND_SCALE(pcb, wnd) (wnd)
162#define TCPWND16(x) (x)
163#define TCP_WND_MAX(pcb) TCP_WND
164typedef u16_t tcpwnd_size_t;
167#if LWIP_WND_SCALE || TCP_LISTEN_BACKLOG || LWIP_TCP_TIMESTAMPS
168typedef u16_t tcpflags_t;
170typedef u8_t tcpflags_t;
190#define TCP_PCB_COMMON(type) \
192 void *callback_arg; \
193 enum tcp_state state; \
200struct tcp_pcb_listen {
204 TCP_PCB_COMMON(
struct tcp_pcb_listen);
208 tcp_accept_fn accept;
211#if TCP_LISTEN_BACKLOG
213 u8_t accepts_pending;
223 TCP_PCB_COMMON(
struct tcp_pcb);
229#define TF_ACK_DELAY 0x01U
230#define TF_ACK_NOW 0x02U
232#define TF_CLOSEPEND 0x08U
233#define TF_RXCLOSED 0x10U
235#define TF_NODELAY 0x40U
236#define TF_NAGLEMEMERR 0x80U
238#define TF_WND_SCALE 0x0100U
240#if TCP_LISTEN_BACKLOG
241#define TF_BACKLOGPEND 0x0200U
243#if LWIP_TCP_TIMESTAMPS
244#define TF_TIMESTAMP 0x0400U
251 u8_t polltmr, pollinterval;
257 tcpwnd_size_t rcv_wnd;
258 tcpwnd_size_t rcv_ann_wnd;
259 u32_t rcv_ann_right_edge;
280 tcpwnd_size_t ssthresh;
284 u32_t snd_wl1, snd_wl2;
287 tcpwnd_size_t snd_wnd;
288 tcpwnd_size_t snd_wnd_max;
290 tcpwnd_size_t snd_buf;
291#define TCP_SNDQUEUELEN_OVERFLOW (0xffffU-3)
296 u16_t unsent_oversize;
300 struct tcp_seg *unsent;
301 struct tcp_seg *unacked;
303 struct tcp_seg *ooseq;
306 struct pbuf *refused_data;
308#if LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG
309 struct tcp_pcb_listen* listener;
318 tcp_connected_fn connected;
325#if LWIP_TCP_TIMESTAMPS
326 u32_t ts_lastacksent;
332#if LWIP_TCP_KEEPALIVE
340 u8_t persist_backoff;
357 LWIP_EVENT_CONNECTED,
362err_t lwip_tcp_event(
void *arg,
struct tcp_pcb *pcb,
371struct tcp_pcb * tcp_new (
void);
372struct tcp_pcb * tcp_new_ip_type (u8_t type);
374void tcp_arg (
struct tcp_pcb *pcb,
void *arg);
376void tcp_recv (
struct tcp_pcb *pcb, tcp_recv_fn recv);
377void tcp_sent (
struct tcp_pcb *pcb, tcp_sent_fn sent);
378void tcp_err (
struct tcp_pcb *pcb, tcp_err_fn err);
379void tcp_accept (
struct tcp_pcb *pcb, tcp_accept_fn accept);
381void tcp_poll (
struct tcp_pcb *pcb, tcp_poll_fn poll, u8_t interval);
383#if LWIP_TCP_TIMESTAMPS
384#define tcp_mss(pcb) (((pcb)->flags & TF_TIMESTAMP) ? ((pcb)->mss - 12) : (pcb)->mss)
386#define tcp_mss(pcb) ((pcb)->mss)
388#define tcp_sndbuf(pcb) (TCPWND16((pcb)->snd_buf))
389#define tcp_sndqueuelen(pcb) ((pcb)->snd_queuelen)
391#define tcp_nagle_disable(pcb) ((pcb)->flags |= TF_NODELAY)
393#define tcp_nagle_enable(pcb) ((pcb)->flags = (tcpflags_t)((pcb)->flags & ~TF_NODELAY))
395#define tcp_nagle_disabled(pcb) (((pcb)->flags & TF_NODELAY) != 0)
397#if TCP_LISTEN_BACKLOG
398#define tcp_backlog_set(pcb, new_backlog) do { \
399 LWIP_ASSERT("pcb->state == LISTEN (called for wrong pcb?)", (pcb)->state == LISTEN); \
400 ((struct tcp_pcb_listen *)(pcb))->backlog = ((new_backlog) ? (new_backlog) : 1); } while(0)
401void tcp_backlog_delayed(
struct tcp_pcb* pcb);
402void tcp_backlog_accepted(
struct tcp_pcb* pcb);
404#define tcp_backlog_set(pcb, new_backlog)
405#define tcp_backlog_delayed(pcb)
406#define tcp_backlog_accepted(pcb)
408#define tcp_accepted(pcb)
410void tcp_recved (
struct tcp_pcb *pcb, u16_t len);
411err_t tcp_bind (
struct tcp_pcb *pcb,
const ip_addr_t *ipaddr,
413err_t tcp_connect (
struct tcp_pcb *pcb,
const ip_addr_t *ipaddr,
414 u16_t port, tcp_connected_fn connected);
416struct tcp_pcb * tcp_listen_with_backlog_and_err(
struct tcp_pcb *pcb, u8_t backlog,
err_t *err);
417struct tcp_pcb * tcp_listen_with_backlog(
struct tcp_pcb *pcb, u8_t backlog);
419#define tcp_listen(pcb) tcp_listen_with_backlog(pcb, TCP_DEFAULT_LISTEN_BACKLOG)
421void tcp_abort (
struct tcp_pcb *pcb);
422err_t tcp_close (
struct tcp_pcb *pcb);
423err_t tcp_shutdown(
struct tcp_pcb *pcb,
int shut_rx,
int shut_tx);
426#define TCP_WRITE_FLAG_COPY 0x01
427#define TCP_WRITE_FLAG_MORE 0x02
429err_t tcp_write (
struct tcp_pcb *pcb,
const void *dataptr, u16_t len,
432void tcp_setprio (
struct tcp_pcb *pcb, u8_t prio);
434#define TCP_PRIO_MIN 1
435#define TCP_PRIO_NORMAL 64
436#define TCP_PRIO_MAX 127
438err_t tcp_output (
struct tcp_pcb *pcb);
441const char* tcp_debug_state_str(
enum tcp_state s);
444#define tcp_new_ip6() tcp_new_ip_type(IPADDR_TYPE_V6)