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 f914bb8f03f6def4f59d7ba7fc4d9de91870c655
Author: zhanghongyu <[email protected]>
AuthorDate: Wed Jul 30 15:42:59 2025 +0800

    drivers/net/rpmsgdrv.c: add response flag to distinguish message direction
    
    control messages add a confirmation mechanism.
    
    Signed-off-by: zhanghongyu <[email protected]>
---
 drivers/net/rpmsgdrv.c    | 77 ++++++++++++++++++++++++++++++++++++++++++-----
 include/nuttx/net/rpmsg.h |  4 +++
 2 files changed, 73 insertions(+), 8 deletions(-)

diff --git a/drivers/net/rpmsgdrv.c b/drivers/net/rpmsgdrv.c
index 240b086176a..e9ffc5d4637 100644
--- a/drivers/net/rpmsgdrv.c
+++ b/drivers/net/rpmsgdrv.c
@@ -87,6 +87,8 @@ struct net_rpmsg_drv_s
 
 /* RPMSG related functions */
 
+/* Request handler functions */
+
 static int net_rpmsg_drv_default_handler(FAR struct rpmsg_endpoint *ept,
                                          FAR void *data, size_t len,
                                          uint32_t src, FAR void *priv);
@@ -97,6 +99,14 @@ static int net_rpmsg_drv_transfer_handler(FAR struct 
rpmsg_endpoint *ept,
                                           FAR void *data, size_t len,
                                           uint32_t src, FAR void *priv);
 
+/* Response handler functions */
+
+static int net_rpmsg_drv_default_response(FAR struct rpmsg_endpoint *ept,
+                                          FAR void *data, size_t len,
+                                          uint32_t src, FAR void *priv);
+
+/* RPMSG device related functions */
+
 static void net_rpmsg_drv_device_created(FAR struct rpmsg_device *rdev,
                                          FAR void *priv_);
 static void net_rpmsg_drv_device_destroy(FAR struct rpmsg_device *rdev,
@@ -146,6 +156,17 @@ static const rpmsg_ept_cb g_net_rpmsg_drv_handler[] =
   [NET_RPMSG_TRANSFER]  = net_rpmsg_drv_transfer_handler,
 };
 
+static const rpmsg_ept_cb g_net_rpmsg_drv_response[] =
+{
+  [NET_RPMSG_IFUP]      = net_rpmsg_drv_default_response,
+  [NET_RPMSG_IFDOWN]    = net_rpmsg_drv_default_response,
+  [NET_RPMSG_ADDMCAST]  = net_rpmsg_drv_default_response,
+  [NET_RPMSG_RMMCAST]   = net_rpmsg_drv_default_response,
+  [NET_RPMSG_DEVIOCTL]  = net_rpmsg_drv_default_response,
+  [NET_RPMSG_SOCKIOCTL] = net_rpmsg_drv_default_response,
+  [NET_RPMSG_TRANSFER]  = net_rpmsg_drv_default_response,
+};
+
 static const struct netdev_ops_s g_net_rpmsg_drv_ops =
 {
   .ifup     = net_rpmsg_drv_ifup,
@@ -237,16 +258,26 @@ net_rpmsg_drv_receive(FAR struct netdev_lowerhalf_s *dev)
 
 /* RPMSG related functions */
 
+static void rpmsg_send_response(FAR struct rpmsg_endpoint *ept,
+                                FAR struct net_rpmsg_header_s *header,
+                                size_t len, int result)
+{
+  header->command |= NET_RPMSG_RESPONSE;
+  header->result   = result;
+  rpmsg_send(ept, header, len);
+}
+
 static int net_rpmsg_drv_default_handler(FAR struct rpmsg_endpoint *ept,
                                          FAR void *data, size_t len,
                                          uint32_t src, FAR void *priv)
 {
   FAR struct net_rpmsg_header_s *header = data;
-  FAR struct net_rpmsg_drv_cookie_s *cookie =
-    (struct net_rpmsg_drv_cookie_s *)(uintptr_t)header->cookie;
 
-  memcpy(cookie->header, header, len);
-  nxsem_post(&cookie->sem);
+  if (header->cookie)
+    {
+      rpmsg_send_response(ept, header, sizeof(*header), -EOPNOTSUPP);
+    }
+
   return 0;
 }
 
@@ -286,7 +317,8 @@ static int net_rpmsg_drv_sockioctl_task(int argc, FAR char 
*argv[])
 
   if (msg->header.cookie)
     {
-      rpmsg_send(ept, msg, sizeof(*msg) + msg->length);
+      rpmsg_send_response(ept, &msg->header, sizeof(*msg) + msg->length,
+                          msg->header.result);
     }
 
   rpmsg_release_rx_buffer(ept, msg);
@@ -384,6 +416,28 @@ drop:
   return 0;
 }
 
+/****************************************************************************
+ * Name: net_rpmsg_drv_default_response
+ *
+ * Description:
+ *   This function is used to handle the response from the RPMSG device.
+ *   It is used to copy the response to the cookie and post the semaphore.
+ *
+ ****************************************************************************/
+
+static int net_rpmsg_drv_default_response(FAR struct rpmsg_endpoint *ept,
+                                          FAR void *data, size_t len,
+                                          uint32_t src, FAR void *priv)
+{
+  FAR struct net_rpmsg_header_s *header = data;
+  FAR struct net_rpmsg_drv_cookie_s *cookie =
+    (struct net_rpmsg_drv_cookie_s *)(uintptr_t)header->cookie;
+
+  memcpy(cookie->header, header, len);
+  nxsem_post(&cookie->sem);
+  return 0;
+}
+
 static void net_rpmsg_drv_device_created(FAR struct rpmsg_device *rdev,
                                          FAR void *priv_)
 {
@@ -417,11 +471,18 @@ static int net_rpmsg_drv_ept_cb(FAR struct rpmsg_endpoint 
*ept, void *data,
                                 size_t len, uint32_t src, FAR void *priv)
 {
   FAR struct net_rpmsg_header_s *header = data;
-  uint32_t command = header->command;
+  uint32_t cmd = NET_RPMSG_GET_COMMAND(header->command);
 
-  if (command < nitems(g_net_rpmsg_drv_handler))
+  if (cmd < nitems(g_net_rpmsg_drv_handler))
     {
-      return g_net_rpmsg_drv_handler[command](ept, data, len, src, priv);
+      if (NET_RPMSG_IS_RESPONSE(header->command))
+        {
+          return g_net_rpmsg_drv_response[cmd](ept, data, len, src, priv);
+        }
+      else
+        {
+          return g_net_rpmsg_drv_handler[cmd](ept, data, len, src, priv);
+        }
     }
 
   return -EINVAL;
diff --git a/include/nuttx/net/rpmsg.h b/include/nuttx/net/rpmsg.h
index ff9137bb403..1f24537c566 100644
--- a/include/nuttx/net/rpmsg.h
+++ b/include/nuttx/net/rpmsg.h
@@ -43,6 +43,10 @@
 #define NET_RPMSG_SOCKIOCTL             5 /* IP<--LINK */
 #define NET_RPMSG_TRANSFER              6 /* IP<->LINK */
 
+#define NET_RPMSG_RESPONSE              (1 << 31)
+#define NET_RPMSG_IS_RESPONSE(cmd)      (!!((cmd) & NET_RPMSG_RESPONSE))
+#define NET_RPMSG_GET_COMMAND(cmd)      ((cmd) & ~NET_RPMSG_RESPONSE)
+
 /****************************************************************************
  * Public Types
  ****************************************************************************/

Reply via email to