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 ****************************************************************************/
