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 #ifndef ns_mac_multihop_h
00038 #define ns_mac_multihop_h
00039
00040 #include "packet.h"
00041 #include "mac.h"
00042 #include "random.h"
00043 #include "ip.h"
00044
00045 #define MAC_POLLSIZE 40
00046 #define MAC_POLLACKSIZE 40
00047
00048
00049 #define MAC_IDLE 0x01
00050 #define MAC_POLLING 0x02
00051 #define MAC_RCV 0x04
00052 #define MAC_SND 0x08
00053
00054 #define MAC_TICK 16000
00055
00056
00057 class MultihopMac;
00058
00059
00060
00061
00062
00063
00064 class PollEvent : public Event {
00065 public:
00066 PollEvent(MultihopMac* m, MultihopMac* pm) :
00067 backoffTime_(0), mac_(m), peerMac_(pm) { }
00068 int backoffTime_;
00069 inline MultihopMac *peerMac() { return peerMac_; }
00070 protected:
00071 MultihopMac *mac_;
00072 MultihopMac *peerMac_;
00073 };
00074
00075
00076
00077
00078 class PollHandler : public Handler {
00079 public:
00080 PollHandler(MultihopMac* m) { mac_ = m; }
00081 void handle(Event *);
00082 protected:
00083 MultihopMac* mac_;
00084 };
00085
00086
00087
00088
00089 class PollAckHandler : public Handler {
00090 public:
00091 PollAckHandler(MultihopMac* m) { mac_ = m; }
00092 void handle(Event *);
00093 protected:
00094 MultihopMac* mac_;
00095 };
00096
00097
00098
00099
00100 class PollNackHandler : public Handler {
00101 public:
00102 PollNackHandler(MultihopMac* m) { mac_ = m; }
00103 void handle(Event *);
00104 protected:
00105 MultihopMac* mac_;
00106 };
00107
00108
00109
00110
00111 class PollTimeoutHandler : public Handler {
00112 public:
00113 PollTimeoutHandler(MultihopMac* m) { mac_ = m; }
00114 void handle(Event *);
00115 protected:
00116 MultihopMac* mac_;
00117 };
00118
00119 class BackoffHandler : public Handler {
00120 public:
00121 BackoffHandler(MultihopMac *m) { mac_ = m; }
00122 void handle(Event *);
00123 protected:
00124 MultihopMac* mac_;
00125 };
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137 class MultihopMac : public Mac {
00138 public:
00139 MultihopMac();
00140 void send(Packet*);
00141 void recv(Packet *, Handler *);
00142 void poll(Packet *);
00143 int checkInterfaces(int);
00144 void schedulePoll(MultihopMac *);
00145 inline int mode() { return mode_; }
00146 inline int mode(int m) { return mode_ = m; }
00147 inline MultihopMac *peer() { return peer_; }
00148 inline MultihopMac *peer(MultihopMac *p) { return peer_ = p; }
00149 inline double tx_rx() { return tx_rx_; }
00150 inline double rx_tx() { return rx_tx_; }
00151 inline double rx_rx() { return rx_rx_; }
00152 inline double backoffBase() { return backoffBase_; }
00153 inline double backoffTime() { return backoffTime_; }
00154 inline double backoffTime(double bt) { return backoffTime_ = bt; }
00155 inline PollEvent *pendingPE() { return pendingPollEvent_; }
00156 inline PollEvent *pendingPE(PollEvent *pe) { return pendingPollEvent_ = pe; }
00157 inline Packet *pkt() { return pkt_; }
00158 inline PollHandler* ph() { return &ph_; }
00159 inline PollAckHandler* pah() { return &pah_; }
00160 inline PollNackHandler* pnh() { return &pnh_; }
00161 inline PollTimeoutHandler* pth() { return &pth_; }
00162 inline BackoffHandler* bh() { return &bh_; }
00163
00164 inline double pollTxtime(int s) { return (double) s*8.0/bandwidth(); }
00165 protected:
00166 int mode_;
00167 MultihopMac *peer_;
00168 double tx_rx_;
00169 double rx_tx_;
00170 double rx_rx_;
00171 double backoffTime_;
00172 double backoffBase_;
00173 PollEvent *pendingPollEvent_;
00174 Packet *pkt_;
00175 PollHandler ph_;
00176 PollAckHandler pah_;
00177 PollNackHandler pnh_;
00178 PollTimeoutHandler pth_;
00179 BackoffHandler bh_;
00180
00181 };
00182
00183
00184 #endif