亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? aodvsec.cc

?? 本文件是基于NS2的AODVSEC協議的仿真源代碼
?? CC
?? 第 1 頁 / 共 3 頁
字號:
#include <aodvsec/aodvsec.h>
#include <aodvsec/aodvsec_packet.h>
#include <random.h>
#include <cmu-trace.h>


#define max(a,b)        ( (a) > (b) ? (a) : (b) )
#define CURRENT_TIME    Scheduler::instance().clock()

//#define DEBUG
//#define ERROR

#ifdef DEBUG
static int extra_route_reply = 0;
static int limit_route_request = 0;
static int route_request = 0;
#endif


/*
  TCL Hooks
*/


int hdr_aodvsec::offset_;
static class AODVSECHeaderClass : public PacketHeaderClass {
public:
        AODVSECHeaderClass() : PacketHeaderClass("PacketHeader/AODVSEC",
                                              sizeof(hdr_all_aodvsec)) {
	  bind_offset(&hdr_aodvsec::offset_);
	} 
} class_rtProtoAODVSEC_hdr;

static class AODVSECclass : public TclClass {
public:
        AODVSECclass() : TclClass("Agent/AODVSEC") {}
        TclObject* create(int argc, const char*const* argv) {
          assert(argc == 5);
          //return (new AODVSEC((nsaddr_t) atoi(argv[4])));
	  return (new AODVSEC((nsaddr_t) Address::instance().str2addr(argv[4])));
        }
} class_rtProtoAODVSEC;


int
AODVSEC::command(int argc, const char*const* argv) {
  if(argc == 2) {
  Tcl& tcl = Tcl::instance();
    
    if(strncasecmp(argv[1], "id", 2) == 0) {
      tcl.resultf("%d", index);
      return TCL_OK;
    }
    
    if(strncasecmp(argv[1], "start", 2) == 0) {
      btimersec.handle((Event*) 0);

#ifndef AODVSEC_LINK_LAYER_DETECTION
      htimersec.handle((Event*) 0);
      ntimersec.handle((Event*) 0);
#endif // LINK LAYER DETECTION

      rtimersec.handle((Event*) 0);
      return TCL_OK;
     }               
  }
  else if(argc == 3) {
    if(strcmp(argv[1], "index") == 0) {
      index = atoi(argv[2]);
      return TCL_OK;
    }

    else if(strcmp(argv[1], "log-target") == 0 || strcmp(argv[1], "tracetarget") == 0) {
      logtarget = (Trace*) TclObject::lookup(argv[2]);
      if(logtarget == 0)
	return TCL_ERROR;
      return TCL_OK;
    }
    else if(strcmp(argv[1], "drop-target") == 0) {
    int stat = rqueue.command(argc,argv);
      if (stat != TCL_OK) return stat;
      return Agent::command(argc, argv);
    }
    else if(strcmp(argv[1], "if-queue") == 0) {
    ifqueue = (PriQueue*) TclObject::lookup(argv[2]);
      
      if(ifqueue == 0)
	return TCL_ERROR;
      return TCL_OK;
    }
    else if (strcmp(argv[1], "port-dmux") == 0) {
    	dmux_ = (PortClassifier *)TclObject::lookup(argv[2]);
	if (dmux_ == 0) {
		fprintf (stderr, "%s: %s lookup of %s failed\n", __FILE__,
		argv[1], argv[2]);
		return TCL_ERROR;
	}
	return TCL_OK;
    }
  }
  return Agent::command(argc, argv);
}

/* 
   Constructor
*/

AODVSEC::AODVSEC(nsaddr_t id) : Agent(PT_AODVSEC),
			  btimersec(this), htimersec(this), ntimersec(this), 
			  rtimersec(this), lrtimersec(this), rqueue() {
 
                
  index = id;
  seqno = 2;
  bid = 1;

  LIST_INIT(&nbhead);
  LIST_INIT(&bihead);

  logtarget = 0;
  ifqueue = 0;
}

/*
  Timersecs時鐘一律用timersec表示..........................................................
*/

void
BroadcastTimersec::handle(Event*) {
  agent->id_purge();
  Scheduler::instance().schedule(this, &intr, BCAST_ID_SAVE);
}

