在 aodv 协议的基础上添加 aomdv 协议详细过程
安装环境:winxp+cygwin+ns-allinone-2.31
主要对以下文件进行修改:
Common/packet.h
Trace/cmu-trace.h
Trace/cmu-trace.cc
Tcl/lib/ns-packet.tcl
Tcl/lib/ns-default.tcl
Tcl/lib/ns-lib.tcl
Queue/priqueue.cc
Makefile.in
Makefile
indep-utils\webtrace-conv\dec\my-endian.h
以下修改部分为红色
Setp1:Common/packet.h(修改两个地方)
enum packet_t {
....
....
PT_AODV,
PT_AOMDV,//第一个地方
PT_IMEP,
....
...
};
=======================================
class p_info {
public:
p_info() {
name_[PT_TCP]= "tcp";
。。。。。
。。。。。
name_[PT_DSR]= "DSR";
name_[PT_AODV]= "AODV";
name_[PT_AOMDV]= "AOMDV";//第二个地方
name_[PT_IMEP]= "IMEP";
。。。。。
。。。。。
};
Setp2:Trace/cmu-trace.h (一个)
class CMUTrace : public Trace {
public:
CMUTrace(const char *s, char t);
void
void
recv(Packet *p, Handler *h);
recv(Packet *p, const char* why);
private:
char
tracename[MAX_ID_LEN + 1];
void
。。。。。
。。。。。
format_imep(Packet *p, int offset);
void
void
format_aodv(Packet *p, int offset);
format_aomdv(Packet *p, int offset);
};
#endif /* __cmu_trace__ */
Step3:Trace/cmu-trace.cc (三个地方)
// IMEP
#include
#include //AODV
#include //AOMDV,第一个地方,添加头文件
#include
================================================
//第二个地方,在 format_aodv 函数后面创建函数
CMUTrace::format_aodv(Packet *p, int offset)
{
struct hdr_aodv *ah = HDR_AODV(p);
struct hdr_aodv_request *rq = HDR_AODV_REQUEST(p);
。。。。。
。。。。。
。。。。。
fprintf(stderr,
"%s: invalid AODV packet type\n", __FUNCTION__);
#else
#endif
abort();
}
}
void
CMUTrace::format_aomdv(Packet *p, int offset)
{
struct hdr_aomdv *ah = HDR_AOMDV(p);
struct hdr_aomdv_request *rq = HDR_AOMDV_REQUEST(p);
struct hdr_aomdv_reply *rp = HDR_AOMDV_REPLY(p);
switch(ah->ah_type) {
case AOMDVTYPE_RREQ:
if (pt_->tagged()) {
sprintf(pt_->buffer() + offset,
"-aomdv:t %x -aomdv:h %d -aomdv:b %d -aomdv:d %d "
"-aomdv:ds %d -aomdv:s %d -aomdv:ss %d "
"-aomdv:c REQUEST ",
rq->rq_type,
rq->rq_hop_count,
rq->rq_bcast_id,
rq->rq_dst,
rq->rq_dst_seqno,
rq->rq_src,
rq->rq_src_seqno);
} else if (newtrace_) {
sprintf(pt_->buffer() + offset,
"-P aomdv -Pt 0x%x -Ph %d -Pb %d -Pd %d -Pds %d -Ps %d
-Pss %d -Pc REQUEST ",
rq->rq_type,
rq->rq_hop_count,
rq->rq_bcast_id,
rq->rq_dst,
rq->rq_dst_seqno,
rq->rq_src,
rq->rq_src_seqno);
} else {
sprintf(pt_->buffer() + offset,
"[0x%x %d %d [%d %d] [%d %d]] (REQUEST)",
rq->rq_type,
rq->rq_hop_count,
rq->rq_bcast_id,
rq->rq_dst,
rq->rq_dst_seqno,
rq->rq_src,
rq->rq_src_seqno);
}
break;
case AOMDVTYPE_RREP:
case AOMDVTYPE_HELLO:
case AOMDVTYPE_RERR:
if (pt_->tagged()) {
sprintf(pt_->buffer() + offset,
"-aomdv:t %x -aomdv:h %d -aomdv:d %d -adov:ds %d "
"-aomdv:l %f -aomdv:c %s ",
rp->rp_type,
rp->rp_hop_count,
rp->rp_dst,
rp->rp_dst_seqno,
rp->rp_lifetime,
rp->rp_type == AOMDVTYPE_RREP ? "REPLY" :
(rp->rp_type == AOMDVTYPE_RERR ? "ERROR" :
"HELLO"));
} else if (newtrace_) {
sprintf(pt_->buffer() + offset,
"-P aomdv -Pt 0x%x -Ph %d -Pd %d -Pds %d -Pl %f -Pc %s ",
rp->rp_type,
rp->rp_hop_count,
rp->rp_dst,
rp->rp_dst_seqno,
rp->rp_lifetime,
rp->rp_type == AOMDVTYPE_RREP ? "REPLY" :
(rp->rp_type == AOMDVTYPE_RERR ? "ERROR" :
"HELLO"));
} else {
sprintf(pt_->buffer() + offset,
"[0x%x %d [%d %d] %f] (%s)",
rp->rp_type,
rp->rp_hop_count,
rp->rp_dst,
rp->rp_dst_seqno,
rp->rp_lifetime,
rp->rp_type == AOMDVTYPE_RREP ? "REPLY" :
(rp->rp_type == AOMDVTYPE_RERR ? "ERROR" :
"HELLO"));
}
break;
default:
#ifdef WIN32
fprintf(stderr,
"CMUTrace::format_aomdv: invalid AOMDV packet type\n");
fprintf(stderr,
"%s: invalid AOMDV packet type\n", __FUNCTION__);
#else
#endif
abort();
}
}
===============================================
//第三个地方
void CMUTrace::format(Packet* p, const char *why)
{
hdr_cmn *ch = HDR_CMN(p);
int offset = 0;
/*
* Log the MAC Header
*/
format_mac_common(p, why, offset);
if (pt_->namchannel())
。。。。。
。。。。。
switch(ch->ptype()) {
case PT_AODV:
format_aodv(p, offset);
break;
case PT_AOMDV:
format_aomdv(p, offset);
break;
case PT_TORA:
。。。。。
。。。。。
}
Step4:Tcl/lib/ns-packet.tcl(一个)
foreach prot {
# Common:
Common
Flags
IP # IP
# Routing Protocols:
。。。。。
。。。。。
# network wireless stack
Mac
# Mobility, Ad-Hoc Networks, Sensor Nets:
AODV # routing protocol for ad-hoc networks
AOMDV #自行添加的协议
Diffusion # diffusion/diffusion.cc
。。。。。
}
Step5:.Tcl/lib/ns-default.tcl
在最后添加下面语段,不同协议可能不同
#BY lijiao
Agent/AOMDV set send_buffer_size_
64
Agent/AOMDV set send_buffer_timeout_
Agent/AOMDV set aomdv_max_paths_ 3
Agent/AOMDV set aomdv_prim_alt_path_len_diff_ 1
30
Step6:Tcl/lib/ns-lib.tcl(两个)
Simulator instproc create-wireless-node args {
。。。。。
switch -exact $routingAgent_ {
DSDV {
set ragent [$self create-dsdv-agent $node]
}
DSR {
$self at 0.0 "$node start-dsr"
}
AODV {
set ragent [$self create-aodv-agent $node]
}
AOMDV {
set ragent [$self create-aomdv-agent $node]
}
。。。。。
}
================================================
Simulator instproc create-aodv-agent { node } {
。。。。。
}
Simulator instproc create-aomdv-agent { node } {
# Create AOMDV routing agent
set ragent [new Agent/AOMDV [$node node-addr]]
$self at 0.0 "$ragent start"
$node set ragent_ $ragent
return $ragent
}
;# start BEACON/HELLO Messages
Step7:Queue/priqueue.cc(一个)
void
PriQueue::recv(Packet *p, Handler *h)
{
struct hdr_cmn *ch = HDR_CMN(p);
if(Prefer_Routing_Protocols) {
switch(ch->ptype()) {
case PT_DSR:
case PT_MESSAGE:
case PT_TORA:
case PT_AODV:
case PT_AOMDV:
recvHighPriority(p, h);
break;
default:
}
Queue::recv(p, h);
Queue::recv(p, h);
}
else {
}
}
Step8:Makefile.in(一个)
OBJ_CC = \
tools/random.o
common/timer-handler.o \
tools/rng.o
tools/ranvar.o
common/misc.o
........
aodv/aodv_logs.o aodv/aodv.o \
aodv/aodv_rtable.o aodv/aodv_rqueue.o \
aomdv/aomdv_logs.o aomdv/aomdv.o \
aomdv/aomdv_rtable.o aomdv/aomdv_rqueue.o \
common/ns-process.o \
satellite/satgeometry.o satellite/sathandoff.o \
.........
Step9:Makefile(一个 )
OBJ_CC = \
tools/random.o
common/timer-handler.o \
tools/rng.o
tools/ranvar.o
common/misc.o
........
aodv/aodv_logs.o aodv/aodv.o \
aodv/aodv_rtable.o aodv/aodv_rqueue.o \
aomdv/aomdv_logs.o aomdv/aomdv.o \
aomdv/aomdv_rtable.o aomdv/aomdv_rqueue.o \
common/ns-process.o \
satellite/satgeometry.o satellite/sathandoff.o \
.........
//刚开始我也是只改了 makefile 文件,但是还是报错,要注意的一点是修改 makefile.in
文件的时间一定要在 makefile 文件之前,但是原因我还没有研究过
Step10:indep-utils\webtrace-conv\dec\my-endian.h
#ifndef _MY_ENDIAN_H_
#define _MY_ENDIAN_H_
#include "proxytrace.h"
/* detects endian-ness */
int IsLittleEndian(void);
/* changes endian-ness */
void ToOtherEndian(TEntry *e);
#endif
//如果不修改头文件呢,在 make 的时候会出现
Proxytrace2any.cc:error: IsLittleEndian 和 ToOtherEndian 函数没有被声明
Step11:编译