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/nuttx.git
commit be3ad13260d35ef6db618fd34c5bc134526faff3 Author: zhanghongyu <[email protected]> AuthorDate: Mon Jul 14 22:02:31 2025 +0800 drivers/net/rpmsgdrv.c: add bidirectional data netdev support, server side Server side: when ns_bind, create the netdev. Signed-off-by: zhanghongyu <[email protected]> --- drivers/drivers_initialize.c | 7 +++++ drivers/net/Kconfig | 6 +++++ drivers/net/rpmsgdrv.c | 62 ++++++++++++++++++++++++++++++++++++++++++++ include/nuttx/net/rpmsgdrv.h | 12 +++++++++ 4 files changed, 87 insertions(+) diff --git a/drivers/drivers_initialize.c b/drivers/drivers_initialize.c index 1a012f928e7..7393f37d93d 100644 --- a/drivers/drivers_initialize.c +++ b/drivers/drivers_initialize.c @@ -35,6 +35,7 @@ #include <nuttx/input/uinput.h> #include <nuttx/mtd/mtd.h> #include <nuttx/net/loopback.h> +#include <nuttx/net/rpmsgdrv.h> #include <nuttx/net/tun.h> #include <nuttx/net/telnet.h> #include <nuttx/note/note_driver.h> @@ -267,6 +268,12 @@ void drivers_initialize(void) usrsock_rpmsg_server_initialize(); #endif +#ifdef CONFIG_NET_RPMSG_DRV_SERVER + /* Initialize the net rpmsg default server */ + + net_rpmsg_drv_server_init(); +#endif + #ifdef CONFIG_SMART_DEV_LOOP smart_loop_register_driver(); #endif diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index 992a22b27e3..7a792b53702 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig @@ -66,6 +66,12 @@ config NET_RPMSG_STACKSIZE ---help--- The stack size allocated for the net RPMSG task. +config NET_RPMSG_DRV_SERVER + bool "Net rpmsg default server" + default n + ---help--- + Enable the net rpmsg default server. + endif # NET_RPMSG_DRV config NETDEV_TELNET diff --git a/drivers/net/rpmsgdrv.c b/drivers/net/rpmsgdrv.c index da8cac0210c..bfc90717a62 100644 --- a/drivers/net/rpmsgdrv.c +++ b/drivers/net/rpmsgdrv.c @@ -938,6 +938,53 @@ net_rpmsg_drv_alloc(FAR const char *devname, enum net_lltype_e lltype) return priv; } +#ifdef CONFIG_NET_RPMSG_DRV_SERVER +/**************************************************************************** + * Name: net_rpmsg_drv_ns_match + ****************************************************************************/ + +static bool net_rpmsg_drv_ns_match(FAR struct rpmsg_device *rdev, + FAR void *priv, FAR const char *name, + uint32_t dest) +{ + return !strncmp(name, NET_RPMSG_EPT_PREFIX, strlen(NET_RPMSG_EPT_PREFIX)); +} + +/**************************************************************************** + * Name: net_rpmsg_drv_ns_bind + ****************************************************************************/ + +static void net_rpmsg_drv_ns_bind(FAR struct rpmsg_device *rdev, + FAR void *priv_, FAR const char *name, + uint32_t dest) +{ + FAR struct net_rpmsg_drv_s *priv; + FAR struct net_driver_s *dev; + const char *devname = name + strlen(NET_RPMSG_EPT_PREFIX); + + dev = netdev_findbyname(devname); + if (dev) + { + priv = container_of(dev, struct net_rpmsg_drv_s, dev.netdev); + priv->ept.priv = priv; + priv->ept.release_cb = net_rpmsg_drv_ept_release; + priv->ept.ns_bound_cb = net_rpmsg_drv_ns_bound; + } + else + { + priv = net_rpmsg_drv_alloc(devname, NET_LL_ETHERNET); + if (!priv) + { + return; + } + } + + rpmsg_create_ept(&priv->ept, rdev, name, RPMSG_ADDR_ANY, dest, + net_rpmsg_drv_ept_cb, rpmsg_destroy_ept); + rpmsg_post(&drv->ept, &drv->wait); +} +#endif + /**************************************************************************** * Public Functions ****************************************************************************/ @@ -1025,3 +1072,18 @@ void net_rpmsg_drv_set_callback(FAR struct netdev_lowerhalf_s *dev, priv->cb = cb; priv->priv = priv; } + +#ifdef CONFIG_NET_RPMSG_DRV_SERVER +/**************************************************************************** + * Name: net_rpmsg_drv_server_init + ****************************************************************************/ + +int net_rpmsg_drv_server_init(void) +{ + return rpmsg_register_callback(NULL, + NULL, + NULL, + net_rpmsg_drv_ns_match, + net_rpmsg_drv_ns_bind); +} +#endif diff --git a/include/nuttx/net/rpmsgdrv.h b/include/nuttx/net/rpmsgdrv.h index 032038758c9..ff36c04e21f 100644 --- a/include/nuttx/net/rpmsgdrv.h +++ b/include/nuttx/net/rpmsgdrv.h @@ -112,6 +112,18 @@ FAR void *net_rpmsg_drv_priv(FAR struct netdev_lowerhalf_s *dev); void net_rpmsg_drv_set_callback(FAR struct netdev_lowerhalf_s *dev, net_rpmsg_drv_cb_t cb, FAR void *priv); +/**************************************************************************** + * Name: net_rpmsg_drv_server_init + * + * Description: + * Initialize the RPMSG network (for server side). + * + ****************************************************************************/ + +#ifdef CONFIG_NET_RPMSG_DRV_SERVER +int net_rpmsg_drv_server_init(void); +#endif + #undef EXTERN #ifdef __cplusplus }
