一些嵌入式主板集成了RTL8111网卡,出于成本原因没有加EEPROM,这样其MAC地址就无法固定,可能是随机数或全0,不利于使用。当然也可以利用脚本给它设置个MAC地址,但有时不记得修改,就有可能存在相同MAC地址。这里给出一种固定MAC地址方法。

最近在使用NaoPi R4SE时遇到开机后 8111网卡的MAC为 00:00:00:00:00:00,导致无法使用。如果使用脚本命令:ifconfig enp1s0 hw ether 00:0C:29:6A:F7:72 ,也能分配MAC地址,这是临时的。要想永久固定MAC地址,我想到了一种办法,修改r8169驱动程序,让r8169驱动程序从文件中读取MAC地址,文件的MAC地址是系统第一次加载r8169驱动时随机生成,生成文件后,以后每次启动时就读此MAC文件,这样基本上不存在MAC地址相同现象。这种方法也等同于为RTL8111加了EEPROM芯片。
        我使用linux内核是 4.19.206的,从 r8169.c 里找到 函数:rtl_init_one,在此函数前增加:

#include <linux/fs.h>
#include <linux/random.h>static int get_mac_addr(int bus,int devfn)
{struct file *fp;loff_t pos = 0;char filename[100]={0};int mac ;get_random_bytes(&mac,sizeof(int));sprintf(filename,"/etc/.rtl8111-%02x-%02x.mac",bus,devfn);fp = filp_open(filename, O_RDONLY, 0644);if (unlikely(IS_ERR(fp))) {fp = filp_open(filename, O_RDWR | O_CREAT, 0644);if (unlikely(IS_ERR(fp))) {return mac;}kernel_write(fp, &mac, sizeof(int), &pos);filp_close(fp,NULL);return mac;}kernel_read(fp, &mac, sizeof(int), &(pos));filp_close(fp, NULL);return mac;
}

MAC地址文件保存在/etc目录下,如果有多张RTL8111网卡,会根据bus、devfn来区分网卡,分别使用不同的MAC地址文件。函数 get_mac_addr 的使用:

