Firefly开源社区

打印 上一主题 下一主题

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

31

积分

0

威望

0

贡献

技术小白

积分
31

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

发表于 2022-8-10 09:50:25      浏览:2875 | 回复:2        打印      只看该作者   [复制链接] 楼主
问题描述及复现步骤:
刷了ubuntu18.04,每次启动MAC地址都会变化,下载了论坛里介绍的UpgradeDllTool和WNpctool,读写MAC地址都失败,不知道有什么办法没有。
1 l( E8 f9 h2 \( V9 }5 V% F4 ~5 O

Log2022-08-05.zip

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

回复

使用道具 举报

31

积分

0

威望

0

贡献

技术小白

积分
31
发表于 2022-8-10 15:10:28        只看该作者  沙发
问题没解决,我加您QQ了,请通过一下!
% ^2 Y( U( W; [$ S; s' G: I9 |4 w
回复

使用道具 举报

31

积分

0

威望

0

贡献

技术小白

积分
31
发表于 2022-8-11 11:37:08        只看该作者  板凳
好啦,我自己搞定了:5 k$ v7 t' }+ i/ B7 l
1、小板子上执行 dmesg | grep mac,找到大致下面信息,发现mac地址的获取是通过rk_get_eth_addr这个函数。
- p3 {# {$ w4 r& P; Trk_get_eth_addr: rk_vendor_read eth mac address failed (-1)% C9 v- \* N$ u
rk_get_eth_addr: rk_vendor_write eth mac address failed (-1)1 Y& O8 {  {% z
rk_get_eth_addr: mac address: cc:10:ad:eb:70:55
: \& A3 n8 t# j. W! d2、执行grep rk_get_eth_addr -r ./  定位rk_get_eth_addr函数在kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c文件里1 y  |8 N- X1 Y; `9 ~3 ?
3、找到这个函数,在if (ret != 6 || is_zero_ether_addr(addr)) {这段代码的后面加上这些内容:
) h/ q: S4 O3 C7 r7 n' o- A/*modified by woodrow*/+ _3 T- x: z3 C( l4 l! E4 ]7 P
                union {7 E  K) |! u" e0 I8 y( ]* B9 u: S
                        unsigned long ul;
1 j2 y7 \& ?8 I0 g! P0 [0 c                        unsigned char uc[8];
, A2 Z1 J% f/ C                } cc;
. [+ w0 U) Q4 V                //random_ether_addr(addr);/ r; r4 ?, P1 u$ N+ r3 y: Z+ n+ [
                // dev_err(dev, "%s: generate random eth mac address: %02x:%02x:%02x:%02x:%02x:%02x",$ x3 b. A: l7 P1 N; b% S% i
                //                         __func__, addr[0], addr[1], addr[2],
5 J9 k1 {. X, y                //                         addr[3], addr[4], addr[5]);/ ]) g+ z) [' S2 s: b
                unsigned long system_low = (unsigned long)system_serial_low;
3 _5 h, Y2 P$ @4 U- w9 v  d                unsigned long system_high = (unsigned long)system_serial_high;$ J* K$ Y& p3 G" K. H
                dev_err(dev, "%s: rk_vendor_read eth mac address failed (%d)", __func__, ret);
* o' m' C3 M7 R6 E* I5 g1 J: g                dev_err(dev, "%s: system_serial_low (%lu), system_serial_high (%lu).\n", __func__, system_low, system_high);. _, v) E4 a0 _. _$ ]7 N
                cc.ul = system_low;1 ?! b" ~: L; `. F6 m
                addr[0] = 0xcc;
9 r( t$ J0 h9 s, `6 }  W: h                addr[1] = 0x10;
1 D3 P1 ?, q. I/ D                addr[2] = cc.uc[3];7 Y0 n) q: v) {. y2 G
                addr[3] = cc.uc[2];
8 c8 b: V7 v! p7 h                addr[4] = cc.uc[1];0 o8 T# Z& I  D% ?; @1 O& B
                addr[5] = cc.uc[0];
9 g5 `! B/ m' c+ r/*modified by woodrow*/
/ C9 w2 U. @1 D1 s0 k3 L- n这段代码的用途是,当没有在vendor_storage里读到mac地址的时候,不是随机产生一个mac地址,而是将cpu序列号作为mac地址的一部分。cpu序列号:system_serial_low和system_serial_high是2个全局变量,需要引入头文件:#include <asm/system_info.h>才能使用。
回复

使用道具 举报

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

本版积分规则

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