当前位置: 首页 > news >正文

网络设备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);

http://www.mrgr.cn/news/7666.html

相关文章:

  • [数据集][目标检测]木材缺陷检测数据集VOC+YOLO格式2383张10类别
  • 《亿级流量系统架构设计与实战》第十二章 评论服务
  • 【赵渝强老师】Docker三剑客
  • Spring Boot 与 Spring Security 的集成及 OAuth2 实现
  • Leetcode-day31-01背包问题
  • 开源原型设计工具Penpot
  • 缓存实现方式
  • 从源码开始:在线教育系统与网校APP的架构设计与开发实践
  • Android Studio修改默认.m2与Gradle user home缓存位置
  • 垃圾分类笔记YOLOV5(一)-pip换源-口罩识别-训练自己的数据集
  • 宝塔面板配置node/npm/yarn/pm2....相关全局变量 npm/node/XXX: command not found
  • Spring中ConfigurableListableBeanFactory
  • 简单使用scratch镜像
  • 数据增强常见方法汇总
  • NoSQL之Redis配置与优化
  • pyintaller pyqt5 pytest打包后 找不到测试实例
  • 【正点原子K210连载】第三十二章 音频FFT实验 摘自【正点原子】DNK210使用指南-CanMV版指南
  • leetcode 438 找到字符串中所有字母异位词
  • 使用Python+winshell/shutil清空回收站
  • QML 界面切换的方法