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