Firefly开源社区

打印 上一主题 下一主题

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

31

积分

0

威望

0

贡献

技术小白

积分
31

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

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

Log2022-08-05.zip

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

回复

使用道具 举报

31

积分

0

威望

0

贡献

技术小白

积分
31
发表于 2022-8-10 15:10:28        只看该作者  沙发
问题没解决,我加您QQ了,请通过一下!
) O, T; B2 y* A- i/ g/ x
回复

使用道具 举报

31

积分

0

威望

0

贡献

技术小白

积分
31
发表于 2022-8-11 11:37:08        只看该作者  板凳
好啦,我自己搞定了:( E( V. |1 H% h! w
1、小板子上执行 dmesg | grep mac,找到大致下面信息,发现mac地址的获取是通过rk_get_eth_addr这个函数。
) ?$ X( I, M/ O  r; B" K" T2 g0 wrk_get_eth_addr: rk_vendor_read eth mac address failed (-1)
8 S4 T4 o5 @, irk_get_eth_addr: rk_vendor_write eth mac address failed (-1)1 ?8 P) A0 B* }( `
rk_get_eth_addr: mac address: cc:10:ad:eb:70:55
* H6 {* U# C% T% v2、执行grep rk_get_eth_addr -r ./  定位rk_get_eth_addr函数在kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c文件里* V* D0 a" I$ @
3、找到这个函数,在if (ret != 6 || is_zero_ether_addr(addr)) {这段代码的后面加上这些内容:, g; F1 U. j% L6 a0 j; x4 J9 L
/*modified by woodrow*/
9 ]; }6 j9 a' V: f. b                union {$ N% ~9 b- F( J% @5 ?* I4 T
                        unsigned long ul;
& K4 t( H7 M; [' w( l: K# q6 @& i" T4 @                        unsigned char uc[8];
) l  B9 t5 \7 F                } cc;3 ?. x6 z% S7 j3 k
                //random_ether_addr(addr);" b9 J& O+ D' }( e: @3 B& {! H, Z! g
                // dev_err(dev, "%s: generate random eth mac address: %02x:%02x:%02x:%02x:%02x:%02x",
. _2 |6 Q: L, D$ c& z                //                         __func__, addr[0], addr[1], addr[2],
5 C3 I- q- ~6 P* [/ D                //                         addr[3], addr[4], addr[5]);, b4 X+ s& V% O- P. G: f
                unsigned long system_low = (unsigned long)system_serial_low;! ?& M$ H% \- r. G, c; a; p
                unsigned long system_high = (unsigned long)system_serial_high;
9 O* Y  W$ i" r                dev_err(dev, "%s: rk_vendor_read eth mac address failed (%d)", __func__, ret);# V% E: w! q% G6 |; C( ~
                dev_err(dev, "%s: system_serial_low (%lu), system_serial_high (%lu).\n", __func__, system_low, system_high);: N0 b" ~( u: D1 o
                cc.ul = system_low;
) i6 W' E: V' C1 f) {: ~: S                addr[0] = 0xcc;7 A! F2 R9 J& ~
                addr[1] = 0x10;- v  a0 H  _; F' @5 ~
                addr[2] = cc.uc[3];
. b/ l* X. q- I                addr[3] = cc.uc[2];
$ k- g, v: x# V+ O  {                addr[4] = cc.uc[1];
* P( N/ r' Y4 u: [% J& U+ q! U                addr[5] = cc.uc[0];
9 W- R* U5 x3 g, o& b: g$ a" ^- w" c8 m  q/*modified by woodrow*/3 P/ c3 ~/ ]' X/ {' ~3 O
这段代码的用途是,当没有在vendor_storage里读到mac地址的时候,不是随机产生一个mac地址,而是将cpu序列号作为mac地址的一部分。cpu序列号:system_serial_low和system_serial_high是2个全局变量,需要引入头文件:#include <asm/system_info.h>才能使用。
回复

使用道具 举报

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

本版积分规则

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