NS2 routing.docx
- 文档编号:2951247
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:21
- 大小:20.42KB
NS2 routing.docx
《NS2 routing.docx》由会员分享,可在线阅读,更多相关《NS2 routing.docx(21页珍藏版)》请在冰豆网上搜索。
NS2routing
目录
1. 介绍
2. 建立protoname目录
3. 需要修改的文件
4. 编译
5. 测试
6. 参考文献
介绍
本文适合初识ns2,想懵懂的知道ns2添加路由协议过程的读者。
^_^
一. 建立protoname目录
如我们在ns2目录下看见的dsr或dsdv协议一样,我们要建立自己的协议,也要首先建立一个文件夹,我们以protoname命名。
当完成所有的添加工作后,我们的协议的名字就叫做protoname了,当然你也可以为它起一个你喜欢的名字。
闲言碎语莫要谈,现在let’sbegin!
一个协议最起码要包含以下5个文件,也就是说我们需要把这5个文件放在protoname的文件夹下:
protoname.h protoname.cc protoname_pkt.h protoname_rtable.h protoname_rtable.cc
从这些文件的名字大致可以知道它们是关于什么的(详见[1])
下面是相应文件的代码(在[1]中缺少一些头文件):
1. protoname.h
#ifndef__protoname_h__
#define__protoname_h__
#include"protoname_pkt.h"
#include"protoname_rtable.h"
#include
#include
#include
#include
#include
#include
#include
#include"arp.h"
#include"ll.h"
#include"mac.h"
#include"ip.h"
#include"delay.h"
#defineCURRENT_TIMEScheduler:
:
instance().clock()
#defineJITTER(Random:
:
uniform()*0.5)
classProtoname;//forwarddeclaration
/*Timers*/
classProtoname_PktTimer:
publicTimerHandler{
public:
Protoname_PktTimer(Protoname*agent):
TimerHandler(){
agent_=agent;
}
protected:
Protoname*agent_;
virtualvoidexpire(Event*e);
};
/*Agent*/
classProtoname:
publicAgent{
/*Friends*/
friendclassProtoname_PktTimer;
/*Privatemembers*/
nsaddr_tra_addr_;
//protoname_statestate_;
protoname_rtablertable_;
intaccesible_var_;
u_int8_tseq_num_;
protected:
MobileNode*node_;
PortClassifier*dmux_;//Forpassingpacketsuptoagents.
Trace*logtarget_;//Forlogging.
Protoname_PktTimerpkt_timer_;//Timerforsendingpackets.
inlinensaddr_t&ra_addr(){returnra_addr_;}
//inlineprotoname_state&state(){returnstate_;}
inlineint&accessible_var(){returnaccesible_var_;}
voidforward_data(Packet*);
voidrecv_protoname_pkt(Packet*);
voidsend_protoname_pkt();
voidreset_protoname_pkt_timer();
public:
Protoname(nsaddr_t);
intcommand(int,constchar*const*);
voidrecv(Packet*,Handler*);
//voidmac_failed(Packet*);
};
#endif
2. protoname.cc
#include"protoname.h"
#include"protoname_pkt.h"
#include
#include
#include
inthdr_protoname_pkt:
:
offset_;
staticclassProtonameHeaderClass:
publicPacketHeaderClass{
public:
ProtonameHeaderClass():
PacketHeaderClass("PacketHeader/Protoname",sizeof(hdr_protoname_pkt)){
bind_offset(&hdr_protoname_pkt:
:
offset_);
}
}class_rtProtoProtoname_hdr;
staticclassProtonameClass:
publicTclClass{
public:
ProtonameClass():
TclClass("Agent/Protoname"){}
TclObject*create(intargc,constchar*const*argv){
assert(argc==5);
return(newProtoname((nsaddr_t)Address:
:
instance().str2addr(argv[4])));
}
}class_rtProtoProtoname;
void
Protoname_PktTimer:
:
expire(Event*e){
agent_->send_protoname_pkt();
agent_->reset_protoname_pkt_timer();
}
Protoname:
:
Protoname(nsaddr_tid):
Agent(PT_PROTONAME),pkt_timer_(this){
bind_bool("accesible_var_",&accesible_var_);
ra_addr_=id;
node_=(MobileNode*)Node:
:
get_node_by_address(id);
}
int
Protoname:
:
command(intargc,constchar*const*argv){
if(argc==2){
if(strcasecmp(argv[1],"start")==0){
pkt_timer_.resched(0.0);
returnTCL_OK;
}
elseif(strcasecmp(argv[1],"print_rtable")==0){
if(logtarget_!
=0){
sprintf(logtarget_->pt_->buffer(),"P%f_%d_RoutingTable",CURRENT_TIME,ra_addr());
logtarget_->pt_->dump();
rtable_.print(logtarget_);
}
else{
fprintf(stdout,"%f_%d_Ifyouwanttoprintthisroutingtable"
"youmustcreateatracefileinyourtclscript",CURRENT_TIME,ra_addr());
}
returnTCL_OK;
}
}
elseif(argc==3){
//Obtainscorrespondingdmuxtocarrypacketstoupperlayers
if(strcmp(argv[1],"port-dmux")==0){
dmux_=(PortClassifier*)TclObject:
:
lookup(argv[2]);
if(dmux_==0){
fprintf(stderr,"%s:
%slookupof%sfailed\n",__FILE__,argv[1],argv[2]);
returnTCL_ERROR;
}
returnTCL_OK;
}
//Obtainscorrespondingtracer
elseif(strcmp(argv[1],"log-target")==0||strcmp(argv[1],"tracetarget")==0){
lo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- NS2 routing