58#define ALTCP_TCP_ASSERT_CONN(conn) do { \
59 LWIP_ASSERT("conn->inner_conn == NULL", (conn)->inner_conn == NULL); \
60 LWIP_UNUSED_ARG(conn);
} while(0)
61#define ALTCP_TCP_ASSERT_CONN_PCB(conn, tpcb) do { \
62 LWIP_ASSERT("pcb mismatch", (conn)->state == tpcb); \
63 LWIP_UNUSED_ARG(tpcb);
\
64 ALTCP_TCP_ASSERT_CONN(conn); } while(0)
69extern const struct altcp_functions altcp_tcp_functions;
71static void altcp_tcp_setup(
struct altcp_pcb *conn,
struct tcp_pcb *tpcb);
75altcp_tcp_accept(
void *
arg,
struct tcp_pcb *new_tpcb,
err_t err)
78 if (new_tpcb && listen_conn && listen_conn->accept) {
80 struct altcp_pcb *new_conn = altcp_alloc();
81 if (new_conn ==
NULL) {
84 altcp_tcp_setup(new_conn, new_tpcb);
85 return listen_conn->accept(listen_conn->arg, new_conn,
err);
91altcp_tcp_connected(
void *
arg,
struct tcp_pcb *tpcb,
err_t err)
95 ALTCP_TCP_ASSERT_CONN_PCB(conn, tpcb);
96 if (conn->connected) {
97 return conn->connected(conn->arg, conn,
err);
108 ALTCP_TCP_ASSERT_CONN_PCB(conn, tpcb);
110 return conn->recv(conn->arg, conn,
p,
err);
121altcp_tcp_sent(
void *
arg,
struct tcp_pcb *tpcb,
u16_t len)
125 ALTCP_TCP_ASSERT_CONN_PCB(conn, tpcb);
127 return conn->sent(conn->arg, conn,
len);
134altcp_tcp_poll(
void *
arg,
struct tcp_pcb *tpcb)
138 ALTCP_TCP_ASSERT_CONN_PCB(conn, tpcb);
140 return conn->poll(conn->arg, conn);
153 conn->err(conn->arg,
err);
162altcp_tcp_remove_callbacks(
struct tcp_pcb *tpcb)
165 if (tpcb->state != LISTEN) {
167 tcp_sent(tpcb,
NULL);
174altcp_tcp_setup_callbacks(
struct altcp_pcb *conn,
struct tcp_pcb *tpcb)
178 if (tpcb->state != LISTEN) {
180 tcp_sent(tpcb, altcp_tcp_sent);
181 tcp_err(tpcb, altcp_tcp_err);
187altcp_tcp_setup(
struct altcp_pcb *conn,
struct tcp_pcb *tpcb)
189 altcp_tcp_setup_callbacks(conn, tpcb);
191 conn->fns = &altcp_tcp_functions;
199 struct tcp_pcb *tpcb = tcp_new_ip_type(ip_type);
203 altcp_tcp_setup(
ret, tpcb);
218altcp_tcp_alloc(
void *
arg,
u8_t ip_type)
225altcp_tcp_wrap(
struct tcp_pcb *tpcb)
230 altcp_tcp_setup(
ret, tpcb);
243 struct tcp_pcb *pcb = (
struct tcp_pcb *)conn->state;
244 ALTCP_TCP_ASSERT_CONN(conn);
253 struct tcp_pcb *pcb = (
struct tcp_pcb *)conn->state;
254 ALTCP_TCP_ASSERT_CONN(conn);
255 tcp_recved(pcb,
len);
266 ALTCP_TCP_ASSERT_CONN(conn);
267 pcb = (
struct tcp_pcb *)conn->state;
268 return tcp_bind(pcb, ipaddr,
port);
278 ALTCP_TCP_ASSERT_CONN(conn);
280 pcb = (
struct tcp_pcb *)conn->state;
288 struct tcp_pcb *lpcb;
292 ALTCP_TCP_ASSERT_CONN(conn);
293 pcb = (
struct tcp_pcb *)conn->state;
294 lpcb = tcp_listen_with_backlog_and_err(pcb, backlog,
err);
307 struct tcp_pcb *pcb = (
struct tcp_pcb *)conn->state;
308 ALTCP_TCP_ASSERT_CONN(conn);
322 ALTCP_TCP_ASSERT_CONN(conn);
323 pcb = (
struct tcp_pcb *)conn->state;
326 tcp_poll_fn oldpoll = pcb->poll;
327 altcp_tcp_remove_callbacks(pcb);
331 altcp_tcp_setup_callbacks(conn, pcb);
333 tcp_poll(pcb, oldpoll, pcb->pollinterval);
343altcp_tcp_shutdown(
struct altcp_pcb *conn,
int shut_rx,
int shut_tx)
349 ALTCP_TCP_ASSERT_CONN(conn);
350 pcb = (
struct tcp_pcb *)conn->state;
361 ALTCP_TCP_ASSERT_CONN(conn);
362 pcb = (
struct tcp_pcb *)conn->state;
363 return tcp_write(pcb,
dataptr,
len, apiflags);
373 ALTCP_TCP_ASSERT_CONN(conn);
374 pcb = (
struct tcp_pcb *)conn->state;
375 return tcp_output(pcb);
385 ALTCP_TCP_ASSERT_CONN(conn);
386 pcb = (
struct tcp_pcb *)conn->state;
397 ALTCP_TCP_ASSERT_CONN(conn);
398 pcb = (
struct tcp_pcb *)conn->state;
399 return tcp_sndbuf(pcb);
403altcp_tcp_sndqueuelen(
struct altcp_pcb *conn)
409 ALTCP_TCP_ASSERT_CONN(conn);
410 pcb = (
struct tcp_pcb *)conn->state;
411 return tcp_sndqueuelen(pcb);
415altcp_tcp_nagle_disable(
struct altcp_pcb *conn)
417 if (conn && conn->state) {
418 struct tcp_pcb *pcb = (
struct tcp_pcb *)conn->state;
419 ALTCP_TCP_ASSERT_CONN(conn);
420 tcp_nagle_disable(pcb);
425altcp_tcp_nagle_enable(
struct altcp_pcb *conn)
427 if (conn && conn->state) {
428 struct tcp_pcb *pcb = (
struct tcp_pcb *)conn->state;
429 ALTCP_TCP_ASSERT_CONN(conn);
430 tcp_nagle_enable(pcb);
435altcp_tcp_nagle_disabled(
struct altcp_pcb *conn)
437 if (conn && conn->state) {
438 struct tcp_pcb *pcb = (
struct tcp_pcb *)conn->state;
439 ALTCP_TCP_ASSERT_CONN(conn);
440 return tcp_nagle_disabled(pcb);
449 struct tcp_pcb *pcb = (
struct tcp_pcb *)conn->state;
450 ALTCP_TCP_ASSERT_CONN(conn);
451 tcp_setprio(pcb, prio);
455#if LWIP_TCP_KEEPALIVE
457altcp_tcp_keepalive_disable(
struct altcp_pcb *conn)
459 if (conn && conn->state) {
460 struct tcp_pcb *pcb = (
struct tcp_pcb *)conn->state;
461 ALTCP_TCP_ASSERT_CONN(conn);
469 if (conn && conn->state) {
470 struct tcp_pcb *pcb = (
struct tcp_pcb *)conn->state;
471 ALTCP_TCP_ASSERT_CONN(conn);
473 pcb->keep_idle =
idle ?
idle : TCP_KEEPIDLE_DEFAULT;
474 pcb->keep_intvl = intvl ? intvl : TCP_KEEPINTVL_DEFAULT;
475 pcb->keep_cnt =
cnt ?
cnt : TCP_KEEPCNT_DEFAULT;
484 ALTCP_TCP_ASSERT_CONN(conn);
492 struct tcp_pcb *pcb = (
struct tcp_pcb *)conn->state;
493 ALTCP_TCP_ASSERT_CONN(conn);
503 struct tcp_pcb *pcb = (
struct tcp_pcb *)conn->state;
504 ALTCP_TCP_ASSERT_CONN(conn);
507 return &pcb->local_ip;
509 return &pcb->remote_ip;
520 struct tcp_pcb *pcb = (
struct tcp_pcb *)conn->state;
521 ALTCP_TCP_ASSERT_CONN(conn);
524 return pcb->local_port;
526 return pcb->remote_port;
535altcp_tcp_dbg_get_tcp_state(
struct altcp_pcb *conn)
538 struct tcp_pcb *pcb = (
struct tcp_pcb *)conn->state;
539 ALTCP_TCP_ASSERT_CONN(conn);
547const struct altcp_functions altcp_tcp_functions = {
560 altcp_tcp_sndqueuelen,
561 altcp_tcp_nagle_disable,
562 altcp_tcp_nagle_enable,
563 altcp_tcp_nagle_disabled,
566 altcp_tcp_get_tcp_addrinfo,
569#if LWIP_TCP_KEEPALIVE
570 , altcp_tcp_keepalive_disable
571 , altcp_tcp_keepalive_enable
574 , altcp_tcp_dbg_get_tcp_state
#define altcp_connected_fn
#define altcp_tcp_new_ip_type
STREAM tcp_recv(STREAM s, uint32 length)
RD_BOOL tcp_connect(char *server)
void idle(int argc, const char *argv[])
#define ip_set_option(pcb, opt)
#define ip_reset_option(pcb, opt)
GLenum const GLvoid * addr
#define LWIP_UNUSED_ARG(x)
u8_t pbuf_free(struct pbuf *p)
int const JOCTET * dataptr
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)