mirror of
https://github.com/espressif/ESP8266_RTOS_SDK.git
synced 2025-06-28 12:46:48 +08:00
feat(LWIP): Socket(not server) must has linger
Server linger must be disable.
This commit is contained in:
@ -60,10 +60,6 @@ config LWIP_SO_RCVBUF
|
||||
help
|
||||
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
|
||||
int "The default value for recv_bufsize"
|
||||
default 11680
|
||||
|
@ -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 s;
|
||||
@ -729,8 +748,10 @@ int lwip_socket(int domain, int type, int protocol)
|
||||
s = -1;
|
||||
}
|
||||
|
||||
if (s >= 0)
|
||||
if (s >= 0) {
|
||||
lwip_socket_set_so_link(s, 0);
|
||||
SOCK_MT_SET_SHUTDOWN(s, SOCK_MT_SHUTDOWN_NONE);
|
||||
}
|
||||
|
||||
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_socket_set_so_link(s, -1);
|
||||
|
||||
ret = lwip_listen_esp(s, backlog);
|
||||
|
||||
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_socket_set_so_link(s, -1);
|
||||
|
||||
ret = lwip_accept_esp(s, addr, addrlen);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
if (ret >= 0)
|
||||
if (ret >= 0) {
|
||||
lwip_socket_set_so_link(s, 0);
|
||||
SOCK_MT_SET_SHUTDOWN(ret, SOCK_MT_SHUTDOWN_NONE);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -977,7 +1004,6 @@ int lwip_shutdown(int s, int how)
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
int lwip_close(int s)
|
||||
{
|
||||
int ret;
|
||||
|
@ -1404,7 +1404,7 @@
|
||||
/**
|
||||
* 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.
|
||||
|
@ -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.
|
||||
*/
|
||||
err = esp_aio_sendto(&aio, NULL, 0);
|
||||
if (err == ERR_MEM)
|
||||
err = ERR_OK;
|
||||
if (err != ERR_OK)
|
||||
goto error;
|
||||
|
||||
return err;
|
||||
|
||||
|
Reference in New Issue
Block a user