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 2022/01/05 04:38:51 UTC

[incubator-nuttx] branch master updated: net/usrsock: remove the connections limit

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/incubator-nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new cbe9352  net/usrsock: remove the connections limit
cbe9352 is described below

commit cbe9352f41c74b7b47fed6fcad504c208a2908d2
Author: chao.an <an...@xiaomi.com>
AuthorDate: Tue Jan 4 15:53:22 2022 +0800

    net/usrsock: remove the connections limit
    
    replace xid type to uint64_t to avoid connections limit
    
    Signed-off-by: chao.an <an...@xiaomi.com>
---
 include/nuttx/net/usrsock.h | 11 ++++---
 net/usrsock/usrsock.h       |  8 +----
 net/usrsock/usrsock_conn.c  | 14 ---------
 net/usrsock/usrsock_dev.c   | 76 ++++++++++++---------------------------------
 4 files changed, 26 insertions(+), 83 deletions(-)

diff --git a/include/nuttx/net/usrsock.h b/include/nuttx/net/usrsock.h
index 581e4b0..540c2dc 100644
--- a/include/nuttx/net/usrsock.h
+++ b/include/nuttx/net/usrsock.h
@@ -96,8 +96,9 @@ enum usrsock_message_types_e
 
 begin_packed_struct struct usrsock_request_common_s
 {
-  int8_t reqid;
-  uint8_t xid;
+  uint64_t xid;
+  int8_t   reqid;
+  int8_t   reserved;
 } end_packed_struct;
 
 begin_packed_struct struct usrsock_request_socket_s
@@ -227,9 +228,9 @@ begin_packed_struct struct usrsock_message_req_ack_s
 {
   struct usrsock_message_common_s head;
 
-  uint8_t xid;
-  uint8_t reserved;
-  int32_t result;
+  int16_t  reserved;
+  int32_t  result;
+  uint64_t xid;
 } end_packed_struct;
 
 /* Request acknowledgment/completion message */
diff --git a/net/usrsock/usrsock.h b/net/usrsock/usrsock.h
index b9163e3..1fe951e 100644
--- a/net/usrsock/usrsock.h
+++ b/net/usrsock/usrsock.h
@@ -106,7 +106,7 @@ struct usrsock_conn_s
   struct
   {
     sem_t    sem;               /* Request semaphore (only one outstanding request) */
-    uint8_t  xid;               /* Expected message exchange id */
+    uint64_t xid;               /* Expected message exchange id */
     bool     inprogress;        /* Request was received but daemon is still processing */
     uint16_t valuelen;          /* Length of value from daemon */
     uint16_t valuelen_nontrunc; /* Actual length of value at daemon */
@@ -210,12 +210,6 @@ void usrsock_free(FAR struct usrsock_conn_s *conn);
 FAR struct usrsock_conn_s *usrsock_nextconn(FAR struct usrsock_conn_s *conn);
 
 /****************************************************************************
- * Name: usrsock_connidx()
- ****************************************************************************/
-
-int usrsock_connidx(FAR struct usrsock_conn_s *conn);
-
-/****************************************************************************
  * Name: usrsock_active()
  *
  * Description:
diff --git a/net/usrsock/usrsock_conn.c b/net/usrsock/usrsock_conn.c
index 2243c2a..28e7c29 100644
--- a/net/usrsock/usrsock_conn.c
+++ b/net/usrsock/usrsock_conn.c
@@ -181,20 +181,6 @@ FAR struct usrsock_conn_s *usrsock_nextconn(FAR struct usrsock_conn_s *conn)
 }
 
 /****************************************************************************
- * Name: usrsock_connidx()
- ****************************************************************************/
-
-int usrsock_connidx(FAR struct usrsock_conn_s *conn)
-{
-  int idx = conn - g_usrsock_connections;
-
-  DEBUGASSERT(idx >= 0);
-  DEBUGASSERT(idx < ARRAY_SIZE(g_usrsock_connections));
-
-  return idx;
-}
-
-/****************************************************************************
  * Name: usrsock_active()
  *
  * Description:
diff --git a/net/usrsock/usrsock_dev.c b/net/usrsock/usrsock_dev.c
index 443386d..9d92cb6 100644
--- a/net/usrsock/usrsock_dev.c
+++ b/net/usrsock/usrsock_dev.c
@@ -67,13 +67,13 @@ struct usrsockdev_s
   struct
   {
     FAR const struct iovec *iov; /* Pending request buffers */
-    int     iovcnt;              /* Number of request buffers */
-    size_t  pos;                 /* Reader position on request buffer */
-    sem_t   sem;                 /* Request semaphore (only one outstanding
+    int       iovcnt;            /* Number of request buffers */
+    size_t    pos;               /* Reader position on request buffer */
+    sem_t     sem;               /* Request semaphore (only one outstanding
                                   * request) */
-    sem_t   acksem;              /* Request acknowledgment notification */
-    uint8_t ack_xid;             /* Exchange id for which waiting ack */
-    uint16_t nbusy;              /* Number of requests blocked from different
+    sem_t     acksem;            /* Request acknowledgment notification */
+    uint64_t  ackxid;            /* Exchange id for which waiting ack */
+    uint16_t  nbusy;             /* Number of requests blocked from different
                                   * threads */
   } req;
 
