Firefly开源社区

打印 上一主题 下一主题

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

31

积分

0

威望

0

贡献

技术小白

积分
31

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

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

Log2022-08-05.zip

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

回复

使用道具 举报

31

积分

0

威望

0

贡献

技术小白

积分
31
发表于 2022-8-10 15:10:28        只看该作者  沙发
问题没解决,我加您QQ了,请通过一下!: u) l. z% [( r  [2 F( a
回复

使用道具 举报

31

积分

0

威望

0

贡献

技术小白

积分
31
发表于 2022-8-11 11:37:08        只看该作者  板凳
好啦,我自己搞定了:
# G7 l& j8 s7 v) k1 j1、小板子上执行 dmesg | grep mac,找到大致下面信息,发现mac地址的获取是通过rk_get_eth_addr这个函数。. A; o2 o( _6 b; k1 e8 v* M
rk_get_eth_addr: rk_vendor_read eth mac address failed (-1)$ n% q) r' k& |, ^- q* c
rk_get_eth_addr: rk_vendor_write eth mac address failed (-1)
9 f! h4 W/ s) Z6 m4 h4 irk_get_eth_addr: mac address: cc:10:ad:eb:70:552 {( K" {# ~" z% |, v# s
2、执行grep rk_get_eth_addr -r ./  定位rk_get_eth_addr函数在kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c文件里7 Q8 G' n1 h; j. q/ ]3 Z
3、找到这个函数,在if (ret != 6 || is_zero_ether_addr(addr)) {这段代码的后面加上这些内容:; ?* I" @; k9 E
/*modified by woodrow*/
8 d* Y: [" E( I" [+ `                union {. {- _. g/ a2 B  N4 i  K9 U# G
                        unsigned long ul;% e" r5 x& ^0 a" W& f) @
                        unsigned char uc[8];! s0 h7 u( m  h5 _
                } cc;0 a0 |5 K8 Q9 ]1 h
                //random_ether_addr(addr);0 `+ B! A: p) D3 `$ h
                // dev_err(dev, "%s: generate random eth mac address: %02x:%02x:%02x:%02x:%02x:%02x",$ R2 Q& p# V* d; o5 T( D2 \
                //                         __func__, addr[0], addr[1], addr[2],7 b  d2 Z/ N# T
                //                         addr[3], addr[4], addr[5]);
; e9 w& J& |: ~8 E/ b0 _                unsigned long system_low = (unsigned long)system_serial_low;
# ?6 H; m' w9 T# o                unsigned long system_high = (unsigned long)system_serial_high;: a: u, \) Y0 f& d
                dev_err(dev, "%s: rk_vendor_read eth mac address failed (%d)", __func__, ret);
. y% [* @& y" ~5 U$ }                dev_err(dev, "%s: system_serial_low (%lu), system_serial_high (%lu).\n", __func__, system_low, system_high);
# @8 Y$ ?; B) B2 t                cc.ul = system_low;2 O. k% h1 F/ k3 r/ G! e
                addr[0] = 0xcc;
" a2 S0 H8 k' [- Z0 W& W                addr[1] = 0x10;
7 O5 V3 e4 P' I8 F                addr[2] = cc.uc[3];
2 }% M9 m" j1 [7 `! P$ D) R' I                addr[3] = cc.uc[2];2 P/ e$ _/ I& S6 b1 i1 N5 O
                addr[4] = cc.uc[1];
" V. h" \, F4 w                addr[5] = cc.uc[0];& r- n9 [% O& L1 S0 W
/*modified by woodrow*/2 F1 N) Y3 ^+ b2 u$ r: {
这段代码的用途是,当没有在vendor_storage里读到mac地址的时候,不是随机产生一个mac地址,而是将cpu序列号作为mac地址的一部分。cpu序列号:system_serial_low和system_serial_high是2个全局变量,需要引入头文件:#include <asm/system_info.h>才能使用。
回复

使用道具 举报

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

本版积分规则

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