Firefly开源社区

打印 上一主题 下一主题

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

31

积分

0

威望

0

贡献

技术小白

积分
31

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

发表于 2022-8-10 09:50:25      浏览:3317 | 回复:2        打印     [复制链接] 楼主
问题描述及复现步骤:
刷了ubuntu18.04,每次启动MAC地址都会变化,下载了论坛里介绍的UpgradeDllTool和WNpctool,读写MAC地址都失败,不知道有什么办法没有。3 J2 ]: O; m: q0 P# C8 j2 S

Log2022-08-05.zip

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

回复

使用道具 举报

31

积分

0

威望

0

贡献

技术小白

积分
31
发表于 2022-8-10 15:10:28      沙发
问题没解决,我加您QQ了,请通过一下!
) C$ K' \3 I, M. _
回复

使用道具 举报

31

积分

0

威望

0

贡献

技术小白

积分
31
发表于 2022-8-11 11:37:08      板凳
好啦,我自己搞定了:
& c# Q; x4 {  M9 u$ K( w; n4 I2 R1、小板子上执行 dmesg | grep mac,找到大致下面信息,发现mac地址的获取是通过rk_get_eth_addr这个函数。
1 w! z6 V2 K' L3 D# m6 r6 hrk_get_eth_addr: rk_vendor_read eth mac address failed (-1)
0 Y0 d) {5 ^6 m2 t+ w) l. erk_get_eth_addr: rk_vendor_write eth mac address failed (-1)
( M8 h: J- b: V, Crk_get_eth_addr: mac address: cc:10:ad:eb:70:55
, _4 M' E( r9 A7 I4 m9 H2、执行grep rk_get_eth_addr -r ./  定位rk_get_eth_addr函数在kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c文件里9 k8 V1 q$ T. M4 s2 f/ @
3、找到这个函数,在if (ret != 6 || is_zero_ether_addr(addr)) {这段代码的后面加上这些内容:. J3 s; P+ s' z0 r: b
/*modified by woodrow*/
& [% D; ?3 c& g- Z/ r                union {
& p- [: E5 E. f                        unsigned long ul;
7 }/ V  ^5 [9 w, x$ L& }                        unsigned char uc[8];: E. z4 i' H! A! m2 X6 ~
                } cc;
9 u4 q. j0 g0 r4 V+ Z! c                //random_ether_addr(addr);
7 G, P5 R  L! R  P, X( p0 T                // dev_err(dev, "%s: generate random eth mac address: %02x:%02x:%02x:%02x:%02x:%02x",/ @4 a3 A  @% q8 w5 v: K; }& |
                //                         __func__, addr[0], addr[1], addr[2],4 U# a# j0 Z, C# R  a
                //                         addr[3], addr[4], addr[5]);
1 w. ^% r+ k% s/ D4 _( f5 n2 l                unsigned long system_low = (unsigned long)system_serial_low;
; ^1 x' ^' T/ {1 u, k1 g                unsigned long system_high = (unsigned long)system_serial_high;7 ]$ a# r1 q+ v
                dev_err(dev, "%s: rk_vendor_read eth mac address failed (%d)", __func__, ret);
" ]! _: V  p7 R7 \                dev_err(dev, "%s: system_serial_low (%lu), system_serial_high (%lu).\n", __func__, system_low, system_high);
! t" R5 d, C- }  |2 C* ], o0 U1 L                cc.ul = system_low;. B; O# |: t( Q) Q
                addr[0] = 0xcc;1 I! j1 f9 N: [, I* z
                addr[1] = 0x10;
: _( S/ \0 @) L$ Z. y  U' N                addr[2] = cc.uc[3];4 I8 `* q: f- K* E' |% S, u
                addr[3] = cc.uc[2];" B* {; T# n+ @$ |4 _
                addr[4] = cc.uc[1];
/ ]6 y- L/ v# v! ?$ O" X4 p+ Z                addr[5] = cc.uc[0];8 k/ f5 T: ~7 G, }7 I7 x
/*modified by woodrow*/
6 N; `& A+ J9 g: {( j这段代码的用途是,当没有在vendor_storage里读到mac地址的时候,不是随机产生一个mac地址,而是将cpu序列号作为mac地址的一部分。cpu序列号:system_serial_low和system_serial_high是2个全局变量,需要引入头文件:#include <asm/system_info.h>才能使用。
回复

使用道具 举报

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

本版积分规则

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