123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- #!/bin/sh
- append DRIVERS "mac80211"
- lookup_phy() {
- [ -n "$phy" ] && {
- [ -d /sys/class/ieee80211/$phy ] && return
- }
- local devpath
- config_get devpath "$device" path
- [ -n "$devpath" ] && {
- for phy in $(ls /sys/class/ieee80211 2>/dev/null); do
- case "$(readlink -f /sys/class/ieee80211/$phy/device)" in
- *$devpath) return;;
- esac
- done
- }
- 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
- }
- 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="g"
- channel="11"
- htmode=""
- ht_capab=""
- iw phy "$dev" info | grep -q 'Capabilities:' && htmode=HT20
- iw phy "$dev" info | grep -q '2412 MHz' || { mode_band="a"; channel="36"; }
- vht_cap=$(iw phy "$dev" info | grep -c 'VHT Capabilities')
- cap_5ghz=$(iw phy "$dev" info | grep -c "Band 2")
- [ "$vht_cap" -gt 0 -a "$cap_5ghz" -gt 0 ] && {
- mode_band="a";
- channel="36"
- htmode="VHT80"
- }
- [ -n "$htmode" ] && ht_capab="set wireless.radio${devidx}.htmode=$htmode"
- if [ -x /usr/bin/readlink -a -h /sys/class/ieee80211/${dev} ]; then
- path="$(readlink -f /sys/class/ieee80211/${dev}/device)"
- else
- path=""
- fi
- if [ -n "$path" ]; then
- path="${path##/sys/devices/}"
- case "$path" in
- platform*/pci*) path="${path##platform/}";;
- esac
- 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
- set wireless.radio${devidx}.channel=${channel}
- set wireless.radio${devidx}.hwmode=11${mode_band}
- ${dev_id}
- ${ht_capab}
- set wireless.radio${devidx}.disabled=0
- 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=libreCMC
- set wireless.default_radio${devidx}.encryption=psk
- set wireless.default_radio${devidx}.key=librecmc
- EOF
- uci -q commit wireless
- devidx=$(($devidx + 1))
- done
- }
|