void
HelloTimersec::handle(Event*) {
   agent->sendHello();
   double interval = MinHelloInterval + 
                 ((MaxHelloInterval - MinHelloInterval) * Random::uniform());
   assert(interval >= 0);
   Scheduler::instance().schedule(this, &intr, interval);
}

void
NeighborTimersec::handle(Event*) {
  agent->nb_purge();
  Scheduler::instance().schedule(this, &intr, HELLO_INTERVAL);
}

void
RouteCacheTimersec::handle(Event*) {
  agent->rt_purge();
#define FREQUENCY 0.5 // sec
  Scheduler::instance().schedule(this, &intr, FREQUENCY);
}

void
LocalRepairTimersec::handle(Event* p)  {  // SRD: 5/4/99
aodvsec_rt_entry *rt;
struct hdr_ip *ih = HDR_IP( (Packet *)p);

   /* you get here after the timeout in a local repair attempt */
   /*	fprintf(stderr, "%s\n", __FUNCTION__); */


    rt = agent->rtable.rt_lookup(ih->daddr());
	
    if (rt && rt->rt_flags != RTF_UP) {
    // route is yet to be repaired
    // I will be conservative and bring down the route
    // and send route errors upstream.
    /* The following assert fails, not sure why */
    /* assert (rt->rt_flags == RTF_IN_REPAIR); */
		
      //rt->rt_seqno++;
      agent->rt_down(rt);
      // send RERR
#ifdef DEBUG
      fprintf(stderr,"Node %d: Dst - %d, failed local repair\n",index, rt->rt_dst);
#endif      
    }
    Packet::free((Packet *)p);
}


/*
   Broadcast ID Management  Functions
*/


void
AODVSEC::id_insert(nsaddr_t id, u_int32_t bid) {
BroadcastID *b = new BroadcastID(id, bid);

 assert(b);
 b->expire = CURRENT_TIME + BCAST_ID_SAVE;
 LIST_INSERT_HEAD(&bihead, b, link);
}

/* SRD */
bool
AODVSEC::id_lookup(nsaddr_t id, u_int32_t bid) {
BroadcastID *b = bihead.lh_first;
 
 // Search the list for a match of source and bid
 for( ; b; b = b->link.le_next) {
   if ((b->src == id) && (b->id == bid))
     return true;     
 }
 return false;
}

void
AODVSEC::id_purge() {
BroadcastID *b = bihead.lh_first;
BroadcastID *bn;
double now = CURRENT_TIME;

 for(; b; b = bn) {
   bn = b->link.le_next;
   if(b->expire <= now) {
     LIST_REMOVE(b,link);
     delete b;
   }
 }
}

/*
  Helper Functions
*/

double
AODVSEC::PerHopTime(aodvsec_rt_entry *rt) {
int num_non_zero = 0, i;
double total_latency = 0.0;

 if (!rt)
   return ((double) NODE_TRAVERSAL_TIME );
	
 for (i=0; i < MAX_HISTORY; i++) {
   if (rt->rt_disc_latency[i] > 0.0) {
      num_non_zero++;
      total_latency += rt->rt_disc_latency[i];
   }
 }
 if (num_non_zero > 0)
   return(total_latency / (double) num_non_zero);
 else
   return((double) NODE_TRAVERSAL_TIME);

}

/*
  Link Failure Management Functions
*/

static void
aodvsec_rt_failed_callback(Packet *p, void *arg) {
  ((AODVSEC*) arg)->rt_ll_failed(p);
}

/*
 * This routine is invoked when the link-layer reports a route failed.
 */
