diff --git a/netutils/usrsock_rpmsg/usrsock_rpmsg.h b/netutils/usrsock_rpmsg/usrsock_rpmsg.h index 4c0b1bd05..3ca44934a 100644 --- a/netutils/usrsock_rpmsg/usrsock_rpmsg.h +++ b/netutils/usrsock_rpmsg/usrsock_rpmsg.h @@ -27,6 +27,11 @@ #include +#ifdef CONFIG_NETDEV_WIRELESS_IOCTL +# include +# include +#endif + /**************************************************************************** * Pre-processor definitions ****************************************************************************/ @@ -35,6 +40,16 @@ #define USRSOCK_RPMSG_DNS_EVENT 127 +#ifdef CONFIG_NETDEV_WIRELESS_IOCTL +# define WL_IS80211POINTERCMD(cmd) ((cmd) == SIOCGIWSCAN || \ + (cmd) == SIOCSIWCOUNTRY || \ + (cmd) == SIOCGIWRANGE || \ + (cmd) == SIOCSIWENCODEEXT || \ + (cmd) == SIOCGIWENCODEEXT || \ + (cmd) == SIOCGIWESSID || \ + (cmd) == SIOCSIWESSID) +#endif + /**************************************************************************** * Public Types ****************************************************************************/ diff --git a/netutils/usrsock_rpmsg/usrsock_rpmsg_client.c b/netutils/usrsock_rpmsg/usrsock_rpmsg_client.c index a33fff876..2d608e6d0 100644 --- a/netutils/usrsock_rpmsg/usrsock_rpmsg_client.c +++ b/netutils/usrsock_rpmsg/usrsock_rpmsg_client.c @@ -49,6 +49,12 @@ struct usrsock_rpmsg_s struct file file; }; +enum usrsock_cache_action_e +{ + USRSOCK_COHERENT_BEFORE, + USRSOCK_COHERENT_AFTER, +}; + /**************************************************************************** * Private Function Prototypes ****************************************************************************/ @@ -155,6 +161,41 @@ static int usrsock_rpmsg_ept_cb(struct rpmsg_endpoint *ept, void *data, return ret; } +#ifdef CONFIG_NETDEV_WIRELESS_IOCTL + +static void usersock_coherent_cache(FAR void *buf, + enum usrsock_cache_action_e action) +{ + FAR struct usrsock_request_ioctl_s *req = buf; + FAR struct iwreq *wlreq; + + if (req->head.reqid == USRSOCK_REQUEST_IOCTL) + { + if (WL_IS80211POINTERCMD(req->cmd)) + { + wlreq = (FAR struct iwreq *)(req + 1); + if (action == USRSOCK_COHERENT_BEFORE) + { + metal_cache_flush(wlreq->u.data.pointer, + wlreq->u.data.length); + } + + if (action == USRSOCK_COHERENT_AFTER) + { + metal_cache_invalidate(wlreq->u.data.pointer, + wlreq->u.data.length); + } + } + } +} + +#else +static void usersock_coherent_cache(FAR void *buf, + enum usrsock_cache_action_e action) +{ +} +#endif + /**************************************************************************** * Public Functions ****************************************************************************/ @@ -251,6 +292,8 @@ int main(int argc, char *argv[]) break; } + usersock_coherent_cache(buf, USRSOCK_COHERENT_BEFORE); + /* Send the packet to remote */ ret = rpmsg_send_nocopy(&priv.ept, buf, ret); @@ -258,6 +301,8 @@ int main(int argc, char *argv[]) { break; } + + usersock_coherent_cache(buf, USRSOCK_COHERENT_AFTER); } /* Reclaim the resource */ diff --git a/netutils/usrsock_rpmsg/usrsock_rpmsg_server.c b/netutils/usrsock_rpmsg/usrsock_rpmsg_server.c index fb4625ad7..e8daddd90 100644 --- a/netutils/usrsock_rpmsg/usrsock_rpmsg_server.c +++ b/netutils/usrsock_rpmsg/usrsock_rpmsg_server.c @@ -716,9 +716,26 @@ static int usrsock_rpmsg_ioctl_handler(struct rpmsg_endpoint *ept, if (req->usockid >= 0 && req->usockid < CONFIG_NETUTILS_USRSOCK_NSOCK_DESCRIPTORS) { +#ifdef CONFIG_NETDEV_WIRELESS_IOCTL + FAR struct iwreq *wlreq = (FAR struct iwreq *)(req + 1); + if (WL_IS80211POINTERCMD(req->cmd)) + { + metal_cache_invalidate(wlreq->u.data.pointer, + wlreq->u.data.length); + } +#endif + memcpy(ack + 1, req + 1, req->arglen); ret = psock_ioctl(&priv->socks[req->usockid], req->cmd, (unsigned long)(ack + 1)); + +#ifdef CONFIG_NETDEV_WIRELESS_IOCTL + if (WL_IS80211POINTERCMD(req->cmd)) + { + metal_cache_flush(wlreq->u.data.pointer, + wlreq->u.data.length); + } +#endif } return usrsock_rpmsg_send_data_ack(ept,