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.

609 lines
16 KiB
Bash

WLAN_DEVICES=
WLAN_INCLUDED_DEVICES=
WLAN_VLAN_DEVICES=
WLAN_VLAN_STA_DEVICES=
WLAN_DEVICE_NUM=
ETHER_DEVICES=
PLC_DEVICE=
ALL_DEVICES=
IFACE_VLANIDS=
. /lib/functions/hyfi-debug.sh
ieee1905managed_found=0
ieee1905managed_bridge=""
ieee1905managed_bridge2=""
bound_bridge=""
device_wlan=1
backhaul_network="backhaul"
traffic_separation_enabled=0
traffic_separation_active=0
iface_config=
__hyfi_get_wlan_vifnum() {
local config="$1"
local iface network disabled
local phydev phydisabled
config_get network "$config" network
config_get disabled "$config" disabled '0'
config_get phydev "$config" device ""
if [ -z "$phydev" ]; then
return
fi
config_get phydisabled ${phydev} disabled 0
if [ $phydisabled -eq 0 -a "$2" = "$network" -a "$disabled" -eq 0 ]; then
WLAN_DEVICE_NUM=$((WLAN_DEVICE_NUM + 1))
fi
}
# hyfi_get_wlan_vifnum()
# input: $1 IEEE1905.1 managed bridge interface
# output: $2 number of WLAN interfaces bound to the bridge
hyfi_get_wlan_vifnum() {
local ieee1905managed="$1"
WLAN_DEVICE_NUM=0
config_load wireless
config_foreach __hyfi_get_wlan_vifnum wifi-iface $ieee1905managed
eval "$2='${WLAN_DEVICE_NUM}'"
}
__hyfi_get_iface_vlanids() {
local config="$1"
local loc_iface loc_vid
config_get loc_iface "$config" ifname
config_get loc_vid "$config" vid
if [ "$loc_iface" -a "$loc_vid" ]; then
IFACE_VLANIDS="${IFACE_VLANIDS}${IFACE_VLANIDS:+","}${loc_iface}.${loc_vid}"
fi
}
hyfi_get_iface_vlanids() {
IFACE_VLANIDS=""
config_load hyd
config_foreach __hyfi_get_iface_vlanids Vlanid
eval "$1='${IFACE_VLANIDS}'"
}
__hyfi_get_wlan_ifaces() {
local config="$1"
local iface network disabled device
config_get iface "$config" ifname
config_get network "$config" network
config_get disabled "$config" disabled '0'
config_get device "$config" device
if [ -n "$iface" -a "$disabled" -eq 0 ]; then
if [ "$network" = "$2" ]; then
WLAN_DEVICES="${WLAN_DEVICES}${WLAN_DEVICES:+","}${iface}@${device}:WLAN"
fi
# include network=backhaul for guest network support
if [ "$network" = "$2" -o "$network" = "backhaul" ]; then
WLAN_INCLUDED_DEVICES="${WLAN_INCLUDED_DEVICES}${WLAN_INCLUDED_DEVICES:+","}${device}:${iface}"
fi
fi
}
# hyfi_get_wlan_ifaces()
# input: $1 IEEE1905.1 managed bridge interface
# output: $2 List of all WLAN interfaces bound to the bridge
# output: $3 List of all WLAN devices/radios bound to the bridge
hyfi_get_wlan_ifaces() {
local ieee1905managed="$1"
WLAN_DEVICES=""
WLAN_INCLUDED_DEVICES=""
hyfi_network_sync
config_load wireless
config_foreach __hyfi_get_wlan_ifaces wifi-iface $ieee1905managed
eval "$2='${WLAN_DEVICES}'"
eval "$3='${WLAN_INCLUDED_DEVICES}'"
}
__hyfi_get_switch_iface() {
local loc_switch_iface loc_eswitch_support="0"
local ref_design
config_load hyd
config_get loc_switch_iface config SwitchInterface ""
if [ -z "$loc_switch_iface" ]; then
eval "$1=''"
eval "$2='$loc_eswitch_support'"
return
fi
if [ "$loc_switch_iface" = "auto" ]; then
ref_design=`cat /tmp/sysinfo/board_name`
# List of supported reference designs. For other designs
# either add to cases, or setup SwitchInterface.
case "$ref_design" in
ap145|ap147|ap148*|db149|ap151)
# S17c switch
# ap148_1xx is also a supported board type
loc_switch_iface="eth1"
loc_eswitch_support="1"
;;
ap160|ap161)
# S17c switch support is disabled even though interface is identified
loc_switch_iface="eth1"
loc_eswitch_support="0"
;;
ap152|apjet01)
loc_switch_iface="eth0"
loc_eswitch_support="0"
;;
ap-dk*)
# Malibu switch with a single host port connected in a VLAN
# tagged manner. Since the switch config indicates the host
# port is tagged (as it is from the switch's perspective) but
# the host interfaces are not VLAN tagged, a special option
# is needed to force the interface names to be untagged.
loc_switch_iface="eth1"
force_untagged_iface=1
loc_eswitch_support="0"
;;
ap135)
loc_switch_iface="eth1"
loc_eswitch_support="0"
;;
*)
loc_switch_iface=""
;;
esac
fi
local loc_switch_cpu_port
__hyfi_get_switch_cpu_port loc_switch_cpu_port
local lan_vid
__hyfi_get_switch_lan_vid lan_vid
if [ -z "$switch_cpu_port_tagged" -o -n "$force_untagged_iface" ]; then
eval "$1='$loc_switch_iface'"
else
eval "$1='${loc_switch_iface}.${lan_vid}'"
fi
eval "$2='$loc_eswitch_support'"
}
__hyfi_get_switch_lan_vid() {
local loc_lan_vid
config_load hyd
config_get loc_lan_vid config SwitchLanVid ""
eval "$1='$loc_lan_vid'"
}
__hyfi_get_switch_cpu_port_iterate() {
config_get vlan "$1" "vlan"
config_get ports "$1" "ports"
if [ "${vlan}" = "$2" ]; then
switch_cpu_port=`echo ${ports} |sed 's/t//g' |cut -f 1 -d " "`
switch_cpu_port_tagged=`echo ${ports} |grep t`
fi
}
__hyfi_get_switch_cpu_port() {
local lan_vid
__hyfi_get_switch_lan_vid lan_vid
config_load network
config_foreach __hyfi_get_switch_cpu_port_iterate switch_vlan $lan_vid
eval "$1='$switch_cpu_port'"
}
__hyfi_get_ether_ifaces() {
local config="$1"
local ifnames network plciface bridge_name
#config_get ifnames "$config" device
ifnames=`uci get network.$1.ifname`
config_get bridge_name "$config" ifname
config_load plc
config_get plciface config PlcIfname
local switch_iface eswitch_support
__hyfi_get_switch_iface switch_iface eswitch_support
if [ "$2" = "$config" ]; then
# Check the ifnames parameter is populated correctly
if [ -z "$ifnames" ]; then
# If the ifnames parameter doesn't contain the device list, it should
# be present in the bridge_name. However, it's possible a race
# condition occured, and neither parameter contains the device list.
# Check the device list again if the bridge_name actually contains the
# name of the bridge.
if echo $bridge_name | grep -q br-; then
hyfi_debug hyiface "Missing device names, and ifname matches bridge, fetching device names again"
config_get ifnames "$config" device
if [ -z "$ifnames" ]; then
ifnames=`uci get "network.$1.ifname"`
hyfi_error hyiface "Device names missing, defaulting to $ifnames"
else
hyfi_debug hyiface "Device names now populated correctly"
fi
else
ifnames=$bridge_name
hyfi_debug hyiface "Missing device names, so using ifname parameter instead"
fi
fi
for iface in $ifnames; do
[ "$iface" = "$plciface" ] && continue
if [ "$traffic_separation_enabled" -gt 0 ] && \
[ "$traffic_separation_active" -gt 0 ]; then
if __hyfi_is_vlan_iface $iface; then
if __hyfi_is_device_wlan $iface; then
continue
fi
fi
fi
if [ "$iface" = "$switch_iface" -a "$eswitch_support" = "1" ]; then
ETHER_DEVICES="${ETHER_DEVICES}${ETHER_DEVICES:+","}${iface}:ESWITCH"
else
ETHER_DEVICES="${ETHER_DEVICES}${ETHER_DEVICES:+","}${iface}:ETHER"
fi
done
fi
}
# hyfi_get_ether_ifaces()
# input: $1 IEEE1905.1 managed bridge interface
# output: $2 List of all Ethernet interfaces bound to the bridge
hyfi_get_ether_ifaces() {
local ieee1905managed="$1"
ETHER_DEVICES=""
hyfi_network_sync
config_load repacd
config_get traffic_separation_enabled repacd TrafficSeparationEnabled '0'
config_get traffic_separation_active repacd TrafficSeparationActive '0'
config_get backhaul_network repacd NetworkBackhaul 'backhaul'
config_load network
config_foreach __hyfi_get_ether_ifaces interface $ieee1905managed
eval "$2='${ETHER_DEVICES}'"
}
__hyfi_is_vlan_iface() {
local iface="$1"
echo "$iface" | grep '\.' >/dev/null 2>&1
if [ "$?" -eq "0" ]; then
return 0
fi
return 1
}
__hyfi_iterate_wlan_ifaces() {
local config="$1"
local iface network disabled
local interface
config_get iface "$config" ifname
config_get network "$config" network
config_get disabled "$config" disabled '0'
if [ -n "$iface" -a "$backhaul_network" = "$network" -a "$disabled" -eq 0 ]; then
interface=`echo "$2" | cut -d '.' -f1`
if [ "$interface" = "$iface" ]; then
eval "$3='0'"
eval "$4=$config"
fi
fi
}
__hyfi_is_device_wlan() {
local iface="$1"
device_wlan=1
if [ -n "$backhaul_network" ]; then
config_load wireless
config_foreach __hyfi_iterate_wlan_ifaces wifi-iface $iface device_wlan iface_config
fi
return $device_wlan
}
__hyfi_get_wlan_vlan_ifaces() {
local config="$1"
local ifnames bridge_name
config_get ifnames "$config" device
config_get bridge_name "$config" ifname
if [ "$2" = "$config" ]; then
#initially VLAN interfaces are added using vconfig and brctl tool
#to avoid multiple restarts.VLAN interfaces added this way are not
#detected by config_get, so using direct command here.
ifnames=`uci get "network.$1.ifname"`
for iface in $ifnames; do
if __hyfi_is_vlan_iface $iface; then
if __hyfi_is_device_wlan $iface; then
WLAN_VLAN_DEVICES="${WLAN_VLAN_DEVICES}${WLAN_VLAN_DEVICES:+","}${iface}:WLAN_VLAN"
fi
fi
done
fi
}
__hyfi_get_wlan_vlan_sta_ifaces() {
local config="$1"
local ifnames bridge_name
local mode
config_get ifnames "$config" device
config_get bridge_name "$config" ifname
if [ "$2" = "$config" ]; then
ifnames=`uci get "network.$1.ifname"`
for iface in $ifnames; do
if __hyfi_is_vlan_iface $iface; then
if __hyfi_is_device_wlan $iface; then
config_load wireless
config_get mode "$iface_config" mode
if [ "$mode" = "sta" ]; then
WLAN_VLAN_STA_DEVICES="${WLAN_VLAN_STA_DEVICES}${WLAN_VLAN_STA_DEVICES:+","}${iface}"
fi
fi
fi
done
fi
}
hyfi_get_wlan_vlan_ifaces() {
local ieee1905managed="$1"
WLAN_VLAN_DEVICES=""
hyfi_network_sync
config_load repacd
config_get traffic_separation_enabled repacd TrafficSeparationEnabled '0'
config_get traffic_separation_active repacd TrafficSeparationActive '0'
config_get backhaul_network repacd NetworkBackhaul 'backhaul'
if [ "$traffic_separation_enabled" -gt 0 ] && \
[ "$traffic_separation_active" -gt 0 ]; then
config_load network
config_foreach __hyfi_get_wlan_vlan_ifaces interface $ieee1905managed
fi
eval "$2='${WLAN_VLAN_DEVICES}'"
}
hyfi_get_wlan_vlan_sta_ifaces() {
local ieee1905managed="$1"
WLAN_VLAN_STA_DEVICES=""
hyfi_network_sync
config_load repacd
config_get traffic_separation_enabled repacd TrafficSeparationEnabled '0'
config_get traffic_separation_active repacd TrafficSeparationActive '0'
config_get backhaul_network repacd NetworkBackhaul 'backhaul'
if [ "$traffic_separation_enabled" -gt 0 ] && \
[ "$traffic_separation_active" -gt 0 ]; then
config_load network
config_foreach __hyfi_get_wlan_vlan_sta_ifaces interface $ieee1905managed
fi
eval "$2='${WLAN_VLAN_STA_DEVICES}'"
}
__hyfi_get_plc_iface() {
local plciface iface bridge_name
local ieee1905managed="$1"
config_load plc
config_get plciface config PlcIfname
[ -z "$plciface" ] && return
config_get bridge_name "$ieee1905managed" ifname
config_load network
config_get ifnames $ieee1905managed device
# Check the ifnames parameter is populated correctly
if [ -z "$ifnames" ]; then
# If the ifnames parameter doesn't contain the device list, it should
# be present in the bridge_name. However, it's possible a race
# condition occured, and neither parameter contains the device list.
# Check the device list again if the bridge_name actually contains the
# name of the bridge.
if echo $bridge_name | grep -q br-; then
hyfi_debug hyiface "Missing device names, and ifname matches bridge, fetching device names again"
config_get ifnames "$ieee1905managed" device
if [ -z "$ifnames" ]; then
ifnames=`uci get "network.$1.ifname"`
hyfi_error hyiface "Device names missing, defaulting to $ifnames"
else
hyfi_debug hyiface "Device names now populated correctly"
fi
else
ifnames=$bridge_name
hyfi_debug hyiface "Missing device names, so using ifname parameter instead"
fi
fi
for iface in $ifnames; do
if [ "$iface" = "$plciface" ]; then
PLC_DEVICE=${plciface}:PLC
return
fi
done
}
# hyfi_get_plc_iface()
# input: $1 IEEE1905.1 managed bridge interface
# output: $2 PLC interface bound to the bridge
hyfi_get_plc_iface() {
local ieee1905managed="$1"
PLC_DEVICE=""
hyfi_network_sync
__hyfi_get_plc_iface $ieee1905managed
eval "$2='${PLC_DEVICE}'"
}
# hyfi_get_ifaces()
# input: $1 IEEE1905.1 managed bridge interface
# output: $2 List of ALL interface bound to the bridge
# output: $3 List of ALL WLAN devices/radios bound to the bridge
hyfi_get_ifaces() {
local ieee1905managed="$1"
WLAN_DEVICES=""
WLAN_INCLUDED_DEVICES=""
WLAN_VLAN_DEVICES=""
ETHER_DEVICES=""
PLC_DEVICE=""
hyfi_network_sync
config_load repacd
config_get traffic_separation_enabled repacd TrafficSeparationEnabled '0'
config_get traffic_separation_active repacd TrafficSeparationActive '0'
config_get backhaul_network repacd NetworkBackhaul 'backhaul'
config_load network
config_foreach __hyfi_get_ether_ifaces interface $ieee1905managed
config_load wireless
config_foreach __hyfi_get_wlan_ifaces wifi-iface $ieee1905managed
if [ "$traffic_separation_enabled" -gt 0 ] && \
[ "$traffic_separation_active" -gt 0 ]; then
config_load network
config_foreach __hyfi_get_wlan_vlan_ifaces interface $ieee1905managed
fi
__hyfi_get_plc_iface $ieee1905managed
ALL_DEVICES=$WLAN_DEVICES
if [ -n "$ETHER_DEVICES" ]; then
[ -z "$ALL_DEVICES" ] || ALL_DEVICES="${ALL_DEVICES},"
ALL_DEVICES="${ALL_DEVICES}${ETHER_DEVICES}"
fi
if [ -n "$PLC_DEVICE" ]; then
[ -z "$ALL_DEVICES" ] || ALL_DEVICES="${ALL_DEVICES},"
ALL_DEVICES="${ALL_DEVICES}${PLC_DEVICE}"
fi
if [ -n "$WLAN_VLAN_DEVICES" ]; then
[ -z "$ALL_DEVICES" ] || ALL_DEVICES="${ALL_DEVICES},"
ALL_DEVICES="${ALL_DEVICES}${WLAN_VLAN_DEVICES}"
fi
eval "$2='${ALL_DEVICES}'"
eval "$3='${WLAN_INCLUDED_DEVICES}'"
}
__hyfi_iterate_networks() {
local config="$1"
local type ieee1905managed
config_get type "$config" type
[ -z "$type" -o ! "$type" = "bridge" ] && return
config_get_bool ieee1905managed "$config" ieee1905managed
[ -z "$ieee1905managed" ] && return
if [ "$ieee1905managed" -eq "1" ]; then
ieee1905managed_found=1
if [ -n "$ieee1905managed_bridge" ]
then
ieee1905managed_bridge2="$config"
else
ieee1905managed_bridge="$config"
fi
fi
}
__hyfi_iterate_networks2() {
local config="$1"
local my_iface="$2"
local ifnames iface type
[ -n "$bound_bridge" ] && return
config_get type "$config" type
[ -z "$type" -o ! "$type" = "bridge" ] && return
config_get ifnames "$config" device
for iface in $ifnames; do
if [ "$iface" = "$my_iface" ]; then
bound_bridge=br-$config
return
fi
done
}
# hyfi_get_ieee1905_managed_iface()
# output: $1 IEEE1905.1 managed bridge interface
# output: $2 2nd IEEE1905.1 managed bridge interface
# Note: If no entry exists, the function will set the "lan"
# interface as the default managed bridge
hyfi_get_ieee1905_managed_iface() {
ieee1905managed_found=0
ieee1905managed_bridge=""
ieee1905managed_bridge2=""
config_load network
config_foreach __hyfi_iterate_networks interface
eval "$1='$ieee1905managed_bridge'"
eval "$2='$ieee1905managed_bridge2'"
[ "$ieee1905managed_found" -eq "1" ] && return
ieee1905managed_bridge="lan"
uci_set network $ieee1905managed_bridge ieee1905managed 1
uci_commit network
config_load network
__hyfi_iterate_networks $ieee1905managed_bridge
eval "$1='$ieee1905managed_bridge'"
}
# hyfi_strip_list
# input: $1 list of interfaces with attached type
# output: $2 same list with type stripped
hyfi_strip_list() {
eval "$2='`echo $1 | sed 's/@[a-zA-Z0-9]*//g' | sed 's/:[A-Z]*,/ /g' | sed 's/:[A-Z]*//g'`'"
}
# hyfi_get_bridge_from_iface()
# input: $1 interface name
# output: $2 bridge the interface is bound to
hyfi_get_bridge_from_iface() {
bound_bridge=""
local iface="$1"
config_load network
config_foreach __hyfi_iterate_networks2 interface $iface
eval "$2='$bound_bridge'"
}