Firefly开源社区

打印 上一主题 下一主题

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

31

积分

0

威望

0

贡献

技术小白

积分
31

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

发表于 2022-8-10 09:50:25      浏览:3126 | 回复:2        打印     [复制链接] 楼主
问题描述及复现步骤:
刷了ubuntu18.04,每次启动MAC地址都会变化,下载了论坛里介绍的UpgradeDllTool和WNpctool,读写MAC地址都失败,不知道有什么办法没有。
3 Q0 w; f1 o: e5 I+ j$ X6 z: L

Log2022-08-05.zip

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

回复

使用道具 举报

31

积分

0

威望

0

贡献

技术小白

积分
31
发表于 2022-8-10 15:10:28      沙发
问题没解决,我加您QQ了,请通过一下!5 C* Z" D  h3 C
回复

使用道具 举报

31

积分

0

威望

0

贡献

技术小白

积分
31
发表于 2022-8-11 11:37:08      板凳
好啦,我自己搞定了:
- K* e+ [6 p- F5 h3 A) u7 O1、小板子上执行 dmesg | grep mac,找到大致下面信息,发现mac地址的获取是通过rk_get_eth_addr这个函数。
: ^/ l( Y4 t4 o1 ork_get_eth_addr: rk_vendor_read eth mac address failed (-1). E' ]* P( m; ^& t: J! s( \! _" Q
rk_get_eth_addr: rk_vendor_write eth mac address failed (-1)
$ |& F$ i4 s, T, a0 D! Y3 h7 g  ?6 ?' wrk_get_eth_addr: mac address: cc:10:ad:eb:70:55
; t6 K2 C6 X: [% J, i" S& y2、执行grep rk_get_eth_addr -r ./  定位rk_get_eth_addr函数在kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c文件里) A5 Q- Q: ^0 T3 x& y
3、找到这个函数,在if (ret != 6 || is_zero_ether_addr(addr)) {这段代码的后面加上这些内容:0 ^2 U5 W1 b' X6 P, h
/*modified by woodrow*/4 K  v4 j' w1 m6 d1 A- W( t
                union {
) r* ^- T  w5 T2 l                        unsigned long ul;) h. z# a/ q& D' h
                        unsigned char uc[8];
1 t( y% X2 [9 v5 P                } cc;
+ O1 i& n9 k+ {  _+ @                //random_ether_addr(addr);
# H  e; c1 `# q& J# b; U7 O                // dev_err(dev, "%s: generate random eth mac address: %02x:%02x:%02x:%02x:%02x:%02x",
' s2 [; h" a# x! n                //                         __func__, addr[0], addr[1], addr[2],* Q$ x/ I4 ~) F) u8 ~% d  y3 Z- o
                //                         addr[3], addr[4], addr[5]);* E3 c9 e7 v( k3 t
                unsigned long system_low = (unsigned long)system_serial_low;3 Y& e8 T9 T  n9 N' {
                unsigned long system_high = (unsigned long)system_serial_high;# s4 G* x6 X" \; Z0 Z9 k
                dev_err(dev, "%s: rk_vendor_read eth mac address failed (%d)", __func__, ret);
6 B/ L- b& t# e4 L5 T5 h/ _1 ~. |                dev_err(dev, "%s: system_serial_low (%lu), system_serial_high (%lu).\n", __func__, system_low, system_high);* g  j5 E' G$ s1 N( }5 A! B( L
                cc.ul = system_low;, x$ ^* m2 ^0 i/ a& y8 d
                addr[0] = 0xcc;
( \+ ?2 C( K: Q3 f. G9 [5 i                addr[1] = 0x10;
, j( q" |& t% ~2 E& p! M! U, k  J                addr[2] = cc.uc[3];( c0 W) x; M, V- @5 G* D7 ?% u
                addr[3] = cc.uc[2];
5 P5 W1 T6 }- v, c                addr[4] = cc.uc[1];5 y7 D. j, n. I: D, \4 W% Q
                addr[5] = cc.uc[0];
0 o8 i" F# Y% S- m+ m/*modified by woodrow*/
: _7 G8 R  c' f% x这段代码的用途是,当没有在vendor_storage里读到mac地址的时候,不是随机产生一个mac地址,而是将cpu序列号作为mac地址的一部分。cpu序列号:system_serial_low和system_serial_high是2个全局变量,需要引入头文件:#include <asm/system_info.h>才能使用。
回复

使用道具 举报

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

本版积分规则

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