热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【openwrt】设备mt7628关于wan侧eth0.1mac地址固定的问题

本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。

openwrt-17.01在mt7628上初始化启动时,eth0的mac地址总是随机生成,

mtk_soc_eth 10100000.ethernet: generated random MAC address e6:d7:5d:88:8c:8f
mtk_soc_eth
10100000.ethernet eth0: mediatek frame engine at 0xb0100000, irq 5

每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下面

root@LEDE:/# cat sys/class/net/eth0/address
e6:d7:5d:
88:8c:8f

openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址,再生成eth0.1,eth0.2......,生成后的mac地址会保存再/etc/config/network下

root@LEDE:/etc/config# cat network config interface 'loopback'option ifname 'lo'option proto 'static'option ipaddr '127.0.0.1'option netmask '255.0.0.0'config globals 'globals'option ula_prefix 'fd59:fc20:6dd9::/48'config interface 'wan'option ifname 'eth0.1'option proto 'dhcp'config device 'wan_dev'option name 'eth0.1'option macaddr '00:1e:73:6e:5a:95'config interface 'wan6'option ifname 'eth0.1'option proto 'dhcpv6'config interface 'lan'option type 'bridge'option ifname 'eth0.2'option proto 'static'option ipaddr '192.168.1.1'option netmask '255.255.255.0'option ip6assign '60'config device 'lan_dev'option name 'eth0.2'option macaddr '00:1e:73:6e:5a:94'config switchoption name 'switch0'option reset '1'option enable_vlan '1'config switch_vlanoption device 'switch0'option vlan '1'option ports '0 6t'config switch_vlanoption device 'switch0'option vlan '2'option ports '2 3 6t'

这也就导致:一旦设备恢复出厂设置,eth0.1,eth0.2等的mac就会丢失,随eth0随机生成的新值变动。

如果设备所在局域网内的环境时根据mac分配IP地址的话,这样就会很麻烦,所以有这样一个需求:

设备每次启动,不管是重启还是恢复出厂,设备的wan 或者 lan侧的mac地址都会根据烧写好在factory区域的值读取出来应用。

 

所以我们的解决方案就是在每次启动时,将factory区写好的值读取出来,然后在生成/etc/config/network时,将之写进去。

openwrt的/etc/config下的文件,都是动态生成的,uci-defaults.sh会生成默认的/etc/config下的文件,脚本的函数定义在/package/base-files/files/lib/functions中,这里我们主要看一下生成network文件的内容:

ucidef_set_interface_lan() {json_select_object network_ucidef_set_interface lan "$@"json_select ..
}ucidef_set_interface_wan() {json_select_object network_ucidef_set_interface wan
"$@"json_select ..
}ucidef_set_interfaces_lan_wan() {local lan_if
="$1"local wan_if="$2"json_select_object network_ucidef_set_interface lan "$lan_if"_ucidef_set_interface wan "$wan_if"json_select ..
}ucidef_set_interface_raw() {json_select_object network_ucidef_set_interface
"$@"json_select ..
}_ucidef_add_switch_port() {# inherited: $num $device $need_tag $want_untag $role $index $prev_role# inherited: $n_cpu $n_ports $n_vlan $cpu0 $cpu1 $cpu2 $cpu3 $cpu4 $cpu5n_ports
=$((n_ports + 1))json_select_array portsjson_add_objectjson_add_int num "$num"[ -n "$device" ] && json_add_string device "$device"[ -n "$need_tag" ] && json_add_boolean need_tag "$need_tag"[ -n "$want_untag" ] && json_add_boolean want_untag "$want_untag"[ -n "$role" ] && json_add_string role "$role"[ -n "$index" ] && json_add_int index "$index"json_close_objectjson_select ..# record pointer to cpu entry for lookup in _ucidef_finish_switch_roles()[ -n "$device" ] && {export "cpu$n_cpu=$n_ports"n_cpu=$((n_cpu + 1))}# create/append object to role list[ -n "$role" ] && {json_select_array rolesif [ "$role" != "$prev_role" ]; thenjson_add_objectjson_add_string role "$role"json_add_string ports "$num"json_close_objectprev_role="$role"n_vlan=$((n_vlan + 1))elsejson_select_object "$n_vlan"json_get_var port portsjson_add_string ports "$port $num"json_select ..fijson_select ..}
}_ucidef_finish_switch_roles() {# inherited: $name $n_cpu $n_vlan $cpu0 $cpu1 $cpu2 $cpu3 $cpu4 $cpu5local index role roles num device need_tag want_untag port portsjson_select
switchjson_select "$name"json_get_keys roles rolesjson_select ..json_select ..for index in $roles; doeval "port=\$cpu$(((index - 1) % n_cpu))"json_select switchjson_select "$name"json_select portsjson_select "$port"json_get_vars num device need_tag want_untagjson_select ..json_select ..if [ $n_vlan -gt $n_cpu -o ${need_tag:-0} -eq 1 ]; thennum="${num}t"device="${device}.${index}"fijson_select rolesjson_select "$index"json_get_vars role portsjson_add_string ports "$ports $num"json_add_string device "$device"json_select ..json_select ..json_select ..json_select ..json_select_object networklocal devicesjson_select_object "$role"# attach previous interfaces (for multi-switch devices)json_get_var devices ifnameif ! list_contains devices "$device"; thendevices="${devices:+$devices }$device"fijson_select .._ucidef_set_interface "$role" "$devices"json_select ..done
}ucidef_add_switch() {local name
="$1"; shiftlocal port num role device index need_tag prev_rolelocal cpu0 cpu1 cpu2 cpu3 cpu4 cpu5local n_cpu=0 n_vlan=0 n_ports=0json_select_object switchjson_select_object "$name"json_add_boolean enable 1json_add_boolean reset 1for port in "$@"; docase "$port" in[0-9]*@*)num="${port%%@*}"device="${port##*@}"need_tag=0want_untag=0[ "${num%t}" != "$num" ] && {num="${num%t}"need_tag=1}[ "${num%u}" != "$num" ] && {num="${num%u}"want_untag=1};;[0-9]*:*:[0-9]*)num="${port%%:*}"index="${port##*:}"role="${port#[0-9]*:}"; role="${role%:*}";;[0-9]*:*)num="${port%%:*}"role="${port##*:}";;esacif [ -n "$num" ] && [ -n "$device$role" ]; then_ucidef_add_switch_portfiunset num device role index need_tag want_untagdonejson_select ..json_select .._ucidef_finish_switch_roles
}ucidef_add_switch_attr() {local name
="$1"local key="$2"local val="$3"json_select_object switchjson_select_object "$name"case "$val" intrue|false) [ "$val" != "true" ]; json_add_boolean "$key" $? ;;[0-9]) json_add_int "$key" "$val" ;;*) json_add_string "$key" "$val" ;;esacjson_select ..json_select ..
}ucidef_add_switch_port_attr() {local name
="$1"local port="$2"local key="$3"local val="$4"local ports i numjson_select_object switchjson_select_object "$name"json_get_keys ports portsjson_select_array portsfor i in $ports; dojson_select "$i"json_get_var num numif [ -n "$num" ] && [ $num -eq $port ]; thenjson_select_object attrcase "$val" intrue|false) [ "$val" != "true" ]; json_add_boolean "$key" $? ;;[0-9]) json_add_int "$key" "$val" ;;*) json_add_string "$key" "$val" ;;esacjson_select ..fijson_select ..donejson_select ..json_select ..json_select ..
}ucidef_set_interface_macaddr() {local network
="$1"local macaddr="$2"json_select_object networkjson_select "$network"[ $? -eq 0 ] || {json_select ..return}json_add_string macaddr "$macaddr"json_select ..json_select ..
}ucidef_add_atm_bridge() {local vpi
="$1"local vci="$2"local encaps="$3"local payload="$4"json_select_object dsljson_select_object atmbridgejson_add_int vpi "$vpi"json_add_int vci "$vci"json_add_string encaps "$encaps"json_add_string payload "$payload"json_select ..json_select ..
}

生成wan,lan侧mac的代码如下:

ucidef_set_interface_macaddr() {local network="$1"local macaddr="$2"json_select_object networkjson_select "$network"[ $? -eq 0 ] || {json_select ..return}json_add_string macaddr "$macaddr"json_select ..json_select ..
}

