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.

203 lines
6.4 KiB
Bash

#!/bin/sh
# Copyright (c) 2017-2018 Qualcomm Technologies, Inc.
# All Rights Reserved.
# Confidential and Proprietary - Qualcomm Technologies, Inc.
FRONTHAULMGRMON_DEBUG_OUTOUT=0
# This file assumes the gwmon and wifimon (the appropriate sub-version)
# have already been sourced.
. /lib/functions/whc-network.sh
is_front_haul_VAPs_brought_down=0
# Config Parameters
manage_fronthaul_and_backhaul_independently=0
fronthaul_VAPs_bringdown_time=0
# Local parameters
ap_ifaces_24g='' ap_ifaces_5g=''
# Emit a message at debug level.
# input: $1 - the message to log
__repacd_fronthaulmgrmon_debug() {
local stderr=''
if [ "$FRONTHAULMGRMON_DEBUG_OUTOUT" -gt 0 ]; then
stderr='-s'
fi
logger $stderr -t repacd.fronthaulmgrmon -p user.debug "$1"
}
# Emit a message at info level.
__repacd_fronthaulmgrmon_info() {
local stderr=''
if [ "$BACKHAULMGRMON_DEBUG_OUTOUT" -gt 0 ]; then
stderr='-s'
fi
logger $stderr -t repacd.fronthaulmgrmon -p user.info "$1"
}
__repacd_fronthaulmgrmon_get_fronthaul_vaps() {
local config="$1"
local network_to_match="$2"
local network iface disabled mode device hwmode
config_get network "$config" network
config_get iface "$config" ifname
config_get disabled "$config" disabled '0'
config_get mode "$config" mode
config_get bssid "$config" bssid
config_get device "$config" device
config_get hwmode "$device" hwmode
if [ "$hwmode" != "11ad" ]; then
if [ "$network" = "$network_to_match" ] && [ -n "$iface" ] && \
[ "$mode" = "ap" ] && [ "$disabled" -eq 0 ]; then
if whc_is_5g_vap "$config"; then
__repacd_fronthaulmgrmon_debug "5 GHz AP VAP ($iface) found"
if [ -z "${ap_ifaces_5g}" ]; then
ap_ifaces_5g="$iface"
else
ap_ifaces_5g="$ap_ifaces_5g $iface"
fi
else
__repacd_fronthaulmgrmon_debug "2.4 GHz AP VAP ($iface) found"
if [ -z "${ap_ifaces_24g}" ]; then
ap_ifaces_24g="$iface"
else
ap_ifaces_24g="$ap_ifaces_24g $iface"
fi
fi
fi
fi
}
# Check whether all of the provided interfaces are up
#
# input: $1 - list of AP VAPs to check
#
# return 0 if all VAPs are up, otherwise non-zero
__repacd_fronthaulmgrmon_all_AP_VAPs_up() {
local ap_ifaces="$1"
if [ -n "${ap_ifaces}" ]; then
# Check whether all VAPs are up
for item in $ap_ifaces
do
if ip link show ${item} | grep -q 'state DOWN'; then
__repacd_fronthaulmgrmon_debug "Fronthaul $item is down; will re-attempt"
return 1
fi
done
fi
return 0
}
__repacd_fronthaulmgrmon_bringup_AP_VAPs() {
if [ -z "${ap_ifaces_5g}" ]; then
__repacd_fronthaulmgrmon_debug "No 5 GHz AP VAPs found"
else
# Bring Up all 5G AP VAPs
for item in $ap_ifaces_5g
do
ifconfig "$item" up
done
fi
if [ -z "${ap_ifaces_24g}" ]; then
__repacd_fronthaulmgrmon_debug "No 2.4 GHz AP VAPs found"
else
# Bring Up all 2.4G AP VAPs
for item in $ap_ifaces_24g
do
ifconfig "$item" up
done
fi
}
__repacd_fronthaulmgrmon_bringdown_AP_VAPs() {
if [ -z "${ap_ifaces_5g}" ]; then
__repacd_fronthaulmgrmon_debug "No 5 GHz AP VAPs found"
else
# Bring Down all 5G AP VAPs
for item in $ap_ifaces_5g
do
ifconfig "$item" down
done
fi
if [ -z "${ap_ifaces_24g}" ]; then
__repacd_fronthaulmgrmon_debug "No 2.4 GHz AP VAPs found"
else
# Bring Down all 2.4G AP VAPs
for item in $ap_ifaces_24g
do
ifconfig "$item" down
done
fi
}
# Initialize the fronthaul manager, taking action to bring down the fronthaul
# VAPs if the feature is enabled and the gateway is not reachable.
repacd_fronthaulmgrmon_init() {
local force_down_on_start
# First resolve the config parameters.
config_load repacd
config_get manage_fronthaul_and_backhaul_independently 'FrontHaulMgr' \
'ManageFrontAndBackHaulsIndependently' '0'
config_get fronthaul_VAPs_bringdown_time 'FrontHaulMgr' \
'FrontHaulMgrTimeout' '300'
config_get force_down_on_start 'FrontHaulMgr' 'ForceDownOnStart' 0
if [ "$manage_fronthaul_and_backhaul_independently" -gt 0 ]; then
config_load wireless
config_foreach __repacd_fronthaulmgrmon_get_fronthaul_vaps wifi-iface "lan"
__repacd_fronthaulmgrmon_debug "Resolved 2.4 GHz: $ap_ifaces_24g"
__repacd_fronthaulmgrmon_debug "Resolved 5 GHz: $ap_ifaces_5g"
if [ "$IS_GW_REACHABLE" -gt 0 ]; then
__repacd_fronthaulmgrmon_debug "Bringing up Front-haul VAPs"
__repacd_fronthaulmgrmon_bringup_AP_VAPs
is_front_haul_VAPs_brought_down=0
elif [ "$force_down_on_start" -gt 0 ]; then
__repacd_fronthaulmgrmon_debug "Bringing down fronthaul VAPs on start"
__repacd_fronthaulmgrmon_bringdown_AP_VAPs
is_front_haul_VAPs_brought_down=1
fi
fi
}
# Perform the periodic check to determine whether the fronthual interface
# states need to be updated or not.
repacd_fronthaulmgrmon_check() {
if [ "$manage_fronthaul_and_backhaul_independently" -gt 0 ]; then
if [ "$IS_GW_REACHABLE" -eq 0 ]; then
if [ "$is_front_haul_VAPs_brought_down" -eq 0 ]; then
if __repacd_wifimon_is_timeout "$GW_NOT_REACHABLE_TIMESTAMP" \
$fronthaul_VAPs_bringdown_time; then
__repacd_fronthaulmgrmon_debug "Expired $fronthaul_VAPs_bringdown_time sec, Bringing down Front-haul VAPs"
__repacd_fronthaulmgrmon_bringdown_AP_VAPs
is_front_haul_VAPs_brought_down=1
fi
fi
else
if [ "$is_front_haul_VAPs_brought_down" -gt 0 ]; then
__repacd_fronthaulmgrmon_debug "Bringing up Front-haul VAPs"
__repacd_fronthaulmgrmon_bringup_AP_VAPs
if __repacd_fronthaulmgrmon_all_AP_VAPs_up "${ap_ifaces_5g}" &&
__repacd_fronthaulmgrmon_all_AP_VAPs_up "${ap_ifaces_24g}"; then
__repacd_fronthaulmgrmon_debug "All Front-haul VAPs are up"
is_front_haul_VAPs_brought_down=0
fi
fi
fi
fi
}