From 725eb3a80bec4e6076d7e7e895fce034f00acfa1 Mon Sep 17 00:00:00 2001 From: zhanghongyu Date: Sun, 29 Jun 2025 19:14:47 +0800 Subject: [PATCH] netdev_upperhalf: add direct rx mode avoid packet processing delays caused by task switching, to support those applications that are extremely time-sensitive. Signed-off-by: zhanghongyu --- drivers/net/netdev_upperhalf.c | 22 ++++++++++++++++++++-- include/nuttx/net/netdev_lowerhalf.h | 1 + 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/drivers/net/netdev_upperhalf.c b/drivers/net/netdev_upperhalf.c index 4a0ac06e3c2c5..bc9b073c0a936 100644 --- a/drivers/net/netdev_upperhalf.c +++ b/drivers/net/netdev_upperhalf.c @@ -1394,6 +1394,9 @@ int netdev_lower_register(FAR struct netdev_lowerhalf_s *dev, case NETDEV_RX_WORK: extra_size = sizeof(struct work_s); break; + case NETDEV_RX_DIRECT: + extra_size = 0; /* No extra size needed for direct mode */ + break; case NETDEV_RX_THREAD: extra_size = sizeof(struct netdev_thread_s); cpu = 1; @@ -1574,7 +1577,14 @@ void netdev_lower_rxready(FAR struct netdev_lowerhalf_s *dev) * in eth_input. */ - netdev_upper_queue_work(&dev->netdev); + if (dev->rxtype == NETDEV_RX_DIRECT) + { + netdev_upper_rxpoll_work(dev->netdev.d_private); + } + else + { + netdev_upper_queue_work(&dev->netdev); + } } /**************************************************************************** @@ -1594,7 +1604,15 @@ void netdev_lower_txdone(FAR struct netdev_lowerhalf_s *dev) FAR struct netdev_upperhalf_s *upper = dev->netdev.d_private; netdev_upper_vlan_foreach(upper, netdev_lower_txdone); #endif - netdev_upper_queue_work(&dev->netdev); + if (dev->rxtype == NETDEV_RX_DIRECT) + { + netdev_upper_txavail_work(dev->netdev.d_private); + } + else + { + netdev_upper_queue_work(&dev->netdev); + } + NETDEV_TXDONE(&dev->netdev); } diff --git a/include/nuttx/net/netdev_lowerhalf.h b/include/nuttx/net/netdev_lowerhalf.h index a1f01ed1cbf8f..21a5220790049 100644 --- a/include/nuttx/net/netdev_lowerhalf.h +++ b/include/nuttx/net/netdev_lowerhalf.h @@ -90,6 +90,7 @@ enum netpkt_type_e enum netdev_rx_e { NETDEV_RX_WORK, /* Use work queue thread */ + NETDEV_RX_DIRECT, /* Directly based on the current thread */ NETDEV_RX_THREAD, /* Upper half dedicated thread */ NETDEV_RX_THREAD_RSS /* RSS mode, upper half thread */ };