ucidef_set_interface_macaddr()函数其实是由\target\linux\ramips\base-files\etc\board.d\02_network调用,内容如下(其他型号的board已去掉)

#!/bin/sh. /lib/functions.sh
.
/lib/ramips.sh
.
/lib/functions/uci-defaults.sh
.
/lib/functions/system.shramips_setup_rt3x5x_vlans()
{
if [ ! -x /sbin/swconfig ]; then# legacy defaultucidef_set_interfaces_lan_wan "eth0.1" "eth0.2"returnfilocal wanports=""local lanports=""for port in 5 4 3 2 1 0; doif [ `swconfig dev rt305x port $port get disable` = "1" ]; thencontinuefiif [ `swconfig dev rt305x port $port get lan` = "0" ]; thenwanports="$port:wan $wanports"elselanports="$port:lan $lanports"fidoneucidef_add_switch "rt305x" $lanports $wanports "6t@eth0"
}ramips_setup_interfaces()
{local board
="$1"case $board inmt7628)ucidef_add_switch "switch0" \"0:wan" "2:lan" "3:lan" "6@eth0";;*)RT3X5X=`cat /proc/cpuinfo | egrep "(RT3.5|RT5350)"`if [ -n "${RT3X5X}" ]; thenramips_setup_rt3x5x_vlanselseucidef_set_interfaces_lan_wan "eth0.1" "eth0.2"fi;;esac
}ramips_setup_macs()
{local board
="$1"local lan_mac=""local wan_mac=""case $board inmt7628)lan_mac=$(hexdump -v -s 0x28 -n 6 -e '2/1 "%02x:"' /dev/mtd2)wan_mac=$(hexdump -v -s 0x2e -n 6 -e '2/1 "%02x:"' /dev/mtd2)[ -n "$lan_mac" ] && ucidef_set_interface_macaddr "lan" ${lan_mac%:}[ -n "$wan_mac" ] && ucidef_set_interface_macaddr "wan" ${wan_mac%:};;*)lan_mac=$(cat /sys/class/net/eth0/address)wan_mac=$(macaddr_add "$lan_mac" 1)[ -n "$lan_mac" ] && ucidef_set_interface_macaddr "lan" $lan_mac[ -n "$wan_mac" ] && ucidef_set_interface_macaddr "wan" $wan_mac;;esac}board_config_update
board
=$(ramips_board_name)
ramips_setup_interfaces $board
ramips_setup_macs $board
board_config_flushexit
0

这里面就很清楚了,原先openwrt的SDK是直接调用

lan_mac=$(mtd_get_mac_binary factory 40)
wan_mac
=$(mtd_get_mac_binary factory 46)

40和46对应的十六进制数就是lan和wan的偏移量0x28和0x2E,但是这样的修改没有用,lan_mac,wam_mac还是根据eth0生成,所以我们直接读取factory里面的值:

lan_mac=$(hexdump -v -s 0x28 -n 6 -e '2/1 "%02x:"' /dev/mtd2)
wan_mac
=$(hexdump -v -s 0x2e -n 6 -e '2/1 "%02x:"' /dev/mtd2)
[
-n "$lan_mac" ] && ucidef_set_interface_macaddr "lan" ${lan_mac%:}
[
-n "$wan_mac" ] && ucidef_set_interface_macaddr "wan" ${wan_mac%:}

Done。

 

转:https://www.cnblogs.com/yeanz/p/11177959.html



推荐阅读
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 图片复制到服务器 方向变了_双服务器热备更新配置文件步骤问题及解决方法
    本文介绍了在将图片复制到服务器并进行方向变换的过程中,双服务器热备更新配置文件所出现的问题及解决方法。通过停止所有服务、更新配置、重启服务等操作,可以避免数据中断和操作不规范导致的问题。同时还提到了注意事项,如Avimet版本的差异以及配置文件和批处理文件的存放路径等。通过严格执行切换步骤,可以成功进行更新操作。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文总结了在开发中使用gulp时的一些技巧,包括如何使用gulp.dest自动创建目录、如何使用gulp.src复制具名路径的文件以及保留文件夹路径的方法等。同时介绍了使用base选项和通配符来保留文件夹路径的技巧,并提到了解决带文件夹的复制问题的方法,即使用gulp-flatten插件。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
author-avatar
jp85201
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有