static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
{const struct rtl_cfg_info *cfg = rtl_cfg_infos + ent->driver_data;struct rtl8169_private *tp;struct net_device *dev;int chipset, region, i;int jumbo_max, rc;int mac=get_mac_addr(pdev->bus->number,pdev->devfn);dev = devm_alloc_etherdev(&pdev->dev, sizeof (*tp));if (!dev)return -ENOMEM;

在函数rtl_init_one 后面这样修改:

 /* Get MAC address */switch (tp->mac_version) {u8 mac_addr[ETH_ALEN] __aligned(4);case RTL_GIGA_MAC_VER_35 ... RTL_GIGA_MAC_VER_38:case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_51:*(u32 *)&mac_addr[0] = rtl_eri_read(tp, 0xe0, ERIAR_EXGMAC);*(u16 *)&mac_addr[4] = rtl_eri_read(tp, 0xe4, ERIAR_EXGMAC);if (is_valid_ether_addr(mac_addr))rtl_rar_set(tp, mac_addr);else{mac_addr[0]=0x00;mac_addr[1]=0x2D;mac_addr[2]=mac&0xFF;mac_addr[3]=(mac>>8)&0xFF;mac_addr[4]=(mac>>16)&0xFF;mac_addr[5]=(mac>>24)&0xFF;rtl_rar_set(tp, mac_addr);}break;default:break;}for (i = 0; i < ETH_ALEN; i++)dev->dev_addr[i] = RTL_R8(tp, MAC0 + i);

我这里固定了MAC前两个字节为:00:2D,可以根据自己修改,后面4个字节随机生成。系统启动过程:

可以看出已经成功为8111分配了MAC地址。

给RTL8111网卡固定MAC地址的一种方法相关推荐

  1. 【转载】取得系统中网卡MAC地址的三种方法

    From:http://blog.csdn.net/zhangting1987/article/details/2732135 网卡地址这个概念有点混淆不清.因为实际上有两个地址,mac地址和物理地址 ...

  2. 获取MAC地址的四种方法(转)

    https://www.cnblogs.com/zlshmily/p/10058560.html zlshmily 在实际的应用系统中,我们往往会需要在程序运行时获取当前机器的网卡的MAC地址,以便作 ...

  3. Java 跨平台获取 MAC 地址的两种方法

    前言 有时我们因为软件授权或者其它需要获取主机唯一标识而需要获取用户主机的MAC地址,而本文则将介绍如何通过Java来实现跨平台获取MAC地址的两种方法,同时具体的代码也已上传到GitHub. 如果不 ...

  4. android 取mac地址,Android手机获取Mac地址的几种方法,androidmac

    Android手机获取Mac地址的几种方法,androidmac 最常用的方法,通过WiFiManager获取: /** * 通过WiFiManager获取mac地址 * @param context ...

  5. android 手机固定mac地址吗,Android手机获取Mac地址的几种方法

    最常用的方法,通过WiFiManager获取: /** * 通过WiFiManager获取mac地址 * @param context * @return */ private static Stri ...

  6. Android设备用指令查看设备mac地址的两种方法

    Android设备可以用如下两种方法查看设备网络信息 1. ifconfig指令 inet addr 是ip地址 HWaddr 是mac地址 wlan0是wifi的mac地址 eth0是设备第一个以太 ...

  7. win7修改mac地址的三种方法

    Win7修改MAC地址方法有以下三种: 方法一:使用Win7MAC地址修改工具 1,只适用于windows7系统的网卡MAC地址修改.XP的可以用,但没做什么测试. 2,部分windows7下的无线网 ...

  8. [机器码] 获取 MAC 地址的几种方法

    Netbios #include <windows.h> #pragma comment(lib, "Netapi32.lib")namespace {bool Get ...

  9. android 4g获取mac地址,Android手机获取Mac地址的几种方法

    最常用的方法,通过WiFiManager获取: /** * 通过WiFiManager获取mac地址 * @param context * @return */ private static Stri ...

最新文章

  1. 提升篇——SELINUX相关介绍
  2. 人工智能(5)---一文解读人工智能创业的5大坑
  3. jsonStore加载远程和本地数据实例
  4. JavaScript [ 转 ] —— 面向对象编程(三):非构造函数的继承
  5. 监测linux一些重要文件md5值脚本
  6. 高级数据结构与算法 | 跳跃表(Skip List)
  7. 在ubunut下使用pycharm和eclipse进行python远程调试
  8. 大学计算机要学多久,大学刚开学要不要带电脑?很多人都很后悔,学长学姐把经验告诉你...
  9. 【Elasticsearch】Get 查询获取不到数据,但是用 _search 就可以查询到
  10. 排序序列排序算法总结(二)——快速排序、归并排序
  11. 从入门到入土:基于C语言采用UDP协议实现远程控制|详细说明|利用流套接字实现一个简单的远程控制系统|代码展示
  12. 用Bi-GRU+Attention和字向量做端到端的中文关系抽取
  13. web重启tomcat_使用docker构建jdk镜像和web服务镜像
  14. 牛客 128A 礼物 (组合计数)
  15. Gradle下载手动安装
  16. Cloud Native 演进可行性研究
  17. 2019表情包制作工具哪个好用
  18. iOS 定位服务编程详解
  19. 浅谈IT行业中的隐私泄露问题
  20. TCP/IP OSI各层协议,ARP属于哪一层的协议

热门文章

  1. 微信小程序 —— 保留两位小数
  2. Nginx是什么,为什么使用Nginx
  3. ubuntu下耳机没有声音问题
  4. 总结一下用面向对象写法调用借口
  5. 学习笔记(3):海量数据的交互式分析工具-Dremel
  6. 八数码问题的三种解决方式,其一:宽度优先搜索
  7. java电子配件公司仓库管理系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
  8. 从零写VIO|第二节——作业:使用Allen方差工具标定IMU
  9. 24C02 EEPROM多个字节连续写入乱码问题解决
  10. Linux whoami和who am i命令用法和区别