You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
450 lines
15 KiB
Bash
450 lines
15 KiB
Bash
#!/bin/sh
|
|
# Copyright (c) 2013 Qualcomm Atheros, Inc.
|
|
#
|
|
# All Rights Reserved.
|
|
# Qualcomm Atheros Confidential and Proprietary.
|
|
|
|
. /lib/functions.sh
|
|
|
|
IGNORE_NON_WIFISEC=0
|
|
IS_CURRENT_WIFISEC=0
|
|
# This counter is used to record the correct indices of VAPs in wireless config
|
|
# file.
|
|
TOTAL_NUM_VIFS=0
|
|
|
|
cfg_append() {
|
|
if [ "$IGNORE_NON_WIFISEC" -gt 0 ] && [ "$IS_CURRENT_WIFISEC" -eq 0 ]; then
|
|
return
|
|
fi
|
|
echo "$1"
|
|
}
|
|
|
|
cfg_radio_set() {
|
|
local radioidx=$(($1 + 1))
|
|
local cfg="$2"
|
|
local val="$3"
|
|
cfg_append "RADIO.$radioidx.$cfg=$val"
|
|
}
|
|
|
|
|
|
cfg_radio_add() {
|
|
local device="$1"
|
|
local radioidx=$(($2 + 1))
|
|
local cfg="$3"
|
|
local key="$4"
|
|
local def="$5"
|
|
local val
|
|
|
|
config_get val $device $key $def
|
|
[ -n "$val" ] && cfg_append "RADIO.$radioidx.$cfg=$val"
|
|
}
|
|
|
|
cfg_vif_set() {
|
|
local vifidx=$(($1 + 1))
|
|
local cfg="$2"
|
|
local val="$3"
|
|
cfg_append "WLAN.$vifidx.$cfg=$val"
|
|
}
|
|
|
|
|
|
cfg_vif_add() {
|
|
local vif="$1"
|
|
local vifidx=$(($2 + 1))
|
|
local cfg="$3"
|
|
local key="$4"
|
|
local def="$5"
|
|
local val
|
|
|
|
config_get val $vif $key $def
|
|
[ -n "$val" ] && cfg_append "WLAN.$vifidx.$cfg=$val"
|
|
}
|
|
|
|
|
|
cfg_vifsec_set() {
|
|
IS_CURRENT_WIFISEC=1
|
|
cfg_vif_set "$@"
|
|
IS_CURRENT_WIFISEC=0
|
|
}
|
|
|
|
|
|
cfg_vifsec_add() {
|
|
IS_CURRENT_WIFISEC=1
|
|
cfg_vif_add "$@"
|
|
IS_CURRENT_WIFISEC=0
|
|
}
|
|
|
|
|
|
scan_wifi() {
|
|
local cfgfile="$1"
|
|
DEVICES=
|
|
config_load "${cfgfile:-wireless}"
|
|
|
|
# Create a virtual interface list field for each wifi-device
|
|
#
|
|
# input: $1 section: section name of each wifi-device
|
|
create_vifs_list() {
|
|
local section="$1"
|
|
append DEVICES "$section"
|
|
config_set "$section" vifs ""
|
|
}
|
|
config_foreach create_vifs_list wifi-device
|
|
|
|
# Append each wifi-iface to the virtual interface list of its associated wifi-device
|
|
#
|
|
# input: $1 section: section name of each wifi-iface
|
|
append_vif() {
|
|
local section="$1"
|
|
config_get device "$section" device
|
|
config_get vifs "$device" vifs
|
|
append vifs "$section"
|
|
config_set "$device" vifs "$vifs"
|
|
# For wifi-iface (VAP), record its index and section name in variable
|
|
# vifname_#. This will be used later when generating wsplcd config file
|
|
# to match the VAP with correct index.
|
|
eval "vifname_${TOTAL_NUM_VIFS}=$section"
|
|
TOTAL_NUM_VIFS=$(($TOTAL_NUM_VIFS + 1))
|
|
}
|
|
config_foreach append_vif wifi-iface
|
|
}
|
|
|
|
cfg_get_wifi() {
|
|
local vifidx=0
|
|
local managed_network=$1
|
|
local network=""
|
|
|
|
scan_wifi
|
|
for device in $DEVICES; do
|
|
local radioidx=${device#wifi}
|
|
local vidx_per_radio=0
|
|
local channel
|
|
local wsplcd_unmanaged
|
|
|
|
# All of the radio parameters are not used in IEEE1905.1 cloning
|
|
config_get channel "$device" channel '0'
|
|
config_get macaddr "$device" macaddr
|
|
[ "$channel" = "auto" ] && channel=0
|
|
cfg_radio_set $radioidx Channel $channel
|
|
config_get disabled "$device" disabled '0'
|
|
[ "$disabled" = "1" ] && radioena=0 || radioena=1
|
|
cfg_radio_set $radioidx RadioEnabled $radioena
|
|
cfg_radio_set $radioidx macaddr $macaddr
|
|
# UCI based targets have different definition of "txpower" from mib based targets
|
|
cfg_radio_add $device $radioidx X_ATH-COM_Powerlevel txpower
|
|
cfg_radio_add $device $radioidx X_ATH-COM_Rxchainmask rxchainmask
|
|
cfg_radio_add $device $radioidx X_ATH-COM_Txchainmask txchainmask
|
|
# X_ATH-COM_TBRLimit is not implemented in QSDK
|
|
# cfg_radio_add $device $radioidx X_ATH-COM_TBRLimit tbrlimit
|
|
cfg_radio_add $device $radioidx X_ATH-COM_AMPDUEnabled AMPDU
|
|
cfg_radio_add $device $radioidx X_ATH-COM_AMPDULimit AMPDULim
|
|
# X_ATH-COM_AMPDUFrames is not implemented in QSDK
|
|
# cfg_radio_add $device $radioidx X_ATH-COM_AMPDUFrames AMPDUFrames
|
|
|
|
config_get hwmode "$device" hwmode auto
|
|
config_get htmode "$device" htmode auto
|
|
|
|
case "$hwmode:$htmode" in
|
|
# The parsing stops at the first match so we need to make sure
|
|
# these are in the right orders (most generic at the end)
|
|
*ng:HT20) hwmode=ng20;;
|
|
*ng:HT40-) hwmode=ng40minus;;
|
|
*ng:HT40+) hwmode=ng40plus;;
|
|
*ng:HT40) hwmode=ng40;;
|
|
*ng:*) hwmode=ng20;;
|
|
*na:HT20) hwmode=na20;;
|
|
*na:HT40-) hwmode=na40minus;;
|
|
*na:HT40+) hwmode=na40plus;;
|
|
*na:HT40) hwmode=na40;;
|
|
*na:*) hwmode=na40;;
|
|
*ac:HT20) hwmode=acvht20;;
|
|
*ac:HT40+) hwmode=acvht40plus;;
|
|
*ac:HT40-) hwmode=acvht40minus;;
|
|
*ac:HT40) hwmode=acvht40;;
|
|
*ac:HT80) hwmode=acvht80;;
|
|
*ac:HT160) hwmode=acvht160;;
|
|
*ac:HT80_80) hwmode=acvht80_80;;
|
|
*ac:*) hwmode=acvht80;;
|
|
*b:*) hwmode=b;;
|
|
*bg:*) hwmode=g;;
|
|
*g:*) hwmode=g;;
|
|
*a:*) hwmode=a;;
|
|
*) hwmode=auto;;
|
|
esac
|
|
|
|
config_get_bool device_unmanaged "$device" wsplcd_unmanaged '0'
|
|
|
|
config_get vifs "$device" vifs
|
|
|
|
# determine vif name
|
|
for vif in $vifs; do
|
|
local vifname
|
|
|
|
config_get network "$vif" network
|
|
[ "$network" = "$managed_network" ] || continue
|
|
|
|
config_get_bool disabled "$vif" disabled 0
|
|
[ "$disabled" = 0 ] ||
|
|
{
|
|
config_set "$vif" ifname ""
|
|
continue
|
|
}
|
|
|
|
[ $vidx_per_radio -gt 0 ] && vifname="ath${radioidx}${vidx_per_radio}" || vifname="ath${radioidx}"
|
|
|
|
config_get ifname "$vif" ifname
|
|
config_set "$vif" ifname "${ifname:-$vifname}"
|
|
vidx_per_radio=$(($vidx_per_radio + 1))
|
|
done
|
|
|
|
for vif in $vifs; do
|
|
local bssid enc
|
|
local beacontype wepencrmode wepauthmode wpaencrmode wpaauthmode wpa2encrmode wpa2authmode
|
|
local vapidx=0
|
|
local vifidx
|
|
|
|
config_get network "$vif" network
|
|
[ "$network" = "$managed_network" ] || continue
|
|
|
|
# First need to find the correct VAP index for the current vif. This
|
|
# can be done by looking for the matching interface name from
|
|
# vifname_${vapidx} variables,
|
|
while [ $vapidx -lt $TOTAL_NUM_VIFS ]
|
|
do
|
|
local name=$(eval "echo \$vifname_${vapidx}")
|
|
if [ "$name" == "$vif" ];
|
|
then
|
|
vifidx=$vapidx
|
|
break
|
|
fi
|
|
vapidx=$(($vapidx + 1))
|
|
done
|
|
|
|
[ -n "$vifidx" ] || continue
|
|
|
|
config_get_bool disabled "$vif" disabled 0
|
|
[ "$disabled" = "1" ] && vifena=0 || vifena=1
|
|
cfg_vif_set $vifidx Enable $vifena
|
|
|
|
cfg_vif_set $vifidx X_ATH-COM_RadioIndex $(($radioidx +1))
|
|
config_get ifname "$vif" ifname
|
|
|
|
bssid=`ifconfig $ifname 2>&1 | awk '/HWaddr/ {print \$5}'`
|
|
cfg_vif_set $vifidx BSSID $bssid
|
|
|
|
cfg_vifsec_add $vif $vifidx SSID ssid
|
|
[ "$hwmode" == "auto" ] && {
|
|
local is5G=`iwconfig $ifname 2>&1 | grep Frequency:5`
|
|
[ -n "$is5G" ] && hwmode="na40minus" || hwmode="ng20"
|
|
}
|
|
cfg_vifsec_set $vifidx Standard $hwmode
|
|
cfg_vif_set $vifidx Channel $channel
|
|
|
|
config_get enc "$vif" encryption "none"
|
|
case "$enc" in
|
|
none)
|
|
beacontype="None"
|
|
;;
|
|
*wep*)
|
|
beacontype="Basic"
|
|
wepencrmode="WEPEncryption"
|
|
case "$enc" in
|
|
*shared*)
|
|
wepauthmode="SharedAuthentication"
|
|
;;
|
|
*mixed*)
|
|
wepauthmode="Both"
|
|
;;
|
|
*)
|
|
wepauthmode="None"
|
|
;;
|
|
esac
|
|
;;
|
|
*mixed*)
|
|
beacontype="WPAand11i"
|
|
wpa2authmode="PSKAuthentication"
|
|
wpa2encrmode="TKIPandAESEncryption"
|
|
case "$enc" in
|
|
*psk*)
|
|
wpa2authmode="PSKAuthentication"
|
|
;;
|
|
*wpa*)
|
|
wpa2authmode="EAPAuthentication"
|
|
;;
|
|
esac
|
|
;;
|
|
*psk2*)
|
|
beacontype="11i"
|
|
wpa2authmode="PSKAuthentication"
|
|
wpa2encrmode="AESEncryption"
|
|
;;
|
|
*wpa2*)
|
|
beacontype="11i"
|
|
wpa2authmode="EAPAuthentication"
|
|
wpa2encrmode="AESEncryption"
|
|
;;
|
|
*psk*)
|
|
beacontype="WPA"
|
|
wpaauthmode="PSKAuthentication"
|
|
wpaencrmode="TKIPEncryption"
|
|
;;
|
|
*wpa*)
|
|
beacontype="WPA"
|
|
wpaauthmode="EAPAuthentication"
|
|
wpaencrmode="TKIPEncryption"
|
|
;;
|
|
8021x)
|
|
beacontype="Basic"
|
|
wepencrmode="WEPEncryption"
|
|
wepauthmode="EAPAuthentication"
|
|
;;
|
|
esac
|
|
|
|
|
|
# explicit override for crypto setting
|
|
case "$enc" in
|
|
*tkip+aes|*tkip+ccmp|*aes+tkip|*ccmp+tkip) crypto="TKIPandAESEncryption";;
|
|
*aes|*ccmp) crypto="AESEncryption";;
|
|
*tkip) crypto="TKIPEncryption";;
|
|
esac
|
|
|
|
[ -n "$crypto" ] &&
|
|
case "$beacontype" in
|
|
WPA)
|
|
wpaencrmode=$crypto
|
|
;;
|
|
11i)
|
|
wpa2encrmode=$crypto
|
|
;;
|
|
esac
|
|
|
|
cfg_vifsec_set $vifidx BeaconType $beacontype
|
|
cfg_vifsec_set $vifidx BasicEncryptionModes $wepencrmode
|
|
cfg_vifsec_set $vifidx BasicAuthenticationMode $wepauthmode
|
|
cfg_vifsec_set $vifidx WPAEncryptionModes ${wpaencrmode}
|
|
cfg_vifsec_set $vifidx WPAAuthenticationMode $wpaauthmode
|
|
cfg_vifsec_set $vifidx IEEE11iEncryptionModes ${wpa2encrmode}
|
|
cfg_vifsec_set $vifidx IEEE11iAuthenticationMode $wpa2authmode
|
|
|
|
config_get key "$vif" key
|
|
case "$enc" in
|
|
*wep*)#WEP key
|
|
key="${key:-1}"
|
|
case "$key" in
|
|
[1234])
|
|
for idx in 1 2 3 4; do
|
|
local zidx
|
|
zidx=$(($idx - 1))
|
|
config_get ckey "$vif" "key${idx}"
|
|
[ -n "$ckey" ] && \
|
|
cfg_vifsec_set $vifidx WEPKey.${idx}.WEPKey $ckey
|
|
done
|
|
cfg_vifsec_set $vifidx WEPKeyIndex $key
|
|
;;
|
|
*)
|
|
cfg_vifsec_set $vifidx WEPKey.1.WEPKey $key
|
|
cfg_vifsec_set $vifidx WEPKeyIndex 1
|
|
[ -n "$wep_rekey" ] && append "$var" "wep_rekey_period=$wep_rekey" "$N"
|
|
;;
|
|
esac
|
|
;;
|
|
*)#WPA psk
|
|
if [ ${#key} -eq 64 ]; then
|
|
cfg_vifsec_set $vifidx PreSharedKey.1.PreSharedKey "$key"
|
|
else
|
|
cfg_vifsec_set $vifidx KeyPassphrase "$key"
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
cfg_vif_add $vif $vifidx BasicDataTransmitRates mcast_rate
|
|
|
|
config_get wds "$vif" wds
|
|
case "$wds" in
|
|
1|on|enabled) wds=1;;
|
|
*) wds=0;;
|
|
esac
|
|
|
|
config_get mode "$vif" mode
|
|
case "$mode" in
|
|
ap)
|
|
[ "$wds" = 1 ] && opmode=RootAP || opmode=InfrastructureAccessPoint
|
|
;;
|
|
sta)
|
|
[ "$wds" = 1 ] && opmode=WDSStation || opmode=WirelessStation
|
|
;;
|
|
adhoc)
|
|
# don't support adhoc
|
|
;;
|
|
wds)
|
|
opmode=WDSStation
|
|
;;
|
|
esac
|
|
cfg_vif_set $vifidx DeviceOperationMode $opmode
|
|
# RTS and Rragmentation have different definitions from mib based targets
|
|
cfg_vif_add $vif $vifidx RTS rts
|
|
cfg_vif_add $vif $vifidx Fragmentation frag
|
|
cfg_vif_add $vif $vifidx X_ATH-COM_SSIDHide hidden
|
|
cfg_vif_set $vifidx X_ATH-COM_APModuleEnable $vifena
|
|
cfg_vif_add $vif $vifidx X_ATH-COM_WPSPin wps_pin "12345670"
|
|
cfg_vif_set $vifidx X_ATH-COM_VapIfname "$ifname"
|
|
if [ "$enc" = "none" ] ; then
|
|
cfg_vif_set $vifidx X_ATH-COM_WPSConfigured NOTCONFIGURED
|
|
else
|
|
cfg_vif_set $vifidx X_ATH-COM_WPSConfigured CONFIGURED
|
|
fi;
|
|
|
|
|
|
cfg_vif_add $vif $vifidx X_ATH-COM_ShortGI shortgi
|
|
cfg_vif_add $vif $vifidx X_ATH-COM_CWMEnable 1
|
|
cfg_vif_add $vif $vifidx X_ATH-COM_WMM wmm
|
|
|
|
# Note that disablecoext and HT40Coexist are logical negations of
|
|
# one another, hence the inverted logic here. libstorage takes
|
|
# care of mapping back to the UCI setting.
|
|
config_get_bool disablecoext "$vif" disablecoext
|
|
if [ "$disablecoext" = 1 ] ; then
|
|
cfg_vif_set $vifidx X_ATH-COM_HT40Coexist 0
|
|
else
|
|
cfg_vif_set $vifidx X_ATH-COM_HT40Coexist 1
|
|
fi
|
|
|
|
if [ "$device_unmanaged" -gt 0 ] ; then
|
|
wsplcd_unmanaged=1
|
|
else
|
|
config_get_bool wsplcd_unmanaged "$vif" wsplcd_unmanaged 0
|
|
fi
|
|
cfg_vif_set $vifidx WsplcdUnmanaged $wsplcd_unmanaged
|
|
|
|
# HBR is not implemented in QSDK
|
|
# cfg_vif_set $vifidx X_ATH-COM_HBREnable 0
|
|
# cfg_vif_set $vifidx X_ATH-COM_HBRPERLow 20
|
|
# cfg_vif_set $vifidx X_ATH-COM_HBRPERHigh 35
|
|
|
|
# Multicast Enhancement is not implemented in QSDK
|
|
# cfg_vif_set $vifidx X_ATH-COM_MEMode Translate
|
|
# cfg_vif_set $vifidx X_ATH-COM_MELength 32
|
|
# cfg_vif_set $vifidx X_ATH-COM_METimer 30000
|
|
# cfg_vif_set $vifidx X_ATH-COM_METimeout 120000
|
|
# cfg_vif_set $vifidx X_ATH-COM_MEDropMcast 1
|
|
|
|
done
|
|
|
|
done
|
|
|
|
}
|
|
|
|
case "$1" in
|
|
"wifisec")
|
|
IGNORE_NON_WIFISEC=1
|
|
network_name=$2
|
|
cfg_get_wifi $network_name
|
|
;;
|
|
"wifi")
|
|
network_name=$2
|
|
cfg_get_wifi $network_name
|
|
;;
|
|
*)
|
|
network_name=$1
|
|
cfg_get_wifi $network_name
|
|
;;
|
|
esac
|