adding new protocol to ns2

27
How to Add a New Protocol in NS2 Xu Leiming CSCW Lab. at CS Dept., Tsinghua Univ. mailto:[email protected] du.cn June 1, 2001

Upload: rajendra-bhosale

Post on 03-Jan-2016

80 views

Category:

Documents


1 download

DESCRIPTION

It gives the idea of adding new protocol to ns2

TRANSCRIPT

Page 1: Adding new Protocol to ns2

How to Add a New Protocol in NS2

Xu LeimingCSCW Lab. at CS Dept., Tsinghua Univ.

mailto:[email protected]

June 1, 2001

Page 2: Adding new Protocol to ns2

Outline

Overview An Example ---- Ping Packet flow Node models Our research

Page 3: Adding new Protocol to ns2

Overview

New packet header C++ code Tcl code Some necessary changes

Page 4: Adding new Protocol to ns2

Packet Header

Page 5: Adding new Protocol to ns2

Packet Header

Page 6: Adding new Protocol to ns2

New Packet Header

Create new header structure Enable tracing support of new header Create static class for OTcl linkage

(packet.h) Enable new header in Otcl (tcl/lib/ns-

packet.tcl)

Page 7: Adding new Protocol to ns2

New Agent

Decide position in class hierarchyDerive from a agent class

Link with a OTcl class– TclClass TclObject– TclObject::bind()– Otcl --> c++: command() <otcl command>, tcl.result()– c++ --> otcl: tcl.eval(“<otcl action>”)

Some member functions:int Agent::command(int argc, const char*const* argv)void Agent::recv(Packet* pkt, Handler*)

Page 8: Adding new Protocol to ns2

Overview

New packet header C++ code Tcl code Some necessary changes

Page 9: Adding new Protocol to ns2

Ping.h

struct hdr_ping {char ret;double send_time;

// Header access methodsstatic int offset_; // required by PacketHeaderManagerinline static hdr_ping* access(const Packet* p) {

return (hdr_ping*) p->access(offset_);}

};class PingAgent : public Agent {public:

PingAgent();virtual int command(int argc, const char*const* argv);virtual void recv(Packet*, Handler*);

};

Page 10: Adding new Protocol to ns2

Ping.ccint hdr_ping::offset_;static class PingHeaderClass : public PacketHeaderClass {public:

PingHeaderClass() : PacketHeaderClass("PacketHeader/Ping", sizeof(hdr_ping)) {

bind_offset(&hdr_ping::offset_);}

} class_pinghdr;

static class PingClass : public TclClass {public:

PingClass() : TclClass("Agent/Ping") {}TclObject* create(int, const char*const*) {

return (new PingAgent());}

} class_ping;

Page 11: Adding new Protocol to ns2

Ping.cc (cont.)

PingAgent::PingAgent() : Agent(PT_PING){

bind("packetSize_", &size_);}

Page 12: Adding new Protocol to ns2

