mirror of
https://github.com/espressif/ESP8266_RTOS_SDK.git
synced 2025-06-04 20:53:06 +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
|
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
|
||||||
|
@ -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;
|
||||||
|
@ -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.
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user