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

#!/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