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

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (C) 2007 
  3.  * Mercedes-Benz Research & Development North America, Inc.and
  4.  * University of Karlsruhe (TH)
  5.  * All rights reserved.
  6.  *
  7.  * This program is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU General Public License,
  9.  * version 2, as published by the Free Software Foundation.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License along
  17.  * with this program; if not, write to the Free Software Foundation, Inc.,
  18.  * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
  19.  *
  20.  *
  21.  * The copyright of this module includes the following
  22.  * linking-with-specific-other-licenses addition:
  23.  *
  24.  * In addition, as a special exception, the copyright holders of
  25.  * this module give you permission to combine (via static or
  26.  * dynamic linking) this module with free software programs or
  27.  * libraries that are released under the GNU LGPL and with code
  28.  * included in the standard release of ns-2 under the Apache 2.0
  29.  * license or under otherwise-compatible licenses with advertising
  30.  * requirements (or modified versions of such code, with unchanged
  31.  * license).  You may copy and distribute such a system following the
  32.  * terms of the GNU GPL for this module and the licenses of the
  33.  * other code concerned, provided that you include the source code of
  34.  * that other code when and as the GNU GPL requires distribution of
  35.  * source code.
  36.  *
  37.  * Note that people who make modified versions of this module
  38.  * are not obligated to grant this special exception for their
  39.  * modified versions; it is their choice whether to do so.  The GNU
  40.  * General Public License gives permission to release a modified
  41.  * version without this exception; this exception also makes it
  42.  * possible to release a modified version which carries forward this
  43.  * exception.
  44.  *
  45.  */
  46.  
  47. /*
  48.  * This code was designed and developed by:
  49.  * 
  50.  * Qi Chen                 : qi.chen@daimler.com
  51.  * Felix Schmidt-Eisenlohr : felix.schmidt-eisenlohr@kit.edu
  52.  * Daniel Jiang            : daniel.jiang@daimler.com
  53.  * 
  54.  * For further information see: 
  55.  * http://dsn.tm.uni-karlsruhe.de/english/Overhaul_NS-2.php
  56.  */
  57. #ifndef ns_WirelessPhyExt_h
  58. #define ns_WirelessPhyExt_h
  59. #include "phy.h"
  60. #include "propagation.h"
  61. #include "modulation.h"
  62. #include "omni-antenna.h"
  63. #include "mobilenode.h"
  64. #include "timer-handler.h"
  65. #include <list>
  66. #include <packet.h>
  67. typedef enum PhyState {SEARCHING = 0, PreRXing = 1, RXing = 2, TXing = 3};
  68. typedef struct ModulationParam {
  69. int schemeIndex;
  70. char schemeName[10];
  71. double SINR_dB;
  72. double SINR_ratio;
  73. int NDBPS; //Data Bits Per Symbol
  74. } ModulationParam;
  75. const struct ModulationParam modulation_table[4] = {
  76. //  mod  name  SINRdB   SINR  NDBPS bit
  77. { 0, "BPSK", 4, 2.5118, 24 }, { 1, "QPSK", 7, 5.0118, 48 }, { 2,
  78. "QAM16", 12, 15.848, 96 }, { 3, "QAM64", 20, 100.00, 216 } };
  79. class Phy;
  80. class WirelessPhyExt;
  81. class Propagation;
  82. class PowerMonitor;
  83. //**************************************************************/
  84. class TX_Timer : public TimerHandler {
  85. public:
  86. TX_Timer(WirelessPhyExt * w) :
  87. TimerHandler() {
  88. wirelessPhyExt = w;
  89. }
  90. protected:
  91. void expire(Event *e);
  92. private:
  93. WirelessPhyExt * wirelessPhyExt;
  94. };
  95. class RX_Timer : public TimerHandler {
  96. public:
  97. RX_Timer(WirelessPhyExt * w) :
  98. TimerHandler() {
  99. wirelessPhyExt = w;
  100. }
  101. void expire(Event *e);
  102. private:
  103. WirelessPhyExt * wirelessPhyExt;
  104. };
  105. class PreRX_Timer : public TimerHandler {
  106. public:
  107. PreRX_Timer(WirelessPhyExt * w) :
  108. TimerHandler() {
  109. wirelessPhyExt = w;
  110. }
  111. void expire(Event *e);
  112. private:
  113. WirelessPhyExt * wirelessPhyExt;
  114. };
  115. //**************************************************************/
  116. //                   1.0 WirelessPhyExt 
  117. //**************************************************************/
  118. /*
  119.  The PHY is in the Searching state when it is neither in transmission nor reception of a frame. Within this state, the PHY evaluates each transmission event notification from the Wireless Channel object it is attached to for potentially receivable frames. If a frame arrives with sufficient received signal strength for preamble detection (i.e. SINR > BPSK threshold), the PHY moves into the PreRXing state.
  120.  The PHY stays in the PreRXing state for the duration of preamble and Signal portion of the PLCP header.  If the SINR of this frame stays above the BPSK and 1/2 coding rate reception threshold throughout this period, the PHY moves into the RXing state to stay for the frame duration. If a later arriving frame from the channel has sufficient received signal strength to prevent proper preamble and PLCP header reception for the current frame, the PHY moves back to the Searching state. However, if this later frame has sufficiently higher signal strength for its own preamble to be heard above others, it will trigger preamble capture, which means the PHY stays in the PreRXing state with a reset timer for the new frame.
  121.  Within the RXing state, the PHY handles the reception of the body of the current frame. It monitors the SINR throughout the frame body duration. If the SINR drops below the threshold required by the modulation and coding rate used for the frame body at any time while in this state, the PHY marks the frame with an error flag. After RXing timeout, the PHY moves back to the Searching state. It also passes the frame to the MAC, where the error flag is directly used for the CRC check decision. 
  122.  If the frame body capture feature is enabled, then it is possible for a later arriving frame to trigger the PHY to move back to the PreRXing state for the new frame in the manner described in section 3.3.2. Otherwise, the later arriving frame has no chance of being received and is only tracked by the power monitor as an interference source.
  123.  A transmit command from the MAC will move the PHY into the TXing state for the duration of a frame transmission regardless what the PHY is doing at the moment. The expiration of the transmission timer ends the TXing state. If a frame comes in from the channel when the PHY is in the TXing state, it is ignored and only tracked by the power monitor as interference.
  124.  Usually the MAC will not issue a transmit command while the PHY is in the PreRXing or RXing state because of the carrier sense mechanism. However, the IEEE 802.11 standard mandates the receiver of a unicast data frame addressed to itself to turn around after SIFS and transmit an ACK frame regardless of the channel condition. Similarly, the receiver of a RTS frame, if it has an empty NAV (Network Allocation Vector), will wait for SIFS and then transmit a CTS frame regardless of the channel condition. Such scenarios are represented by the two dashed lines shown in the state machine. The PHY is designed to drop and clean up the frame it is attempting to receive and move into TXing state when this happens.
  125.  The MAC, however, should never issue a transmit command when the PHY is still in the TXing state. The new frame has little chance of being received within its intended audience because others in general have no means to tell that a new frame is suddenly started. Therefore, the PHY is designed to issue an error and halt the simulator when this event happens because it means the MAC above has a critical error in design or implementation.
  126.  */
  127. class WirelessPhyExt : public WirelessPhy {
  128. public:
  129. WirelessPhyExt();
  130. //  inline double getAntennaZ() { return ant_->getZ(); }
  131. inline double getL() const {
  132. return L_;
  133. }
  134. inline double getLambda() const {
  135. return lambda_;
  136. }
  137. inline Node* node(void) const {
  138. return node_;
  139. }
  140. void setState(int newstate);
  141. virtual int command(int argc, const char*const* argv);
  142. virtual void dump(void) const;
  143. //timer handlers
  144. void handle_TXtimeout();
  145. void handle_RXtimeout();
  146. void handle_PreRXtimeout();
  147. //signalling to MAC layer
  148. void sendCSBusyIndication();
  149. void sendCSIdleIndication();
  150. //ns2 calls
  151. void sendDown(Packet *p);
  152. int sendUp(Packet *p);
  153. int discard(Packet *p, double power, char* reason);
  154. double getDist(double Pr, double Pt, double Gt, double Gr, 
  155. double hr, double ht, double L, double lambda);
  156.     inline double getAntennaZ() { return ant_->getZ(); }
  157. private:
  158. // variables to be bound
  159. double lambda_; // wavelength (m)
  160. double CSThresh_; // carrier sense threshold (W) fixed by chipset
  161. double CPThresh_; // capture threshold
  162. double RXThresh_; // capture threshold
  163. double Pt_; // transmitted signal power (W)
  164. double freq_; // frequency
  165. double L_; // system loss factor
  166. double HeaderDuration_; // preamble+SIGNAL
  167. int BasicModulationScheme_;
  168. int PreambleCaptureSwitch_; //PreambleCaptureSwitch
  169. int DataCaptureSwitch_; //DataCaptureSwitch
  170. double SINR_PreambleCapture_;
  171. double SINR_DataCapture_;
  172. int PHY_DBG;
  173. double trace_dist_;
  174. double noise_floor_;
  175. double PowerMonitorThresh_;
  176. Propagation *propagation_;
  177. Antenna *ant_;
  178. PowerMonitor *powerMonitor;
  179. TX_Timer tX_Timer;
  180. RX_Timer rX_Timer;
  181. PreRX_Timer preRX_Timer;
  182. int state;
  183. Packet *pkt_RX;
  184. double SINR_Th_RX; //SINR threshold for decode data according to the modulation scheme
  185. double power_RX;
  186. void log(char * event, char* additional); // print out state informration
  187. double SINR_Th(int modulationScheme);
  188. inline int initialized() {
  189. return (node_ && uptarget_ && downtarget_ && propagation_);
  190. }
  191. friend class TX_Timer;
  192. friend class RX_Timer;
  193. friend class PreRX_Timer;
  194. friend class PowerMonitor;
  195. friend class PowerTimer;
  196. };
  197. //**************************************************************/
  198. //                  2.0 PowerMonitor
  199. //**************************************************************/
  200. /*
  201.  The power monitor module corresponds to the PMD (Physical Media Dependent) sub-layer within the PHY. PMD is the only sub-layer that directly interacts with the analog RF signals. Therefore, all information on received signals is processed and managed in this module.
  202.  The power monitor module keeps track of all the noise and interferences experienced by the node individually for their respective durations. Whenever the cumulative interference and noise level rises crosses the carrier sense threshold, it signals the MAC on physical carrier sense status changes. It should be noted that a node's own transmission is treated as carrier sense busy through this signaling interface as well.
  203.  */
  204. //**************************************************************/
  205. class PowerTimer : public TimerHandler {
  206. public:
  207. PowerTimer(double power, double duration, PowerMonitor *);
  208. inline double getPower() {
  209. return signalPower;
  210. }
  211. void expire(Event *); //virtual function, which must be implemented
  212. protected:
  213. double signalPower;
  214. private:
  215. PowerMonitor * powerMonitor;
  216. };
  217. //**************************************************************/
  218. typedef PowerTimer* pTimer;
  219. typedef std::list<PowerTimer *> PowerTimerList;
  220. typedef enum PowerMonitorState {IDLE = 0, BUSY = 1};
  221. class PowerMonitor {
  222. public:
  223. PowerMonitor(WirelessPhyExt *);
  224. void recordPowerLevel(double power, double duration);
  225. double getPowerLevel();
  226. void setPowerLevel(double);
  227. double SINR(double Pr);
  228. private:
  229. double CS_Thresh;
  230. double monitor_Thresh;//packet with power > monitor_thresh will be recorded in the monitor
  231. double powerLevel;
  232. WirelessPhyExt * wirelessPhyExt;
  233. PowerTimerList powerTimerList;
  234. int state;
  235. friend class PowerTimer;
  236. };
  237. #endif /* !ns_WirelessPhyExt_h */