Firefly开源社区

打印 上一主题 下一主题

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

31

积分

0

威望

0

贡献

技术小白

积分
31

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

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

Log2022-08-05.zip

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

回复

使用道具 举报

31

积分

0

威望

0

贡献

技术小白

积分
31
发表于 2022-8-10 15:10:28        只看该作者  沙发
问题没解决,我加您QQ了,请通过一下!
+ B  O# Q  l/ [( ?
回复

使用道具 举报

31

积分

0

威望

0

贡献

技术小白

积分
31
发表于 2022-8-11 11:37:08        只看该作者  板凳
好啦,我自己搞定了:
" v5 Y! d9 Q- y( j6 n& N9 ?1、小板子上执行 dmesg | grep mac,找到大致下面信息,发现mac地址的获取是通过rk_get_eth_addr这个函数。
% X' V9 W! E5 Y3 R. d+ ~, h9 M8 T. Crk_get_eth_addr: rk_vendor_read eth mac address failed (-1)
  m" T& g. O3 G1 X( V. W1 L+ \rk_get_eth_addr: rk_vendor_write eth mac address failed (-1)
2 ^0 W4 \$ }% F1 ]rk_get_eth_addr: mac address: cc:10:ad:eb:70:55  B, }; U# g, [0 x5 z1 M
2、执行grep rk_get_eth_addr -r ./  定位rk_get_eth_addr函数在kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c文件里
+ D3 p8 O  z9 C4 o3 f2 L5 f3、找到这个函数,在if (ret != 6 || is_zero_ether_addr(addr)) {这段代码的后面加上这些内容:* [  y9 O# k% H' x
/*modified by woodrow*/
, L7 a3 _! b3 |8 u6 O! y( @5 C                union {
( h! H5 n0 j" Z! O- o( r- V3 C                        unsigned long ul;
4 t/ [% Z9 E' D5 Q$ X* n                        unsigned char uc[8];
) _5 B1 s3 R) p( H2 H                } cc;
0 `5 K; u* V5 [6 g3 |' d; |1 b5 q                //random_ether_addr(addr);
' M6 v# R0 ]+ F5 l' ~6 H2 P, ^                // dev_err(dev, "%s: generate random eth mac address: %02x:%02x:%02x:%02x:%02x:%02x",  c8 E' C5 r4 M& Z, B% E1 L
                //                         __func__, addr[0], addr[1], addr[2],
; f! ^$ C. ~& \/ F                //                         addr[3], addr[4], addr[5]);9 S9 R. w/ p4 {0 x9 j! |# T, ~7 u
                unsigned long system_low = (unsigned long)system_serial_low;
/ E5 ?* n- G* h$ K$ |                unsigned long system_high = (unsigned long)system_serial_high;
  P- N! A8 F( _7 t' K& B                dev_err(dev, "%s: rk_vendor_read eth mac address failed (%d)", __func__, ret);
" y/ S( ^& r3 M: T# w) G1 n% }# b1 e                dev_err(dev, "%s: system_serial_low (%lu), system_serial_high (%lu).\n", __func__, system_low, system_high);; R9 m* X  K1 ~- ~
                cc.ul = system_low;
! L  |: S' z2 |$ K1 h$ S. c                addr[0] = 0xcc;
2 F# g2 J9 L# q# a% b( P/ h: K8 I                addr[1] = 0x10;/ v: |( Y( v# D
                addr[2] = cc.uc[3];- t6 ]  F  K3 P3 n- s
                addr[3] = cc.uc[2];) }3 v/ r; f; }( r- p1 c  C
                addr[4] = cc.uc[1];; V0 K" e% Y$ P" V5 o3 v
                addr[5] = cc.uc[0];. K( W" n9 r6 u
/*modified by woodrow*/
2 e6 ]( \$ v2 ~8 Q# v" y; S9 U这段代码的用途是,当没有在vendor_storage里读到mac地址的时候,不是随机产生一个mac地址,而是将cpu序列号作为mac地址的一部分。cpu序列号:system_serial_low和system_serial_high是2个全局变量,需要引入头文件:#include <asm/system_info.h>才能使用。
回复

使用道具 举报

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

本版积分规则

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