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/08/15 07:01:07 UTC

[nuttx] 02/02: net: Add FIOC_FILEPATH ioctl support for ICMP(v6)/RPMsg/Usrsock sockets

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 d3bca3c2cfbe8abd714e9ddd4ce6c4b923c59bd9
Author: Zhe Weng <we...@xiaomi.com>
AuthorDate: Wed Aug 2 16:58:46 2023 +0800

    net: Add FIOC_FILEPATH ioctl support for ICMP(v6)/RPMsg/Usrsock sockets
    
    Example of /proc/PID/group/fd in this case:
    
    FD  OFLAGS  TYPE POS       PATH
    3   3       9    0         icmp:[dev eth0, id 1, flg 1]
    4   3       9    0         icmp6:[dev eth0, id 2, flg 1]
    5   3       9    0         rpmsg:[ap:[test:0]<->remote] # server side
    5   3       9    0         rpmsg:[remote<->ap:[test:0]] # client side
    
    Signed-off-by: Zhe Weng <we...@xiaomi.com>
---
 net/icmp/icmp_ioctl.c     |  7 +++++++
 net/icmpv6/icmpv6_ioctl.c |  7 +++++++
 net/local/local_sockif.c  |  1 -
 net/netdev/netdev_ioctl.c |  3 +++
 net/rpmsg/rpmsg_sockif.c  | 23 +++++++++++++++++++++++
 net/tcp/tcp_ioctl.c       |  1 -
 net/udp/udp_ioctl.c       |  1 -
 7 files changed, 40 insertions(+), 3 deletions(-)

diff --git a/net/icmp/icmp_ioctl.c b/net/icmp/icmp_ioctl.c
index 7c38638d63..8f1364b24e 100644
--- a/net/icmp/icmp_ioctl.c
+++ b/net/icmp/icmp_ioctl.c
@@ -25,6 +25,7 @@
 #include <nuttx/config.h>
 
 #include <stdint.h>
+#include <stdio.h>
 #include <stdbool.h>
 #include <debug.h>
 #include <errno.h>
@@ -77,6 +78,12 @@ int icmp_ioctl(FAR struct socket *psock, int cmd, unsigned long arg)
       case FIONSPACE:
         *(FAR int *)((uintptr_t)arg) = MIN_UDP_MSS;
         break;
+      case FIOC_FILEPATH:
+        snprintf((FAR char *)(uintptr_t)arg, PATH_MAX,
+                 "icmp:[dev %s, id %" PRIu16 ", flg %" PRIx8 "]",
+                 conn->dev ? conn->dev->d_ifname : "NULL",
+                 NTOHS(conn->id), conn->sconn.s_flags);
+        break;
       default:
         ret = -ENOTTY;
         break;
diff --git a/net/icmpv6/icmpv6_ioctl.c b/net/icmpv6/icmpv6_ioctl.c
index 6e97bd3f9b..16ad642800 100644
--- a/net/icmpv6/icmpv6_ioctl.c
+++ b/net/icmpv6/icmpv6_ioctl.c
@@ -25,6 +25,7 @@
 #include <nuttx/config.h>
 
 #include <stdint.h>
+#include <stdio.h>
 #include <stdbool.h>
 #include <debug.h>
 #include <errno.h>
@@ -77,6 +78,12 @@ int icmpv6_ioctl(FAR struct socket *psock, int cmd, unsigned long arg)
       case FIONSPACE:
         *(FAR int *)((uintptr_t)arg) = MIN_UDP_MSS;
         break;
+      case FIOC_FILEPATH:
+        snprintf((FAR char *)(uintptr_t)arg, PATH_MAX,
+                 "icmp6:[dev %s, id %" PRIu16 ", flg %" PRIx8 "]",
+                 conn->dev ? conn->dev->d_ifname : "NULL",
+                 NTOHS(conn->id), conn->sconn.s_flags);
+        break;
       default:
         ret = -ENOTTY;
         break;
