Linux Intel网卡IGB驱动修改mac地址
实然心血来潮,想研究一下Intel网卡mac地址是怎么设置的。本文使用IGB驱动,适合于i211等网卡。
MAC地址对于网络来说十分重要,观察过几个网络驱动,发现在Linux内核中,MAC来龙去脉无非以下几个:
一、IGB驱动
static int __init igb_init_module(void)
{int ret;pr_info("%s - version %s\n",igb_driver_string, igb_driver_version);pr_info("%s\n", igb_copyright);#ifdef CONFIG_IGB_DCAdca_register_notify(&dca_notifier);
#endifret = pci_register_driver(&igb_driver);return ret;
}
调用pci_register_driver注册pci驱动,最终会调用到同文件的igb_probe函数,在probe函数中进行各种初始化工作,包括读取NVM的mac地址,注册网络设备。
读取MAC地址并进行赋值代码片段如下:
/* copy the MAC address out of the NVM */// 读取eeprom的mac地址,实际调用的函数为igb_read_mac_addr_82575()。if (hw->mac.ops.read_mac_addr(hw))dev_err(&pdev->dev, "NVM Read Error\n");// 拷贝到netdev的dev_addr,这个是内核中使用的变量memcpy(netdev->dev_addr, hw->mac.addr, netdev->addr_len);// 判断MAC是否合法if (!is_valid_ether_addr(netdev->dev_addr)) {dev_err(&pdev->dev, "Invalid MAC Address\n");err = -EIO;goto err_eeprom;}
二、添加自定义的MAC地址
下面在igb_probe中写入自定义的MAC地址,示例代码片段如下:
// new add by Late Leeunsigned char mac[] = {0x6c, 0x61, 0x74, 0x75, 0x6c, 0x65};// 根据pci地址做MAC区别,防止使用同一MACif (pdev->bus->number == 1){printk(KERN_ERR "net device num1.\n");mac[5] = 0x65;}else if (pdev->bus->number == 2){printk(KERN_ERR "net device num2.\n");mac[5] = 0x66;}// 设置到nvm// 存疑:手册好像提到invm有次数限制,但看得不是很明白,故存疑// igb_rar_set_qsel(adapter, mac, 0, adapter->vfs_allocated_count);// end adding/* copy the MAC address out of the NVM */if (hw->mac.ops.read_mac_addr(hw))dev_err(&pdev->dev, "NVM Read Error\n");// add by Late Leeprintk(KERN_ERR "read mac addr: %pM but will update it!!\n", hw->mac.addr);// 拷贝到hw结构体,其它函数需要使用memcpy(hw->mac.addr, mac, 6); // end addingmemcpy(netdev->dev_addr, hw->mac.addr, netdev->addr_len);
思路如下:
1、首先根据PCI地址变换不同的MAC号,否则多个网卡都有相同的MAC号。
2、将自定义的mac地址拷贝到hw结构体的mac.addr中,注意,这个值会在igb_configure_rx函数(最后还是调用igb_rar_set_qsel)中调用到,因此要同步更新。如果只更新netdev的dev_addr是无法使用网络通信的。
效果如下:
root@latelee:~# ifconfig
eth0 Link encap:Ethernet HWaddr 6c:61:74:75:6c:65
...
eth1 Link encap:Ethernet HWaddr 6c:61:74:75:6c:66
...
注:
三、其它
下面是igb_probe函数栈调用:
[ 3.295643] [<c16f6e6a>] dump_stack+0x41/0x57
[ 3.300176] [<c144e5cf>] igb_probe+0xedf/0x1100
[ 3.304881] [<c12c4957>] local_pci_probe+0x17/0x50
[ 3.309848] [<c12c48f3>] ? pci_match_device+0xc3/0xe0
[ 3.315148] [<c12c4b88>] pci_device_probe+0x58/0x80
[ 3.320202] [<c13fc56f>] driver_probe_device+0x6f/0x200
[ 3.325601] [<c12c48f3>] ? pci_match_device+0xc3/0xe0
[ 3.330825] [<c13fc779>] __driver_attach+0x79/0x80
[ 3.335789] [<c13fb0d8>] bus_for_each_dev+0x68/0x90
[ 3.340841] [<c13fc3f9>] driver_attach+0x19/0x20
[ 3.345630] [<c13fc700>] ? driver_probe_device+0x200/0x200
[ 3.351288] [<c13fbfef>] bus_add_driver+0x14f/0x1d0
[ 3.356342] [<c19c7631>] ? mdio_bus_init+0x38/0x38
[ 3.361308] [<c19c7631>] ? mdio_bus_init+0x38/0x38
[ 3.366272] [<c13fcae4>] driver_register+0x54/0xe0
[ 3.371242] [<c16f6d19>] ? printk+0x38/0x3a
[ 3.375598] [<c12c4c4e>] __pci_register_driver+0x2e/0x40
[ 3.381084] [<c19c768d>] igb_init_module+0x5c/0x7a
[ 3.386051] [<c10003b2>] do_one_initcall+0x72/0x190
[ 3.391105] [<c19c7631>] ? mdio_bus_init+0x38/0x38
[ 3.396081] [<c10596ab>] ? parse_args+0x1ab/0x370
[ 3.400966] [<c1072d50>] ? __wake_up+0x40/0x50
[ 3.405584] [<c198c648>] kernel_init_freeable+0x124/0x1c9
[ 3.411163] [<c198c6ed>] ? kernel_init_freeable+0x1c9/0x1c9
[ 3.416924] [<c16f54db>] kernel_init+0xb/0xe0
[ 3.421455] [<c16faac1>] ret_from_kernel_thread+0x21/0x30
[ 3.427029] [<c16f54d0>] ? rest_init+0x70/0x70
本来想认真系统分析igb驱动并预计写3、5篇文章的,但最近发生一些很无奈的事,没有心情了。
李迟 2016.9.14 周三 晚 中秋节前
Linux Intel网卡IGB驱动修改mac地址相关推荐
- Intel 网卡修改mac地址方法
我的网卡是 Intel(R) Centrino(R) Wireless-N 2230 ,想要修改mac地址,但是进入网卡配置后点高级,没有看见Network address或者类似的选项.只有一个叫做 ...
- linux脚本怎么把文件地址变成动态地址,Linux脚本程序自动修改网卡配置文件中的MAC地址...
在玩Linux虚拟机的时候,一个安装好linux系统的virtual HDD会用于创建多个虚拟机,这样就不需要在创建每个虚拟机都安装一遍系统了.virtual HDD加载到虚拟机后,新的虚拟机的MAC ...
- linux脚本自动修改网卡,Linux脚本程序自动修改网卡配置文件中的MAC地址
在玩Linux虚拟机的时候,一个安装好linux系统的virtual HDD会用于创建多个虚拟机,这样就不需要在创建每个虚拟机都安装一遍系统了.virtual HDD加载到虚拟机后,新的虚拟机的MAC ...
- 在Windows下和Linux下如何查看网卡MAC地址、以及修改MAC地址
在Windows下 利用DOS命令打开,弹出命令窗口. 输入命令ipconfig/all,回车. 其中,物理地址为本机的MAC地址. 在Linux下 查看MAC地址的方法有好多种,下面给出四种常见的方 ...
- Linux下修改MAC地址总结
偶尔会用到这个知识点,久了不用又会记不住,所以记之,方便以后查询. Linux下修改MAC地址 方法一: 1.关闭网卡设备 ifconfig eth0 down 2.修改MAC地址 ifconfig ...
- 网关屏蔽mac地址,linux下修改mac地址方法
局域网里有一台机器,同一网段内的机器,只有部分能够ping通,也无法ping通网关,现象很奇怪,尝试过修改IP,重启网络服务,都无法解决问题. 最后怀疑是不是网关将该机器mac地址给屏蔽掉了,因此修改 ...
- Linux脚本方式修改Mac地址,两种修改Linux系统中MAC地址的方法
我们先查找MAC地址和网络接口,我们来了解一下Linux中网卡的一些细节.用这个命令来获取网络接口的详细信息: ip link show 在输出中,您将看到一些详细信息以及MAC地址: 1: lo:m ...
- linux 命令行修改mac,Linux下修改MAC地址
Linux下修改MAC地址 Author: Jaylin Zhou Date: 10/17/2009 使用ifconfig命令 标准形式: # ifconfig device_name hw ethe ...
- linux修改mac地址
mac地址在网卡里面,按道理是不能修改的,需擦除或者重新烧进去,操作系统获取mac物理地址之后直接存到操作系统的配置文件或者注册表里面(这里为什么不每次直接读取mac物理地址,估计是考虑到性能问题): ...
最新文章
- 【168天】黑马程序员27天视频学习笔记【Day07】
- Android HTTP POST上传
- [渝粤教育] 厦门大学 大数据技术原理与应用 参考 资料
- 关于JDK8采坑JCE加密限制版本问题
- android 开源图表动画,Android 图表开发开源库MPAndroidChart-Go语言中文社区
- 计算机东大计算机三在线作业,东大16秋学期《计算机基础》在线作业3
- STN可以增强CNN网络
- 小数第n位java_蓝桥杯【历届试题 小数第n位】 java版 数论
- 正则表达式 Java
- hsqldb mysql_HSQLDB的研究与性能测试(与Mysql对比)
- 正义网评咪蒙公号注销:自媒体创作须守住道德底线
- 计算机英语 自我介绍,计算机专业英文自我介绍
- 淘宝手机端详情页的设置
- 神牛闪光灯TT865/V850II 860II Sony热靴口损坏,更换新热靴口
- sqli-labs闯关笔记(Challenges)
- 2.7、信息系统项目典型生命周期模型
- 如何进行远程会议及在线演示
- 想开发手机APP软件,首先要弄清楚以下10点
- 如何快速实现完美身材,告别减肥烦恼?分享这些高效减肥方法,让你事半功倍达成健康目标!
- app架构图,330页PDF,10万字的知识点总结,全网独家首发!
热门文章
- 谷爱凌惊“险”一跳,最少价值10个亿!
- 探秘亚洲最大单体智慧农园:探索改变农民“靠天吃饭”的农作模式
- 今年双12全天 邮政、快递企业共揽收邮(快)件达4.6亿件
- 外媒:苹果已有条件批准京东方为iPhone 13供应OLED屏幕
- 苹果下调macbook AppleCare+价格 英特尔芯pro除外
- 刚公布完价格就被骂?这款新机有点惨...
- iPhone 12蓝色版疑似翻车:眼前的蓝不是蓝......
- 粉笔网CEO怒斥湖南卫视扶贫节目作秀:自己赞助1000万太傻
- 京东健康上线“新冠病毒”核酸检测 在线预约服务
- ​2020启示:拼多多篇— —退潮后,你才发现人家是游泳健将