Hi list,

I'm not sure if a more appropriate list (ns-dev ?) exists, so I'm
posting here. Please tell me if this suggestion would better be posted on
another list/tracking systems.

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 <[EMAIL PROTECTED]>
PGP fingerprint: 3720 A1F7 1367 9FA3 C654  6DFB 6845 4071 E346 2FD1
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 */ 

Reply via email to