⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 classifier-cip.cc

📁 运行于linux上的CIMS套件
💻 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 + -