00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052 
00053 #ifndef ns_diff_prob_h
00054 #define ns_diff_prob_h
00055 
00056 #include <assert.h>
00057 #include <math.h>
00058 #include <stdio.h>
00059 #include <signal.h>
00060 #include <float.h>
00061 #include <stdlib.h>
00062 
00063 #include <tcl.h>
00064 
00065 #include "diff_header.h"
00066 #include "agent.h"
00067 #include "tclcl.h"
00068 #include "ip.h"
00069 #include "config.h"
00070 #include "packet.h"
00071 #include "trace.h"
00072 #include "random.h"
00073 #include "classifier.h"
00074 #include "node.h"
00075 #include "iflist.h"
00076 #include "hash_table.h"
00077 #include "arp.h"
00078 #include "mac.h"
00079 #include "ll.h"
00080 #include "dsr/path.h"
00081 #include "routing_table.h"
00082 #include "diffusion.h"
00083 
00084 
00085 
00086 
00087 #define BACKTRACK_            false
00088 #define ENERGY_CHECK          0.05         // (sec) between energy checks
00089 #define INTEREST_DELAY        0.05         // (sec) bw receive and forward
00090 #define MAX_REINFORCE_COUNTER 10           // (pkts) bw pos reinf
00091 
00092 class DiffusionProb;
00093 
00094 class EnergyTimer : public TimerHandler {
00095 public:
00096         EnergyTimer(DiffusionProb *a, Node *b) : TimerHandler() { 
00097                 a_ = a; 
00098                 node_ = b;
00099                 init_eng_ = node_->energy_model()->energy();
00100                 threshold_ = init_eng_ / 2;
00101         }
00102         virtual void expire(Event *e);
00103 protected:
00104         DiffusionProb *a_;
00105         Node *node_;
00106         double init_eng_;
00107         double threshold_;
00108 };
00109 
00110 
00111 class InterestTimer : public TimerHandler {
00112 public:
00113   InterestTimer(DiffusionProb *a, Pkt_Hash_Entry *hashPtr, Packet *pkt) : 
00114     TimerHandler() 
00115   { 
00116       a_ = a; 
00117       hashPtr_ = hashPtr;
00118       pkt_ = pkt;
00119   }
00120 
00121   virtual ~InterestTimer() {
00122     if (pkt_ != NULL) 
00123       Packet::free(pkt_);
00124   }
00125 
00126   virtual void expire(Event *e);
00127 protected:
00128   DiffusionProb *a_;
00129   Pkt_Hash_Entry *hashPtr_;
00130   Packet *pkt_;
00131 };
00132 
00133 
00134 
00135 class DiffusionProb : public DiffusionAgent {
00136  public:
00137   DiffusionProb();
00138   void recv(Packet*, Handler*);
00139 
00140  protected:
00141 
00142   int num_neg_bcast_send;
00143   int num_neg_bcast_rcv;
00144 
00145   EnergyTimer *energy_timer;
00146   bool is_low_power;
00147 
00148   void Start();
00149   void consider_old(Packet *);
00150   void consider_new(Packet *);
00151   void add_outlist(unsigned int, From_List *);
00152   void data_request_all(unsigned int dtype);
00153 
00154   void CreateIOList(Pkt_Hash_Entry *, unsigned int);
00155   void UpdateIOList(From_List *, unsigned int);
00156   void Print_IOlist();
00157 
00158   void CalGradient(unsigned int);
00159   void IncGradient(unsigned int, ns_addr_t);
00160   void DecGradient(unsigned int, ns_addr_t);
00161 
00162   void ForwardData(Packet *);
00163   void ForwardTxFailed(Packet *);
00164   void ReTxData(Packet *);
00165 
00166   void GenPosReinf(unsigned int);
00167   void FwdPosReinf(unsigned int, Packet *);
00168   void InterfaceDown(int, ns_addr_t);
00169   void SendInhibit(int);
00170   void SendNegReinf();
00171 
00172   void InterestPropagate(Packet *pkt, Pkt_Hash_Entry *hashPtr);
00173   void xmitFailed(Packet *pkt);
00174 
00175   friend class InterestTimer;
00176   friend class EnergyTimer;
00177 };
00178 
00179 #endif