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

通讯编程

开发平台:

Visual C++

  1. chapter{Multicast Routing}
  2. label{chap:multicast}
  3. This section describes the usage and the internals of multicast
  4. routing implementation in ns.
  5. We first describe 
  6. href{the user interface to enable multicast routing}{Section}{sec:mcast-api},
  7. specify the multicast routing protocol to be used and the
  8. various methods and configuration parameters specific to the
  9. protocols currently supported in ns.
  10. We then describe in detail 
  11. href{the internals and the architecture of the
  12. multicast routing implementation in ns}{Section}{sec:mcast-internals}.
  13. The procedures and functions described in this chapter can be found in
  14. various files in the directories nsf{tcl/mcast}, nsf{tcl/ctr-mcast};
  15. additional support routines
  16. are in nsf{mcast_ctrl.{cc,h}},
  17. nsf{tcl/lib/ns-lib.tcl}, and nsf{tcl/lib/ns-node.tcl}.
  18. section{Multicast API}
  19. label{sec:mcast-api}
  20. Multicast forwarding requires enhancements
  21. to the nodes and links in the topology.
  22. Therefore, the user must specify multicast requirements
  23. to the Simulator class before creating the topology.
  24. This is done in one of two ways:
  25. begin{program}
  26.         set ns [new Simulator -multicast on]
  27.     {rm or}
  28.         set ns [new Simulator]
  29.         $ns multicast
  30. end{program}                   %$
  31. When multicast extensions are thus enabled, nodes will be created with
  32. additional classifiers and replicators for multicast forwarding, and
  33. links will contain elements to assign incoming interface labels to all
  34. packets entering a node.
  35. A multicast routing strategy is the mechanism by which
  36. the multicast distribution tree is computed in the simulation.
  37. ns supports three multiast route computation strategies:
  38.         centralised, dense mode(DM) or shared tree mode(ST).
  39. The method proc[]{mrtproto} in the Class Simulator specifies either
  40. the route computation strategy, for centralised multicast routing, or
  41. the specific detailed multicast routing protocol that should be used.
  42. %%For detailed multicast routing, proc[]{mrtproto} will accept, as
  43. %%additional arguments, a list of nodes that will run an instance of
  44. %%that routing protocol.  
  45. %%Polly Huang Wed Oct 13 09:58:40 EDT 199: the above statement
  46. %%is no longer supported.
  47. The following are examples of valid
  48. invocations of multicast routing in ns:
  49. begin{program}
  50.         set cmc [$ns mrtproto CtrMcast]    ; specify centralized multicast for all nodes;
  51.         ; cmc is the handle for multicast protocol object;
  52.         $ns mrtproto DM                   ; specify dense mode multicast for all nodes;
  53.         $ns mrtproto ST                  ; specify shared tree mode to run on all nodes;
  54. end{program}
  55. Notice in the above examples that CtrMcast returns a handle that can
  56. be used for additional configuration of centralised multicast routing.
  57. The other routing protocols will return a null string.  All the
  58. nodes in the topology will run instances of the same protocol.
  59. Multiple multicast routing protocols can be run at a node, but in this
  60. case the user must specify which protocol owns which incoming
  61. interface.  For this finer control proc[]{mrtproto-iifs} is used.
  62. New/unused multicast address are allocated using the procedure
  63. proc[]{allocaddr}.
  64. %%The default configuration in ns provides 32 bits each for node address and port address space.
  65. %%The procedure
  66. %%proc[]{expandaddr} is now obsoleted.
  67. The agents use the instance procedures
  68. proc[]{join-group} and proc[]{leave-group}, in
  69. the class Node to join and leave multicast groups. These procedures
  70. take two mandatory arguments. The first argument identifies the
  71. corresponding agent and second argument specifies the group address.
  72. An example of a relatively simple multicast configuration is:
  73. begin{program}
  74.         set ns [new Simulator {bfseries{}-multicast on}] ; enable multicast routing;
  75.         set group [{bfseries{}Node allocaddr}]   ; allocate a multicast address;
  76.         set node0 [$ns node]         ; create multicast capable nodes;
  77.         set node1 [$ns node]
  78.         $ns duplex-link $node0 $node1 1.5Mb 10ms DropTail
  79.         set mproto DM          ; configure multicast protocol;
  80.         set mrthandle [{bfseries{}$ns mrtproto $mproto}] ; all nodes will contain multicast protocol agents;
  81.         set udp [new Agent/UDP]         ; create a source agent at node 0;
  82.         $ns attach-agent $node0 $udp 
  83.         set src [new Application/Traffic/CBR]        
  84.         $src attach-agent $udp
  85.         {bfseries{}$udp set dst_addr_ $group}
  86.         {bfseries{}$udp set dst_port_ 0}
  87.         set rcvr [new Agent/LossMonitor]  ; create a receiver agent at node 1;
  88.         $ns attach-agent $node1 $rcvr
  89.         $ns at 0.3 "{bfseries{}$node1 join-group $rcvr $group}" ; join the group at simulation time 0.3 (sec);
  90. end{program} %$
  91. subsection{Multicast Behavior Monitor Configuration}
  92. ns supports a multicast monitor module that can trace
  93. user-defined packet activity.
  94. The module counts the number of packets in transit periodically
  95. and prints the results to specified files. proc[]{attach} enables a 
  96. monitor module to print output to a file. 
  97. proc[]{trace-topo} insets monitor modules into all links. 
  98. proc[]{filter} allows accounting on specified packet header, 
  99. field in the header), and value for the field).  Calling proc[]{filter}
  100. repeatedly will result in an AND effect on the filtering condition.
  101. proc[]{print-trace} notifies the monitor module to begin dumping data.
  102. code{ptype()} is a global arrary that takes a packet type name (as seen in
  103. proc[]{trace-all} output) and maps it into the corresponding value.  
  104. A simple configuration to filter cbr packets on a particular group is:
  105. begin{program}
  106.         set mcastmonitor [new McastMonitor]
  107.         set chan [open cbr.tr w] ; open trace file;
  108.         $mmonitor attach $chan1  ; attach trace file to McastMoniotor object;
  109.         $mcastmonitor set period_ 0.02         ; default 0.03 (sec);
  110.         $mmonitor trace-topo   ; trace entire topology;
  111.         $mmonitor filter Common ptype_ $ptype(cbr) ; filter on ptype_ in Common header;
  112.         $mmonitor filter IP dst_ $group ; AND filter on dst_ address in IP header;
  113.         $mmonitor print-trace  ; begin dumping periodic traces to specified files;
  114. end{program} %$
  115. % SAMPLE OUTPUT?
  116. The following sample output illustrates the output file format (time, count):
  117. {small
  118. begin{verbatim}
  119. 0.16 0
  120. 0.17999999999999999 0
  121. 0.19999999999999998 0
  122. 0.21999999999999997 6
  123. 0.23999999999999996 11
  124. 0.25999999999999995 12
  125. 0.27999999999999997 12
  126. end{verbatim}
  127. }
  128. subsection{Protocol Specific configuration}
  129. In this section, we briefly illustrate the
  130. protocol specific configuration mechanisms
  131. for all the protocols implemented in ns.
  132. paragraph{Centralized Multicast}
  133. The centralized multicast is a sparse mode implementation of multicast
  134. similar to PIM-SM cite{Deer94a:Architecture}.
  135. A Rendezvous Point (RP) rooted shared tree is built
  136. for a multicast group.  The actual sending of prune, join messages
  137. etc. to set up state at the nodes is not simulated.  A centralized
  138. computation agent is used to compute the forwarding trees and set up
  139. multicast forwarding state, tup{S, G} at the relevant nodes as new
  140. receivers join a group.  Data packets from the senders to a group are
  141. unicast to the RP.  Note that data packets from the senders are
  142. unicast to the RP even if there are no receivers for the group.
  143. The method of enabling centralised multicast routing in a simulation is:
  144. begin{program}
  145.         set mproto CtrMcast    ; set multicast protocol;
  146.         set mrthandle [$ns mrtproto $mproto] 
  147. end{program}
  148. The command procedure proc[]{mrtproto}
  149. returns a handle to the multicast protocol object.
  150. This handle can be used to control the RP and the boot-strap-router (BSR),
  151. switch tree-types for a particular group,
  152. from shared trees to source specific trees, and
  153. recompute multicast routes.
  154. begin{program}
  155.         $mrthandle set_c_rp $node0 $node1          ; set the RPs;
  156.         $mrthandle set_c_bsr $node0:0 $node1:1     ; set the BSR, specified as list of node:priority;
  157.         $mrthandle get_c_rp $node0 $group          ; get the current RP ???;
  158.         $mrthandle get_c_bsr $node0                ; get the current BSR;
  159.         $mrthandle switch-treetype $group         ; to source specific or shared tree;
  160.         $mrthandle compute-mroutes       ; recompute routes. usually invoked automatically as needed;
  161. end{program}
  162. Note that whenever network dynamics occur or unicast routing changes,
  163. proc[]{compute-mroutes} could be invoked to recompute the multicast routes.
  164. The instantaneous re-computation feature of centralised algorithms
  165. may result in causality violations during the transient
  166. periods.
  167. paragraph{Dense Mode}
  168. The Dense Mode protocol (code{DM.tcl}) is an implementation of a
  169. dense--mode--like protocol.  Depending on the value of DM class
  170. variable code{CacheMissMode} it can run in one of two modes.  If
  171. code{CacheMissMode} is set to code{pimdm} (default), PIM-DM-like
  172. forwarding rules will be used.  Alternatively, code{CacheMissMode}
  173. can be set to code{dvmrp} (loosely based on DVMRP cite{rfc1075}).
  174. The main difference between these two modes is that DVMRP maintains
  175. parent--child relationships among nodes to reduce the number of links
  176. over which data packets are broadcast.  The implementation works on
  177. point-to-point links as well as LANs and adapts to the network
  178. dynamics (links going up and down).
  179. Any node that receives data for a particular group for which it has no
  180. downstream receivers, send a prune upstream.  A prune message causes
  181. the upstream node to initiate prune state at that node.  The prune
  182. state prevents that node from sending data for that group downstream
  183. to the node that sent the original prune message while the state is
  184. active.  The time duration for which a prune state is active is
  185. configured through the DM class variable, code{PruneTimeout}.  A
  186. typical DM configuration is shown below:
  187. begin{program}
  188.         DM set PruneTimeout 0.3           ; default 0.5 (sec);
  189.         DM set CacheMissMode dvmrp        ; default pimdm;
  190.         $ns mrtproto DM
  191. end{program} %$
  192. paragraph{Shared Tree Mode}
  193. Simplified sparse mode code{ST.tcl} is a version of a shared--tree
  194. multicast protocol.  Class variable array code{RP_} indexed by group
  195. determines which node is the RP for a particular group.  For example:
  196. begin{program}
  197.         ST set RP_($group) $node0
  198.         $ns mrtproto ST
  199. end{program}
  200. At the time the multicast simulation is started, the protocol will
  201. create and install encapsulator objects at nodes that have multicast
  202. senders, decapsulator objects at RPs and connect them.  To join a
  203. group, a node sends a graft message towards the RP of the group.  To
  204. leave a group, it sends a prune message.  The protocol currently does
  205. not support dynamic changes and LANs.
  206. paragraph{Bi-directional Shared Tree Mode}
  207. code{BST.tcl} is an experimental version of a bi--directional shared
  208. tree protocol.  As in shared tree mode, RPs must be configured
  209. manually by using the class array code{RP_}.  The protocol currently
  210. does not support dynamic changes and LANs.
  211. section{Internals of Multicast Routing}
  212. label{sec:mcast-internals}
  213. We describe the internals in three parts: first the classes to
  214. implement and support multicast routing; second, the specific protocol
  215. implementation details; and finally, provide a list of the variables
  216. that are used in the implementations.
  217. subsection{The classes}
  218. The main classes in the implementation are the
  219. clsref{mrtObject}{../ns-2/tcl/mcast/McastProto.tcl} and the
  220. clsref{McastProtocol}{../ns-2/tcl/mcast/McastProto.tcl}.  There are
  221. also extensions to the base classes: Simulator, Node, Classifier,
  222. etc.  We describe these classes and extensions in this subsection.
  223. The specific protocol implementations also use adjunct data structures
  224. for specific tasks, such as timer mechanisms by detailed dense mode,
  225. encapsulation/decapsulation agents for centralised multicast etc.; we
  226. defer the description of these objects to the section on the
  227. description of the particular protocol itself.
  228. paragraph{mrtObject class}
  229. There is one mrtObject (aka Arbiter) object per multicast capable
  230. node.  This object supports the ability for a node to run multiple
  231. multicast routing protocols by maintaining an array of multicast
  232. protocols indexed by the incoming interface.  Thus, if there are
  233. several multicast protocols at a node, each interface is owned by just
  234. one protocol.  Therefore, this object supports the ability for a node
  235. to run multiple multicast routing protocols.  The node uses the
  236. arbiter to perform protocol actions, either to a specific protocol
  237. instance active at that node, or to all protocol instances at that
  238. node.
  239. begin{alist}
  240. proc[instance]{addproto} &
  241.         adds the handle for a protocol instance to its array of
  242.         protocols.  The second optional argument is the incoming
  243.         interface list controlled by the protocol.  If this argument
  244.         is an empty list or not specified, the protocol is assumed to
  245.         run on all interfaces (just one protocol). \
  246. proc[protocol]{getType} &
  247.         returns the handle to the protocol instance active at that
  248.         node that matches the specified type (first and only
  249.         argument).  This function is often used to locate a protocol's
  250.         peer at another node.  An empty string is returned if the
  251.         protocol of the given type could not be found. \
  252. proc[op, args]{all-mprotos} &
  253.         internal routine to execute ``code{op}'' with ``code{args}''
  254.         on all protocol instances active at that node. \
  255. proc[]{start} & \
  256. proc[]{stop} &
  257.         start/stop execution of all protocols. \
  258. proc[dummy]{notify} &
  259.         is called when a topology change occurs. The dummy argument is
  260.         currently not used.\
  261. proc[file-handle]{dump-mroutes} &
  262.         dump multicast routes to specified file-handle. \
  263. proc[G, S]{join-group} &
  264.         signals all protocol instances to join tup{S, G}. \
  265. proc[G, S]{leave-group} &
  266.         signals all protocol instances to leave tup{S, G}. \
  267. proc[code, s, g, iif]{upcall} &
  268.         signalled by node on forwarding errors in classifier;
  269.         this routine in turn signals the protocol instance that owns
  270.         the incoming interface (code{iif}) by invoking the
  271.         appropriate handle function for that particular code.\ 
  272. proc[rep, s, g, iif]{drop} &
  273.         Called on packet drop, possibly to prune an interface. \
  274. end{alist}
  275. In addition, the mrtObject class supports the concept of well known
  276. groups, ie, those groups that do not require explicit protocol support.
  277. Two well known groups, code{ALL_ROUTERS} and code{ALL_PIM_ROUTERS}
  278. are predefined in ns.
  279. The clsref{mrtObject}{../ns-2/tcl/mcast/McastProto.tcl} defines
  280. two class procedures to set and get information about these well known groups.
  281. begin{alist}
  282. proc[name]{registerWellKnownGroups} & 
  283.         assigns code{name} a well known group address. \
  284. proc[name]{getWellKnownGroup} &
  285.         returns the address allocated to well known group, code{name}.
  286.         If code{name} is not registered as a well known group,
  287.         then it returns the address for code{ALL_ROUTERS}.
  288. end{alist}
  289. paragraph{McastProtocol class}
  290. This is the base class for the implementation of all the multicast protocols.
  291. It contains basic multicast functions:
  292. begin{alist}
  293. proc[]{start}, proc[]{stop} &
  294.         Set the code{status_} of execution of this protocol instance. \
  295. proc[]{getStatus} &
  296.         return the status of execution of this protocol instance. \
  297. proc[]{getType} &
  298.         return the type of protocol executed by this instance. \
  299. proc[code args]{upcall} &
  300.         invoked when the node classifier signals an error, either due to 
  301.         a cache-miss or a wrong-iif for incoming packet.  This routine
  302.         invokes the protocol specific handle, proc{handle-tup{code}} with
  303.         specified code{args} to handle the signal. \
  304. end{alist}
  305. A few words about interfaces.  Multicast implementation in ns
  306. assumes duplex links i.e. if there is a simplex link from node~1 to
  307. node~2, there must be a reverse simplex link from node~2 to node~1.
  308. To be able to tell from which link a packet was received, multicast
  309. simulator configures links with an interface labeller at the end of
  310. each link, which labels packets with a particular and unique label
  311. (id).  Thus, ``incoming interface'' is referred to this label and is a
  312. number greater or equal to zero.  Incoming interface value can be
  313. negative (-1) for a special case when the packet was sent by a local
  314. to the given node agent.
  315. In contrast, an ``outgoing interface'' refers to an object handler,
  316. usually a head of a link which can be installed at a replicator.  This
  317. destinction is important: textit{incoming interface is a numeric label to
  318. a packet, while outgoing interface is a handler to an object that is
  319. able to receive packets, e.g. head of a link.}
  320.  
  321. subsection{Extensions to other classes in ns}
  322. In href{the earlier chapter describing nodes in
  323. ns}{Chapter}{chap:nodes}, we described the internal structure of the
  324. node in ns.  To briefly recap that description, the node entry for a
  325. multicast node is the
  326. code{switch_}.  It looks at the highest bit to decide if the
  327. destination is a multicast or unicast packet.  Multicast packets are
  328. forwarded to a multicast classifier which maintains a list of
  329. replicators; there is one replicator per tup{source, group} tuple.
  330. Replicators copy the incoming packet and forward to all outgoing
  331. interfaces.
  332. paragraph{Class Node}
  333. Node support for multicast is realized in two primary ways: it serves
  334. as a focal point for access to the multicast protocols, in the areas
  335. of address allocation, control and management, and group membership
  336. dynamics; and secondly, it provides primitives to access and control
  337. interfaces on links incident on that node.
  338. begin{alist}
  339. proc[]{expandaddr}, & \
  340. proc[]{allocaddr} &
  341.         Class procedures for address management.
  342.         proc[]{expandaddr} is now obsoleted.
  343.         proc[]{allocaddr} allocates the next available multicast
  344.         address.\[2ex]
  345. proc[]{start-mcast}, & \
  346. proc[]{stop-mcast} &
  347.         To start and stop multicast routing at that node. \
  348. proc[]{notify-mcast} &
  349.         proc[]{notify-mcast} signals the mrtObject at that node to
  350.         recompute multicastroutes following a topology change or
  351.         unicast route update from a neighbour.  \[2ex]
  352. proc[]{getArbiter} &
  353.         returns a handle to mrtObject operating at that node. \
  354. proc[file-handle]{dump-routes} &
  355.         to dump the multicast forwarding tables at that node. \[2ex]
  356. proc[s g iif code]{new-group} &
  357.         When a multicast data packet is received, and the multicast
  358.         classifier cannot find the slot corresponding to that data
  359.         packet, it invokes proc[]{Node~nstproc~new-group} to
  360.         establish the appropriate entry.  The code indicates the
  361.         reason for not finding the slot.  Currently there are two
  362.         possibilities, cache-miss and wrong-iif.  This procedure
  363.         notifies the arbiter instance to establish the new group. \
  364. proc[a g]{join-group} &
  365.         An code{agent} at a node that joins a particular group invokes
  366.         ``code{node join-group <agent> <group>}''.  The
  367.         node signals the mrtObject to join the particular code{group},
  368.         and adds code{agent} to its list of agents at that
  369.         code{group}.  It then adds code{agent} to all replicators
  370.         associated with code{group}. \
  371. proc[a g]{leave-group} &
  372.         code{Node~instproc~leave-group} reverses the process
  373.         described earlier.  It disables the outgoing interfaces to the
  374.         receiver agents for all the replicators of the group, deletes
  375.         the receiver agents from the local code{Agents_} list; it
  376.         then invokes the arbiter instance's
  377.         proc[]{leave-group}.\[2ex]
  378. proc[s g iif oiflist]{add-mfc} &
  379.         code{Node~instproc~add-mfc} adds a textit{multicast forwarding cache}
  380.         entry for a particular tup{source, group, iif}.
  381.         The mechanism is:
  382.         begin{itemize}
  383.         item create a new replicator (if one does not already exist),
  384.         item update the code{replicator_} instance variable array at the node,
  385.         item add all outgoing interfaces and local agents to the
  386.             appropriate replicator,
  387.         item invoke the multicast classifier's proc[]{add-rep}
  388.             to create a slot for the replicator in the multicast
  389.             classifier.
  390.         end{itemize} \
  391. proc[s g oiflist]{del-mfc} &
  392.         disables each oif in code{oiflist} from the replicator for tup{s, g}.\
  393. end{alist}
  394. The list of primitives accessible at the node to control its interfaces are listed below.
  395. begin{alist}
  396. proc[ifid link]{add-iif}, & \
  397. proc[link if]{add-oif} &
  398.         Invoked during link creation to prep the node about its 
  399.         incoming interface label and outgoing interface object. \
  400. proc[]{get-all-oifs} &
  401.         Returns all oifs for this node. \
  402. proc[]{get-all-iifs} &
  403.         Returns all iifs for this node. \
  404. proc[ifid]{iif2link} &
  405.         Returns the link object labelled with given interface
  406.         label. \
  407. proc[link]{link2iif} &
  408.         Returns the incoming interface label for the given
  409.         code{link}. \
  410. proc[oif]{oif2link} &
  411.         Returns the link object corresponding to the given outgoing
  412.         interface. \
  413. proc[link]{link2oif} &
  414.         Returns the outgoing interface for the code{link} (ns
  415.         object that is incident to the node).\
  416. proc[src]{rpf-nbr} &
  417.         Returns a handle to the neighbour node that is its next hop to the 
  418.         specified code{src}.\
  419. proc[s g]{getReps} &
  420.         Returns a handle to the replicator that matches tup{s, g}.
  421.         Either argument can be a wildcard (*). \
  422. proc[s g]{getReps-raw} &
  423.         As above, but returns a list of tup{key, handle} pairs. \
  424. proc[s g]{clearReps} &
  425.         Removes all replicators associated with tup{s, g}. \[2ex]
  426. end{alist}
  427. paragraph{Class Link and SimpleLink}
  428. This class provides methods to check the type of link, and the label it 
  429. affixes on individual packets that traverse it.
  430. There is one additional method to actually place the interface objects on this link.
  431. These methods are:
  432. begin{alist}
  433. proc[]{if-label?} & 
  434.         returns the interface label affixed by this link to packets
  435.         that traverse it. \
  436. % proc[]{enable-mcast} & 
  437. %       Internal procedure called by the SimpleLink constructor to add
  438. %       appropriate objects and state for multicast.  By default, (and
  439. %       for the point-to-point link case) it places a NetworkInterface
  440. %       object at the end of the link, and signals the nodes on
  441. %       incident on the link about this link.\
  442. end{alist}
  443. paragraph{Class NetworkInterface}
  444. This is a simple connector that is placed on each link.  It affixes
  445. its label id to each packet that traverses it.  The packet id is used
  446. by the destination node incident on that link to identify the link by
  447. which the packet reached it.  The label id is configured by the Link
  448. constructor.  This object is an internal object, and is not designed
  449. to be manipulated by user level simulation scripts.  The object only
  450. supports two methods:
  451. begin{alist}
  452. proc[ifid]{label} & 
  453.         assigns code{ifid} that this object will affix to each packet. \
  454. proc[]{label} & 
  455.         returns the label that this object affixes to each packet.\
  456. end{alist}
  457. The global class variable, code{ifacenum_}, specifies the next
  458. available code{ifid} number.
  459. paragraph{Class Multicast Classifier}
  460. code{Classifier/Multicast} maintains a emph{multicast forwarding
  461. cache}.  There is one multicast classifier per node. The node stores a
  462. reference to this classifier in its instance variable
  463. code{multiclassifier_}. When this classifier receives a packet, it
  464. looks at the tup{source, group} information in the packet headers,
  465. and the interface that the packet arrived from (the incoming interface
  466. or iif); does a lookup in the MFC and identifies the slot that should
  467. be used to forward that packet.  The slot will point to the
  468. appropriate replicator.
  469. However, if the classifier does not have an entry for this
  470. tup{source, group}, or the iif for this entry is different, it will
  471. invoke an upcall proc[]{new-group} for the classifier, with one of
  472. two codes to identify the problem:
  473. begin{itemize}
  474.         item code{cache-miss} indicates that the classifier did not
  475.         find any tup{source, group} entries;
  476.         item code{wrong-iif} indicates that the classifier found
  477.         tup{source, group} entries, but none matching the interface
  478.         that this packet arrived on.
  479. end{itemize}
  480. These upcalls to TCL give it a chance to correct the situation:
  481. install an appropriate MFC--entry (for code{cache-miss}) or change
  482. the incoming interface for the existing MFC--entry (for
  483. code{wrong-iif}).  The emph{return value} of the upcall determines
  484. what classifier will do with the packet.  If the return value is
  485. ``1'', it will assume that TCL upcall has appropriately modified MFC
  486. will try to classify packet (lookup MFC) for the second time.  If the
  487. return value is ``0'', no further lookups will be done, and the packet
  488. will be thus dropped.
  489. proc[]{add-rep} creates a slot in the classifier
  490. and adds a replicator for tup{source, group, iif} to that slot.
  491. paragraph{Class Replicator}
  492. When a replicator receives a packet, it copies the packet to all of
  493. its slots.  Each slot points to an outgoing interface for a particular
  494. tup{source, group}.
  495. If no slot is found, the C++ replicator invokes the class instance
  496. procedure proc[]{drop} to trigger protocol specific actions.  We will
  497. describe the protocol specific actions in the next section, when we
  498. describe the internal procedures of each of the multicast routing
  499. protocols.
  500. There are instance procedures to control the elements in each slot:
  501. begin{alist}
  502. proc[oif]{insert} & inserting a new outgoing interface
  503.                         to the next available slot.\
  504. proc[oif]{disable} & disable the slot pointing to the specified oif.\
  505. proc[oif]{enable} &  enable the slot pointing to the specified oif.\
  506. proc[]{is-active} & returns true if the replicator has at least one active slot.\
  507. proc[oif]{exists} & returns true if the slot pointing to the specified oif is active.\
  508. proc[source, group, oldiif, newiif]{change-iface} & modified the iif entry for the particular replicator.\
  509. end{alist}
  510. subsection{Protocol Internals}
  511. label{sec:mcastproto-internals}
  512. We now describe the implementation of the different multicast routing
  513. protocol agents.
  514. subsubsection{Centralized Multicast}
  515. code{CtrMcast} is inherits from code{McastProtocol}.
  516. One CtrMcast agent needs to be created for each node.  There is a
  517. central CtrMcastComp agent to compute and install multicast routes for
  518. the entire topology.  Each CtrMcast agent processes membership dynamic
  519. commands, and redirects the CtrMcastComp agent to recompute the
  520. appropriate routes.
  521. begin{alist}
  522. proc[]{join-group} &
  523.         registers the new member with the code{CtrMCastComp} agent, and
  524.         invokes that agent to recompute routes for that member. \
  525. proc[]{leave-group} & is the inverse of proc[]{join-group}. \
  526. proc[]{handle-cache-miss} &
  527.          called when no proper forwarding entry is found
  528.          for a particular packet source.
  529.         In case of centralized multicast,
  530.         it means a new source has started sending data packets.
  531.         Thus, the CtrMcast agent registers this new source with the
  532.         code{CtrMcastComp} agent.
  533.         If there are any members in that group, compute the new multicast tree.
  534.         If the group is in RPT (shared tree) mode, then
  535.         begin{enumerate} 
  536.         item create an encapsulation agent at the source;
  537.         item a corresponding decapsulation agent is created at the RP;
  538.         item the two agents are connected by unicast; and
  539.         item the tup{S,G} entry points its outgoing interface to the
  540.               encapsulation agent.
  541.         end{enumerate}
  542. end{alist}
  543. code{CtrMcastComp} is the centralised multicast route computation agent.
  544. begin{alist}
  545. proc[]{reset-mroutes} & 
  546.         resets all multicast forwarding entries.\
  547. proc[]{compute-mroutes} & 
  548.         (re)computes all multicast forwarding entries.\
  549. proc[source, group]{compute-tree} & 
  550.         computes a multicast tree for one source to reach all the
  551.         receivers in a specific group.\ 
  552. proc[source, group, member]{compute-branch} & 
  553.         is executed when a receiver joins a multicast group.  It could
  554.         also be invoked by proc[]{compute-tree} when it itself is
  555.         recomputing the multicast tree, and has to reparent all
  556.         receivers.  The algorithm starts at the receiver, recursively
  557.         finding successive next hops, until it either reaches the
  558.         source or RP, or it reaches a node that is already a part of
  559.         the relevant multicast tree.  During the process, several new
  560.         replicators and an outgoing interface will be installed.\
  561. proc[source, group, member]{prune-branch} & 
  562.         is similar to proc[]{compute-branch} except the outgoing
  563.         interface is disabled; if the outgoing interface list is empty
  564.         at that node, it will walk up the multicast tree, pruning at
  565.         each of the intermediate nodes, until it reaches a node that
  566.         has a non-empty outgoing interface list for the particular
  567.         multicast tree.
  568. end{alist}
  569. subsubsection{Dense Mode}
  570. begin{alist}
  571. proc[group]{join-group} & 
  572.         sends graft messages upstream if tup{S,G} does not contain
  573.         any active outgoing slots (ie, no downstream receivers).
  574.         If the next hop towards the source is a LAN, icrements a
  575.         counter of receivers for a particular group for the LAN\
  576. proc[group]{leave-group} & 
  577.         decrements LAN counters. \
  578. proc[srcID group iface]{handle-cache-miss} & 
  579.         depending on the value of code{CacheMissMode} calls either
  580.         code{handle-cache-miss-pimdm} or
  581.         code{handle-cache-miss-dvmrp}. \
  582. proc[srcID group iface]{handle-cache-miss-pimdm} &   
  583.         if the packet was received on the correct iif (from the node
  584.         that is the next hop towards the source), fan out the packet
  585.         on all oifs except the oif that leads back to the
  586.         next--hop--neighbor and oifs that are LANs for which this node
  587.         is not a forwarder. Otherwise, if the interface was incorrect,
  588.         send a prune back.\
  589. proc[srcID group iface]{handle-cache-miss-dvmrp} &
  590.         fans out the packet only to nodes for which this node is a
  591.         next hop towards the source (parent).\
  592. proc[replicator source group iface]{drop} & 
  593.         sends a prune message back to the previous hop.\
  594. proc[from source group iface]{recv-prune} & 
  595.         resets the prune timer if the interface had been pruned
  596.         previously; otherwise, it starts the prune timer and disables
  597.         the interface; furthermore, if the outgoing interface list
  598.         becomes empty, it propagates the prune message upstream.\
  599. proc[from source group iface]{recv-graft} & 
  600.         cancels any existing prune timer, andre-enables the pruned
  601.         interface.  If the outgoing interface list was previously
  602.         empty, it forwards the graft upstream.\
  603. proc[srcID group iface]{handle-wrong-iif} & 
  604.         This is invoked when the multicast classifier drops a packet
  605.         because it arrived on the wrong interface, and invoked
  606.         proc[]{new-group}.  This routine is invoked by
  607.         proc[]{mrtObject~instproc~new-group}.  When invoked, it sends
  608.         a prune message back to the source.\
  609. end{alist}
  610. subsection{The internal variables}
  611. begin{alist}
  612. textbf{Class mrtObject}hfill & \
  613. code{protocols_} &
  614.         An array of handles of protocol instances active at the node
  615.         at which this protocol operates indexed by incoming
  616.         interface. \
  617. code{mask-wkgroups} &
  618.         Class variable---defines the mask used to identify well known
  619.         groups. \
  620. code{wkgroups} &
  621.         Class array variable---array of allocated well known groups
  622.         addresses, indexed by the group name.  code{wkgroups}(Allocd)
  623.         is a special variable indicating the highest currently
  624.         allocated well known group. \[3ex]
  625. textbf{McastProtocol}hfill & \
  626. code{status_} &
  627.         takes values ``up'' or ``down'', to indicate the status of
  628.         execution of the protocol instance. \
  629. code{type_} &
  630.         contains the type (class name) of protocol executed by this
  631.         instance, eg, DM, or ST. \
  632. textbf{Simulator}hfill & \
  633. code{multiSim_} &
  634.         1 if multicast simulation is enabled, 0 otherwise.\
  635. code{MrtHandle_} &
  636.         handle to the centralised multicast simulation object.\[3ex]
  637. textbf{Node}hfill & \
  638. code{switch_} & 
  639.         handle for classifier that looks at the high bit of the
  640.         destination address in each packet to determine whether it is
  641.         a multicast packet (bit = 1) or a unicast packet (bit = 0).\
  642. code{multiclassifier_} & 
  643.         handle to classifier that performs the tup{s, g, iif} match. \
  644. code{replicator_} & 
  645.         array indexed by tup{s, g} of handles that replicate a
  646.         multicast packet on to the required links. \
  647. code{Agents_} & 
  648.         array indexed by multicast group of the list of agents at the
  649.         local node that listen to the specific group. \
  650. code{outLink_} & 
  651.         Cached list of outgoing interfaces at this node.\
  652. code{inLink_} &
  653.         Cached list of incoming interfaces at this node.\
  654. textbf{Link} and textbf{SimpleLink}hfill & \
  655. code{iif_} & 
  656.         handle for the NetworkInterface object placed on this link.\
  657. code{head_} & 
  658.         first object on the link, a no-op connector.  However, this
  659.         object contains the instance variable, code{link_}, that
  660.         points to the container Link object.\
  661. textbf{NetworkInterface}hfill & \
  662. code{ifacenum_} & 
  663.         Class variable---holds the next available interface
  664.         number.\
  665. end{alist}
  666. section{Commands at a glance}
  667. label{sec:mcastcommand}
  668. Following is a list of commands used for multicast simulations:
  669. begin{flushleft}
  670. code{set ns [new Simulator -mcast on]}\
  671. This turns the multicast flag on for the the given simulation, at the time of
  672. creation of the simulator object.
  673. code{ns_ multicast}\
  674. This like the command above turns the multicast flag on.
  675. code{ns_ multicast?}\
  676. This returns true if multicast flag has been turned on for the simulation
  677. and returns false if multicast is not turned on.
  678. code{$ns_ mrtproto <mproto> <optional:nodelist>}\
  679. This command specifies the type of multicast protocol <mproto> to be used
  680. like DM, CtrMcast etc. As an additional argument, the list of nodes <nodelist>
  681. that will run an instance of detailed routing protocol (other than
  682. centralised mcast) can also be passed.
  683. code{$ns_ mrtproto-iifs <mproto> <node> <iifs>}\
  684. This command allows a finer control than mrtproto. Since multiple mcast
  685. protocols can be run at a node, this command specifies which mcast protocol
  686. <mproto> to run at which of the incoming interfaces given by <iifs> in the <node>.
  687. code{Node allocaddr}\
  688. This returns a new/unused multicast address that may be used to assign a multicast
  689. address to a group.
  690. code{Node expandaddr}\
  691. THIS COMMAND IS OBSOLETE NOW
  692. This command expands the address space from 16 bits to 30 bits. However this
  693. command has been replaced by code{"ns_ set-address-format-expanded"}.
  694. code{$node_ join-group <agent> <grp>}\
  695. This command is used when the <agent> at the node joins a particular group <grp>.
  696. code{$node_ leave-group <agent> <grp>}\
  697. This is used when the <agent> at the nodes decides to leave the group <grp>.
  698. Internal methods:\
  699. code{$ns_ run-mcast}\
  700. This command starts multicast routing at all nodes. 
  701. code{$ns_ clear-mcast}\
  702. This stopd mcast routing at all nodes.
  703. code{$node_ enable-mcast <sim>}\
  704. This allows special mcast supporting mechanisms (like a mcast classifier) to
  705. be added to the mcast-enabled node. <sim> is the a handle to the simulator
  706. object.
  707. In addition to the internal methods listed here there are other methods specific to
  708. protocols like centralized mcast (CtrMcast), dense mode (DM), shared tree
  709. mode (ST) or bi-directional shared tree mode (BST), Node and Link class
  710. methods and NetworkInterface and Multicast classifier methods specific to
  711. multicast routing. All mcast related files may be found under
  712. ns/tcl/mcast directory. 
  713. begin{description}
  714. item[Centralised Multicast] A handle to the CtrMcastComp object is
  715. returned when the protocol is specified as `CtrMcast' in mrtproto. 
  716. Ctrmcast methods are: \
  717. code{$ctrmcastcomp switch-treetype group-addr}\
  718. Switch from the Rendezvous Point rooted shared tree to source-specific
  719. trees for the group specified by group-addr. Note that this method cannot
  720. be used to switch from source-specific trees back to a shared tree for a
  721. multicast group. 
  722. code{$ctrmcastcomp set_c_rp <node-list>}\
  723. This sets the RPs.
  724. code{$ctrmcastcomp set_c_bsr <node0:0> <node1:1>}\
  725. This sets the BSR, specified as list of node:priority.
  726. code{$ctrmcastcomp get_c_rp <node> <group>}\
  727. Returns the RP for the group as seen by the node node for the multicast
  728. group with address group-addr. Note that different nodes may see different
  729. RPs for the group if the network is partitioned as the nodes might be in
  730. different partitions. 
  731. code{$ctrmcastcomp get_c_bsr <node>}\
  732. Returns the current BSR for the group.
  733. code{$ctrmcastcomp compute-mroutes}\
  734. This recomputes multicast routes in the event of network dynamics or a
  735. change in unicast routes.
  736. item[Dense Mode]
  737. The dense mode (DM) protocol can be run as PIM-DM (default) or DVMRP
  738. depending on the class variable code{CacheMissMode}. There are no methods
  739. specific to this mcast protocol object. Class variables are:
  740.  begin{description}
  741.    item[PruneTimeout] Timeout value for prune state at nodes. defaults to
  742. 0.5sec.
  743.    item[CacheMissMode] Used to set PIM-DM or DVMRP type forwarding rules.
  744.  end{description}
  745. item[Shared Tree]
  746. There are no methods for this class. Variables are:
  747. begin{description}
  748. item[RP_] RP_ indexed by group determines which node is the RP for a
  749. particular group.
  750. end{description}
  751. item[Bidirectional Shared Tree]
  752. There are no methods for this class. Variable is same as that of Shared
  753. Tree described above.
  754. end{description}
  755. end{flushleft}
  756. endinput