1 / 27

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:xlming@csnet4.cs.tsinghua.edu.cn June 1, 2001. Outline. Overview An Example ---- Ping Packet flow Node models Our research. Overview. New packet header C++ code Tcl code

glenna
Télécharger la présentation

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. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

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 • Overview • An Example ---- Ping • Packet flow • Node models • Our research

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

  4. Packet Header

  5. Packet Header

  6. 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)

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

  8. Overview • New packet header • C++ code • Tcl code • 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 • 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.) • 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.) • tcl/lib/ns-default.tclAgent/Ping set packetSize_ 64 • tcl/lib/ns-packet.tclforeach prot { AODV ARP aSRM …… Ping } { add-packet-header $prot }

  20. 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 depend make ns ping.tcl

  21. Packet flow

  22. Node Models -- Wireless Node

  23. Node Models -- LAN

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

  25. 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

  26. 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 • ……

More Related