f5d4f2e90a694d5e2d43b1d8d5fba61bebd39dee
[openwrt/openwrt.git] / package / kernel / mac80211 / files / lib / wifi / mac80211.sh
1 #!/bin/sh
2 . /lib/netifd/mac80211.sh
3
4 append DRIVERS "mac80211"
5
6 lookup_phy() {
7 [ -n "$phy" ] && {
8 [ -d /sys/class/ieee80211/$phy ] && return
9 }
10
11 local devpath
12 config_get devpath "$device" path
13 [ -n "$devpath" ] && {
14 phy="$(mac80211_path_to_phy "$devpath")"
15 [ -n "$phy" ] && return
16 }
17
18 local macaddr="$(config_get "$device" macaddr | tr 'A-Z' 'a-z')"
19 [ -n "$macaddr" ] && {
20 for _phy in /sys/class/ieee80211/*; do
21 [ -e "$_phy" ] || continue
22
23 [ "$macaddr" = "$(cat ${_phy}/macaddress)" ] || continue
24 phy="${_phy##*/}"
25 return
26 done
27 }
28 phy=
29 return
30 }
31
32 find_mac80211_phy() {
33 local device="$1"
34
35 config_get phy "$device" phy
36 lookup_phy
37 [ -n "$phy" -a -d "/sys/class/ieee80211/$phy" ] || {
38 echo "PHY for wifi device $1 not found"
39 return 1
40 }
41 config_set "$device" phy "$phy"
42
43 config_get macaddr "$device" macaddr
44 [ -z "$macaddr" ] && {
45 config_set "$device" macaddr "$(cat /sys/class/ieee80211/${phy}/macaddress)"
46 }
47
48 return 0
49 }
50
51 check_mac80211_device() {
52 config_get phy "$1" phy
53 [ -z "$phy" ] && {
54 find_mac80211_phy "$1" >/dev/null || return 0
55 config_get phy "$1" phy
56 }
57 [ "$phy" = "$dev" ] && found=1
58 }
59
60
61 __get_band_defaults() {
62 local phy="$1"
63
64 ( iw phy "$phy" info; echo ) | awk '
65 BEGIN {
66 bands = ""
67 }
68
69 ($1 == "Band" || $1 == "") && band {
70 if (channel) {
71 mode="NOHT"
72 if (ht) mode="HT20"
73 if (vht) mode="VHT80"
74 if (he) mode="HE80"
75 if (he && band == "1:") mode="HE20"
76 sub("\\[", "", channel)
77 sub("\\]", "", channel)
78 bands = bands band channel ":" mode " "
79 }
80 band=""
81 }
82
83 $1 == "Band" {
84 band = $2
85 channel = ""
86 vht = ""
87 ht = ""
88 he = ""
89 }
90
91 $0 ~ "Capabilities:" {
92 ht=1
93 }
94
95 $0 ~ "VHT Capabilities" {
96 vht=1
97 }
98
99 $0 ~ "HE Iftypes" {
100 he=1
101 }
102
103 $1 == "*" && $3 == "MHz" && $0 !~ /disabled/ && band && !channel {
104 channel = $4
105 }
106
107 END {
108 print bands
109 }'
110 }
111
112 get_band_defaults() {
113 local phy="$1"
114
115 for c in $(__get_band_defaults "$phy"); do
116 local band="${c%%:*}"
117 c="${c#*:}"
118 local chan="${c%%:*}"
119 c="${c#*:}"
120 local mode="${c%%:*}"
121
122 case "$band" in
123 1) band=2g;;
124 2) band=5g;;
125 3) band=60g;;
126 4) band=6g;;
127 *) band="";;
128 esac
129
130 [ -n "$band" ] || continue
131 [ -n "$mode_band" -a "$band" = "6g" ] && return
132
133 mode_band="$band"
134 channel="$chan"
135 htmode="$mode"
136 done
137 }
138
139 detect_mac80211() {
140 devidx=0
141 config_load wireless
142 while :; do
143 config_get type "radio$devidx" type
144 [ -n "$type" ] || break
145 devidx=$(($devidx + 1))
146 done
147
148 for _dev in /sys/class/ieee80211/*; do
149 [ -e "$_dev" ] || continue
150
151 dev="${_dev##*/}"
152
153 found=0
154 config_foreach check_mac80211_device wifi-device
155 [ "$found" -gt 0 ] && continue
156
157 mode_band=""
158 channel=""
159 htmode=""
160 ht_capab=""
161
162 get_band_defaults "$dev"
163
164 path="$(mac80211_phy_to_path "$dev")"
165 if [ -n "$path" ]; then
166 dev_id="set wireless.radio${devidx}.path='$path'"
167 else
168 dev_id="set wireless.radio${devidx}.macaddr=$(cat /sys/class/ieee80211/${dev}/macaddress)"
169 fi
170
171 uci -q batch <<-EOF
172 set wireless.radio${devidx}=wifi-device
173 set wireless.radio${devidx}.type=mac80211
174 ${dev_id}
175 set wireless.radio${devidx}.channel=${channel}
176 set wireless.radio${devidx}.band=${mode_band}
177 set wireless.radio${devidx}.htmode=$htmode
178 set wireless.radio${devidx}.disabled=1
179
180 set wireless.default_radio${devidx}=wifi-iface
181 set wireless.default_radio${devidx}.device=radio${devidx}
182 set wireless.default_radio${devidx}.network=lan
183 set wireless.default_radio${devidx}.mode=ap
184 set wireless.default_radio${devidx}.ssid=OpenWrt
185 set wireless.default_radio${devidx}.encryption=none
186 EOF
187 uci -q commit wireless
188
189 devidx=$(($devidx + 1))
190 done
191 }