Hi, I can tell another way which I think is simpler to do this clone stuff, for your reference only. You can directly change the AODV codes in the ns/aodv/ directory without change the name of the directory and files (of course you'd better backup the oringal codes first), and rebuild the codes. This approach would cause less problems related to the makefile and ns-lib.tcl kind of things, so maybe worth a shot. good luck Larry
Hello, NS-users: I want to create a routing protocol according to AODV, so my first task is to clone AODV. After seeing other ns-users' posts, i do my work in following steps. First, i copy all the files in $NS\aodv\ to a new folder called aodv_lsa and rename all files (i.e. from filename.cc and filename.h to myfilename.cc and myfilename.h), and then i change all the names of C++ classes, packet headers, variables, TCL bindings, ... Second, i make some essential changes according to http://masimum.dif.um.es/nsrt-howto/html/ $NS\common\packet.h enum packet_t { PT_TCP, PT_UDP, PT_CBR, ...... ...... PT_AODV, PT_MYAODV, //added by Xinhao Yu PT_IMEP, ...... ...... PT_NTYPE // This MUST be the LAST one }; ...... ...... class p_info { public: p_info() { name_[PT_TCP]= "tcp"; name_[PT_UDP]= "udp"; name_[PT_CBR]= "cbr"; ...... ...... name_[PT_AODV]= "AODV"; name_[PT_MYAODV]= "MYAODV"; //added by Xinhao Yu name_[PT_IMEP]= "IMEP"; ...... ...... name_[PT_NTYPE]= "undefined"; } ...... ...... }; $NS\trace\cmu-trace.h class CMUTrace : public Trace { ...... ...... void format_aodv(Packet *p, int offset); void format_myaodv(Packet *p, int offset); //added by Xinhao Yu }; $NS\trace\cmu-trace.cc #include <aodv_lsa/myaodv_packet.h> //added by Xinhao Yu ...... ...... //added by Xinhao Yu void CMUTrace::format_myaodv(Packet *p, int offset) { struct hdr_myaodv *ah = HDR_MYAODV(p); struct hdr_myaodv_request *rq = HDR_MYAODV_REQUEST(p); struct hdr_myaodv_reply *rp = HDR_MYAODV_REPLY(p); switch(ah->ah_type) { case MYAODVTYPE_RREQ: if (pt_->tagged()) { sprintf(pt_->buffer() + offset, "-myaodv:t %x -myaodv:h %d -myaodv:b %d -myaodv:d %d " "-myaodv:ds %d -myaodv:s %d -myaodv:ss %d " "-myaodv: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 myaodv -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]] (RREQ)", 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 MYAODVTYPE_RREP: case MYAODVTYPE_HELLO: case MYAODVTYPE_RERR: if (pt_->tagged()) { sprintf(pt_->buffer() + offset, "-myaodv:t %x -myaodv:h %d -myaodv:d %d -myadov:ds %d " "-myaodv:l %f -myaodv:c %s ", rp->rp_type, rp->rp_hop_count, rp->rp_dst, rp->rp_dst_seqno, rp->rp_lifetime, rp->rp_type == MYAODVTYPE_RREP ? "REPLY" : (rp->rp_type == MYAODVTYPE_RERR ? "ERROR" : "HELLO")); } else if (newtrace_) { sprintf(pt_->buffer() + offset, "-P myaodv -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 == MYAODVTYPE_RREP ? "REPLY" : (rp->rp_type == MYAODVTYPE_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 == MYAODVTYPE_RREP ? "RREP" : (rp->rp_type == MYAODVTYPE_RERR ? "ERROR" : "HELLO")); } break; default: #ifdef WIN32 fprintf(stderr, "CMUTrace::format_myaodv: invalid MYAODV packet type\n"); #else fprintf(stderr, "%s: invalid MYAODV packet type\n", __FUNCTION__); #endif abort(); } } ...... ...... //added by Xinhao Yu void CMUTrace::format(Packet* p, const char *why) { ...... ...... default: ...... ...... case PT_AODV: format_aodv(p, offset); break; case PT_MYAODV: format_myaodv(p, offset); break; ...... ...... } $NS\tcl\lib\ns-packet.tcl foreach prot { AODV MYAODV ;#added by Xinhao Yu ...... ...... } $NS\tcl\lib\ns-lib.tcl Simulator instproc create-wireless-node args { ...... ...... switch -exact $routingAgent_ { ...... ...... AODV { set ragent [$self create-aodv-agent $node] } MYAODV { set ragent [$self create-myaodv-agent $node] ;#added by Xinhao Yu } ...... ...... } ...... ...... } ...... ...... # added by Xinhao Yu Simulator instproc create-myaodv-agent { node } { # Create MYAODV routing agent set ragent [new Agent/MYAODV [$node node-addr]] $self at 0.0 "$ragent start" ;# start BEACON/HELLO Messages $node set ragent_ $ragent return $ragent } $NS\queue\priqueue.cc //added by Xinhao Yu void PriQueue::recv(Packet *p, Handler *h) { ...... ...... case PT_AODV: case PT_MYAODV: ...... ...... } $NS\Makefile OBJ_CC = \ ...... ...... aodv/aodv_logs.o aodv/aodv.o \ aodv/aodv_rtable.o aodv/aodv_rqueue.o \ aodv_lsa/myaodv_logs.o aodv_lsa/myaodv.o \ aodv_lsa/myaodv_rtable.o aodv_lsa/myaodv_rqueue.o \ ...... ...... $(OBJ_STL) To be safe, i also modify $NS\tcl\lib\ns-agent.tcl and $NS\tcl\lib\ns-mobilenode.tcl $NS\tcl\lib\ns-agent.tcl Agent/AODV instproc init args { $self next $args } Agent/AODV set sport_ 0 Agent/AODV set dport_ 0 # added by Xinhao Yu Agent/MYAODV instproc init args { $self next $args } Agent/MYAODV set sport_ 0 Agent/MYAODV set dport_ 0 $NS\tcl\lib\ns-mobilenode.tcl Node/MobileNode instproc add-target { agent port } { ...... ...... # Special processing for AODV set aodvonly [string first "AODV" [$agent info class]] if {$aodvonly != -1 } { $agent if-queue [$self set ifq_(0)] ;# ifq between LL and MAC } # added by Xinhao Yu # Special processing for MYAODV set aodvonly [string first "MYAODV" [$agent info class]] if {$aodvonly != -1 } { $agent if-queue [$self set ifq_(0)] ;# ifq between LL and MAC } ...... ...... } Third, i compile ns again. After 'make depend', there is no error. Then 'make' and everything is ok. Then i use a simple tcl script to test my new ns model. I replace AODV with MYAODV. set val(rp) MYAODV ;# Routing: MYAODV Tcl script runs fine. I get a trace file. Following is a part of it. r 10.000000000 _0_ RTR --- 0 cbr 500 [0 0 0 0] ------- [0:0 6:0 32 0] [0] 0 0 s 10.000000000 _0_ RTR --- 0 IMEP 48 [0 0 0 0] ------- [0:255 -1:255 30 0] [0x2 1 1 [6 0] [0 4]] (RREQ) r 10.001360033 _2_ RTR --- 0 IMEP 48 [0 ffffffff 0 800] ------- [0:255 -1:255 30 0] [0x2 1 1 [6 0] [0 4]] (RREQ) r 10.001360033 _1_ RTR --- 0 IMEP 48 [0 ffffffff 0 800] ------- [0:255 -1:255 30 0] [0x2 1 1 [6 0] [0 4]] (RREQ) s 10.001502080 _2_ RTR --- 0 IMEP 48 [0 ffffffff 0 800] ------- [2:255 -1:255 29 0] [0x2 2 1 [6 0] [0 4]] (RREQ) s 10.002241260 _1_ RTR --- 0 IMEP 48 [0 ffffffff 0 800] ------- [1:255 -1:255 29 0] [0x2 2 1 [6 0] [0 4]] (RREQ) r 10.002722107 _3_ RTR --- 0 IMEP 48 [0 ffffffff 2 800] ------- [2:255 -1:255 29 0] [0x2 2 1 [6 0] [0 4]] (RREQ) r 10.002722113 _0_ RTR --- 0 IMEP 48 [0 ffffffff 2 800] ------- [2:255 -1:255 29 0] [0x2 2 1 [6 0] [0 4]] (RREQ) r 10.003936160 _0_ RTR --- 0 IMEP 48 [0 ffffffff 1 800] ------- [1:255 -1:255 29 0] [0x2 2 1 [6 0] [0 4]] (RREQ) r 10.003936177 _7_ RTR --- 0 IMEP 48 [0 ffffffff 1 800] ------- [1:255 -1:255 29 0] [0x2 2 1 [6 0] [0 4]] (RREQ) s 10.010324829 _7_ RTR --- 0 IMEP 48 [0 ffffffff 1 800] ------- [7:255 -1:255 28 0] [0x2 3 1 [6 0] [0 4]] (RREQ) s 10.010886867 _3_ RTR --- 0 IMEP 48 [0 ffffffff 2 800] ------- [3:255 -1:255 28 0] [0x2 3 1 [6 0] [0 4]] (RREQ) r 10.011484852 _6_ RTR --- 0 IMEP 48 [0 ffffffff 7 800] ------- [7:255 -1:255 28 0] [0x2 3 1 [6 0] [0 4]] (RREQ) s 10.011484852 _6_ RTR --- 0 IMEP 44 [0 0 0 0] ------- [6:255 0:255 30 7] [0x4 1 [6 4] 10.000000] (RREP) r 10.012026894 _2_ RTR --- 0 IMEP 48 [0 ffffffff 3 800] ------- [3:255 -1:255 28 0] [0x2 3 1 [6 0] [0 4]] (RREQ) r 10.016279017 _7_ RTR --- 0 IMEP 44 [13a 7 6 800] ------- [6:255 0:255 30 7] [0x4 1 [6 4] 10.000000] (RREP) f 10.016279017 _7_ RTR --- 0 IMEP 44 [13a 7 6 800] ------- [6:255 0:255 29 1] [0x4 2 [6 4] 10.000000] (RREP) But i see that the 7th column packet type in the trace file is IMEP not MYAODV. Could anyone explain to me what's the matter? Thank you in advance. -- Best Regards, Xinhao Yu