?? wfqaggreg.cc
字號:
/* * Copyright (c) 1999-2000 Paolo Losi (p.losi@hypersonic.it) * * Copyright (c) 2001-2004 Paolo Losi (p.losi@hypersonic.it) * Alexander Sayenko (sayenko@cc.jyu.fi) * * All rights reserved * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */#include "wfqclassifier.h"#include <map>static class NS2WFQAggregClassifier : public TclClass { public: NS2WFQAggregClassifier() : TclClass("WFQAggregClassifier") {}; TclObject* create(int,const char*const*) { return(new WFQAggregClassifier); };} class_wfqsampleclassifier;WFQAggregClassifier::WFQAggregClassifier() { min_weight=10e+10;}int WFQAggregClassifier::command(int argc,const char*const* argv) { Tcl& tcl = Tcl::instance (); if (argc == 3) { if (!strcmp (argv[1],"getweight")) { int queueid = 0; queueid = atoi (argv[2]); std::map<unsigned int, WFQClass*>::iterator i = mWFQClasses.find (queueid); if (i != mWFQClasses.end()) { tcl.resultf ("%lf",i->second->mWeight); return TCL_OK; } return TCL_ERROR; } } if (argc == 4) { if(!strcmp(argv[1],"setweight")) { double weight; int queueid,success = 0; success += sscanf(argv[2],"%d",&queueid); success += sscanf(argv[3],"%lf",&weight); if(success==2) { WFQClass* wfq_class; std::map<unsigned int, WFQClass*>::iterator i = mWFQClasses.find (queueid); if (i == mWFQClasses.end()) { wfq_class = new WFQClass (queueid); mWFQClasses[queueid] = wfq_class; } else wfq_class = i->second; wfq_class->mWeight = weight; min_weight = (min_weight < weight) ? min_weight : weight; return TCL_OK; } return TCL_ERROR; } // end of setweight if(!strcmp(argv[1],"setqueue")) { int queueid,flowid,success=0; success += sscanf(argv[2],"%d",&flowid); success += sscanf(argv[3],"%d",&queueid); if(success==2) { mFlowToClass[flowid] = queueid; if (mWFQClasses.find(queueid) == mWFQClasses.end()) mWFQClasses[queueid] = new WFQClass (queueid); return TCL_OK; } return TCL_ERROR; } // end of setqueue if(!strcmp(argv[1],"setlength")) { int queueid,length,success = 0; success += sscanf(argv[2],"%d",&queueid); success += sscanf(argv[3],"%d",&length); if(success==2) { WFQClass* wfq_class; std::map<unsigned int, WFQClass*>::iterator i = mWFQClasses.find (queueid); if (i == mWFQClasses.end()) { wfq_class = new WFQClass (queueid); mWFQClasses[queueid] = wfq_class; } else wfq_class = i->second; wfq_class->mMaxLength = length; return TCL_OK; } return TCL_ERROR; } // end of setlenght } // end of argc == 4 return (TclObject::command(argc, argv));}inline WFQClass* WFQAggregClassifier::get_queue(Packet *p) { hdr_ip* h = hdr_ip::access(p); std::map<unsigned int, unsigned int>::iterator i = mFlowToClass.find(h->flowid()); if (i == mFlowToClass.end()) return NULL; return mWFQClasses[i->second];} WFQAggregClassifier::~WFQAggregClassifier(){ std::map<unsigned int, WFQClass*>::iterator i = mWFQClasses.begin (); while (i != mWFQClasses.end()) { delete (i->second); i++; }}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -