| #!/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 |
| } |
| |
| detect_mac80211() { |
| devidx=0 |
| #config_load wireless |
| while :; do |
| #config_get type "radio$devidx" type |
| [ -n "$type" ] || break |
| devidx=$(($devidx + 1)) |
| done |
| |
| if [ ! -f /etc/config/wireless ]; then |
| mkdir -p /etc/config |
| echo -n > /etc/config/wireless |
| fi |
| |
| pcieCheck="$(uci get wireless.radio1.path)" |
| checkpath="$(realpath /sys/class/ieee80211/phy1/device | cut -d/ -f4-)" |
| |
| if [[ "$pcieCheck"* != "$checkpath"* ]]; then |
| echo -n > /etc/config/wireless |
| rm /nvram/hostapd* |
| fi |
| |
| old_path="" |
| for _dev in /sys/class/ieee80211/*; do |
| [ -e "$_dev" ] || continue |
| |
| dev="${_dev##*/}" |
| |
| found="$(uci get wireless.radio${devidx})" |
| |
| |
| if [ "$found" == "wifi-device" ]; then |
| devidx=$(($devidx + 1)) |
| continue |
| fi |
| |
| mode_band="" |
| channel="" |
| htmode="" |
| ht_capab="" |
| |
| |
| get_band_defaults "$dev" |
| |
| path="$(realpath /sys/class/ieee80211/"$dev"/device | cut -d/ -f4-)" |
| if [ -n "$path" ]; then |
| if [ "$path" == "$old_path" ]; then |
| dev_id="set wireless.radio${devidx}.path='$path'+1" |
| else |
| dev_id="set wireless.radio${devidx}.path='$path'" |
| fi |
| else |
| dev_id="set wireless.radio${devidx}.macaddr=$(cat /sys/class/ieee80211/${dev}/macaddress)" |
| fi |
| |
| if [ "$(cat /sys/class/ieee80211/"$dev"/device/device)" == "0x7906" ]; then |
| isMerlin=1 |
| fi |
| |
| if [ "$mode_band" = "6g" ]; then |
| channel="37" |
| fi |
| setdisable="set wireless.radio${devidx}.disabled=0" |
| |
| |
| if [ "$isMerlin" == "1" ] && [ "$devidx" == "2" ] && [ "$mode_band" == "2g" ]; then |
| setdisable="set wireless.radio${devidx}.disabled=1" |
| 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 |
| ${setdisable} |
| 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=Filogic_${mode_band} |
| set wireless.default_radio${devidx}.encryption=none |
| EOF |
| uci -q commit wireless |
| |
| devidx=$(($devidx + 1)) |
| old_path=$path |
| done |
| } |
| detect_mac80211 |