void
AODVSEC::rt_ll_failed(Packet *p) {
struct hdr_cmn *ch = HDR_CMN(p);
struct hdr_ip *ih = HDR_IP(p);
aodvsec_rt_entry *rt;
nsaddr_t broken_nbr = ch->next_hop_;

#ifndef AODVSEC_LINK_LAYER_DETECTION
 drop(p, DROP_RTR_MAC_CALLBACK);
#else 

 /*
  * Non-data packets and Broadcast Packets can be dropped.
  */
  if(! DATA_PACKET(ch->ptype()) ||
     (u_int32_t) ih->daddr() == IP_BROADCAST) {
    drop(p, DROP_RTR_MAC_CALLBACK);
    return;
  }
  log_link_broke(p);
	if((rt = rtable.rt_lookup(ih->daddr())) == 0) {
    drop(p, DROP_RTR_MAC_CALLBACK);
    return;
  }
  log_link_del(ch->next_hop_);

#ifdef AODVSEC_LOCAL_REPAIR
  /* if the broken link is closer to the dest than source, 
     attempt a local repair. Otherwise, bring down the route. */


  if (ch->num_forwards() > rt->rt_hops) {
    local_rt_repair(rt, p); // local repair
    // retrieve all the packets in the ifq using this link,
    // queue the packets for which local repair is done, 
    return;
  }
  else	
#endif // LOCAL REPAIR	

  {
    drop(p, DROP_RTR_MAC_CALLBACK);
    // Do the same thing for other packets in the interface queue using the
    // broken link -Mahesh
while((p = ifqueue->filter(broken_nbr))) {
     drop(p, DROP_RTR_MAC_CALLBACK);
    }	
    nb_delete(broken_nbr);
  }

#endif // LINK LAYER DETECTION
}

void
AODVSEC::handle_link_failure(nsaddr_t id) {
aodvsec_rt_entry *rt, *rtn;
Packet *rerr = Packet::alloc();
struct hdr_aodvsec_error *re = HDR_AODVSEC_ERROR(rerr);

 re->DestCount = 0;
 for(rt = rtable.head(); rt; rt = rtn) {  // for each rt entry
   rtn = rt->rt_link.le_next; 
   if ((rt->rt_hops != INFINITY2) && (rt->rt_nexthop == id) ) {
     assert (rt->rt_flags == RTF_UP);
     assert((rt->rt_seqno%2) == 0);
     rt->rt_seqno++;
     re->unreachable_dst[re->DestCount] = rt->rt_dst;
     re->unreachable_dst_seqno[re->DestCount] = rt->rt_seqno;
#ifdef DEBUG
     fprintf(stderr, "%s(%f): %d\t(%d\t%u\t%d)\n", __FUNCTION__, CURRENT_TIME,
		     index, re->unreachable_dst[re->DestCount],
		     re->unreachable_dst_seqno[re->DestCount], rt->rt_nexthop);
#endif // DEBUG
     re->DestCount += 1;
     rt_down(rt);
   }
   // remove the lost neighbor from all the precursor lists
   rt->pc_delete(id);
 }   

 if (re->DestCount > 0) {
#ifdef DEBUG
   fprintf(stderr, "%s(%f): %d\tsending RERR...\n", __FUNCTION__, CURRENT_TIME, index);
#endif // DEBUG
   sendError(rerr, false);
 }
 else {
   Packet::free(rerr);
 }
}

void
AODVSEC::local_rt_repair(aodvsec_rt_entry *rt, Packet *p) {
#ifdef DEBUG
  fprintf(stderr,"%s: Dst - %d\n", __FUNCTION__, rt->rt_dst); 
#endif  
  // Buffer the packet 
  rqueue.enque(p);

  // mark the route as under repair 
  rt->rt_flags = RTF_IN_REPAIR;

  sendRequest(rt->rt_dst);

  // set up a timersec interrupt
  Scheduler::instance().schedule(&lrtimersec, p->copy(), rt->rt_req_timeout);
}

void
AODVSEC::rt_update(aodvsec_rt_entry *rt, u_int32_t seqnum, u_int16_t metric,
	       	nsaddr_t nexthop, double expire_time) {

     rt->rt_seqno = seqnum;
     rt->rt_hops = metric;
     rt->rt_flags = RTF_UP;
     rt->rt_nexthop = nexthop;
     rt->rt_expire = expire_time;
}

void
AODVSEC::rt_down(aodvsec_rt_entry *rt) {
  /*
   *  Make sure that you don't "down" a route more than once.
   */

  if(rt->rt_flags == RTF_DOWN) {
    return;
  }

  // assert (rt->rt_seqno%2); // is the seqno odd?
  rt->rt_last_hop_count = rt->rt_hops;
  rt->rt_hops = INFINITY2;
  rt->rt_flags = RTF_DOWN;
  rt->rt_nexthop = 0;
  rt->rt_expire = 0;

} /* rt_down function */

