#!/bin/sh append DRIVERS "mac80211" check_mac80211_device() { local device="$1" local path="$2" local macaddr="$3" [ -n "$found" ] && return 0 phy_path= config_get phy "$device" phy json_select wlan [ -n "$phy" ] && case "$phy" in phy*) [ -d /sys/class/ieee80211/$phy ] && \ phy_path="$(iwinfo nl80211 path "$dev")" ;; *) if json_is_a "$phy" object; then json_select "$phy" json_get_var phy_path path json_select .. elif json_is_a "${phy%.*}" object; then json_select "${phy%.*}" json_get_var phy_path path json_select .. phy_path="$phy_path+${phy##*.}" fi ;; esac json_select .. [ -n "$phy_path" ] || config_get phy_path "$device" path [ -n "$path" -a "$phy_path" = "$path" ] && { found=1 return 0 } config_get dev_macaddr "$device" macaddr [ -n "$macaddr" -a "$dev_macaddr" = "$macaddr" ] && found=1 return 0 } __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 } check_board_phy() { local name="$2" json_select "$name" json_get_var phy_path path json_select .. if [ "$path" = "$phy_path" ]; then board_dev="$name" elif [ "${path%+*}" = "$phy_path" ]; then fallback_board_dev="$name.${path#*+}" fi } detect_mac80211() { devidx=0 config_load wireless config_foreach check_devidx wifi-device json_load_file /etc/board.json for _dev in /sys/class/ieee80211/*; do [ -e "$_dev" ] || continue dev="${_dev##*/}" mode_band="" channel="" htmode="" ht_capab="" get_band_defaults "$dev" path="$(iwinfo nl80211 path "$dev")" macaddr="$(cat /sys/class/ieee80211/${dev}/macaddress)" # work around phy rename related race condition [ -n "$path" -o -n "$macaddr" ] || continue board_dev= fallback_board_dev= json_for_each_item check_board_phy wlan [ -n "$board_dev" ] || board_dev="$fallback_board_dev" [ -n "$board_dev" ] && dev="$board_dev" found= config_foreach check_mac80211_device wifi-device "$path" "$macaddr" [ -n "$found" ] && continue name="radio${devidx}" devidx=$(($devidx + 1)) case "$dev" in phy*) if [ -n "$path" ]; then dev_id="set wireless.${name}.path='$path'" else dev_id="set wireless.${name}.macaddr='$macaddr'" fi ;; *) dev_id="set wireless.${name}.phy='$dev'" ;; esac uci -q batch <<-EOF set wireless.${name}=wifi-device set wireless.${name}.type=mac80211 ${dev_id} set wireless.${name}.channel=${channel} set wireless.${name}.band=${mode_band} set wireless.${name}.htmode=$htmode set wireless.${name}.disabled=1 set wireless.default_${name}=wifi-iface set wireless.default_${name}.device=${name} set wireless.default_${name}.network=lan set wireless.default_${name}.mode=ap set wireless.default_${name}.ssid=OpenWrt set wireless.default_${name}.encryption=none EOF uci -q commit wireless done }