標籤:
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;//初始化最大進度值maxProgress25 int mark=-1;//用來標記選中的流s26 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 else37 {//如果沒有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下標);//該函數參照上面的chooseECNSlot68 }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]