#!/bin/sh append DRIVERS "mac80211" lookup_phy() { [ -n "$phy" ] && { [ -d /sys/class/ieee80211/$phy ] && return } local devpath config_get devpath "$device" path [ -n "$devpath" ] && { phy="$(iwinfo nl80211 phyname "path=$devpath")" [ -n "$phy" ] && return } local macaddr="$(config_get "$device" macaddr | tr 'A-Z' 'a-z')" [ -n "$macaddr" ] && { for _phy in /sys/class/ieee80211/*; do [ -e "$_phy" ] || continue [ "$macaddr" = "$(cat ${_phy}/macaddress)" ] || continue phy="${_phy##*/}" return done } phy= return } find_mac80211_phy() { local device="$1" config_get phy "$device" phy lookup_phy [ -n "$phy" -a -d "/sys/class/ieee80211/$phy" ] || { echo "PHY for wifi device $1 not found" return 1 } config_set "$device" phy "$phy" config_get macaddr "$device" macaddr [ -z "$macaddr" ] && { config_set "$device" macaddr "$(cat /sys/class/ieee80211/${phy}/macaddress)" } return 0 } check_mac80211_device() { config_get phy "$1" phy [ -z "$phy" ] && { find_mac80211_phy "$1" >/dev/null || return 0 config_get phy "$1" phy } [ "$phy" = "$dev" ] && found=1 } __get_band_defaults() { local phy="$1" ( iw phy "$phy" info; echo ) | awk ' BEGIN { bands = "" } ($1 == "Band" || $1 == "") && band { if (channel) { mode="NOHT" if (ht) mode="HT20" if (vht && band != "1:") mode="VHT80" if (he) mode="HE80" if (he && band == "1:") mode="HE20" sub("\\[", "", channel) sub("\\]", "", channel) bands = bands band channel ":" mode " " } band="" } $1 == "Band" { band = $2 channel = "" vht = "" ht = "" he = "" } $0 ~ "Capabilities:" { ht=1 } $0 ~ "VHT Capabilities" { vht=1 } $0 ~ "HE Iftypes" { he=1 } $1 == "*" && $3 == "MHz" && $0 !~ /disabled/ && band && !channel { channel = $4 } END { print bands }' } get_band_defaults() { local phy="$1" for c in $(__get_band_defaults "$phy"); do local band="${c%%:*}" c="${c#*:}" local chan="${c%%:*}" c="${c#*:}" local mode="${c%%:*}" case "$band" in 1) band=2g;; 2) band=5g;; 3) band=60g;; 4) band=6g;; *) band="";; esac [ -n "$band" ] || continue [ -n "$mode_band" -a "$band" = "6g" ] && return mode_band="$band" channel="$chan" htmode="$mode" done } check_devidx() { case "$1" in radio[0-9]*) local idx="${1#radio}" [ "$devidx" -ge "${1#radio}" ] && devidx=$((idx + 1)) ;; esac } detect_mac80211() { devidx=0 config_load wireless config_foreach check_devidx wifi-device for _dev in /sys/class/ieee80211/*; do [ -e "$_dev" ] || continue dev="${_dev##*/}" found=0 config_foreach check_mac80211_device wifi-device [ "$found" -gt 0 ] && continue mode_band="" channel="" htmode="" ht_capab="" get_band_defaults "$dev" path="$(iwinfo nl80211 path "$dev")" if [ -n "$path" ]; then dev_id="set wireless.radio${devidx}.path='$path'" else dev_id="set wireless.radio${devidx}.macaddr=$(cat /sys/class/ieee80211/${dev}/macaddress)" fi uci -q batch <<-EOF set wireless.radio${devidx}=wifi-device set wireless.radio${devidx}.type=mac80211 ${dev_id} set wireless.radio${devidx}.channel=${channel} set wireless.radio${devidx}.band=${mode_band} set wireless.radio${devidx}.htmode=$htmode set wireless.radio${devidx}.disabled=1 set wireless.default_radio${devidx}=wifi-iface set wireless.default_radio${devidx}.device=radio${devidx} set wireless.default_radio${devidx}.network=lan set wireless.default_radio${devidx}.mode=ap set wireless.default_radio${devidx}.ssid=OpenWrt set wireless.default_radio${devidx}.encryption=none EOF uci -q commit wireless devidx=$(($devidx + 1)) done }