mobility.tex
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:69k
源码类别:

通讯编程

开发平台:

Visual C++

  1. %documentstyle[11pt,fullpage]{article}
  2. %setlength{parindent}{0 in}
  3. %setlength{parskip}{.1in}
  4. %setlength{topmargin}{-0.5in}
  5. %setlength{textheight}{8.5in}
  6. %begin{document}
  7. chapter{Mobile Networking in ns}
  8. label{chap:mobility}
  9. This chapter describes the wireless model that was originally ported as CMU's Monarch group's mobility extension to ns. 
  10. This chapter consists of two sections and several subsections. The
  11. first section covers the original mobility model ported from
  12. CMU/Monarch group. In this section, we cover the internals of a
  13. mobilenode, routing mechanisms and network components that are used to
  14. construct the network stack for a mobilenode. The components that are
  15. covered briefly are Channel, Network-interface, Radio propagation
  16. model, MAC protocols, Interface Queue, Link layer and Address
  17. resolution protocol model (ARP). CMU trace support and Generation of
  18. node movement and traffic scenario files are also covered in this
  19. section. 
  20. The original CMU model allows simulation of pure wireless LANs or
  21. multihop ad-hoc networks. Further extensions were made to this model
  22. to allow combined simulation of wired and wireless networks. MobileIP
  23. was also extended to the wireless model. These are
  24. discussed in the second section of this chapter.                
  25. section{The basic wireless model in ns}
  26. label{sec:basic-model}
  27. The wireless model essentially consists of the MobileNode at the core,with
  28. additional supporting features that allows simulations of multi-hop ad-hoc
  29. networks, wireless LANs etc. The MobileNode object is a split object. The
  30. C++ clsref{MobileNode}{../ns-2/mobilenode.h} is derived from parent
  31. clsref{Node}{../ns-2/node.h}. Refer to Chapter~ref{chap:nodes} for
  32. details on code{Node}. A code{MobileNode} thus is the basic code{Node}
  33. object with added functionalities of a wireless and mobile node like
  34. ability to move within a given topology, ability to receive and transmit
  35. signals to and from a wireless channel etc. A major difference between
  36. them, though, is that a code{MobileNode} is not connected by means of
  37. code{Links} to other nodes or mobilenodes. In this section we shall
  38. describe the internals of code{MobileNode}, its routing mechanisms, the
  39. routing protocols dsdv, aodv, tora and dsr, creation of network stack
  40. allowing channel
  41. access in code{MobileNode}, brief description of each stack component,
  42. trace support and movement/traffic scenario generation for wireless
  43. simulations. 
  44. subsection{Mobilenode: creating wireless topology}
  45. label{sec:mobilenode-creation}
  46. code{MobileNode} is the basic ns code{Node} object with added
  47. functionalities like movement, ability to transmit and receive on a
  48. channel that allows it to be used to create mobile, wireless simulation
  49. environments. The class MobileNode is derived from the base class Node.
  50. code{MobileNode} is a split object. The mobility features including node
  51. movement, periodic position updates, maintaining topology boundary etc are
  52. implemented in C++ while plumbing of network components within
  53. code{MobileNode} itself (like classifiers, dmux , LL, Mac, Channel etc)
  54. have been implemented in Otcl. The functions and procedures described in
  55. this subsection can be found in nsf{mobilenode.{cc,h}},
  56. nsf{tcl/lib/ns-mobilenode.tcl}, nsf{tcl/mobility/dsdv.tcl},
  57. nsf{tcl/mobility/dsr.tcl}, nsf{tcl/mobility/tora.tcl}. Example scripts
  58. can be found in
  59. nsf{tcl/ex/wireless-test.tcl} and nsf{tcl/ex/wireless.tcl}. While the
  60. first example uses a small topology of 3 nodes, the second example runs
  61. over a topology of 50 nodes. These scripts can be run simply by typing
  62. begin{program}
  63. $ns tcl/ex/wireless.tcl (or /wireless-test.tcl)
  64. end{program} %$
  65. %code{$opt(rp)} and $opt(rp) dont work  ---xuanc
  66. The four ad-hoc routing protocols that are currently supported are 
  67. Destination Sequence Distance Vector (DSDV), Dynamic Source Routing
  68. (DSR), Temporally ordered Routing Algorithm (TORA) and Adhoc On-demand
  69. Distance Vector (AODV). 
  70. The primitive to create a mobilenode is described below. Please note that the old APIs for creating a mobilenode depended on which routing protocol was used, like 
  71. begin{program} set mnode [$opt(rp)-create-mobile-node $id] end{program} 
  72. where 
  73. begin{program} $opt(rp) end{program} 
  74. defines "dsdv", "aodv", "tora" or "dsr" and id is the index for the mobilenode. But the old API's use is being deprecated and the new API is described as follows:.
  75. begin{program}
  76. $ns_ node-config -adhocRouting $opt(adhocRouting) 
  77.                  -llType $opt(ll) 
  78.                  -macType $opt(mac) 
  79.                  -ifqType $opt(ifq) 
  80.                  -ifqLen $opt(ifqlen) 
  81.                  -antType $opt(ant) 
  82.                  -propInstance [new $opt(prop)] 
  83.                  -phyType $opt(netif) 
  84.                  -channel [new $opt(chan)] 
  85.                  -topoInstance $topo 
  86.                  -wiredRouting OFF 
  87.                  -agentTrace ON 
  88.                  -routerTrace OFF 
  89.                  -macTrace OFF
  90. end{program} %$
  91. The above API configures for a mobilenode with all the given values of adhoc-routing protocol, network stack, channel,topography, propagation model, with wired routing turned on or off (required for wired-cum-wireless scenarios) and tracing turned on or off at different levels (router, mac, agent). Incase hierarchical addressing is being used, the hier address of the node needs to be passed as well. For more info about this command (part of new node APIs) see chapter titled "Restructuring ns node and new Node APIs" in ns Notes and Documentation.
  92. Next actually create the mobilenodes as follows:
  93. begin{program}
  94. for { set j 0 } { $j < $opt(nn)} {incr j} {
  95.     set node_($j) [ $ns_ node ]
  96.     $node_($i) random-motion 0 ;# disable random motion
  97. }
  98. end{program} %$
  99. The above procedure creates a mobilenode (split)object, creates an adhoc-routing routing agent as specified, creates the network stack consisting of a link layer, interface queue, mac layer, and a network interface with an antenna, uses the defined propagation model, interconnects these components and connects the stack to the channel. The mobilenode now looks like the schematic in Figure~ref{fig:mobilenode-dsdv}.  
  100. begin{figure}
  101.     centerline{includegraphics{dsdv}}
  102.     caption{Schematic of a mobilenode under the CMU monarch's
  103.       wireless extensions to ns} 
  104.     label{fig:mobilenode-dsdv} 
  105. end{figure}
  106. The mobilenode structure used for DSR routing is slightly different from
  107. the mobilenode described above. The class SRNode is derived from class
  108. MobileNode. SRNode doesnot use address demux or classifiers and all
  109. packets received by the node are handed dow   
  110. n to the DSR routing agent by default. The DSR routing agent either
  111. receives pkts for itself by handing it over to the port dmux or forwards
  112. pkts as per source routes in the pkt hdr or sends out route requests and
  113. route replies for fresh packets. Details    
  114. on DSR routing agent may be found in section~ref{sec:dsr}. The schematic
  115. model for a SRNode is shown in Figure~ref{fig:mobilenode-dsr}. 
  116. begin{figure}[tb]
  117.     centerline{includegraphics{dsr}}
  118.     caption{Schematic of a SRNode under the CMU monarch's wireless
  119.       extensions to ns} 
  120.     label{fig:mobilenode-dsr}
  121. end{figure}
  122. subsection{Creating Node movements}
  123. label{sec:mobilenode-movements}
  124. The mobilenode is designed to move in a three dimensional topology. However the third dimension (Z) is not used. That is the mobilenode is assumed to move always on a flat terrain with Z always equal to 0.
  125. Thus the mobilenode has X, Y, Z(=0) co-ordinates that is continually adjusted as the node moves. There are two mechanisms to induce movement in mobilenodes. 
  126. In the first method, starting position of the node and its future destinations may be set explicitly. These directives are normally included in a separate movement scenario file. 
  127. The start-position and future destinations for a mobilenode may be set
  128. by using the following APIs:
  129. begin{program}
  130. $node set X_ <x1>
  131. $node set Y_ <y1>
  132. $node set Z_ <z1>
  133. $ns at $time $node setdest <x2> <y2> <speed> 
  134. end{program}
  135. At $time sec, the node would start moving from its initial position 
  136. of (x1,y1) towards a destination (x2,y2) at the defined speed.
  137. In this method the node-movement-updates are triggered whenever the
  138. position of the node at a given time is required to be known. This
  139. may be triggered by a query from a neighbouring node seeking to know
  140. the distance between them, or the setdest directive
  141. described above that changes the direction and speed of the node.
  142. An example of a movement scenario file using the above APIs, can be
  143. found in nsf{tcl/mobility/scene/scen-670x670-50-600-20-0}. Here
  144. 670x670 defines the length and width of the topology with 50 nodes
  145. moving at a maximum speed of 20m/s with average pause time of
  146. 600s. These node movement files may be generated using CMU's scenario
  147. generator to be found under
  148. nsf{indep-utils/cmu-scen-gen/setdest}. See 
  149. subsection~ref{sec:mobile-scen-generator} for details on generation
  150. of node movement scenarios. 
  151. The second method employs random movement of the node. The primitive
  152. to be used is:
  153. begin{program}
  154. $mobilenode start
  155. end{program} %$
  156. which starts the mobilenode with a random position and have routined
  157. updates to change the direction and speed of the node. The destination
  158. and speed values are generated in a random fashion. We have not used
  159. the second method and leave it to the user to 
  160. explore the details. 
  161. The mobilenode movement is implemented in C++. See methods in
  162. nsf{mobilenode.{cc.h}} for the implementational details.
  163. Irrespective of the methods used to generate node movement,
  164. the topography for mobilenodes needs to be defined. It should be
  165. defined before creating mobilenodes. Normally flat topology is created
  166. by specifying the length and width of the topography using the
  167. following primitive:
  168. begin{program}    
  169. set topo        [new Topography]
  170. $topo load_flatgrid $opt(x) $opt(y)
  171. end{program} %$
  172. where opt(x) and opt(y) are the boundaries used in simulation.
  173. The movement of mobilenodes may be logged by using a procedure like
  174. the following:
  175. begin{program}
  176. proc log-movement {} {
  177.     global logtimer ns_ ns
  178.     set ns $ns_
  179.     source ../mobility/timer.tcl
  180.     Class LogTimer -superclass Timer
  181.     LogTimer instproc timeout {} {
  182.         global opt node_;
  183.         for {set i 0} {$i < $opt(nn)} {incr i} {
  184.             $node_($i) log-movement
  185.         }
  186.         $self sched 0.1
  187.     }
  188.     set logtimer [new LogTimer]
  189.     $logtimer sched 0.1
  190. }
  191. end{program} %$
  192. In this case, mobilenode positions would be logged every 0.1 sec.
  193. subsection{Network Components in a mobilenode}
  194. label{sec:mobilenode-components}
  195. The network stack for a mobilenode consists of a link layer(LL), an
  196. ARP module connected to LL, an interface priority queue(IFq), a mac
  197. layer(MAC), a network interface(netIF), all connected to the channel. 
  198. These network components are created and plumbed together in OTcl. 
  199. The relevant MobileNode method add-interface() in
  200. nsf{tcl/lib/ns-mobilenode.tcl} is shown below:
  201. begin{program}
  202. #
  203. #  The following setups up link layer, mac layer, network interface
  204. #  and physical layer structures for the mobile node.
  205. #
  206. Node/MobileNode instproc add-interface { channel pmodel 
  207.                 lltype mactype qtype qlen iftype anttype } {
  208.         $self instvar arptable_ nifs_
  209.         $self instvar netif_ mac_ ifq_ ll_
  210.         global ns_ MacTrace opt
  211.         set t $nifs_
  212.         incr nifs_
  213.         set netif_($t)  [new $iftype]           ;# net-interface
  214.         set mac_($t)    [new $mactype]          ;# mac layer
  215.         set ifq_($t)    [new $qtype]            ;# interface queue
  216.         set ll_($t)     [new $lltype]           ;# link layer
  217.         set ant_($t)    [new $anttype]
  218.         #
  219.         # Local Variables
  220.         #
  221.         set nullAgent_ [$ns_ set nullAgent_]
  222.         set netif $netif_($t)
  223.         set mac $mac_($t)
  224.         set ifq $ifq_($t)
  225.         set ll $ll_($t)
  226.         #
  227.         # Initialize ARP table only once.
  228.         #
  229.         if { $arptable_ == "" } {
  230.             set arptable_ [new ARPTable $self $mac]
  231.             set drpT [cmu-trace Drop "IFQ" $self]
  232.             $arptable_ drop-target $drpT
  233.         }
  234.         #
  235.         # Link Layer
  236.         #
  237.         $ll arptable $arptable_
  238.         $ll mac $mac
  239.         $ll up-target [$self entry]
  240.         $ll down-target $ifq
  241.         #
  242.         # Interface Queue
  243.         #
  244.         $ifq target $mac
  245.         $ifq set qlim_ $qlen
  246.         set drpT [cmu-trace Drop "IFQ" $self]
  247.         $ifq drop-target $drpT
  248.         #
  249.         # Mac Layer
  250.         #
  251.         $mac netif $netif
  252.         $mac up-target $ll
  253.         $mac down-target $netif
  254.         $mac nodes $opt(nn)
  255.         #
  256.         # Network Interface
  257.         #
  258.         $netif channel $channel
  259.         $netif up-target $mac
  260.         $netif propagation $pmodel      ;# Propagation Model
  261.         $netif node $self               ;# Bind node <---> interface
  262.         $netif antenna $ant_($t)        ;# attach antenna
  263.         #
  264.         # Physical Channel
  265.         #
  266.         $channel addif $netif           ;# add to list of interfaces
  267.         # ============================================================
  268.         # Setting up trace objects
  269.         
  270.         if { $MacTrace == "ON" } {
  271.             #
  272.             # Trace RTS/CTS/ACK Packets
  273.             #
  274.             set rcvT [cmu-trace Recv "MAC" $self]
  275.             $mac log-target $rcvT
  276.             #
  277.             # Trace Sent Packets
  278.             #
  279.             set sndT [cmu-trace Send "MAC" $self]
  280.             $sndT target [$mac sendtarget]
  281.             $mac sendtarget $sndT
  282.             #
  283.             # Trace Received Packets
  284.             #
  285.             set rcvT [cmu-trace Recv "MAC" $self]
  286.             $rcvT target [$mac recvtarget]
  287.             $mac recvtarget $rcvT
  288.             #
  289.             # Trace Dropped Packets
  290.             #
  291.             set drpT [cmu-trace Drop "MAC" $self]
  292.             $mac drop-target $drpT
  293.         } else {
  294.             $mac log-target [$ns_ set nullAgent_]
  295.             $mac drop-target [$ns_ set nullAgent_]
  296.         }
  297.         # ============================================================
  298.         $self addif $netif
  299. }
  300. end{program} %$
  301. The plumbing in the above method creates the network stack we see in
  302. Figure~ref{fig:mobilenode-dsdv}.
  303. Each component is briefly described here. Hopefully more detailed
  304. docuentation from CMU shall be available in the future. 
  305. begin{description}
  306. item[{bf Link Layer}] The code{LL} used by mobilenode is same as
  307.   described in Chapter~ref{chap:lan}. The only difference being the
  308.   link layer for mobilenode, has an ARP module connected to it which
  309.   resolves all IP to hardware (Mac) address conversions. Normally for
  310.   all outgoing (into the channel) packets, the packets are handed down
  311.   to the code{LL} by the Routing Agent. The code{LL} hands down
  312.   packets to the interface queue. For all incoming packets (out of the
  313.   channel), the mac layer hands up packets to the code{LL} which is
  314.   then handed off at the code{node_entry_} point. The
  315.   clsref{LL}{../ns-2/ll.h} is implemented in nsf{ll.{cc,h}} and
  316.   nsf{tcl/lan/ns-ll.tcl}.
  317. item [{bf ARP}] The Address Resolution Protocol (implemented in BSD
  318.   style) module receives queries from Link layer. If ARP has the
  319.   hardware address for destination, it writes it into the mac header
  320.   of the packet. Otherwise it broadcasts an ARP query, and caches the
  321.   packet temporarily. For each unknown destination hardware address,
  322.   there is a buffer for a single packet. Incase additional packets to
  323.   the same destination is sent to ARP, the earlier buffered packet is
  324.   dropped. Once the hardware address of a
  325.   packet's next hop is known, the packet is inserted into the
  326.   interface queue. The clsref{ARPTable}{../ns-2/arp.h} is implemented
  327.   in nsf{arp.{cc,h}} and nsf{tcl/lib/ns-mobilenode.tcl}.
  328. item[{bf Interface Queue}] The clsref{PriQueue}{../ns-2/priqueue.h}
  329.   is implemented as a priority queue which gives priority to routing  
  330.   rotocol packets, inserting them at the head of the queue. It supports
  331.   running a filter over all packets in the queue and removes those with
  332.   a specified destination address. See nsf{priqueue.{cc,h}} for 
  333.   interface queue implementation.
  334. item[{bf Mac Layer}] Historically, ns-2 (prior to release ns-2.33)
  335.   has used the implementation of IEEE 802.11 distributed coordination 
  336.   function (DCF) from CMU. Starting with ns-2.33, several 802.11 
  337.   implementations are available.  See section ref{sec:802_11} for
  338.   more information.
  339. item[{bf Tap Agents}] code{Agents} that subclass themselves as
  340.   clsref{Tap}{../ns-2/mac.h} defined in mac.h can register themselves
  341.   with the mac object using method installTap(). If the particular Mac
  342.   protocol permits it, the tap will promiscuously be 
  343.   given all packets received by the mac layer, before address filtering
  344.   is done. See nsf{mac.{cc,h}} for clsref{Tap} implementation. 
  345. item[{bf Network Interfaces}] The Network Interphase layer serves as
  346.   a hardware interface which is used by mobilenode to access the
  347.   channel. The wireless shared media interface is implemented as
  348.   clsref{Phy/WirelessPhy}{../ns-2/wireless-phy.h}. This interface
  349.   subject to collisions and the radio propagation model receives
  350.   packets transmitted by other node interfaces to the channel. The
  351.   interface stamps each transmitted packet with the meta-data related
  352.   to the transmitting interface like the transmission power,
  353.   wavelength etc. This meta-data in pkt header is used by the
  354.   propagation model in receiving network interface to determine if the
  355.   packet has minimum power to be received and/or captured and/or
  356.   detected (carrier sense) by the receiving node. The model
  357.   approximates the DSSS radio interface (Lucent WaveLan
  358.   direct-sequence spread-spectrum). See nsf{phy.{cc.h}} and
  359.   nsf{wireless-phy.{cc,h}} for network interface implementations.
  360. item[{bf Radio Propagation Model}]  It uses Friss-space attenuation
  361.   ($1/r^2$) at near distances and an approximation to Two ray Ground
  362.   ($1/r^4$) at far distances. The approximation assumes specular
  363.   reflection off a flat ground plane. See nsf{tworayground.{cc,h}}
  364.   for implementation.
  365. item[{bf Antenna}] An omni-directional antenna having unity gain is 
  366.   used by mobilenodes. See nsf{antenna.{cc,h}} for implementation
  367.   details. 
  368. end{description}
  369. subsection{Different MAC layer protocols for mobile networking}
  370. label{sec:mobilenode-mac}
  371. In ns, two MAC layer protocols are implemented for mobile networks,
  372.   which are 802.11 and TDMA.
  373. In this section
  374.   we briefly discuss each of them.
  375. subsubsection{802.11 MAC protocol}
  376. label{sec:802_11_brief}
  377.   Historically, ns-2 (prior to release ns-2.33)
  378.   has used the implementation of IEEE 802.11 distributed coordination 
  379.   function (DCF) from CMU. Starting with ns-2.33, several 802.11 
  380.   implementations are available.  See section ref{sec:802_11} for
  381.   more information.
  382. subsubsection{Preamble based TDMA protocol}
  383. label{sec:tdma}
  384. {bf Note:} this works is still at a preliminary stage,
  385.   some practical issues, such as:
  386.   contention in the preamble phase and 
  387.   time slot reuse in a multi-hop environment are not considered.
  388. Unlike contention based MAC protocol (802.11, for example), 
  389.   a TDMA MAC protocol allocates different time slots for nodes to 
  390.   send and receive packets.
  391. The superset of these time slots is called a TDMA frame.
  392. Currently, ns supports a single hop, 
  393.   preamble-based TDMA MAC protocol.
  394. With this protocl,
  395.   a TDMA frame contains preamble besides the data transmission slots.
  396. Within the preamble,
  397.   every node has a dedicated subslot and
  398.   uses it to broadcast the destination node id of outgoing packet.
  399. Other nodes listen in the preamble and record 
  400.   the time slots to receive packets.
  401. Like other common TDMA protocols (GSM, for example),
  402.   each node has a data transmission slot to send packets.
  403. To avoid unnecessary power consumption,
  404.   each node turns its radio on and off explicitly
  405.   by invoking node API code{set_node_sleep()}.
  406. The radio only needs to be on when:
  407.   in the pramble phase (takes one slot time) and
  408.   there is a packet to send and receive.
  409. The preamble is implemented as a central data structure
  410.   code{tdma_preamble_},
  411.   which is accessible to all the nodes.
  412. At the beginning of a frame,
  413.   each node writes the destination node id into
  414.   its subslot in preamble if it has a packet to send.
  415. Following preamble phase,
  416.   each node sends packet in its data transmission slot and
  417.   checks the preamble to determine if 
  418.   there is a packet to receive in other slots.
  419. The following parameters are user configurable:
  420.  the wireless link bandwidth code{bandwith_},  
  421.   the slot length code{packet_slot_len_}, 
  422.   and the number of nodes code{max_node_num_}.
  423. See nsf{mac-tdma.{cc,h}} for implementation details.
  424. subsection{Different types of Routing Agents in mobile networking}
  425. label{sec:mobilenode-routing}
  426. The four different ad-hoc routing protocols currently implemented
  427. for mobile networking in ns are dsdv, dsr, aodv and tora. In this section
  428. we shall briefly discuss each of them.
  429. subsubsection{DSDV}
  430. label{sec:dsdv}
  431. In this routing protocol routing messages are exchanged between
  432. neighbouring mobilenodes (i.e mobilenodes that are within range of one
  433. another). Routing updates may be triggered or routine. Updates are
  434. triggered in case a routing information from one of t   
  435. he neighbours forces a change in the routing table.
  436. A packet for which the route to its destination is not known is cached
  437. while routing queries are sent out. The pkts are cached until
  438. route-replies are received from the destination. There is a maximum buffer
  439. size for caching the pkts waiting for routing information beyond which
  440. pkts are dropped. 
  441. All packets destined for the mobilenode are routed directly by the address
  442. dmux to its port dmux. The port dmux hands the packets to the respective
  443. destination agents. A port number of 255 is used to attach routing agent
  444. in mobilenodes. The mobilenodes al
  445. so use a default-target in their classifier (or address demux). In the
  446. event a target is not found for the destination in the classifier (which
  447. happens when the destination of the packet is not the mobilenode itself),
  448. the pkts are handed to the default-ta   
  449. rget which is the routing agent. The routing agent assigns the next hop
  450. for the packet and sends it down to the link layer. 
  451. The routing protocol is mainly implemented in C++. See nsf{dsdv}
  452. directory and nsf{tcl/mobility/dsdv.tc}l for all procedures related to
  453. DSDV protocol implementation.  
  454. subsubsection{DSR}
  455. label{sec:dsr}
  456. This section briefly describes the functionality of the dynamic source
  457. routing protocol. As mentioned earlier the code{SRNode} is different from
  458. the code{MobileNode}.  The code{SRNode}'s code{entry_} points to the
  459. DSR routing agent, thus forcing all    
  460. packets received by the node to be handed down to the routing agent. This
  461. model is required for future implementation of piggy-backed routing
  462. information on data packets which otherwise would not flow through the
  463. routing agent.   
  464. The DSR agent checks every data packet for source-route information. It
  465. forwards the packet as per the routing information. Incase it doesnot find
  466. routing information in the packet, it provides the source route, if route
  467. is known, or caches the packet and   
  468. sends out route queries if route to destination is not known. Routing
  469. queries, always triggered by a data packet with no route to its
  470. destination, are initially broadcast to all neighbours. Route-replies are
  471. send back either by intermediate nodes or the 
  472. destination node, to the source, if it can find routing info for the
  473. destination in the route-query.  It hands over all packets destined to
  474. itself to the port dmux.  
  475. In code{SRNode} the port number 255 points to a null agent since the
  476. packet has already been processed by the routing agent. 
  477. See nsf{dsr} directory and nsf{tcl/mobility/dsr.tcl} for implementation
  478. of DSR protocol. 
  479. subsubsection{TORA}
  480. label{sec:tora}
  481. Tora is a distributed routing protocol based on "link reversal" algorithm. 
  482. At every node a separate copy of TORA is run for every destination. When a
  483. node needs a route to a given destination it broadcasts a QUERY message
  484. containing the address of the destination for which it requires  a route.
  485. This packet travels through the network until it reaches the destination
  486. or an intermediate node that has a route to the destination node.
  487. This recepient node node then broadcasts an UPDATE packet listing its
  488. height wrt the destination. As this node propagates through the network
  489. each node updates its height to a value greater than the height of the
  490. neighbour from which it receives the UPDATE. This results in a series of
  491. directed links from the node that originated the QUERY to the destination
  492. node. If a node discovers a particular destination to be unreachable it
  493. sets a local maximum value of height for that destination. Incase the node
  494. cannot find any neighbour having finite height wrt this destination it
  495. attempts to find a new route. In case of network partition, the node
  496. broadcasts a CLEAR message that resets all routing states and removes
  497. invalid routes from the network.
  498. TORA operates on top of IMEP (Internet MANET Encapsulation Protocol) that
  499. provides reliable delivery of route-messages and informs the routing
  500. protocol of any changes of the links to its neighbours. IMEP tries to
  501. aggregate IMEP and TORA messages into a single packet (called block) in
  502. order to reduce overhead. For link-status sensing and maintaining a list
  503. of neighbour nodes, IMEP sends out periodic BEACON messages which is
  504. answered by each node that hears it by a HELLO reply message.
  505. See ns/tora directory and ns/tcl/mobility/tora.tcl for implementation of
  506. tora in ns.
  507. subsubsection{AODV}
  508. label{sec:AODV}
  509. AODV is a combination of both DSR and DSDV protocols. It has the basic
  510. route-discovery and route-maintenance of DSR and uses the hop-by-hop
  511. routing, sequence numbers and beacons of DSDV. The node that wants to know
  512. a route to a given destination generates a ROUTE REQUEST. The route
  513. request is forwarded by intermediate nodes that also creates a reverse
  514. route for itself from the destination. When the request reaches a node
  515. with route to destination it generates a ROUTE REPLY containing the number
  516. of hops requires to reach destination. All nodes that participates in
  517. forwarding this reply to the source node creates a forward route to
  518. destination. This state created from each node from source to destination
  519. is a hop-by-hop state and not the entire route as is done in source
  520. routing.
  521. See ns/aodv and ns/tcl/lib/ns-lib.tcl for implementational details
  522. of aodv.
  523. subsection{Trace Support}
  524. label{sec:mobile-trace}
  525. The trace support for wireless simulations currently use cmu-trace
  526. objects. In the future this shall be extended to merge with trace and
  527. monitoring support available in ns, which would also include nam support
  528. for wireless modules. For now we will explain briefly with cmu-trace
  529. objects and how they may be used to trace packets for wireless scenarios. 
  530. The cmu-trace objects are of three types - code{CMUTrace/Drop},
  531. code{CMUTrace/Recv} and code{CMUTrace/Send}. These are used for tracing
  532. packets that are dropped, received and sent by agents, routers, mac layers
  533. or interface queues in ns. The methods and procedures used for
  534. implementing wireless trace support can be found under
  535. nsf{trace.{cc,h}} and nsf{tcl/lib/ns-cmutrace.tcl}.
  536. A cmu-trace object may be created by the following API:
  537. begin{program}
  538. set sndT [cmu-trace Send "RTR" $self]
  539. end{program} %$
  540. which creates a trace object, sndT, of the type code{CMUTrace/Send}
  541. for tracing all packets that are sent out in a router. The trace
  542. objects may be used to trace packets in MAC, agents (routing or
  543. others), routers or any other NsObject. 
  544. The cmu-trace object code{CMUTrace} is derived from the base class
  545. code{Trace}. See Chapter~ref{chap:trace} for details on class
  546. code{Trace}. The class code{CMUTrace} is defined as the following:
  547. begin{program}
  548. class CMUTrace : public Trace {
  549. public:
  550.         CMUTrace(const char *s, char t);
  551.         void    recv(Packet *p, Handler *h);
  552.         void    recv(Packet *p, const char* why);
  553. private:
  554.         int off_arp_;
  555.         int off_mac_;
  556.         int off_sr_;
  557.         char    tracename[MAX_ID_LEN + 1];
  558.         int     tracetype;
  559.         MobileNode *node_;
  560.         int initialized() { return node_ && 1; }
  561.         int     command(int argc, const char*const* argv);
  562.         void    format(Packet *p, const char *why);
  563.         void    format_mac(Packet *p, const char *why, int offset);
  564.         void    format_ip(Packet *p, int offset);
  565.         void    format_arp(Packet *p, int offset);
  566.         void    format_dsr(Packet *p, int offset);
  567.         void    format_msg(Packet *p, int offset);
  568.         void    format_tcp(Packet *p, int offset);
  569.         void    format_rtp(Packet *p, int offset);
  570. };
  571. end{program}
  572. The type field (described in code{Trace} class definition) is used to
  573. differentiate among different types of traces. For cmu-trace this can be
  574. {bf s} for sending, {bf r} for receiving or {bf D} for dropping a
  575. packet. A fourth type {bf f} is used to denote forwarding of a packet
  576. (When the node is not the originator of the packet). 
  577. Similar to the method Trace::format(), the CMUTrace::format() defines and
  578. dictates the trace file format. The method is shown below: 
  579. begin{program}
  580. void CMUTrace::format(Packet* p, const char *why)
  581. {
  582.         hdr_cmn *ch = HDR_CMN(p);
  583.         int offset = 0;
  584.         /*
  585.          * Log the MAC Header
  586.          */
  587.         format_mac(p, why, offset);
  588.         offset = strlen(wrk_);
  589.         switch(ch->ptype()) {
  590.         case PT_MAC:
  591.                 break;
  592.         case PT_ARP:
  593.                 format_arp(p, offset);
  594.                 break;
  595.         default:
  596.                 format_ip(p, offset);
  597.                 offset = strlen(wrk_);
  598.                 switch(ch->ptype()) {
  599.                 case PT_DSR:
  600.                         format_dsr(p, offset);
  601.                         break;
  602.                 case PT_MESSAGE:
  603.                 case PT_UDP:
  604.                         format_msg(p, offset);
  605.                         break;
  606.                         
  607.                 case PT_TCP:
  608.                 case PT_ACK:
  609.                         format_tcp(p, offset);
  610.                         break;
  611.                         
  612.                 case PT_CBR:
  613.                         format_rtp(p, offset);
  614.                         break;
  615.                 ..........
  616.                 }
  617.         }
  618. }
  619. end{program}
  620. The above function calls different format functions depending on the type
  621. of the packet being traced. All traces are written to the buffer wrk_. A
  622. count of the offset for the buffer is kept and is passed along the
  623. different trace functions. The most basic format is defined by
  624. format_mac() and is used to trace all pkt types. The other format
  625. functions print additional information as defined by the packet types. The
  626. mac format prints the following:   
  627. begin{program}
  628. #ifdef LOG_POSITION
  629.         double x = 0.0, y = 0.0, z = 0.0;
  630.         node_->getLoc(&x, &y, &z);
  631. #endif
  632.         sprintf(wrk_ + offset,
  633. #ifdef LOG_POSITION
  634.                 "%c %.9f %d (%6.2f %6.2f) %3s %4s %d %s %d [%x %x %x %x] ",
  635. #else
  636.                 "%c %.9f _%d_ %3s %4s %d %s %d [%x %x %x %x] ",
  637. #endif
  638.                 op,                    // s, r, D or f
  639.                 Scheduler::instance().clock(),  // time stamp
  640.                 src_,                  // the nodeid for this node
  641. #ifdef LOG_POSITION
  642.                 x,                     // x co-ord 
  643.                 y,                     // y co-ord
  644. #endif
  645.                 tracename,             // name of object type tracing
  646.                 why,                   // reason, if any
  647.                 ch->uid(),             // identifier for this event
  648.                 packet_info.name(ch->ptype()), // packet type
  649.                 ch->size(),                    // size of cmn header
  650.                 mh->dh_duration,       // expected time to send data 
  651.                 ETHER_ADDR(mh->dh_da), // mac_destination address
  652.                 ETHER_ADDR(mh->dh_sa),         // mac_sender address
  653.                 GET_ETHER_TYPE(mh->dh_body));  // type - arp or IP
  654. end{program}
  655. If the LOG_POSITION is defined the x and y co-ordinates for the
  656. mobilenode is also printed. The descriptions for different fields in the
  657. mac trace are given in the comments above. For all IP packets additional
  658. IP header fields are also added to the above trace. The IP trace is
  659. described below:
  660. begin{program}
  661. sprintf(wrk_ + offset, "------- [%d:%d %d:%d %d %d] ",
  662.                 src,          // IP src address
  663.                 ih->sport_,   // src port number
  664.                 dst,          // IP dest address
  665.                 ih->dport_,   // dest port number
  666.                 ih->ttl_,     // TTL value 
  667.                 (ch->next_hop_ < 0) ? 0 : ch->next_hop_); // next hopaddress, if any.
  668. end{program}
  669. An example of a trace for a tcp packet is as follows:
  670. begin{program}
  671. r 160.093884945 _6_ RTR  --- 5 tcp 1492 [a2 4 6 800] ------- [655
  672. 36:0 16777984:0 31 16777984] [1 0] 2 0
  673. end{program}
  674. Here we see a TCP data packet being received by a node with id of 6. UID
  675. of this pkt is 5 with a cmn hdr size of 1492. The mac details shows an IP
  676. pkt (ETHERTYPE_IP is defined as 0x0800, ETHERTYPE_ARP is 0x0806 ), mac-id
  677. of this receiving node is 4. That of the sending node is 6 and expected
  678. time to send this data pkt over the wireless channel is a2 (hex2dec
  679. conversion: 160+2 sec). Additionally, IP traces information about IP src
  680. and destination addresses. The src translates (using a 3 level
  681. hier-address of 8/8/8) to a address string of 0.1.0 with port of 0. The
  682. dest address is 1.0.3 with port address of 0. The TTL value is 31 and the
  683. destination was a hop away from the src. Additionally TCP format prints
  684. information about tcp seqno of 1, ackno of 0. See other formats described
  685. in nsf/cmu-trace.cc for DSR, UDP/MESSAGE, TCP/ACK and CBR packet types.
  686. Other trace formats are also used by the routing agents (TORA and DSR) to
  687. log certain special routing events like "originating" (adding a SR header
  688. to a packet) or  "ran off the end of a source route" indicating some sort
  689. of routing problem with the source route etc. These special event traces
  690. begin with "S" for DSR and "T" for Tora and may
  691. be found in nsf{tora/tora.cc} for TORA and nsf{dsr/dsrgent.cc} for DSR
  692. routing agent.
  693. subsection{Revised format for wireless traces}
  694. label{sec:revtraceformat}
  695. In an effort to merge wireless trace, using cmu-trace objects, with
  696. ns tracing, a new, inproved trace format has been introduced. This revised
  697. trace support is backwards compatible with the old trace formatting and
  698. can be enabled by the following command:
  699. begin{program}
  700. $ns use-newtrace
  701. end{program}
  702. This command should be called before the universal trace command
  703. code{$ns trace-all <trace-fd>}. Primitive code{use-newtrace} sets up new
  704. format for wireless tracing by setting a simulator variable called
  705. code{newTraceFormat}. Currently this new trace support is available for
  706. wireless simulations only and shall be extended to rest of ns in the near
  707. future.
  708. An example of the new trace format is shown below:
  709. begin{program}
  710. s -t 0.267662078 -Hs 0 -Hd -1 -Ni 0 -Nx 5.00 -Ny 2.00 -Nz 0.00 -Ne
  711. -1.000000 -Nl RTR -Nw --- -Ma 0 -Md 0 -Ms 0 -Mt 0 -Is 0.255 -Id -1.255 -It
  712. message -Il 32 -If 0 -Ii 0 -Iv 32
  713. s -t 1.511681090 -Hs 1 -Hd -1 -Ni 1 -Nx 390.00 -Ny 385.00 -Nz 0.00 -Ne
  714. -1.000000 -Nl RTR -Nw --- -Ma 0 -Md 0 -Ms 0 -Mt 0 -Is 1.255 -Id -1.255 -It
  715. message -Il 32 -If 0 -Ii 1 -Iv 32
  716. s -t 10.000000000 -Hs 0 -Hd -2 -Ni 0 -Nx 5.00 -Ny 2.00 -Nz 0.00 -Ne
  717. -1.000000 -Nl AGT -Nw --- -Ma 0 -Md 0 -Ms 0 -Mt 0 -Is 0.0 -Id 1.0 -It tcp -Il 1000 -If
  718. 2 -Ii 2 -Iv 32 -Pn tcp -Ps 0 -Pa 0 -Pf 0 -Po 0
  719. r -t 10.000000000 -Hs 0 -Hd -2 -Ni 0 -Nx 5.00 -Ny 2.00 -Nz 0.00 -Ne
  720. -1.000000 -Nl RTR -Nw --- -Ma 0 -Md 0 -Ms 0 -Mt 0 -Is 0.0 -Id 1.0 -It tcp -Il 1000 -If
  721. 2 -Ii 2 -Iv 32 -Pn tcp -Ps 0 -Pa 0 -Pf 0 -Po 0
  722. r -t 100.004776054 -Hs 1 -Hd 1 -Ni 1 -Nx 25.05 -Ny 20.05 -Nz 0.00 -Ne
  723. -1.000000 -Nl AGT -Nw --- -Ma a2 -Md 1 -Ms 0 -Mt 800 -Is 0.0 -Id 1.0 -It
  724. tcp -Il 1020 -If 2 -Ii 21 -Iv 32 -Pn tcp -Ps 0 -Pa 0 -Pf 1 -Po 0
  725. s -t 100.004776054 -Hs 1 -Hd -2 -Ni 1 -Nx 25.05 -Ny 20.05 -Nz 0.00 -Ne
  726. -1.000000 -Nl AGT -Nw --- -Ma 0 -Md 0 -Ms 0 -Mt 0 -Is 1.0 -Id 0.0 -It ack -Il 40
  727. -If 2 -Ii 22 -Iv 32 -Pn tcp -Ps 0 -Pa 0 -Pf 0 -Po 0 
  728. end{program}
  729. subsubsection{Explanation of new trace format}
  730. The new trace format as seen above can be can be divided into the
  731. following fields :
  732. begin{description}
  733. item[Event type]
  734. In the traces above, the first field (as in the older trace format)
  735. describes the type of event taking place at the node and can be one of the 
  736. four types:
  737. begin{description}
  738. item[s] send 
  739. item[r] receive 
  740. item[d] drop 
  741. item[f] forward
  742. end{description}
  743. item[General tag]
  744. The second field starting with "-t" may stand for time or global setting
  745. begin{description}
  746. item[-t] time
  747. item[-t] * (global setting)
  748. end{description}
  749. item[Node property tags]
  750. This field denotes the node properties like node-id, the level at
  751. which tracing is being done like agent, router or MAC. The tags start
  752. with a leading "-N" and are listed as below:
  753. begin{description}
  754. item[-Ni:] node id
  755. item[-Nx:] node's x-coordinate
  756. item[-Ny:] node's y-coordinate
  757. item[-Nz:] node's z-coordinate
  758. item[-Ne:] node energy level
  759. item[-Nl:] trace level, such as AGT, RTR, MAC
  760. item[-Nw:] reason for the event. The different reasons for dropping a
  761. packet are given below:
  762. begin{description}
  763. item["END"] DROP_END_OF_SIMULATION          
  764. item["COL"] DROP_MAC_COLLISION              
  765. item["DUP"] DROP_MAC_DUPLICATE 
  766. item["ERR"] DROP_MAC_PACKET_ERROR  
  767. item["RET"] DROP_MAC_RETRY_COUNT_EXCEEDED
  768. item["STA"] DROP_MAC_INVALID_STATE      
  769. item["BSY"] DROP_MAC_BUSY                 
  770. item["NRTE"] DROP_RTR_NO_ROUTE i.e no route is available.
  771. item["LOOP"] DROP_RTR_ROUTE_LOOP i.e there is a routing loop
  772. item["TTL"]  DROP_RTR_TTL i.e TTL has reached zero.
  773. item["TOUT"] DROP_RTR_QTIMEOUT i.e packet has expired.
  774. item["CBK"]  DROP_RTR_MAC_CALLBACK
  775. item["IFQ"]  DROP_IFQ_QFULL i.e no buffer space in IFQ.
  776. item["ARP"]  DROP_IFQ_ARP_FULL i.e dropped by ARP
  777. item["OUT"]  DROP_OUTSIDE_SUBNET i.e dropped by base stations on
  778. receiving routing updates from nodes outside its domain.
  779. end{description}
  780. end{description}
  781. item[Packet information at IP level]
  782. The tags for this field start with a leading "-I" and are listed along
  783. with their explanations as following:
  784. begin{description}
  785. item[-Is:] source address.source port number
  786. item[-Id:] dest address.dest port number
  787. item[-It:] packet type
  788. item[-Il:] packet size
  789. item[-If:] flow id
  790. item[-Ii:] unique id
  791. item[-Iv:] ttl value  
  792. end{description}
  793. item[Next hop info]
  794. This field provides next hop info and the tag starts with a leading "-H".
  795. begin{description}
  796. item[-Hs:] id for this node
  797. item[-Hd:] id for next hop towards the destination.
  798. end{description}
  799. item[Packet info at MAC level]
  800. This field gives MAC layer information and starts with a leading "-M" as
  801. shown below:
  802. begin{description}
  803. item[-Ma:] duration
  804. item[-Md:] dst's ethernet address
  805. item[-Ms:] src's ethernet address
  806. item[-Mt:] ethernet type  
  807. end{description}     
  808. item[Packet info at "Application level"]
  809. The packet information at application level consists of the type of
  810. application like ARP, TCP, the type of adhoc routing protocol like
  811. DSDV, DSR, AODV etc being traced. This field consists of a leading "-P"
  812. and list of tags for different application is listed as below:
  813. begin{description}
  814. item[-P arp] Address Resolution Protocol. Details for ARP is given by the
  815. following tags:
  816. begin{description}
  817. item[-Po:] ARP Request/Reply
  818. item[-Pm:] src mac address
  819. item[-Ps:] src address
  820. item[-Pa:] dst mac address
  821. item[-Pd:] dst address
  822. end{description}
  823. item[-P dsr] This denotes the adhoc routing protocol called Dynamic
  824. source routing. Information on DSR is represented by the following tags:
  825. begin{description}
  826. item[-Pn:] how many nodes traversed
  827. item[-Pq:] routing request flag
  828. item[-Pi:] route request sequence number
  829. item[-Pp:] routing reply flag
  830. item[-Pl:] reply length
  831. item[-Pe:] src of srcrouting->dst of the source routing
  832. item[-Pw:] error report flag ?
  833. item[-Pm:] number of errors
  834. item[-Pc:] report to whom
  835. item[-Pb:] link error from linka->linkb
  836. end{description}
  837. item[-P cbr] Constant bit rate. Information about the CBR application is
  838. represented by the following tags:
  839. begin{description}
  840. item[-Pi:] sequence number
  841. item[-Pf:] how many times this pkt was forwarded
  842. item[-Po:] optimal number of forwards 
  843. end{description}
  844. item[-P tcp] Information about TCP flow is given by the following
  845. subtags:
  846. begin{description}
  847. item[-Ps:] seq number
  848. item[-Pa:] ack number
  849. item[-Pf:] how many times this pkt was forwarded
  850. item[-Po:] optimal number of forwards 
  851. end{description}
  852. end{description}
  853. This field is still under development and new tags shall be added for
  854. other applications as they get included along the way.
  855. end{description}
  856. subsection{Generation of node-movement and traffic-connection for
  857.   wireless scenarios}
  858. label{sec:mobile-scen-generator}
  859. Normally for large topologies, the node movement and traffic connection
  860. patterns are defined in separate files for convinience. These movement and
  861. traffic files may be generated using CMU's movement- and
  862. connection-generators. In this section we shall describe both separately.
  863. subsubsection{MobileNode Movement}
  864. label{sec:mobile-movement-file}
  865. Some examples of node movement files may be found in
  866. nsf{tcl/mobility/scene/scen-670x670-50-600-20-*}. These files
  867. define a topology of 670 by 670m where 50 nodes move with a speed of 20m/s
  868. with pause time of 600s. each node is assigned a starting position. The
  869. information regarding number of hops between the nodes is fed to the
  870. central object "GOD" (XXX but why/where is this information used??-answer
  871. awaited from CMU.) Next each node is a speed and a direction to move to. 
  872. The generator for creating node movement files are to be found under
  873. nsf{indep-utils/cmu-scen-gen/setdest/} directory. Compile the files
  874. under setdest to create an executable. run setdest with arguments in
  875. the following way:
  876. begin{program}
  877. ./setdest -n <num_of_nodes> -p <pausetime> -s <maxspeed> -t <simtime>
  878.           -x <maxx> -y <maxy> > <outdir>/<scenario-file>
  879. end{program}
  880. Note that the index used for nodes now start from 0 instead of 1 as
  881. was in the original CMU version, to match with ns's tradition of
  882. assigning node indices from 0.
  883. subsubsection{Generating traffic pattern files}
  884. label{sec:mobile-traffic-file}
  885. The examples for traffic patterns may be found in
  886. nsf{tcl/mobility/scene/cbr-50-{10-4-512, 20-4-512}}.
  887. The traffic generator is located under nsf{indep-utils/cmu-scen-gen/}
  888. and are called cbrgen.tcl and tcpgen.tcl. They may be used for
  889. generating CBR and TCP connections respectively.
  890. To create CBR connecions, run
  891. begin{program}
  892. ns cbrgen.tcl [-type cbr|tcp] [-nn nodes] [-seed seed] 
  893.               [-mc connections] [-rate rate]
  894. end{program}
  895. To create TCP connections, run
  896. begin{program}
  897. ns tcpgen.tcl [-nn nodes] [-seed seed]
  898. end{program}
  899. You will need to pipe the outputs from above to a cbr-* or a tcp-* file.
  900. section{Extensions made to CMU's wireless model}
  901. label{sec:wireless-extensions}
  902. As mentioned earlier, the original CMU wireless model allows
  903. simulation of wireless LANs and ad-hoc networks. However in order to
  904. use the wireless model for simulations using both wired and wireless
  905. nodes we had to add certain extensions to cmu model. We 
  906. call this wired-cum-wireless feature. Also SUN's MobileIP (implemented
  907. for wired nodes) was integrated into the wireless model allowing
  908. mobileIP to run over wireless mobilenodes. The following two
  909. subsections describe these two extensions to the wireless 
  910. model in ns. 
  911. subsection{wired-cum-wireless scenarios}
  912. label{sec:wired-cum-wireless}
  913. The mobilenodes described so far mainly supports simulation of
  914. multi-hop ad-hoc networks or wireless LANs. But what if we need to
  915. simulate a topology of multiple wireless LANs connected through wired
  916. nodes, or may need to run mobileIP on top of these wireless nodes? The
  917. extensions made to the CMU wireless model allows us to do that. 
  918. The main problem facing the wired-cum-wireless scenario was the issue
  919. of routing. In ns, routing information is generated based on the
  920. connectivity of the topology, i.e how nodes are connected to one
  921. another through code{Links}. Mobilenodes on the other hand have no
  922. concept of links. They route packets among themselves, within the
  923. wireless topology, using their routing protocol. so how would packets
  924. be exchanged between these two types of nodes? 
  925. So a node called code{BaseStationNode} is created which plays the
  926. role of a gateway for the wired and wireless domains. The
  927. code{BaseStationNode} is essentially a hybrid between a Hierarchical
  928. nodefootnote{Refer to Chapter~ref{chap:hier-rtg} for details on
  929.   hierarchical routing and internals of code{HierNode}.}
  930. (code{HierNode}) and a code{MobileNode}. The basestation node is
  931. responsible for delivering packets into and out of the wireless
  932. domain. In order to achieve this we need Hierarchical routing. 
  933. Each wireless domain along with its base-station would have an unique
  934. domain address assigned to them. All packets destined to a wireless
  935. node would reach the base-station attached to the domain of that
  936. wireless node, who would eventually hand the packet
  937. over to the destination (mobilenode). And mobilenodes route packets,
  938. destined to outside their (wireless) domain, to their base-station
  939. node. The base-station knows how to forward these packets towards the
  940. (wired) destination.
  941. begin{figure}
  942.     centerline{includegraphics{basestation}}
  943.     caption{Schematic of a baseStationNode}
  944.     label{fig:mobilenode-basestation}
  945. end{figure}
  946. The schematic of a code{BaseStationNode} is shown in
  947. Figure~ref{fig:mobilenode-basestation}.
  948. The mobilenodes in wired-cum-wireless scenario are required to support
  949. hierarchical addressing/routing. Thus the code{MobileNode} looks
  950. exactly like the code{BaseStationNode}. The SRNode, however, simply
  951. needs to have its own hier-address since it does not require any
  952. address demuxes and thus is not required to support hier
  953. routingfootnote{In order to do away with all these different
  954.   variations of the definition of a node, we are planning to revise
  955.   the node architecture that would allow a more flexible
  956.   and modularised construction of a node without the necessity of having
  957.   to define and be limited to certain Class definitions only.}.
  958. The DSDV agent on having to forward a packet checks to see if the
  959. destination is outside its (wireless) subnet. If so, it tries to
  960. forward the packet to its base-station node. In case no route to
  961. base-station is found the packet is dropped. Otherwise the
  962. packet is forwarded to the next_hop towards the base-station. Which
  963. is then routed towards the wired network by base-station's
  964. classifiers.
  965. The DSR agent, on receiving a pkt destined outside its subnet, sends
  966. out a route-query for its base-station in case the route to
  967. base-station is not known. The data pkt is temporarily cached while it
  968. waits to hear route replies from base-station. On getting a reply the
  969. packet is provided with routing information in its header and send
  970. away towards the base-station. The base-station address demuxes routes
  971. it correctly toward the wired network.
  972. The example script for a wired-cum-wireless simulation can be found at
  973. nsf{tcl/ex/wired-cum-wireless-sim.tcl}. The methods for
  974. wired-cum-wireless implementations are defined in
  975. nsf{tcl/lib/ns-bsnode.tcl}, nsf{tcl/mobility/{com.tcl,dsr.tcl,
  976.   dsdv.tcl}}, nsf{dsdv/dsdv.{cc,h}} and
  977. nsf{dsr/dsragent.{cc,h}}.
  978. subsection{MobileIP}
  979. label{sec:mobileip}
  980. The wired-cum-wireless extensions for the wireless model paved the
  981. path for supporting wireless MobileIP in ns. Sun Microsystem's
  982. (Charlie Perkins {em et al}) MobileIP model was based on ns's wired model
  983. (consisting of code{Node}'s and code{Link}'s) and thus didnot use
  984. CMU's mobility model.
  985. Here we briefly describe the wireless MobileIP implementation. We hope
  986. that Sun would provide the detailed version of the documentation in
  987. the future.
  988. The mobileIP scenario consists of Home-Agents(HA) and
  989. Foreign-Agents(FA) and have Mobile-Hosts(MH) moving between their HA
  990. and FAs.
  991. The HA and FA are essentially base-station nodes we have described
  992. earlier. While MHs are basically the mobileNodes described in
  993. section~ref{sec:mobilenode-creation}.
  994. The methods and procedures for MobileIP extensions are described in
  995. nsf{mip.{cc,h}}, nsf{mip-reg.cc}, nsf{tcl/lib/ns-mip.tcl} and
  996. nsf{tcl/lib/ns-wireless-mip.tcl}.
  997. begin{figure}
  998.     centerline{includegraphics{wireless-mip}}
  999.     caption{Schematic of a Wireless MobileIP BaseStation Node}
  1000.     label{fig:mobilenode-wireless-mip}
  1001. end{figure}
  1002. The HA and FA nodes are defined as code{MobileNode/MIPBS} having a
  1003. registering agent (regagent_) that sends beacon out to the
  1004. mobilenodes, sets up encapsulator and decapsulator, as required and
  1005. replies to solicitations from MHs. 
  1006. The MH nodes are defined as code{MobileNode/MIPMH} which too have a
  1007. regagent_ that receives and responds to beacons and sends out
  1008. solicitations to HA or FAs. Figure~ref{fig:mobilenode-wireless-mip}
  1009. illustrates the schematic of a code{MobileNode/MIPBS} 
  1010. node. The code{MobileNode/MIPMH} node is very similar to this except
  1011. for the fact that it doesnot have any encapsulator or decapsulator. As
  1012. for the SRNode version of a MH, it doesnot have the hierarchical
  1013. classifiers and the RA agent forms the entry point of the node. See
  1014. Figure~ref{fig:mobilenode-dsr} for model of a SRNode. 
  1015. The code{MobileNode/MIPBS} node routinely broadcasts beacon or
  1016. advertisement messages out to MHs. A solicitation from a mobilenode
  1017. generates an ad that is send directly to the requesting MH. The
  1018. address of the base-station sending out beacon is heard by 
  1019. MH and is used as the COA (care-of-address) of the MH. Thus as the MH
  1020. moves from its native to foreign domains, its COA changes. 
  1021. Upon receiving  reg_request (as reply to ads) from a mobilehost the
  1022. base-station checks to see if it is the HA for the MH. If not, it sets
  1023. up its decapsulator and forwards the reg_request towards the HA of
  1024. the MH. 
  1025. In case the base-station {em is} the HA for the requesting MH but the
  1026. COA doesnot match its own, it sets up an encapsulator and sends
  1027. reg-request-reply back to the COA (address of the FA) who has
  1028. forwarded the reg_request to it. so now all packets destined to the
  1029. MH reaching the HA would be tunneled through the encapsulator which
  1030. encapsulates the IP pkthdr with a IPinIP hdr, now destined to the COA
  1031. instead of MH. The FA's decapsulator recives this packet, removes the
  1032. encapsulation and sends it to the MH.
  1033. If the COA matches that of the HA, it just removes the encapsulator it
  1034. might have set up (when its mobilehost was roaming into foreign
  1035. networks) and sends the reply directly back to the MH, as the MH have
  1036. now returned to its native domain.
  1037. The mobilehost sends out solicitations if it doesnot hear any ads from the
  1038. base-stations. Upon receiving ads, it changes its COA to the address of
  1039. the HA/FA it has heard the ad from, and replies back to the COA with a
  1040. request for registration (code{reg-request}).
  1041. Initially the MH maybe in the range of the HA and receives all pkts
  1042. directly from its COA which is HA in this case. 
  1043. Eventually as the MH moves out of range of its HA and into the a foreign
  1044. domain of a FA, the MH's COA changes from its HA to that of the FA. The HA
  1045. now sets up an encapsulator and tunnels all pkts destined for MH towards
  1046. the FA. The FA decapsulates the pkts and hands them over to the MH. The
  1047. data from MH destined for the wired world is always routed towards its
  1048. current COA.  
  1049. An example script for wireless mobileIP can be found at
  1050. nsf{tcl/ex/wireless-mip-test.tcl}. The simulation consists of a MH moving
  1051. between its HA and a FA. The HA and FA are each connected to a wired
  1052. domain on one side and to their wireless domains on the other. TCP flows
  1053. are set up between the MH and a wired node. 
  1054. section{802.11 MAC protocol}
  1055. label{sec:802_11}
  1056. Prior to release ns-2.33, there was only one main-tree 802.11 model,
  1057. although other researchers were maintaining third-party patches
  1058. on the web.  Starting with ns-2.33, there are multiple choices in
  1059. the main distribution.
  1060. The first extension described below (infrastructure mode) extends
  1061. the legacy model to include infrastructure mode.  However, the last
  1062. two items (802.11Ext and dei802mr) are complete replacements for the
  1063. legacy model.
  1064. Therefore, researchers now have a choice of 802.11 models, and
  1065. should carefully read the documentation and code of each one to
  1066. understand which is the best fit for the job. 
  1067. begin{description}
  1068. item[{bf 802.11 DCF from CMU}] 
  1069.   This model has been the only model available in the main ns source
  1070.   tree prior to release ns-2.33.  See nsf{mac-802_11.{cc,h}} for 
  1071.   implementation details.  It uses a 
  1072.   RTS/CTS/DATA/ACK pattern for all unicast packets and simply sends out
  1073.   DATA for all broadcast packets. The implementation uses both 
  1074.   physical and virtual carrier sense. The
  1075.   clsref{Mac802_11}{../ns-2/mac-802_11.h} is implemented in
  1076.   nsf{mac-802_11.{cc,h}}.
  1077. item[{bf 802.11 infrastructure extensions}] 
  1078.   Ilango Purushothaman from the University of Washington has implemented
  1079.   infrastructure extensions to the above 802.11 model, and fixed some bugs
  1080.   along the way.  The extensions include passive and active scanning,
  1081.   authentication, association, inter-AP communications, and mobility
  1082.   support (handoff).  Please note that this model still supports
  1083.   single-channel scenarios only. 
  1084. begin{itemize}
  1085. item {bf Documentation:} http://ee.washington.edu/research/funlab/802_11/report_80211_IM.pdf
  1086. item {bf Example script:} tcl/ex/infra.tcl 
  1087. item {bf Test suite:} tcl/test/test-suite-wireless-infra-mobility.tcl tcl/test/test-suite-wireless-infra.tcl
  1088. end{itemize}
  1089. item[{bf 802.11Ext}]  
  1090.   A team from Mercedes-Benz Research and Development North America and
  1091.   from University of Karlsruhe have collaborated to develop a completely
  1092.   new 802.11 Mac and Phy model, called Mac802_11Ext and WirelessPhyExt,
  1093.   respectively.  The new model contains the following features:
  1094. begin{itemize}
  1095. item Structured design of MAC functionality modules:  transmission, 
  1096. reception, transmission coordination, reception coordination, backoff
  1097. manager, and channel state monitor
  1098. item Cumulative SINR computation
  1099. item MAC frame capture capabbilities
  1100. item Multiple modulation scheme support
  1101. item Packet drop tracing at the PHY layer
  1102. item Nakagami fading model
  1103. end{itemize}
  1104. This model should be used as a replacement for the existing models.  The
  1105. example scripts show how to do this.
  1106. begin{itemize}
  1107. item {bf Key files:}  apps/pbc.{cc,h}, mac/mac-802_11Ext.{cc,h}, mac/wireless-phyExt.{cc,h}, mobile/nakagami.{cc,h}
  1108. item {bf Documentation:}  http://dsn.tm.uni-karlsruhe.de/Overhaul_NS-2.php
  1109. item {bf Example scripts:}  tcl/ex/802.11/ directory:  IEEE802-11a.tcl IEEE802-11p.tcl broadcast_validation.tcl unicast_validation.tcl
  1110. item {bf Test suite:}  tcl/test/test-suite-wireless-lan-newnode-80211Ext.tcl
  1111. end{itemize}
  1112. item[{bf dei80211mr}]
  1113. The dei80211mr library - nicknamed 'multirate' for short - provides an 
  1114. 802.11 derived from the CMU implementation.
  1115. This library depends on the Dynamic Library (Chapter ref{chap:dynlib}) and
  1116. is included in the ns-allinone distribution only (see the 
  1117. top-level dei80211mr directory in the ns-allinone distribution or
  1118. see http://www.dei.unipd.it/wdyn/?IDsezione=5091).
  1119. For step-by-step installation instructions, please refer to the tutorial at
  1120. http://www.dei.unipd.it/%7Ebaldo/nsmiracle-dei80211mr-howto.html
  1121. The following functionalities are provided by the dei80211mr library:
  1122. begin{itemize}
  1123. item support for multiple PHY modes is included; in particolar, dei80211mr simulation of the different transmission rates, modulation and coding schemes defined in the IEEE802.11b/g standards.
  1124. item a SINR-based packet level error model is introduced:
  1125. begin{itemize}
  1126.           item the RX Threshold variable which was used in the 802.11 implementation included in standard NS to determine successful receptions has been removed. Instead, Packet Error Rate (PER) is used to determine random packet losses.
  1127.           item PER is calculated using pre-determined curves (PER vs SINR and packet size); the curves can be specified by the user via TCL. Some default curves for both 802.11g and 802.11b are provided.
  1128.           item SINR is calculated using received signal strength, noise and interference
  1129.           item interference is calculated using a gaussian model to account for all transmissions which happen simultaneously to the one which is considered for reception
  1130.           item noise power is set via TCL
  1131. end{itemize}
  1132.     item the capture model, i.e. the determination of whether a packet can be received when there are other concurrent transmissions are simultaneously ogoing, is now embedded in the above mentioned interference model (no more Capture Threshold)
  1133.     item In the wireless channel, the affected nodes distance is no more determined using the CS threshold, but we used a fixed value in meters 
  1134. which can be set at the beginning of the simulation. The reason is that, since we use a gaussian interference model, nodes well below the CS threshold often still provide a non-negligible contribution to interference. The default value for the affected nodes distance 
  1135. is very conservative, so that all nodes are considered for interference calculation. This default value therefore yields accurate but computationally intensive simulations. The value can be adjusted via TCL to achieve different trade-offs between computational load and simulation accuracy.
  1136. end{itemize}
  1137. begin{itemize}
  1138. item {bf Documentation:} 
  1139. http://www.dei.unipd.it/%7Ebaldo/nsmiracle-dei80211mr-howto.html
  1140. item {bf Example script:} dei80211mr-1.1.4/samples/adhoc_tcp.tcl
  1141. item {bf Test suite:} None
  1142. end{itemize}
  1143. end{description}
  1144.   
  1145. In addition, a  patch (relating to the CMU implementation) improving ns-2 
  1146. 802.11 wireless support is available at http://www.telematica.polito.it/fiore/.
  1147. The patch introduces realistic channel propagation, concurrent multiple 
  1148. data transmission rates among stations and ARF mechanisms, has been 
  1149. tested with ns-2.29, and features the following contributions:
  1150. begin{itemize}
  1151. item channel propagation improvements by Wu Xiuchao
  1152. item ricean propagation model by Ratish J. Punnoose
  1153. item SNOOPy calendar scheduler by David X. Wei
  1154. item 802.11 bug fixes by Felix Schmidt-Eisenlohr
  1155. item multiple data transmission rates support by Marco Fiore
  1156. item Adaptive Auto Rate Fallback (AARF) by Marco Fiore. 
  1157. end{itemize}
  1158. section{Lists of changes for merging code developed in older version of ns (2.1b5 or later) into the current version (2.1b8) }
  1159. label{old-merge}
  1160. The CMU-wireless model developed by David Johnhson's Monarch project was merged into ns around 1998-99 in what was then the ns-2.1b5 version. Since then the ns versions used by Monarch and by us here at ISI have forked quite a bit. Recently we ported a newer version of DSR developed by the Monarch group back into ns and in the process have created a list of changes that were required to be made for the merge. Hopefully this list will be helpful for those who have been working on older versions of ns from around that time or or later, to have their stuff merged in to the current version of ns-2.1b8. 
  1161. The following lists of changes are required for merging the cmu version of ns (2.1b5) in to current version of 2.1b8. Each change is followed by a brief explanation for why the change was made.
  1162. begin{flushleft}
  1163. Methods for accessing pkt hdrs have changed from \
  1164. code{(hdr_sr *)p->access(off_sr) } \
  1165. to a static access method defined for each hdr, as \
  1166. code{hdr_sr::access(p)} \
  1167. where for class hdr_sr a static method code{access()} is defined as
  1168. begin{program}
  1169.  inline static hdr_sr* access(const Packet* p) {
  1170.  return (hdr_sr*)p->access(offset_); 
  1171.  }
  1172. end{program}
  1173. code{why:} This change avoids using casts everywhere.
  1174. As the method for accessing hdrs have changed, there is no need to explicitly bind the hdr offset values. This is now done while establishing tcl linkage for the individual hdr classes.
  1175. so lines like \
  1176. code{bind("off_SR_", &off_sr_);}\
  1177.   code{bind("off_ll_", &off_ll_);}\
  1178.   code{bind("off_mac_", &off_mac_);}\
  1179.   code{bind("off_ip_", &off_ip_); }\
  1180. should be removed.
  1181. AF_ enumerations replaced by NS_AF_ as in \
  1182. code{enum ns_af_enum { NS_AF_NONE, NS_AF_ILINK, NS_AF_INET };}\
  1183. code{why:} This avoids header clashes between ns and the OS.
  1184. The ip hdr (dst/src) address fields that used be integers are now defined as structures called ns_addr_t. ns_addr_t has 2 members address_ and port_ that are both defined as int. 
  1185. Hence lines like \
  1186. code{iph->src()} should change to\
  1187. code{iph->saddr() & iph->sport();} \
  1188. Also lines like \
  1189. code{dst_ = (IP_BROADCAST << 8) | RT_PORT } \
  1190. should be replaced by \
  1191. code{ dst_.addr_ = IP_BROADCAST;} \
  1192. code{dst_.port_ = RT_PORT;} \
  1193. code{Why:} This extension supports 32bit addressing.
  1194. The addrs_ member for hdr_sr class has a separate function for returning its value . Thus need to call code{hsr.addrs()} instead of hsr.addrs.\
  1195. code{why:} addrs_ is now a private variable which is accessed by public function code{addrs()}.
  1196. All includes that had absolute paths by using code{<>} were replaced by code{""}. Thus\
  1197. code{<cmu/dsr/dsragent.h>}\
  1198. was changed to\
  1199. code{"cmu/dsr/dsragent.h"}
  1200. The tcl command "ip-addr" was changed to "addr".\
  1201. Other new tcl commands like "node", "port-dmux" and "trace-target" were added.\
  1202. code{why:}  Part of support for mobileIP and wired-cum-wireless simulations.
  1203. Need to convert address in string format into int format; 
  1204. so use\
  1205. code{Address::instance().str2addr(argv[2]) }\
  1206. instead of \
  1207. code{atoi(argv[2])}\
  1208. code{why:} This is required for supporting hier-addressing/routing.
  1209. The array code{packet_names[]} has changed to code{packet_info.name()}\
  1210. code{why:} In order to remove a bunch of code{#}defines for pkt types, an enumeration called packet_t now describes all packet types in ns. class p_info was created that now describes an array name_ that has replaced packet_names array used previously.
  1211. Have to explicitly set direction of new pkts to DOWN before sending them down to the LL.\
  1212. code{why:} A variable direction_ in hdr_cmn is now used. This is used in the lower layers like LL, mac, phy etc to determine the direction of the pkt flow. All incoming pkts are marked as UP by channel, which should be remarked as DOWN by agents before sending them out into the network again.
  1213. Instead of code{logtarget->buffer}, should now call code{logtarget->pt_->buffer}.\
  1214. code{why:} This change reflects support for eventtracing. 
  1215. Tracing has evolved into two types, packet tracing and event tracing.
  1216. Class Trace essentially supports packet tracing. 
  1217. However in addition to the basic tracing properties that it derives from a BaseTrace class, pkt-tracing also requires to inherit some of the Connector class properties as well. Hence pt_, a basetrace object represents the pure tracing functionalities required for a trace object.
  1218. The parameter used to describe the reason a pkt was dropped used to be an integer. This was changed to code{char*}. Hence needed to define different pkt-drop reasons in string formats. \
  1219. code{Why:} Allows greater expandibility and flexibility.
  1220. linkHead changed to dsrLinkHead.\
  1221. code{why:} name clashed with linkHead used elsewhere in ns.
  1222. The older cmu model used an incoming_ flag added in all pkts to figure out direction of pkt flow in the lower layers like ll, mac etc. Later this was replaced by a variable called direction_ added in cmn_hdr. direction value can be set to UP, DOWN or NONE. all pkts created with a DOWN dir by default. \
  1223. code{why:} Both these flags were being used which is not really reqd. so incoming_ flag has been replaced with direction_.
  1224. end{flushleft}
  1225. section{Commands at a glance}
  1226. label{sec:wirelesscommand}
  1227. Following is a list of commands used in wireless simulations:
  1228. begin{program}
  1229. $ns_ node-config -addressingType <usually flat or hierarchical used for 
  1230.                                    wireless topologies>
  1231.                  -adhocRouting   <adhoc rotuing protocol like DSDV, DSR,
  1232.                                    TORA, AODV etc>
  1233.                  -llType         <LinkLayer>
  1234.                  -macType        <MAC type like Mac/802_11>
  1235.                  -propType       <Propagation model like
  1236.                                    Propagation/TwoRayGround>
  1237.                  -ifqType        <interface queue type like
  1238.                                    Queue/DropTail/PriQueue>
  1239.                  -ifqLen         <interface queue length like 50>
  1240.                  -phyType        <network inteface type like
  1241.                                    Phy/WirelessPhy>
  1242.                  -antType        <antenna type like Antenna/OmniAntenna>
  1243.                  -channelType    <Channel type like Channel/WirelessChannel>
  1244.                  -topoInstance   <the topography instance>
  1245.                  -wiredRouting   <turning wired routing ON or OFF>
  1246.                  -mobileIP       <setting the flag for mobileIP ON or OFF>
  1247.                  -energyModel    <EnergyModel type>
  1248.                  -initialEnergy  <specified in Joules>
  1249.                  -rxPower        <specified in W>
  1250.                  -txPower        <specified in W>
  1251.                  -agentTrace     <tracing at agent level turned ON or OFF>
  1252.                  -routerTrace    <tracing at router level turned ON or OFF>
  1253.                  -macTrace       <tracing at mac level turned ON or OFF>
  1254.                  -movementTrace  <mobilenode movement logging turned
  1255.                                    ON or OFF>
  1256. end{program}
  1257. This command is used typically to configure for a mobilenode. For more info
  1258. about this command (part of new node APIs) see chapter titled "Restructuring
  1259. ns node and new Node APIs" in ns Notes and Documentation.
  1260. begin{flushleft}
  1261. code{$ns_ node <optional:hier address>}\
  1262. This command is used to create a mobilenode after node configuration is done
  1263. as shown in the node-config command. Incase hierarchical addressing is being
  1264. used, the hier address of the node needs to be passed as well.
  1265. code{$node log-movement}\
  1266. This command previously used to enable logging of mobilenode's movement has now
  1267. been replaced by code{$ns_ node-config -movementTrace <ON or OFF>}.
  1268. code{create-god <num_nodes>}\
  1269. This command is used to create a God instance. The number of mobilenodes
  1270. is passed as argument which is used by God to create a matrix to store
  1271. connectivity information of the topology.
  1272. code{$topo load_flatgrid <X> <Y> <optional:res>}\
  1273. This initializes the grid for the topography object. <X> and <Y> are the x-y
  1274. co-ordinates for the topology and are used for sizing the grid. The grid
  1275. resolution may be passed as <res>. A default value of 1 is normally used.
  1276. code{$topo load_demfile <file-descrptor>}\
  1277. For loading DEMFile objects into topography. See ns/dem.{cc,.h} for details on
  1278. DEMFiles.
  1279. code{$ns_ namtrace-all-wireless <namtrace> <X> <Y>}\
  1280. This command is used to initialize a namtrace file for logging node movements
  1281. to be viewed in nam. The namtrace file descriptor, the X and Y 
  1282. co-ordinates of the wireless topology is passed as parameters with
  1283. this command.
  1284. code{$ns_ nam-end-wireless <stop-time>}\
  1285. This command is used to tell nam the simulation stop time given by <stop-time>.
  1286. code{$ns_ initial_node_pos <node> <size>}\
  1287. This command defines the node initial position in nam. <size> denotes the size
  1288. of node in nam. This function must be called after mobility model has been
  1289. defined.
  1290. code{$mobilenode random-motion <0 or 1>}\
  1291. Random-motion is used to turn on random movements for the mobilenode, in which
  1292. case random destinations are assigned to the node. 0 disables and 1 enables
  1293. random-motion.
  1294. code{$mobilenode setdest <X> <Y> <s>}\
  1295. This command is used to setup a destination for the mobilenode. The mobile
  1296. node starts moving towards destination given by <X> and <Y> at a speed of
  1297. <s> m/s.
  1298. code{$mobilenode reset}\
  1299. This command is used to reset all the objects in the nodes (network 
  1300. components like LL, MAC, phy etc).
  1301. Internal procedures\
  1302. Following is a list of internal procedures used in wireless networking:
  1303. code{$mobilenode base-station <BSnode-hier-addr>}\
  1304. This is used for wired-cum-wireless scenarios. Here the mobilenode is provided
  1305. with the base-stationnode info for its domain. The address is hierarchical
  1306. since wired-cum-wireless scenarios typically use hierarchical addressing.
  1307. code{$mobilenode log-target  <target-object>}\
  1308. The <target-object>, which is normally a trace object, is used to log
  1309. mobilenode movements and their energy usage, if energy model is provided.
  1310. code{$mobilenode topography <topoinstance>}\
  1311. This command is used to provide the node with a handle to the topography
  1312. object.
  1313. code{$mobilenode addif}\
  1314. A mobilenode may have more than one network interface. This command is used
  1315. to pass handle for a network interface to the node.
  1316. code{$mobilenode  namattach <namtracefd>}\
  1317. This command is used to attach the namtrace file descriptor <namtracefd>
  1318. to the mobilenode. All nam traces for the node are then written into this
  1319. namtrace file.
  1320. code{$mobilenode radius <r>}\
  1321. The radius <r> denotes the node's range. All mobilenodes that fall within
  1322. the circle of radius <r> with the node at its center are considered as
  1323. neighbours. This info is typically used by the gridkeeper.
  1324. code{$mobilenode start}\
  1325. This command is used to start off the movement of the mobilenode.
  1326. end{flushleft}
  1327. %end{document}
  1328. endinput