网络设备net_device数据结构之ifindex

近期发现网卡index值发生改变,导致上层dhcp失败(这里dhcp如果动态获取网卡index其实也无问题),这里主要来了解下网卡index值的产生原理,如何固定,如何动态注册,以及各自优缺点

网络设备:net_device数据结构
net_device数据结构存储着特定网络设备的所有信息。无论是真是设备(如 Ethernet)或虚拟设备(如Bonding 或 VLAN)

标识符
net_device结构有三个标识符

int ifindex
独一无二的ID,当设备以dev_new_index注册时分配给每个设备

下列函数通过设备注册的时候调用,其会分配ifindex, 从内容中可以看出,是通过递增ifindex值,去判断ID是否被分配,如没有被分配,将值赋予ifindex

/**
 *	dev_new_index	-	allocate an ifindex
 *	@net: the applicable net namespace
 *
 *	Returns a suitable unique value for a new device interface
 *	number.  The caller must hold the rtnl semaphore or the
 *	dev_base_lock to be sure it remains unique.
 */
static int dev_new_index(struct net *net)
{
	int ifindex = net->ifindex;

	for (;;) {
		if (++ifindex <= 0)
			ifindex = 1;
		if (!__dev_get_by_index(net, ifindex))
			return net->ifindex = ifindex;
	}
}

WiFi驱动当前有两种架构,softmac和fullmac,区别在于softmac是使用的驱动的mac80211模块,而fullmac则是将mac80211部分的代码放在驱动中实现。
网络设备注册是调用register_netdevice注册到内核的,该动作一般是在mac80211模块ieee80211_if_add新增网卡中调用。 因此如果想要固定网卡index值则只需在register_netdevice之前给ifindex赋值即可。

距离说明修改如下:
softmac:
mac80211模块 >>> kernel\src\net\mac80211\iface.c >>> ieee80211_if_add
在ieee80211_if_add函数调用register_netdevice之前给ndev->ifindex赋值,如下:

+if(0 == strcmp(ndev->name,"wlan0"))
+{
+	ndev->ifindex = WLAN0_IFINDEX;
+}
+printk("ndev->name = %s idx = %d \n", ndev->name, ndev->ifindex);

ret = register_netdevice(ndev);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸡蛋炒肉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值