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

通讯编程

开发平台:

Visual C++

  1. // Define classes for routing table representation and lookup
  2. // George F. Riley, Georgia Tech, Winter 2000
  3. // Defines several variations on routing table representations
  4. // and a method to determine the most memory efficient.
  5. #ifndef __RLOOKUP_H__
  6. #define __RLOOKUP_H__
  7. #include "routealgo/rnode.h"
  8. #include "routealgo/rbitmap.h"
  9. #include <iostream>
  10. #ifdef USE_HASH_MAP
  11. #include <hash_map>
  12. #include <hash_set>
  13. #else
  14. #include <map>
  15. #include <set>
  16. #endif
  17. typedef enum {
  18.   RL_NULL, RL_FIXED, RL_BITMAP, RL_HASH, RL_NEXTHOP, RL_LAST}
  19. RLookup_Types;
  20. typedef pair<nodeid_t, nodeid_t> LookupPair_t; // Node/NextHop Pair
  21. // Define an abstract base class that specifies functionality needed
  22. class RLookup {
  23. public :
  24.   RLookup();
  25.   virtual ~RLookup();
  26.   virtual RLookup_Types WhatType() const = 0; // Identifies the type of lookup
  27.   virtual void Populate(  // Popluate the table
  28.                         RoutingVec_t& r, // NextHop table
  29.                         RoutingVec_t& p, // Population counts
  30.                         nodeid_t d = NODE_NONE, // Default route
  31.                         nodeid_t o = NODE_NONE, // Routing table owner
  32.                         nodeid_t f = NODE_NONE, // First non-default
  33.                         nodeid_t l = NODE_NONE) // Last non-default
  34.                         = 0;
  35.   virtual void Populate(istream& is);           // Populate from log
  36.   virtual nodeid_t Lookup(nodeid_t) = 0;        // Return next hop given target
  37.   virtual size_t   Size() = 0;                  // Estimate size
  38.   virtual size_t   NumberEntries(){return 0;}   // Number of entries in table
  39.   virtual void     Log( ostream&);              // Log to ostream
  40.   static void Analyze(RoutingVec_t&,
  41.                       RoutingVec_t&,            // Population counts
  42.                       nodeid_t&, nodeid_t&, nodeid_t, nodeid_t&,nodeid_t&);
  43.   //  friend ostream& operator<<(ostream&, const RLookup& ); // Output a routing table
  44. };
  45. // The "Null" lookup is used when there is no routing table.
  46. // Handles the pathological case for a node with no neighbors
  47. class NOLookup : public RLookup {
  48. public :
  49.   NOLookup();
  50.   virtual ~NOLookup();
  51.   virtual RLookup_Types WhatType() const;
  52.   virtual void Populate(  // Popluate the table
  53.                         RoutingVec_t& r, // NextHop table
  54.                         RoutingVec_t& p, // Population counts
  55.                         nodeid_t d = NODE_NONE, // Default route
  56.                         nodeid_t o = NODE_NONE, // Routing table owner
  57.                         nodeid_t f = NODE_NONE, // First non-default
  58.                         nodeid_t l = NODE_NONE);// Last non-default
  59.   virtual nodeid_t Lookup(nodeid_t);
  60.   virtual size_t Size();
  61.   virtual void   Log( ostream&);              // Log to ostream
  62. };
  63. // The "Fixed" lookup is used when all routes are the same
  64. // Will always be the case for "leaf" nodes with only one neighbor
  65. class FRLookup : public  RLookup {
  66. public :
  67.   FRLookup();
  68.   virtual ~FRLookup();
  69.   nodeid_t Default() const { return m_Default;}
  70.   virtual RLookup_Types WhatType() const;
  71.   virtual void Populate(  // Popluate the table
  72.                         RoutingVec_t& r, // NextHop table
  73.                         RoutingVec_t& p, // Population counts
  74.                         nodeid_t d = NODE_NONE, // Default route
  75.                         nodeid_t o = NODE_NONE, // Routing table owner
  76.                         nodeid_t f = NODE_NONE, // First non-default
  77.                         nodeid_t l = NODE_NONE);// Last non-default
  78.   virtual nodeid_t Lookup(nodeid_t);
  79.   virtual size_t Size();
  80.   virtual void   Log( ostream&);              // Log to ostream
  81.   static  size_t EstimateSize(
  82.                         RoutingVec_t& r, // NextHop table
  83.                         RoutingVec_t& p, // Population counts
  84.                         nodeid_t d,      // Default route
  85.                         nodeid_t n,      // Number default
  86.                         nodeid_t o,      // Routing table owner
  87.                         nodeid_t f,      // First non-default
  88.                         nodeid_t l);     // Last non-default
  89.   //  friend ostream& operator<<(ostream&, const FRLookup& ); // Output a routing table
  90. private:
  91.   nodeid_t m_Default;  
  92. };
  93. // The "Bitmap" lookup is used when there are many "default" entries
  94. // and a few non-defaults clustered in a small range
  95. class BMLookup : public  RLookup {
  96. public :
  97.   BMLookup();
  98.   virtual ~BMLookup();
  99.   virtual RLookup_Types WhatType() const; // Identifies the type of lookup
  100.   virtual void Populate(  // Popluate the table
  101.                         RoutingVec_t& r, // NextHop table
  102.                         RoutingVec_t& p, // Population counts
  103.                         nodeid_t d = NODE_NONE, // Default route
  104.                         nodeid_t o = NODE_NONE, // Routing table owner
  105.                         nodeid_t f = NODE_NONE, // First non-default
  106.                         nodeid_t l = NODE_NONE);// Last non-default
  107.   virtual nodeid_t Lookup(nodeid_t);
  108.   virtual size_t   Size();
  109.   virtual size_t   NumberEntries();             // Number of entries in table
  110.   virtual void     Log( ostream&);              // Log to ostream
  111.   static  size_t   EstimateSize(
  112.                         RoutingVec_t& r, // NextHop table
  113.                         RoutingVec_t& p, // Population counts
  114.                         nodeid_t d,      // Default route
  115.                         nodeid_t n,      // Number default
  116.                         nodeid_t o,      // Routing table owner
  117.                         nodeid_t f,      // First non-default
  118.                         nodeid_t l);     // Last non-default
  119.   //  friend ostream& operator<<(ostream&, const BMLookup& ); // Output a bitmap routing table
  120. private:
  121.   nodeid_t     m_Default;  
  122.   nodeid_t     m_FirstNonDefault;
  123.   nodeid_t     m_LastNonDefault;
  124.   RoutingVec_t m_NVec;  // Neighbor vector
  125.   BitMap*      m_pBitMap; // Bitmap of non-default entries
  126. };
  127. // The "HashMap" lookup is used when the previous two methods do not work.
  128. // Uses the STL "hash_map" associative container to store non-default routes.
  129. // By default, this is OFF because hash_map is an SGI extension to STL,
  130. // not part of standard STL.
  131. #ifdef USE_HASH_MAP
  132. typedef hash_map<nodeid_t, nodeid_t,
  133.                  hash<nodeid_t>, equal_to<nodeid_t> > RouteMap_t;
  134. #else
  135. typedef map<nodeid_t, nodeid_t,  equal_to<nodeid_t> > RouteMap_t;
  136. #endif
  137. typedef RouteMap_t::iterator                          RouteMap_it;
  138. typedef RouteMap_t::value_type                        RoutePair_t;
  139. class HMLookup : public  RLookup {
  140. public :
  141.   HMLookup();
  142.   virtual ~HMLookup();
  143.   virtual RLookup_Types WhatType() const; // Identifies the type of lookup
  144.   virtual void Populate(  // Popluate the table
  145.                         RoutingVec_t& r, // NextHop table
  146.                         RoutingVec_t& p, // Population counts
  147.                         nodeid_t d = NODE_NONE, // Default route
  148.                         nodeid_t o = NODE_NONE, // Routing table owner
  149.                         nodeid_t f = NODE_NONE, // First non-default
  150.                         nodeid_t l = NODE_NONE);// Last non-default
  151.   virtual nodeid_t Lookup(nodeid_t);
  152.   virtual size_t   Size();
  153.   virtual size_t   NumberEntries();             // Number of entries in table
  154.   virtual void     Log( ostream&);              // Log to ostream
  155.   static  size_t   EstimateSize(
  156.                         RoutingVec_t& r, // NextHop table
  157.                         RoutingVec_t& p, // Population counts
  158.                         nodeid_t d,      // Default route
  159.                         nodeid_t n,      // Number default
  160.                         nodeid_t o,      // Routing table owner
  161.                         nodeid_t f,      // First non-default
  162.                         nodeid_t l);     // Last non-default
  163.   //  friend ostream& operator<<(ostream&, const HMLookup& ); // Output a routing table
  164. private:
  165.   nodeid_t     m_Default;  
  166.   RouteMap_t   m_RouteMap;
  167. };
  168. // Also included is the "inefficient" version for memory usage comparisons
  169. // NHLookup (NextHop) lookup just stores the next hop in a lookup array
  170. class NHLookup : public  RLookup {
  171. public :
  172.   NHLookup();
  173.   virtual ~NHLookup();
  174.   virtual RLookup_Types WhatType() const; // Identifies the type of lookup
  175.   virtual void Populate(  // Popluate the table
  176.                         RoutingVec_t& r, // NextHop table
  177.                         RoutingVec_t& p, // Population counts
  178.                         nodeid_t d = NODE_NONE, // Default route
  179.                         nodeid_t o = NODE_NONE, // Routing table owner
  180.                         nodeid_t f = NODE_NONE, // First non-default
  181.                         nodeid_t l = NODE_NONE);// Last non-default
  182.   virtual void Populate(istream& is);           // Populate from log
  183.   virtual nodeid_t Lookup(nodeid_t);
  184.   virtual size_t   Size();
  185.   virtual size_t   NumberEntries();             // Number of entries in table
  186.   virtual void     Log( ostream&);              // Log to ostream
  187.   static  size_t   EstimateSize(
  188.                         RoutingVec_t& r, // NextHop table
  189.                         RoutingVec_t& p, // Population counts
  190.                         nodeid_t d,      // Default route
  191.                         nodeid_t n,      // Number default
  192.                         nodeid_t o,      // Routing table owner
  193.                         nodeid_t f,      // First non-default
  194.                         nodeid_t l);     // Last non-default
  195. private:
  196.   RoutingVec_t   m_RouteTable;
  197. };
  198. #endif