Firefly开源社区

打印 上一主题 下一主题

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

31

积分

0

威望

0

贡献

技术小白

积分
31

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

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

Log2022-08-05.zip

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

回复

使用道具 举报

31

积分

0

威望

0

贡献

技术小白

积分
31
发表于 2022-8-10 15:10:28        只看该作者  沙发
问题没解决,我加您QQ了,请通过一下!
; A9 ?5 ?% o) K) K7 u
回复

使用道具 举报

31

积分

0

威望

0

贡献

技术小白

积分
31
发表于 2022-8-11 11:37:08        只看该作者  板凳
好啦,我自己搞定了:7 p; a; L7 d* j
1、小板子上执行 dmesg | grep mac,找到大致下面信息,发现mac地址的获取是通过rk_get_eth_addr这个函数。
& m2 ?% b  n9 n$ nrk_get_eth_addr: rk_vendor_read eth mac address failed (-1)8 r5 ~5 l1 c' d) ?4 P  q/ L
rk_get_eth_addr: rk_vendor_write eth mac address failed (-1)/ U5 R2 y2 H' J
rk_get_eth_addr: mac address: cc:10:ad:eb:70:55
) {1 n$ B0 y+ H* j' D- B2、执行grep rk_get_eth_addr -r ./  定位rk_get_eth_addr函数在kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c文件里
" O* g, H5 _8 F) z# E# `1 d9 {3、找到这个函数,在if (ret != 6 || is_zero_ether_addr(addr)) {这段代码的后面加上这些内容:
( z! ]" e6 m6 {7 N* p: ^/*modified by woodrow*/
( o+ F2 X0 p% Q+ V* Q  P                union {2 `) n4 T2 o# b/ O
                        unsigned long ul;! y+ Y9 T* \7 |/ g
                        unsigned char uc[8];/ S' T, Z5 D+ ^5 J2 v
                } cc;$ [2 G, E# F4 c! t5 S% c8 C
                //random_ether_addr(addr);9 Q. ]! H2 y3 T$ [0 F
                // dev_err(dev, "%s: generate random eth mac address: %02x:%02x:%02x:%02x:%02x:%02x",3 K2 ]9 k: [: i( R5 K: L& [& h* F
                //                         __func__, addr[0], addr[1], addr[2],
0 A" z3 k4 B* U# t) L( i                //                         addr[3], addr[4], addr[5]);
8 f5 k2 n. @% d/ g                unsigned long system_low = (unsigned long)system_serial_low;
' T# m1 r8 g8 N                unsigned long system_high = (unsigned long)system_serial_high;0 ~, D; ?: Y( Y) Z- r% g
                dev_err(dev, "%s: rk_vendor_read eth mac address failed (%d)", __func__, ret);# g( O  J! f" T5 p3 T2 V1 {
                dev_err(dev, "%s: system_serial_low (%lu), system_serial_high (%lu).\n", __func__, system_low, system_high);1 m; @: v# {# o! X$ X1 }
                cc.ul = system_low;$ j' ?9 x( f: z, q
                addr[0] = 0xcc;2 h1 Z" F. b4 S' Z0 c! O
                addr[1] = 0x10;2 d# ^7 u& @2 F4 s  a
                addr[2] = cc.uc[3];
* w$ l1 \" k* B5 x                addr[3] = cc.uc[2];
" v8 U8 S& b0 F1 C* ^  `8 Q" Y2 f, D                addr[4] = cc.uc[1];
7 F( C; F! N5 Z+ |1 R* @" `% [                addr[5] = cc.uc[0];" E9 M1 \* X2 |  |; x- m( Q
/*modified by woodrow*/! r1 P; Y8 y: w3 {0 u! B' J
这段代码的用途是,当没有在vendor_storage里读到mac地址的时候,不是随机产生一个mac地址,而是将cpu序列号作为mac地址的一部分。cpu序列号:system_serial_low和system_serial_high是2个全局变量,需要引入头文件:#include <asm/system_info.h>才能使用。
回复

使用道具 举报

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

本版积分规则

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