Firefly开源社区

打印 上一主题 下一主题

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

31

积分

0

威望

0

贡献

技术小白

积分
31

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

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

Log2022-08-05.zip

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

回复

使用道具 举报

31

积分

0

威望

0

贡献

技术小白

积分
31
发表于 2022-8-10 15:10:28        只看该作者  沙发
问题没解决,我加您QQ了,请通过一下!1 s0 [1 ^1 ?; W: v5 P6 j4 ?* K
回复

使用道具 举报

31

积分

0

威望

0

贡献

技术小白

积分
31
发表于 2022-8-11 11:37:08        只看该作者  板凳
好啦,我自己搞定了:
2 C+ J# x: n( K5 Y1、小板子上执行 dmesg | grep mac,找到大致下面信息,发现mac地址的获取是通过rk_get_eth_addr这个函数。0 T+ `5 i1 M. _' x
rk_get_eth_addr: rk_vendor_read eth mac address failed (-1)4 J, X( v! ?( v% Z
rk_get_eth_addr: rk_vendor_write eth mac address failed (-1): @; j2 d3 ~) I1 ~" K6 s
rk_get_eth_addr: mac address: cc:10:ad:eb:70:55
- ?6 }: H4 s' b( C1 f2 k2、执行grep rk_get_eth_addr -r ./  定位rk_get_eth_addr函数在kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c文件里9 z+ z0 W( D0 g) L
3、找到这个函数,在if (ret != 6 || is_zero_ether_addr(addr)) {这段代码的后面加上这些内容:+ c; K% y1 y7 }3 \0 C5 r; ~
/*modified by woodrow*/8 |3 C1 N+ L3 V) P0 r
                union {* i' c- v. Y) ^1 `( r% |# _
                        unsigned long ul;4 M* s7 S7 Q% @+ B3 U0 M( }" p
                        unsigned char uc[8];  }8 K6 d  q9 ~# ^: q
                } cc;
' R5 J5 B! n1 I; X2 l# q* G$ }                //random_ether_addr(addr);' @" o& @) J1 L; q& ?' N# `- V
                // dev_err(dev, "%s: generate random eth mac address: %02x:%02x:%02x:%02x:%02x:%02x",- p  B5 L  i5 S% V+ G
                //                         __func__, addr[0], addr[1], addr[2],
' q5 L; f: v$ `4 b                //                         addr[3], addr[4], addr[5]);' m! _; I) [  x4 s6 c
                unsigned long system_low = (unsigned long)system_serial_low;
7 {- J$ {1 c0 t! e+ \% i4 q                unsigned long system_high = (unsigned long)system_serial_high;" e* f+ o3 ^, `* i+ ]$ E+ N% R/ F. d
                dev_err(dev, "%s: rk_vendor_read eth mac address failed (%d)", __func__, ret);  f4 C4 _' ]! Q9 p6 @4 Q
                dev_err(dev, "%s: system_serial_low (%lu), system_serial_high (%lu).\n", __func__, system_low, system_high);, X, K' \9 m* a- @3 h5 y
                cc.ul = system_low;: _) @. Q$ @% m
                addr[0] = 0xcc;
! n" Y, E+ m4 i- F, O: O                addr[1] = 0x10;5 A4 I7 [3 B: p0 |% }& R
                addr[2] = cc.uc[3];
& G9 c) ]' F* l                addr[3] = cc.uc[2];
! U' ^5 g5 b3 K& ~. l                addr[4] = cc.uc[1];
. g: j+ C$ W9 P. y) a                addr[5] = cc.uc[0];& t6 ]% p  ?0 d# }- t) X  ^/ u
/*modified by woodrow*/
" @! j( E. J* O8 z# \+ b+ r这段代码的用途是,当没有在vendor_storage里读到mac地址的时候,不是随机产生一个mac地址,而是将cpu序列号作为mac地址的一部分。cpu序列号:system_serial_low和system_serial_high是2个全局变量,需要引入头文件:#include <asm/system_info.h>才能使用。
回复

使用道具 举报

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

本版积分规则

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