diff --git a/net/tcp/tcp.h b/net/tcp/tcp.h index 11bc4c4f6e..aae70be268 100644 --- a/net/tcp/tcp.h +++ b/net/tcp/tcp.h @@ -597,7 +597,8 @@ int tcp_remote_ipv6_device(FAR struct tcp_conn_s *conn); ****************************************************************************/ FAR struct tcp_conn_s *tcp_alloc_accept(FAR struct net_driver_s *dev, - FAR struct tcp_hdr_s *tcp); + FAR struct tcp_hdr_s *tcp, + FAR struct tcp_conn_s *listener); /**************************************************************************** * Name: tcp_selectport diff --git a/net/tcp/tcp_conn.c b/net/tcp/tcp_conn.c index e71592b78b..329196e5ad 100644 --- a/net/tcp/tcp_conn.c +++ b/net/tcp/tcp_conn.c @@ -983,7 +983,8 @@ FAR struct tcp_conn_s *tcp_nextconn(FAR struct tcp_conn_s *conn) ****************************************************************************/ FAR struct tcp_conn_s *tcp_alloc_accept(FAR struct net_driver_s *dev, - FAR struct tcp_hdr_s *tcp) + FAR struct tcp_hdr_s *tcp, + FAR struct tcp_conn_s *listener) { FAR struct tcp_conn_s *conn; uint8_t domain; @@ -1016,9 +1017,6 @@ FAR struct tcp_conn_s *tcp_alloc_accept(FAR struct net_driver_s *dev, { FAR struct ipv6_hdr_s *ip = IPv6BUF; - /* Set the IPv6 specific MSS and the IPv6 locally bound address */ - - conn->mss = TCP_IPv6_INITIAL_MSS(dev); net_ipv6addr_copy(conn->u.ipv6.raddr, ip->srcipaddr); net_ipv6addr_copy(conn->u.ipv6.laddr, ip->destipaddr); @@ -1044,9 +1042,6 @@ FAR struct tcp_conn_s *tcp_alloc_accept(FAR struct net_driver_s *dev, { FAR struct ipv4_hdr_s *ip = IPv4BUF; - /* Set the IPv6 specific MSS and the IPv4 bound remote address. */ - - conn->mss = TCP_IPv4_INITIAL_MSS(dev); net_ipv4addr_copy(conn->u.ipv4.raddr, net_ip4addr_conv32(ip->srcipaddr)); @@ -1086,27 +1081,48 @@ FAR struct tcp_conn_s *tcp_alloc_accept(FAR struct net_driver_s *dev, return NULL; } + /* Inherits the necessary fields from listener conn for + * the new connection. + */ + +#ifdef CONFIG_NET_SOCKOPTS + conn->sconn.s_rcvtimeo = listener->sconn.s_rcvtimeo; + conn->sconn.s_sndtimeo = listener->sconn.s_sndtimeo; +# ifdef CONFIG_NET_BINDTODEVICE + conn->sconn.s_boundto = listener->sconn.s_boundto; +# endif +#endif + + conn->sconn.s_tos = listener->sconn.s_tos; +#if CONFIG_NET_RECV_BUFSIZE > 0 + conn->rcv_bufs = listener->rcv_bufs; +#endif +#if CONFIG_NET_SEND_BUFSIZE > 0 + conn->snd_bufs = listener->snd_bufs; +#endif + conn->mss = listener->mss; + /* Fill in the necessary fields for the new connection. */ - conn->rto = TCP_RTO; - conn->sa = 0; - conn->sv = 4; - conn->nrtx = 0; - conn->lport = tcp->destport; - conn->rport = tcp->srcport; - conn->tcpstateflags = TCP_SYN_RCVD; + conn->rto = TCP_RTO; + conn->sa = 0; + conn->sv = 4; + conn->nrtx = 0; + conn->lport = tcp->destport; + conn->rport = tcp->srcport; + conn->tcpstateflags = TCP_SYN_RCVD; tcp_initsequence(conn->sndseq); #if !defined(CONFIG_NET_TCP_WRITE_BUFFERS) - conn->rexmit_seq = tcp_getsequence(conn->sndseq); + conn->rexmit_seq = tcp_getsequence(conn->sndseq); #endif - conn->tx_unacked = 1; + conn->tx_unacked = 1; #ifdef CONFIG_NET_TCP_WRITE_BUFFERS - conn->expired = 0; - conn->isn = 0; - conn->sent = 0; - conn->sndseq_max = 0; + conn->expired = 0; + conn->isn = 0; + conn->sent = 0; + conn->sndseq_max = 0; #endif /* rcvseq should be the seqno from the incoming packet + 1. */ diff --git a/net/tcp/tcp_input.c b/net/tcp/tcp_input.c index 1cd5c0df9e..ce9fc4f018 100644 --- a/net/tcp/tcp_input.c +++ b/net/tcp/tcp_input.c @@ -748,9 +748,9 @@ static void tcp_input(FAR struct net_driver_s *dev, uint8_t domain, #endif #if defined(CONFIG_NET_IPv4) && defined(CONFIG_NET_IPv6) - if (tcp_islistener(&uaddr, tmp16, domain)) + if ((conn = tcp_findlistener(&uaddr, tmp16, domain)) != NULL) #else - if (tcp_islistener(&uaddr, tmp16)) + if ((conn = tcp_findlistener(&uaddr, tmp16)) != NULL) #endif { /* We matched the incoming packet with a connection in LISTEN. @@ -762,7 +762,7 @@ static void tcp_input(FAR struct net_driver_s *dev, uint8_t domain, * any user application to accept it. */ - conn = tcp_alloc_accept(dev, tcp); + conn = tcp_alloc_accept(dev, tcp, conn); if (conn) { /* The connection structure was successfully allocated and has