How to add a new protocol in ns2
This presentation is the property of its rightful owner.
Sponsored Links
1 / 27

How to Add a New Protocol in NS2 PowerPoint PPT Presentation


  • 158 Views
  • Uploaded on
  • Presentation posted in: General

How to Add a New Protocol in NS2. Xu Leiming CSCW Lab. at CS Dept., Tsinghua Univ. mailto:[email protected] June 1, 2001. Outline. Overview An Example ---- Ping Packet flow Node models Our research. Overview. New packet header C++ code Tcl code

Download Presentation

How to Add a New Protocol in NS2

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


How to add a new protocol in ns2

How to Add a New Protocol in NS2

Xu Leiming

CSCW Lab. at CS Dept., Tsinghua Univ.

mailto:[email protected]

June 1, 2001


Outline

Outline

  • Overview

  • An Example ---- Ping

  • Packet flow

  • Node models

  • Our research


Overview

Overview

  • New packet header

  • C++ code

  • Tcl code

  • Some necessary changes


Packet header

Packet Header


Packet header1

Packet Header


New packet header

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)


New agent

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*)


Overview1

Overview

  • New packet header

  • C++ code

  • Tcl code

  • Some necessary changes


Ping h

Ping.h

struct hdr_ping {

char ret;

double send_time;

// Header access methods

static int offset_; // required by PacketHeaderManager

inline 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*);

};


Ping cc

Ping.cc

int 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;


Ping cc cont

Ping.cc (cont.)

PingAgent::PingAgent() : Agent(PT_PING)

{

bind("packetSize_", &size_);

}


How to add a new protocol in 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));

}


How to add a new protocol in 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_time

double stime = hdr->send_time;

// Discard the packet

Packet::free(pkt);

// Create a new packet

Packet* 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 echo

hdrret->ret = 1;

// Set the send_time field to the correct value

hdrret->send_time = stime;

// Send the packet

send(pktret, 0);


How to add a new protocol in 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 time

sprintf(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 packet

Packet::free(pkt);

}

}


Ping tcl

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 nodes

set n0 [$ns node]

set n1 [$ns node]


How to add a new protocol in 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 n1

set p0 [new Agent/Ping]

$ns attach-agent $n0 $p0

set 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


Necessary changes

Necessary changes

  • packet.h

enum packet_t {

PT_TCP,

PT_UDP,

......

// insert new packet types here

PT_TFRC,

PT_TFRC_ACK,

PT_PING, // packet protocol ID for our ping-agent

PT_NTYPE // This MUST be the LAST one

};


Necessary changes cont

Necessary changes (cont.)

  • packet.h

class 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";

}

.....

}


Necessary changes cont1

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}


Necessary changes cont2

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


Packet flow

Packet flow


Node models wireless node

Node Models -- Wireless Node


Node models lan

Node Models -- LAN


Our research wireless routing

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……


Our research wireless routing1

Our Research : Wireless routing

  • 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 routing2

Our Research : Wireless routing

  • 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

    • ……


  • Login