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

通讯编程

开发平台:

Visual C++

  1. //
  2. // two_phase_pull.hh  : Two-Phase Pull/One-Phase Push Include File
  3. // author             : Fabio Silva and Chalermek Intanagonwiwat
  4. //
  5. // Copyright (C) 2000-2002 by the University of Southern California
  6. // $Id: two_phase_pull.hh,v 1.4 2005/09/13 04:53:47 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. #ifndef _GRADIENT_HH_
  43. #define _GRADIENT_HH_
  44. #ifdef HAVE_CONFIG_H
  45. #include "config.h"
  46. #endif // HAVE_CONFIG_H
  47. #include <algorithm>
  48. #include "diffapp.hh"
  49. #ifdef NS_DIFFUSION
  50. #include <tcl.h>
  51. #include "diffagent.h"
  52. #else
  53. #include "main/hashutils.hh"
  54. #endif // NS_DIFFUSION
  55. #define GRADIENT_FILTER_PRIORITY 75
  56. #define OLD_MESSAGE -1
  57. #define NEW_MESSAGE 1
  58. typedef list<Tcl_HashEntry *> HashList;
  59. class ReinforcementBlob {
  60. public:
  61.   ReinforcementBlob(int32_t rdm_id, int32_t pkt_num) :
  62.     rdm_id_(rdm_id), pkt_num_(pkt_num) {};
  63.   int32_t rdm_id_;
  64.   int32_t pkt_num_;
  65. };
  66. class HashEntry {
  67. public:
  68.   HashEntry(int32_t last_hop) : last_hop_(last_hop) {};
  69.   int32_t last_hop_;
  70. };
  71. class GradientEntry {
  72. public:
  73.   GradientEntry(int32_t node_addr) : node_addr_(node_addr)
  74.   {
  75.     GetTime(&tv_);
  76.     reinforced_ = false;
  77.   };
  78.   int32_t node_addr_;
  79.   struct timeval tv_;
  80.   bool reinforced_;
  81. };
  82. class AgentEntry {
  83. public:
  84.   AgentEntry(u_int16_t port) : port_(port)
  85.   {
  86.     GetTime(&tv_);
  87.   };
  88.   u_int16_t port_;
  89.   struct timeval tv_;
  90. };
  91. class DataNeighborEntry {
  92. public:
  93.   DataNeighborEntry(int32_t neighbor_id, int data_flag) :
  94.     neighbor_id_(neighbor_id), data_flag_(data_flag)
  95.   {
  96.     GetTime(&tv_);
  97.   };
  98.   int32_t neighbor_id_;
  99.   struct timeval tv_;
  100.   int data_flag_;
  101. };
  102. class AttributeEntry {
  103. public:
  104.   AttributeEntry(NRAttrVec *attrs) : attrs_(attrs) {
  105.     GetTime(&tv_);
  106.   };
  107.   ~AttributeEntry() {
  108.     ClearAttrs(attrs_);
  109.     delete attrs_;
  110.   };
  111.   struct timeval tv_;
  112.   NRAttrVec *attrs_;
  113. };
  114. typedef list<AttributeEntry *> AttributeList;
  115. typedef list<AgentEntry *> AgentList;
  116. typedef list<GradientEntry *> GradientList;
  117. typedef list<DataNeighborEntry *> DataNeighborList;
  118. class TppRoutingEntry {
  119. public:
  120.   TppRoutingEntry() {
  121.     GetTime(&tv_);
  122.   };
  123.   ~TppRoutingEntry() {
  124.     DataNeighborList::iterator data_neighbor_itr;
  125.     AttributeList::iterator attr_itr;
  126.     GradientList::iterator grad_itr;
  127.     AgentList::iterator agents_itr;
  128.     // Clear Attributes
  129.     ClearAttrs(attrs_);
  130.     delete attrs_;
  131.     // Clear the attribute list
  132.     for (attr_itr = attr_list_.begin(); attr_itr != attr_list_.end(); attr_itr++){
  133.       delete (*attr_itr);
  134.     }
  135.     attr_list_.clear();
  136.     // Clear the gradient list
  137.     for (grad_itr = gradients_.begin(); grad_itr != gradients_.end(); grad_itr++){
  138.       delete (*grad_itr);
  139.     }
  140.     gradients_.clear();
  141.     // Clear the local agent's list
  142.     for (agents_itr = agents_.begin(); agents_itr != agents_.end(); agents_itr++){
  143.       delete (*agents_itr);
  144.     }
  145.     agents_.clear();
  146.     // Clear the data neighbor's list
  147.     for (data_neighbor_itr = data_neighbors_.begin(); data_neighbor_itr != data_neighbors_.end(); data_neighbor_itr++){
  148.       delete (*data_neighbor_itr);
  149.     }
  150.     data_neighbors_.clear();
  151.   };
  152.   struct timeval tv_;
  153.   NRAttrVec *attrs_;
  154.   AgentList agents_;
  155.   GradientList gradients_;
  156.   AttributeList attr_list_;
  157.   DataNeighborList data_neighbors_;
  158. };
  159. typedef list<TppRoutingEntry *> RoutingTable;
  160. class GradientFilter;
  161. class GradientFilterReceive : public FilterCallback {
  162. public:
  163.   GradientFilterReceive(GradientFilter *app) : app_(app) {};
  164.   void recv(Message *msg, handle h);
  165.   GradientFilter *app_;
  166. };
  167. class DataForwardingHistory {
  168. public:
  169.   DataForwardingHistory()
  170.   {
  171.     data_reinforced_ = false;
  172.   };
  173.   ~DataForwardingHistory()
  174.   {
  175.     node_list_.clear();
  176.     agent_list_.clear();
  177.   };
  178.   bool alreadyForwardedToNetwork(int32_t node_id)
  179.   {
  180.     list<int32_t>::iterator list_itr;
  181.     list_itr = find(node_list_.begin(), node_list_.end(), node_id);
  182.     if (list_itr == node_list_.end())
  183.       return false;
  184.     return true;
  185.   };
  186.   bool alreadyForwardedToLibrary(u_int16_t agent_id)
  187.   {
  188.     list<u_int16_t>::iterator list_itr;
  189.     list_itr = find(agent_list_.begin(), agent_list_.end(), agent_id);
  190.     if (list_itr == agent_list_.end())
  191.       return false;
  192.     return true;
  193.   };
  194.   bool alreadyReinforced()
  195.   {
  196.     return data_reinforced_;
  197.   };
  198.   void sendingReinforcement()
  199.   {
  200.     data_reinforced_ = true;
  201.   };
  202.   void forwardingToNetwork(int32_t node_id)
  203.   {
  204.     node_list_.push_back(node_id);
  205.   };
  206.   void forwardingToLibrary(u_int16_t agent_id)
  207.   {
  208.     agent_list_.push_back(agent_id);
  209.   };
  210. private:
  211.   list<int32_t> node_list_;
  212.   list<u_int16_t> agent_list_;
  213.   bool data_reinforced_;
  214. };
  215. class GradientFilter : public DiffApp {
  216. public:
  217. #ifdef NS_DIFFUSION
  218.   GradientFilter(const char *dr);
  219.   int command(int argc, const char*const* argv);
  220.   void run() {}
  221. #else
  222.   GradientFilter(int argc, char **argv);
  223.   void run();
  224. #endif // NS_DIFFUSION
  225.   virtual ~GradientFilter()
  226.   {
  227.     // Nothing to do
  228.   };
  229.   void recv(Message *msg, handle h);
  230.   // Timers
  231.   void messageTimeout(Message *msg);
  232.   void interestTimeout(Message *msg);
  233.   void gradientTimeout();
  234.   void reinforcementTimeout();
  235.   int subscriptionTimeout(NRAttrVec *attrs);
  236. protected:
  237.   // General Variables
  238.   handle filter_handle_;
  239.   int pkt_count_;
  240.   int random_id_;
  241.   // Hashing structures
  242.   HashList hash_list_;
  243.   Tcl_HashTable htable_;
  244.   // Receive Callback for the filter
  245.   GradientFilterReceive *filter_callback_;
  246.   // List of all known datatypes
  247.   RoutingTable routing_list_;
  248.   // Setup the filter
  249.   handle setupFilter();
  250.   // Matching functions
  251.   TppRoutingEntry * findRoutingEntry(NRAttrVec *attrs);
  252.   void deleteRoutingEntry(TppRoutingEntry *routing_entry);
  253.   TppRoutingEntry * matchRoutingEntry(NRAttrVec *attrs, RoutingTable::iterator start, RoutingTable::iterator *place);
  254.   AttributeEntry * findMatchingSubscription(TppRoutingEntry *routing_entry, NRAttrVec *attrs);
  255.   // Data structure management
  256.   void updateGradient(TppRoutingEntry *routing_entry, int32_t last_hop, bool reinforced);
  257.   void updateAgent(TppRoutingEntry *routing_entry, u_int16_t source_port);
  258.   GradientEntry * findReinforcedGradients(GradientList *agents, GradientList::iterator start, GradientList::iterator *place);
  259.   GradientEntry * findReinforcedGradient(int32_t node_addr, TppRoutingEntry *routing_entry);
  260.   void deleteGradient(TppRoutingEntry *routing_entry, GradientEntry *gradient_entry);
  261.   void setReinforcementFlags(TppRoutingEntry *routing_entry, int32_t last_hop, int new_message);
  262.   // Message forwarding functions
  263.   void sendInterest(NRAttrVec *attrs, TppRoutingEntry *routing_entry);
  264.   void sendDisinterest(NRAttrVec *attrs, TppRoutingEntry *routing_entry);
  265.   void sendPositiveReinforcement(NRAttrVec *reinf_attrs, int32_t data_rdm_id,
  266.  int32_t data_pkt_num, int32_t destination);
  267.   void forwardData(Message *msg, TppRoutingEntry *routing_entry,
  268.    DataForwardingHistory *forwarding_history);
  269.   void forwardExploratoryData(Message *msg, TppRoutingEntry *routing_entry,
  270.       DataForwardingHistory *forwarding_history);
  271.   void forwardPushExploratoryData(Message *msg,
  272.   DataForwardingHistory *forwarding_history);
  273.   // Message Processing functions
  274.   void processOldMessage(Message *msg);
  275.   void processNewMessage(Message *msg);
  276.   // Hashing functions
  277.   HashEntry * getHash(unsigned int pkt_num, unsigned int rdm_id);
  278.   void putHash(HashEntry *new_hash_entry, unsigned int pkt_num, unsigned int rdm_id);
  279. };
  280. class TppGradientExpirationCheckTimer : public TimerCallback {
  281. public:
  282.   TppGradientExpirationCheckTimer(GradientFilter *agent) : agent_(agent) {};
  283.   ~TppGradientExpirationCheckTimer() {};
  284.   int expire();
  285.   GradientFilter *agent_;
  286. };
  287. class TppReinforcementCheckTimer : public TimerCallback {
  288. public:
  289.   TppReinforcementCheckTimer(GradientFilter *agent) : agent_(agent) {};
  290.   ~TppReinforcementCheckTimer() {};
  291.   int expire();
  292.   GradientFilter *agent_;
  293. };
  294. class TppMessageSendTimer : public TimerCallback {
  295. public:
  296.   TppMessageSendTimer(GradientFilter *agent, Message *msg) :
  297.     agent_(agent), msg_(msg) {};
  298.   ~TppMessageSendTimer()
  299.   {
  300.     delete msg_;
  301.   };
  302.   int expire();
  303.   GradientFilter *agent_;
  304.   Message *msg_;
  305. };
  306. class TppInterestForwardTimer : public TimerCallback {
  307. public:
  308.   TppInterestForwardTimer(GradientFilter *agent, Message *msg) :
  309.     agent_(agent), msg_(msg) {};
  310.   ~TppInterestForwardTimer()
  311.   {
  312.     delete msg_;
  313.   };
  314.   int expire();
  315.   GradientFilter *agent_;
  316.   Message *msg_;
  317. };
  318. class TppSubscriptionExpirationTimer : public TimerCallback {
  319. public:
  320.   TppSubscriptionExpirationTimer(GradientFilter *agent, NRAttrVec *attrs) :
  321.     agent_(agent), attrs_(attrs) {};
  322.   ~TppSubscriptionExpirationTimer()
  323.   {
  324.     ClearAttrs(attrs_);
  325.     delete attrs_;
  326.   };
  327.   int expire();
  328.   GradientFilter *agent_;
  329.   NRAttrVec *attrs_;
  330. };
  331. #endif // !_GRADIENT_HH_