From 26370cd2f760419221e242feb6ec42e81b2f8a17 Mon Sep 17 00:00:00 2001 From: "chao.an" Date: Fri, 31 Dec 2021 15:20:29 +0800 Subject: [PATCH] net/udp: add support for CONFIG_NET_ALLOC_CONNS Signed-off-by: chao.an --- 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 f6e7f7948f..b8a73d831c 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 @@ -453,6 +452,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 */