#!/bin/sh . /lib/netifd/mac80211.sh append DRIVERS "mac80211" lookup_phy() { [ -n "$phy" ] && { [ -d /sys/class/ieee80211/$phy ] && return } local devpath config_get devpath "$device" path [ -n "$devpath" ] && { phy="$(mac80211_path_to_phy "$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) 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 } detect_mac80211() { devidx=0 config_load wireless while :; do config_get type "radio$devidx" type [ -n "$type" ] || break devidx=$(($devidx + 1)) done 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="$(mac80211_phy_to_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 }