Allow backlog to be updated

This commit adds support to the sockets and netconn layer to update the
backlog by calling listen when the netconn is already in the listen state.
When backlog is not enabled, the call returns successfully

This commit also introduces a macro for setting the backlog value that
prevents a 0 sized (invalid) backlog
This commit is contained in:
Joel Cunningham 2016-02-18 09:33:21 -06:00
parent 163d7f9791
commit 8cb64698aa
3 changed files with 10 additions and 1 deletions

View File

@ -1308,6 +1308,12 @@ lwip_netconn_do_listen(struct api_msg_msg *msg)
} }
} }
} }
} else if (msg->conn->state == NETCONN_LISTEN) {
/* already listening, allow updating of the backlog */
msg->err = ERR_OK;
#if TCP_LISTEN_BACKLOG
tcp_backlog_set(msg->conn->pcb.tcp, msg->msg.lb.backlog);
#endif /* TCP_LISTEN_BACKLOG */
} }
} else { } else {
msg->err = ERR_ARG; msg->err = ERR_ARG;

View File

@ -587,7 +587,7 @@ tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog)
#endif /* LWIP_CALLBACK_API */ #endif /* LWIP_CALLBACK_API */
#if TCP_LISTEN_BACKLOG #if TCP_LISTEN_BACKLOG
lpcb->accepts_pending = 0; lpcb->accepts_pending = 0;
lpcb->backlog = (backlog ? backlog : 1); tcp_backlog_set(lpcb, backlog);
#endif /* TCP_LISTEN_BACKLOG */ #endif /* TCP_LISTEN_BACKLOG */
TCP_REG(&tcp_listen_pcbs.pcbs, (struct tcp_pcb *)lpcb); TCP_REG(&tcp_listen_pcbs.pcbs, (struct tcp_pcb *)lpcb);
return (struct tcp_pcb *)lpcb; return (struct tcp_pcb *)lpcb;

View File

@ -362,6 +362,9 @@ void tcp_err (struct tcp_pcb *pcb, tcp_err_fn err);
#define tcp_accepted(pcb) do { \ #define tcp_accepted(pcb) do { \
LWIP_ASSERT("pcb->state == LISTEN (called for wrong pcb?)", pcb->state == LISTEN); \ LWIP_ASSERT("pcb->state == LISTEN (called for wrong pcb?)", pcb->state == LISTEN); \
(((struct tcp_pcb_listen *)(pcb))->accepts_pending--); } while(0) (((struct tcp_pcb_listen *)(pcb))->accepts_pending--); } while(0)
#define tcp_backlog_set(pcb, new_backlog) do { \
LWIP_ASSERT("pcb->state == LISTEN (called for wrong pcb?)", (pcb)->state == LISTEN); \
((struct tcp_pcb_listen *)(pcb))->backlog = ((new_backlog) ? (new_backlog) : 1); } while(0)
#else /* TCP_LISTEN_BACKLOG */ #else /* TCP_LISTEN_BACKLOG */
#define tcp_accepted(pcb) LWIP_ASSERT("pcb->state == LISTEN (called for wrong pcb?)", \ #define tcp_accepted(pcb) LWIP_ASSERT("pcb->state == LISTEN (called for wrong pcb?)", \
(pcb)->state == LISTEN) (pcb)->state == LISTEN)