blob: 9affbce429df91e3e20df2e31b4fdfc09513aa16 [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001#!/bin/sh
2. /lib/functions.sh
3
4lookup_macaddr() {
5 local found=0
6
7 __lookup_macaddr() {
8 config_get macaddr $1 macaddr
9 [ -n "$macaddr" ] && found=1
10 }
11
12 config_load wireless
13 config_foreach __lookup_macaddr wifi-iface
14 return $found
15}
16
17#
18# Set the MAC address from MRD, if not exist generate
19# randomly and save it
20#
21set_wifi_if_mac() {
22 local _ifname rootif save_name gen_mac
23
24 config_get _ifname $1 ifname
25 case $_ifname in
26 *-vxd)
27 # VXD use same macaddr from root interface
28 rootif=${_ifname%-vxd*}
29 rootif=s_${rootif//[^0-9,a-z,A-Z]/_}
30 eval wifimac=\${wifimac_${rootif}}
31 gen_mac=1
32 ;;
33 *-va[0-9])
34 # VA generate mac from root interface
35 rootif=${_ifname%-va*}
36 rootif=s_${rootif//[^0-9,a-z,A-Z]/_}
37 eval wifimac=\${wifimac_${rootif}}
38 wifimac=${wifimac%:*}
39 wifimac=${wifimac}:`eval $RANDOM`
40 gen_mac=1
41 ;;
42 *)
43 gen_mac=0
44 wifimac=
45 ;;
46 esac
47
48 # variable name should not has "-", make a change here
49 save_name=s_${_ifname//[^0-9,a-z,A-Z]/_}
50 [ -n "$wifimac_left" -a "$gen_mac" == "0" ] && {
51 eval wifimac=\${wifimac_${save_name}}
52 if [ "$wifimac" == "" ]; then
53 wifimac_left=$(echo ${wifimac_left} | sed 's/^[ \t]*//g')
54 wifimac_left=$(echo ${wifimac_left} | sed 's/[ \t]*$//g')
55 wifimac=${wifimac_left%% *}
56 wifimac_left=${wifimac_left}" "
57 wifimac_left=${wifimac_left#* }
58 eval wifimac_${save_name}=\${wifimac}
59 else
60 wifimac=${wifimac%:*}
61 wifimac=${wifimac}:`eval $RANDOM`
62 fi
63 }
64
65 [ -z "$wifimac" ] && {
66 eval wifimac=\${wifimac_${save_name}}
67 if [ "$wifimac" == "" ]; then
68 wifimac=00:`eval $RANDOM`:`eval $RANDOM`:`eval $RANDOM`:`eval $RANDOM`:`eval $RANDOM`
69 eval wifimac_${save_name}=\${wifimac}
70 else
71 wifimac=${wifimac%:*}
72 wifimac=${wifimac}:`eval $RANDOM`
73 fi
74 echo "$wifimac_file not exist, create it with random address: $wifimac"
75 }
76
77 uci_set wireless_tmp $1 macaddr $wifimac
78}
79
80wlan_fixup_wifi_iface() {
81 local wifimac_file="/NVM/wifi_addr"
82
83 __wlan_fixup_wifi_iface() {
84 local _ssid _macaddr
85
86 config_get mode $1 mode
87 config_get ssid $1 ssid
88
89 set_wifi_if_mac $1
90 [ "$mode" == "ap" ] && {
91 FILTER_MAC="echo \$wifimac | sed 's/://g'"
92 _macaddr=`eval ${FILTER_MAC}`
93 _macaddr=${_macaddr:8:4}
94 _ssid=${ssid%%#[0-9,a-f][0-9,a-f][0-9,a-f][0-9,a-f]}#${_macaddr}
95 uci_set wireless_tmp $1 ssid $_ssid
96 }
97 }
98
99 wifimac_left=`cat $wifimac_file 2>/dev/null`
100 RANDOM="head /dev/urandom | tr -dc "0123456789abcdef" | head -c2"
101
102 config_load wireless_tmp
103 config_foreach __wlan_fixup_wifi_iface wifi-iface
104 uci_commit wireless_tmp
105}
106
107[ -s /etc/config/wireless ] || return 1
108lookup_macaddr || return 1
109
110# Load AP_MRD before
111/bin/mrdloader
112
113UCI_CONFIG_DIR=/var/uci_conf
114mkdir -p $UCI_CONFIG_DIR
115cp /etc/config/wireless $UCI_CONFIG_DIR/wireless_tmp
116wlan_fixup_wifi_iface
117mv $UCI_CONFIG_DIR/wireless_tmp /etc/config/wireless
118rm -f /var/.uci/wireless_tmp
119rm -rf $UCI_CONFIG_DIR
120UCI_CONFIG_DIR=
121return 1