码迷,mamicode.com
首页 > 其他好文 > 详细

classifier.cc-recv() [ns2.35]

时间:2015-01-05 11:04:17      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:

 

 1 void Classifier::recv(Packet* p, Handler*h)//original
 2 {
 3     NsObject* node = find(p);
 4     if (node == NULL) {
 5         /*
 6          * XXX this should be "dropped" somehow.  Right now,
 7          * these events aren‘t traced.
 8          */
 9         Packet::free(p);
10         return;
11     }
12 
13     node->recv(p,h);
14 }
15 
16 ===============================================================================================================
17 
18 int chooseECNSlot()
19 //这个函数还是改成专门筛选流的函数(筛选出需要窗口减半的流)
20 {//在打ecn的地方引入调用这个函数,通过该函数来打ECN?或者通过该函数有针对性的回调打ecn的函数。
21 //该函数需要能访问到umap以及各流的window大小。
22     
23     //sort(window)其实不用。用下面的方法只需遍历一次,O(N)复杂度即可。如果sort要O(NlogN)。
24     int maxProgress=0;//初始化最大进度值maxProgress
25     int mark=-1;//用来标记选中的流s
26     for(i=1;i<=n;i++)//其实遍历slot就行!
27     {
28         if(window>2*N)//在window大于2N的流里面找进度最大的。(如何获取该流的window?)
29         {
30             if(该流的进度值(umap.second)>maxProgress)
31             {
32                 maxProgress=该进度值(umap.second);//更新maxProgress  
33                 mark=i;//标记下该流的node;
34             }
35         }
36         else
37         {//如果没有window>2N的流,就选当前进度最大的流。
38             
39         }
40     }
41     if(mark!=-1)
42         return mark;
43     else//没有window>2N的流
44         return mark2;
45     
46 }
47 
48 
49 
50 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
51 15.1.4 rewrite:
52 
53 #include "flags.h"//里面有很多需要的变量和函数,如ce()
54 void Classifier::recv(Packet* p, Handler*h)
55 {
56     NsObject* node = find(p);//find调用classify,classify返回dport。
57     if (node == NULL) {
58         Packet::free(p);
59         return;
60     }
61     umap[node]++;//需要在classifier.h中classifier类内部定义unordered_map umap<NsObject*,long long int>。 (但是注意,当umap里有流已传输完毕后要剔除出去,否则影响排序XXXX如果不用mark2的话那就不会影响到,因为首先是按window来看的,只有window足够大才会看进度。已经传输完成的流window应该变为0吧(如果没变要记得调整))。
62     
63     hdr_flags *hf=hdr_flags::access(pickPacketForECN(p));
64     if(hf->ce()==1)// 说明switch中发生了拥塞
65     {
66         hf->ce()=0;//首先清零。然后再根据算法分配ce。
67         int mark=function(筛选出需要窗口减半的流的slot下标);//该函数参照上面的chooseECNSlot
68     }
69     
70     if (mark != -1 &&当前packet的dport==slot[mark])//对每一个到来的packet都检查,直到发现是mark所标记的那个。可通过portclassifier里的classify返回dport。(参照slideshare P15,为什么通过classifier类,调用的却是portclassifier里的classify ?)
71     {
72         hf->ce()=1;
73         mark = -1;//使mark失效。
74     }
75     node->recv(p,h);
76 }

 

classifier.cc-recv() [ns2.35]

标签:

原文地址:http://www.cnblogs.com/forcheryl/p/4202782.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!