You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2023/01/18 08:24:16 UTC

[nuttx] 01/04: net/tcp: new api tcp_dataconcat() to concatenate/pack iob chain

This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 0e7d397553d51c70c625843bcd891efb054c887f
Author: chao an <an...@xiaomi.com>
AuthorDate: Fri Jan 6 13:50:43 2023 +0800

    net/tcp: new api tcp_dataconcat() to concatenate/pack iob chain
    
    Signed-off-by: chao an <an...@xiaomi.com>
---
 net/tcp/tcp.h          | 15 ++++++++++++++
 net/tcp/tcp_callback.c | 54 ++++++++++++++++++++++++++++++++++++--------------
 2 files changed, 54 insertions(+), 15 deletions(-)

diff --git a/net/tcp/tcp.h b/net/tcp/tcp.h
index f28dd9758a..5637106499 100644
--- a/net/tcp/tcp.h
+++ b/net/tcp/tcp.h
@@ -1278,6 +1278,21 @@ uint16_t tcp_datahandler(FAR struct net_driver_s *dev,
                          FAR struct tcp_conn_s *conn,
                          uint16_t offset);
 
+/****************************************************************************
+ * Name: tcp_dataconcat
+ *
+ * Description:
+ *   Concatenate iob_s chain iob2 to iob1, if CONFIG_NET_TCP_RECV_PACK is
+ *   endabled, pack all data in the I/O buffer chain.
+ *
+ * Returned Value:
+ *   The number of bytes actually buffered is returned.  This will be either
+ *   zero or equal to iob1->io_pktlen.
+ *
+ ****************************************************************************/
+
+uint16_t tcp_dataconcat(FAR struct iob_s **iob1, FAR struct iob_s **iob2);
+
 /****************************************************************************
  * Name: tcp_backlogcreate
  *
diff --git a/net/tcp/tcp_callback.c b/net/tcp/tcp_callback.c
index a5f22c4556..3d00cdcc1f 100644
--- a/net/tcp/tcp_callback.c
+++ b/net/tcp/tcp_callback.c
@@ -196,6 +196,43 @@ uint16_t tcp_callback(FAR struct net_driver_s *dev,
   return flags;
 }
 
+/****************************************************************************
+ * Name: tcp_dataconcat
+ *
+ * Description:
+ *   Concatenate iob_s chain iob2 to iob1, if CONFIG_NET_TCP_RECV_PACK is
+ *   endabled, pack all data in the I/O buffer chain.
+ *
+ * Returned Value:
+ *   The number of bytes actually buffered is returned.  This will be either
+ *   zero or equal to iob->io_pktlen.
+ *
+ ****************************************************************************/
+
+uint16_t tcp_dataconcat(FAR struct iob_s **iob1, FAR struct iob_s **iob2)
+{
+  if (*iob1 == NULL)
+    {
+      *iob1 = *iob2;
+    }
+  else
+    {
+      iob_concat(*iob1, *iob2);
+    }
+
+  *iob2 = NULL;
+
+#ifdef CONFIG_NET_TCP_RECV_PACK
+  /* Merge an iob chain into a continuous space, thereby reducing iob
+   * consumption.
+   */
+
+  *iob1 = iob_pack(*iob1);
+#endif
+
+  return (*iob1)->io_pktlen;
+}
+
 /****************************************************************************
  * Name: tcp_datahandler
  *
@@ -247,22 +284,9 @@ uint16_t tcp_datahandler(FAR struct net_driver_s *dev,
 
   /* Concat the iob to readahead */
 
-  if (conn->readahead == NULL)
-    {
-      conn->readahead = iob;
-    }
-  else
-    {
-      iob_concat(conn->readahead, iob);
-    }
-
-#ifdef CONFIG_NET_TCP_RECV_PACK
-  /* Merge an iob chain into a continuous space, thereby reducing iob
-   * consumption.
-   */
+  tcp_dataconcat(&conn->readahead, &iob);
 
-  conn->readahead = iob_pack(conn->readahead);
-#endif
+  /* Clear device buffer */
 
   netdev_iob_clear(dev);