Firefly开源社区

打印 上一主题 下一主题

[技术讨论] 关于ubuntu每次启动MAC地址都发生变化的问题

31

积分

0

威望

0

贡献

技术小白

积分
31

关于ubuntu每次启动MAC地址都发生变化的问题

发表于 2022-8-10 09:50:25      浏览:5966 | 回复:2        打印      只看该作者   [复制链接] 楼主
问题描述及复现步骤:
刷了ubuntu18.04,每次启动MAC地址都会变化,下载了论坛里介绍的UpgradeDllTool和WNpctool,读写MAC地址都失败,不知道有什么办法没有。" ?# _6 Y# X1 L' d8 {

Log2022-08-05.zip

452 Bytes, 下载次数: 1, 下载积分: 灯泡 -1 , 经验 -1

回复

使用道具 举报

31

积分

0

威望

0

贡献

技术小白

积分
31
发表于 2022-8-10 15:10:28        只看该作者  沙发
问题没解决,我加您QQ了,请通过一下!, A( u5 K! h7 M
回复

使用道具 举报

31

积分

0

威望

0

贡献

技术小白

积分
31
发表于 2022-8-11 11:37:08        只看该作者  板凳
好啦,我自己搞定了:' Y# A& j. H5 ]6 m
1、小板子上执行 dmesg | grep mac,找到大致下面信息,发现mac地址的获取是通过rk_get_eth_addr这个函数。
8 F7 T4 m$ |6 w4 t9 w) Krk_get_eth_addr: rk_vendor_read eth mac address failed (-1)) {# h  M9 Q/ E
rk_get_eth_addr: rk_vendor_write eth mac address failed (-1)
: Q/ `/ H" N0 `rk_get_eth_addr: mac address: cc:10:ad:eb:70:55
7 p0 c% l( v* o2、执行grep rk_get_eth_addr -r ./  定位rk_get_eth_addr函数在kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c文件里" d) B- |1 C; ^2 Y& _
3、找到这个函数,在if (ret != 6 || is_zero_ether_addr(addr)) {这段代码的后面加上这些内容:1 x( s* ~  x; y7 N5 [% i  ^
/*modified by woodrow*/5 J* X6 m4 a3 r4 @1 n8 u( {  Q
                union {
3 q8 K5 m% \; _0 S                        unsigned long ul;
* P8 \' L$ \8 H+ L+ h                        unsigned char uc[8];) b" B* M1 _. j% @4 a/ z, f8 S
                } cc;
' P, I: Z. D/ s7 Q( v                //random_ether_addr(addr);+ `; n. I2 u% l
                // dev_err(dev, "%s: generate random eth mac address: %02x:%02x:%02x:%02x:%02x:%02x",$ |4 P, F: _% L+ J7 x! J# u& Y
                //                         __func__, addr[0], addr[1], addr[2],
1 e0 N- l% y7 Y  T                //                         addr[3], addr[4], addr[5]);5 I( o: O5 o# M" u( c3 v) _) r5 ^1 _
                unsigned long system_low = (unsigned long)system_serial_low;
6 ?, e& g1 a6 b8 |                unsigned long system_high = (unsigned long)system_serial_high;
2 ^6 p& i. Y3 ?* V1 k! p                dev_err(dev, "%s: rk_vendor_read eth mac address failed (%d)", __func__, ret);' v/ s, @! l" x; p6 c1 N
                dev_err(dev, "%s: system_serial_low (%lu), system_serial_high (%lu).\n", __func__, system_low, system_high);4 e. d# n$ B( b1 q9 O  p1 z
                cc.ul = system_low;
9 T; a$ ^0 s/ T# m                addr[0] = 0xcc;; }' O9 C2 |% Q
                addr[1] = 0x10;
6 z. E9 n( }4 w                addr[2] = cc.uc[3];  r1 q1 C& K* K
                addr[3] = cc.uc[2];
- J( F+ Y1 N  Q                addr[4] = cc.uc[1];0 E" a1 e8 Y) X3 h) R9 y4 V
                addr[5] = cc.uc[0];6 F. E" u% ]% \( |3 S
/*modified by woodrow*/, B7 J& e9 S8 D1 i' v: }
这段代码的用途是,当没有在vendor_storage里读到mac地址的时候,不是随机产生一个mac地址,而是将cpu序列号作为mac地址的一部分。cpu序列号:system_serial_low和system_serial_high是2个全局变量,需要引入头文件:#include <asm/system_info.h>才能使用。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接 : 爱板网 电子发烧友论坛 云汉电子社区 粤ICP备14022046号-2
快速回复 返回顶部 返回列表