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

通讯编程

开发平台:

Visual C++

  1. //
  2. // rmst_filter.hh  : RmstFilter Class
  3. // authors         : Fred Stann
  4. //
  5. // Include file for RmstFilter - Reliable Multi-Segment Transport
  6. //
  7. // Copyright (C) 2003 by the University of Southern California
  8. // $Id: rmst_filter.hh,v 1.3 2005/09/13 04:53:49 tomh Exp $
  9. //
  10. // This program is free software; you can redistribute it and/or
  11. // modify it under the terms of the GNU General Public License,
  12. // version 2, as published by the Free Software Foundation.
  13. //
  14. // This program is distributed in the hope that it will be useful,
  15. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17. // GNU General Public License for more details.
  18. //
  19. // You should have received a copy of the GNU General Public License along
  20. // with this program; if not, write to the Free Software Foundation, Inc.,
  21. // 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
  22. //
  23. // Linking this file statically or dynamically with other modules is making
  24. // a combined work based on this file.  Thus, the terms and conditions of
  25. // the GNU General Public License cover the whole combination.
  26. //
  27. // In addition, as a special exception, the copyright holders of this file
  28. // give you permission to combine this file with free software programs or
  29. // libraries that are released under the GNU LGPL and with code included in
  30. // the standard release of ns-2 under the Apache 2.0 license or under
  31. // otherwise-compatible licenses with advertising requirements (or modified
  32. // versions of such code, with unchanged license).  You may copy and
  33. // distribute such a system following the terms of the GNU GPL for this
  34. // file and the licenses of the other code concerned, provided that you
  35. // include the source code of that other code when and as the GNU GPL
  36. // requires distribution of source code.
  37. //
  38. // Note that people who make modified versions of this file are not
  39. // obligated to grant this special exception for their modified versions;
  40. // it is their choice whether to do so.  The GNU General Public License
  41. // gives permission to release a modified version without this exception;
  42. // this exception also makes it possible to release a modified version
  43. // which carries forward this exception.
  44. #ifndef RMST_FILTER_HH
  45. #define RMST_FILTER_HH
  46. #include <sys/types.h>
  47. #include <map>
  48. #include <list>
  49. #include "diffapp.hh"
  50. #include "rmst.hh"
  51. #define RMST_FILTER_PRIORITY 190
  52. // Union to convert pkt_num & rdm_id into a 64 bit key
  53. union LlToInt {
  54.   int64_t ll_val_;
  55.   int int_val_[2];
  56. };
  57. // Exploratory message log.  Keep track of the last hop of every
  58. // new exploratory message. Then when one is reinforced we can
  59. // identify the "back-channel" that is the reverse gradient from
  60. // sink to source.
  61. typedef struct _ExpLog{
  62.   int rmst_no_;
  63.   int32_t last_hop_;
  64. } ExpLog;
  65. typedef map<int64_t, ExpLog> Key2ExpLog;
  66. typedef struct _SendMsgData{
  67.   int rmst_no_;
  68.   int last_frag_sent_;
  69.   int exp_base_;
  70. } SendMsgData;
  71. typedef list<SendMsgData> SendList;
  72. typedef struct _NakMsgData{
  73.   int rmst_no_;
  74.   int frag_no_;
  75. } NakMsgData;
  76. typedef list<NakMsgData> NakList;
  77. typedef list<int32_t> Blacklist;
  78. class RmstFilter;
  79. // Method to be called when a message matches rmst-filter attributes.
  80. class RmstFilterCallback: public FilterCallback {
  81. public:
  82.   RmstFilter *app_;                     // initialzed in setupFilter
  83.   void recv(Message *msg, handle h);
  84. };
  85. class RmstFilter : public DiffApp {
  86. public:
  87. #ifdef NS_DIFFUSION
  88.   RmstFilter();
  89.   int command(int argc, const char*const* argv);
  90. #else
  91.   RmstFilter(int argc, char **argv);
  92. #endif // NS_DIFFUSION
  93.   
  94.   virtual ~RmstFilter(){};
  95.   void run();
  96.   void recv(Message *msg, handle h);
  97.   int processTimer(int rmst_no, int timer_type);
  98. private:
  99.   handle filter_handle_;     // filter handle
  100.   RmstFilterCallback *fcb_;  // filter callback routine
  101.   handle setupFilter();    // routine that adds filter
  102.   handle stat_timer_handle_;
  103.   // Message Processing
  104.   bool processMessage(Message *msg);
  105.   void processCtrlMessage(Message *msg);
  106.   Rmst* syncLocalCache(Message *msg);
  107.   void sendRmstToSink(Rmst *rmst_ptr);
  108.   void sendAckToSource(Rmst *rmst_ptr);
  109.   void sendExpReqUpstream(Rmst *rmst_ptr);
  110.   void sendContToSource(Rmst *rmst_ptr);
  111.   void setupNak(int rmst_id);
  112.   void cleanUpRmst(Rmst *rmst_ptr);
  113.   void processExpReq(Rmst *rmst_ptr, int frag_no);
  114.   Key2ExpLog exp_map_;
  115.   Int2Rmst rmst_map_;
  116.   SendList send_list_;
  117.   bool send_timer_active_;
  118.   handle send_timer_handle_;
  119.   int exp_gap_;
  120.   NakList nak_list_;
  121.   Blacklist black_list_;
  122.   int rdm_id_;
  123.   int pkt_count_;
  124.   bool local_sink_;
  125.   bool caching_mode_;
  126.   u_int16_t local_sink_port_;
  127.   NRAttrVec *interest_attrs_;
  128.   struct timeval last_data_rec_;
  129.   struct timeval last_sink_time_;
  130. };
  131. // Define Timer Types
  132. #define WATCHDOG_TIMER   1
  133. #define SEND_TIMER       2
  134. #define ACK_TIMER        3
  135. #define CLEANUP_TIMER    4
  136. // Define timer intervals. These intervals dictate how fast you send
  137. // packets through the sensor net, how often you check for holes,
  138. // how often you clean up cache residue, how frequently a source
  139. // prompts for a missing ACK. These parameters can be application
  140. // tuned. The send timer in particular can be altered depending on
  141. // the presence of a backpressure mechanism.
  142. // SEND_INTERVAL - Gap between initiating the sending of a fragment.
  143. // WATCHDOG_INTERVAL - How often we look for holes (missing fragments).
  144. // ACK_INTERVAL - How long we wait for an ACK after sending last fragment
  145. //                before re-sending the last fragment.
  146. // CLEANUP_INTERVAL - How often we clean up our cache.
  147. // The time is in milliseconds.
  148. #define SEND_INTERVAL 2000
  149. #define WATCHDOG_INTERVAL 10000
  150. #define ACK_INTERVAL 20000
  151. #define CLEANUP_INTERVAL 90000
  152. // Define time intervals used to make decisions.
  153. // These are application tunable.
  154. // These times are in seconds.
  155. #define RMST_BLACKLIST_WAIT 3600
  156. #define NAK_RESPONSE_WAIT 10
  157. #define NEXT_FRAG_WAIT 15
  158. #define ACK_WAIT 30
  159. #define LONG_CLEANUP_WAIT 90
  160. #define SHORT_CLEANUP_WAIT 30
  161. #define SINK_REFRESH_WAIT 120
  162. // Define the threshold at which a node blacklists an incoming link.
  163. // It is the percentage of upstream packets sent that are actually
  164. // received. If a node gets less than this percentage, the link
  165. // is blacklisted.
  166. #define BLACKLIST_THRESHOLD .60
  167. class RmstTimeout: public TimerCallback {
  168. public:
  169.   RmstTimeout(RmstFilter *rmst_flt, int no, int type);
  170.   int expire();
  171.   RmstFilter *filter_;
  172.   int rmst_no_;
  173.   int timer_type_;
  174. };
  175. // Define Send Timer Actions
  176. #define DELETE_FROM_QUEUE    1
  177. #define SEND_NEXT_FRAG       2
  178. #define DO_NOTHING           3
  179. #endif // RMST_FILTER_HH