summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
authorzms123456 <[email protected]>2024-10-11 12:10:21 +0800
committerGitHub <[email protected]>2024-10-11 00:10:21 -0400
commit9a010bb71b278afb3fcb4b98f28668b598f01369 (patch)
treeb0b9018378a3c1c11fed0bc7903370e815d8ae88 /components
parent344ea873477f02f03602d5ba79cb432499ea2e36 (diff)
[components][sal]add netdev ifindex feature
Diffstat (limited to 'components')
-rw-r--r--components/net/netdev/include/netdev.h3
-rw-r--r--components/net/netdev/src/netdev.c40
-rw-r--r--components/net/sal/src/sal_socket.c10
3 files changed, 53 insertions, 0 deletions
diff --git a/components/net/netdev/include/netdev.h b/components/net/netdev/include/netdev.h
index 6b00bc2148..7963ea4dbe 100644
--- a/components/net/netdev/include/netdev.h
+++ b/components/net/netdev/include/netdev.h
@@ -101,6 +101,8 @@ struct netdev
netdev_callback_fn status_callback; /* network interface device flags change callback */
netdev_callback_fn addr_callback; /* network interface device address information change callback */
+ int ifindex; /* network interface device ifindex */
+
#ifdef RT_USING_SAL
void *sal_user_data; /* user-specific data for SAL */
#endif /* RT_USING_SAL */
@@ -151,6 +153,7 @@ int netdev_unregister(struct netdev *netdev);
struct netdev *netdev_get_first_by_flags(uint16_t flags);
struct netdev *netdev_get_by_ipaddr(ip_addr_t *ip_addr);
struct netdev *netdev_get_by_name(const char *name);
+struct netdev *netdev_get_by_ifindex(int ifindex);
#ifdef RT_USING_SAL
struct netdev *netdev_get_by_family(int family);
int netdev_family_get(struct netdev *netdev);
diff --git a/components/net/netdev/src/netdev.c b/components/net/netdev/src/netdev.c
index 22b6d3d74c..94f7613719 100644
--- a/components/net/netdev/src/netdev.c
+++ b/components/net/netdev/src/netdev.c
@@ -39,6 +39,7 @@ struct netdev *netdev_default = RT_NULL;
static netdev_callback_fn g_netdev_register_callback = RT_NULL;
static netdev_callback_fn g_netdev_default_change_callback = RT_NULL;
static RT_DEFINE_SPINLOCK(_spinlock);
+static int netdev_num;
/**
* This function will register network interface device and
@@ -112,6 +113,9 @@ int netdev_register(struct netdev *netdev, const char *name, void *user_data)
rt_slist_append(&(netdev_list->list), &(netdev->list));
}
+ netdev_num++;
+ netdev->ifindex = netdev_num;
+
rt_spin_unlock(&_spinlock);
if (netdev_default == RT_NULL)
@@ -326,6 +330,42 @@ struct netdev *netdev_get_by_name(const char *name)
return RT_NULL;
}
+/**
+ * This function will get network interface device
+ * in network interface device list by netdev ifindex.
+ *
+ * @param ifindex the ifindex of network interface device
+ *
+ * @return != NULL: network interface device object
+ * NULL: get failed
+ */
+struct netdev *netdev_get_by_ifindex(int ifindex)
+{
+ rt_slist_t *node = RT_NULL;
+ struct netdev *netdev = RT_NULL;
+
+ if (netdev_list == RT_NULL)
+ {
+ return RT_NULL;
+ }
+
+ rt_spin_lock(&_spinlock);
+
+ for (node = &(netdev_list->list); node; node = rt_slist_next(node))
+ {
+ netdev = rt_slist_entry(node, struct netdev, list);
+ if (netdev && (netdev->ifindex == ifindex))
+ {
+ rt_spin_unlock(&_spinlock);
+ return netdev;
+ }
+ }
+
+ rt_spin_unlock(&_spinlock);
+
+ return RT_NULL;
+}
+
#ifdef RT_USING_SAL
/**
* This function will get the first network interface device
diff --git a/components/net/sal/src/sal_socket.c b/components/net/sal/src/sal_socket.c
index 6cd2caeea3..ce0a9ca1d1 100644
--- a/components/net/sal/src/sal_socket.c
+++ b/components/net/sal/src/sal_socket.c
@@ -1467,6 +1467,16 @@ int sal_ioctlsocket(int socket, long cmd, void *arg)
ifconf_tmp->ifc_ifcu.ifcu_buf = ifconf_tmp->ifc_ifcu.ifcu_buf - sizeof(struct sal_ifreq) * count_size;
return 0;
}
+ case SIOCGIFINDEX:
+ {
+ netdev = netdev_get_by_name(ifr->ifr_ifrn.ifrn_name);
+ if (netdev)
+ {
+ ifr->ifr_ifru.ifru_ivalue = netdev->ifindex;
+ return 0;
+ }
+ return -ENODEV;
+ }
default:
break;
}