summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregory Nutt <gnutt@nuttx.org>2014-01-14 08:30:35 -0600
committerGregory Nutt <gnutt@nuttx.org>2014-01-14 08:30:35 -0600
commit98a3d56a2faac2bb5301d8c47f11749614ba3e77 (patch)
treed1b06d056b9d2fe711cfb08e162f8a3583ec3745
parent2244d340c287b97bb46fe5b534f4deade40a4c76 (diff)
downloadnuttx-98a3d56a2faac2bb5301d8c47f11749614ba3e77.tar.gz
nuttx-98a3d56a2faac2bb5301d8c47f11749614ba3e77.tar.bz2
nuttx-98a3d56a2faac2bb5301d8c47f11749614ba3e77.zip
All of Jason Jaing's write buffering logic has been incorporated, but not even yet built
-rw-r--r--nuttx/net/net_send_buffered.c14
-rw-r--r--nuttx/net/uip/uip_tcpappsend.c14
-rw-r--r--nuttx/net/uip/uip_tcpinput.c39
-rw-r--r--nuttx/net/uip/uip_tcptimer.c18
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");