You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ag...@apache.org on 2021/06/26 21:37:21 UTC

[incubator-nuttx] branch master updated: net: Add if_nameindex and if_freenameindex API

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

aguettouche 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 20f5a28  net: Add if_nameindex and if_freenameindex API
20f5a28 is described below

commit 20f5a28e49c921d6ed3638d468248d0ea68b8a53
Author: Xiang Xiao <xi...@xiaomi.com>
AuthorDate: Tue Jun 22 11:19:06 2021 +0800

    net: Add if_nameindex and if_freenameindex API
    
    Specified here:
    https://man7.org/linux/man-pages/man3/if_nameindex.3.html
    
    Signed-off-by: Xiang Xiao <xi...@xiaomi.com>
    Change-Id: Ia5daed775bd11fa5978d54860632554da8f7b416
---
 include/net/if.h                  | 54 ++++++++++++++++++++++++
 libs/libc/net/Make.defs           |  4 ++
 libs/libc/net/lib_freenameindex.c | 51 +++++++++++++++++++++++
 libs/libc/net/lib_nameindex.c     | 86 +++++++++++++++++++++++++++++++++++++++
 net/netdev/netdev.h               | 10 -----
 5 files changed, 195 insertions(+), 10 deletions(-)

diff --git a/include/net/if.h b/include/net/if.h
index f68f9e9..28da8d7 100644
--- a/include/net/if.h
+++ b/include/net/if.h
@@ -32,6 +32,12 @@
  * Pre-processor Definitions
  ****************************************************************************/
 
+/* If CONFIG_NETDEV_IFINDEX is enabled then there is limit to the number of
+ * devices that can be registered due to the nature of some static data.
+ */
+
+#define MAX_IFINDEX        32
+
 /* Sizing parameters */
 
 #define IFNAMSIZ           16  /* Older naming standard */
@@ -103,6 +109,12 @@
  * Public Type Definitions
  ****************************************************************************/
 
+struct if_nameindex
+{
+  unsigned int if_index; /* 1, 2, ... */
+  FAR char *if_name;     /* null terminated name: "eth0", ... */
+};
+
 /* Structure passed with the SIOCMIINOTIFY ioctl command to enable
  * notification of of PHY state changes.
  */
@@ -298,6 +310,48 @@ unsigned int if_nametoindex(FAR const char *ifname);
 
 FAR char *if_indextoname(unsigned int ifindex, FAR char *ifname);
 
+/****************************************************************************
+ * Name: if_nameindex
+ *
+ * Description:
+ *   The if_nameindex() function returns an array of if_nameindex structures,
+ *   each containing information about one of the network interfaces on the
+ *   local system. The if_nameindex structure contains at least the following
+ *   entries:
+ *         unsigned int if_index;
+ *         FAR char     *if_name;
+ *   The if_index field contains the interface index. The if_name field
+ *   points to the null-terminated interface name.  The end of the array
+ *   is indicated by entry with if_index set to zero and if_name set to NULL.
+ *
+ * Input Parameters:
+ *   None
+ *
+ * Returned Value:
+ *   On success, if_nameindex() returns pointer to the array; on error, NULL
+ *   is returned, and errno is set to indicate the error.
+ *
+ ****************************************************************************/
+
+FAR struct if_nameindex *if_nameindex(void);
+
+/****************************************************************************
+ * Name: if_freenameindex
+ *
+ * Description:
+ *   The if_freenameindex() function free the data structure returned by
+ *   if_nameindex().
+ *
+ * Input Parameters:
+ *   ifn - The data structure to free
+ *
+ * Returned Value:
+ *   None
+ *
+ ****************************************************************************/
+
+void if_freenameindex(FAR struct if_nameindex *ifn);
+
 #undef EXTERN
 #ifdef __cplusplus
 }
