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
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
|
||
|
}
|