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.

270 lines
14 KiB
Bash

4 years ago
#!/bin/sh
# Copyright (c) 2017 Qualcomm Technologies, Inc.
# All Rights Reserved.
# Confidential and Proprietary - Qualcomm Technologies, Inc.
BACKHAULMGRMON_DEBUG_OUTOUT=0
. /lib/functions/repacd-plcmon.sh
. /lib/functions/repacd-wifimon.sh
backhaulmgr_rate_samples=0
prev_plc_rate_compare_counter=0 prev_wlan_rate_compare_counter=0
wlan_rate_consistent_num=0 plc_rate_consistent_num=0
gw_not_reachable_consistent_num=0
PingTimeoutsToCAP=0
# Config Parameters
config_eval_time_plc=0 select_only_one_backhaul_interface=0
# PLC parameters
is_plc_enabled=0 is_plc_connected=0
is_plc_iface_brought_down=0 is_wlan_ifaces_brought_down=0
prev_plc_rate=0 force_down_plc_timestamp=''
prev_wlan_rate=0
# Emit a message at debug level.
# input: $1 - the message to log
__repacd_backhaulmgrmon_debug() {
local stderr=''
if [ "$BACKHAULMGRMON_DEBUG_OUTOUT" -gt 0 ]; then
stderr='-s'
fi
logger $stderr -t repacd.backhaulmgrmon -p user.debug "$1"
}
# Emit a message at info level.
__repacd_backhaulmgrmon_info() {
local stderr=''
if [ "$BACKHAULMGRMON_DEBUG_OUTOUT" -gt 0 ]; then
stderr='-s'
fi
logger $stderr -t repacd.backhaulmgrmon -p user.info "$1"
}
repacd_backhaulmgrmon_init() {
# First resolve the config parameters.
config_load repacd
config_get config_eval_time_plc 'PLCLink' 'PLCBackhaulEvalTime' '1800'
# Assuming that PLC link is guaranteed than 2G at configured threshold value
config_get plc_link_threshold_to_2G 'BackhaulMgr' 'PLCLinkThresholdto2G' '60'
config_get select_only_one_backhaul_interface 'BackhaulMgr' 'SelectOneBackHaulInterfaceInDaisy' '0'
config_get backhaulmgr_rate_samples 'BackhaulMgr' 'BackHaulMgrRateNumMeasurements' '5'
config_get PingTimeoutsToCAP 'BackhaulMgr' 'SwitchInterfaceAfterCAPPingTimeouts' '5'
}
repacd_backhaulmgrmon_check() {
if [ "$select_only_one_backhaul_interface" -gt 0 ]; then
if __repacd_plcmon_is_plc_enabled; then
local plc_iface_rate=0
if [ "$is_plc_enabled" -eq 0 ]; then
__repacd_backhaulmgrmon_debug "PLC is ENABLED"
is_plc_enabled=1
fi
if [ "$IS_GW_REACHABLE" -gt 0 ]; then
gw_not_reachable_consistent_num=0
else
if [ "$curr_root_distance" -eq "$RE_ROOT_AP_DISTANCE_INVALID" ]; then
gw_not_reachable_consistent_num=$((gw_not_reachable_consistent_num + 1))
fi
fi
if __repacd_plcmon_is_plc_connected plc_iface_rate; then
if [ "$is_plc_connected" -eq 0 ]; then
__repacd_backhaulmgrmon_debug "PLC CONNECTED"
is_plc_connected=1
fi
__repacd_backhaulmgrmon_debug "Rate sample: PLC = $plc_iface_rate Mbps"
# curr_root_distance greater than 1 means the topology is Daisy Chain
if [ "$curr_root_distance" -gt 1 -a \
"$curr_root_distance" -ne "$RE_ROOT_AP_DISTANCE_INVALID" ]; then
# Check whether WLAN association is complete
if [ "$bssid_assoc_count" -ge "$min_bssid_assoc" ]; then
# In case of Daisy Chain, evaluate the link rate of available interfaces
# At this moment WLAN and PLC interfaces are considered,
# can be extend to other interfaces.
# Check whether WLAN link rate more than PLC interface
# For now, Rate to CAP is considered only 5G interface.
if [ "$rate_to_CAP" -ge "$plc_iface_rate" ]; then
# Increment the counter for WLAN rate samples
wlan_rate_consistent_num=$((wlan_rate_consistent_num + 1))
plc_rate_consistent_num=0
# Assume that if Rate to CAP is zero and if curr_root_distance greater than 1
# means 2Gis connected.
# Assume 2G value would be around 80 - 120 Mbps in real world
# then bring down PLC interface. In case the threshold value of PLC to 2G
# interface is configured and if PLC link rate is consistently better than
# threshold value then select PLC ineterface and bring down WLAN interfaces.
elif [ "$rate_to_CAP" -eq 0 -a "$plc_iface_rate" -lt "$plc_link_threshold_to_2G" ]; then
# Increment the counter for WLAN rate samples
wlan_rate_consistent_num=$((wlan_rate_consistent_num + 1))
plc_rate_consistent_num=0
else
# Increment the counter for PLC rate samples
plc_rate_consistent_num=$((plc_rate_consistent_num + 1))
wlan_rate_consistent_num=0
fi
# Choosing best uplink interface
# Bringing down either of the interface avoids loop in SON network.
if [ "$wlan_rate_consistent_num" -eq "$backhaulmgr_rate_samples" ]; then
__repacd_backhaulmgrmon_debug "Bringing down PLC interface..."
__repacd_plcmon_bring_plc_iface_down
is_plc_iface_brought_down=1
prev_plc_rate=$plc_iface_rate
__repacd_wifimon_get_timestamp force_down_plc_timestamp
wlan_rate_consistent_num=0
plc_rate_consistent_num=0
elif [ "$plc_rate_consistent_num" -eq "$backhaulmgr_rate_samples" ]; then
__repacd_backhaulmgrmon_debug "Bringing down WLAN interface..."
__repacd_wifimon_bring_iface_down $sta_iface_5g
__repacd_wifimon_bring_iface_down $sta_iface_24g
# Bringing down interfaces will not update Wifi assoc count to zero.
# Backhaul Manager bringing down both 2G and 5G, so update Wifi assoc count to zero.
bssid_assoc_count=0
is_wlan_ifaces_brought_down=1
prev_wlan_rate=$rate_to_CAP
wlan_rate_consistent_num=0
plc_rate_consistent_num=0
fi
rate_to_CAP=0
fi
fi
if [ "$is_wlan_ifaces_brought_down" -eq 1 ]; then
# Check if PLC link rate is bad then switch over to WLAN interface
# and bring up WLAN interface to re-evaluate the Link metrics.
if [ "$prev_wlan_rate" -gt "$plc_iface_rate" ]; then
prev_wlan_rate_compare_counter=$((prev_wlan_rate_compare_counter + 1))
if [ "$prev_wlan_rate_compare_counter" -eq "$backhaulmgr_rate_samples" ]; then
__repacd_backhaulmgrmon_debug "PLC Link rate ($plc_iface_rate Mbps) is bad than previous rate of WLAN Link ($prev_wlan_rate Mbps)"
# Check whether WLAN interfaces are in progress of association
if [ "$bssid_assoc_count" -gt 0 ]; then
__repacd_backhaulmgrmon_debug "WLAN interfaces are already trying to associate"
else
# Only bringup WLAN interfaces if WLAN interfaces are not up
__repacd_backhaulmgrmon_debug "Bringing up WLAN interface..."
__repacd_wifimon_bring_iface_up $sta_iface_5g
__repacd_wifimon_bring_iface_up $sta_iface_24g
fi
is_wlan_ifaces_brought_down=0
prev_wlan_rate_compare_counter=0
fi
else
prev_wlan_rate_compare_counter=0
fi
# Check whether Gateway is reachable consitently, if not bringup WLAN interfaces
if [ "$gw_not_reachable_consistent_num" -eq "$PingTimeoutsToCAP" ]; then
# Check whether WLAN interfaces are in progress of association
if [ "$bssid_assoc_count" -gt 0 ]; then
__repacd_backhaulmgrmon_debug "WLAN interfaces are already trying to associate"
else
# Only bringup WLAN interfaces if WLAN interfaces are not up
__repacd_backhaulmgrmon_debug "Bringing up WLAN interface..."
__repacd_wifimon_bring_iface_up $sta_iface_5g
__repacd_wifimon_bring_iface_up $sta_iface_24g
fi
is_wlan_ifaces_brought_down=0
prev_wlan_rate_compare_counter=0
gw_not_reachable_consistent_num=0
fi
elif [ "$gw_not_reachable_consistent_num" -gt 0 ]; then
# Check whether WLAN associated and bring down PLC interface if Daisy Chain topology is formed
if [ "$curr_root_distance" -gt 1 -a \
"$curr_root_distance" -ne "$RE_ROOT_AP_DISTANCE_INVALID" ]; then
__repacd_backhaulmgrmon_debug "GW ($gw_ip) not reachable thru PLC, Bringing down PLC interface..."
__repacd_plcmon_bring_plc_iface_down
is_plc_iface_brought_down=1
prev_plc_rate=0
__repacd_wifimon_get_timestamp force_down_plc_timestamp
wlan_rate_consistent_num=0
plc_rate_consistent_num=0
fi
fi
else
if [ "$is_plc_connected" -gt 0 ]; then
__repacd_backhaulmgrmon_debug "PLC NOT CONNECTED"
is_plc_connected=0
fi
# Try to bringup WLAN ifaces which were brought down earlier by repacd
# When PLC backhaul connection is lost
if [ "$is_wlan_ifaces_brought_down" -eq 1 -a \
"$curr_root_distance" -eq "$RE_ROOT_AP_DISTANCE_INVALID" ]; then
__repacd_backhaulmgrmon_debug "Bringing up WLAN interface..."
__repacd_wifimon_bring_iface_up $sta_iface_5g
__repacd_wifimon_bring_iface_up $sta_iface_24g
is_wlan_ifaces_brought_down=0
# PLC not connected means either device is disconnected or
# repacd brought down PLC interface
# Check whether PLC is brought down by repacd
elif [ "$is_plc_iface_brought_down" -eq 1 ]; then
# if curr_root_distance RE_ROOT_AP_DISTANCE_INVALID means WLAN interfaces were not
# brought down by repacd but lost connection to CAP,
# if curr_root_distance 1 means the topology is not Daisy Chain
# in either of above cases bringup PLC interface
if [ "$curr_root_distance" -eq "$RE_ROOT_AP_DISTANCE_INVALID" ] || \
[ "$curr_root_distance" -eq 1 ]; then
__repacd_backhaulmgrmon_debug "Bringing up PLC interface..."
__repacd_plcmon_bring_plc_iface_up
is_plc_iface_brought_down=0
elif __repacd_wifimon_is_timeout $force_down_plc_timestamp $config_eval_time_plc; then
__repacd_backhaulmgrmon_debug "Bringing up PLC:eval interval $config_eval_time_plc sec expired"
__repacd_plcmon_bring_plc_iface_up
is_plc_iface_brought_down=0
__repacd_wifimon_get_timestamp force_down_plc_timestamp
fi
if [ "$curr_root_distance" -gt 1 ]; then
# Check if WLAN link rate is bad then switch over to PLC interface
# and bring up PLC interface to re-evaluate the Link metrics.
# For now, Rate to CAP is considered only 5G interface, assuming that if
# Rate to CAP is zero and if curr_root_distance greater than 1 means 2G
# is connected. Assume 2G value would be around 80 - 120 Mbps in real world
# then bring down PLC interface. In case the threshold value of PLC to 2G
# interface is configured and if PLC link rate is consistently better than
# threshold value then select PLC ineterface and bring down WLAN interfaces.
if [ "$rate_to_CAP" -eq 0 -a "$prev_plc_rate" -lt "$plc_link_threshold_to_2G" ]; then
prev_plc_rate_compare_counter=0
elif [ "$prev_plc_rate" -gt "$rate_to_CAP" ]; then
prev_plc_rate_compare_counter=$((prev_plc_rate_compare_counter + 1))
if [ "$prev_plc_rate_compare_counter" -eq "$backhaulmgr_rate_samples" ]; then
__repacd_backhaulmgrmon_debug "WLAN Link rate ($rate_to_CAP Mbps) is bad than previous rate of PLC Link ($prev_plc_rate Mbps)"
__repacd_backhaulmgrmon_debug "Bringing up PLC interface..."
__repacd_plcmon_bring_plc_iface_up
is_plc_iface_brought_down=0
prev_plc_rate_compare_counter=0
fi
else
prev_plc_rate_compare_counter=0
fi
fi
rate_to_CAP=0
fi
fi
else
if [ "$is_plc_enabled" -gt 0 ]; then
__repacd_backhaulmgrmon_debug "PLC is DISABLED"
is_plc_enabled=0
fi
fi
fi
}