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

通讯编程

开发平台:

Visual C++

  1. %
  2. % personal commentary:
  3. %        DRAFT DRAFT DRAFT
  4. %        - KFALL
  5. %
  6. section{shdr{Packet Fowarding}{classifier.h}{sec:classroute}}
  7. Routing generally refers to the selection of a packet's path
  8. through the network in conjunction with the machinery
  9. to accomplish packet forwarding at each node.
  10. The path selection is ordinarily accomplished by means
  11. of a distributed algorithm capable of detecting link
  12. failures and adjusting switch nodes to route packets
  13. around failed links (if possible).
  14. Path selection may also be statically configured.
  15. Packet fowarding refers to the delivery of a packet
  16. at a routing node to its downstream neighbor(s), and
  17. relies on a {em routing table} having been previously
  18. set up by the path selection algorithm.
  19. In this section, we explain how the packet forwarding
  20. function is carried out.
  21. This function may be subdivided into unicast and
  22. multicast fowarding, which operate somewhat differently.
  23. Routing table set-up, as accomplished by
  24. dynamic routing protocols, are
  25. described elsewhere (see section ref{sec:dynroute}).
  26. A packet arriving at a node is inspected to determine
  27. its destination (and possibly source) address fields.
  28. The field values are used to map the packet to a
  29. simulator object representing the next downstream recipient
  30. of the packet.
  31. Overall, this process is called {em classifying} the packet, and
  32. is performed by a code{Classifier} object.
  33. In the case of unicast packet delivery, the destination address
  34. is used to find an entry in the node's routing table
  35. indicating the proper next hop address.
  36. For multicasting, the destination specifies the
  37. {em group} identifier; any node subscribed to the specified
  38. group will receive the packet.
  39. In the multicast case, the routing table contains a reference
  40. to a special objects which {em replicate} packets to
  41. multiple destinations, implying multiple copies of the packet may emerge
  42. from a single router.
  43. Furthermore, the source address is used in multicast
  44. routing to determine which links the packet should {em not}
  45. be forwarded across (see below).
  46. subsection{shdr{the Classifier Classes}{classifier.h}{sec:classifiers}}
  47. A classifier provides a way to match a packet against some
  48. logical criteria and retrieve a reference to another simulation
  49. object based on the match results.
  50. Each classifier contains a table of simulation objects indexed
  51. by {em slot number}.
  52. The job of a classifier is to determine the slot number associated
  53. with a received packet and return the corresponding object reference
  54. from the table.
  55. The C++ class code{Classifier} provides a base class for all such
  56. derived classes.  It is defined in code{classifier.h} as follows:
  57. begin{small}
  58. begin{verbatim}
  59.         class Classifier : public NsObject {
  60.          public:
  61.                 ~Classifier();
  62.                 void recv(Packet*, Handler* h = 0);
  63.          protected:
  64.                 Classifier();
  65.                 void install(int slot, NsObject*);
  66.                 void clear(int slot);
  67.                 virtual int command(int argc, const char*const* argv);
  68.                 virtual int classify(Packet *const) = 0;
  69.                 void alloc(int);
  70.                 NsObject** slot_;       /* table that maps slot number to a NsObject */
  71.                 int nslot_;
  72.                 int maxslot_;
  73.         };
  74. end{verbatim}
  75. end{small}
  76. The code{classify} function is pure virtual, indicating the
  77. class code{Classifier} is to be used only as a base class.
  78. The code{alloc} function dynamically allocates enough space
  79. in the table to hold the specified number of slots.
  80. The code{install} and code{clear} functions add to or remove
  81. objects from the table.
  82. The code{recv} function and OTcl interface is implemented
  83. as follows in code{classifier.cc}:
  84. begin{small}
  85. begin{verbatim}
  86.         /*
  87.          * objects only ever see "packet" events, which come either
  88.          * from an incoming link or a local agent (i.e., packet source).
  89.          */
  90.         void Classifier::recv(Packet* p, Handler*)
  91.         {
  92.                 NsObject* node;
  93.                 int cl = classify(p);
  94.                 if (cl < 0 || cl >= nslot_ || (node = slot_[cl]) == 0) {
  95.                         Tcl::instance().evalf("%s no-slot %d", name(), cl);
  96.                         Packet::free(p);
  97.                         return;
  98.                 }
  99.                 node->recv(p);
  100.         }
  101.         int Classifier::command(int argc, const char*const* argv)
  102.         {
  103.                 Tcl& tcl = Tcl::instance();
  104.                 if (argc == 3) {
  105.                         /*
  106.                          * $classifier clear $slot
  107.                          */
  108.                         if (strcmp(argv[1], "clear") == 0) {
  109.                                 int slot = atoi(argv[2]);
  110.                                 clear(slot);
  111.                                 return (TCL_OK);
  112.                         }
  113.                 } else if (argc == 4) {
  114.                         /*
  115.                          * $classifier install $slot $node
  116.                          */
  117.                         if (strcmp(argv[1], "install") == 0) {
  118.                                 int slot = atoi(argv[2]);
  119.                                 NsObject* node = (NsObject*)TclObject::lookup(argv[3]);
  120.                                 install(slot, node);
  121.                                 return (TCL_OK);
  122.                         }
  123.                 }
  124.                 return (NsObject::command(argc, argv));
  125.         }
  126. end{verbatim}
  127. end{small}
  128. The primary execution path through a classifier is through the
  129. code{recv} function, which uses the derived class' version of
  130. the code{classify} method to determine the slot index.
  131. Assuming an object exists in the table at the returned index that
  132. object is given the packet.
  133. If the code{classify} function returns a slot index outside
  134. the allocated range of objects or the object reference is
  135. null, then the tcl procedure code{Classifier no-slot} is invoked
  136. with the slot number.
  137. Presently this OTcl procedure prints an error message and terminates
  138. the simulation.
  139. The primary Otcl interface is provided by the code{command} function,
  140. which provides for adding or removing objects to/from the
  141. object table.
  142. subsection{shdr{Address Classifiers}{classifier-addr.cc}{sec:classaddr}}
  143. An address classifier is used in supporting unicast packet
  144. forwarding.
  145. It applies a bitwise shift and mask operation to a packet's destination
  146. address to produce a slot number.
  147. The slot number is returned from the code{classify} function.
  148. The code{AddressClassifier} class is defined in
  149. code{classifier-addr.cc} as follows:
  150. begin{small}
  151. begin{verbatim}
  152.         class AddressClassifier : public Classifier {
  153.         public:
  154.                 AddressClassifier() : mask_(~0), shift_(0) {
  155.                         bind("mask_", (int*)&mask_);
  156.                         bind("shift_", &shift_);
  157.                 }
  158.         protected:
  159.                 int classify(Packet *const p) {
  160.                         IPHeader *h = IPHeader::access(p->bits());
  161.                         return ((h->dst() >> shift_) & mask_);
  162.                 }
  163.                 nsaddr_t mask_;
  164.                 int shift_;
  165.         };
  166. end{verbatim}
  167. end{small}
  168. The class imposes no direct semantic meaning on a packet's destination
  169. address field.
  170. Rather, it returns some number of the high-order bits as the slot
  171. number used in the code{Classifier::recv()} function.
  172. The code{mask_} and code{shift_} values are set through OTcl.
  173. subsection{shdr{Multicast Classifiers}{classifier-mcast.cc}{sec:classmcast}}
  174. The multicast classifier classifies packets according to both source
  175. and destination (group) addresses.
  176. It maintains a (chained hash) table mapping source/group pairs to slot
  177. numbers.
  178. When a packet arrives containing a source/group unknown to the
  179. classifier, it invokes an Otcl procedure code{MultiNode new-group} to
  180. add an entry to its table.
  181. This OTcl procedure may use the method code{set-hash} to add
  182. new (source, group, slot) 3-tuples to the classifier's table.
  183. The multicast classifier is defined in code{classifier-mcast.cc}
  184. as follows:
  185. begin{small}
  186. begin{verbatim}
  187.         static class MCastClassifierClass : public TclClass {
  188.         public:
  189.                 MCastClassifierClass() : TclClass("Classifier/Multicast") {}
  190.                 TclObject* create(int argc, const char*const* argv) {
  191.                         return (new MCastClassifier());
  192.                 }
  193.         } class_mcast_classifier;
  194.         class MCastClassifier : public Classifier {
  195.         public:
  196.                 MCastClassifier();
  197.                 ~MCastClassifier();
  198.         protected:
  199.                 int command(int argc, const char*const* argv);
  200.                 int classify(Packet *const p);
  201.                 int findslot();
  202.                 void set_hash(nsaddr_t src, nsaddr_t dst, int slot);
  203.                 int hash(nsaddr_t src, nsaddr_t dst) const {
  204.                         u_int32_t s = src ^ dst;
  205.                         s ^= s >> 16;
  206.                         s ^= s >> 8;
  207.                         return (s & 0xff);
  208.                 }
  209.                 struct hashnode {
  210.                         int slot;
  211.                         nsaddr_t src;
  212.                         nsaddr_t dst;
  213.                         hashnode* next;
  214.                 };
  215.                 hashnode* ht_[256];
  216.                 const hashnode* lookup(nsaddr_t src, nsaddr_t dst) const;
  217.         };
  218.         int MCastClassifier::classify(Packet *const pkt)
  219.         {
  220.                 IPHeader *h = IPHeader::access(pkt->bits());
  221.                 nsaddr_t src = h->src() >> 8; /*XXX*/
  222.                 nsaddr_t dst = h->dst();
  223.                 const hashnode* p = lookup(src, dst);
  224.                 if (p == 0) {
  225.                         /*
  226.                          * Didn't find an entry.
  227.                          * Call tcl exactly once to install one.
  228.                          * If tcl doesn't come through then fail.
  229.                          */
  230.                         Tcl::instance().evalf("%s new-group %u %u", name(), src, dst);
  231.                         p = lookup(src, dst);
  232.                         if (p == 0)
  233.                                 return (-1);
  234.                 }
  235.                 return (p->slot);
  236.         }
  237. end{verbatim}
  238. end{small}
  239. The code{MCastClassifier} class implements a chained has table
  240. with hash function on the packet source and destination addresses.
  241. The hash function returns the slot number used to index the code{slot_}
  242. table in the underlying code{Classifier} object.
  243. A hash miss implies packet delivery to a previously-unknown group is
  244. occurring and OTcl is called to handle this situation.
  245. The OTcl code is expected to insert an appropriate entry into the
  246. hash table.
  247. The way this insertion is performed is in sectionref{sec:classotcl}, below.
  248. subsection{shdr{Replicator}{replicator.cc}{sec:classreplicator}}
  249. To support multicast packet forwarding, a classifier receiving a
  250. multicast packet from source $S$
  251. destined for group $G$ computes a hash function $h(S,G)$ giving
  252. a ``slot number'' in the classifier's object table.
  253. Thus, the maximum size of the table is $O(|S|times|G|)$.
  254. In multicast delivery, the packet must be copied once for
  255. each link leading to nodes subscribed to $G$ minus one.
  256. Production of additional copies of the packet is performed
  257. by a code{Replicator} class, defined in code{replicator.cc}:
  258. begin{small}
  259. begin{verbatim}
  260.         /*
  261.          * A replicator is not really a packet classifier but
  262.          * we simply find convenience in leveraging its slot table.
  263.          * (this object used to implement fan-out on a multicast
  264.          * router as well as broadcast LANs)
  265.          */
  266.         class Replicator : public Classifier {
  267.         public:
  268.                 Replicator();
  269.                 void recv(Packet*, Handler* h = 0);
  270.                 virtual int classify(Packet* const) {};
  271.         protected:
  272.                 int ignore_;
  273.         };
  274.         void Replicator::recv(Packet* p, Handler*)
  275.         {
  276.                 IPHeader *iph = IPHeader::access(p->bits());
  277.                 if (maxslot_ < 0) {
  278.                         if (!ignore_)
  279.                                 Tcl::instance().evalf("%s drop %u %u", name(), 
  280.                                         iph->src(), iph->dst());
  281.                         Packet::free(p);
  282.                         return;
  283.                 }
  284.                 for (int i = 0; i < maxslot_; ++i) {
  285.                         NsObject* o = slot_[i];
  286.                         if (o != 0)
  287.                                 o->recv(p->copy());
  288.                 }
  289.                 /* we know that maxslot is non-null */
  290.                 slot_[maxslot_]->recv(p);
  291.         }
  292. end{verbatim}
  293. end{small}
  294. This class is derived from code{Classifier}, but does not really
  295. classify packets.
  296. Rather, it replicates a packet, one for each entry in its
  297. table, and delivers the copies to each of the nodes listed
  298. in the table.
  299. The last entry in the table gets the ``original'' packet.
  300. The class over-rides the base class version of code{recv} with its
  301. own member function and defines the code{classify} function as empty.
  302. This function first determines if there are any downstream nodes to deliver
  303. the packet to.
  304. If not, this generally indicates no downstream node
  305. is interested in receiving packets destined for the packet's group and that
  306. a {em prune} message should be sent to cut the multicast distribution
  307. subtree rooted at the local node off from the overall distribution tree
  308. (see section ref{sec:mcastprune}).
  309. subsection{shdr{OTcl Support: Nodes and MultiNodes}{ns-mcast.tcl}{sec:classotcl}}
  310. The simulator may be configured in one of two modes, with support
  311. for multicast delivery optionally enabled.
  312. When only unicast delivery is enabled, the simulator object
  313. itself is of the class code{Simulator} and nodes in the simulation
  314. topology are of class code{Node}.
  315. With multicasting enabled, subclasses of these two classes,
  316. code{MultiSim} and code{MultiNode}, are used in their places.
  317. begin{figure}[h]
  318. centerline{psfig{figure=node.eps,width=3in,height=3in}}
  319. caption{label{pic:node}A Node object containing
  320. two address classifiers.
  321. The top classifier is used in unicast packet delivery to downstream
  322. nodes.
  323. The lower classifier is used for delivering packets to agents
  324. on the same node.}
  325. end{figure}
  326. subsubsection{shdr{Nodes}{ns-node.tcl}{sec:node}}
  327. Figure ref{pic:node} depicts a (unicast) node.
  328. This class is defined entirely in OTcl (it has no C++ shadow object),
  329. but makes use of a number of the C++ objects described above.
  330. The code{neighbor_} member variable is a list containing the
  331. OTcl handles for each downstream neighbor in the topology.
  332. The OTcl function code{Node add-neighbor} adds a node to this list.
  333. The code{agents_} member variable is a list containing the
  334. OTcl handles for each of the agents present on this node.
  335. Each of the agents has a {em port} number associated with it
  336. which is currently encoded in the low-order 8 bits of the destination
  337. address of each packet (XXX will this change? XXX).
  338. The code{classifier_} variable holds a reference to an address
  339. classifier which inspects an incoming packet to determine
  340. if it should be locally delivered or forwarded.
  341. In the case of local delivery, the packet is passed through another
  342. classifier which inspects the port identifier to determine which
  343. agent on the local node should receive the packet.
  344. Nodes are typically created and initialized by the
  345. code{Simulator node} method.
  346. This method creates a new code{Node} object, places a reference to
  347. it in the array code{Node_} (a member of the code{Simulator} class,
  348. indexed by node id number), and returns the newly-created node.
  349. When a new node is created it's initialization procedure
  350. code{Node init} assigns a new unique node identifier and
  351. creates the address classifier used to route to downstream nodes.
  352. At this point the classifier's object table (i.e. routing table) is empty
  353. and it has no attached agents.
  354. A collection of OTcl methods in the code{Node} class allow
  355. for manipulating the routing and agent dispatch tables.
  356. The code{add-route} function adds an entry in the 
  357. routing table causing packets destined for the specified destination address
  358. to be delivered to the specified object.
  359. The code{attach} method adds an agent to the node.
  360. It updates the code{agent_} list, allocates a new port ID and gives it
  361. to the agent, updates the {em local entry} in the routing table, and
  362. updates the code{dmux_} classifier to point to the agent given the
  363. corresponding port ID.
  364. The code{port} method looks up an agent on a node given its port ID.
  365. The code{reset} method resets all agents on the node by calling
  366. their individual code{reset} methods.
  367. begin{figure}[h]
  368. centerline{psfig{figure=multinode.eps,width=4in}}
  369. caption{label{pic:mnode}A MultiNode object includes all
  370. linkage as a Node object described above, plus a
  371. special set of replicators used to deliver copies of
  372. packets to all interested downstream neighbors.}
  373. end{figure}
  374. subsubsection{shdr{MultiNodes}{ns-mcast.tcl}{sec:multinode}}
  375. Figure ref{pic:mnode} depicts a multicast node.
  376. It is derived from the code{Node} class and is also implemented
  377. entirely in OTcl.
  378. The code{switch_} member variable
  379. contains a reference to a classifier used to separate
  380. multicast from unicast delivery.
  381. This object is set up such that all unicast traffic is
  382. passed through slot zero to the next classifier which operates
  383. identically to the routing classifier described in section~ref{sec:node}.
  384. The other classifier is of type code{Classifier/Multicast/Replicator}
  385. (in OTcl) which is shadowed by an object of type
  386. code{Classifier/Multicast} in C++
  387. (and defined in section~ref{sec:classmcast}).
  388. Its object entries are indexed by source/group pair and refer to
  389. code{Classifier/Replicator/Demuxer} objects which contain
  390. the per-source/group set of next-hop objects.
  391. These objects are shadowed by C++ objects of the
  392. class code{Classifier/Replicator}, described in section
  393. ref{sec:classreplicator}.
  394. The operation of MultiNode objects is closely related to
  395. the exchange of {em prune} and {em graft} messages used
  396. to establish multicast distribution trees.
  397. This is further explained in sectionref{sec:unknown}
  398. (XXX this needs to be written XXX).
  399. %%begin{figure}[h]
  400. %%centerline{psfig{figure=mcast_classes.eps,width=4in}}
  401. %%caption{label{pic:mcastclasses}Classes used to support multicasting
  402. %%and other related classes.  Class names in {bf bold} indicate
  403. %%the OTcl classes are shadowed by C++ objects.}
  404. %%end{figure}
  405. %%
  406. %%A number of classes are used in support of multicast delivery.
  407. %%Figure ref{pic:mcastclasses} illustrates their inheritance relationship.
  408. %%All classes depicted exist in the OTcl name space, and those in bold
  409. %%face type have underlying C++ classes as well.