#!/usr/bin/awk -f
# Copyright (C)2022 Johannes Truschnigg (https://johannes.truschnigg.info/)
+#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# bandwidth is being shaped.
BEGIN {
- CONVFMT="%.3f"
+ CONVFMT = "%.3f"
print "# INIT=" systime()
print "# THRESHOLD=" THRESHOLD
print "# FUDGE=" FUDGE
# 192.168.1.50 : [0], timed out (NaN avg, 100% loss)
/, timed out / {
- pn=$1
- seq=$3
- bytes=0
- lat=9999 # XXX TODO this could be a bad idea, revise
+ pn = $1
+ seq = $3
+ bytes = 0
+ lat = 9999 # XXX TODO this could be a bad idea, revise
update_bw()
# XXX TODO what now? (how) can we do better in case of an apparent outage?
consec_timeouts++
# 1.1.1.1 : [0], 1288 bytes, 10.3 ms (10.3 avg, 0% loss)
/[0-9] bytes, [0-9]*.[0-9]* ms / {
- pn=$1
- seq=$3
- bytes=$4
- lat=$6
+ pn = $1
+ seq = $3
+ bytes = $4
+ lat = $6
update_bw()
consec_timeouts = 0
process_record(pn, bytes, lat)
bw_steps_rx = 1+int((log(bw_bound_delta_rx)/log(10)) ^ 1.6)
print "# STEPS_RX=" bw_steps_rx
for (k = 0; k <= bw_steps_rx; k++) {
- STEPS_RX[k]=int((bw_lower_bound_rx + (k * (bw_bound_delta_rx / bw_steps_rx))))
+ STEPS_RX[k] = int((bw_lower_bound_rx + (k * (bw_bound_delta_rx / bw_steps_rx))))
print "# RX step #" k " = " STEPS_RX[k] "Kbps "
}
k--
function get_time() {
getline upt < "/proc/uptime"
close("/proc/uptime")
- split(upt,ts," ")
+ split(upt, ts, " ")
return ts[1]
}
return
}
- tx_old=tx
- rx_old=rx
+ tx_old = tx
+ rx_old = rx
getline tx < STATS_TX
close(STATS_TX)
close(STATS_RX)
# Convert to bytes to Kbit, compute rates over ts_delta (given in seconds)
- rx_delta=int(((rx - rx_old) / 128))
- rx_rate=int((rx_delta / ts_delta))
- tx_delta=int(((tx - tx_old) / 128))
- tx_rate=int((tx_delta / ts_delta))
+ rx_delta = int(((rx - rx_old) / 128))
+ rx_rate = int((rx_delta / ts_delta))
+ tx_delta = int(((tx - tx_old) / 128))
+ tx_rate = int((tx_delta / ts_delta))
# Record max. rates in each direction
if (tx_rate_max < tx_rate) {
adjust_sqm(pn, lat)
}
- ping_pprev[pn]=ping_prev[pn]
- ping_prev[pn]=lat
+ ping_pprev[pn] = ping_prev[pn]
+ ping_prev[pn] = lat
}
thresh_fudged = (FUDGE + (ping_avgs[peername] * THRESHOLD))
if (last2avg > thresh_fudged ) {
if (latency > ping_prev[peername] && latency > ping_pprev[peername]) {
- if ( rx_rate < (rx_rate_max * 0.1)) { # XXX TODO is this correct?
+ if (rx_rate < (rx_rate_max * 0.1)) { # XXX TODO is this correct?
print "# " ts " line does not appear to be loaded, skipping futile SQM bw downgrade"
} else {
- # print "# " ts " " adjust_ts_delta " BW DECREASE # " peername " lat=" latency " prev=" ping_prev[peername] " pprev=" ping_pprev[peername] " avg=" ping_avgs[peername] " min=" ping_min[peername]
if (bw_cur_step_rx > 0) {
bw_next_step_rx = bw_cur_step_rx - 1
print "--- " ts " choosing bw rx step " bw_next_step_rx " := " STEPS_RX[bw_next_step_rx] "Kbps rx=" rx_rate " tx=" tx_rate
# print "set adjust_old=" ts
adjust_old = ts
}
- not_increasing_count[peername]=0
- } else if (latency < (ping_prev[peername] + FUDGE/2) && latency < (ping_pprev[peername] + FUDGE / 2) && ping_prev[peername] < (ping_pprev[peername] + FUDGE/2)) {
+ not_increasing_count[peername] = 0
+ } else if (latency < (ping_prev[peername] + FUDGE / 2) && latency < (ping_pprev[peername] + FUDGE / 2) && ping_prev[peername] < (ping_pprev[peername] + FUDGE/2)) {
if (not_increasing_count[peername] > (5 * PINGSLOTS)) {
- # print "# " ts " " adjust_ts_delta " BW INCREASE # " peername " lat=" latency " prev=" ping_prev[peername] " pprev=" ping_pprev[peername] " avg=" ping_avgs[peername] " min=" ping_min[peername]
if (bw_cur_step_rx < bw_maxindex_rx) {
bw_next_step_rx = bw_cur_step_rx + 1
print "+++ " ts " choosing bw rx step " bw_next_step_rx " := " STEPS_RX[bw_next_step_rx] "Kbps rx=" rx_rate " tx=" tx_rate
} else {
print "+++ " ts " already at highest bw rx step " bw_cur_step_rx " rx=" rx_rate " tx=" tx_rate
}
- not_increasing_count[peername]=0
+ not_increasing_count[peername] = 0
adjust_old = ts
}
not_increasing_count[peername]++