print "# THRESHOLD=" THRESHOLD
print "# FUDGE=" FUDGE
print "# PINGSLOTS=" PINGSLOTS
- print "# BW_MAX=" BW_MAX
- print "# BW_MIN=" BW_MIN
+ print "# BW_MAX_RX=" BW_MAX_RX
+ print "# BW_MIN_RX=" BW_MIN_RX
print "# STATS_TX=" STATS_TX
print "# IFACE_TX=" IFACE_TX
print "# STATS_RX=" STATS_RX
ping_pprev[pn] = -1 # latency recorded in the previous cycle
not_increasing_count[pn] = 0 # number of consecutive cycles with no (fudged) latency increase
}
+ ts = get_time()
+ bw_next_step_rx = 1
+ slice_bw_window_rx(BW_MIN_RX, BW_MAX_RX)
consec_timeouts = 0
adjust_ts_delta = 0
rx_rate_max = 100 # make something up
}
+function slice_bw_window_rx(bw_lower_bound_rx, bw_upper_bound_rx) {
+ bw_bound_delta_rx = (bw_upper_bound_rx - bw_lower_bound_rx)
+ 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))))
+ print "# RX step #" k " = " STEPS_RX[k] "Kbps "
+ }
+ k--
+ print "# MAX INDEX " k
+ bw_maxindex_rx = k
+ bw_next_step_rx = k
+ bw_cur_step_rx = k
+ set_bw(IFACE_RX, STEPS_RX[bw_next_step_rx])
+}
+
+
function update_ts() {
ts = get_time()
ts_delta = ts - ts_old
# Assume links are clogged, so we short-circuit a bandwidth decrease
if (consec_timeouts > ((1.5 * peer_count) + 2)) {
# print "# " ts " too many TIMEOUTS in a row, decreasing SQM bw"
- set_bw(IFACE_RX, 5000)
- set_bw(IFACE_TX, 5000)
+ bw_cur_step_rx = 0
+ set_bw(IFACE_RX, STEPS_RX[bw_cur_step_rx]) # XXX TODO
return
}
}
# XXX this logic needs fixing
- if ( rx_rate < (rx_rate_max * 0.1) || tx_rate < (tx_rate_max * 0.1) ) {
- # print "line does not appear to be loaded, skipping SQM update"
- return
- }
+ # if ( rx_rate < (rx_rate_max * 0.1) || tx_rate < (tx_rate_max * 0.1) ) {
# Try to determine the latency trend over the last few samples
last2avg = (((ping_prev[peername] + latency) / 2.0))
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)) {
+ print "# " ts " line does not appear to be loaded, skipping SQM bw downgrade"
+ } else {
# print ts " " adjust_ts_delta " CONSIDER BW DECREASE # " peername " lat=" latency " prev=" ping_prev[peername] " pprev=" ping_pprev[peername] " avg=" ping_avgs[peername] " min=" ping_min[peername]
- set_bw(IFACE_TX, 5000)
- set_bw(IFACE_RX, 5000)
+ 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"
+ set_bw(IFACE_RX, STEPS_RX[bw_next_step_rx])
+ bw_cur_step_rx = bw_next_step_rx
+ } else {
+ print "# already at lowest bw rx step " bw_cur_step_rx
+ }
+ }
# print "set adjust_old=" ts
adjust_old = ts
}
not_increasing_count[peername]=0
- } else if ((latency < FUDGE + ping_avgs[peername]) &&
- latency < ping_prev[peername] &&
- latency < ping_pprev[peername] &&
- ping_prev[peername] < ping_pprev[peername]) {
+ } else if (latency < ping_prev[peername] && latency < ping_pprev[peername] && ping_prev[peername] < ping_pprev[peername]) {
if (not_increasing_count[peername] > (5 * PINGSLOTS)) {
# print ts " " adjust_ts_delta " CONSIDER 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 "# +++ choosing " ts " bw rx step " bw_next_step_rx " := " STEPS_RX[bw_next_step_rx] "Kbps"
+ set_bw(IFACE_RX, STEPS_RX[bw_next_step_rx])
+ bw_cur_step_rx = bw_next_step_rx
+ } else {
+ print "# already at highest bw rx step " bw_cur_step_rx
+ }
not_increasing_count[peername]=0
- set_bw(IFACE_TX, 10000)
- set_bw(IFACE_RX, 10000)
adjust_old = ts
}
not_increasing_count[peername]++
function set_bw(dev, kbit) {
#print "# BW CHANGE dev=" dev " kbit=" kbit
- system("echo COMMAND " ts " tc qdisc change root dev " dev " cake bandwidth " kbit "Kbit")
+ system("set -x; : " ts "; tc qdisc change root dev " dev " cake bandwidth " kbit "Kbit")
}