Firefly开源社区

打印 上一主题 下一主题

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

31

积分

0

威望

0

贡献

技术小白

积分
31

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

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

Log2022-08-05.zip

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

回复

使用道具 举报

31

积分

0

威望

0

贡献

技术小白

积分
31
发表于 2022-8-10 15:10:28        只看该作者  沙发
问题没解决,我加您QQ了,请通过一下!, H6 I0 b2 f% n3 x3 g# b8 W
回复

使用道具 举报

31

积分

0

威望

0

贡献

技术小白

积分
31
发表于 2022-8-11 11:37:08        只看该作者  板凳
好啦,我自己搞定了:4 A) K" u9 F- F9 \! ?. `5 q
1、小板子上执行 dmesg | grep mac,找到大致下面信息,发现mac地址的获取是通过rk_get_eth_addr这个函数。3 D7 _# H# P3 }+ b
rk_get_eth_addr: rk_vendor_read eth mac address failed (-1)" f' }3 w* Y1 S  a$ S& J, u
rk_get_eth_addr: rk_vendor_write eth mac address failed (-1): ~; n/ J1 G) k' `) s# M
rk_get_eth_addr: mac address: cc:10:ad:eb:70:55
. K4 T; O9 v5 v1 y+ Y7 a2、执行grep rk_get_eth_addr -r ./  定位rk_get_eth_addr函数在kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c文件里5 B  y  x, Q' c4 g
3、找到这个函数,在if (ret != 6 || is_zero_ether_addr(addr)) {这段代码的后面加上这些内容:/ c: J9 K" s( e
/*modified by woodrow*/( e9 D3 R4 `& J  g6 F
                union {& @. G9 u5 ]) \  d$ V# \' w. p
                        unsigned long ul;# h! l* f; N5 r4 N) W% f
                        unsigned char uc[8];
) l& w2 W3 A* O) d                } cc;6 }0 e  Y3 \7 n; X# S
                //random_ether_addr(addr);
; O- X3 e; e3 O% r- @, E                // dev_err(dev, "%s: generate random eth mac address: %02x:%02x:%02x:%02x:%02x:%02x",
- h% |- p/ r" E7 g                //                         __func__, addr[0], addr[1], addr[2],
# c. I) t/ A' q& q% u1 g- G                //                         addr[3], addr[4], addr[5]);& h3 j+ m- q# [! I2 ?- M
                unsigned long system_low = (unsigned long)system_serial_low;
& ^/ E+ |0 X0 [: R                unsigned long system_high = (unsigned long)system_serial_high;! c& Q0 O* {; \! m
                dev_err(dev, "%s: rk_vendor_read eth mac address failed (%d)", __func__, ret);
' Z0 I, k2 f9 l: E                dev_err(dev, "%s: system_serial_low (%lu), system_serial_high (%lu).\n", __func__, system_low, system_high);
- `3 M" I: X$ c' W, t( X                cc.ul = system_low;
1 i' m9 T  Y! D' `$ G* E# ]7 S                addr[0] = 0xcc;
4 B8 [% o5 B! `; W9 Z  P                addr[1] = 0x10;4 D) t+ b. J% p* e+ F5 |
                addr[2] = cc.uc[3];
% S9 F% F: v: A; }. I- W                addr[3] = cc.uc[2];
8 H# @- i  [9 X% k8 {) y& l                addr[4] = cc.uc[1];
# F- u; e& V" g4 }9 r! [                addr[5] = cc.uc[0];
& @, A! p4 _' V5 Y3 C/*modified by woodrow*/: C$ J" Y; h7 o
这段代码的用途是,当没有在vendor_storage里读到mac地址的时候,不是随机产生一个mac地址,而是将cpu序列号作为mac地址的一部分。cpu序列号:system_serial_low和system_serial_high是2个全局变量,需要引入头文件:#include <asm/system_info.h>才能使用。
回复

使用道具 举报

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

本版积分规则

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