[Ns-developers] [ns] Patch for RFC3168 codepoints

Olivier Mehani olivier.mehani at nicta.com.au
Sun Oct 12 21:24:47 PDT 2008


Hi list,

A part of the DCCP patch (by Nils-Erik Mattsson) for ns [0,1] contains
support for RFC3168 Codepoints [2].

This code is not strictly DCCP-related, and other protocols may benefit
from this being integrated in the trunk.

I stripped the patch down to the relevant section to help reviewing. Can
somebody have an educated look at it?

Hope this helps (:

[0] http://lifc.univ-fcomte.fr/~dedu/ns2/dccp-ns2.31.patch
[1] http://nicta.com.au/__data/assets/file/0011/16868/ns-233-dccp-1.patch
[2] http://www.ietf.org/rfc/rfc3168.txt

-- 
Olivier Mehani <olivier.mehani at nicta.com.au>
PGP fingerprint: 3720 A1F7 1367 9FA3 C654  6DFB 6845 4071 E346 2FD1
-------------- next part --------------
diff -urNU5 ns-2.33/queue/errmodel.cc ns-2.33-dccp/queue/errmodel.cc
--- ns-2.33/queue/errmodel.cc	2008-04-01 13:00:08.000000000 +1100
+++ ns-2.33-dccp/queue/errmodel.cc	2008-05-05 17:17:43.000000000 +1000
@@ -192,11 +192,13 @@
 	if (error) {
 		ch->error() |= error;
 
 		if (markecn_) {
 			hdr_flags* hf = hdr_flags::access(p);
-			hf->ce() = 1;
+			/* ---  Altered to support the codepoints in rfc3168 --- */
+			hf->ce() = 1;  //set ce codepoint
+			hf->ect() = 1; 
 		} else if (delay_pkt_) {
 			// Delay the packet.
 			Scheduler::instance().schedule(target_, p, delay_);
 			return;
 		} else if (drop_) {
diff -urNU5 ns-2.33/queue/gk.cc ns-2.33-dccp/queue/gk.cc
--- ns-2.33/queue/gk.cc	2008-04-01 13:00:08.000000000 +1100
+++ ns-2.33-dccp/queue/gk.cc	2008-05-05 17:17:43.000000000 +1000
@@ -170,12 +170,16 @@
   /* If the Real queue has packets and the mark_flag is set, mark the
 	 outgoing packet. */
   if((q_->length() > 0) && (mark_flag == 1)){
 	Packet *pp = q_->deque();
 	hdr_flags* hf = hdr_flags::access(pp);
-	if(hf->ect() == 1)  // ECN capable flow
-		hf->ce() = 1; // Mark the TCP Flow;
+
+	/* ---  Altered to support the codepoints in rfc3168 --- */ 
+	if(hf->ect() != hf->ce()){  // ECN capable flow (ECT(0), ECT(1))
+		hf->ce() = 1;   // Set ce codepoint
+		hf->ect() = 1;
+	}
 	return pp;
   }
   else return q_->deque();
 }
 
diff -urNU5 ns-2.33/queue/pi.cc ns-2.33-dccp/queue/pi.cc
--- ns-2.33/queue/pi.cc	2008-04-01 13:00:08.000000000 +1100
+++ ns-2.33-dccp/queue/pi.cc	2008-05-05 17:17:43.000000000 +1000
@@ -197,12 +197,17 @@
 	double u = Random::uniform();
 	if (u <= p) {
 		edv_.count = 0;
 		edv_.count_bytes = 0;
 		hdr_flags* hf = hdr_flags::access(pickPacketForECN(pkt));
-		if (edp_.setbit && hf->ect()) {
-			hf->ce() = 1; 	// mark Congestion Experienced bit
+
+		/* ---  Altered to support the codepoints in rfc3168 --- */ 
+		if (edp_.setbit &&
+		    (hf->ect() != hf->ce() ||  //ecn capable
+		     hf->ect() == 1 && hf->ce() == 1)) {  //or marked
+			hf->ce() = 1; 	// set ce codepoint
+			hf->ect() = 1;
 			return (0);	// no drop
 		} else {
 			return (1);	// drop
 		}
 	}
diff -urNU5 ns-2.33/queue/red.cc ns-2.33-dccp/queue/red.cc
--- ns-2.33/queue/red.cc	2008-04-01 13:00:08.000000000 +1100
+++ ns-2.33-dccp/queue/red.cc	2008-05-05 17:19:59.000000000 +1000
@@ -557,13 +557,18 @@
 	if (u <= edv_.v_prob) {
 		// DROP or MARK
 		edv_.count = 0;
 		edv_.count_bytes = 0;
 		hdr_flags* hf = hdr_flags::access(pickPacketForECN(pkt));
-		if (edp_.setbit && hf->ect() && 
-                     (!edp_.use_mark_p || edv_.v_prob1 < edp_.mark_p)) { 
+ 
+ 		/* ---  Altered to support the codepoints in rfc3168 --- */
+ 		if (edp_.setbit &&
+ 		    (hf->ect() != hf->ce() ||  //packet is ecn capabel
+ 		     hf->ect() == 1 && hf->ce() == 1)  //or already marked
+ 		    && (!edp_.use_mark_p || edv_.v_prob1 < edp_.mark_p)) { 
 			hf->ce() = 1; 	// mark Congestion Experienced bit
+ 			hf->ect() = 1; 
 			// Tell the queue monitor here - call emark(pkt)
 			return (0);	// no drop
 		} else {
 			return (1);	// drop
 		}
diff -urNU5 ns-2.33/queue/rem.cc ns-2.33-dccp/queue/rem.cc
--- ns-2.33/queue/rem.cc	2008-04-01 13:00:08.000000000 +1100
+++ ns-2.33-dccp/queue/rem.cc	2008-05-05 17:17:43.000000000 +1000
@@ -209,12 +209,16 @@
 				int size = hdr_cmn::access(p)->size ();
 				pro = remv_.v_prob*size/remp_.p_pktsize; 
 			}
    		if ( u <= pro ) {
 				hdr_flags* hf = hdr_flags::access(p);
-				if(hf->ect() == 1) { 
-					hf->ce() = 1; 
+
+				/* ---  Altered to support the codepoints in rfc3168 --- */ 
+				if(hf->ect() != hf->ce() || // ECN capable
+				   hf->ect() == 1 && hf->ce() == 1) {  //marked
+					hf->ce() = 1; // Set ce codepoint
+					hf->ect() = 1;
 					pmark_++;
 				}
 			}
 		}
 	}
diff -urNU5 ns-2.33/queue/rio.cc ns-2.33-dccp/queue/rio.cc
--- ns-2.33/queue/rio.cc	2008-04-01 13:00:08.000000000 +1100
+++ ns-2.33-dccp/queue/rio.cc	2008-05-05 17:17:43.000000000 +1000
@@ -209,13 +209,18 @@
 	if (u <= edv_in_.v_prob) {
 		// DROP or MARK
 		edv_in_.count = 0;
 		edv_in_.count_bytes = 0;
 		hdr_flags* hf = hdr_flags::access(pickPacketForECN(pkt));
-		if (edp_.setbit && hf->ect() && 
+
+		/* ---  Altered to support the codepoints in rfc3168 --- */
+		if (edp_.setbit &&
+		    (hf->ect() != hf->ce() ||  //packet is ecn capable
+		     hf->ect() == 1 && hf->ce() == 1) &&  //or marked
 				edv_in_.v_ave < edp_in_.th_max) {
-			hf->ce() = 1; 	// mark Congestion Experienced bit
+			hf->ce() = 1; 	// set ce codepoint
+			hf->ect() = 1;
 			return (0);	// no drop
 		} else {
 			return (1);	// drop
 		}
 	}
diff -urNU5 ns-2.33/queue/vq.cc ns-2.33-dccp/queue/vq.cc
--- ns-2.33/queue/vq.cc	2008-04-01 13:00:08.000000000 +1100
+++ ns-2.33-dccp/queue/vq.cc	2008-05-05 17:17:43.000000000 +1000
@@ -257,18 +257,24 @@
 	if(vq_len < 0.0) vq_len = 0.0;
 	
 	if(markfront_){ 
 		Packet *pp = q_->head();
 		hdr_flags* hf = hdr_flags::access(pp);
-		if(hf->ect() == 1)  // ECN capable flow
-			hf->ce() = 1; // Mark the TCP Flow;
+		/* ---  Altered to support the codepoints in rfc3168 --- */
+		if(hf->ect() != hf->ce()){  // ECN capable flow
+			hf->ce() = 1; // set ce codepoint
+			hf->ect() = 1;
+		}
 	}
 	else{ 
 		/* Mark the current packet and forget about it */
 		hdr_flags* hdr = hdr_flags::access(pkt);
-		if(hdr->ect() == 1)  // ECN capable flow
-			hdr->ce() = 1; // For TCP Flows
+		/* ---  Altered to support the codepoints in rfc3168 --- */
+		if(hdr->ect() != hdr->ce()){  // ECN capable flow
+			hdr->ce() = 1;  // set ce codepoint
+			hdr->ect() = 1;
+		}
 	}
 }	
 
 /* Implements a simple drop-tail/drop-front here. If needed other
    mechanism (like drop-random ) can also be implemented */ 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: not available
Url : http://mailman.isi.edu/pipermail/ns-developers/attachments/20081013/bd702827/attachment.bin


More information about the Ns-developers mailing list