summaryrefslogtreecommitdiffstats
path: root/lwip/src/core/altcp_tcp.c
diff options
context:
space:
mode:
Diffstat (limited to 'lwip/src/core/altcp_tcp.c')
-rw-r--r--lwip/src/core/altcp_tcp.c52
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