From f02c86c5abaee85b3a488ef74863e82eed58bfc8 Mon Sep 17 00:00:00 2001 From: shichunma Date: Sat, 21 Mar 2026 15:42:16 +0800 Subject: [PATCH 1/2] net/nat: g_nat_lock can be used recursively case: when rndis receive a packet and this packet is going to be forwarded. 1. first lock happen when ipv4_dev_forward call ipv4_nat_outbound; 2. next lock is: ipv4_nat_outbound_entry_find --> nat_port_select --> tcp_selectport --> nat_port_inuse Signed-off-by: Jerry Ma --- net/nat/nat.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/net/nat/nat.c b/net/nat/nat.c index 4ccc2d9700bd1..426a04cd848df 100644 --- a/net/nat/nat.c +++ b/net/nat/nat.c @@ -42,7 +42,7 @@ * Private Data ****************************************************************************/ -static mutex_t g_nat_lock = NXMUTEX_INITIALIZER; +static rmutex_t g_nat_lock = NXRMUTEX_INITIALIZER; /**************************************************************************** * Private Functions @@ -418,7 +418,7 @@ uint32_t nat_expire_time(uint8_t protocol) void nat_lock(void) { - nxmutex_lock(&g_nat_lock); + nxrmutex_lock(&g_nat_lock); } /**************************************************************************** @@ -431,7 +431,7 @@ void nat_lock(void) void nat_unlock(void) { - nxmutex_unlock(&g_nat_lock); + nxrmutex_unlock(&g_nat_lock); } #endif /* CONFIG_NET_NAT */ From aa7f1183dca196b5b8ae3fdeb66d3bdcd7ef6513 Mon Sep 17 00:00:00 2001 From: shichunma Date: Mon, 23 Mar 2026 21:36:09 +0800 Subject: [PATCH 2/2] net/nat: fix missed nat_unlock If call nat_enable twice, there will be a miss "nat_unlock". Signed-off-by: Jerry Ma --- net/nat/nat.c | 1 + 1 file changed, 1 insertion(+) diff --git a/net/nat/nat.c b/net/nat/nat.c index 426a04cd848df..d8cf542b6677e 100644 --- a/net/nat/nat.c +++ b/net/nat/nat.c @@ -118,6 +118,7 @@ int nat_enable(FAR struct net_driver_s *dev) if (IFF_IS_NAT(dev->d_flags)) { nwarn("WARNING: NAT was already enabled for %s!\n", dev->d_ifname); + nat_unlock(); return -EEXIST; }