82typedef err_t (*tcp_recv_fn)(
void *
arg,
struct tcp_pcb *tpcb,
96typedef err_t (*tcp_sent_fn)(
void *
arg,
struct tcp_pcb *tpcb,
108typedef err_t (*tcp_poll_fn)(
void *
arg,
struct tcp_pcb *tpcb);
134typedef err_t (*tcp_connected_fn)(
void *
arg,
struct tcp_pcb *tpcb,
err_t err);
137#define RCV_WND_SCALE(pcb, wnd) (((wnd) >> (pcb)->rcv_scale))
138#define SND_WND_SCALE(pcb, wnd) (((wnd) << (pcb)->snd_scale))
139#define TCPWND16(x) ((u16_t)LWIP_MIN((x), 0xFFFF))
140#define TCP_WND_MAX(pcb) ((tcpwnd_size_t)(((pcb)->flags & TF_WND_SCALE) ? TCP_WND : TCPWND16(TCP_WND)))
142#define RCV_WND_SCALE(pcb, wnd) (wnd)
143#define SND_WND_SCALE(pcb, wnd) (wnd)
144#define TCPWND16(x) (x)
145#define TCP_WND_MAX(pcb) TCP_WND
148#define TCP_WND_INC(wnd, inc) do { \
149 if ((tcpwnd_size_t)(wnd + inc) >= wnd) { \
150 wnd = (tcpwnd_size_t)(wnd + inc); \
152 wnd = (tcpwnd_size_t)-1; \
159struct tcp_sack_range {
173typedef void (*tcp_extarg_callback_pcb_destroyed_fn)(
u8_t id,
void *
data);
182typedef err_t (*tcp_extarg_callback_passive_open_fn)(
u8_t id,
struct tcp_pcb_listen *lpcb,
struct tcp_pcb *cpcb);
185struct tcp_ext_arg_callbacks {
187 tcp_extarg_callback_pcb_destroyed_fn
destroy;
189 tcp_extarg_callback_passive_open_fn passive_open;
192#define LWIP_TCP_PCB_NUM_EXT_ARG_ID_INVALID 0xFF
194#if LWIP_TCP_PCB_NUM_EXT_ARGS
196struct tcp_pcb_ext_args {
197 const struct tcp_ext_arg_callbacks *
callbacks;
201#define TCP_PCB_EXTARGS struct tcp_pcb_ext_args ext_args[LWIP_TCP_PCB_NUM_EXT_ARGS];
203#define TCP_PCB_EXTARGS
206typedef u16_t tcpflags_t;
207#define TCP_ALLFLAGS 0xffffU
212#define TCP_PCB_COMMON(type) \
214 void *callback_arg; \
216 enum tcp_state state; \
223struct tcp_pcb_listen {
227 TCP_PCB_COMMON(
struct tcp_pcb_listen);
234#if TCP_LISTEN_BACKLOG
236 u8_t accepts_pending;
246 TCP_PCB_COMMON(
struct tcp_pcb);
252#define TF_ACK_DELAY 0x01U
253#define TF_ACK_NOW 0x02U
255#define TF_CLOSEPEND 0x08U
256#define TF_RXCLOSED 0x10U
258#define TF_NODELAY 0x40U
259#define TF_NAGLEMEMERR 0x80U
261#define TF_WND_SCALE 0x0100U
263#if TCP_LISTEN_BACKLOG
264#define TF_BACKLOGPEND 0x0200U
266#if LWIP_TCP_TIMESTAMPS
267#define TF_TIMESTAMP 0x0400U
269#define TF_RTO 0x0800U
271#define TF_SACK 0x1000U
278 u8_t polltmr, pollinterval;
284 tcpwnd_size_t rcv_wnd;
285 tcpwnd_size_t rcv_ann_wnd;
286 u32_t rcv_ann_right_edge;
291#define LWIP_TCP_SACK_VALID(pcb, idx) ((pcb)->rcv_sacks[idx].left != (pcb)->rcv_sacks[idx].right)
313 tcpwnd_size_t ssthresh;
320 u32_t snd_wl1, snd_wl2;
323 tcpwnd_size_t snd_wnd;
324 tcpwnd_size_t snd_wnd_max;
326 tcpwnd_size_t snd_buf;
327#define TCP_SNDQUEUELEN_OVERFLOW (0xffffU-3)
332 u16_t unsent_oversize;
335 tcpwnd_size_t bytes_acked;
338 struct tcp_seg *unsent;
339 struct tcp_seg *unacked;
341 struct tcp_seg *ooseq;
344 struct pbuf *refused_data;
346#if LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG
347 struct tcp_pcb_listen* listener;
363#if LWIP_TCP_TIMESTAMPS
364 u32_t ts_lastacksent;
370#if LWIP_TCP_KEEPALIVE
378 u8_t persist_backoff;
397 LWIP_EVENT_CONNECTED,
402err_t lwip_tcp_event(
void *
arg,
struct tcp_pcb *pcb,
411struct tcp_pcb * tcp_new (
void);
412struct tcp_pcb * tcp_new_ip_type (
u8_t type);
414void tcp_arg (
struct tcp_pcb *pcb,
void *
arg);
417void tcp_sent (
struct tcp_pcb *pcb, tcp_sent_fn
sent);
418void tcp_err (
struct tcp_pcb *pcb, tcp_err_fn
err);
423#define tcp_set_flags(pcb, set_flags) do { (pcb)->flags = (tcpflags_t)((pcb)->flags | (set_flags)); } while(0)
424#define tcp_clear_flags(pcb, clr_flags) do { (pcb)->flags = (tcpflags_t)((pcb)->flags & (tcpflags_t)(~(clr_flags) & TCP_ALLFLAGS)); } while(0)
425#define tcp_is_flag_set(pcb, flag) (((pcb)->flags & (flag)) != 0)
427#if LWIP_TCP_TIMESTAMPS
428#define tcp_mss(pcb) (((pcb)->flags & TF_TIMESTAMP) ? ((pcb)->mss - 12) : (pcb)->mss)
431#define tcp_mss(pcb) ((pcb)->mss)
434#define tcp_sndbuf(pcb) (TCPWND16((pcb)->snd_buf))
436#define tcp_sndqueuelen(pcb) ((pcb)->snd_queuelen)
438#define tcp_nagle_disable(pcb) tcp_set_flags(pcb, TF_NODELAY)
440#define tcp_nagle_enable(pcb) tcp_clear_flags(pcb, TF_NODELAY)
442#define tcp_nagle_disabled(pcb) tcp_is_flag_set(pcb, TF_NODELAY)
444#if TCP_LISTEN_BACKLOG
445#define tcp_backlog_set(pcb, new_backlog) do { \
446 LWIP_ASSERT("pcb->state == LISTEN (called for wrong pcb?)", (pcb)->state == LISTEN); \
447 ((struct tcp_pcb_listen *)(pcb))->backlog = ((new_backlog) ? (new_backlog) : 1); } while(0)
448void tcp_backlog_delayed(
struct tcp_pcb* pcb);
449void tcp_backlog_accepted(
struct tcp_pcb* pcb);
451#define tcp_backlog_set(pcb, new_backlog)
452#define tcp_backlog_delayed(pcb)
453#define tcp_backlog_accepted(pcb)
455#define tcp_accepted(pcb) do { LWIP_UNUSED_ARG(pcb); } while(0)
457void tcp_recved (
struct tcp_pcb *pcb,
u16_t len);
460void tcp_bind_netif(
struct tcp_pcb *pcb,
const struct netif *
netif);
464struct tcp_pcb * tcp_listen_with_backlog_and_err(
struct tcp_pcb *pcb,
u8_t backlog,
err_t *
err);
465struct tcp_pcb * tcp_listen_with_backlog(
struct tcp_pcb *pcb,
u8_t backlog);
467#define tcp_listen(pcb) tcp_listen_with_backlog(pcb, TCP_DEFAULT_LISTEN_BACKLOG)
469void tcp_abort (
struct tcp_pcb *pcb);
476void tcp_setprio (
struct tcp_pcb *pcb,
u8_t prio);
478err_t tcp_output (
struct tcp_pcb *pcb);
482#define tcp_dbg_get_tcp_state(pcb) ((pcb)->state)
485#define tcp_new_ip6() tcp_new_ip_type(IPADDR_TYPE_V6)
487#if LWIP_TCP_PCB_NUM_EXT_ARGS
488u8_t tcp_ext_arg_alloc_id(
void);
489void tcp_ext_arg_set_callbacks(
struct tcp_pcb *pcb,
u8_t id,
const struct tcp_ext_arg_callbacks *
const callbacks);
490void tcp_ext_arg_set(
struct tcp_pcb *pcb,
u8_t id,
void *
arg);
491void *tcp_ext_arg_get(
const struct tcp_pcb *pcb,
u8_t id);
void destroy(_Tp *__pointer)
static struct sockaddr_in sa
STREAM tcp_recv(STREAM s, uint32 length)
RD_BOOL tcp_connect(char *server)
INT WSAAPI recv(IN SOCKET s, OUT CHAR FAR *buf, IN INT len, IN INT flags)
GLuint GLuint GLsizei GLenum type
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLenum const GLvoid * addr
#define LWIP_TCP_MAX_SACK_NUM
int const JOCTET * dataptr
int rtime(struct sockaddr_in *addrp, struct timeval *timep, struct timeval *timeout)
SOCKET WSAAPI accept(IN SOCKET s, OUT LPSOCKADDR addr, OUT INT FAR *addrlen)
void tcp_close(struct sock *sk, long timeout)
struct sock * tcp_accept(struct sock *sk, int flags, int *err)
void tcp_shutdown(struct sock *sk, int how)
unsigned int tcp_poll(struct file *file, struct socket *sock, struct poll_table_struct *wait)