近期发现网卡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);