Skip to content

Commit 9a010bb

Browse files
authored
[components][sal]add netdev ifindex feature
1 parent 344ea87 commit 9a010bb

File tree

3 files changed

+53
-0
lines changed

3 files changed

+53
-0
lines changed

components/net/netdev/include/netdev.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ struct netdev
101101
netdev_callback_fn status_callback; /* network interface device flags change callback */
102102
netdev_callback_fn addr_callback; /* network interface device address information change callback */
103103

104+
int ifindex; /* network interface device ifindex */
105+
104106
#ifdef RT_USING_SAL
105107
void *sal_user_data; /* user-specific data for SAL */
106108
#endif /* RT_USING_SAL */
@@ -151,6 +153,7 @@ int netdev_unregister(struct netdev *netdev);
151153
struct netdev *netdev_get_first_by_flags(uint16_t flags);
152154
struct netdev *netdev_get_by_ipaddr(ip_addr_t *ip_addr);
153155
struct netdev *netdev_get_by_name(const char *name);
156+
struct netdev *netdev_get_by_ifindex(int ifindex);
154157
#ifdef RT_USING_SAL
155158
struct netdev *netdev_get_by_family(int family);
156159
int netdev_family_get(struct netdev *netdev);

components/net/netdev/src/netdev.c

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ struct netdev *netdev_default = RT_NULL;
3939
static netdev_callback_fn g_netdev_register_callback = RT_NULL;
4040
static netdev_callback_fn g_netdev_default_change_callback = RT_NULL;
4141
static RT_DEFINE_SPINLOCK(_spinlock);
42+
static int netdev_num;
4243

4344
/**
4445
* This function will register network interface device and
@@ -112,6 +113,9 @@ int netdev_register(struct netdev *netdev, const char *name, void *user_data)
112113
rt_slist_append(&(netdev_list->list), &(netdev->list));
113114
}
114115

116+
netdev_num++;
117+
netdev->ifindex = netdev_num;
118+
115119
rt_spin_unlock(&_spinlock);
116120

117121
if (netdev_default == RT_NULL)
@@ -326,6 +330,42 @@ struct netdev *netdev_get_by_name(const char *name)
326330
return RT_NULL;
327331
}
328332

333+
/**
334+
* This function will get network interface device
335+
* in network interface device list by netdev ifindex.
336+
*
337+
* @param ifindex the ifindex of network interface device
338+
*
339+
* @return != NULL: network interface device object
340+
* NULL: get failed
341+
*/
342+
struct netdev *netdev_get_by_ifindex(int ifindex)
343+
{
344+
rt_slist_t *node = RT_NULL;
345+
struct netdev *netdev = RT_NULL;
346+
347+
if (netdev_list == RT_NULL)
348+
{
349+
return RT_NULL;
350+
}
351+
352+
rt_spin_lock(&_spinlock);
353+
354+
for (node = &(netdev_list->list); node; node = rt_slist_next(node))
355+
{
356+
netdev = rt_slist_entry(node, struct netdev, list);
357+
if (netdev && (netdev->ifindex == ifindex))
358+
{
359+
rt_spin_unlock(&_spinlock);
360+
return netdev;
361+
}
362+
}
363+
364+
rt_spin_unlock(&_spinlock);
365+
366+
return RT_NULL;
367+
}
368+
329369
#ifdef RT_USING_SAL
330370
/**
331371
* This function will get the first network interface device

components/net/sal/src/sal_socket.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1467,6 +1467,16 @@ int sal_ioctlsocket(int socket, long cmd, void *arg)
14671467
ifconf_tmp->ifc_ifcu.ifcu_buf = ifconf_tmp->ifc_ifcu.ifcu_buf - sizeof(struct sal_ifreq) * count_size;
14681468
return 0;
14691469
}
1470+
case SIOCGIFINDEX:
1471+
{
1472+
netdev = netdev_get_by_name(ifr->ifr_ifrn.ifrn_name);
1473+
if (netdev)
1474+
{
1475+
ifr->ifr_ifru.ifru_ivalue = netdev->ifindex;
1476+
return 0;
1477+
}
1478+
return -ENODEV;
1479+
}
14701480
default:
14711481
break;
14721482
}

0 commit comments

Comments
 (0)