Presentation is loading. Please wait.

Presentation is loading. Please wait.

How to Add a New Protocol in NS2 Xu Leiming CSCW Lab. at CS Dept., Tsinghua Univ. June 1, 2001.

Similar presentations


Presentation on theme: "How to Add a New Protocol in NS2 Xu Leiming CSCW Lab. at CS Dept., Tsinghua Univ. June 1, 2001."— Presentation transcript:

1 How to Add a New Protocol in NS2 Xu Leiming CSCW Lab. at CS Dept., Tsinghua Univ. mailto:xlming@csnet4.cs.tsinghua.edu.cn June 1, 2001

2 Outline 4 Overview 4 An Example ---- Ping 4 Packet flow 4 Node models 4 Our research

3 Overview 4 New packet header 4 C++ code 4 Tcl code 4 Some necessary changes

4 Packet Header

5

6 New Packet Header 4 Create new header structure 4 Enable tracing support of new header 4 Create static class for OTcl linkage (packet.h) 4 Enable new header in Otcl (tcl/lib/ns- packet.tcl)

7 New Agent 4 Decide position in class hierarchy Derive from a agent class 4 Link with a OTcl class –TclClass TclObject –TclObject::bind() –Otcl --> c++: command(), tcl.result() –c++ --> otcl: tcl.eval(“ ”) 4 Some member functions: int Agent::command(int argc, const char*const* argv) void Agent::recv(Packet* pkt, Handler*)

8 Overview 4 New packet header 4 C++ code 4 Tcl code 4 Some necessary changes

9 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*); };

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

11 Ping.cc (cont.) PingAgent::PingAgent() : Agent(PT_PING) { bind("packetSize_", &size_); }

12 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)); }

13 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);

14 } 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); }

15 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]

16 #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

17 Necessary changes 4 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 };

18 Necessary changes (cont.) 4 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"; }..... }

19 Necessary changes (cont.) 4 tcl/lib/ns-default.tcl Agent/Ping set packetSize_ 64 4 tcl/lib/ns-packet.tcl foreach prot { AODV ARP aSRM …… Ping } { add-packet-header $prot }

20 Necessary changes (cont.) 4 Makefile sessionhelper.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 \ 4 Recompile and run make depend make ns ping.tcl

21 Packet flow

22 Node Models -- Wireless Node

23 Node Models -- LAN

24 Our Research : Wireless routing 4 Manet: Mobile Ad hoc Networks –No fixed infrastructure –Mobile nodes –Multi-hop wireless network –Every host act as a router 4 Routing protocol in Manet: AODV DSR DSDV …… 4 Target applications: battlefield, border patrol, disaster recovery……

25

26 4 CMU Ad-Hockey – realistic scenario builder – visualizations of the simulation trace files 4 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

27 4 Traffic: –CBR 4pkt/s –source number: 10 20 30 4 Simlation time: 900s 4 Analyze the trace file: perl program 4 Performance metric: –packet delivery rate –end-end delay –protocol overhead – …… Our Research : Wireless routing


Download ppt "How to Add a New Protocol in NS2 Xu Leiming CSCW Lab. at CS Dept., Tsinghua Univ. June 1, 2001."

Similar presentations


Ads by Google