diff options
author | Gregory Nutt <gnutt@nuttx.org> | 2014-01-14 08:30:35 -0600 |
---|---|---|
committer | Gregory Nutt <gnutt@nuttx.org> | 2014-01-14 08:30:35 -0600 |
commit | 98a3d56a2faac2bb5301d8c47f11749614ba3e77 (patch) | |
tree | d1b06d056b9d2fe711cfb08e162f8a3583ec3745 /nuttx | |
parent | 2244d340c287b97bb46fe5b534f4deade40a4c76 (diff) | |
download | px4-nuttx-98a3d56a2faac2bb5301d8c47f11749614ba3e77.tar.gz px4-nuttx-98a3d56a2faac2bb5301d8c47f11749614ba3e77.tar.bz2 px4-nuttx-98a3d56a2faac2bb5301d8c47f11749614ba3e77.zip |
All of Jason Jaing's write buffering logic has been incorporated, but not even yet built
Diffstat (limited to 'nuttx')
-rw-r--r-- | nuttx/net/net_send_buffered.c | 14 | ||||
-rw-r--r-- | nuttx/net/uip/uip_tcpappsend.c | 14 | ||||
-rw-r--r-- | nuttx/net/uip/uip_tcpinput.c | 39 | ||||
-rw-r--r-- | nuttx/net/uip/uip_tcptimer.c | 18 |
4 files changed, 61 insertions, 24 deletions
diff --git a/nuttx/net/net_send_buffered.c b/nuttx/net/net_send_buffered.c index b5770cfbe..766b4f496 100644 --- a/nuttx/net/net_send_buffered.c +++ b/nuttx/net/net_send_buffered.c @@ -278,7 +278,7 @@ static uint16_t send_interrupt(FAR struct uip_driver_s *dev, FAR void *pvconn, #endif { FAR struct uip_write_s *segment; - FAR void *sndbuff; + FAR void *sndbuf; size_tsndlen; /* Get the amount of data that we can send in the next packet */ @@ -286,8 +286,8 @@ static uint16_t send_interrupt(FAR struct uip_driver_s *dev, FAR void *pvconn, segment = (FAR struct uip_write_s*)sq_peek(&conn->write_q); if (segment) { - sndbuff = segment->wb_buffer; - sndlen = segment->wb_nbytes; + sndbuf = segment->wb_buffer; + sndlen = segment->wb_nbytes; DEBUGASSERT(sndlen <= uip_mss(conn)); @@ -318,7 +318,7 @@ static uint16_t send_interrupt(FAR struct uip_driver_s *dev, FAR void *pvconn, * actually happen until the polling cycle completes). */ - uip_send(dev, sndbuff, sndlen); + uip_send(dev, sndbuf, sndlen); /* Remember how much data we send out now so that we know * when everything has been acknowledged. Just increment @@ -332,7 +332,7 @@ static uint16_t send_interrupt(FAR struct uip_driver_s *dev, FAR void *pvconn, { conn->unacked += sndlen; conn->sent += sndlen; - } + } /* Increment the retransmission counter before expiration. * NOTE we will not calculate the retransmission timer @@ -493,7 +493,7 @@ ssize_t psock_send(FAR struct socket *psock, FAR const void *buf, size_t len, segment->wb_seqno = (unsigned)-1; segment->wb_nrtx = 0; - if (len-completed > CONFIG_NET_TCP_WRITE_BUFSIZE) + if (len - completed > CONFIG_NET_TCP_WRITE_BUFSIZE) { cnt = CONFIG_NET_TCP_WRITE_BUFSIZE; } @@ -503,7 +503,7 @@ ssize_t psock_send(FAR struct socket *psock, FAR const void *buf, size_t len, } segment->wb_nbytes = cnt; - memcpy(segment->wb_buffer, (char*)buf+completed, cnt); + memcpy(segment->wb_buffer, (char*)buf + completed, cnt); completed += cnt; /* send_interrupt() will refer to all the write buffer by diff --git a/nuttx/net/uip/uip_tcpappsend.c b/nuttx/net/uip/uip_tcpappsend.c index dfddbcff9..79f384c25 100644 --- a/nuttx/net/uip/uip_tcpappsend.c +++ b/nuttx/net/uip/uip_tcpappsend.c @@ -1,7 +1,7 @@ /**************************************************************************** * net/uip/uip_tcpappsend.c * - * Copyright (C) 2007-2010 Gregory Nutt. All rights reserved. + * Copyright (C) 2007-2010, 2014 Gregory Nutt. All rights reserved. * Author: Gregory Nutt <gnutt@nuttx.org> * * Adapted for NuttX from logic in uIP which also has a BSD-like license: @@ -131,6 +131,9 @@ void uip_tcpappsend(struct uip_driver_s *dev, struct uip_conn *conn, else { +#ifdef CONFIG_NET_TCP_WRITE_BUFFERS + DEBUGASSERT(dev->d_sndlen >= 0 && dev->d_sndlen <= conn->mss); +#else /* If d_sndlen > 0, the application has data to be sent. */ if (dev->d_sndlen > 0) @@ -138,7 +141,7 @@ void uip_tcpappsend(struct uip_driver_s *dev, struct uip_conn *conn, /* Remember how much data we send out now so that we know * when everything has been acknowledged. Just increment the amount * of data sent. This will be needed in sequence number calculations - * and we know that this is not a re-tranmission. Retransmissions + * and we know that this is not a re-transmission. Retransmissions * do not go through this path. */ @@ -151,9 +154,10 @@ void uip_tcpappsend(struct uip_driver_s *dev, struct uip_conn *conn, DEBUGASSERT(dev->d_sndlen <= conn->mss); } + conn->nrtx = 0; +#endif /* Then handle the rest of the operation just as for the rexmit case */ - conn->nrtx = 0; uip_tcprexmit(dev, conn, result); } } @@ -189,7 +193,11 @@ void uip_tcprexmit(struct uip_driver_s *dev, struct uip_conn *conn, * new data in it, we must send out a packet. */ +#ifdef CONFIG_NET_TCP_WRITE_BUFFERS + if (dev->d_sndlen > 0) +#else if (dev->d_sndlen > 0 && conn->unacked > 0) +#endif { /* We always set the ACK flag in response packets adding the length of * the IP and TCP headers. diff --git a/nuttx/net/uip/uip_tcpinput.c b/nuttx/net/uip/uip_tcpinput.c index 815db4129..8c7c1837c 100644 --- a/nuttx/net/uip/uip_tcpinput.c +++ b/nuttx/net/uip/uip_tcpinput.c @@ -2,7 +2,7 @@ * net/uip/uip_tcpinput.c * Handling incoming TCP input * - * Copyright (C) 2007-2013 Gregory Nutt. All rights reserved. + * Copyright (C) 2007-2014 Gregory Nutt. All rights reserved. * Author: Gregory Nutt <gnutt@nuttx.org> * * Adapted for NuttX from logic in uIP which also has a BSD-like license: @@ -358,7 +358,11 @@ found: * data (unacked). */ +#ifdef CONFIG_NET_TCP_WRITE_BUFFERS + unackseq = conn->isn + conn->sent; +#else unackseq = uip_tcpaddsequence(conn->sndseq, conn->unacked); +#endif /* Get the sequence number of that has just been acknowledged by this * incoming packet. @@ -383,12 +387,16 @@ found: { /* What would it mean if ackseq > unackseq? The peer has ACKed * more bytes than we think we have sent? Someone has lost it. - * Complain and reset the number of outstanding, unackowledged + * Complain and reset the number of outstanding, unacknowledged * bytes */ - nlldbg("ERROR: ackseq[%08x] > unackseq[%08x]\n", ackseq, unackseq); - conn->unacked = 0; + if ((conn->tcpstateflags & UIP_TS_MASK) == UIP_ESTABLISHED) + { + nlldbg("ERROR: conn->sndseq %d, conn->unacked %d\n", + uip_tcpgetsequence(conn->sndseq), conn->unacked); + goto reset; + } } /* Update sequence number to the unacknowledge sequence number. If @@ -450,10 +458,15 @@ found: if ((flags & UIP_ACKDATA) != 0) { conn->tcpstateflags = UIP_ESTABLISHED; - conn->unacked = 0; - nllvdbg("TCP state: UIP_ESTABLISHED\n"); +#ifdef CONFIG_NET_TCP_WRITE_BUFFERS + conn->isn = uip_tcpgetsequence(pbuf->ackno); + uip_tcpsetsequence(conn->sndseq, conn->isn); + conn->sent = 0; +#endif + conn->unacked = 0; flags = UIP_CONNECTED; + nllvdbg("TCP state: UIP_ESTABLISHED\n"); if (dev->d_len > 0) { @@ -539,12 +552,18 @@ found: conn->tcpstateflags = UIP_ESTABLISHED; memcpy(conn->rcvseq, pbuf->seqno, 4); - nllvdbg("TCP state: UIP_ESTABLISHED\n"); uip_incr32(conn->rcvseq, 1); conn->unacked = 0; + +#ifdef CONFIG_NET_TCP_WRITE_BUFFERS + conn->isn = uip_tcpgetsequence(pbuf->ackno); + uip_tcpsetsequence(conn->sndseq, conn->isn); +#endif dev->d_len = 0; dev->d_sndlen = 0; + + nllvdbg("TCP state: UIP_ESTABLISHED\n"); result = uip_tcpcallback(dev, conn, UIP_CONNECTED | UIP_NEWDATA); uip_tcpappsend(dev, conn, result); return; @@ -726,8 +745,8 @@ found: case UIP_FIN_WAIT_1: /* The application has closed the connection, but the remote host - * hasn't closed its end yet. Thus we do nothing but wait for a - * FIN from the other side. + * hasn't closed its end yet. Thus we stay in the FIN_WAIT_1 state + * until we receive a FIN from the remote. */ if (dev->d_len > 0) @@ -768,6 +787,7 @@ found: uip_tcpsend(dev, conn, TCP_ACK, UIP_IPTCPH_LEN); return; } + goto drop; case UIP_FIN_WAIT_2: @@ -793,6 +813,7 @@ found: uip_tcpsend(dev, conn, TCP_ACK, UIP_IPTCPH_LEN); return; } + goto drop; case UIP_TIME_WAIT: diff --git a/nuttx/net/uip/uip_tcptimer.c b/nuttx/net/uip/uip_tcptimer.c index a0772136e..48194f447 100644 --- a/nuttx/net/uip/uip_tcptimer.c +++ b/nuttx/net/uip/uip_tcptimer.c @@ -115,11 +115,12 @@ void uip_tcptimer(struct uip_driver_s *dev, struct uip_conn *conn, int hsec) * out. */ - if (conn->tcpstateflags == UIP_TIME_WAIT || conn->tcpstateflags == UIP_FIN_WAIT_2) + if (conn->tcpstateflags == UIP_TIME_WAIT || + conn->tcpstateflags == UIP_FIN_WAIT_2) { /* Increment the connection timer */ - (conn->timer) += hsec; + conn->timer += hsec; if (conn->timer >= UIP_TIME_WAIT_TIMEOUT) { conn->tcpstateflags = UIP_CLOSED; @@ -133,7 +134,8 @@ void uip_tcptimer(struct uip_driver_s *dev, struct uip_conn *conn, int hsec) * retransmit. */ - if (conn->unacked > 0) + if (conn->unacked > 0 && + (conn->tcpstateflags & UIP_TS_MASK) == UIP_ESTABLISHED) { /* The connection has outstanding data */ @@ -151,10 +153,16 @@ void uip_tcptimer(struct uip_driver_s *dev, struct uip_conn *conn, int hsec) /* Should we close the connection? */ - if (conn->nrtx == UIP_MAXRTX || + if ( +#ifdef CONFIG_NET_TCP_WRITE_BUFFERS + conn->expired > 0 || +#else + conn->nrtx == UIP_MAXRTX || +#endif ((conn->tcpstateflags == UIP_SYN_SENT || conn->tcpstateflags == UIP_SYN_RCVD) && - conn->nrtx == UIP_MAXSYNRTX)) + conn->nrtx == UIP_MAXSYNRTX) + ) { conn->tcpstateflags = UIP_CLOSED; nllvdbg("TCP state: UIP_CLOSED\n"); |