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

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * gaf.h
  3.  * Copyright (C) 2000 by the University of Southern California
  4.  * $Id: gaf.h,v 1.4 2005/08/25 18:58:05 johnh Exp $
  5.  *
  6.  * This program is free software; you can redistribute it and/or
  7.  * modify it under the terms of the GNU General Public License,
  8.  * version 2, as published by the Free Software Foundation.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License along
  16.  * with this program; if not, write to the Free Software Foundation, Inc.,
  17.  * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
  18.  *
  19.  *
  20.  * The copyright of this module includes the following
  21.  * linking-with-specific-other-licenses addition:
  22.  *
  23.  * In addition, as a special exception, the copyright holders of
  24.  * this module give you permission to combine (via static or
  25.  * dynamic linking) this module with free software programs or
  26.  * libraries that are released under the GNU LGPL and with code
  27.  * included in the standard release of ns-2 under the Apache 2.0
  28.  * license or under otherwise-compatible licenses with advertising
  29.  * requirements (or modified versions of such code, with unchanged
  30.  * license).  You may copy and distribute such a system following the
  31.  * terms of the GNU GPL for this module and the licenses of the
  32.  * other code concerned, provided that you include the source code of
  33.  * that other code when and as the GNU GPL requires distribution of
  34.  * source code.
  35.  *
  36.  * Note that people who make modified versions of this module
  37.  * are not obligated to grant this special exception for their
  38.  * modified versions; it is their choice whether to do so.  The GNU
  39.  * General Public License gives permission to release a modified
  40.  * version without this exception; this exception also makes it
  41.  * possible to release a modified version which carries forward this
  42.  * exception.
  43.  *
  44.  */
  45. // Header file for grid-based adaptive fidelity algorithm 
  46. #ifndef ns_gaf_h
  47. #define ns_gaf_h
  48. #include <assert.h>
  49. #include "agent.h"
  50. #include "node.h"
  51. #define MAXQUEUE  1             // 1 = only my grid, 5 = all of my neighbos
  52. #define GN_UPDATE_INTERVAL 10  // how often to update neighbor list
  53. #define GAF_STARTUP_JITTER 1.0 // secs to jitter start of periodic activity
  54. #define GAF_NONSTART_JITTER 3.0
  55. #define MIN_DISCOVERY_TIME 1    // min interval to send discovery
  56. #define MAX_DISCOVERY_TIME 15   // max interval to send discovery
  57. #define MIN_SELECT_TIME 5 // start to tell your neighbor that
  58. #define MAX_SELECT_TIME 6 // you are the leader b/w, my need
  59. // to be set by apps. 
  60. #define MAX_DISCOVERY   10      // send selection after 10 time try
  61. #define MIN_LIFETIME    60
  62. #define GAF_LEADER_JITTER 3
  63. #define MIN_TURNOFFTIME 1
  64. class GAFAgent;
  65. typedef enum {
  66.   GAF_DISCOVER, GAF_SELECT, GAF_DUTY
  67. } GafMsgType;
  68. typedef enum {
  69.   GAF_FREE, GAF_LEADER, GAF_SLEEP
  70. } GafNodeState;
  71. /*
  72.  * data structure for exchanging existence message and selection msg
  73.  */
  74. struct DiscoveryMsg {
  75.         u_int32_t gid; // grid id
  76.         u_int32_t nid;  // node id
  77.         u_int32_t state; // what is my state
  78.         u_int32_t ttl;  // My time to live
  79.         u_int32_t stime;  // I may stay on this grid for only stime
  80. };
  81. // gaf header
  82. struct hdr_gaf {
  83. // needs to be extended
  84. int seqno_;
  85.         GafMsgType type_;
  86. // Header access methods
  87. static int offset_; // required by PacketHeaderManager
  88. inline static int& offset() { return offset_; }
  89. inline static hdr_gaf* access(const Packet* p) {
  90. return (hdr_gaf*) p->access(offset_);
  91. }
  92. };
  93. // GAFTimer is used for discovery phase
  94. class GAFDiscoverTimer : public TimerHandler {
  95. public: 
  96. GAFDiscoverTimer(GAFAgent *a) : TimerHandler(), a_(a) { }
  97. protected:
  98. virtual void expire(Event *);
  99. GAFAgent *a_;
  100. };
  101. // GAFSelectTimer is for the slecting phase
  102. class GAFSelectTimer : public TimerHandler {
  103. public:
  104.         GAFSelectTimer(GAFAgent *a) : TimerHandler(), a_(a) { }
  105. protected:
  106.         virtual void expire(Event *);
  107.         GAFAgent *a_;
  108. };
  109. // GAFDutyTimer is for duty cycle. It is the place of adaptive fidelity
  110. // plays
  111. class GAFDutyTimer : public TimerHandler {
  112. public:
  113.         GAFDutyTimer(GAFAgent *a) : TimerHandler(), a_(a) { }
  114. protected:
  115.         inline void expire(Event *);
  116.         GAFAgent *a_;
  117. };
  118. class GAFAgent : public Agent {
  119. public:
  120. GAFAgent(nsaddr_t id);
  121. virtual void recv(Packet *, Handler *);
  122. void timeout(GafMsgType);
  123. //void select_timeout(int);
  124. u_int32_t nodeid() {return nid_;}
  125. double myttl();
  126. protected:
  127. int command(int argc, const char*const*argv);
  128. void node_on();
  129. void node_off();
  130. void duty_timeout();
  131. void send_discovery();
  132. void makeUpDiscoveryMsg(Packet *p);
  133. void processDiscoveryMsg(Packet *p);
  134. void schedule_wakeup(struct DiscoveryMsg);
  135. double beacon_; /* beacon period */
  136. void setGAFstate(GafNodeState);
  137. int randomflag_;
  138. GAFDiscoverTimer timer_;
  139. GAFSelectTimer stimer_;
  140. GAFDutyTimer dtimer_;
  141. int seqno_;
  142. int gid_; // group id of this node
  143. int nid_; // the node id of this node belongs to.
  144. Node *thisnode; // the node object where this agent resides
  145. int maxttl_; // life of a node in the neighbor list
  146. GafNodeState state_;
  147. int leader_settime_;
  148. int adapt_mobility_;  // control the use of 
  149.                       // GAF-3: load balance with aggressive sleeping
  150.                       // GAF-4:  load 3 + mobility adaption
  151. };
  152. /* assisting getting broadcast msg */
  153. class GAFPartner : public Connector {
  154. public:
  155.         GAFPartner();
  156.         void recv(Packet *p, Handler *h);
  157. protected:
  158. int command(int argc, const char*const*argv);
  159.         ns_addr_t here_;
  160. int gafagent_;
  161.         int mask_;
  162.         int shift_;
  163. };
  164. #endif