/
monitor_reflector_path.sh
117 lines (88 loc) · 3.17 KB
/
monitor_reflector_path.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#!/bin/bash
# monitor_reflector_path.sh compares ping results with a baseline to ascertain whether reflector path is delayed
# monitor_reflector_path.sh is part of CAKE-autorate
# CAKE-autorate automatically adjusts bandwidth for CAKE in dependence on detected load and RTT
# inspired by @moeller0 (OpenWrt forum)
# initial sh implementation by @Lynx (OpenWrt forum)
# requires packages: iputils-ping, coreutils-date and coreutils-sleep
ping_reflector()
{
local reflector=$1
exec /usr/bin/ping -i $ping_reflector_interval $reflector > /tmp/CAKE-autorate/${reflector}_pipe
}
update_OWD_baseline()
{
local OWD=$1
local OWD_delta=$2
local OWD_baseline=$3
local OWD_baseline
if (( $OWD_delta >= 0 )); then
OWD_baseline=$(( ( (1000-$alpha_OWD_increase)*$OWD_baseline+$alpha_OWD_increase*$OWD )/1000 ))
else
OWD_baseline=$(( ( (1000-$alpha_OWD_decrease)*$OWD_baseline+$alpha_OWD_decrease*$OWD )/1000 ))
fi
echo $OWD_baseline
}
detect_path_delay()
{
local -n OWD_deltas=$1
local detection_cnt
detection_cnt=0
for delta in "${OWD_deltas[@]}"
do
if (( $delta > (1000*$delay_thr) )); then ((detection_cnt+=1)); fi
done
(( $detection_cnt >= $detection_thr ))
return
}
monitor_reflector_path()
{
local reflector=$1
ul_OWD_deltas=( $(printf ' 0%.0s' $(seq $delay_buffer_len)) )
dl_OWD_deltas=( $(printf ' 0%.0s' $(seq $delay_buffer_len)) )
reflector_ul_path_delayed_file="/tmp/CAKE-autorate/${reflector}_ul_path_delayed"
reflector_dl_path_delayed_file="/tmp/CAKE-autorate/${reflector}_dl_path_delayed"
RTT=$(/usr/bin/ping -c 1 $reflector | awk -Ftime= 'NF>1{print 1000*($2+0)}')
#convert RTT to microseconds
ul_OWD=$(( $RTT / 2 ))
dl_OWD=$ul_OWD
ul_OWD_baseline=$ul_OWD
dl_OWD_baseline=$dl_OWD
while true
do
RTT=$(head -1 /tmp/CAKE-autorate/${reflector}_pipe | awk -Ftime= 'NF>1{print 1000*($2+0)}')
[ -z "$RTT" ] && continue
#echo $ping_line
#convert RTT to microseconds
ul_OWD=$(( $RTT / 2 ))
dl_OWD=$ul_OWD
ul_OWD_delta=$(( $ul_OWD-$ul_OWD_baseline ))
dl_OWD_delta=$(( $dl_OWD-$dl_OWD_baseline ))
ul_OWD_deltas+=($ul_OWD_delta)
unset 'ul_OWD_deltas[0]'
ul_OWD_deltas=(${ul_OWD_deltas[*]})
dl_OWD_deltas+=($dl_OWD_delta)
unset 'dl_OWD_deltas[0]'
dl_OWD_deltas=(${dl_OWD_deltas[*]})
# echo "ul_OWD_baseline" $ul_OWD_baseline "ul_OWD=" $ul_OWD "ul_OWD_deltas=" ${ul_OWD_deltas[@]}
ul_OWD_baseline=$(update_OWD_baseline $ul_OWD $ul_OWD_delta $ul_OWD_baseline)
dl_OWD_baseline=$(update_OWD_baseline $dl_OWD $dl_OWD_delta $dl_OWD_baseline)
if detect_path_delay ul_OWD_deltas; then
if [ ! -f $reflector_ul_path_delayed_file ]; then
touch $reflector_ul_path_delayed_file
# echo $reflector "Upload path is delayed! Deltas =" "${ul_OWD_deltas[@]}"
fi
elif [ -f $reflector_ul_path_delayed_file ]; then
rm $reflector_ul_path_delayed_file
fi
if detect_path_delay dl_OWD_deltas; then
if [ ! -f $reflector_dl_path_delayed_file ]; then
touch $reflector_dl_path_delayed_file
# echo $reflector "Download path is delayed! Deltas =" "${dl_OWD_deltas[@]}"
fi
elif [ -f $reflector_dl_path_delayed_file ]; then
rm $reflector_dl_path_delayed_file
fi
> /tmp/CAKE-autorate/${reflector}_ping_output
done
}