diff --git a/net/local/local_sockif.c b/net/local/local_sockif.c
index d7827a6943..cc6c21a71f 100644
--- a/net/local/local_sockif.c
+++ b/net/local/local_sockif.c
@@ -885,7 +885,6 @@ static int local_ioctl(FAR struct socket *psock, int cmd, unsigned long arg)
       case FIOC_FILEPATH:
         snprintf((FAR char *)(uintptr_t)arg, PATH_MAX, "local:[%s]",
                  conn->lc_path);
-        ret = OK;
         break;
       case BIOC_FLUSH:
         ret = -EINVAL;
diff --git a/net/netdev/netdev_ioctl.c b/net/netdev/netdev_ioctl.c
index e0443a62b3..f906f6af9c 100644
--- a/net/netdev/netdev_ioctl.c
+++ b/net/netdev/netdev_ioctl.c
@@ -1591,6 +1591,9 @@ ssize_t net_ioctl_arglen(int cmd)
       case FIONREAD:
         return sizeof(int);
 
+      case FIOC_FILEPATH:
+        return PATH_MAX;
+
       case SIOCGIFCONF:
         return sizeof(struct ifconf);
 
diff --git a/net/rpmsg/rpmsg_sockif.c b/net/rpmsg/rpmsg_sockif.c
index 6aa5bdd7b3..5f662d07ca 100644
--- a/net/rpmsg/rpmsg_sockif.c
+++ b/net/rpmsg/rpmsg_sockif.c
@@ -1346,6 +1346,25 @@ static int rpmsg_socket_close(FAR struct socket *psock)
   return 0;
 }
 
+static void rpmsg_socket_path(FAR struct rpmsg_socket_conn_s *conn,
+                              FAR char *buf, size_t len)
+{
+  if (conn->backlog) /* Server */
+    {
+      snprintf(buf, len,
+               "rpmsg:[%s:[%s%s]<->%s]",
+               CONFIG_RPTUN_LOCAL_CPUNAME, conn->rpaddr.rp_name,
+               conn->nameid, conn->rpaddr.rp_cpu);
+    }
+  else /* Client */
+    {
+      snprintf(buf, len,
+               "rpmsg:[%s<->%s:[%s%s]]",
+               CONFIG_RPTUN_LOCAL_CPUNAME, conn->rpaddr.rp_cpu,
+               conn->rpaddr.rp_name, conn->nameid);
+    }
+}
+
 static int rpmsg_socket_ioctl(FAR struct socket *psock,
                               int cmd, unsigned long arg)
 {
@@ -1362,6 +1381,10 @@ static int rpmsg_socket_ioctl(FAR struct socket *psock,
         *(FAR int *)((uintptr_t)arg) = rpmsg_socket_get_space(conn);
         break;
 
+      case FIOC_FILEPATH:
+        rpmsg_socket_path(conn, (FAR char *)(uintptr_t)arg, PATH_MAX);
+        break;
+
       default:
         ret = -ENOTTY;
         break;
diff --git a/net/tcp/tcp_ioctl.c b/net/tcp/tcp_ioctl.c
index 3bf5905ce6..83754efa34 100644
--- a/net/tcp/tcp_ioctl.c
+++ b/net/tcp/tcp_ioctl.c
@@ -154,7 +154,6 @@ int tcp_ioctl(FAR struct tcp_conn_s *conn, int cmd, unsigned long arg)
         break;
       case FIOC_FILEPATH:
         tcp_path(conn, (FAR char *)(uintptr_t)arg, PATH_MAX);
-        ret = OK;
         break;
       default:
         ret = -ENOTTY;
diff --git a/net/udp/udp_ioctl.c b/net/udp/udp_ioctl.c
index 1262ef5245..79ce573c20 100644
--- a/net/udp/udp_ioctl.c
+++ b/net/udp/udp_ioctl.c
@@ -149,7 +149,6 @@ int udp_ioctl(FAR struct udp_conn_s *conn, int cmd, unsigned long arg)
         break;
       case FIOC_FILEPATH:
         udp_path(conn, (FAR char *)(uintptr_t)arg, PATH_MAX);
-        ret = OK;
         break;
       default:
         ret = -ENOTTY;