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.

112 lines
3.4 KiB
Bash

4 years ago
guest_network="guest"
traffic_separation_enabled=0
traffic_separation_active=0
WLAN_INCLUDED_IFACES=""
WLAN_INCLUDED_DEVICES=""
WLAN_EXCLUDE=
__whc_get_wlan_ifaces() {
local config="$1"
local ssid_to_match="$2"
local network_to_match="$3"
local device iface disabled mode ssid network radio_disabled
config_get device "$config" device
config_get iface "$config" ifname
config_get disabled "$config" disabled '0'
config_get mode "$config" mode
config_get ssid "$config" ssid
config_get network "$config" network
config_get radio_disabled "$device" disabled '0'
if [ "$traffic_separation_enabled" -gt 0 ] && \
[ "$traffic_separation_active" -gt 0 ] && \
[ -n "$network_to_match" -a "$network" != "$network_to_match" -a "$network" != "backhaul" ]; then
return
fi
driver=$(lsmod | cut -d' ' -f 1 | grep ath10k_core)
#TODO: Read the interface name from config rather than assuming single interface per radio.
if [ "$driver" == "ath10k_core" -a "$radio_disabled" -eq 0 ]; then
if [ "$device" == "radio0" ]; then
iface="wlan0"
elif [ "$device" == "radio1" ]; then
iface="wlan1"
else
iface="wlan2"
fi
fi
if [ -n "$iface" -a "$disabled" -eq 0 ]; then
if [ "$mode" == "ap" -o "$mode" == "wrap" ]; then
if [ -z "$ssid_to_match" ]; then
WLAN_INCLUDED_DEVICES="${WLAN_INCLUDED_DEVICES}${WLAN_INCLUDED_DEVICES:+","}${device}:${iface}"
else
if [ ! -n "$ssid_to_match" -o "$ssid" == "$ssid_to_match" ]; then
WLAN_INCLUDED_DEVICES="${WLAN_INCLUDED_DEVICES}${WLAN_INCLUDED_DEVICES:+","}${device}:${iface}"
WLAN_INCLUDED_IFACES="${WLAN_INCLUDED_IFACES}${WLAN_INCLUDED_IFACES:+","}${iface}"
return
fi
fi
fi
fi
}
__whc_get_wlan_excluded() {
local config="$1"
local ifaces_to_match="$2"
config_get device "$config" device
config_get iface "$config" ifname
config_get disabled "$config" disabled '0'
config_get mode "$config" mode
config_get ssid "$config" ssid
config_get network "$config" network
local iface_array=$(echo $ifaces_to_match | tr ',' "\n")
if [ -n "$iface" -a "$disabled" -eq 0 ]; then
if [ "$mode" == "ap" -o "$mode" == "wrap" ]; then
for i in $iface_array
do
if [ ! -n "$i" -o "$iface" == "$i" ]; then
return
fi
done
WLAN_EXCLUDE="${WLAN_EXCLUDE}${WLAN_EXCLUDE:+","}${device}:${iface}"
fi
fi
}
# whc_get_wlan_ifaces()
# input: $1 The desired SSID. If it is null string, then get all WLAN
# $4 The disired network name. Only the interfaces with matching network name included
# output: $2 List of all WLAN interfaces matching the SSID provided and the network name
# if no matching ssid, only the network name will be checked
# $3 the matching SSID returned back to the caller
whc_get_wlan_ifaces() {
config_load 'repacd'
config_get guest_network repacd NetworkGuest 'guest'
config_get traffic_separation_enabled repacd TrafficSeparationEnabled '0'
config_get traffic_separation_active repacd TrafficSeparationActive '0'
config_load wireless
config_foreach __whc_get_wlan_ifaces wifi-iface "$1" "$4"
eval "$2='${WLAN_INCLUDED_DEVICES}'"
eval "$3='$1'"
}
# return the EXCLUDE interface list. This should be called after the interface list is created
whc_get_wlan_ifaces_excl()
{
config_load wireless
config_foreach __whc_get_wlan_excluded wifi-iface $WLAN_INCLUDED_IFACES
eval "$1='${WLAN_EXCLUDE}'"
}
# clean the global variables. This should be called before create the new lists
whc_init_wlan_interface_list()
{
WLAN_EXCLUDE=""
WLAN_INCLUDED_DEVICES=""
}