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

通讯编程

开发平台:

Visual C++

  1. // 
  2. // nr.hh         : Network Routing Class Definitions
  3. // authors       : Dan Coffin, John Heidemann, Dan Van Hook
  4. // authors       : Fabio Silva
  5. // 
  6. // Copyright (C) 2000-2003 by the University of Southern California
  7. // $Id: nr.hh,v 1.13 2005/09/13 04:53:50 tomh Exp $
  8. //
  9. // This program is free software; you can redistribute it and/or
  10. // modify it under the terms of the GNU General Public License,
  11. // version 2, as published by the Free Software Foundation.
  12. //
  13. // This program is distributed in the hope that it will be useful,
  14. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16. // GNU General Public License for more details.
  17. //
  18. // You should have received a copy of the GNU General Public License along
  19. // with this program; if not, write to the Free Software Foundation, Inc.,
  20. // 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
  21. //
  22. // Linking this file statically or dynamically with other modules is making
  23. // a combined work based on this file.  Thus, the terms and conditions of
  24. // the GNU General Public License cover the whole combination.
  25. //
  26. // In addition, as a special exception, the copyright holders of this file
  27. // give you permission to combine this file with free software programs or
  28. // libraries that are released under the GNU LGPL and with code included in
  29. // the standard release of ns-2 under the Apache 2.0 license or under
  30. // otherwise-compatible licenses with advertising requirements (or modified
  31. // versions of such code, with unchanged license).  You may copy and
  32. // distribute such a system following the terms of the GNU GPL for this
  33. // file and the licenses of the other code concerned, provided that you
  34. // include the source code of that other code when and as the GNU GPL
  35. // requires distribution of source code.
  36. //
  37. // Note that people who make modified versions of this file are not
  38. // obligated to grant this special exception for their modified versions;
  39. // it is their choice whether to do so.  The GNU General Public License
  40. // gives permission to release a modified version without this exception;
  41. // this exception also makes it possible to release a modified version
  42. // which carries forward this exception.
  43. #ifndef _NR_HH_
  44. #define _NR_HH_
  45. #ifdef HAVE_CONFIG_H
  46. #include "config.h"
  47. #endif // HAVE_CONFIG_H
  48. #include <stdio.h>
  49. #include <stdlib.h>
  50. #include <assert.h>
  51. #include <vector>
  52. #ifdef NS_DIFFUSiON
  53. #include "config.h"
  54. #endif // NS_DIFFUSION
  55. using namespace std;
  56. #ifndef __CYGWIN__
  57. typedef signed int int32_t;
  58. #endif
  59. typedef signed short int16_t;
  60. #if defined (__SVR4) && defined (__sun)
  61. typedef char int8_t;
  62. #else
  63. // Conflicts with system declaration of int8_t in Solaris
  64. typedef signed char int8_t;
  65. #endif // sparc
  66. #define FAIL -1
  67. #define OK    0
  68. class NRAttribute;
  69. typedef vector<NRAttribute *> NRAttrVec;
  70. /*
  71.  * xxx: gcc-2.91.66 doesn't handle member templates completely
  72.  * (it worked for NRSimpleFactory<> but not for Blob and String
  73.  * factories.  A work-around is to move all the templates out
  74.  * to top-level code.
  75.  * I'm told (by a gcc-developer) that this limitation is fixed
  76.  * in gcc-2.95.2.
  77.  */
  78. /*
  79.  * NRAttribute encapsulates a single, generic attribute.
  80.  */
  81. class NRAttribute {
  82. public:
  83.   enum keys {
  84.     // reserved constant values used for key
  85.     // range 1000-1499 is diffusion-specific
  86.     SCOPE_KEY = 1001,             // INT32_TYPE
  87.     CLASS_KEY = 1002,             // INT32_TYPE
  88.     ALGORITHM_KEY = 1003,         // INT32_TYPE
  89.     SUBSCRIPTION_ID_KEY = 1004,   // INT32_TYPE
  90.     FLOWS_KEY = 1005,             // BLOB_TYPE
  91.     // range 1500-1999 is reserved for system filters
  92.     REINFORCEMENT_KEY = 1500,     // BLOB_TYPE
  93.     LATITUDE_KEY = 1501,          // FLOAT_TYPE
  94.     LONGITUDE_KEY = 1502,         // FLOAT_TYPE
  95.     ROUTE_KEY = 1503,             // STRING_TYPE
  96.     SOURCE_ROUTE_KEY = 1504,      // STRING_TYPE
  97.     // range 2000-2999 is app specific
  98.     DATABLOCK_KEY = 2001,         // BLOB_TYPE
  99.     TASK_FREQUENCY_KEY = 2002,    // FLOAT_TYPE, in secs
  100.     TASK_NAME_KEY = 2003,         // STRING_TYPE
  101.     TASK_QUERY_DETAIL_KEY = 2004, // BLOB_TYPE
  102.     TARGET_KEY = 2005,            // STRING_TYPE
  103.     TARGET_RANGE_KEY = 2006,      // FLOAT_TYPE
  104.     CONFIDENCE_KEY = 2007,        // FLOAT_TYPE
  105.     // RMST Keys
  106.     RMST_DATA_KEY = 2010,         // BLOB_TYPE  The actual data (fragment)
  107.     RMST_ID_KEY = 2011,           // INT32_TYPE Unique ID for the frag set
  108.     RMST_FRAG_KEY = 2012,         // INT32_TYPE Fragment ID
  109.     RMST_MAX_FRAG_KEY = 2013,     // INT32_TYPE Largest frag id in set
  110.     RMST_TSPRT_CTL_KEY = 2014,    // INT32_TYPE Transport Control Messages
  111.     RMST_PKTS_SENT_KEY = 2015,    // INT32_TYPE Support for blacklisting
  112.     RMST_TARGET_KEY = 2016        // STRING_TYPE Type of Rmst Data
  113.     // range 3000-3999 is reserved for experimentation
  114.     // and user-defined keys
  115.   };
  116.   // Values for diffusion-specific keys (start these at high values,
  117.   // so we can do simple type checking)
  118.   enum classes { INTEREST_CLASS = 10010, DISINTEREST_CLASS, DATA_CLASS };
  119.   enum scopes { NODE_LOCAL_SCOPE = 11010, GLOBAL_SCOPE };
  120.   enum algorithms { ONE_PHASE_PULL_ALGORITHM = 12010,
  121.     TWO_PHASE_PULL_ALGORITHM,
  122.     ONE_PHASE_PUSH_ALGORITHM };
  123.   // Key Type values
  124.   enum types { INT32_TYPE,    // 32-bit signed integer
  125.        FLOAT32_TYPE,  // 32-bit
  126.        FLOAT64_TYPE,  // 64-bit
  127.        STRING_TYPE,   // UTF-8 format, max length 1024 chars
  128.        BLOB_TYPE };   // uninterpreted binary data
  129.   // Match Operator values
  130.   enum operators { IS, LE, GE, LT, GT, EQ, NE, EQ_ANY };
  131.   // with EQ_ANY, the val is ignored
  132.   NRAttribute();
  133.   NRAttribute(int key, int type, int op, int len, void *val = NULL);
  134.   NRAttribute(const NRAttribute &rhs);
  135.   virtual ~NRAttribute();
  136.   static NRAttribute * find_key(int key, NRAttrVec *attrs,
  137. NRAttrVec::iterator *place = NULL) {
  138.     return find_key_from(key, attrs, attrs->begin(), place);
  139.   };
  140.   static NRAttribute * find_key_from(int key, NRAttrVec *attrs,
  141.      NRAttrVec::iterator start,
  142.      NRAttrVec::iterator *place = NULL);
  143.   NRAttribute * find_matching_key_from(NRAttrVec *attrs,
  144.        NRAttrVec::iterator start,
  145.        NRAttrVec::iterator *place = NULL) {
  146.     return find_key_from(key_, attrs, start, place);
  147.   };
  148.   NRAttribute * find_matching_key(NRAttrVec *attrs,
  149.   NRAttrVec::iterator *place = NULL) {
  150.     return find_key_from(key_, attrs, attrs->begin(), place);
  151.   };
  152.   int32_t getKey() { return key_; };
  153.   int8_t getType() { return type_; };
  154.   int8_t getOp() { return op_; };
  155.   int16_t getLen() { return len_; };
  156.   void * getGenericVal() { return val_; };
  157.   bool isSameKey(NRAttribute *attr) {
  158.     return ((type_ == attr->getType()) && (key_ == attr->getKey()));
  159.   };
  160.   bool isEQ(NRAttribute *attr);
  161.   bool isGT(NRAttribute *attr);
  162.   bool isGE(NRAttribute *attr);
  163.   bool isNE(NRAttribute *attr) {
  164.     return (!isEQ(attr));
  165.   };
  166.   bool isLT(NRAttribute *attr) {
  167.     return (!isGE(attr));
  168.   };
  169.   bool isLE(NRAttribute *attr) {
  170.     return (!isGT(attr));
  171.   };
  172. protected:
  173.   int32_t key_;
  174.   int8_t  type_;
  175.   int8_t  op_;
  176.   int16_t len_;
  177.   void *val_;
  178. };
  179. /*
  180.  * NRSimpleAttribute<X> provide type-safe ways to accesss generic attributes
  181.  * of type X.
  182.  *
  183.  * We specialize for strings and blobs to handle lengths properly.
  184.  */
  185. template<class T>
  186. class NRSimpleAttribute : public NRAttribute{
  187. public:
  188.   NRSimpleAttribute(int key, int type, int op, T val, int size = 0) :
  189.     NRAttribute(key, type, op, sizeof(T)) {
  190.     assert(type != STRING_TYPE && type != BLOB_TYPE);
  191.     val_ = new T(val);
  192.   }
  193.   ~NRSimpleAttribute() {
  194.     assert(type_ != STRING_TYPE && type_ != BLOB_TYPE);
  195.     delete (T*) val_;
  196.   };
  197.   T getVal() { return *(T*)val_; };
  198.   int getLen() { return len_; };
  199.   void setVal(T value) { *(T *)val_ = value; };
  200. };
  201. // string specialization
  202. template <>
  203. class NRSimpleAttribute<char *>: public NRAttribute {
  204. public:
  205.   NRSimpleAttribute(int key, int type, int op, char *val, int size = 0);
  206.   ~NRSimpleAttribute() {
  207.     assert(type_ == STRING_TYPE);
  208.     delete [] (char *) val_;
  209.   };
  210.   char * getVal() { return (char *)val_; };
  211.   int getLen() {return len_; };
  212.   void setVal(char *value);
  213. };
  214. // blob specialization
  215. template <>
  216. class NRSimpleAttribute<void *>: public NRAttribute {
  217. public:
  218.   NRSimpleAttribute(int key, int type, int op, void *val, int size);
  219.   ~NRSimpleAttribute() {
  220.     assert(type_ == BLOB_TYPE);
  221.     delete [] (char *) val_;
  222.   };
  223.   void * getVal() { return (void *)val_; };
  224.   int getLen() {return len_; };
  225.   void setVal(void *value, int len);
  226. };
  227. /*
  228.  * NRAttributeFactory and NRSimpleAttributeFactory
  229.  * are used to define "factories" that make attributes of a given
  230.  * key and type.
  231.  *
  232.  * NRAttributeFactory only for internal use.
  233.  * (This class cannot be a template because of the static variables.)
  234.  */
  235. class NRAttributeFactory {
  236. protected:
  237.   int16_t key_;
  238.   int8_t type_;
  239.   NRAttributeFactory *next_;
  240.   static NRAttributeFactory *first_;
  241.   // Keep a list of all factories and verify that they don't conflict.
  242.   static void verify_unique(NRAttributeFactory *baby);
  243.   NRAttributeFactory(int key, int type) : key_(key), type_(type), next_(NULL) {};
  244. };
  245. /*
  246.  * NRAttributeFactory for users
  247.  */
  248. template<class T>
  249. class NRSimpleAttributeFactory : public NRAttributeFactory {
  250. public:
  251.   NRSimpleAttributeFactory(int key, int type) : NRAttributeFactory(key, type) {
  252.     verify_unique(this);
  253.   }
  254.   NRSimpleAttribute<T>* make(int op, T val, int size = -1) {
  255.     return new NRSimpleAttribute<T>(key_, type_, op, val, size);
  256.   };
  257.   NRSimpleAttribute<T>* find(NRAttrVec *attrs,
  258.      NRAttrVec::iterator *place = NULL) {
  259.     return (NRSimpleAttribute<T>*)NRAttribute::find_key_from(key_, attrs, attrs->begin(), place);
  260.   };
  261.   NRSimpleAttribute<T>* find_from(NRAttrVec *attrs,
  262.   NRAttrVec::iterator start,
  263.   NRAttrVec::iterator *place = NULL) {
  264.     return (NRSimpleAttribute<T>*)NRAttribute::find_key_from(key_, attrs, start, place);
  265.   };
  266.   int getKey() { return key_; };
  267.   int getType() { return type_; };
  268. };
  269. /*
  270.  * Some pre-defined attribute factories.
  271.  * There's no reason these can't also appear in user code.
  272.  * (Not all factories need to be defined here.)
  273.  */
  274. extern NRSimpleAttributeFactory<int> NRScopeAttr;
  275. extern NRSimpleAttributeFactory<int> NRClassAttr;
  276. extern NRSimpleAttributeFactory<int> NRAlgorithmAttr;
  277. extern NRSimpleAttributeFactory<int> NRSubscriptionAttr;
  278. extern NRSimpleAttributeFactory<void *> NRFlowAttr;
  279. extern NRSimpleAttributeFactory<float> LatitudeAttr;
  280. extern NRSimpleAttributeFactory<float> LongitudeAttr;
  281. extern NRSimpleAttributeFactory<char *> RouteAttr;
  282. extern NRSimpleAttributeFactory<char *> SourceRouteAttr;
  283. extern NRSimpleAttributeFactory<void *> ReinforcementAttr;
  284. /*
  285.  * RMST related attribute factories (used by the rmst filter as well as
  286.  * the rmst sample applications and the library api)
  287.  */
  288. extern NRSimpleAttributeFactory<int> RmstIdAttr;
  289. extern NRSimpleAttributeFactory<int> RmstFragAttr;
  290. extern NRSimpleAttributeFactory<int> RmstMaxFragAttr;
  291. extern NRSimpleAttributeFactory<void *> RmstDataAttr;
  292. extern NRSimpleAttributeFactory<int> RmstTsprtCtlAttr;
  293. extern NRSimpleAttributeFactory<int> RmstPktsSentAttr;
  294. extern NRSimpleAttributeFactory<char *> RmstTargetAttr;
  295. /* Defines for RmstTsprtCtlAttr */
  296. #define RMST_RESP 1   // Normal fragment message
  297. #define NAK_REQ   2   // Request from sink for missing fragment
  298. #define ACK_RESP  3   // Ack Response (Blob complete) from sink or caching node
  299. #define RMST_CONT 4   // Flow control (temporary)
  300. #define EXP_REQ   5   // Request for new path
  301. #ifdef NS_DIFFUSION
  302. class DiffAppAgent;
  303. #endif // NS_DIFFUSION
  304. class NR {
  305. public:
  306.   typedef long handle;
  307.   virtual ~NR () {}
  308.   class Callback {
  309.   public:
  310.     virtual ~Callback () {}
  311.     virtual void recv(NRAttrVec *data, handle h) = 0;
  312.   };
  313.   // Factory to create an NR class specialized for ISI-W or MIT-LL's
  314.   // implementation (whichever is compiled in).
  315. #ifdef NS_DIFFUSION
  316.   static NR * create_ns_NR(u_int16_t port, DiffAppAgent *da);
  317. #else
  318.   static NR * createNR(u_int16_t port = 0);
  319. #endif // NS_DIFFUSION
  320.   virtual handle subscribe(NRAttrVec *interest_declarations,
  321.    NR::Callback * cb) = 0;
  322.   virtual int unsubscribe(handle subscription_handle) = 0;
  323.   virtual handle publish(NRAttrVec *publication_declarations) = 0;
  324.   virtual int unpublish(handle publication_handle) = 0;
  325.   virtual int send(handle publication_handle, NRAttrVec *) = 0;
  326. };
  327.     
  328. #endif // !_NR_HH_