设为首页 加入收藏

TOP

NS2下AODV协议aodv.cc注释(一)
2014-11-23 23:16:57 来源: 作者: 【 】 浏览:74
Tags:NS2 AODV 协议 aodv.cc 注释

NS2下AODV协议aodv.cc注释


//#include


#include
#include
#include
#include
//#include


#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_aodv::offset_;
static class AODVHeaderClass : public PacketHeaderClass {
public:
AODVHeaderClass() : PacketHeaderClass("PacketHeader/AODV",
sizeof(hdr_all_aodv)) {
bind_offset(&hdr_aodv::offset_);
}
} class_rtProtoAODV_hdr;
/*AODVclass 只有两个函数,构造函数和creat函数*/
static class AODVclass : public TclClass {
public:
AODVclass() : TclClass("Agent/AODV") {}
TclObject* create(int argc, const char*const* argv) {
assert(argc == 5);
//return (new AODV((nsaddr_t) atoi(argv[4])));
return (new AODV((nsaddr_t) Address::instance().str2addr(argv[4])));
}
} class_rtProtoAODV;


/*command函数实现了命令的分发*/
int
AODV::command(int argc, const char*const* argv) {
if(argc == 2) {//命令的参数个数是2
Tcl& tcl = Tcl::instance();

if(strncasecmp(argv[1], "id", 2) == 0) {//命令所要求的操作为id
tcl.resultf("%d", index);
return TCL_OK;
}

if(strncasecmp(argv[1], "start", 2) == 0) {//命令所要求的操作为start
btimer.handle((Event*) 0);


#ifndef AODV_LINK_LAYER_DETECTION
htimer.handle((Event*) 0);
ntimer.handle((Event*) 0);
#endif // LINK LAYER DETECTION


rtimer.handle((Event*) 0);
return TCL_OK;
}
}
else if(argc == 3) {//命令参数个数等于3
if(strcmp(argv[1], "index") == 0) {//命令所要求的操作为index
index = atoi(argv[2]);
return TCL_OK;
}
//命令所要求的操作为log-target或者tracetarget
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)
{
//命令所要求的操作为drop-target
int stat = rqueue.command(argc,argv);
if (stat != TCL_OK) return stat;
return Agent::command(argc, argv);
}


//命令所要求的操作if-queue
else if(strcmp(argv[1], "if-queue") == 0) {
ifqueue = (PriQueue*) TclObject::lookup(argv[2]);

if(ifqueue == 0)
return TCL_ERROR;
return TCL_OK;
}
//命令所要求的操作为port-dmux
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
*/


AODV::AODV(nsaddr_t id) : Agent(PT_AODV),
btimer(this), htimer(this), ntimer(this),
rtimer(this), lrtimer(this), rqueue() {


index = id;
seqno = 2;
bid = 1;


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


logtarget = 0;
ifqueue = 0;
}


/*
Timers
*/
//广播定时器
void
BroadcastTimer::handle(Event*) {
agent->id_purge();
Scheduler::instance().schedule(this, &intr, BCAST_ID_SAVE);
}
//hello报文定时器
void
HelloTimer::handle(Event*) {
agent->sendHello();
double interval = MinHelloInterval +
((MaxHelloInterval - MinHelloInterval) * Random::uniform());
assert(interval >= 0);
Scheduler::instance().schedule(this, &intr, interval);
}
//邻居定时器
void
NeighborTimer::handle(Event*) {
agent->nb_purge();
Scheduler::instance().schedule(this, &intr, HELLO_INTERVAL);
}
路由缓存定

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 1/10/10
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇对NS2中aodv源文件的浅析 下一篇Objective-C中的meta-class

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: