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 2023/11/01 02:14:24 UTC

(nuttx) branch master updated (c7d0b32e4f -> 90a8e2e422)

This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git


    from c7d0b32e4f simwifi: Support that get the connected Chinese essid.
     new 52fddb1f12 usrsock_rpmsg_server: Save iov and remain per endpoint
     new 90a8e2e422 usrsock_rpmsg_server: Keep msg order in recursive call

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 drivers/usrsock/usrsock_rpmsg_server.c | 169 +++++++++++++++++++++++++--------
 1 file changed, 130 insertions(+), 39 deletions(-)


(nuttx) 01/02: usrsock_rpmsg_server: Save iov and remain per endpoint

Posted by xi...@apache.org.
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 52fddb1f121dbbbae5a15a74019ec5581411923e
Author: Zhe Weng <we...@xiaomi.com>
AuthorDate: Mon Sep 11 11:57:53 2023 +0800

    usrsock_rpmsg_server: Save iov and remain per endpoint
    
    Then we may support multiple endpoints with sendto working correctly.
    
    Signed-off-by: Zhe Weng <we...@xiaomi.com>
---
 drivers/usrsock/usrsock_rpmsg_server.c | 75 +++++++++++++++++++---------------
 1 file changed, 42 insertions(+), 33 deletions(-)

diff --git a/drivers/usrsock/usrsock_rpmsg_server.c b/drivers/usrsock/usrsock_rpmsg_server.c
index e97faaca5c..218a80aaf9 100644
--- a/drivers/usrsock/usrsock_rpmsg_server.c
+++ b/drivers/usrsock/usrsock_rpmsg_server.c
@@ -48,13 +48,18 @@
 struct usrsock_rpmsg_s
 {
   rmutex_t                  mutex;
-  ssize_t                   remain;
-  struct iovec              iov[CONFIG_NET_USRSOCK_RPMSG_SERVER_NIOVEC];
   struct socket             socks[CONFIG_NET_USRSOCK_RPMSG_SERVER_NSOCKS];
   FAR struct rpmsg_endpoint *epts[CONFIG_NET_USRSOCK_RPMSG_SERVER_NSOCKS];
   struct pollfd             pfds[CONFIG_NET_USRSOCK_RPMSG_SERVER_NSOCKS];
 };
 
+struct usrsock_rpmsg_ept_s
+{
+  struct rpmsg_endpoint ept;
+  struct iovec          iov[CONFIG_NET_USRSOCK_RPMSG_SERVER_NIOVEC];
+  ssize_t               remain;
+};
+
 /****************************************************************************
  * Private Function Prototypes
  ****************************************************************************/
