Firefly开源社区

标题: 关于ubuntu每次启动MAC地址都发生变化的问题 [打印本页]

作者: woodrow_wang    时间: 2022-8-10 09:50
标题: 关于ubuntu每次启动MAC地址都发生变化的问题
刷了ubuntu18.04,每次启动MAC地址都会变化,下载了论坛里介绍的UpgradeDllTool和WNpctool,读写MAC地址都失败,不知道有什么办法没有。1 A# {/ @/ D- K  v% H" E
tchip_askquestions

Log2022-08-05.zip

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


作者: woodrow_wang    时间: 2022-8-10 15:10
问题没解决,我加您QQ了,请通过一下!1 j/ M5 ~/ c: {/ Z) J& H% h, Y

作者: woodrow_wang    时间: 2022-8-11 11:37
好啦,我自己搞定了:
/ P2 `/ K) _  g" U: ~8 A) y1、小板子上执行 dmesg | grep mac,找到大致下面信息,发现mac地址的获取是通过rk_get_eth_addr这个函数。7 P  X. n9 L+ y
rk_get_eth_addr: rk_vendor_read eth mac address failed (-1)5 T2 u3 |* J7 Y! Z  O
rk_get_eth_addr: rk_vendor_write eth mac address failed (-1)
, S) g) B/ D: {" A' irk_get_eth_addr: mac address: cc:10:ad:eb:70:55
6 g4 s. E% H8 T; F( ?( _6 k2 b  N2、执行grep rk_get_eth_addr -r ./  定位rk_get_eth_addr函数在kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c文件里) {) ], V- x, v4 ?, T* }. E
3、找到这个函数,在if (ret != 6 || is_zero_ether_addr(addr)) {这段代码的后面加上这些内容:
" O* ?, D5 s' E, N3 _, h/*modified by woodrow*/
' f4 Z4 H  o, j                union {8 Z* `/ W" ^* [: }
                        unsigned long ul;6 j0 C  y% r+ q* u% J
                        unsigned char uc[8];
- A3 S8 Q- u. Q! c8 z                } cc;
, S! S% ]6 ]; b2 o0 x2 E                //random_ether_addr(addr);
, |: x6 ]* P0 h$ C$ y- ~                // dev_err(dev, "%s: generate random eth mac address: %02x:%02x:%02x:%02x:%02x:%02x",9 U% @; S3 s% [7 K) ]
                //                         __func__, addr[0], addr[1], addr[2],
6 n) m* Y# _" e                //                         addr[3], addr[4], addr[5]);
! o- u7 M" m* F) ]3 f                unsigned long system_low = (unsigned long)system_serial_low;
1 V: g8 K  F# [4 Q                unsigned long system_high = (unsigned long)system_serial_high;  _4 B. m& i3 T8 ?, t3 _
                dev_err(dev, "%s: rk_vendor_read eth mac address failed (%d)", __func__, ret);
6 _6 Y) r$ q/ j: m/ \! ^                dev_err(dev, "%s: system_serial_low (%lu), system_serial_high (%lu).\n", __func__, system_low, system_high);
4 N5 ?4 S$ ~0 e$ x' s                cc.ul = system_low;2 s( }+ K# G! l( V
                addr[0] = 0xcc;
5 b7 b& v: S: `                addr[1] = 0x10;
+ l3 Q- H  n8 D3 S! u' i/ L                addr[2] = cc.uc[3];
; X' E. h0 k3 [4 [1 _" p                addr[3] = cc.uc[2];( E  P; e: D* A- d; J% D7 f
                addr[4] = cc.uc[1];. }7 O4 c, j. e  O. |' ]
                addr[5] = cc.uc[0];: Z3 t+ a5 C. {$ w$ e1 K# l
/*modified by woodrow*/
3 O" ~' G. R' X这段代码的用途是,当没有在vendor_storage里读到mac地址的时候,不是随机产生一个mac地址,而是将cpu序列号作为mac地址的一部分。cpu序列号:system_serial_low和system_serial_high是2个全局变量,需要引入头文件:#include <asm/system_info.h>才能使用。




欢迎光临 Firefly开源社区 (https://dev.t-firefly.com/) Powered by Discuz! X3.1