Firefly开源社区

打印 上一主题 下一主题

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

31

积分

0

威望

0

贡献

技术小白

积分
31

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

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

Log2022-08-05.zip

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

回复

使用道具 举报

31

积分

0

威望

0

贡献

技术小白

积分
31
发表于 2022-8-10 15:10:28        只看该作者  沙发
问题没解决,我加您QQ了,请通过一下!6 A5 M6 f  M/ x5 t% D8 b
回复

使用道具 举报

31

积分

0

威望

0

贡献

技术小白

积分
31
发表于 2022-8-11 11:37:08        只看该作者  板凳
好啦,我自己搞定了:7 o; D3 H4 u6 x* y2 s$ d! G3 V
1、小板子上执行 dmesg | grep mac,找到大致下面信息,发现mac地址的获取是通过rk_get_eth_addr这个函数。# F5 Z; ]! b; Z. ~( V
rk_get_eth_addr: rk_vendor_read eth mac address failed (-1)' a) {9 Q* I6 R4 w
rk_get_eth_addr: rk_vendor_write eth mac address failed (-1); Y1 ]$ g  x7 g) n7 h
rk_get_eth_addr: mac address: cc:10:ad:eb:70:55
% p& u# o  ~* r2、执行grep rk_get_eth_addr -r ./  定位rk_get_eth_addr函数在kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c文件里( e4 Y1 x4 i, c. k) L( F& G! [2 S
3、找到这个函数,在if (ret != 6 || is_zero_ether_addr(addr)) {这段代码的后面加上这些内容:% A( u) b% Y: i# Q" r# r
/*modified by woodrow*/9 l# }: ]& D& X% F
                union {
6 [. t( h; L5 U                        unsigned long ul;* V  P) Z8 b6 Z
                        unsigned char uc[8];
% N4 G0 b  j- Z  O& V                } cc;
% T4 r! z  h* u  V                //random_ether_addr(addr);1 N* H9 W+ ]% {- C3 Q/ z
                // dev_err(dev, "%s: generate random eth mac address: %02x:%02x:%02x:%02x:%02x:%02x",7 x8 j7 O( ~9 q
                //                         __func__, addr[0], addr[1], addr[2],7 Q) _7 U" @0 S7 x3 `8 g6 E* ~$ F
                //                         addr[3], addr[4], addr[5]);
# L  F7 \$ \7 N9 Y5 a: D& p4 ^                unsigned long system_low = (unsigned long)system_serial_low;
) o5 u& o1 X  G                unsigned long system_high = (unsigned long)system_serial_high;
! D' L" Q8 r/ s. C& e9 [# t                dev_err(dev, "%s: rk_vendor_read eth mac address failed (%d)", __func__, ret);- N% w4 f+ v& _, b% u& @! z7 _
                dev_err(dev, "%s: system_serial_low (%lu), system_serial_high (%lu).\n", __func__, system_low, system_high);3 v- y5 D( I7 c5 _; L
                cc.ul = system_low;
8 e  C3 F; @3 {! X9 F; o4 e+ c                addr[0] = 0xcc;
3 R6 J# I% T/ O$ n! T) P. _3 F# m2 e                addr[1] = 0x10;
/ l/ E) G+ g* J' Y! T                addr[2] = cc.uc[3];
* n; y, F0 h0 r# m! y                addr[3] = cc.uc[2];# Q6 U+ y0 I: B' }0 r
                addr[4] = cc.uc[1];& B! `( |8 V# A1 a" n- C* o- k* D" ?: {
                addr[5] = cc.uc[0];
1 Z( b- I* K- a, s! ]/*modified by woodrow*/# L% c- j% w7 X9 R# B. {6 R' ^+ F
这段代码的用途是,当没有在vendor_storage里读到mac地址的时候,不是随机产生一个mac地址,而是将cpu序列号作为mac地址的一部分。cpu序列号:system_serial_low和system_serial_high是2个全局变量,需要引入头文件:#include <asm/system_info.h>才能使用。
回复

使用道具 举报

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

本版积分规则

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