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

通讯编程

开发平台:

Visual C++

  1. //
  2. // gear.hh         : GEAR Include File
  3. // authors         : Yan Yu and Fabio Silva
  4. //
  5. // Copyright (C) 2000-2002 by the University of Southern California
  6. // Copyright (C) 2000-2002 by the University of California
  7. // $Id: gear.hh,v 1.3 2005/09/13 04:53:48 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 _GEAR_HH_
  44. #define _GEAR_HH_
  45. #ifdef HAVE_CONFIG_H
  46. #include "config.h"
  47. #endif // HAVE_CONFIG_H
  48. #include <list>
  49. #ifdef HAVE_HASH_MAP
  50. #include <hash_map>
  51. #else
  52. #ifdef HAVE_EXT_HASH_MAP
  53. #include <ext/hash_map>
  54. #endif // HAVE_EXT_HASH_MAP
  55. #endif // HAVE_HASH_MAP
  56. #ifdef NS_DIFFUSION
  57. #include <mobilenode.h>
  58. #endif // NS_DIFFUSION
  59. #include "gear_attr.hh"
  60. #include "gear_tools.hh"
  61. #include "diffapp.hh"
  62. // Filter priorities for pre-processing and post-processing. The
  63. // gradient's filter priority has to be in between these two values in
  64. // order for GEAR to work properly
  65. #define GEOROUTING_PRE_FILTER_PRIORITY  170
  66. #define GEOROUTING_POST_FILTER_PRIORITY 20
  67. // Values used for defining timers
  68. #define BEACON_REQUEST_TIMER 150
  69. #define NEIGHBOR_TIMER       151
  70. // Energy values for GEAR
  71. #define GEO_INITIAL_ENERGY          1
  72. #define GEO_UNIT_ENERGY_FOR_SEND    0.001
  73. #define GEO_UNIT_ENERGY_FOR_RECV    0.001
  74. // Various beacon types
  75. enum geo_beacons {
  76.   GEO_REQUEST = 1, // Beacon request. Nodes should send a beacon reply
  77.    // in response
  78.   GEO_REPLY,       // Beacon reply. Sent in response to a beacon
  79.    // request. It also includes an heuristic value if
  80.    // requested on the beacon request
  81.   GEO_UPDATE       // Includes updates to a particular heuristic value
  82.    // (for a given destination). It is send only if
  83.    // the new value is sufficiently different from the
  84.    // previous one
  85. };
  86. // Various actions taken when forwarding interests
  87. enum geo_actions {
  88.   BROADCAST = 0,      // We are inside the target region, broadcast
  89.       // packet
  90.   BROADCAST_SUPPRESS, // All our neighbors are outside the target
  91.       // region, we should not forward this interest
  92.       // message
  93.   OUTSIDE_REGION      // We are still outside the target region,
  94.       // continue forwarding this interest message
  95.       // towards the region using unicast
  96. };
  97. #define GEO_BEACON_REPLY_PERIOD     100 // Sends at most one
  98. // beacon_reply message every
  99. // GEO_BEACON_REPLY_PERIOS
  100. // seconds
  101. #define GEO_NEIGHBOR_DELAY        30000 // In milli-seconds
  102. #define GEO_BEACON_REQUEST_CHECK_PERIOD 100000 // In milli-seconds
  103. #define GEO_NEIGHBOR_UPDATE                300 // In seconds
  104. #define GEO_NEIGHBOR_REQUEST_PERIOD (10 * GEO_NEIGHBOR_UPDATE) // In seconds
  105. #define GEO_NEIGHBOR_EXPIRED (5 * GEO_NEIGHBOR_UPDATE) // In seconds,
  106.                // this is how
  107.                // long a
  108.                // neighbor
  109.                // entry will
  110.                // last before
  111.                // being
  112.                // deleted
  113. // These values tell GEAR how much time to wait before sending a
  114. // beacon reply in response to a beacon request message
  115. #define GEO_BEACON_REPLY_DELAY   1500 // (msec) between receive and forward
  116. #define GEO_BEACON_REPLY_JITTER  1000 // (msec) jitter
  117. // These values tell GEAR how much to wait before sending a beacon
  118. // request or a beacon update message
  119. #define GEO_BEACON_DELAY   400 // (msec) between receive and forward
  120. #define GEO_BEACON_JITTER  200 // (msec) jitter
  121. #define INITIAL_ENERGY 1
  122. #define DEFAULT_VALID_PERIOD 10
  123. #define UNICAST_ORIGINAL 1
  124. #define BROADCAST_TYPE   2
  125. #define MAX_INT          10000
  126. #define MAX_PATH_LEN     200
  127. class Region {
  128. public:
  129.   void operator= (Region p) {center_ = p.center_; radius_ = p.radius_;}
  130.   void output()
  131.   {
  132.     center_.output();
  133.     DiffPrint(DEBUG_IMPORTANT, "-%f", radius_);
  134.   }
  135.   GeoLocation center_;
  136.   double radius_;
  137. };
  138. class GeoHeader {
  139. public:
  140.   int16_t pkt_type_;  // BROADCAST or UNICAST_ORIGINAL
  141.   int16_t path_len_;
  142.   Region dst_region_;
  143. };
  144.  
  145. class PktHeader {
  146. public:
  147.   int32_t pkt_num_;
  148.   int32_t rdm_id_;
  149.   int32_t prev_hop_;
  150.   int pkt_type_;
  151.   int path_len_;
  152.   Region dst_region_;
  153. };
  154. class NeighborEntry {
  155. public:
  156.   NeighborEntry(int32_t id, double longitude, double latitude,
  157. double remaining_energy) :
  158.   id_(id), longitude_(longitude), latitude_(latitude),
  159.   remaining_energy_(remaining_energy){
  160.     valid_period_ = DEFAULT_VALID_PERIOD;
  161.     GetTime(&tv_);
  162.   }
  163.   int32_t id_;
  164.   double longitude_;
  165.   double latitude_;
  166.   double remaining_energy_;
  167.   struct timeval tv_;
  168.   double valid_period_; // in seconds
  169. };
  170. class GeoRoutingFilter;
  171. typedef list<NeighborEntry *> NeighborList;
  172. typedef list<PktHeader *> PacketList;
  173.  
  174. class GeoFilterReceive : public FilterCallback {
  175. public:
  176.   GeoFilterReceive(GeoRoutingFilter *app) : app_(app) {};
  177.   void recv(Message *msg, handle h);
  178.   GeoRoutingFilter *app_;
  179. };
  180. class GeoRoutingFilter : public DiffApp {
  181. public:
  182. #ifdef NS_DIFFUSION
  183.   GeoRoutingFilter(const char *diffrtg);
  184.   int command(int argc, const char*const* argv);
  185. #else
  186.   GeoRoutingFilter(int argc, char **argv);
  187. #endif // NS_DIFFUSION
  188.   virtual ~GeoRoutingFilter()
  189.   {
  190.     // Nothing but exit
  191.   };
  192.   void run();
  193.   void recv(Message *msg, handle h);
  194.   // Timers
  195.   void messageTimeout(Message *msg);
  196.   void beaconTimeout();
  197.   void neighborTimeout();
  198.   
  199. protected:
  200.   // General Variables
  201.   handle pre_filter_handle_;
  202.   handle post_filter_handle_;
  203.   int pkt_count_;
  204.   int rdm_id_;
  205.   // Keep track when last beacon reply was sent
  206.   struct timeval last_beacon_reply_tv_;
  207.   // Keep track when last beacon request was sent
  208.   struct timeval last_neighbor_request_tv_;
  209.   
  210.   // Statistical data: location and remaining energy level
  211.   double geo_longitude_;
  212.   double geo_latitude_;
  213.   int num_pkt_sent_;
  214.   int num_pkt_recv_;
  215.   double initial_energy_;
  216.   double unit_energy_for_send_;
  217.   double unit_energy_for_recv_;
  218.   // List of all known neighbors, containing their location and energy
  219.   // information
  220.   NeighborList neighbors_list_;
  221.   // List of messages currently being processed
  222.   PacketList message_list_;
  223.   // Forwarding table
  224.   HeuristicValueTable h_value_table_;
  225.   LearnedCostTable learned_cost_table_;
  226.   
  227.   // Receive Callback for the filter
  228.   GeoFilterReceive *filter_callback_;
  229.   // Setup the filter
  230.   handle setupPostFilter();
  231.   handle setupPreFilter();
  232.   // Message Processing functions
  233.   void preProcessFilter(Message *msg);
  234.   void postProcessFilter(Message *msg);
  235.   // Message processing functions
  236.   PktHeader * preProcessMessage(Message *msg);
  237.   PktHeader * stripOutHeader(Message *msg);
  238.   PktHeader * retrievePacketHeader(Message *msg);
  239.   bool extractLocation(Message *msg,
  240.        float *longitude_min, float *longitude_max,
  241.        float *latitude_min, float *latitude_max);
  242.   GeoHeader * restoreGeoHeader(PktHeader *pkt_header, Message *msg);
  243.   void takeOutAttr(NRAttrVec *attrs, int32_t key);
  244.   // Neighbors related functions
  245.   NeighborEntry * findNeighbor(int32_t neighbor_id);
  246.   void updateNeighbor(int32_t neighbor_id, double neighbor_longitude,
  247.       double neighbor_latitude, double neighbor_energy);
  248.   bool checkNeighbors();
  249.   void sendNeighborRequest();
  250.   // Energy related functions
  251.   double remainingEnergy() {return INITIAL_ENERGY;}
  252.   // Cost estimation related functions
  253.   double retrieveLearnedCost(int neighbor_id, GeoLocation dst);
  254.   double estimateCost(int neighbor_id, GeoLocation dst);
  255.   // Routing related functions
  256.   int32_t findNextHop(GeoHeader *geo_header, bool greedy);
  257.   int floodInsideRegion(GeoHeader *geo_header);
  258.   double retrieveHeuristicValue(GeoLocation dst);
  259.   void broadcastHeuristicValue(GeoLocation dst, double new_heuristic_value);
  260.   // GetNodeLocation --> This will move to the library in the future
  261.   void getNodeLocation(double *longitude, double *latitude);
  262. };
  263. class GeoMessageSendTimer : public TimerCallback {
  264. public:
  265.   GeoMessageSendTimer(GeoRoutingFilter *agent, Message *msg) :
  266.     agent_(agent), msg_(msg) {};
  267.   ~GeoMessageSendTimer()
  268.   {
  269.     delete msg_;
  270.   };
  271.   int expire();
  272.   GeoRoutingFilter *agent_;
  273.   Message *msg_;
  274. };
  275. class GeoNeighborsTimer : public TimerCallback {
  276. public:
  277.   GeoNeighborsTimer(GeoRoutingFilter *agent) : agent_(agent) {};
  278.   ~GeoNeighborsTimer() {};
  279.   int expire();
  280.   GeoRoutingFilter *agent_;
  281. };
  282. class GeoBeaconRequestTimer : public TimerCallback {
  283. public:
  284.   GeoBeaconRequestTimer(GeoRoutingFilter *agent) : agent_(agent) {};
  285.   ~GeoBeaconRequestTimer() {};
  286.   int expire();
  287.   GeoRoutingFilter *agent_;
  288. };
  289. #endif // !_GEAR_HH_