mirror of
https://github.com/apache/nuttx.git
synced 2026-06-06 00:14:22 +08:00
net/misc: add support for CONFIG_NET_ALLOC_CONNS
Signed-off-by: chao.an <anchao@xiaomi.com>
This commit is contained in:
@@ -32,6 +32,7 @@
|
|||||||
#include <netpacket/bluetooth.h>
|
#include <netpacket/bluetooth.h>
|
||||||
#include <arch/irq.h>
|
#include <arch/irq.h>
|
||||||
|
|
||||||
|
#include <nuttx/kmalloc.h>
|
||||||
#include <nuttx/mm/iob.h>
|
#include <nuttx/mm/iob.h>
|
||||||
#include <nuttx/net/netconfig.h>
|
#include <nuttx/net/netconfig.h>
|
||||||
#include <nuttx/net/net.h>
|
#include <nuttx/net/net.h>
|
||||||
@@ -51,8 +52,10 @@
|
|||||||
* network lock.
|
* network lock.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef CONFIG_NET_ALLOC_CONNS
|
||||||
static struct bluetooth_conn_s
|
static struct bluetooth_conn_s
|
||||||
g_bluetooth_connections[CONFIG_NET_BLUETOOTH_NCONNS];
|
g_bluetooth_connections[CONFIG_NET_BLUETOOTH_NCONNS];
|
||||||
|
#endif
|
||||||
|
|
||||||
/* A list of all free packet socket connections */
|
/* A list of all free packet socket connections */
|
||||||
|
|
||||||
@@ -85,28 +88,24 @@ static const bt_addr_t g_any_addr =
|
|||||||
|
|
||||||
void bluetooth_conn_initialize(void)
|
void bluetooth_conn_initialize(void)
|
||||||
{
|
{
|
||||||
|
#ifndef CONFIG_NET_ALLOC_CONNS
|
||||||
int i;
|
int i;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Initialize the queues */
|
/* Initialize the queues */
|
||||||
|
|
||||||
dq_init(&g_free_bluetooth_connections);
|
dq_init(&g_free_bluetooth_connections);
|
||||||
dq_init(&g_active_bluetooth_connections);
|
dq_init(&g_active_bluetooth_connections);
|
||||||
|
|
||||||
/* Mark connections as uninitialized */
|
#ifndef CONFIG_NET_ALLOC_CONNS
|
||||||
|
|
||||||
memset(g_bluetooth_connections, 0, sizeof(g_bluetooth_connections));
|
|
||||||
|
|
||||||
for (i = 0; i < CONFIG_NET_BLUETOOTH_NCONNS; i++)
|
for (i = 0; i < CONFIG_NET_BLUETOOTH_NCONNS; i++)
|
||||||
{
|
{
|
||||||
/* Indicate a connection unbound with BTPROTO_NONE */
|
|
||||||
|
|
||||||
g_bluetooth_connections[i].bc_proto = BTPROTO_NONE;
|
|
||||||
|
|
||||||
/* Link each pre-allocated connection structure into the free list. */
|
/* Link each pre-allocated connection structure into the free list. */
|
||||||
|
|
||||||
dq_addlast(&g_bluetooth_connections[i].bc_node,
|
dq_addlast(&g_bluetooth_connections[i].bc_node,
|
||||||
&g_free_bluetooth_connections);
|
&g_free_bluetooth_connections);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@@ -121,18 +120,38 @@ void bluetooth_conn_initialize(void)
|
|||||||
FAR struct bluetooth_conn_s *bluetooth_conn_alloc(void)
|
FAR struct bluetooth_conn_s *bluetooth_conn_alloc(void)
|
||||||
{
|
{
|
||||||
FAR struct bluetooth_conn_s *conn;
|
FAR struct bluetooth_conn_s *conn;
|
||||||
|
#ifdef CONFIG_NET_ALLOC_CONNS
|
||||||
|
int i;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* The free list is protected by the network lock */
|
/* The free list is protected by the network lock */
|
||||||
|
|
||||||
net_lock();
|
net_lock();
|
||||||
conn = (FAR struct bluetooth_conn_s *)
|
#ifdef CONFIG_NET_ALLOC_CONNS
|
||||||
dq_remfirst(&g_free_bluetooth_connections);
|
if (dq_peek(&g_active_bluetooth_connections) == NULL)
|
||||||
|
{
|
||||||
|
conn = kmm_zalloc(sizeof(*conn) * CONFIG_NET_BLUETOOTH_NCONNS);
|
||||||
|
if (conn != NULL)
|
||||||
|
{
|
||||||
|
for (i = 0; i < CONFIG_NET_BLUETOOTH_NCONNS; i++)
|
||||||
|
{
|
||||||
|
dq_addlast(&conn[i].bc_node,
|
||||||
|
&g_active_bluetooth_connections);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
conn = (FAR struct bluetooth_conn_s *)
|
||||||
|
dq_remfirst(&g_free_bluetooth_connections);
|
||||||
if (conn)
|
if (conn)
|
||||||
{
|
{
|
||||||
|
/* Mark as unbound */
|
||||||
|
|
||||||
|
conn->bc_proto = BTPROTO_NONE;
|
||||||
|
|
||||||
/* Enqueue the connection into the active list */
|
/* Enqueue the connection into the active list */
|
||||||
|
|
||||||
memset(conn, 0, sizeof(struct bluetooth_conn_s));
|
|
||||||
dq_addlast(&conn->bc_node, &g_active_bluetooth_connections);
|
dq_addlast(&conn->bc_node, &g_active_bluetooth_connections);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -184,14 +203,14 @@ void bluetooth_conn_free(FAR struct bluetooth_conn_s *conn)
|
|||||||
bluetooth_container_free(container);
|
bluetooth_container_free(container);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Reset structure */
|
||||||
|
|
||||||
|
memset(conn, 0, sizeof(*conn));
|
||||||
|
|
||||||
/* Free the connection */
|
/* Free the connection */
|
||||||
|
|
||||||
dq_addlast(&conn->bc_node, &g_free_bluetooth_connections);
|
dq_addlast(&conn->bc_node, &g_free_bluetooth_connections);
|
||||||
|
|
||||||
/* Mark as unbound */
|
|
||||||
|
|
||||||
conn->bc_proto = BTPROTO_NONE;
|
|
||||||
|
|
||||||
net_unlock();
|
net_unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+24
-8
@@ -49,7 +49,9 @@
|
|||||||
|
|
||||||
/* The array containing all NetLink connections. */
|
/* The array containing all NetLink connections. */
|
||||||
|
|
||||||
|
#ifndef CONFIG_NET_ALLOC_CONNS
|
||||||
static struct can_conn_s g_can_connections[CONFIG_CAN_CONNS];
|
static struct can_conn_s g_can_connections[CONFIG_CAN_CONNS];
|
||||||
|
#endif
|
||||||
|
|
||||||
/* A list of all free NetLink connections */
|
/* A list of all free NetLink connections */
|
||||||
|
|
||||||
@@ -97,7 +99,9 @@ static void _can_semgive(FAR sem_t *sem)
|
|||||||
|
|
||||||
void can_initialize(void)
|
void can_initialize(void)
|
||||||
{
|
{
|
||||||
|
#ifndef CONFIG_NET_ALLOC_CONNS
|
||||||
int i;
|
int i;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Initialize the queues */
|
/* Initialize the queues */
|
||||||
|
|
||||||
@@ -105,15 +109,14 @@ void can_initialize(void)
|
|||||||
dq_init(&g_active_can_connections);
|
dq_init(&g_active_can_connections);
|
||||||
nxsem_init(&g_free_sem, 0, 1);
|
nxsem_init(&g_free_sem, 0, 1);
|
||||||
|
|
||||||
|
#ifndef CONFIG_NET_ALLOC_CONNS
|
||||||
for (i = 0; i < CONFIG_CAN_CONNS; i++)
|
for (i = 0; i < CONFIG_CAN_CONNS; i++)
|
||||||
{
|
{
|
||||||
FAR struct can_conn_s *conn = &g_can_connections[i];
|
|
||||||
|
|
||||||
/* Mark the connection closed and move it to the free list */
|
/* Mark the connection closed and move it to the free list */
|
||||||
|
|
||||||
memset(conn, 0, sizeof(*conn));
|
dq_addlast(&g_can_connections[i].node, &g_free_can_connections);
|
||||||
dq_addlast(&conn->node, &g_free_can_connections);
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@@ -128,17 +131,30 @@ void can_initialize(void)
|
|||||||
FAR struct can_conn_s *can_alloc(void)
|
FAR struct can_conn_s *can_alloc(void)
|
||||||
{
|
{
|
||||||
FAR struct can_conn_s *conn;
|
FAR struct can_conn_s *conn;
|
||||||
|
#ifdef CONFIG_NET_ALLOC_CONNS
|
||||||
|
int i;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* The free list is protected by a semaphore (that behaves like a mutex). */
|
/* The free list is protected by a semaphore (that behaves like a mutex). */
|
||||||
|
|
||||||
_can_semtake(&g_free_sem);
|
_can_semtake(&g_free_sem);
|
||||||
|
#ifdef CONFIG_NET_ALLOC_CONNS
|
||||||
|
if (dq_peek(&g_free_can_connections) == NULL)
|
||||||
|
{
|
||||||
|
conn = kmm_zalloc(sizeof(*conn) * CONFIG_CAN_CONNS);
|
||||||
|
if (conn != NULL)
|
||||||
|
{
|
||||||
|
for (i = 0; i < CONFIG_CAN_CONNS; i++)
|
||||||
|
{
|
||||||
|
dq_addlast(&conn[i].node, &g_free_can_connections);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
conn = (FAR struct can_conn_s *)dq_remfirst(&g_free_can_connections);
|
conn = (FAR struct can_conn_s *)dq_remfirst(&g_free_can_connections);
|
||||||
if (conn != NULL)
|
if (conn != NULL)
|
||||||
{
|
{
|
||||||
/* Make sure that the connection is marked as uninitialized */
|
|
||||||
|
|
||||||
memset(conn, 0, sizeof(*conn));
|
|
||||||
|
|
||||||
/* FIXME SocketCAN default behavior enables loopback */
|
/* FIXME SocketCAN default behavior enables loopback */
|
||||||
|
|
||||||
#ifdef CONFIG_NET_CANPROTO_OPTIONS
|
#ifdef CONFIG_NET_CANPROTO_OPTIONS
|
||||||
|
|||||||
@@ -31,6 +31,7 @@
|
|||||||
|
|
||||||
#include <arch/irq.h>
|
#include <arch/irq.h>
|
||||||
|
|
||||||
|
#include <nuttx/kmalloc.h>
|
||||||
#include <nuttx/mm/iob.h>
|
#include <nuttx/mm/iob.h>
|
||||||
#include <nuttx/net/netconfig.h>
|
#include <nuttx/net/netconfig.h>
|
||||||
#include <nuttx/net/net.h>
|
#include <nuttx/net/net.h>
|
||||||
@@ -50,8 +51,10 @@
|
|||||||
* network lock.
|
* network lock.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef CONFIG_NET_ALLOC_CONNS
|
||||||
static struct ieee802154_conn_s
|
static struct ieee802154_conn_s
|
||||||
g_ieee802154_connections[CONFIG_NET_IEEE802154_NCONNS];
|
g_ieee802154_connections[CONFIG_NET_IEEE802154_NCONNS];
|
||||||
|
#endif
|
||||||
|
|
||||||
/* A list of all free packet socket connections */
|
/* A list of all free packet socket connections */
|
||||||
|
|
||||||
@@ -79,13 +82,16 @@ static dq_queue_t g_active_ieee802154_connections;
|
|||||||
|
|
||||||
void ieee802154_conn_initialize(void)
|
void ieee802154_conn_initialize(void)
|
||||||
{
|
{
|
||||||
|
#ifndef CONFIG_NET_ALLOC_CONNS
|
||||||
int i;
|
int i;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Initialize the queues */
|
/* Initialize the queues */
|
||||||
|
|
||||||
dq_init(&g_free_ieee802154_connections);
|
dq_init(&g_free_ieee802154_connections);
|
||||||
dq_init(&g_active_ieee802154_connections);
|
dq_init(&g_active_ieee802154_connections);
|
||||||
|
|
||||||
|
#ifndef CONFIG_NET_ALLOC_CONNS
|
||||||
for (i = 0; i < CONFIG_NET_IEEE802154_NCONNS; i++)
|
for (i = 0; i < CONFIG_NET_IEEE802154_NCONNS; i++)
|
||||||
{
|
{
|
||||||
/* Link each pre-allocated connection structure into the free list. */
|
/* Link each pre-allocated connection structure into the free list. */
|
||||||
@@ -93,6 +99,7 @@ void ieee802154_conn_initialize(void)
|
|||||||
dq_addlast(&g_ieee802154_connections[i].node,
|
dq_addlast(&g_ieee802154_connections[i].node,
|
||||||
&g_free_ieee802154_connections);
|
&g_free_ieee802154_connections);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@@ -107,18 +114,31 @@ void ieee802154_conn_initialize(void)
|
|||||||
FAR struct ieee802154_conn_s *ieee802154_conn_alloc(void)
|
FAR struct ieee802154_conn_s *ieee802154_conn_alloc(void)
|
||||||
{
|
{
|
||||||
FAR struct ieee802154_conn_s *conn;
|
FAR struct ieee802154_conn_s *conn;
|
||||||
|
#ifdef CONFIG_NET_ALLOC_CONNS
|
||||||
|
int i;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* The free list is protected by the network lock. */
|
/* The free list is protected by the network lock. */
|
||||||
|
|
||||||
net_lock();
|
net_lock();
|
||||||
conn = (FAR struct ieee802154_conn_s *)
|
#ifdef CONFIG_NET_ALLOC_CONNS
|
||||||
dq_remfirst(&g_free_ieee802154_connections);
|
if (dq_peek(&g_free_ieee802154_connections) == NULL)
|
||||||
|
{
|
||||||
|
conn = kmm_zalloc(sizeof(*conn) * CONFIG_NET_IEEE802154_NCONNS);
|
||||||
|
if (conn != NULL)
|
||||||
|
{
|
||||||
|
for (i = 0; i < CONFIG_NET_IEEE802154_NCONNS; i++)
|
||||||
|
{
|
||||||
|
dq_addlast(&conn[i].node, &g_free_ieee802154_connections);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
conn = (FAR struct ieee802154_conn_s *)
|
||||||
|
dq_remfirst(&g_free_ieee802154_connections);
|
||||||
if (conn)
|
if (conn)
|
||||||
{
|
{
|
||||||
/* Enqueue the connection into the active list */
|
|
||||||
|
|
||||||
memset(conn, 0, sizeof(struct ieee802154_conn_s));
|
|
||||||
dq_addlast(&conn->node, &g_active_ieee802154_connections);
|
dq_addlast(&conn->node, &g_active_ieee802154_connections);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -170,6 +190,10 @@ void ieee802154_conn_free(FAR struct ieee802154_conn_s *conn)
|
|||||||
ieee802154_container_free(container);
|
ieee802154_container_free(container);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Enqueue the connection into the active list */
|
||||||
|
|
||||||
|
memset(conn, 0, sizeof(*conn));
|
||||||
|
|
||||||
/* Free the connection */
|
/* Free the connection */
|
||||||
|
|
||||||
dq_addlast(&conn->node, &g_free_ieee802154_connections);
|
dq_addlast(&conn->node, &g_free_ieee802154_connections);
|
||||||
|
|||||||
@@ -50,7 +50,9 @@
|
|||||||
|
|
||||||
/* The array containing all NetLink connections. */
|
/* The array containing all NetLink connections. */
|
||||||
|
|
||||||
|
#ifndef CONFIG_NET_ALLOC_CONNS
|
||||||
static struct netlink_conn_s g_netlink_connections[CONFIG_NETLINK_CONNS];
|
static struct netlink_conn_s g_netlink_connections[CONFIG_NETLINK_CONNS];
|
||||||
|
#endif
|
||||||
|
|
||||||
/* A list of all free NetLink connections */
|
/* A list of all free NetLink connections */
|
||||||
|
|
||||||
@@ -121,7 +123,9 @@ static void netlink_response_available(FAR void *arg)
|
|||||||
|
|
||||||
void netlink_initialize(void)
|
void netlink_initialize(void)
|
||||||
{
|
{
|
||||||
|
#ifndef CONFIG_NET_ALLOC_CONNS
|
||||||
int i;
|
int i;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Initialize the queues */
|
/* Initialize the queues */
|
||||||
|
|
||||||
@@ -129,15 +133,15 @@ void netlink_initialize(void)
|
|||||||
dq_init(&g_active_netlink_connections);
|
dq_init(&g_active_netlink_connections);
|
||||||
nxsem_init(&g_free_sem, 0, 1);
|
nxsem_init(&g_free_sem, 0, 1);
|
||||||
|
|
||||||
|
#ifndef CONFIG_NET_ALLOC_CONNS
|
||||||
for (i = 0; i < CONFIG_NETLINK_CONNS; i++)
|
for (i = 0; i < CONFIG_NETLINK_CONNS; i++)
|
||||||
{
|
{
|
||||||
FAR struct netlink_conn_s *conn = &g_netlink_connections[i];
|
|
||||||
|
|
||||||
/* Mark the connection closed and move it to the free list */
|
/* Mark the connection closed and move it to the free list */
|
||||||
|
|
||||||
memset(conn, 0, sizeof(*conn));
|
dq_addlast(&g_netlink_connections[i].node,
|
||||||
dq_addlast(&conn->node, &g_free_netlink_connections);
|
&g_free_netlink_connections);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@@ -152,18 +156,31 @@ void netlink_initialize(void)
|
|||||||
FAR struct netlink_conn_s *netlink_alloc(void)
|
FAR struct netlink_conn_s *netlink_alloc(void)
|
||||||
{
|
{
|
||||||
FAR struct netlink_conn_s *conn;
|
FAR struct netlink_conn_s *conn;
|
||||||
|
#ifdef CONFIG_NET_ALLOC_CONNS
|
||||||
|
int i;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* The free list is protected by a semaphore (that behaves like a mutex). */
|
/* The free list is protected by a semaphore (that behaves like a mutex). */
|
||||||
|
|
||||||
_netlink_semtake(&g_free_sem);
|
_netlink_semtake(&g_free_sem);
|
||||||
|
#ifdef CONFIG_NET_ALLOC_CONNS
|
||||||
|
if (dq_peek(&g_free_netlink_connections) == NULL)
|
||||||
|
{
|
||||||
|
conn = kmm_zalloc(sizeof(*conn) * CONFIG_NETLINK_CONNS);
|
||||||
|
if (conn != NULL)
|
||||||
|
{
|
||||||
|
for (i = 0; i < CONFIG_NETLINK_CONNS; i++)
|
||||||
|
{
|
||||||
|
dq_addlast(&conn[i].node, &g_free_netlink_connections);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
conn = (FAR struct netlink_conn_s *)
|
conn = (FAR struct netlink_conn_s *)
|
||||||
dq_remfirst(&g_free_netlink_connections);
|
dq_remfirst(&g_free_netlink_connections);
|
||||||
if (conn != NULL)
|
if (conn != NULL)
|
||||||
{
|
{
|
||||||
/* Make sure that the connection is marked as uninitialized */
|
|
||||||
|
|
||||||
memset(conn, 0, sizeof(*conn));
|
|
||||||
|
|
||||||
/* Enqueue the connection into the active list */
|
/* Enqueue the connection into the active list */
|
||||||
|
|
||||||
dq_addlast(&conn->node, &g_active_netlink_connections);
|
dq_addlast(&conn->node, &g_active_netlink_connections);
|
||||||
|
|||||||
+28
-7
@@ -31,6 +31,7 @@
|
|||||||
|
|
||||||
#include <arch/irq.h>
|
#include <arch/irq.h>
|
||||||
|
|
||||||
|
#include <nuttx/kmalloc.h>
|
||||||
#include <nuttx/semaphore.h>
|
#include <nuttx/semaphore.h>
|
||||||
#include <nuttx/net/netconfig.h>
|
#include <nuttx/net/netconfig.h>
|
||||||
#include <nuttx/net/net.h>
|
#include <nuttx/net/net.h>
|
||||||
@@ -55,7 +56,9 @@
|
|||||||
|
|
||||||
/* The array containing all packet socket connections */
|
/* The array containing all packet socket connections */
|
||||||
|
|
||||||
|
#ifndef CONFIG_NET_ALLOC_CONNS
|
||||||
static struct pkt_conn_s g_pkt_connections[CONFIG_NET_PKT_CONNS];
|
static struct pkt_conn_s g_pkt_connections[CONFIG_NET_PKT_CONNS];
|
||||||
|
#endif
|
||||||
|
|
||||||
/* A list of all free packet socket connections */
|
/* A list of all free packet socket connections */
|
||||||
|
|
||||||
@@ -100,7 +103,9 @@ static inline void _pkt_semtake(FAR sem_t *sem)
|
|||||||
|
|
||||||
void pkt_initialize(void)
|
void pkt_initialize(void)
|
||||||
{
|
{
|
||||||
|
#ifndef CONFIG_NET_ALLOC_CONNS
|
||||||
int i;
|
int i;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Initialize the queues */
|
/* Initialize the queues */
|
||||||
|
|
||||||
@@ -108,13 +113,12 @@ void pkt_initialize(void)
|
|||||||
dq_init(&g_active_pkt_connections);
|
dq_init(&g_active_pkt_connections);
|
||||||
nxsem_init(&g_free_sem, 0, 1);
|
nxsem_init(&g_free_sem, 0, 1);
|
||||||
|
|
||||||
|
#ifndef CONFIG_NET_ALLOC_CONNS
|
||||||
for (i = 0; i < CONFIG_NET_PKT_CONNS; i++)
|
for (i = 0; i < CONFIG_NET_PKT_CONNS; i++)
|
||||||
{
|
{
|
||||||
/* Mark the connection closed and move it to the free list */
|
|
||||||
|
|
||||||
g_pkt_connections[i].ifindex = 0;
|
|
||||||
dq_addlast(&g_pkt_connections[i].node, &g_free_pkt_connections);
|
dq_addlast(&g_pkt_connections[i].node, &g_free_pkt_connections);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@@ -129,17 +133,30 @@ void pkt_initialize(void)
|
|||||||
FAR struct pkt_conn_s *pkt_alloc(void)
|
FAR struct pkt_conn_s *pkt_alloc(void)
|
||||||
{
|
{
|
||||||
FAR struct pkt_conn_s *conn;
|
FAR struct pkt_conn_s *conn;
|
||||||
|
#ifdef CONFIG_NET_ALLOC_CONNS
|
||||||
|
int i;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* The free list is protected by a semaphore (that behaves like a mutex). */
|
/* The free list is protected by a semaphore (that behaves like a mutex). */
|
||||||
|
|
||||||
_pkt_semtake(&g_free_sem);
|
_pkt_semtake(&g_free_sem);
|
||||||
|
#ifdef CONFIG_NET_ALLOC_CONNS
|
||||||
|
if (dq_peek(&g_free_pkt_connections) == NULL)
|
||||||
|
{
|
||||||
|
conn = kmm_zalloc(sizeof(*conn) * CONFIG_NET_PKT_CONNS);
|
||||||
|
if (conn != NULL)
|
||||||
|
{
|
||||||
|
for (i = 0; i < CONFIG_NET_PKT_CONNS; i++)
|
||||||
|
{
|
||||||
|
dq_addlast(&conn[i].node, &g_free_pkt_connections);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
conn = (FAR struct pkt_conn_s *)dq_remfirst(&g_free_pkt_connections);
|
conn = (FAR struct pkt_conn_s *)dq_remfirst(&g_free_pkt_connections);
|
||||||
if (conn)
|
if (conn)
|
||||||
{
|
{
|
||||||
/* Make sure that the connection is marked as uninitialized */
|
|
||||||
|
|
||||||
conn->ifindex = 0;
|
|
||||||
|
|
||||||
/* Enqueue the connection into the active list */
|
/* Enqueue the connection into the active list */
|
||||||
|
|
||||||
dq_addlast(&conn->node, &g_active_pkt_connections);
|
dq_addlast(&conn->node, &g_active_pkt_connections);
|
||||||
@@ -170,6 +187,10 @@ void pkt_free(FAR struct pkt_conn_s *conn)
|
|||||||
|
|
||||||
dq_rem(&conn->node, &g_active_pkt_connections);
|
dq_rem(&conn->node, &g_active_pkt_connections);
|
||||||
|
|
||||||
|
/* Make sure that the connection is marked as uninitialized */
|
||||||
|
|
||||||
|
memset(conn, 0, sizeof(*conn));
|
||||||
|
|
||||||
/* Free the connection */
|
/* Free the connection */
|
||||||
|
|
||||||
dq_addlast(&conn->node, &g_free_pkt_connections);
|
dq_addlast(&conn->node, &g_free_pkt_connections);
|
||||||
|
|||||||
Reference in New Issue
Block a user