diff options
Diffstat (limited to 'lwip/src/core/altcp_tcp.c')
-rw-r--r-- | lwip/src/core/altcp_tcp.c | 52 |
1 files changed, 43 insertions, 9 deletions
diff --git a/lwip/src/core/altcp_tcp.c b/lwip/src/core/altcp_tcp.c index b715f04..1869e2a 100644 --- a/lwip/src/core/altcp_tcp.c +++ b/lwip/src/core/altcp_tcp.c @@ -49,6 +49,7 @@ #include "lwip/altcp_tcp.h" #include "lwip/priv/altcp_priv.h" #include "lwip/tcp.h" +#include "lwip/priv/tcp_priv.h" #include "lwip/mem.h" #include <string.h> @@ -160,21 +161,25 @@ static void altcp_tcp_remove_callbacks(struct tcp_pcb *tpcb) { tcp_arg(tpcb, NULL); - tcp_recv(tpcb, NULL); - tcp_sent(tpcb, NULL); - tcp_err(tpcb, NULL); - tcp_poll(tpcb, NULL, tpcb->pollinterval); + if (tpcb->state != LISTEN) { + tcp_recv(tpcb, NULL); + tcp_sent(tpcb, NULL); + tcp_err(tpcb, NULL); + tcp_poll(tpcb, NULL, tpcb->pollinterval); + } } static void altcp_tcp_setup_callbacks(struct altcp_pcb *conn, struct tcp_pcb *tpcb) { tcp_arg(tpcb, conn); - tcp_recv(tpcb, altcp_tcp_recv); - tcp_sent(tpcb, altcp_tcp_sent); - tcp_err(tpcb, altcp_tcp_err); - /* tcp_poll is set when interval is set by application */ - /* listen is set totally different :-) */ + /* this might be called for LISTN when close fails... */ + if (tpcb->state != LISTEN) { + tcp_recv(tpcb, altcp_tcp_recv); + tcp_sent(tpcb, altcp_tcp_sent); + tcp_err(tpcb, altcp_tcp_err); + /* tcp_poll is set when interval is set by application */ + } } static void @@ -446,6 +451,31 @@ altcp_tcp_setprio(struct altcp_pcb *conn, u8_t prio) } } +#if LWIP_TCP_KEEPALIVE +static void +altcp_tcp_keepalive_disable(struct altcp_pcb *conn) +{ + if (conn && conn->state) { + struct tcp_pcb *pcb = (struct tcp_pcb *)conn->state; + ALTCP_TCP_ASSERT_CONN(conn); + ip_reset_option(pcb, SOF_KEEPALIVE); + } +} + +static void +altcp_tcp_keepalive_enable(struct altcp_pcb *conn, u32_t idle, u32_t intvl, u32_t cnt) +{ + if (conn && conn->state) { + struct tcp_pcb *pcb = (struct tcp_pcb *)conn->state; + ALTCP_TCP_ASSERT_CONN(conn); + ip_set_option(pcb, SOF_KEEPALIVE); + pcb->keep_idle = idle ? idle : TCP_KEEPIDLE_DEFAULT; + pcb->keep_intvl = intvl ? intvl : TCP_KEEPINTVL_DEFAULT; + pcb->keep_cnt = cnt ? cnt : TCP_KEEPCNT_DEFAULT; + } +} +#endif + static void altcp_tcp_dealloc(struct altcp_pcb *conn) { @@ -535,6 +565,10 @@ const struct altcp_functions altcp_tcp_functions = { altcp_tcp_get_tcp_addrinfo, altcp_tcp_get_ip, altcp_tcp_get_port +#if LWIP_TCP_KEEPALIVE + , altcp_tcp_keepalive_disable + , altcp_tcp_keepalive_enable +#endif #ifdef LWIP_DEBUG , altcp_tcp_dbg_get_tcp_state #endif |