diff --git a/libs/libc/net/Make.defs b/libs/libc/net/Make.defs
index c32eb10..1209791 100644
--- a/libs/libc/net/Make.defs
+++ b/libs/libc/net/Make.defs
@@ -33,6 +33,10 @@ ifeq ($(CONFIG_NET_LOOPBACK),y)
 CSRCS += lib_loopback.c
 endif
 
+ifeq ($(CONFIG_NETDEV_IFINDEX),y)
+CSRCS += lib_nameindex.c lib_freenameindex.c
+endif
+
 # Routing table support
 
 ifeq ($(CONFIG_NET_ROUTE),y)
diff --git a/libs/libc/net/lib_freenameindex.c b/libs/libc/net/lib_freenameindex.c
new file mode 100644
index 0000000..d88c1f3
--- /dev/null
+++ b/libs/libc/net/lib_freenameindex.c
@@ -0,0 +1,51 @@
+/****************************************************************************
+ * libs/libc/net/lib_freenameindex.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <net/if.h>
+
+#include "libc.h"
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: if_freenameindex
+ *
+ * Description:
+ *   The if_freenameindex() function free the data structure returned by
+ *   if_nameindex().
+ *
+ * Input Parameters:
+ *   ifn - The data structure to free
+ *
+ * Returned Value:
+ *   None
+ *
+ ****************************************************************************/
+
+void if_freenameindex(FAR struct if_nameindex *ifn)
+{
+  lib_free(ifn);
+}
diff --git a/libs/libc/net/lib_nameindex.c b/libs/libc/net/lib_nameindex.c
new file mode 100644
index 0000000..42a91c2
--- /dev/null
+++ b/libs/libc/net/lib_nameindex.c
@@ -0,0 +1,86 @@
+/****************************************************************************
+ * libs/libc/net/lib_nameindex.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <net/if.h>
+#include <errno.h>
+
+#include "libc.h"
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: if_nameindex
+ *
+ * Description:
+ *   The if_nameindex() function returns an array of if_nameindex structures,
+ *   each containing information about one of the network interfaces on the
+ *   local system. The if_nameindex structure contains at least the following
+ *   entries:
+ *         unsigned int if_index;
+ *         FAR char     *if_name;
+ *   The if_index field contains the interface index. The if_name field
+ *   points to the null-terminated interface name.  The end of the array
+ *   is indicated by entry with if_index set to zero and if_name set to NULL.
+ *
+ * Input Parameters:
+ *   None
+ *
+ * Returned Value:
+ *   On success, if_nameindex() returns pointer to the array; on error, NULL
+ *   is returned, and errno is set to indicate the error.
+ *
+ ****************************************************************************/
+
+FAR struct if_nameindex *if_nameindex(void)
+{
+  FAR struct if_nameindex *ifn;
+  FAR char *buf;
+  int i = 0;
+  int j;
+
+  ifn = lib_malloc((sizeof(*ifn) + IF_NAMESIZE) * MAX_IFINDEX);
+  if (ifn == NULL)
+    {
+      set_errno(ENOBUFS);
+      return NULL;
+    }
+
+  buf = (FAR char *)(ifn + MAX_IFINDEX);
+  for (j = 1; j <= MAX_IFINDEX; j++)
+    {
+      ifn[i].if_name = if_indextoname(j, buf);
+      if (ifn[i].if_name)
+        {
+          ifn[i++].if_index = j;
+          buf += IF_NAMESIZE;
+        }
+    }
+
+  ifn[i].if_name = NULL;
+  ifn[i].if_index = 0;
+
+  return ifn;
+}
diff --git a/net/netdev/netdev.h b/net/netdev/netdev.h
index 8e803c7..aba147c 100644
--- a/net/netdev/netdev.h
+++ b/net/netdev/netdev.h
@@ -37,16 +37,6 @@
 #endif
 
 /****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/* If CONFIG_NETDEV_IFINDEX is enabled then there is limit to the number of
- * devices that can be registered due to the nature of some static data.
- */
-
-#define MAX_IFINDEX  32
-
-/****************************************************************************
  * Public Data
  ****************************************************************************/