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

Reply via email to