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

通讯编程

开发平台:

Visual C++

  1. chapter{Nodes and Packet Forwarding}
  2. label{chap:nodes}
  3. This chapter describes one aspect of creating a topology in ns,
  4. ie, creating the nodes.
  5. In 
  6. href{the next chapter}{Chapter}{chap:links},
  7. we will describe second aspect of creating the topology,
  8. ie, connecting the nodes to form links.
  9. % This chapter does not describe the detailed internal organization of
  10. % a node (although some schematics are given), nor the interaction
  11. % between a node and its routing modules; please refer to
  12. % Chapter~ref{chap:rtarch} for detailed discussion.
  13. Recall that each simulation requires a single instance of the
  14. clsref{Simulator}{../ns-2/tcl/lib/ns-lib.tcl} to control and operate
  15. that simulation. 
  16. The class provides instance procedures to create and manage the topology,
  17. and internally stores references to each element of the topology.
  18. We begin 
  19. href{by describing the procedures in the class Simulator}{%
  20.         Section}{sec:node:simulator}.
  21. We then
  22. href{describe the instance procedures in the class Node}{%
  23.         Section}{sec:node:node}
  24. to access and operate on individual nodes.
  25. We conclude
  26. href{with detailed descriptions of the Classifier}{%
  27.         Section}{sec:node:classifiers}
  28. from which the more complex node objects are formed.
  29. The procedures and functions described in this chapter can be found in
  30. nsf{tcl/lib/ns-lib.tcl}, nsf{tcl/lib/ns-node.tcl}, \
  31. nsf{tcl/lib/ns-rtmodule.tcl}, nsf{rtmodule.{cc,h}}, 
  32. nsf{classifier.{cc, h}}, nsf{classifier-addr.cc},
  33. nsf{classifier-mcast.cc}, nsf{classifier-mpath.cc}, 
  34. and, nsf{replicator.cc}.
  35. section{Node Basics}
  36. label{sec:node:simulator}
  37. The basic primitive for creating a node is
  38. begin{program}
  39.     set ns [new Simulator]
  40.     $ns fcnref{textbf{node}}{../ns-2/ns-lib.tcl}{Simulator::node}
  41. end{program} %$
  42. The instance procedure code{node} constructs
  43. a node out of more simple
  44. href{classifier objects}{Section}{sec:node:classifiers}.
  45. The Node itself is a standalone class in OTcl.
  46. However, most of the components of the node are themselves TclObjects.
  47. The typical structure of a (unicast) 
  48. node is as shown in Figure~ref{fig:node:unicast}.  This simple structure
  49. consists of two TclObjects:  an address classifer (code{classifer_}) and
  50. a port classifier (code{dmux_}).  The function of these classifiers
  51. is to distribute incoming packets to the correct agent or outgoing link.
  52. begin{figure}[tb]
  53.   centerline{includegraphics{node}}
  54.   caption{Structure of a Unicast Node.  Notice that entry_ is simply a 
  55.    label variable instead of a real object, e.g., the classifier_.}
  56.   label{fig:node:unicast}
  57. end{figure}
  58. All nodes contain at least the following components:
  59. begin{itemize}
  60. item an address or code{id_}, monotonically increasing by 1 (from 
  61. initial value 0) across the simulation namespace as nodes are created,
  62. item a list of neighbors (code{neighbor_}),
  63. item a list of agents (code{agent_}),
  64. item a node type identifier (code{nodetype_}), and
  65. item a routing module (described in Section~ref{sec:node:rtarch} below)
  66. end{itemize}
  67. % PLEASE NOTE THAT ADDRESS EXPAND COMMAND IS NOW DEPRECATED SINCE NODE AND PORT
  68. % ADDRESS SPACES WERE EXPANDED TO 32 BITS.
  69. % Before ns release 2.1b6, the address of an agent in a node is 16
  70. % bits wide: the higher 8 bits define the node code{id_},
  71. % the lower 8 bits identify the individual agent at the node.
  72. % This limits the number of nodes in a simulation to 256 nodes.
  73. % If the user needs to create a topology larger than 256 nodes,
  74. % then they should first expand the address space before creating any
  75. % nodes, as
  76. % begin{program}
  77. %         $ns set-address-format expanded
  78. % end{program} %$
  79. % This expands the address space to 30 bits, the higher 22 of which are 
  80. % used to assign node numbers.
  81. % framebox{
  82. %   begin{minipage}{textwidth}
  83. %     {bf Note}: Starting from release 2.1b6, the above is no longer
  84. %     necessary; ns uses 32-bit integers for both address and port.
  85. %     Therefore, the above restriction of 256 nodes is no longer applicable.
  86. %   end{minipage}
  87. % }
  88. By default, nodes in ns are constructed for unicast simulations.
  89. In order to enable multicast simulation, the simulation should be created 
  90. with an option ``-multicast on'', e.g.:
  91. begin{program}
  92.         set ns [new Simulator -multicast on]
  93. end{program}
  94. % {bf NOTE}: the old way of enabling multicast,
  95. %         e.g., code{Simulator set EnableMcast_ 1},
  96. %         is no longer needed.
  97. The internal structure of a typical multicast node is shown in
  98. Figure~ref{fig:node:multicast}.
  99. begin{figure}
  100.   centerline{includegraphics{mcastNode}}
  101.   caption{Internal Structure of a Multicast Node.}
  102.   label{fig:node:multicast}
  103. end{figure}
  104. When a simulation uses multicast routing,
  105. the highest bit of the address indicates whether the particular
  106. address is a multicast address or an unicast address.
  107. If the bit is 0, the address represents a unicast address,
  108. else the address represents a multicast address.
  109. % This implies that, by default, 
  110. % a multicast simulation is restricted to 128 nodes.
  111. section{Node Methods: Configuring the Node}
  112. label{sec:node:node}
  113. Procedures to configure an individual node can be classified into:
  114. begin{list}{---}{itemsep0pt}
  115. item Control functions
  116. item Address and Port number management, unicast routing functions
  117. item Agent management
  118. item Adding neighbors
  119. end{list}
  120. We describe each of the functions in the following paragraphs.
  121. paragraph{Control functions}
  122. begin{enumerate}
  123. item code{$node entry} %$
  124. returns the entry point for a node.
  125. This is the first element which will handle packets arriving at that node.
  126. The Node instance variable, code{entry_}, stores the reference this element.
  127. For unicast nodes, this is the address classifier that looks at the higher
  128. bits of the destination address.
  129. The instance variable, code{classifier_} contains the reference to this
  130. classifier.
  131. However, for multicast nodes, the entry point is the
  132. code{switch_} which looks at the first bit to decide whether
  133. it should forward the packet to the unicast classifier, or the multicast
  134. classifier as appropriate.
  135. item code{$node reset} %$
  136. will reset all agents at the node.
  137. end{enumerate}
  138. paragraph{Address and Port number management}
  139. The procedure code{$node id} %$
  140. returns the node number of the node.
  141. This number is automatically incremented and assigned to each node at
  142. creation by the class Simulator method, code{$ns node}.%$
  143. The class Simulator also stores an instance variable arrayfootnote{%
  144.   ie, an instance variable of a class that is also an array variable},
  145.   code{Node_}, indexed by the node id, and contains a reference to the
  146.   node with that id.
  147. The procedure code{$node agent tup{port}} %$
  148. returns the handle of the
  149. agent at the specified port.
  150. If no agent at the specified port number is available, the procedure returns
  151. the null string.
  152. The procedure code{alloc-port} returns the next available port number.
  153. It uses an instance variable, code{np_},
  154. to track the next unallocated port number.
  155. The procedures, code{add-route} and code{add-routes},
  156. are used by href{unicast routing}{Chapter}{chap:unicast}
  157. to add routes to populate the code{classifier_}
  158. The usage syntax is
  159. code{$node add-route tup{destination id} tup{TclObject}}. %$
  160. code{TclObject} is the entry of code{dmux_}, the port demultiplexer
  161. at the node, if the destination id is the same as this node's id,
  162. it is often the head of a link to send packets for that destination to,
  163. but could also be the the entry for other classifiers or types of classifiers.
  164. code{$node add-routes tup{destination id} tup{TclObjects}} %$
  165. is used to add multiple routes to the same destination that must be used
  166. simultaneously in round robin manner to spread the bandwidth used to reach
  167. that destination across all links equally.
  168. It is used only if the instance variable code{multiPath_} is set to 1,
  169. and detailed dynamic routing strategies are in effect,
  170. and requires the use of a multiPath classifier.
  171. We describe the implementation of the multiPath classifier
  172. href{later in this chapter}{Section}{sec:node:classifiers};
  173. however, href{we defer the discussion of multipath
  174. routing}{Chapter}{chap:unicast} to the chapter on unicast routing.
  175. The dual of proc[]{add-routes} is proc[]{delete-routes}.
  176. It takes the id, a list of code{TclObjects}, and a reference to
  177. the simulator's code{nullagent}.
  178. It removes the TclObjects in the list from the installed routes in the
  179. multipath classifier.
  180. If the route entry in the classifier does not point to a multipath
  181. classifier,
  182. the routine simply clears the entry from code{classifier_}, and
  183. installs the code{nullagent} in its place.
  184. Detailed dynamic routing also uses two additional methods:
  185. the instance procedure proc[]{init-routing} sets the instance variable
  186. code{multiPath_} to be equal to the class variable of the same name.
  187. It also adds a reference to the route controller object at that node
  188. in the instance variable, code{rtObject_}.
  189. The procedure proc[]{rtObject?} returns the handle for the route object 
  190. at the node.
  191. Finally, the procedure proc[]{intf-changed} is invoked by
  192. the network dynamics code if a link incident on the node
  193. changes state.  Additional details on how this procedure
  194. is used are discussed later
  195. href{in the chapter on network dynamics}{Chapter}{chap:net-dynamics}.
  196. paragraph{Agent management}
  197. Given an tup{agent}, the procedure proc[]{attach} will
  198. add the agent to its list of code{agents_},
  199. assign a port number the agent and set its source address,
  200. set the target of the agent to be its (ie, the node's) proc[]{entry},
  201. and add a pointer to the port demultiplexer at the node (code{dmux_})
  202. to the agent at the corresponding slot in the code{dmux_} classifier.
  203. Conversely, proc[]{detach}will remove the agent from code{agents_},
  204. and point the agent's target, and the entry in the node code{dmux_}
  205. to code{nullagent}.
  206. paragraph{Tracking Neighbors}
  207. Each node keeps a list of its adjacent neighbors in its instance variable,
  208. code{neighbor_}.  The procedure proc[]{add-neighbor} adds a neighbor to the list.  The procedure proc[]{neighbors} returns this list.
  209. section{Node Configuration Interface}
  210. label{sec:node:nodeconfig}
  211. framebox{
  212.   begin{minipage}{textwidth}
  213.     {bf NOTE}: This API, especially its internal implementation which
  214.     is messy at this point, is still a moving target. It may undergo
  215.     significant changes in the near future. However, we will do our
  216.     best to maintain the same interface as described in this chapter.
  217.     In addition, this API currently does not cover all existing nodes
  218.     in the old format, namely, nodes built using inheritance, and
  219.     parts of mobile IP. It is principally oriented towards wireless
  220.     and satellite simulation.
  221.     [Sep 15, 2000; updated June 2001].
  222.   end{minipage}
  223. }
  224. proc[]{Simulator::node-config} accommodates flexible and modular
  225. construction of different node definitions within the same base Node
  226. class.
  227. For instance, to create a mobile node capable
  228. of wireless communication, one no longer needs a specialized node
  229. creation command, e.g., proc[]{dsdv-create-mobile-node}; instead, one
  230. changes default configuration parameters, such as  
  231. begin{program}
  232. $ns node-config -adhocRouting dsdv 
  233. end{program}
  234. before actually 
  235. creating the node with the command: code{$ns node}.
  236. Together with routing modules, this allows
  237. one to combine ``arbitrary'' routing functionalities within a single
  238. node without resorting to multiple inheritance and other fancy object
  239. gimmicks. 
  240. We will describe this in more detail in Section~ref{sec:node:rtarch}.
  241. The functions and procedures relevant to the new node APIs may be
  242. found in nsf{tcl/lib/ns-node.tcl}.
  243. The node configuration interface consists of two parts. 
  244. The first part deals with node configuration, while the second part
  245. actually creates nodes of the specified type. 
  246. We have already seen the latter in Section~ref{sec:node:simulator},
  247. in this section we will describe the configuration part. 
  248. Node configuration essentially consists of defining the different node
  249. characteristics before creating them. They may consist of the type of
  250. addressing structure used in the simulation, defining the network
  251. components for mobilenodes, turning on or off the trace options at
  252. Agent/Router/MAC levels, selecting the type of adhoc routing protocol for
  253. wireless nodes or defining their energy model.
  254. As an example, node-configuration for a wireless, mobile node that 
  255. runs AODV as its
  256. adhoc routing protocol in a hierarchical topology would be as shown below.
  257. We decide to turn tracing on at the agent and router level only. Also we 
  258. assume a topology has been instantiated with "set topo [new Topography]". 
  259. The node-config command would look like the following:
  260. begin{program}
  261.   $ns_ node-config -addressType hierarchical bs 
  262.                    -adhocRouting AODV bs
  263.                    -llType LL bs
  264.                    -macType Mac/802_11 bs 
  265.                    -ifqType Queue/DropTail/PriQueue bs
  266.                    -ifqLen 50 bs
  267.                    -antType Antenna/OmniAntenna bs 
  268.                    -propType Propagation/TwoRayGround bs
  269.                    -phyType Phy/WirelessPhy bs
  270.                    -topologyInstance $topo bs
  271.                    -channel Channel/WirelessChannel bs 
  272.                    -agentTrace ON bs 
  273.                    -routerTrace ON bs
  274.                    -macTrace OFF bs
  275.                    -movementTrace OFF 
  276. end{program}
  277. The default values for all the above options are NULL except 
  278. code{-addressingType}
  279. whose default value is flat. The option code{-reset} can be used to reset all
  280. node-config parameters to their default value.
  281. Note that the config command can be broken down into separate lines like
  282. begin{program}
  283.         $ns_ node-config -addressingType hier
  284.         $ns_ node-config -macTrace ON
  285. end{program}
  286. The options that need to be changed may only be called. For example after
  287. configuring for AODV mobilenodes as shown above (and after creating AODV
  288. mobilenodes), we may configure for AODV base-station nodes in the
  289. following way: 
  290. begin{program}
  291.         $ns_ node-config -wiredRouting ON
  292. end{program}
  293. While all other features for base-station nodes and mobilenodes are same,
  294. the base-station nodes are capable of wired routing, while mobilenodes are
  295. not. In this way we can change node-configuration only when it is required.
  296. All node instances created after a given node-configuration command will
  297. have the same property unless a part or all of the node-config command is
  298. executed with different parameter values. And all parameter values remain
  299. unchanged unless they are expicitly changed. So after creation of the AODV
  300. base-station and mobilenodes, if we want to create simple nodes, we will
  301. use the following node-configuration command:
  302. begin{program}
  303.         $ns_ node-config -reset
  304. end{program}
  305. This will set all parameter values to their default setting which
  306. basically defines configuration of a simple node.
  307. Currently, this type of node configuration is oriented towards wireless
  308. and satellite nodes.  Table 5.1
  309. %% ~ref{table:nodeconfig} 
  310. lists the available options
  311. for these kinds of nodes.  The example scripts 
  312. nsf{tcl/ex/simple-wireless.tcl} and nsf{tcl/ex/sat-mixed.tcl} provide
  313. usage examples.
  314. begin{table}[ht]
  315. label{table:nodeconfig}
  316. begin{center} 
  317. {footnotesize
  318. begin{tabular}{|l|l|l|}hline
  319. {bf option} & {bf available values} & {bf default}\hlinehline 
  320. multicolumn{3}{|c|}{bf general} \hline
  321. {bf addressType} & flat, hierarchical & flat\hline
  322. {bf MPLS} & ON, OFF & OFF\hline
  323. multicolumn{3}{|c|}{bf both satellite- and wireless-oriented} \hline
  324. {bf wiredRouting} & ON, OFF & OFF\hline
  325. {bf llType} & LL, LL/Sat & "" \hline
  326. {bf macType} & Mac/802_11, Mac/Csma/Ca, Mac/Sat, & \ 
  327. & Mac/Sat/UnslottedAloha, Mac/Tdma & "" \hline
  328. {bf ifqType} & Queue/DropTail, Queue/DropTail/PriQueue & "" \hline
  329. {bf phyType} & Phy/WirelessPhy, Phy/Sat& "" \hline
  330. multicolumn{3}{|c|}{bf wireless-oriented} \hline
  331. {bf adhocRouting} & DIFFUSION/RATE, DIFFUSION/PROB, DSDV, & \
  332. & DSR, FLOODING, OMNIMCAST, AODV, TORA & ""\hline
  333. {bf propType} & Propagation/TwoRayGround, Propagation/Shadowing & ""\hline
  334. {bf propInstance} & Propagation/TwoRayGround, Propagation/Shadowing & ""\hline
  335. {bf antType} & Antenna/OmniAntenna & ""\hline
  336. {bf channel} & Channel/WirelessChannel, Channel/Sat & ""\hline
  337. {bf topoInstance} & <topology file> & ""\hline
  338. {bf mobileIP} & ON, OFF& OFF \hline
  339. {bf energyModel} & EnergyModel & "" \hline
  340. {bf initialEnergy} & <value in Joules> & "" \hline
  341. {bf rxPower} & <value in W> & "" \hline
  342. {bf txPower} & <value in W> & "" \hline
  343. {bf idlePower} & <value in W> & "" \hline
  344. {bf agentTrace} & ON, OFF & OFF \hline
  345. {bf routerTrace} & ON, OFF & OFF \hline
  346. {bf macTrace} & ON, OFF & OFF \hline
  347. {bf movementTrace} & ON, OFF & OFF \hline
  348. {bf errProc} & UniformErrorProc & "" \hline
  349. {bf FECProc} &? & ? \hline
  350. {bf toraDebug} & ON, OFF & OFF \hline
  351. multicolumn{3}{|c|}{bf satellite-oriented} \hline
  352. {bf satNodeType} & polar, geo, terminal, geo-repeater & "" \hline
  353. {bf downlinkBW} & <bandwidth value, e.g. "2Mb"> & ""\hline
  354. end{tabular}
  355. }
  356. end{center}
  357. caption{Available options for node configuration (see tcl/lib/ns-lib.tcl).
  358. }
  359. end{table}
  360. normalsize
  361. section{The Classifier}
  362. label{sec:node:classifiers}
  363. The function of a node when it receives a packet is to examine
  364. the packet's fields, usually its destination address, and
  365. on occasion, its source address.
  366. It should then map the values to an outgoing interface object
  367. that is the next downstream recipient of this packet.
  368. In ns, this task is performed by a simple emph{classifier} object.
  369. Multiple classifier objects,
  370. each looking at a specific portion of the packet
  371. forward the packet through the node.
  372. A node in ns uses many different types of classifiers for different purposes.
  373. This section describes some of the more common, or simpler,
  374. classifier objects in ns.
  375. We begin with a description of the base class in this section.
  376. The next subsections describe
  377. href{the address classifier}{Section}{sec:node:addr-classifier},
  378. href{the multicast classifier}{Section}{sec:node:mcast-classifier},
  379. href{the multipath classifier}{Section}{sec:node:mpath-classifier}, 
  380. href{the hash classifier}{Section}{sec:node:hash-classifier}, and
  381. finally, href{the replicator}{Section}{sec:node:replicator}.
  382. A classifier provides a way to match a packet against some
  383. logical criteria and retrieve a reference to another simulation
  384. object based on the match results.
  385. Each classifier contains a table of simulation objects indexed
  386. by {em slot number}.
  387. The job of a classifier is to determine the slot number associated
  388. with a received packet and forward that packet to the
  389. object referenced by that particular slot.
  390. The C++ clsref{Classifier}{../ns-2/classifier.h}
  391. (defined in nsf{classifier.h})
  392. provides a base class from which other classifiers are derived.
  393. begin{program}
  394.         class Classifier : public NsObject {
  395.         public:
  396.                 ~Classifier();
  397.                 void recv(Packet*, Handler* h = 0);
  398.          protected:
  399.                 Classifier();
  400.                 void install(int slot, NsObject*);
  401.                 void clear(int slot);
  402.                 virtual int command(int argc, const char*const* argv);
  403.                 virtual int classify(Packet *const) = 0;
  404.                 void alloc(int);
  405.                 NsObject** slot_;       * table that maps slot number to a NsObject */
  406.                 int nslot_;
  407.                 int maxslot_;
  408.         };
  409. end{program}
  410. The fcn[]{classify} method is pure virtual, indicating the
  411. class code{Classifier} is to be used only as a base class.
  412. The fcn[]{alloc} method dynamically allocates enough space
  413. in the table to hold the specified number of slots.
  414. The fcn[]{install} and fcn[]{clear} methods
  415. add or remove objects from the table.
  416. The fcn[]{recv} method and the OTcl interface are implemented
  417. as follows in nsf{classifier.cc}:
  418. begin{program}
  419.         /*
  420.          *{cf objects only ever see "packet" events, which come either}
  421.          *{cf from an incoming link or a local agent (i.e., packet source).}
  422.          */
  423.         void Classifier::recv(Packet* p, Handler*)
  424.         {
  425.                 NsObject* node;
  426.                 int cl = classify(p);
  427.                 if (cl < 0 || cl >= nslot_ || (node = slot_[cl]) == 0) {
  428.                         Tcl::instance().evalf("%s no-slot %d", name(), cl);
  429.                         Packet::free(p);
  430.                         return;
  431.                 }
  432.                 node->recv(p);
  433.         }
  434.         int Classifier::command(int argc, const char*const* argv)
  435.         {
  436.                 Tcl& tcl = Tcl::instance();
  437.                 if (argc == 3) {
  438.                         /*
  439.                          * $classifier clear $slot
  440.                          */
  441.                         if (strcmp(argv[1], "clear") == 0) {
  442.                                 int slot = atoi(argv[2]);
  443.                                 clear(slot);
  444.                                 return (TCL_OK);
  445.                         }
  446.                         /*
  447.                          * $classifier installNext $node
  448.                          */
  449.                         if (strcmp(argv[1], "installNext") == 0) {
  450.                                 int slot = maxslot_ + 1;
  451.                                 NsObject* node = (NsObject*)TclObject::lookup(argv[2]);
  452.                                 install(slot, node);
  453.                                 tcl.resultf("%u", slot);
  454.                                 return TCL_OK;
  455.                         }
  456.                         if (strcmp(argv[1], "slot") == 0) {
  457.                                 int slot = atoi(argv[2]);
  458.                                 if ((slot >= 0) || (slot < nslot_)) {
  459.                                         tcl.resultf("%s", slot_[slot]->name());
  460.                                         return TCL_OK;
  461.                                 }
  462.                                 tcl.resultf("Classifier: no object at slot %d", slot);
  463.                                 return (TCL_ERROR);
  464.                         }
  465.                 } else if (argc == 4) {
  466.                         /*
  467.                          * $classifier install $slot $node
  468.                          */
  469.                         if (strcmp(argv[1], "install") == 0) {
  470.                                 int slot = atoi(argv[2]);
  471.                                 NsObject* node = (NsObject*)TclObject::lookup(argv[3]);
  472.                                 install(slot, node);
  473.                                 return (TCL_OK);
  474.                         }
  475.                 }
  476.                 return (NsObject::command(argc, argv));
  477.         }
  478. end{program} %$
  479. When a classifier fcn[]{recv}'s a packet,
  480. it hands it to the fcn[]{classify} method.
  481. This is defined differently in each type of classifier
  482. derived from the base class.
  483. The usual format is for the fcn[]{classify} method to
  484. determine and return a slot index into the table of slots.
  485. If the index is valid, and points to a valid TclObject,
  486. the classifier will hand the packet to that object using 
  487. that object's fcn[]{recv} method.
  488. If the index is not valid, the classifier will invoke
  489. the instance procedure proc[]{no-slot} to attempt to 
  490. populate the table correctly.
  491. However, in the base class proc[]{Classifier::no-slot} prints
  492. and error message and terminates execution.
  493. The fcnref{fcn[]{command} method}{../ns-2/classifier.cc}{Classifier::command}
  494. provides the following instproc-likes to the interpreter:
  495. begin{itemize}itemsep0pt
  496. item proc[tup{slot}]{clear} clears the entry in a particular slot.
  497. item proc[tup{object}]{installNext} installs the object
  498.         in the next available slot, and returns the slot number.
  499.         Note that this instproc-like is 
  500.         fcnref{overloaded by an instance procedure of the same name}{%
  501.                 ../ns-2/ns-lib.tcl}{Classifier::installNext}
  502.         that stores a reference to the object stored.
  503.         This then helps quick query of the objects
  504.         installed in the classifier from OTcl.
  505. item proc[tup{index}]{slot} returns the object stored in the specified slot.
  506. item proc[tup{index}, tup{object}]{install} installs the specified
  507.         tup{object} at the slot tup{index}.
  508.         Note that this instproc-like too is 
  509.         fcnref{overloaded by an instance procedure of the same name}{%
  510.                 ../ns-2/ns-lib.tcl}{Classifier::install}
  511.         that stores a reference to the object stored.
  512.         This is also to quickly query of the objects
  513.         installed in the classifier from OTcl.
  514. end{itemize}
  515. subsection{Address Classifiers}
  516. label{sec:node:addr-classifier}
  517. An address classifier is used in supporting unicast packet forwarding.
  518. It applies a bitwise shift and mask operation to a packet's destination
  519. address to produce a slot number.
  520. The slot number is returned from the fcn[]{classify} method.
  521. The clsref{AddressClassifier}{../ns-2/classifier-addr.cc}
  522. (defined in nsf{classifier-addr.cc}) ide defined as follows:
  523. begin{program}
  524.         class AddressClassifier : public Classifier {
  525.         public:
  526.                 AddressClassifier() : mask_(~0), shift_(0) {
  527.                         bind("mask_", (int*)&mask_);
  528.                         bind("shift_", &shift_);
  529.                 }
  530.         protected:
  531.                 int classify(Packet *const p) {
  532.                         IPHeader *h = IPHeader::access(p->bits());
  533.                         return ((h->dst() >> shift_) & mask_);
  534.                 }
  535.                 nsaddr_t mask_;
  536.                 int shift_;
  537.         };
  538. end{program}
  539. The class imposes no direct semantic meaning
  540. on a packet's destination address field.
  541. Rather, it returns some number of bits from the packet's
  542. code{dst_} field as the slot number used
  543. in the fcnref{fcn[]{Classifier::recv}}{../ns-2/classifier.cc}{Classifier::recv} method.
  544. The code{mask_} and code{shift_} values are set through OTcl.
  545. subsection{Multicast Classifiers}
  546. label{sec:node:mcast-classifier}
  547. The multicast classifier classifies packets
  548. according to both source and destination (group) addresses.
  549. It maintains a (chained hash) table mapping source/group pairs to slot numbers.
  550. When a packet arrives containing a source/group unknown to the classifier,
  551. it invokes an Otcl procedure proc[]{Node::new-group}
  552. to add an entry to its table.
  553. This OTcl procedure may use the method code{set-hash} to add
  554. new (source, group, slot) 3-tuples to the classifier's table.
  555. The multicast classifier is defined in nsf{classifier-mcast.cc}
  556. as follows:
  557. begin{program}
  558.         static class MCastClassifierClass : public TclClass {
  559.         public:
  560.                 MCastClassifierClass() : TclClass("Classifier/Multicast") {}
  561.                 TclObject* create(int argc, const char*const* argv) {
  562.                         return (new MCastClassifier());
  563.                 }
  564.         } class_mcast_classifier;
  565.         class MCastClassifier : public Classifier {
  566.         public:
  567.                 MCastClassifier();
  568.                 ~MCastClassifier();
  569.         protected:
  570.                 int command(int argc, const char*const* argv);
  571.                 int classify(Packet *const p);
  572.                 int findslot();
  573.                 void set_hash(nsaddr_t src, nsaddr_t dst, int slot);
  574.                 int hash(nsaddr_t src, nsaddr_t dst) const {
  575.                         u_int32_t s = src ^ dst;
  576.                         s ^= s >> 16;
  577.                         s ^= s >> 8;
  578.                         return (s & 0xff);
  579.                 }
  580.                 struct hashnode {
  581.                         int slot;
  582.                         nsaddr_t src;
  583.                         nsaddr_t dst;
  584.                         hashnode* next;
  585.                 };
  586.                 hashnode* ht_[256];
  587.                 const hashnode* lookup(nsaddr_t src, nsaddr_t dst) const;
  588.         };
  589.         int MCastClassifier::classify(Packet *const pkt)
  590.         {
  591.                 IPHeader *h = IPHeader::access(pkt->bits());
  592.                 nsaddr_t src = h->src() >> 8; /*XXX*/
  593.                 nsaddr_t dst = h->dst();
  594.                 const hashnode* p = lookup(src, dst);
  595.                 if (p == 0) {
  596.                         /*
  597.                          * Didn't find an entry.
  598.                          * Call tcl exactly once to install one.
  599.                          * If tcl doesn't come through then fail.
  600.                          */
  601.                         Tcl::instance().evalf("%s new-group %u %u", name(), src, dst);
  602.                         p = lookup(src, dst);
  603.                         if (p == 0)
  604.                                 return (-1);
  605.                 }
  606.                 return (p->slot);
  607.         }
  608. end{program}
  609. The clsref{MCastClassifier}  implements a chained hash table
  610. and applies a hash function on both the packet source and
  611. destination addresses.
  612. The hash function returns the slot number
  613. to index the code{slot_} table in the underlying object.
  614. A hash miss implies packet delivery to a previously-unknown group;
  615. OTcl is called to handle the situation.
  616. The OTcl code is expected to insert an appropriate entry into the hash table.
  617. subsection{MultiPath Classifier}
  618. label{sec:node:mpath-classifier}
  619. This object is devised to support equal cost multipath
  620. forwarding, where the node has multiple equal cost routes
  621. to the same destination, and would like to use all of them
  622. simultaneously.
  623. This object does not look at any field in the packet.
  624. With every succeeding packet, 
  625. it simply returns the next filled slot in round robin fashion.
  626. The definitions for this classifier are in nsf{classifier-mpath.cc},
  627. and are shown below:
  628. begin{program}
  629. class MultiPathForwarder : public Classifier {
  630. public:
  631.         MultiPathForwarder() : ns_(0), Classifier() {} 
  632.         virtual int classify(Packet* const) {
  633.                 int cl;
  634.                 int fail = ns_;
  635.                 do {
  636.                         cl = ns_++;
  637.                         ns_ %= (maxslot_ + 1);
  638.                 } while (slot_[cl] == 0 && ns_ != fail);
  639.                 return cl;
  640.         }
  641. private:
  642.         int ns_;     * next slot to be used.  Probably a misnomer? */
  643. };
  644. end{program}
  645. subsection{Hash Classifier}
  646. label{sec:node:hash-classifier}
  647. This object is used to classify a packet as a member of a
  648. particular {em flow}.
  649. As their name indicates,
  650. hash classifiers use a hash table internally to assign
  651. packets to flows.
  652. These objects are used where flow-level information is
  653. required (e.g. in flow-specific queuing disciplines and statistics
  654. collection).
  655. Several ``flow granularities'' are available.  In particular,
  656. packets may be assigned to flows based on flow ID, destination address,
  657. source/destination addresses, or the combination of source/destination
  658. addresses plus flow ID.
  659. The fields accessed by the hash classifier are limited to
  660. the {tt ip} header: {tt src(), dst(), flowid()} (see {tt ip.h}).
  661. The hash classifier is created with an integer argument specifying
  662. the initial size of its hash table.  The current hash table size may
  663. be subsequently altered with the {tt resize} method (see below).
  664. When created, the instance variables code{shift_} and code{mask_}
  665. are initialized with the simulator's current {sf NodeShift} and
  666. {sf NodeMask} values, respectively.  These values are retrieved
  667. from the {tt AddrParams} object when the hash classifier is
  668. instantiated.  The hash classifier will fail to operate properly if
  669. the {tt AddrParams} structure is not initialized.
  670. The following constructors are used for the various hash classifiers:
  671. begin{program}
  672.         Classifier/Hash/SrcDest
  673.         Classifier/Hash/Dest
  674.         Classifier/Hash/Fid
  675.         Classifier/Hash/SrcDestFid
  676. end{program}
  677. The hash classifier receives packets, classifies them according
  678. to their flow criteria, and retrieves the classifier {em slot}
  679. indicating the next node that should receive the packet.
  680. In several circumstances with hash classifiers, most packets should
  681. be associated with a single slot, while only a few flows should
  682. be directed elsewhere. 
  683. The hash classifier includes a code{default_} instance variable
  684. indicating which slot is to be used for packets that do not match
  685. any of the per-flow criteria.
  686. The code{default_} may be set optionally.
  687. The methods for a hash classifier are as follows:
  688. begin{program}
  689.         $hashcl set-hash buck src dst fid slot
  690.         $hashcl lookup buck src dst fid
  691.         $hashcl del-hash src dst fid
  692.         $hashcl resize nbuck
  693. end{program}
  694. The fcn[]{set-hash} method inserts a new entry into the hash
  695. table within the hash classifier.
  696. The {tt buck} argument specifies the hash table bucket number
  697. to use for the insertion of this entry.
  698. When the bucket number is not known, {tt buck} may be specified
  699. as {tt auto}. 
  700. The {tt src, dst} and {tt fid} arguments specify the IP source,
  701. destination, and flow IDs to be matched for flow classification.
  702. Fields not used by a particular classifier (e.g. specifying {tt src}
  703. for a flow-id classifier) is ignored.
  704. The {tt slot} argument indicates the index into the underlying
  705. slot table in the base {tt Classifier} object from which
  706. the hash classifier is derived.
  707. The {tt lookup} function returns the name of the object
  708. associated with the given {tt buck/src/dst/fid} tuple.
  709. The {tt buck} argument may be {tt auto}, as for {tt set-hash}.
  710. The {tt del-hash} function removes the specified entry from
  711. the hash table.
  712. Currently, this is done by simply marking the entry as inactive,
  713. so it is possible to populate the hash table with unused entries.
  714. The {tt resize} function resizes the hash table to include
  715. the number of buckets specified by the argument {tt nbuck}.
  716. Provided no default is defined, a hash classifier will
  717. perform a call into OTcl when it
  718. receives a packet which matches no flow criteria.
  719. The call takes the following form:
  720. begin{program}
  721.         $obj unknown-flow src dst flowid buck
  722. end{program} 
  723. Thus, when a packet matching no flow criteria is received,
  724. the method {tt unknown-flow} of the instantiated hash classifier
  725. object is invoked with the source, destination, and flow id
  726. fields from the packet.
  727. In addition, the {tt buck} field indicates the hash bucket
  728. which should contain this flow if it were inserted using
  729. {tt set-hash}.  This arrangement avoids another hash
  730. lookup when performing insertions into the classifier when the
  731. bucket is already known.
  732. subsection{Replicator}
  733. label{sec:node:replicator}
  734. The replicator is different from the other classifiers
  735. we have described earlier,
  736. in that it does not use the classify function.
  737. Rather, it simply uses the classifier as a table of $n$ slots;
  738. it overloads the fcn[]{recv} method to produce $n$ copies
  739. of a packet, that are delivered to all $n$ objects referenced in the table.
  740. To support multicast packet forwarding, a classifier receiving a
  741. multicast packet from source $S$
  742. destined for group $G$ computes a hash function $h(S,G)$ giving
  743. a ``slot number'' in the classifier's object table.
  744. %Thus, the maximum size of the table is $O(|S|times|G|)$.
  745. In multicast delivery, the packet must be copied once for
  746. each link leading to nodes subscribed to $G$ minus one.
  747. Production of additional copies of the packet is performed
  748. by a code{Replicator} class, defined in code{replicator.cc}:
  749. begin{program}
  750.         /*
  751.          * {cf A replicator is not really a packet classifier but}
  752.          * {cf we simply find convenience in leveraging its slot table.}
  753.          * {cf (this object used to implement fan-out on a multicast}
  754.          * {cf router as well as broadcast LANs)}
  755.          */
  756.         class Replicator : public Classifier {
  757.         public:
  758.                 Replicator();
  759.                 void recv(Packet*, Handler* h = 0);
  760.                 virtual int classify(Packet* const) {};
  761.         protected:
  762.                 int ignore_;
  763.         };
  764.         void Replicator::recv(Packet* p, Handler*)
  765.         {
  766.                 IPHeader *iph = IPHeader::access(p->bits());
  767.                 if (maxslot_ < 0) {
  768.                         if (!ignore_)
  769.                                 Tcl::instance().evalf("%s drop %u %u", name(), 
  770.                                         iph->src(), iph->dst());
  771.                         Packet::free(p);
  772.                         return;
  773.                 }
  774.                 for (int i = 0; i < maxslot_; ++i) {
  775.                         NsObject* o = slot_[i];
  776.                         if (o != 0)
  777.                                 o->recv(p->copy());
  778.                 }
  779.                 /* {cf we know that maxslot is non-null} */
  780.                 slot_[maxslot_]->recv(p);
  781.         }
  782. end{program}
  783. As we can see from the code,
  784. this class  does not really classify packets.
  785. Rather, it replicates a packet, one for each entry in its table,
  786. and delivers the copies to each of the nodes listed in the table.
  787. The last entry in the table gets the ``original'' packet.
  788. Since the fcn[]{classify} method is pure virtual in the base class,
  789. the replicator defines an empty fcn[]{classify} method.
  790. section{Routing Module and Classifier Organization}
  791. label{sec:node:rtarch}
  792. As we have seen, a ns node is essentially a collection of
  793. classifiers.
  794. The simplest node (unicast) contains only one address classifier and
  795. one port classifier, as shown in Figure~ref{fig:node:unicast}.
  796. When one extends the functionality of the node, more classifiers are added
  797. into the base node, for instance, the multicast node shown in
  798. Figure~ref{fig:node:multicast}.
  799. As more function blocks is added, and each of these blocks requires
  800. its own classifier(s), it becomes important for the node to
  801. provide a {em uniform} interface to organize these classifiers and to
  802. bridge these classifiers to the route computation blocks.
  803. The classical method to handle this case is through class
  804. inheritance.
  805. For instance, if one wants a node that supports hierarchical routing,
  806. one simply derive a Node/Hier from the base node and override the
  807. classifier setup methods to insert hierarchical classifiers.
  808. This method works well when the new function blocks are independent
  809. and cannot be ``arbitrarily'' mixed. 
  810. For instance, both hierarchical routing and ad hoc routing use their
  811. own set of classifiers. 
  812. Inheritance would require that we have Node/Hier that supports
  813. the former, and Node/Mobile for the latter.
  814. This becomes slightly problematic when one wants an ad hoc routing
  815. node that supports hierarchical routing.
  816. In this simple case one may use multiple inheritance to solve the
  817. problem, but this quickly becomes infeasible as the number of such
  818. function blocks increases. 
  819. The only method to solve this problem is object composition. 
  820. The base node needs to define a set of interfaces for classifier
  821. access and organization. 
  822. These interfaces should
  823. begin{itemize}
  824. item allow individual routing modules that implement
  825.   their own classifiers to insert their classifiers into the node;
  826. item allow route computation blocks to populate routes to classifiers
  827.   in all routing modules that need this information, 
  828. item provide a single point of management for existing routing modules. 
  829. end{itemize}
  830. In addition, we should also define a uniform interface for routing
  831. modules to connect to the node interfaces, so as to provide a
  832. systematic approach to extending node functionality. 
  833. In this section we will describe the design of routing modules as well
  834. as that of the corresponding node interfaces.
  835. subsection{Routing Module}
  836. In general, every routing implementation in ns consists of three
  837. function blocks: 
  838. begin{itemize}
  839. item {em Routing agent} exchanges routing packet with neighbors, 
  840. item {em Route logic} uses the information gathered by routing
  841.   agents (or the global topology database in the case of static
  842.   routing) to perform the actual route computation, 
  843. item {em Classifiers} sit inside a Node. They use the computed
  844.   routing table to perform packet forwarding.
  845. end{itemize}
  846. Notice that when implementing a new routing protocol, one does not
  847. necessarily implement all of these three blocks.
  848. For instance, when one implements a link state routing protocol, one
  849. simply implement a routing agent that exchanges information in the
  850. link state manner, and a route logic that does Dijkstra on the
  851. resulting topology database. 
  852. It can then use the same classifiers as other unicast routing
  853. protocols.
  854. begin{figure}[tb]
  855.   begin{center}
  856.     includegraphics{rtmodule}
  857.     caption{Interaction among node, routing module, and routing. The
  858.       dashed line shows the details of one routing module.}
  859.     label{fig:node:rtmodule}
  860.   end{center}
  861. end{figure}
  862. When a new routing protocol implementation includes more than one
  863. function blocks, especially when it contains its own classifier, it is
  864. desirable to have another object, which we call 
  865. a {em routing module}, that manages all these function 
  866. blocks and to interface with node to organize its classifiers.
  867. Figure~ref{fig:node:rtmodule} shows functional relation among these
  868. objects.
  869. Notice that routing modules may have direct relationship with route
  870. computation blocks, i.e., route logic and/or routing agents.
  871. However, route computation MAY not install their routes directly
  872. through a routing module, because there may exists other modules that
  873. are interested in learning about the new routes.
  874. This is not a requirement, however, because it is possible that some
  875. route computation is specific to one particular routing module, for
  876. instance, label installation in the MPLS module. 
  877. A routing module contains three major functionalities:
  878. begin{enumerate}
  879. item %Management
  880.   A routing module initializes its connection to a node through
  881.   proc[]{register}, and tears the connection down via
  882.   proc[]{unregister}.
  883.   Usually, in proc[]{register} a routing module (1) tells the node
  884.   whether it
  885.   interests in knowing route updates and transport agent attachments,
  886.   and (2) creates its classifiers and install them in the node
  887.   (details described in the next subsection).
  888.   In proc[]{unregister} a routing module does the exact opposite: it
  889.   deletes its classifiers and removes its hooks on routing update in
  890.   the node.
  891. item %Route handler
  892.   If a routing module is interested in knowing routing updates, the
  893.   node will inform the module via \
  894.   proc[dst, target]{RtModule::add-route} and
  895.   proc[dst, nullagent]{RtModule::delete-route}.
  896. item %Transport agent handler
  897.   If a routing module is interested in learning about transport agent
  898.   attachment and detachment in a node, the node will inform the module
  899.   via \ 
  900.   proc[agent, port]{RtModule::attach} and
  901.   proc[agent, nullagent]{RtModule::detach}.
  902. end{enumerate}
  903. There are two steps to write your own routing module:
  904. begin{enumerate}
  905. item You need to declare the C++ part of your routing
  906.   module (see nsf{rtmodule.{cc,h}}). For many modules this only
  907.   means to declare a virtual method code{name()} which returns a
  908.   string descriptor of the module. However, you are free to implement
  909.   as much functionality as you like in C++; if necessary you may
  910.   later move functionality from OTcl into C++ for better performance. 
  911. item You need to look at the above interfaces implemented in the base
  912.   routing module (see nsf{tcl/lib/ns-rtmodule.tcl}) and decide which
  913.   one you'll inherit, which one you'll override, and put them in OTcl
  914.   interfaces of your own module. 
  915. end{enumerate}
  916. There are several derived routing module examples in
  917. nsf{tcl/lib/ns-rtmodule.tcl}, which may serve as templates for your
  918. modules.
  919. Currently, there are six routing modules implemented in ns:
  920. begin{table}[htbp]
  921.   begin{center}
  922.     begin{tabular}[htbp]{|c|p{5in}|}
  923.       hline
  924.       Module Name & Functionality \ 
  925.       hline hline
  926.       RtModule/Base & Interface to unicast routing protocols. Provide
  927.         basic functionality to add/delete route and attach/detach
  928.         agents. \ hline
  929.       RtModule/Mcast & Interface to multicast routing protocols. Its
  930.         only purpose is establishes multicast classifiers. All other
  931.         multicast functionalities are implemented as instprocs of
  932.         Node. This should be converted in the future. \ hline
  933.       RtModule/Hier & Hierarchical routing. It's a wrapper for
  934.         managing hierarchical classifiers and route installation. Can
  935.         be combined with other routing protocols, e.g., ad hoc
  936.         routing. \ hline
  937.       RtModule/Manual & Manual routing. \ hline
  938.       RtModule/VC & Uses virtual classifier instead of vanilla
  939.         classifier. \ hline
  940.       RtModule/MPLS & Implements MPLS functionality. This is the only
  941.         existing module that is completely self-contained and does not
  942.         pollute the Node namespace. \
  943.       hline
  944.     end{tabular}
  945.     caption{Available routing modules}
  946.     label{tab:node:rtmodule}
  947.   end{center}
  948. end{table}
  949. subsection{Node Interface}
  950. To connect to the above interfaces of routing module, a node provides
  951. a similar set of interfaces:
  952. begin{itemize}
  953. item %Management
  954.   In order to know which module to register during creation, the Node
  955.   class keeps a list of modules as a class variable. 
  956.   The default value of this list contains only the base routing
  957.   module.
  958.   The Node class provides the following two {em procs} to manipulate
  959.   this module list:
  960.   begin{alist}
  961.     proc[name]{Node::enable-module} & If module
  962.     code{RtModule/[name]} exists, this proc puts [name] into the
  963.     module list. \ 
  964.     proc[name]{Node::disable-module} & If
  965.     [name] is in the module 
  966.     list, remove it from the list. 
  967.   end{alist}
  968.   When a node is created, it goes through the module list of the Node
  969.   class, creates all modules included in the list, and register these
  970.   modules at the node.
  971.   After a node is created, one may use the following instprocs to list
  972.   modules registered at the node, or to get a handle of a module with
  973.   a particular name:
  974.   begin{alist}
  975.     proc[]{Node::list-modules} & Return a list of the handles (shadow
  976.     objects) of all registered modules. \
  977.     proc[name]{Node::get-module} & Return a
  978.     handle of the 
  979.     registered module whose name matches the given one. Notice that
  980.     any routing module can only have a single instance registered at
  981.     any node.
  982.   end{alist}
  983. item %route and port
  984.   To allow routing modules register their interests of routing
  985.   updates, a node object provide the following instprocs:
  986.   begin{alist}
  987.     proc[module]{Node::route-notify} & Add code{module} into route
  988.     update notification list. \
  989.     proc[module]{Node::unreg-route-notify} & Remove code{module}
  990.     from route update notification list. \
  991.   end{alist}
  992.   Similarly, the following instprocs provide hooks on the attachment
  993.   of transport agents:
  994.   begin{alist}
  995.     proc[module]{Node::port-notify} & Add code{module} into agent
  996.     attachment notification list. \
  997.     proc[module]{Node::unreg-port-notify} & Remove code{module} from
  998.     agent attachment notification list. \
  999.   end{alist}
  1000.   Notice that in all of these instprocs, parameter code{module}
  1001.   should be a module handle instead of a module name. 
  1002. item %classifier
  1003.   Node provides the following instprocs to manipulate its address and
  1004.   port classifiers:
  1005.   begin{itemize}
  1006.   item proc[module, clsfr, hook]{Node::insert-entry} inserts
  1007.     classifier code{clsfr} into the entry point of the node. It also
  1008.     associates the new classifier with code{module} so that if this
  1009.     classifier is removed later, code{module} will be unregistered.
  1010.     If code{hook} is specified as a number, the existing classifier
  1011.     will be inserted into slot code{hook} of the new classifier. 
  1012.     In this way, one may establish a ``chain'' of classifiers; see
  1013.     Figure~ref{fig:node:multicast} for an example.
  1014.     {bf NOTE}: code{clsfr} needs NOT to be a classifier. In some
  1015.     cases one may want to put an agent, or any class derived from
  1016.     Connector, at the entry point of a node. In such cases, one simply
  1017.     supplies code{target} to parameter code{hook}.
  1018.   item proc[module, clsfr, hook]{Node::install-entry} differs from
  1019.     code{Node::insert-entry} in that it deletes the existing
  1020.     classifier at the node entry point, unregisters any associated
  1021.     routing module, and installs the new classifier at that point. 
  1022.     If code{hook} is given, and the old classifier is connected into
  1023.     a classifier chain, it will connect the chain into slot
  1024.     code{hook} of the new classifier. 
  1025.     As above, if code{hook} equals to code{target}, code{clsfr}
  1026.     will be treated as an object derived from Connector instead of a
  1027.     classifier. 
  1028.   item proc[demux, port]{Node::install-demux} places the given
  1029.     classifier code{demux} as the default demultiplexer. If
  1030.     code{port} is given, it plugs the existing demultiplexer into
  1031.     slot code{port} of the new one. Notice that in either case it does
  1032.     not delete the existing demultiplexer.
  1033.   end{itemize}
  1034. end{itemize}
  1035. section{Commands at a glance}
  1036. label{sec:nodescommand}
  1037. begin{flushleft}
  1038. Following is a list of common node commands used in simulation scripts:
  1039. code{$ns_ node [<hier_addr>]}\ %$
  1040. Command to create and return a node instance. If <hier_addr> is given,
  1041. assign the node address to be <hier_addr>. Note that the latter MUST
  1042. only be used when hierarchical addressing is enabled via either
  1043. proc[]{set-address-format hierarchical} or 
  1044. proc[]{node-config -addressType hierarchical}. 
  1045. code{$ns_ node-config -<config-parameter> <optional-val>}\%$
  1046. This command is used to configure nodes. The different config-parameters
  1047. are addressingType, different type of the network stack components,
  1048. whether tracing will be turned on or not, mobileIP flag is truned or not,
  1049. energy model is being used or not etc. An option -reset maybe used to set
  1050. the node configuration to its default state. The default setting of 
  1051. node-config, i.e if no values are specified, creates a simple node (base
  1052. class Node) with flat addressing/routing. For the syntax details see
  1053. Section~ref{sec:node:nodeconfig}.
  1054. code{$node id}\%$
  1055. Returns the id number of the node.
  1056. code{$node node-addr}\%$
  1057. Returns the address of the node. In case of flat addressing, the node address
  1058. is same as its node-id. In case of hierarchical addressing, the node address
  1059. in the form of a string (viz. "1.4.3") is returned.
  1060. code{$node reset} \%$
  1061. Resets all agent attached to this node.
  1062. code{$node agent <port_num>} \%$
  1063. Returns the handle of the agent at the specified port. If no agent is found
  1064. at the given port, a null string is returned.
  1065. code{$node entry}\%$
  1066. Returns the entry point for the node. This is first object that
  1067. handles packet receiving at this node.
  1068. code{$node attach <agent> <optional:port_num>}\%$
  1069. Attaches the <agent> to this node. Incase no specific port number is passed,
  1070. the node allocates a port number and binds the agent to this port. Thus once
  1071. the agent is attached, it receives packets destined for this host
  1072. (node) and port. 
  1073. code{$node detach <agent> <null_agent>}\%$
  1074. This is the dual of "attach" described above. It detaches the agent
  1075. from this node 
  1076. and installs a null-agent to the port this agent was attached. This is
  1077. done to handle transit packets that may be destined to the detached
  1078. agent. These on-the-fly packets are then sinked  at the null-agent.
  1079. code{$node neighbors}\%$
  1080. This returns the list of neighbors for the node.
  1081. code{$node add-neighbor <neighbor_node>}\%$
  1082. This is a command to add code{<neighbor_node>} to the list of neighbors 
  1083. maintained by the node.
  1084. rule{linewidth}{0.3mm}
  1085. Following is a list of internal node methods:
  1086. code{$node add-route <destination_id> <target>}\%$
  1087. This is used in unicast routing to populate the classifier. The target is a
  1088. Tcl object, which may be the entry of code{dmux_} (port demultiplexer in
  1089. the node) incase the code{<destination_id>} is same as this node-id.
  1090. Otherwise it is usually the head of the link for that destination. It
  1091. could also be the entry for other classifiers.
  1092. code{$node alloc-port <null_agent>}\%$
  1093. This returns the next available port number.
  1094. code{$node incr-rtgtable-size}\%$
  1095. The instance variable code{rtsize_} is used to keep track of size of
  1096. routing-table in each node. This command is used to increase the
  1097. routing-table size every time an routing-entry is added to the
  1098. classifiers.
  1099. There are other node commands that supports hierarchical
  1100. routing, detailed dynamic routing, equal cost multipath
  1101. routing, manual routing, and energy model for mobile nodes. These
  1102. and other methods described earlier can be found in 
  1103. nsf{tcl/lib/ns-node.tcl} and nsf{tcl/lib/ns-mobilenode.tcl}.
  1104. end{flushleft}
  1105. endinput
  1106. % LocalWords:  ns tcl lib rtmodule addr cc mcast mpath replicator unicast pt ht
  1107. % LocalWords:  multicast mcastNode TclObject dmux installNext strcmp argv int
  1108. % LocalWords:  atoi NsObject NsObject argc recv instproc OTcl AddressClassifier
  1109. % LocalWords:  const IPHeader IPHeader dst nsaddr Otcl MCastClassifierClass src
  1110. % LocalWords:  TclClass MCastClassifier findslot struct hashnode pkt XXX evalf
  1111. % LocalWords:  MultiPath multipath MultiPathForwarder cl ip flowid ip NodeShift
  1112. % LocalWords:  NodeMask AddrParams SrcDest Dest SrcDestFid hashcl nbuck IDs del
  1113. % LocalWords:  flor bj LANs iph maxslot Hier onsists tb MPLS RtModule nullagent
  1114. % LocalWords:  config config val num alloc incr rtgtable