tcp.h, opt.h, api.h, api_msg.h, tcp.c, tcp_in.c, api_lib.c, api_msg.c, sockets.c, init.c: task #7252: Implement TCP listen backlog: Warning: raw API applications have to call 'tcp_accepted(pcb)' in their accept callback to keep accepting new connections.

This commit is contained in:
goldsimon
2007-12-21 16:47:56 +00:00
parent 48e62e25e9
commit 1ed34774c8
11 changed files with 93 additions and 11 deletions

View File

@@ -261,16 +261,23 @@ netconn_disconnect(struct netconn *conn)
* Set a TCP netconn into listen mode
*
* @param conn the tcp netconn to set to listen mode
* @param backlog the listen backlog (0 = max), only used if LWIP_LISTEN_BACKLOG==1
* @return ERR_OK if the netconn was set to listen (UDP and RAW netconns
* don't return any error (yet?))
*/
err_t
netconn_listen(struct netconn *conn)
netconn_listen_with_backlog(struct netconn *conn, u8_t backlog)
{
struct api_msg msg;
/* This does no harm. If LWIP_LISTEN_BACKLOG is off, backlog is unused. */
LWIP_UNUSED_ARG(backlog);
LWIP_ERROR("netconn_listen: invalid conn", (conn != NULL), return ERR_ARG;);
#if LWIP_LISTEN_BACKLOG
msg.msg.msg.lb.backlog = backlog;
#endif /* LWIP_LISTEN_BACKLOG */
msg.function = do_listen;
msg.msg.conn = conn;
TCPIP_APIMSG(&msg);
@@ -292,15 +299,26 @@ netconn_accept(struct netconn *conn)
LWIP_ERROR("netconn_accept: invalid acceptmbox", (conn->acceptmbox != SYS_MBOX_NULL), return NULL;);
#if LWIP_SO_RCVTIMEO
if (sys_arch_mbox_fetch(conn->acceptmbox, (void *)&newconn, conn->recv_timeout)==SYS_ARCH_TIMEOUT) {
if (sys_arch_mbox_fetch(conn->acceptmbox, (void *)&newconn, conn->recv_timeout) == SYS_ARCH_TIMEOUT) {
newconn = NULL;
}
} else
#else
sys_arch_mbox_fetch(conn->acceptmbox, (void *)&newconn, 0);
#endif /* LWIP_SO_RCVTIMEO*/
{
/* Register event with callback */
API_EVENT(conn, NETCONN_EVT_RCVMINUS, 0);
/* Register event with callback */
API_EVENT(conn, NETCONN_EVT_RCVMINUS, 0);
#if LWIP_LISTEN_BACKLOG
if (newconn != NULL) {
/* Let the stack know that we have accepted the connection. */
struct api_msg msg;
msg.function = do_recv;
msg.msg.conn = conn;
TCPIP_APIMSG(&msg);
}
#endif /* LWIP_LISTEN_BACKLOG */
}
return newconn;
}

View File

@@ -735,6 +735,9 @@ do_listen(struct api_msg_msg *msg)
if (msg->conn->err == ERR_OK) {
msg->conn->state = NETCONN_LISTEN;
msg->conn->pcb.tcp = lpcb;
#if LWIP_LISTEN_BACKLOG
tcp_backlog(lpcb, msg->msg.lb.backlog);
#endif /* LWIP_LISTEN_BACKLOG */
tcp_arg(msg->conn->pcb.tcp, msg->conn);
tcp_accept(msg->conn->pcb.tcp, accept_function);
}
@@ -800,7 +803,14 @@ do_recv(struct api_msg_msg *msg)
if (!ERR_IS_FATAL(msg->conn->err)) {
if (msg->conn->pcb.tcp != NULL) {
if (msg->conn->type == NETCONN_TCP) {
tcp_recved(msg->conn->pcb.tcp, msg->msg.r.len);
#if LWIP_LISTEN_BACKLOG
if (msg->conn->pcb.tcp->state == LISTEN) {
tcp_accepted(msg->conn->pcb.tcp);
} else
#endif /* LWIP_LISTEN_BACKLOG */
{
tcp_recved(msg->conn->pcb.tcp, msg->msg.r.len);
}
}
}
}

View File

@@ -430,15 +430,15 @@ lwip_listen(int s, int backlog)
struct lwip_socket *sock;
err_t err;
/* This does no harm. If debugging is off, backlog is unused. */
LWIP_UNUSED_ARG(backlog);
LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_listen(%d, backlog=%d)\n", s, backlog));
LWIP_ASSERT("backlog must be between 0 and 255", backlog > 0);
LWIP_ASSERT("backlog must be between 0 and 255", backlog <= 0xff);
sock = get_socket(s);
if (!sock)
return -1;
err = netconn_listen(sock->conn);
err = netconn_listen_with_backlog(sock->conn, backlog);
if (err != ERR_OK) {
LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_listen(%d) failed, err=%d\n", s, err));