@@ -380,37 +385,39 @@ static int usrsock_rpmsg_sendto_handler(FAR struct rpmsg_endpoint *ept,
                                         uint32_t src, FAR void *priv_)
 {
   FAR struct usrsock_request_sendto_s *req;
+  FAR struct usrsock_rpmsg_ept_s *uept =
+    (FAR struct usrsock_rpmsg_ept_s *)ept;
   FAR struct usrsock_rpmsg_s *priv = priv_;
   uint16_t events = 0;
   ssize_t ret = -EBADF;
   int retr;
   int i;
 
-  if (priv->remain > 0)
+  if (uept->remain > 0)
     {
       size_t hlen;
       struct msghdr msg =
       {
       };
 
-      priv->remain -= len;
+      uept->remain -= len;
 
-      if (!priv->iov[0].iov_base)
+      if (!uept->iov[0].iov_base)
         {
           /* Maybe error occurred previously, skip processing. */
 
           return 0;
         }
 
-      req = priv->iov[0].iov_base;
+      req = uept->iov[0].iov_base;
       hlen = sizeof(*req) + req->addrlen;
 
       for (i = 0; i < CONFIG_NET_USRSOCK_RPMSG_SERVER_NIOVEC; i++)
         {
-          if (!priv->iov[i].iov_base)
+          if (!uept->iov[i].iov_base)
             {
-              priv->iov[i].iov_base = data;
-              priv->iov[i].iov_len = len;
+              uept->iov[i].iov_base = data;
+              uept->iov[i].iov_len = len;
               rpmsg_hold_rx_buffer(ept, data);
               break;
             }
@@ -418,7 +425,7 @@ static int usrsock_rpmsg_sendto_handler(FAR struct rpmsg_endpoint *ept,
 
       /* Partial packet ? continue to fetch */
 
-      if (priv->remain > 0)
+      if (uept->remain > 0)
         {
           /* We've used the last I/O vector, cannot continue. */
 
@@ -431,7 +438,7 @@ static int usrsock_rpmsg_sendto_handler(FAR struct rpmsg_endpoint *ept,
 
           return 0;
         }
-      else if (priv->remain < 0)
+      else if (uept->remain < 0)
         {
           ret = -EINVAL;
           goto out;
@@ -439,20 +446,20 @@ static int usrsock_rpmsg_sendto_handler(FAR struct rpmsg_endpoint *ept,
 
       /* Skip the sendto header from I/O vector */
 
-      priv->iov[0].iov_base = (FAR char *)priv->iov[0].iov_base + hlen;
-      priv->iov[0].iov_len -= hlen;
+      uept->iov[0].iov_base = (FAR char *)uept->iov[0].iov_base + hlen;
+      uept->iov[0].iov_len -= hlen;
 
       msg.msg_name = req->addrlen ? (FAR void *)(req + 1) : NULL;
       msg.msg_namelen = req->addrlen;
-      msg.msg_iov = priv->iov;
+      msg.msg_iov = uept->iov;
       msg.msg_iovlen = i + 1;
 
       ret = psock_sendmsg(&priv->socks[req->usockid], &msg, req->flags);
 
       /* Recover the I/O vector */
 
-      priv->iov[0].iov_base = (FAR char *)priv->iov[0].iov_base - hlen;
-      priv->iov[0].iov_len += hlen;
+      uept->iov[0].iov_base = (FAR char *)uept->iov[0].iov_base - hlen;
+      uept->iov[0].iov_len += hlen;
     }
   else
     {
@@ -461,12 +468,12 @@ static int usrsock_rpmsg_sendto_handler(FAR struct rpmsg_endpoint *ept,
       if (req->usockid >= 0 &&
           req->usockid < CONFIG_NET_USRSOCK_RPMSG_SERVER_NSOCKS)
         {
-          priv->remain = sizeof(*req) + req->addrlen + req->buflen - len;
-          if (priv->remain > 0)
+          uept->remain = sizeof(*req) + req->addrlen + req->buflen - len;
+          if (uept->remain > 0)
             {
 #if CONFIG_NET_USRSOCK_RPMSG_SERVER_NIOVEC >= 2
-              priv->iov[0].iov_base = data;
-              priv->iov[0].iov_len = len;
+              uept->iov[0].iov_base = data;
+              uept->iov[0].iov_len = len;
 
               rpmsg_hold_rx_buffer(ept, data);
               return 0;
@@ -500,18 +507,18 @@ out:
                                priv->pfds[req->usockid].events | POLLOUT);
     }
 
-  if (priv->iov[0].iov_base)
+  if (uept->iov[0].iov_base)
     {
       for (i = 0; i < CONFIG_NET_USRSOCK_RPMSG_SERVER_NIOVEC; i++)
         {
-          if (priv->iov[i].iov_base == NULL)
+          if (uept->iov[i].iov_base == NULL)
             {
               break;
             }
 
-          rpmsg_release_rx_buffer(ept, priv->iov[i].iov_base);
-          priv->iov[i].iov_base = NULL;
-          priv->iov[i].iov_len = 0;
+          rpmsg_release_rx_buffer(ept, uept->iov[i].iov_base);
+          uept->iov[i].iov_base = NULL;
+          uept->iov[i].iov_len = 0;
         }
     }
 
@@ -980,28 +987,28 @@ static void usrsock_rpmsg_ns_bind(FAR struct rpmsg_device *rdev,
                                   uint32_t dest)
 {
   FAR struct usrsock_rpmsg_s *priv = priv_;
-  FAR struct rpmsg_endpoint *ept;
+  FAR struct usrsock_rpmsg_ept_s *uept;
   int ret;
 
-  ept = kmm_zalloc(sizeof(struct rpmsg_endpoint));
-  if (!ept)
+  uept = kmm_zalloc(sizeof(*uept));
+  if (!uept)
     {
       return;
     }
 
-  ept->priv = priv;
+  uept->ept.priv = priv;
 
-  ret = rpmsg_create_ept(ept, rdev, USRSOCK_RPMSG_EPT_NAME,
+  ret = rpmsg_create_ept(&uept->ept, rdev, USRSOCK_RPMSG_EPT_NAME,
                          RPMSG_ADDR_ANY, dest,
                          usrsock_rpmsg_ept_cb, usrsock_rpmsg_ns_unbind);
   if (ret < 0)
     {
-      kmm_free(ept);
+      kmm_free(uept);
       return;
     }
 
 #ifdef CONFIG_NETDB_DNSCLIENT
-  dns_register_notify(usrsock_rpmsg_send_dns_event, ept);
+  dns_register_notify(usrsock_rpmsg_send_dns_event, &uept->ept);
 #endif
 }
 
@@ -1040,9 +1047,11 @@ static int usrsock_rpmsg_ept_cb(FAR struct rpmsg_endpoint *ept,
                                 FAR void *priv_)
 {
   FAR struct usrsock_request_common_s *common = data;
+  FAR struct usrsock_rpmsg_ept_s *uept =
+    (FAR struct usrsock_rpmsg_ept_s *)ept;
   FAR struct usrsock_rpmsg_s *priv = priv_;
 
-  if (priv->remain > 0)
+  if (uept->remain > 0)
     {
       return usrsock_rpmsg_sendto_handler(ept, data, len, src, priv);
     }


(nuttx) 02/02: usrsock_rpmsg_server: Keep msg order in recursive call

Posted by xi...@apache.org.
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 90a8e2e4220856b337d67fa2e5c36d46f928aa24
Author: Zhe Weng <we...@xiaomi.com>
AuthorDate: Tue Aug 29 22:12:23 2023 +0800

    usrsock_rpmsg_server: Keep msg order in recursive call
    
    In `drivers/rptun/rptun.c`, we have a `rptun_is_recursive` function,
    which lets rptun thread run recursively. Then the `usrsock_rpmsg_ept_cb`
    may be called inside `usrsock_rpmsg_ept_cb`, which can cause some
    unexpected behavior, so we add a queue to keep the order of incoming
    messages to reduce the complexity.
    
    Signed-off-by: Zhe Weng <we...@xiaomi.com>
---
 drivers/usrsock/usrsock_rpmsg_server.c | 98 +++++++++++++++++++++++++++++++---
 1 file changed, 90 insertions(+), 8 deletions(-)

diff --git a/drivers/usrsock/usrsock_rpmsg_server.c b/drivers/usrsock/usrsock_rpmsg_server.c
index 218a80aaf9..9020ec8201 100644
--- a/drivers/usrsock/usrsock_rpmsg_server.c
+++ b/drivers/usrsock/usrsock_rpmsg_server.c
@@ -35,6 +35,7 @@
 #include <nuttx/mutex.h>
 #include <nuttx/net/dns.h>
 #include <nuttx/net/net.h>
+#include <nuttx/queue.h>
 #include <nuttx/rptun/openamp.h>
 #include <nuttx/usrsock/usrsock_rpmsg.h>
 #ifdef CONFIG_NETDEV_WIRELESS_IOCTL
@@ -53,11 +54,31 @@ struct usrsock_rpmsg_s
   struct pollfd             pfds[CONFIG_NET_USRSOCK_RPMSG_SERVER_NSOCKS];
 };
 
+/* Saving rpmsg requests to keep message order. */
+
+struct usrsock_rpmsg_req_s
+{
+  sq_entry_t flink;
+  FAR void  *data;
+  size_t     len;
+  uint32_t   src;
+};
+
 struct usrsock_rpmsg_ept_s
 {
   struct rpmsg_endpoint ept;
+
+  /* For sendto/recvfrom */
+
   struct iovec          iov[CONFIG_NET_USRSOCK_RPMSG_SERVER_NIOVEC];
   ssize_t               remain;
+
+  /* For keeping msg order, normally nIOVec is the max request we can get */
+
+  bool                       inuse;
+  sq_queue_t                 req_free;
+  sq_queue_t                 req_pending;
+  struct usrsock_rpmsg_req_s reqs[CONFIG_NET_USRSOCK_RPMSG_SERVER_NIOVEC];
 };
 
 /****************************************************************************
@@ -989,6 +1010,7 @@ static void usrsock_rpmsg_ns_bind(FAR struct rpmsg_device *rdev,
   FAR struct usrsock_rpmsg_s *priv = priv_;
   FAR struct usrsock_rpmsg_ept_s *uept;
   int ret;
+  int i;
 
   uept = kmm_zalloc(sizeof(*uept));
   if (!uept)
@@ -997,6 +1019,10 @@ static void usrsock_rpmsg_ns_bind(FAR struct rpmsg_device *rdev,
     }
 
   uept->ept.priv = priv;
+  for (i = 0; i < CONFIG_NET_USRSOCK_RPMSG_SERVER_NIOVEC; i++)
+    {
+      sq_addlast(&uept->reqs[i].flink, &uept->req_free);
+    }
 
   ret = rpmsg_create_ept(&uept->ept, rdev, USRSOCK_RPMSG_EPT_NAME,
                          RPMSG_ADDR_ANY, dest,
@@ -1042,28 +1068,84 @@ static void usrsock_rpmsg_ns_unbind(FAR struct rpmsg_endpoint *ept)
   kmm_free(ept);
 }
 
-static int usrsock_rpmsg_ept_cb(FAR struct rpmsg_endpoint *ept,
-                                FAR void *data, size_t len, uint32_t src,
-                                FAR void *priv_)
+static int usrsock_rpmsg_ept_do_cb(FAR struct usrsock_rpmsg_ept_s *uept,
+                                   FAR void *data, size_t len, uint32_t src,
+                                   FAR struct usrsock_rpmsg_s *priv)
 {
   FAR struct usrsock_request_common_s *common = data;
-  FAR struct usrsock_rpmsg_ept_s *uept =
-    (FAR struct usrsock_rpmsg_ept_s *)ept;
-  FAR struct usrsock_rpmsg_s *priv = priv_;
 
   if (uept->remain > 0)
     {
-      return usrsock_rpmsg_sendto_handler(ept, data, len, src, priv);
+      return usrsock_rpmsg_sendto_handler(&uept->ept, data, len, src, priv);
     }
   else if (common->reqid >= 0 && common->reqid <= USRSOCK_REQUEST__MAX)
     {
-      return g_usrsock_rpmsg_handler[common->reqid](ept, data, len,
+      return g_usrsock_rpmsg_handler[common->reqid](&uept->ept, data, len,
                                                     src, priv);
     }
 
   return -EINVAL;
 }
 
+static int usrsock_rpmsg_ept_cb(FAR struct rpmsg_endpoint *ept,
+                                FAR void *data, size_t len, uint32_t src,
+                                FAR void *priv_)
+{
+  FAR struct usrsock_rpmsg_s *priv = priv_;
+  FAR struct usrsock_rpmsg_ept_s *uept =
+    (FAR struct usrsock_rpmsg_ept_s *)ept;
+  FAR struct usrsock_rpmsg_req_s *req;
+  int ret;
+
+  /* This callback is called from only one thread per ept, so don't need any
+   * lock for `inuse` state.
+   */
+
+  if (uept->inuse)
+    {
+      /* Avoid recursive call. */
+
+      req = (FAR struct usrsock_rpmsg_req_s *)sq_remfirst(&uept->req_free);
+      if (req == NULL)
+        {
+          return -ENOMEM;
+        }
+
+      req->data = data;
+      req->len  = len;
+      req->src  = src;
+      sq_addlast(&req->flink, &uept->req_pending);
+
+      rpmsg_hold_rx_buffer(ept, data);
+      return OK;
+    }
+
+  uept->inuse = true;
+  ret = usrsock_rpmsg_ept_do_cb(uept, data, len, src, priv);
+
+  /* Pop pending requests to proceed. */
+
+  while ((req = (FAR struct usrsock_rpmsg_req_s *)
+                 sq_remfirst(&uept->req_pending)) != NULL)
+    {
+      data = req->data;
+      len  = req->len;
+      src  = req->src;
+      sq_addlast(&req->flink, &uept->req_free);
+
+      ret = usrsock_rpmsg_ept_do_cb(uept, data, len, src, priv);
+      if (ret < 0)
+        {
+          nerr("ERROR: usrsock got error %d!", ret);
+        }
+
+      rpmsg_release_rx_buffer(ept, data);
+    }
+
+  uept->inuse = false;
+  return ret;
+}
+
 static void usrsock_rpmsg_poll_setup(FAR struct pollfd *pfds,
                                      pollevent_t events)
 {