From 9df785a67701e5aa46fd6a893864915e6f3b2f82 Mon Sep 17 00:00:00 2001 From: zhao maosheng Date: Tue, 10 Sep 2024 17:39:47 +0800 Subject: [PATCH] add netdev ifindex feature --- components/net/netdev/include/netdev.h | 3 ++ components/net/netdev/src/netdev.c | 40 ++++++++++++++++++++++++++ components/net/sal/src/sal_socket.c | 13 +++++++++ 3 files changed, 56 insertions(+) diff --git a/components/net/netdev/include/netdev.h b/components/net/netdev/include/netdev.h index 5dc68bf216f..267b01a5761 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 */ @@ -153,6 +155,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 e6398cf02ef..21351b46780 100644 --- a/components/net/netdev/src/netdev.c +++ b/components/net/netdev/src/netdev.c @@ -41,6 +41,7 @@ struct netdev *netdev_lo = 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 @@ -115,6 +116,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_irqrestore(&_spinlock, level); if (netdev_default == RT_NULL) @@ -333,6 +337,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 1317c5c1bdd..cc60311f4f3 100644 --- a/components/net/sal/src/sal_socket.c +++ b/components/net/sal/src/sal_socket.c @@ -1474,6 +1474,19 @@ 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: + { + for (node = &(cur_netdev_list->list); node; node = rt_slist_next(node)) + { + netdev = rt_list_entry(node, struct netdev, list); + if (rt_strcmp(ifr->ifr_ifrn.ifrn_name, netdev->name) == 0) + { + ifr->ifr_ifru.ifru_ivalue = netdev->ifindex; + return 0; + } + } + return -ENODEV; + } default: break; }