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

通讯编程

开发平台:

Visual C++

  1. //
  2. // dr.hh           : Diffusion Routing Class Definitions
  3. // authors         : John Heidemann and Fabio Silva
  4. //
  5. // Copyright (C) 2000-2003 by the University of Southern California
  6. // $Id: dr.hh,v 1.17 2005/09/13 04:53:49 tomh Exp $
  7. //
  8. // This program is free software; you can redistribute it and/or
  9. // modify it under the terms of the GNU General Public License,
  10. // version 2, as published by the Free Software Foundation.
  11. //
  12. // This program is distributed in the hope that it will be useful,
  13. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. // GNU General Public License for more details.
  16. //
  17. // You should have received a copy of the GNU General Public License along
  18. // with this program; if not, write to the Free Software Foundation, Inc.,
  19. // 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
  20. //
  21. // Linking this file statically or dynamically with other modules is making
  22. // a combined work based on this file.  Thus, the terms and conditions of
  23. // the GNU General Public License cover the whole combination.
  24. //
  25. // In addition, as a special exception, the copyright holders of this file
  26. // give you permission to combine this file with free software programs or
  27. // libraries that are released under the GNU LGPL and with code included in
  28. // the standard release of ns-2 under the Apache 2.0 license or under
  29. // otherwise-compatible licenses with advertising requirements (or modified
  30. // versions of such code, with unchanged license).  You may copy and
  31. // distribute such a system following the terms of the GNU GPL for this
  32. // file and the licenses of the other code concerned, provided that you
  33. // include the source code of that other code when and as the GNU GPL
  34. // requires distribution of source code.
  35. //
  36. // Note that people who make modified versions of this file are not
  37. // obligated to grant this special exception for their modified versions;
  38. // it is their choice whether to do so.  The GNU General Public License
  39. // gives permission to release a modified version without this exception;
  40. // this exception also makes it possible to release a modified version
  41. // which carries forward this exception.
  42. // This file defines Diffusion Routing's Publish/Subscribe, Filter and
  43. // Timer APIs. It is included from diffapp.hh (and therefore
  44. // applications and filters should include diffapp.hh instead). For a
  45. // detailed description of the API, please look at the Diffusion
  46. // Routing API document (available at the SCADDS website:
  47. // http://www.isi.edu/scadds).
  48. #ifndef _DR_HH_
  49. #define _DR_HH_
  50. #ifdef HAVE_CONFIG_H
  51. #include "config.h"
  52. #endif // HAVE_CONFIG_H
  53. #include <pthread.h>
  54. #include <string.h>
  55. #include <math.h>
  56. #include <map>
  57. #include "main/timers.hh"
  58. #include "main/filter.hh"
  59. #include "main/config.hh"
  60. #include "main/iodev.hh"
  61. #include "main/tools.hh"
  62. #ifdef NS_DIFFUSION
  63. #include "diffagent.h"
  64. #endif // NS_DIFFUSION
  65. #ifdef UDP
  66. #include "drivers/UDPlocal.hh"
  67. #endif // UDP
  68. #define WAIT_FOREVER       -1
  69. #define POLLING_INTERVAL   10 // seconds
  70. #define SMALL_TIMEOUT      10 // milliseconds
  71. typedef long handle;
  72. class HandleEntry;
  73. class CallbackEntry;
  74. class DiffusionRouting;
  75. typedef list<HandleEntry *> HandleList;
  76. typedef list<CallbackEntry *> CallbackList;
  77. class TimerCallbacks {
  78. public:
  79.   virtual ~TimerCallbacks () {}
  80.   virtual int expire(handle hdl, void *p) = 0;
  81.   virtual void del(void *p) = 0;
  82. };
  83. class InterestCallback : public TimerCallback {
  84. public:
  85.   InterestCallback(DiffusionRouting *drt, HandleEntry *handle_entry) :
  86.     drt_(drt), handle_entry_(handle_entry) {};
  87.   ~InterestCallback() {};
  88.   int expire();
  89.   DiffusionRouting *drt_;
  90.   HandleEntry *handle_entry_;
  91. };
  92. class FilterKeepaliveCallback : public TimerCallback {
  93. public:
  94.   FilterKeepaliveCallback(DiffusionRouting *drt, FilterEntry *filter_entry) :
  95.     drt_(drt), filter_entry_(filter_entry) {};
  96.   ~FilterKeepaliveCallback() {};
  97.   int expire();
  98.   DiffusionRouting *drt_;
  99.   FilterEntry *filter_entry_;
  100. };
  101. class OldAPITimer : public TimerCallback {
  102. public:
  103.   OldAPITimer(TimerCallbacks *cb, void *p) :
  104.     cb_(cb), p_(p) {};
  105.   ~OldAPITimer() {};
  106.   int expire();
  107.   TimerCallbacks *cb_;
  108.   void *p_;
  109. };
  110. // Rmst specific definitions
  111. typedef map<int, void*, less<int> > Int2Frag;
  112. class RecRmst {
  113. public:
  114.   RecRmst(int id){rmst_no_ = id;}
  115.   ~RecRmst(){
  116.     void *tmp_frag_ptr;
  117.     Int2Frag::iterator frag_iterator;
  118.     for(frag_iterator=frag_map_.begin(); frag_iterator!=frag_map_.end(); ++frag_iterator){
  119.       tmp_frag_ptr = (void*)(*frag_iterator).second;
  120.       delete((char *)tmp_frag_ptr);
  121.     }
  122.   }
  123.   int rmst_no_;
  124.   int max_frag_;
  125.   int max_frag_len_;
  126.   int mtu_len_;
  127.   Int2Frag frag_map_;
  128. };
  129. typedef map<int, RecRmst*, less<int> > Int2RecRmst;
  130. class DiffusionRouting : public NR {
  131. public:
  132. #ifdef NS_DIFFUSION
  133.   DiffusionRouting(u_int16_t port, DiffAppAgent *da);
  134.   int getNodeId();               // node-id
  135.   int getAgentId(int id = -1);   // port-id
  136.   MobileNode *getNode(MobileNode *mn = 0)
  137.   {
  138.     if (mn != 0)
  139.       node_ = mn;
  140.     return node_;
  141.   };
  142. #else
  143.   DiffusionRouting(u_int16_t port);
  144.   void run(bool wait_condition, long max_timeout);
  145. #endif // NS_DIFFUSION
  146.   virtual ~DiffusionRouting();
  147.   // NR Publish/Subscribe API functions
  148.   handle subscribe(NRAttrVec *subscribe_attrs, NR::Callback *cb);
  149.   int unsubscribe(handle subscription_handle);
  150.   handle publish(NRAttrVec *publish_attrs);
  151.   int unpublish(handle publication_handle);
  152.   int send(handle publication_handle, NRAttrVec *send_attrs);
  153.   int sendRmst(handle publication_handle, NRAttrVec *send_attrs, int fragment_size);
  154.   // NR Filter API functions
  155.   handle addFilter(NRAttrVec *filter_attrs, u_int16_t priority,
  156.    FilterCallback *cb);
  157.   int removeFilter(handle filter_handle);
  158.   int sendMessage(Message *msg, handle h, u_int16_t priority = FILTER_KEEP_PRIORITY);
  159.   int addToBlacklist(int32_t node);
  160.   int clearBlacklist();
  161.   // NR Timer API functions
  162.   handle addTimer(int timeout, TimerCallback *callback);
  163.   // This is an old API function that will be discontinued in
  164.   // diffusion's next major release
  165.   handle addTimer(int timeout, void *param, TimerCallbacks *cb);
  166.   bool removeTimer(handle hdl);
  167.   // NR API functions that allow single thread support
  168.   void doIt();
  169.   void doOne(long timeout = WAIT_FOREVER);
  170.   int interestTimeout(HandleEntry *handle_entry);
  171.   int filterKeepaliveTimeout(FilterEntry *filter_entry);
  172. #ifndef NS_DIFFUSION
  173.   // Outside NS, all these can be protected members
  174. protected:
  175. #endif // !NS_DIFFUSION
  176.   void recvPacket(DiffPacket pkt);
  177.   void recvMessage(Message *msg);
  178. #ifdef NS_DIFFUSION
  179.   // In NS, the protected members start here
  180. protected:
  181.   // Handle to MobileNode
  182.   MobileNode *node_;
  183. #endif // NS_DIFFUSION
  184.   void sendMessageToDiffusion(Message *msg);
  185.   void sendPacketToDiffusion(DiffPacket pkt, int len, int dst);
  186.   bool processRmst(Message *msg);
  187.   void processMessage(Message *msg);
  188.   void processControlMessage(Message *msg);
  189.   bool checkSubscription(NRAttrVec *attrs);
  190.   bool checkPublication(NRAttrVec *attrs);
  191.   bool checkSend(NRAttrVec *attrs);
  192.   bool isPushData(NRAttrVec *attrs);
  193.   HandleEntry * removeHandle(handle my_handle, HandleList *hl);
  194.   HandleEntry * findHandle(handle my_handle, HandleList *hl);
  195.   FilterEntry * deleteFilter(handle my_handle);
  196.   FilterEntry * findFilter(handle my_handle);
  197.   bool hasScope(NRAttrVec *attrs);
  198.   // RMST support 
  199.   Int2RecRmst rec_rmst_map_;
  200.   // Handle variables
  201.   int next_handle_;
  202.   HandleList pub_list_;
  203.   HandleList sub_list_;
  204.   FilterList filter_list_;
  205.   // Threads and Mutexes
  206.   pthread_mutex_t *dr_mtx_;
  207.   // Data structures
  208.   TimerManager *timers_manager_;
  209.   // Lists
  210.   DeviceList in_devices_;
  211.   DeviceList local_out_devices_;
  212.   // Node-specific variables
  213.   u_int16_t diffusion_port_;
  214.   int pkt_count_;
  215.   int random_id_;
  216. #ifdef NS_DIFFUSION
  217.   int agent_id_;
  218. #else
  219.   u_int16_t agent_id_;
  220. #endif // NS_DIFFUSION
  221. };
  222. #endif // !_DR_HH_