aboutsummaryrefslogtreecommitdiff
path: root/sys/netpfil/ipfw/dn_aqm_pie.c
diff options
context:
space:
mode:
authorDon Lewis <truckman@FreeBSD.org>2017-05-19 08:38:03 +0000
committerDon Lewis <truckman@FreeBSD.org>2017-05-19 08:38:03 +0000
commitd196c9ee16ff7416f68e5e1c6529d4344baef236 (patch)
tree84d3c098befdf36d091ca37aa544bdcabcf49d2b /sys/netpfil/ipfw/dn_aqm_pie.c
parent22a752b482e357c78745b310f6bb916346f05721 (diff)
downloadsrc-d196c9ee16ff7416f68e5e1c6529d4344baef236.tar.gz
src-d196c9ee16ff7416f68e5e1c6529d4344baef236.zip
Fix the queue delay estimation in PIE/FQ-PIE when the timestamp
(TS) method is used. When packet timestamp is used, the "current_qdelay" keeps storing the last queue delay value calculated in the dequeue function. Therefore, when a burst of packets arrives followed by a pause, the "current_qdelay" will store a high value caused by the burst and stick to that value during the pause because the queue delay measurement is done inside the dequeue function. This causes the drop probability calculation function to calculate high drop probability value instead of zero and prevents the burst allowance mechanism from working properly. Fix this problem by resetting "current_qdelay" inside the drop probability calculation function when the queue length is zero and TS option is used. Submitted by: Rasool Al-Saadi <ralsaadi@swin.edu.au> MFC after: 1 week
Notes
Notes: svn path=/head/; revision=318527
Diffstat (limited to 'sys/netpfil/ipfw/dn_aqm_pie.c')
-rw-r--r--sys/netpfil/ipfw/dn_aqm_pie.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/sys/netpfil/ipfw/dn_aqm_pie.c b/sys/netpfil/ipfw/dn_aqm_pie.c
index 8259d0853df6..c306a4caac9d 100644
--- a/sys/netpfil/ipfw/dn_aqm_pie.c
+++ b/sys/netpfil/ipfw/dn_aqm_pie.c
@@ -211,11 +211,16 @@ calculate_drop_prob(void *x)
pprms = pst->parms;
prob = pst->drop_prob;
- /* calculate current qdelay */
- if (pprms->flags & PIE_DEPRATEEST_ENABLED) {
+ /* calculate current qdelay using DRE method.
+ * If TS is used and no data in the queue, reset current_qdelay
+ * as it stays at last value during dequeue process.
+ */
+ if (pprms->flags & PIE_DEPRATEEST_ENABLED)
pst->current_qdelay = ((uint64_t)pst->pq->ni.len_bytes *
pst->avg_dq_time) >> PIE_DQ_THRESHOLD_BITS;
- }
+ else
+ if (!pst->pq->ni.len_bytes)
+ pst->current_qdelay = 0;
/* calculate drop probability */
p = (int64_t)pprms->alpha *