Firefly开源社区

打印 上一主题 下一主题

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

31

积分

0

威望

0

贡献

技术小白

积分
31

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

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

Log2022-08-05.zip

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

回复

使用道具 举报

31

积分

0

威望

0

贡献

技术小白

积分
31
发表于 2022-8-10 15:10:28        只看该作者  沙发
问题没解决,我加您QQ了,请通过一下!* `0 R, u7 Z& E
回复

使用道具 举报

31

积分

0

威望

0

贡献

技术小白

积分
31
发表于 2022-8-11 11:37:08        只看该作者  板凳
好啦,我自己搞定了:
# S: t. @0 U6 `1、小板子上执行 dmesg | grep mac,找到大致下面信息,发现mac地址的获取是通过rk_get_eth_addr这个函数。! r3 ]3 P9 s0 Y& K
rk_get_eth_addr: rk_vendor_read eth mac address failed (-1)7 Z% I& a' H4 p6 l5 _
rk_get_eth_addr: rk_vendor_write eth mac address failed (-1)
6 n# u+ T5 G' ark_get_eth_addr: mac address: cc:10:ad:eb:70:558 ^- b0 s& i1 o1 _% @' u  t
2、执行grep rk_get_eth_addr -r ./  定位rk_get_eth_addr函数在kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c文件里
/ e# J5 c3 w& J2 k% l2 Y8 N2 ?% }3、找到这个函数,在if (ret != 6 || is_zero_ether_addr(addr)) {这段代码的后面加上这些内容:4 E3 z3 U( |0 |$ t/ Y) q3 X9 A
/*modified by woodrow*/9 S$ N: R# F; y; o9 D/ j
                union {; |, J2 k  g3 a8 U
                        unsigned long ul;' b4 ~! N8 {2 d8 T3 l- u: c
                        unsigned char uc[8];
& h$ m8 K* P& _7 N& V; [/ h                } cc;
, ]/ k0 H9 F$ K0 q                //random_ether_addr(addr);- o- s1 w" D% a$ X- D' T6 ^! d- J
                // dev_err(dev, "%s: generate random eth mac address: %02x:%02x:%02x:%02x:%02x:%02x",
' y* [, H. S& w  U! |; N                //                         __func__, addr[0], addr[1], addr[2],$ J6 d0 c' n3 E
                //                         addr[3], addr[4], addr[5]);. @; u: X! L1 t3 u! R4 F
                unsigned long system_low = (unsigned long)system_serial_low;
7 t$ l; i# o) w                unsigned long system_high = (unsigned long)system_serial_high;
/ y) C- v5 s* |* K0 k( I                dev_err(dev, "%s: rk_vendor_read eth mac address failed (%d)", __func__, ret);' \! m0 p) c: U  P
                dev_err(dev, "%s: system_serial_low (%lu), system_serial_high (%lu).\n", __func__, system_low, system_high);/ }% L) ]/ h  P3 X$ J1 y
                cc.ul = system_low;
+ @% _; b4 {5 k9 E                addr[0] = 0xcc;7 o8 A/ d8 p7 s7 O1 O7 l
                addr[1] = 0x10;; w, a2 Q( I, y3 Z# ]
                addr[2] = cc.uc[3];/ r( z) w  p* R4 d" [
                addr[3] = cc.uc[2];3 X; c( i( o1 j/ ?  D) j
                addr[4] = cc.uc[1];. @& t) m0 ], d6 f* n$ X
                addr[5] = cc.uc[0];
, W- V7 m/ x' U. d# c) p* A" B/*modified by woodrow*/( }3 u4 H+ V& m  C0 t0 n9 Q5 |/ e4 h
这段代码的用途是,当没有在vendor_storage里读到mac地址的时候,不是随机产生一个mac地址,而是将cpu序列号作为mac地址的一部分。cpu序列号:system_serial_low和system_serial_high是2个全局变量,需要引入头文件:#include <asm/system_info.h>才能使用。
回复

使用道具 举报

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

本版积分规则

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