@@ -246,30 +246,6 @@ static ssize_t iovec_put(FAR struct iovec *iov, int iovcnt, size_t pos,
 }
 
 /****************************************************************************
- * Name: usrsockdev_get_xid()
- ****************************************************************************/
-
-static uint8_t usrsockdev_get_xid(FAR struct usrsock_conn_s *conn)
-{
-  int conn_idx;
-
-#if CONFIG_NET_USRSOCK_CONNS > 254
-#  error "CONFIG_NET_USRSOCK_CONNS too large (over 254)"
-#endif
-
-  /* Each connection can one only one request/response pending. So map
-   * connection structure index to xid value.
-   */
-
-  conn_idx = usrsock_connidx(conn);
-
-  DEBUGASSERT(1 <= conn_idx + 1);
-  DEBUGASSERT(conn_idx + 1 <= UINT8_MAX);
-
-  return conn_idx + 1;
-}
-
-/****************************************************************************
  * Name: usrsockdev_semtake() and usrsockdev_semgive()
  *
  * Description:
@@ -714,7 +690,7 @@ static ssize_t usrsockdev_handle_req_response(FAR struct usrsockdev_s *dev,
                                               size_t len)
 {
   FAR const struct usrsock_message_req_ack_s *hdr = buffer;
-  FAR struct usrsock_conn_s *conn;
+  FAR struct usrsock_conn_s *conn = NULL;
   unsigned int hdrlen;
   ssize_t ret;
   ssize_t (*handle_response)(FAR struct usrsockdev_s *dev,
@@ -734,7 +710,7 @@ static ssize_t usrsockdev_handle_req_response(FAR struct usrsockdev_s *dev,
       break;
 
     default:
-      nwarn("unknown message type: %d, flags: %d, xid: %02x, "
+      nwarn("unknown message type: %d, flags: %d, xid: %" PRIu64 ", "
             "result: %" PRId32 "\n",
             hdr->head.msgid, hdr->head.flags, hdr->xid, hdr->result);
       return -EINVAL;
@@ -751,27 +727,20 @@ static ssize_t usrsockdev_handle_req_response(FAR struct usrsockdev_s *dev,
 
   /* Get corresponding usrsock connection for this transfer */
 
-  conn = usrsock_nextconn(NULL);
-  while (conn)
-    {
-      if (conn->resp.xid == hdr->xid)
-        break;
-
-      conn = usrsock_nextconn(conn);
-    }
-
+  while ((conn = usrsock_nextconn(conn)) != NULL &&
+         conn->resp.xid != hdr->xid);
   if (!conn)
     {
       /* No connection waiting for this message. */
 
-      nwarn("Could find connection waiting for response with xid=%d\n",
-            hdr->xid);
+      nwarn("Could find connection waiting for response"
+            "with xid=%" PRIu64 "\n", hdr->xid);
 
       ret = -EINVAL;
       goto unlock_out;
     }
 
-  if (dev->req.ack_xid == hdr->xid && dev->req.iov)
+  if (dev->req.ackxid == hdr->xid && dev->req.iov)
     {
       /* Signal that request was received and read by daemon and
        * acknowledgment response was received.
@@ -969,8 +938,8 @@ static int usrsockdev_open(FAR struct file *filep)
 static int usrsockdev_close(FAR struct file *filep)
 {
   FAR struct inode *inode = filep->f_inode;
+  FAR struct usrsock_conn_s *conn = NULL;
   FAR struct usrsockdev_s *dev;
-  FAR struct usrsock_conn_s *conn;
   int ret;
 
   DEBUGASSERT(inode);
@@ -987,24 +956,17 @@ static int usrsockdev_close(FAR struct file *filep)
 
   ninfo("closing /dev/usrsock\n");
 
+  net_lock();
+
   /* Set active usrsock sockets to aborted state. */
 
-  conn = usrsock_nextconn(NULL);
-  while (conn)
+  while ((conn = usrsock_nextconn(conn)) != NULL)
     {
-      net_lock();
-
       conn->resp.inprogress = false;
       conn->resp.xid = 0;
       usrsock_event(conn, USRSOCK_EVENT_ABORT);
-
-      net_unlock();
-
-      conn = usrsock_nextconn(conn);
     }
 
-  net_lock();
-
   /* Decrement the references to the driver. */
 
   dev->ocount--;
@@ -1192,7 +1154,7 @@ int usrsockdev_do_request(FAR struct usrsock_conn_s *conn,
 
   /* Get exchange id. */
 
-  req_head->xid = usrsockdev_get_xid(conn);
+  req_head->xid = (uintptr_t)conn;
 
   /* Prepare connection for response. */
 
@@ -1208,7 +1170,7 @@ int usrsockdev_do_request(FAR struct usrsock_conn_s *conn,
   if (usrsockdev_is_opened(dev))
     {
       DEBUGASSERT(dev->req.iov == NULL);
-      dev->req.ack_xid = req_head->xid;
+      dev->req.ackxid = req_head->xid;
       dev->req.iov = iov;
       dev->req.pos = 0;
       dev->req.iovcnt = iovcnt;