feat(LWIP): Socket(not server) must has linger

Server linger must be disable.
This commit is contained in:
Dong Heng
2018-07-19 11:00:44 +08:00
parent 8a6c1a307f
commit da0d4cb749
4 changed files with 32 additions and 10 deletions

View File

@ -60,10 +60,6 @@ config LWIP_SO_RCVBUF
help help
Enabling this option allows checking for available data on a netconn. Enabling this option allows checking for available data on a netconn.
config LWIP_SO_LINGER
bool "Enable SO_LINGER processing"
default n
config LWIP_RECV_BUFSIZE_DEFAULT config LWIP_RECV_BUFSIZE_DEFAULT
int "The default value for recv_bufsize" int "The default value for recv_bufsize"
default 11680 default 11680

View File

@ -706,6 +706,25 @@ static void lwip_sync_mt(int s, int how)
} }
} }
#if LWIP_SO_LINGER
static void lwip_socket_set_so_link(int s, int linger)
{
struct lwip_sock *sock = get_socket(s);
if (sock) {
/*
* linker:
* -1: nothing
* 0: free sent_buf immediately
*/
sock->conn->linger = linger;
}
}
#else
#error "LWIP_SO_LINGER must be enable"
#endif
int lwip_socket(int domain, int type, int protocol) int lwip_socket(int domain, int type, int protocol)
{ {
int s; int s;
@ -729,8 +748,10 @@ int lwip_socket(int domain, int type, int protocol)
s = -1; s = -1;
} }
if (s >= 0) if (s >= 0) {
lwip_socket_set_so_link(s, 0);
SOCK_MT_SET_SHUTDOWN(s, SOCK_MT_SHUTDOWN_NONE); SOCK_MT_SET_SHUTDOWN(s, SOCK_MT_SHUTDOWN_NONE);
}
return s; return s;
} }
@ -768,6 +789,8 @@ int lwip_listen(int s, int backlog)
LWIP_ENTER_MT(s, SOCK_MT_STATE, SOCK_MT_STATE_LISTEN); LWIP_ENTER_MT(s, SOCK_MT_STATE, SOCK_MT_STATE_LISTEN);
lwip_socket_set_so_link(s, -1);
ret = lwip_listen_esp(s, backlog); ret = lwip_listen_esp(s, backlog);
LWIP_EXIT_MT(s, SOCK_MT_STATE, SOCK_MT_STATE_LISTEN); LWIP_EXIT_MT(s, SOCK_MT_STATE, SOCK_MT_STATE_LISTEN);
@ -782,6 +805,8 @@ int lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen)
LWIP_ENTER_MT(s, SOCK_MT_STATE, SOCK_MT_STATE_ACCEPT) LWIP_ENTER_MT(s, SOCK_MT_STATE, SOCK_MT_STATE_ACCEPT)
lwip_socket_set_so_link(s, -1);
ret = lwip_accept_esp(s, addr, addrlen); ret = lwip_accept_esp(s, addr, addrlen);
LWIP_EXIT_MT(s, SOCK_MT_STATE, SOCK_MT_STATE_ACCEPT); LWIP_EXIT_MT(s, SOCK_MT_STATE, SOCK_MT_STATE_ACCEPT);
@ -803,8 +828,10 @@ int lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen)
ret = -1; ret = -1;
} }
if (ret >= 0) if (ret >= 0) {
lwip_socket_set_so_link(s, 0);
SOCK_MT_SET_SHUTDOWN(ret, SOCK_MT_SHUTDOWN_NONE); SOCK_MT_SET_SHUTDOWN(ret, SOCK_MT_SHUTDOWN_NONE);
}
return ret; return ret;
} }
@ -977,7 +1004,6 @@ int lwip_shutdown(int s, int how)
} }
#endif #endif
int lwip_close(int s) int lwip_close(int s)
{ {
int ret; int ret;

View File

@ -1404,7 +1404,7 @@
/** /**
* LWIP_SO_LINGER==1: Enable SO_LINGER processing. * LWIP_SO_LINGER==1: Enable SO_LINGER processing.
*/ */
#define LWIP_SO_LINGER CONFIG_LWIP_SO_LINGER #define LWIP_SO_LINGER 1
/** /**
* If LWIP_SO_RCVBUF is used, this is the default value for recv_bufsize. * If LWIP_SO_RCVBUF is used, this is the default value for recv_bufsize.

View File

@ -167,8 +167,8 @@ static int8_t low_level_output(struct netif* netif, struct pbuf* p)
* header, meaning we should not pass target low-level address here. * header, meaning we should not pass target low-level address here.
*/ */
err = esp_aio_sendto(&aio, NULL, 0); err = esp_aio_sendto(&aio, NULL, 0);
if (err == ERR_MEM) if (err != ERR_OK)
err = ERR_OK; goto error;
return err; return err;