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 2022/01/01 12:40:12 UTC

[incubator-nuttx] 03/03: net/udp: add support for CONFIG_NET_ALLOC_CONNS

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/incubator-nuttx.git

commit 26370cd2f760419221e242feb6ec42e81b2f8a17
Author: chao.an <an...@xiaomi.com>
AuthorDate: Fri Dec 31 15:20:29 2021 +0800

    net/udp: add support for CONFIG_NET_ALLOC_CONNS
    
    Signed-off-by: chao.an <an...@xiaomi.com>
---
 net/udp/udp_conn.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 52 insertions(+), 5 deletions(-)

diff --git a/net/udp/udp_conn.c b/net/udp/udp_conn.c
index f6e7f79..b8a73d8 100644
--- a/net/udp/udp_conn.c
+++ b/net/udp/udp_conn.c
@@ -80,7 +80,9 @@
 
 /* The array containing all UDP connections. */
 
+#ifndef CONFIG_NET_ALLOC_CONNS
 struct udp_conn_s g_udp_connections[CONFIG_NET_UDP_CONNS];
+#endif
 
 /* A list of all free UDP connections */
 
@@ -125,15 +127,12 @@ static FAR struct udp_conn_s *udp_find_conn(uint8_t domain,
                                             FAR union ip_binding_u *ipaddr,
                                             uint16_t portno)
 {
-  FAR struct udp_conn_s *conn;
-  int i;
+  FAR struct udp_conn_s *conn = NULL;
 
   /* Now search each connection structure. */
 
-  for (i = 0; i < CONFIG_NET_UDP_CONNS; i++)
+  while ((conn = udp_nextconn(conn)) != NULL)
     {
-      conn = &g_udp_connections[i];
-
       /* If the port local port number assigned to the connections matches
        * AND the IP address of the connection matches, then return a
        * reference to the connection structure.  INADDR_ANY is a special
@@ -454,6 +453,46 @@ static inline FAR struct udp_conn_s *
 #endif /* CONFIG_NET_IPv6 */
 
 /****************************************************************************
+ * Name: udp_alloc_conn
+ *
+ * Description:
+ *   Allocate a uninitialized UDP connection structure.
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_NET_ALLOC_CONNS
+FAR struct udp_conn_s *udp_alloc_conn(void)
+{
+  FAR struct udp_conn_s *conn;
+  int i;
+
+  /* Return the entry from the head of the free list */
+
+  if (dq_peek(&g_free_udp_connections) == NULL)
+    {
+      conn = kmm_zalloc(sizeof(struct udp_conn_s) *
+                        CONFIG_NET_UDP_CONNS);
+      if (conn == NULL)
+        {
+          return conn;
+        }
+
+      /* Now initialize each connection structure */
+
+      for (i = 0; i < CONFIG_NET_UDP_CONNS; i++)
+        {
+          /* Mark the connection closed and move it to the free list */
+
+          conn[i].lport = 0;
+          dq_addlast(&conn[i].node, &g_free_udp_connections);
+        }
+    }
+
+  return (FAR struct udp_conn_s *)dq_remfirst(&g_free_udp_connections);
+}
+#endif
+
+/****************************************************************************
  * Public Functions
  ****************************************************************************/
 
@@ -538,7 +577,9 @@ uint16_t udp_select_port(uint8_t domain, FAR union ip_binding_u *u)
 
 void udp_initialize(void)
 {
+#ifndef CONFIG_NET_ALLOC_CONNS
   int i;
+#endif
 
   /* Initialize the queues */
 
@@ -546,6 +587,7 @@ void udp_initialize(void)
   dq_init(&g_active_udp_connections);
   nxsem_init(&g_free_sem, 0, 1);
 
+#ifndef CONFIG_NET_ALLOC_CONNS
   for (i = 0; i < CONFIG_NET_UDP_CONNS; i++)
     {
       /* Mark the connection closed and move it to the free list */
@@ -553,6 +595,7 @@ void udp_initialize(void)
       g_udp_connections[i].lport = 0;
       dq_addlast(&g_udp_connections[i].node, &g_free_udp_connections);
     }
+#endif
 }
 
 /****************************************************************************
@@ -571,7 +614,11 @@ FAR struct udp_conn_s *udp_alloc(uint8_t domain)
   /* The free list is protected by a semaphore (that behaves like a mutex). */
 
   _udp_semtake(&g_free_sem);
+#ifndef CONFIG_NET_ALLOC_CONNS
   conn = (FAR struct udp_conn_s *)dq_remfirst(&g_free_udp_connections);
+#else
+  conn = udp_alloc_conn();
+#endif
   if (conn)
     {
       /* Make sure that the connection is marked as uninitialized */