On Fri, 21 Feb 2014, Nicolas KUHN wrote:
> We have a question regarding the NS-2 implementations of RED, CoDel, PIE
> and others AQMs. Especially, we believe that the way buffer-overflows
> are managed is not the same for each AQM scheme.
>
> In "Multimedia-unfriendly TCP Congestion Control and Home Gateway Queue
> Management" (L. Stewart et al.) details that :
> "PS: The queue is packet (slot) based, and the maximum queue length is
> specified as an integer number of packets:
> if (NumPktsInQ ≥ PktQueueLength)
> drop incoming packet"
>
> However:
> 1- In droptail.cc: if((q_->length() + 1) >= qlim_) buffer overflow is
> detected
> 2- In RED/PIE/CoDel/etc.: if((q_->length() >= qlim_) buffer overflow is
> detected
>
> In the case of RED/PIE, when there are buffer overflows, the incoming
> packet may not be dropped. As a result, the incoming packet needs to be
> stored before the other packet is selected for drop: if((q_->length() >=
> qlim_) should be avoided - and if((q_->length() + 1) >= qlim_) preferred.
>
> In the case of CoDel, when there are buffer overflows, the incoming
> packets are dropped. if((q_->length() >= qlim_) is a good solution.
>
> Anyway, the authors of "Multimedia-unfriendly TCP Congestion Control and
> Home Gateway Queue Management" (L. Stewart et al.) illustrate the impact
> of this setting that should be carefully discussed. This point is of
> interest while comparing the performance of various AQM schemes with
> NS-2.
>
> We believe that AQMs that need information about incoming packets before
> tail-dropping them MUST detect buffer over flow when if((q_->length() +
> 1) >= qlim_).
> Any thoughts?
While doing some tests with RED using ns2 in the past, I noticed this same
difference. I patched ns2 RED to get equal behavior (patch attached but it
probably breaks some of the ns2 tests which is why I didn't consider
trying to upstream it).
--
i.
[PATCH 1/1] Change size to match fifo behavior
---
queue/red.cc | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/queue/red.cc b/queue/red.cc
index 5a9c292..be3e4db 100644
--- a/queue/red.cc
+++ b/queue/red.cc
@@ -686,6 +686,8 @@ void REDQueue::enque(Packet* pkt)
int droptype = DTYPE_NONE;
int qlen = qib_ ? q_->byteLength() : q_->length();
int qlim = qib_ ? (qlim_ * edp_.mean_pktsize) : qlim_;
+ /* To make buffer equal to FIFO behavior */
+ int qlenafter = qlen + (qib_ ? ch->size() : 1);
curq_ = qlen; // helps to trace queue during arrival, if enabled
@@ -712,7 +714,7 @@ void REDQueue::enque(Packet* pkt)
edv_.v_prob = 0.0;
edv_.old = 0;
}
- if (qlen >= qlim) {
+ if (qlenafter >= qlim) {
// see if we've exceeded the queue size
droptype = DTYPE_FORCED;
}
--
1.7.9.5
_______________________________________________
aqm mailing list
[email protected]
https://www.ietf.org/mailman/listinfo/aqm