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
 }

Reply via email to