You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2026/01/16 01:42:10 UTC
(nuttx) 03/07: drivers/net/rpmsgdrv.c: add response flag to distinguish message direction
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 <zh...@xiaomi.com>
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 <zh...@xiaomi.com>
---
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
****************************************************************************/