Firefly开源社区

打印 上一主题 下一主题

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

31

积分

0

威望

0

贡献

技术小白

积分
31

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

发表于 2022-8-10 09:50:25      浏览:3129 | 回复:2        打印      只看该作者   [复制链接] 楼主
问题描述及复现步骤:
刷了ubuntu18.04,每次启动MAC地址都会变化,下载了论坛里介绍的UpgradeDllTool和WNpctool,读写MAC地址都失败,不知道有什么办法没有。
; _' v( N8 c4 e& ^  ^/ o. Z$ N

Log2022-08-05.zip

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

回复

使用道具 举报

31

积分

0

威望

0

贡献

技术小白

积分
31
发表于 2022-8-10 15:10:28        只看该作者  沙发
问题没解决,我加您QQ了,请通过一下!6 V  C  W0 r) V; Z' c
回复

使用道具 举报

31

积分

0

威望

0

贡献

技术小白

积分
31
发表于 2022-8-11 11:37:08        只看该作者  板凳
好啦,我自己搞定了:
/ n4 a6 C, l0 p3 g4 C+ p* O1、小板子上执行 dmesg | grep mac,找到大致下面信息,发现mac地址的获取是通过rk_get_eth_addr这个函数。/ P% w. F5 R/ z2 a4 B+ |7 E8 [
rk_get_eth_addr: rk_vendor_read eth mac address failed (-1)
  l& K. {$ Y# i# l  E: @rk_get_eth_addr: rk_vendor_write eth mac address failed (-1)' k8 r" f. n, L
rk_get_eth_addr: mac address: cc:10:ad:eb:70:559 L6 l* K5 u% c$ y' o. S* V2 l
2、执行grep rk_get_eth_addr -r ./  定位rk_get_eth_addr函数在kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c文件里; J+ s4 R" A+ ]' ^" q- J6 I9 [! t
3、找到这个函数,在if (ret != 6 || is_zero_ether_addr(addr)) {这段代码的后面加上这些内容:
1 Q. t8 K6 V9 n* q% W/*modified by woodrow*/
: W( P8 l: _; ]) y7 f& u0 Y6 T6 C                union {2 H5 k- F) H# s# ^8 n" w0 ?! k
                        unsigned long ul;; {5 S, S8 ~1 l9 y3 h! V, Z& f9 c
                        unsigned char uc[8];
3 |' P) D( ^7 v; M8 y5 `! f                } cc;
! D% g) ^1 r9 n# t                //random_ether_addr(addr);
6 u1 }4 C7 c$ c2 ]( }  {                // dev_err(dev, "%s: generate random eth mac address: %02x:%02x:%02x:%02x:%02x:%02x",
  b' T3 i# `) b: E                //                         __func__, addr[0], addr[1], addr[2],' S3 Y% |- p. \; w$ s  g6 `2 g; p# t
                //                         addr[3], addr[4], addr[5]);
+ [& E+ G( n3 \5 o9 F  q                unsigned long system_low = (unsigned long)system_serial_low;. @8 a& m. B) N5 |
                unsigned long system_high = (unsigned long)system_serial_high;& j/ o- |" W) M
                dev_err(dev, "%s: rk_vendor_read eth mac address failed (%d)", __func__, ret);
; m: n9 c( `1 j% J+ }. S! ~                dev_err(dev, "%s: system_serial_low (%lu), system_serial_high (%lu).\n", __func__, system_low, system_high);
, F7 {+ T9 u' j( H3 G! t# r: A                cc.ul = system_low;5 ?9 A( m8 E7 A4 B, h8 p
                addr[0] = 0xcc;
  @2 x" Z- E# R: w                addr[1] = 0x10;
/ U# z$ u& }$ O8 w                addr[2] = cc.uc[3];& F* N. r4 }" @! E  M0 ?
                addr[3] = cc.uc[2];( k6 C& @  M: y  \
                addr[4] = cc.uc[1];7 |9 X) \2 c5 h7 i% T
                addr[5] = cc.uc[0];% T" k0 t6 E% _% U  e6 V) z  k8 z- w
/*modified by woodrow*/
2 f. _' k' o/ f  w5 D这段代码的用途是,当没有在vendor_storage里读到mac地址的时候,不是随机产生一个mac地址,而是将cpu序列号作为mac地址的一部分。cpu序列号:system_serial_low和system_serial_high是2个全局变量,需要引入头文件:#include <asm/system_info.h>才能使用。
回复

使用道具 举报

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

本版积分规则

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