网络设备net_device数据结构之ifindex

embedded/2024/9/24 14:22:21/

近期发现网卡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.ppmy.cn/embedded/97895.html

相关文章

若依小程序使用及遇到的问题

1、首先去官网拉取小程序代码&#xff0c;从HBuildx运行到小程序 这个时候项目起来了&#xff0c;但是小程序发生了报错&#xff1b; 解决方法 在 project.config.json 新增指定 app.json 路径 ★一定要有 unpackage文件夹 如果没有的需要到HBuilder X 编译一下&#xff0c;编…

智能家居之自动加热与童锁饮水机构建思路

自动加热饮水机构建思路 引言 我们做饮水机, 并不做饮水机滤芯, 也不做饮水机的水龙头, 而是做饮水机的逻辑交互功能。 因为饮水机涉及到的人机交互可能比较多&#xff0c; 适合我们进行研究思考&#xff0c; 为其他项目的开发提供经验。 涉及到的人机交互&#xff1a; 水温控…

数据导入导出(EasyExcel)框架入门指南

写在前面 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 文章目录 EasyExcel 框架概述依赖APIExcel 实体类注解写 Excel概念介绍写 Excel 通用参数WriteWorkbookWriteSheetWriteTable 代码…

JVM感知docker容器内存资源限制

容器中的java程序无法感知docker的内存资源限制 [rootxm-phy-kvm-113-2 ~]# docker run -m 100MB openjdk:8u131 java -XshowSettings:vm -version VM settings:Max. Heap Size (Estimated): 17.43GErgonomics Machine Class: serverUsing VM: OpenJDK 64-Bit Server VMopenjd…

Spring Boot 无法解析某些类型的bean,导致启动报错

一、异常报错 org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘bookController’ defined in file [D:\eclipse-workspace\demo\target\classes\com\jsglxx\demo\controller\BookController.class]: Unsatisfied dependen…

LeetCode 第三十一天 2024.8.17

1. &#xff1a;打家劫舍 题目链接: 198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 应用条件&#xff1a;动态规划 难点&#xff1a; # 确定dp数组&#xff08;dp table&#xff09;以及下标的含义&#xff1a;dp[i]表示在i这房子能投的最高金额 # 确定递推公式: dp…

ansible2

自动化运维工具ansible yum环境与相关安装包的安装 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/centos7_base.repo yum clean all yum makecache yum -y install epel-release yum -y install ansible ansible --version 编写主…

k8s笔记——资源对象

以下列举的内容都是 Kubernetes 中的对象&#xff08;Object&#xff09;&#xff0c;这些对象都可以在 YAML 文件中作为一种 API 类型来配置。 PodNodeNamespaceServiceVolumePersistentVolumeDeploymentSecretStatefulSetDaemonSetServiceAccountReplicationControllerRepli…