📄 classifier-cip.cc
字号:
#include "classifier-cip.h"static class CipAddressClassifierClass : public TclClass {public: CipAddressClassifierClass() : TclClass("Classifier/Addr/Cip") {} TclObject* create(int argc, const char*const* argv) { return (new CipAddressClassifier()); }} class_cip_address_classifier;CipAddressClassifier::CipAddressClassifier() : AddressClassifier() { bind("top_", &top_); bind("cipFlag_", &cipFlag_); bind("cipnodeid_", &cipnodeid_); bind("bsFlag_", &bsFlag_); bind("mFlag_", &mFlag_); bind("rootnodeid_", &rootnodeid_); delay_time = 0.0; ss_mode = 0; ss_link = NULL; chg2ss = 0;}void CipAddressClassifier::recv(Packet* p, Handler*h){ hdr_cmn *ch = HDR_CMN(p); int strl; // Store packet //currentpacket = p; hdr_ip* iph = hdr_ip::access(p); if (top_ && cipFlag_ && !mFlag_) { char* nextHop; //REL hdr_cmn *ch0 = hdr_cmn::access(currentpacket); hdr_cmn *ch = hdr_cmn::access(p); int rid = ch->cipnodeid_; if(rid == -1) { if(bsFlag_) { //uplink if(iph->dst().addr_ != -1) { printf("bs(%s) received at %f \n", name(), Scheduler::instance().clock()); } Tcl::instance().evalf("%s update_routing_table %d %d %d %d %d", name(), iph->src().addr_, iph->dst().addr_, ch->cipnodeid_, ch->ciptype_, ch->cipsemisoft_); //replace it with this node's id ch->cipnodeid_ = cipnodeid_; nextHop = Tcl::instance().result(); if (strcmp(nextHop, "-1")) { NsObject* node = (NsObject*)TclObject::lookup(nextHop); node->recv(p, h); return; } } else { //downlink Tcl::instance().evalf("%s Lookup_CIP_RT %d", name(), iph->dst().addr_); nextHop = Tcl::instance().result(); if (!strcmp(nextHop, "-1")) { if(bsFlag_) { if (default_target_) { default_target_->recv(p,h); return; } } } else { NsObject* node = (NsObject*)TclObject::lookup(nextHop); node->recv(p, h); return; } } } else { // nodes between GW and BS if(rootnodeid_ == rid) { //downlink Tcl::instance().evalf("%s Lookup_CIP_RT %d", name(), iph->dst().addr_); nextHop = Tcl::instance().result(); ch->cipnodeid_ = cipnodeid_; if (!strcmp(nextHop, "-1")) { if(bsFlag_) { if (default_target_) { default_target_->recv(p,h); return; } } } else if(!strcmp(nextHop, "-2")) { //No valid paging cache // simply drop packet Packet::free(p); return; } else { char nh[7]; int jj; //printf("we need to skip rest of this nextHop: %s\n", nextHop); strl = strlen(nextHop); jj = 0; for (int ii = 0; ii <= strl; ii++) { if(*(nextHop+ii) == ' ' || ii == strl) { //space or null memcpy(nh, (nextHop+jj), ii-jj); nh[ii-jj]='\0'; jj = ii+1; NsObject* node = (NsObject*)TclObject::lookup(nh); Scheduler& s = Scheduler::instance(); if(this->delay_time > 0 && ss_mode) { //printf("%s ss_mode: %d nh: %s ss_link: %s\n", name(), ss_mode, nh, semi_link); if(strl > 5 && !strcmp(nh, semi_link)) s.schedule(node, p->copy(), delay_time); else node->recv(p->copy(), h); } else { node->recv(p->copy(), h); } } } return; } } else { hdr_cmn *ch = hdr_cmn::access(p); //REM hdr_cmn *ch = hdr_cmn::access(currentpacket); if(ch->cipsemisoft_ == 1 && !bsFlag_) { Tcl::instance().evalf("%s Getlink %d", name(), ch->cipnodeid_); ss_link = NULL; ss_link = Tcl::instance().result(); strcpy(semi_link, ss_link); } ss_mode = ch->cipsemisoft_; //uplink Tcl::instance().evalf("%s update_routing_table %d %d %d %d %d", name(), iph->src().addr_, iph->dst().addr_, ch->cipnodeid_, ch->ciptype_, ch->cipsemisoft_); ch->cipnodeid_ = cipnodeid_; nextHop = Tcl::instance().result(); if (strcmp(nextHop, "-1")) { NsObject* node = (NsObject*)TclObject::lookup(nextHop); node->recv(p, h); return; } } } } else if (mFlag_ == 1) { hdr_cmn *ch = hdr_cmn::access(p); Tcl::instance().evalf("%s PacketArrivedMobile %d %d %d", name(), ch->ciptype_, (int)iph->src().addr_, iph->dst().addr_); } NsObject* node = find(p); if (node == NULL) { /* * XXX this should be "dropped" somehow. Right now, * these events aren't traced. */ Packet::free(p); return; } node->recv(p,h);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -