Merge branch 'bugfix/fix_the_bug_create_socket_fail_v3.1' into 'release/v3.1'

lwip: fix the bug that failed to create socket (backport v3.1)

See merge request idf/esp-idf!3311
This commit is contained in:
Jiang Jiang Jian 2018-09-20 18:44:18 +08:00
commit fbcfc869e2
2 changed files with 23 additions and 31 deletions

View file

@ -945,38 +945,33 @@ lwip_netconn_do_close_internal(struct netconn *conn WRITE_DELAYED_PARAM SIG_CLO
#endif /* LWIP_SO_LINGER */ #endif /* LWIP_SO_LINGER */
} else { } else {
if (err == ERR_MEM) { if (err == ERR_MEM) {
/* Closing failed because of memory shortage */ /* Closing failed because of memory shortage, try again later. Even for
if (netconn_is_nonblocking(conn)) { nonblocking netconns, we have to wait since no standard socket application
/* Nonblocking close failed */ is prepared for close failing because of resource shortage.
close_finished = 1; Check the timeout: this is kind of an lwip addition to the standard sockets:
err = ERR_WOULDBLOCK; we wait for some time when failing to allocate a segment for the FIN */
} else {
/* Blocking close, check the timeout */
#if LWIP_SO_SNDTIMEO || LWIP_SO_LINGER #if LWIP_SO_SNDTIMEO || LWIP_SO_LINGER
s32_t close_timeout = LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT; s32_t close_timeout = LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT;
/* this is kind of an lwip addition to the standard sockets: we wait
for some time when failing to allocate a segment for the FIN */
#if LWIP_SO_SNDTIMEO #if LWIP_SO_SNDTIMEO
if (conn->send_timeout > 0) { if (conn->send_timeout > 0) {
close_timeout = conn->send_timeout; close_timeout = conn->send_timeout;
} }
#endif /* LWIP_SO_SNDTIMEO */ #endif /* LWIP_SO_SNDTIMEO */
#if LWIP_SO_LINGER #if LWIP_SO_LINGER
if (conn->linger >= 0) { if (conn->linger >= 0) {
/* use linger timeout (seconds) */ /* use linger timeout (seconds) */
close_timeout = conn->linger * 1000U; close_timeout = conn->linger * 1000U;
} }
#endif #endif
if ((s32_t)(sys_now() - conn->current_msg->msg.sd.time_started) >= close_timeout) { if ((s32_t)(sys_now() - conn->current_msg->msg.sd.time_started) >= close_timeout) {
#else /* LWIP_SO_SNDTIMEO || LWIP_SO_LINGER */ #else /* LWIP_SO_SNDTIMEO || LWIP_SO_LINGER */
if (conn->current_msg->msg.sd.polls_left == 0) { if (conn->current_msg->msg.sd.polls_left == 0) {
#endif /* LWIP_SO_SNDTIMEO || LWIP_SO_LINGER */ #endif /* LWIP_SO_SNDTIMEO || LWIP_SO_LINGER */
close_finished = 1; close_finished = 1;
if (close) { if (close) {
/* in this case, we want to RST the connection */ /* in this case, we want to RST the connection */
tcp_abort(tpcb); tcp_abort(tpcb);
err = ERR_OK; err = ERR_OK;
}
} }
} }
} else { } else {

View file

@ -266,11 +266,11 @@ do{\
}\ }\
}while(0) }while(0)
#define LWIP_SET_CLOSE_FLAG(_flag) \ #define LWIP_SET_CLOSE_FLAG() \
do{\ do{\
LWIP_SOCK_LOCK(__sock);\ LWIP_SOCK_LOCK(__sock);\
LWIP_DEBUGF(ESP_THREAD_SAFE_DEBUG, ("mark sock closing\n"));\ LWIP_DEBUGF(ESP_THREAD_SAFE_DEBUG, ("mark sock closing\n"));\
__sock->state = (_flag);\ __sock->state = LWIP_SOCK_CLOSING;\
LWIP_SOCK_UNLOCK(__sock);\ LWIP_SOCK_UNLOCK(__sock);\
}while(0) }while(0)
@ -3312,11 +3312,8 @@ int
lwip_close_r(int s) lwip_close_r(int s)
{ {
LWIP_API_LOCK(); LWIP_API_LOCK();
LWIP_SET_CLOSE_FLAG(LWIP_SOCK_CLOSING); LWIP_SET_CLOSE_FLAG();
__ret = lwip_close(s); __ret = lwip_close(s);
if (EWOULDBLOCK == __sock->err) {
LWIP_SET_CLOSE_FLAG(LWIP_SOCK_OPEN);
}
LWIP_API_UNLOCK(); LWIP_API_UNLOCK();
} }