int PingAgent::command(int argc, const char*const* argv){ if (argc == 2) { if (strcmp(argv[1], "send") == 0) { // Create a new packet Packet* pkt = allocpkt(); // Access the Ping header for the new packet: hdr_ping* hdr = hdr_ping::access(pkt); // Set the 'ret' field to 0, so the receiving node knows // that it has to generate an echo packet hdr->ret = 0; // Store the current time in the 'send_time' field hdr->send_time = Scheduler::instance().clock(); // Send the packet send(pkt, 0); // return TCL_OK, so the calling function knows that the // command has been processed return (TCL_OK); } } // If the command hasn't been processed by PingAgent()::command, // call the command() function for the base class return (Agent::command(argc, argv));}

Page 13: Adding new Protocol to ns2

void PingAgent::recv(Packet* pkt, Handler*){ // Access the IP header for the received packet: hdr_ip* hdrip = hdr_ip::access(pkt); // Access the Ping header for the received packet: hdr_ping* hdr = hdr_ping::access(pkt); // Is the 'ret' field = 0 (i.e. the receiving node is being pinged)? if (hdr->ret == 0) {

// Send an 'echo'. First save the old packet's send_timedouble stime = hdr->send_time;// Discard the packetPacket::free(pkt);// Create a new packetPacket* pktret = allocpkt();// Access the Ping header for the new packet:hdr_ping* hdrret = hdr_ping::access(pktret);// Set the 'ret' field to 1, so the receiver won't send another echohdrret->ret = 1;// Set the send_time field to the correct valuehdrret->send_time = stime;// Send the packetsend(pktret, 0);

Page 14: Adding new Protocol to ns2

} else {// A packet was received. Use tcl.eval to call the Tcl// interpreter with the ping results.// Note: In the Tcl code, a procedure 'Agent/Ping recv {from rtt}'// has to be defined which allows the user to react to the ping// result.char out[100];// Prepare the output to the Tcl interpreter. Calculate the round// trip timesprintf(out, "%s recv %d %3.1f", name(), hdrip->src_.addr_ >> Address::instance().NodeShift_[1], (Scheduler::instance().clock()-hdr->send_time) * 1000);Tcl& tcl = Tcl::instance();tcl.eval(out);// Discard the packetPacket::free(pkt);

}}

Page 15: Adding new Protocol to ns2

Ping.tcl

#Define a 'recv' function for the class 'Agent/Ping'Agent/Ping instproc recv {from rtt} {

$self instvar node_puts "node [$node_ id] received ping answer from \

$from with round-trip-time $rtt ms."}

set ns [new Simulator]

set nf [open out.nam w]$ns namtrace-all $nf

#Create three nodesset n0 [$ns node]set n1 [$ns node]

Page 16: Adding new Protocol to ns2

#Connect the nodes with one link$ns duplex-link $n0 $n1 1Mb 10ms DropTail

#Create two ping agents and attach them to the nodes n0 and n1set p0 [new Agent/Ping]$ns attach-agent $n0 $p0set p1 [new Agent/Ping]$ns attach-agent $n1 $p1

#Connect the two agents$ns connect $p0 $p1

#Schedule events$ns at 0.2 "$p0 send"$ns at 0.4 "$p1 send"$ns at 0.6 "$p0 send"$ns at 0.6 "$p1 send"$ns at 1.0 "finish"

#Run the simulation$ns run

Page 17: Adding new Protocol to ns2

Necessary changes

packet.henum packet_t {

PT_TCP,PT_UDP,

......// insert new packet types herePT_TFRC,PT_TFRC_ACK,

PT_PING, // packet protocol ID for our ping-agentPT_NTYPE // This MUST be the LAST one

};

Page 18: Adding new Protocol to ns2

Necessary changes (cont.)

packet.hclass p_info {public:

p_info() {name_[PT_TCP]= "tcp";name_[PT_UDP]= "udp";

........... name_[PT_TFRC]= "tcpFriend";

name_[PT_TFRC_ACK]= "tcpFriendCtl";

name_[PT_PING]="Ping";

name_[PT_NTYPE]= "undefined";}

..... }

Page 19: Adding new Protocol to ns2

Necessary changes (cont.)

tcl/lib/ns-default.tclAgent/Ping set packetSize_ 64

tcl/lib/ns-packet.tclforeach prot {

AODVARP

aSRM……

Ping } {

add-packet-header $prot}

Page 20: Adding new Protocol to ns2

Necessary changes (cont.)

Makefilesessionhelper.o delaymodel.o srm-ssm.o \srm-topo.o \ping.o \$(LIB_DIR)int.Vec.o $(LIB_DIR)int.RVec.o \$(LIB_DIR)dmalloc_support.o \

Recompile and runmake dependmakens ping.tcl

Page 21: Adding new Protocol to ns2

Packet flow

Page 22: Adding new Protocol to ns2

Node Models -- Wireless Node

Page 23: Adding new Protocol to ns2

Node Models -- LAN

Page 24: Adding new Protocol to ns2

Our Research : Wireless routing

Manet: Mobile Ad hoc Networks– No fixed infrastructure

– Mobile nodes

– Multi-hop wireless network

– Every host act as a router Routing protocol in Manet:

AODV DSR DSDV ……

Target applications:battlefield, border patrol, disaster recovery……

Page 25: Adding new Protocol to ns2
Page 26: Adding new Protocol to ns2

CMU Ad-Hockey– realistic scenario builder– visualizations of the simulation trace files

Scenario: – 1500m * 300m, 50 nodes – propogation range: 250m– max speed: 20m/s– pause time: 0 30 60 120 300 600 900

Our Research : Wireless routing

Page 27: Adding new Protocol to ns2

Traffic:– CBR 4pkt/s – source number: 10 20 30

Simlation time: 900s Analyze the trace file: perl program Performance metric:

– packet delivery rate– end-end delay– protocol overhead– ……

Our Research : Wireless routing