/*
  Route Handling Functions
*/

void
AODVSEC::rt_resolve(Packet *p) {
struct hdr_cmn *ch = HDR_CMN(p);
struct hdr_ip *ih = HDR_IP(p);
aodvsec_rt_entry *rt;

 /*
  *  Set the transmit failure callback.  That
  *  won't change.
  */
 ch->xmit_failure_ = aodvsec_rt_failed_callback;
 ch->xmit_failure_data_ = (void*) this;
	rt = rtable.rt_lookup(ih->daddr());
 if(rt == 0) {
	  rt = rtable.rt_add(ih->daddr());
 }

 /*
  * If the route is up, forward the packet 
  */
	
 if(rt->rt_flags == RTF_UP) {
   assert(rt->rt_hops != INFINITY2);
   forward(rt, p, NO_DELAY);
 }
 /*
  *  if I am the source of the packet, then do a Route Request.
  */
	else if(ih->saddr() == index) {
   rqueue.enque(p);
   sendRequest(rt->rt_dst);
 }
 /*
  *	A local repair is in progress. Buffer the packet. 
  */
 else if (rt->rt_flags == RTF_IN_REPAIR) {
   rqueue.enque(p);
 }

 /*
  * I am trying to forward a packet for someone else to which
  * I don't have a route.
  */
 else {
 Packet *rerr = Packet::alloc();
 struct hdr_aodvsec_error *re = HDR_AODVSEC_ERROR(rerr);
 /* 
  * For now, drop the packet and send error upstream.
  * Now the route errors are broadcast to upstream
  * neighbors - Mahesh 09/11/99

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久se精品一区精品二区| 欧美精品 日韩| 中文字幕第一区综合| 五月婷婷激情综合网| 亚洲精品v日韩精品| 亚洲精品网站在线观看| ●精品国产综合乱码久久久久| 精品国产乱码久久久久久夜甘婷婷| 精品视频一区二区三区免费| 91高清视频免费看| 欧美在线免费观看亚洲| 日本黄色一区二区| 99久久久国产精品| 欧美日韩一区二区三区在线看| 在线视频国内一区二区| 欧美日韩国产区一| 欧美一区二区在线免费观看| 精品日韩在线观看| 国产精品女上位| 亚洲美女视频在线观看| 五月天久久比比资源色| 国产一区二区三区免费看| 99v久久综合狠狠综合久久| 欧美午夜不卡在线观看免费| 欧美r级电影在线观看| 亚洲国产精品99久久久久久久久| 亚洲三级电影全部在线观看高清| 日韩欧美激情四射| 欧美三级视频在线播放| 91精品国产乱| 国产精品免费aⅴ片在线观看| 亚洲乱码中文字幕| 国产成人免费网站| 97se亚洲国产综合自在线不卡| 欧美久久一二区| 国产女人水真多18毛片18精品视频| 亚洲激情图片一区| 国模无码大尺度一区二区三区| av一二三不卡影片| 日韩欧美国产午夜精品| 一区二区欧美精品| 国产精品综合在线视频| 欧美日韩国产三级| 亚洲欧洲性图库| 久久99久久99小草精品免视看| 北条麻妃国产九九精品视频| 91精品国产一区二区三区| 欧美国产日韩在线观看| 蜜臀久久99精品久久久久宅男| 91丨porny丨户外露出| 久久久99免费| 伦理电影国产精品| 欧美日韩激情一区| 亚洲激情图片一区| 成人免费高清视频在线观看| 欧美成人女星排名| 亚洲第四色夜色| 91国内精品野花午夜精品| 国产精品五月天| 欧美三级视频在线观看| 中文字幕制服丝袜成人av| 国产一区二区看久久| 日韩欧美一级二级三级| 日本中文字幕一区二区视频 | 91福利在线观看| 26uuu久久综合| 蜜臀久久久99精品久久久久久| 视频一区中文字幕| 色悠悠久久综合| 久久精品欧美一区二区三区不卡| 三级不卡在线观看| 欧美一区二区性放荡片| 香蕉久久一区二区不卡无毒影院| 在线观看中文字幕不卡| 一区二区在线观看视频| 91在线观看污| ...xxx性欧美| 色狠狠一区二区三区香蕉| 亚洲精品中文字幕乱码三区| 99这里只有精品| 亚洲精品成a人| 欧美区在线观看| 日韩精品欧美精品| 日韩免费高清视频| 国产黄人亚洲片| 国产精品免费看片| 色先锋久久av资源部| 一区二区激情视频| 亚洲成人一区在线| 亚洲男同1069视频| 在线免费精品视频| 亚洲超丰满肉感bbw| 日韩欧美一区中文| 国产一区不卡在线| 亚洲手机成人高清视频| 欧美日韩精品一二三区| 国产一区视频在线看| 国产精品久久综合| 欧美日韩夫妻久久| 国产精品综合在线视频| 亚洲激情第一区| 欧美一区二区三区人| 国产成人在线视频免费播放| 中文字幕日韩精品一区| 日韩欧美在线网站| 成人免费毛片嘿嘿连载视频| 亚洲日本va午夜在线影院| 91精品免费在线| 国产成人精品亚洲午夜麻豆| 亚洲精品第一国产综合野| 风间由美一区二区三区在线观看 | 日韩 欧美一区二区三区| 久久综合色8888| 日本高清不卡在线观看| 狂野欧美性猛交blacked| 中文字幕欧美一| xf在线a精品一区二区视频网站| 91免费看`日韩一区二区| 美国十次综合导航| 1024国产精品| 久久九九影视网| 欧美一级黄色录像| 91猫先生在线| 国产一区二区在线视频| 香蕉影视欧美成人| 最新欧美精品一区二区三区| 欧美xxxxxxxxx| 欧美午夜不卡在线观看免费| 成人免费视频免费观看| 美女www一区二区| 视频一区中文字幕国产| 亚洲黄色性网站| 精品一区二区影视| 亚洲精品在线网站| 91久久国产最好的精华液| 成人午夜视频免费看| 亚洲精品国产无天堂网2021| 欧美电影免费提供在线观看| 亚洲第一福利视频在线| 国产精品麻豆网站| 久久日一线二线三线suv| 欧美理论电影在线| 欧美午夜精品久久久久久超碰| 日韩午夜激情免费电影| 国产美女视频91| 亚洲高清免费视频| 最近日韩中文字幕| 国产精品美女久久久久久2018| 久久久久久99精品| 日韩精品一区在线| 欧美精品一区二区三区在线 | 欧美视频自拍偷拍| 97国产精品videossex| 成人高清av在线| 99久久99久久精品免费看蜜桃| 成人aaaa免费全部观看| 在线观看一区二区视频| 色综合天天综合色综合av| 色综合 综合色| 在线观看日韩一区| 欧美男男青年gay1069videost | 中文字幕欧美一| 久久综合色婷婷| 久久先锋影音av鲁色资源网| 欧美成人精品高清在线播放| 欧美www视频| 久久久久国产精品厨房| 欧美激情一区二区三区不卡 | av动漫一区二区| 99久久777色| 欧美三级电影在线观看| 欧美一区二区国产| 久久免费电影网| 亚洲免费观看高清完整版在线| 一区二区三区免费看视频| 日韩不卡一区二区三区| 国产在线播放一区二区三区| 91视视频在线观看入口直接观看www| 99re成人精品视频| 91精品免费观看| 中文一区二区完整视频在线观看| 亚洲黄色免费网站| 欧美午夜影院一区| 亚洲人成精品久久久久久 | 国产精品资源站在线| 国产一区二区三区四区在线观看| 粉嫩aⅴ一区二区三区四区| 亚洲精品免费在线| 制服丝袜国产精品| 久久免费视频一区| 亚洲视频一区在线观看| 亚洲一区二区三区在线看| 日本欧美韩国一区三区| 成人精品视频一区| 在线电影院国产精品| 国产精品久久久久一区二区三区 | 亚洲自拍偷拍欧美| 国产一区二区三区四区在线观看| 欧美精品 国产精品| 中文字幕欧美激情一区|