author | Mathieu Lacage <mathieu.lacage@sophia.inria.fr> |
Wed, 03 Oct 2007 11:35:07 +0200 | |
changeset 1892 | 7833628614bf |
parent 1891 | add6fb8761f3 |
child 1902 | 26a57487bb49 |
permissions | -rw-r--r-- |
1889 | 1 |
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ |
2 |
/* |
|
3 |
* Copyright (c) 2005,2006 INRIA |
|
4 |
* All rights reserved. |
|
5 |
* |
|
6 |
* This program is free software; you can redistribute it and/or modify |
|
7 |
* it under the terms of the GNU General Public License version 2 as |
|
8 |
* 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 |
|
16 |
* along with this program; if not, write to the Free Software |
|
17 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|
18 |
* |
|
19 |
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr> |
|
20 |
*/ |
|
21 |
||
1890
a2b30c6456c9
Phy80211 -> WifiPhy
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1889
diff
changeset
|
22 |
#ifndef WIFI_PHY_H |
a2b30c6456c9
Phy80211 -> WifiPhy
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1889
diff
changeset
|
23 |
#define WIFI_PHY_H |
1889 | 24 |
|
25 |
#include <vector> |
|
26 |
#include <list> |
|
27 |
#include <stdint.h> |
|
28 |
#include "ns3/callback.h" |
|
29 |
#include "ns3/event-id.h" |
|
30 |
#include "ns3/packet.h" |
|
31 |
#include "ns3/callback-trace-source.h" |
|
32 |
#include "ns3/nstime.h" |
|
33 |
#include "ns3/ptr.h" |
|
34 |
#include "ns3/random-variable.h" |
|
1891
add6fb8761f3
use WifiMode rather than TransmissionMode
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1890
diff
changeset
|
35 |
#include "ns3/wifi-mode.h" |
1889 | 36 |
|
37 |
||
38 |
namespace ns3 { |
|
39 |
||
40 |
class RandomUniform; |
|
41 |
class RxEvent; |
|
42 |
class TraceContainer; |
|
1891
add6fb8761f3
use WifiMode rather than TransmissionMode
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1890
diff
changeset
|
43 |
class WifiNetDevice; |
add6fb8761f3
use WifiMode rather than TransmissionMode
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1890
diff
changeset
|
44 |
class WifiChannel; |
1889 | 45 |
|
1890
a2b30c6456c9
Phy80211 -> WifiPhy
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1889
diff
changeset
|
46 |
class WifiPhyListener { |
1889 | 47 |
public: |
1890
a2b30c6456c9
Phy80211 -> WifiPhy
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1889
diff
changeset
|
48 |
virtual ~WifiPhyListener (); |
1889 | 49 |
|
50 |
/* we have received the first bit of a packet. We decided |
|
51 |
* that we could synchronize on this packet. It does not mean |
|
52 |
* we will be able to successfully receive completely the |
|
53 |
* whole packet. It means we will report a BUSY status. |
|
54 |
* r.end will be invoked later to report whether or not |
|
55 |
* the packet was successfully received. |
|
56 |
*/ |
|
57 |
virtual void NotifyRxStart (Time duration) = 0; |
|
58 |
/* we have received the last bit of a packet for which |
|
59 |
* rxStart was invoked first. |
|
60 |
*/ |
|
61 |
virtual void NotifyRxEndOk (void) = 0; |
|
62 |
virtual void NotifyRxEndError (void) = 0; |
|
63 |
/* we start the transmission of a packet. |
|
64 |
*/ |
|
65 |
virtual void NotifyTxStart (Time duration) = 0; |
|
66 |
virtual void NotifyCcaBusyStart (Time duration) = 0; |
|
67 |
}; |
|
68 |
||
69 |
||
70 |
||
1890
a2b30c6456c9
Phy80211 -> WifiPhy
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1889
diff
changeset
|
71 |
class WifiPhy |
1889 | 72 |
{ |
73 |
public: |
|
1891
add6fb8761f3
use WifiMode rather than TransmissionMode
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1890
diff
changeset
|
74 |
typedef Callback<void,Packet const , double, WifiMode, WifiMode, uint32_t> SyncOkCallback; |
1889 | 75 |
typedef Callback<void,Packet const , double> SyncErrorCallback; |
76 |
||
1891
add6fb8761f3
use WifiMode rather than TransmissionMode
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1890
diff
changeset
|
77 |
WifiPhy (Ptr<WifiNetDevice> device); |
1890
a2b30c6456c9
Phy80211 -> WifiPhy
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1889
diff
changeset
|
78 |
virtual ~WifiPhy (); |
1889 | 79 |
|
1891
add6fb8761f3
use WifiMode rather than TransmissionMode
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1890
diff
changeset
|
80 |
void SetChannel (Ptr<WifiChannel> channel); |
add6fb8761f3
use WifiMode rather than TransmissionMode
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1890
diff
changeset
|
81 |
|
1889 | 82 |
void SetReceiveOkCallback (SyncOkCallback callback); |
83 |
void SetReceiveErrorCallback (SyncErrorCallback callback); |
|
84 |
||
1891
add6fb8761f3
use WifiMode rather than TransmissionMode
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1890
diff
changeset
|
85 |
void SendPacket (Packet const packet, WifiMode mode, WifiMode headeMode, uint8_t txPower, uint32_t stuff); |
1889 | 86 |
|
1890
a2b30c6456c9
Phy80211 -> WifiPhy
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1889
diff
changeset
|
87 |
void RegisterListener (WifiPhyListener *listener); |
1889 | 88 |
|
89 |
bool IsStateCcaBusy (void); |
|
90 |
bool IsStateIdle (void); |
|
91 |
bool IsStateBusy (void); |
|
92 |
bool IsStateSync (void); |
|
93 |
bool IsStateTx (void); |
|
94 |
Time GetStateDuration (void); |
|
95 |
Time GetDelayUntilIdle (void); |
|
96 |
||
1891
add6fb8761f3
use WifiMode rather than TransmissionMode
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1890
diff
changeset
|
97 |
Time CalculateTxDuration (uint32_t size, WifiMode payloadMode) const; |
1889 | 98 |
|
99 |
void Configure80211a (void); |
|
100 |
void SetEdThresholdDbm (double rxThreshold); |
|
101 |
void SetRxNoiseDb (double rxNoise); |
|
102 |
void SetTxPowerIncrementsDbm (double txPowerBase, |
|
1891
add6fb8761f3
use WifiMode rather than TransmissionMode
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1890
diff
changeset
|
103 |
double txPowerEnd, |
add6fb8761f3
use WifiMode rather than TransmissionMode
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1890
diff
changeset
|
104 |
int nTxPower); |
add6fb8761f3
use WifiMode rather than TransmissionMode
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1890
diff
changeset
|
105 |
void SetRxTxGainDbm (double rxGainDbm, double txGainDbm); |
1889 | 106 |
uint32_t GetNModes (void) const; |
1891
add6fb8761f3
use WifiMode rather than TransmissionMode
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1890
diff
changeset
|
107 |
WifiMode GetMode (uint32_t mode) const; |
1889 | 108 |
uint32_t GetModeBitRate (uint8_t mode) const; |
109 |
uint32_t GetNTxpower (void) const; |
|
110 |
/* return snr: W/W */ |
|
1891
add6fb8761f3
use WifiMode rather than TransmissionMode
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1890
diff
changeset
|
111 |
double CalculateSnr (WifiMode txMode, double ber) const; |
1889 | 112 |
|
113 |
private: |
|
1890
a2b30c6456c9
Phy80211 -> WifiPhy
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1889
diff
changeset
|
114 |
enum WifiPhyState { |
1889 | 115 |
SYNC, |
116 |
TX, |
|
117 |
CCA_BUSY, |
|
118 |
IDLE |
|
119 |
}; |
|
120 |
class NiChange { |
|
121 |
public: |
|
122 |
NiChange (Time time, double delta); |
|
123 |
Time GetTime (void) const; |
|
124 |
double GetDelta (void) const; |
|
125 |
bool operator < (NiChange const &o) const; |
|
126 |
private: |
|
127 |
Time m_time; |
|
128 |
double m_delta; |
|
129 |
}; |
|
1891
add6fb8761f3
use WifiMode rather than TransmissionMode
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1890
diff
changeset
|
130 |
typedef std::vector<WifiMode> Modes; |
1890
a2b30c6456c9
Phy80211 -> WifiPhy
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1889
diff
changeset
|
131 |
typedef std::list<WifiPhyListener *> Listeners; |
1889 | 132 |
typedef std::list<Ptr<RxEvent> > Events; |
133 |
typedef std::vector <NiChange> NiChanges; |
|
134 |
||
135 |
private: |
|
1890
a2b30c6456c9
Phy80211 -> WifiPhy
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1889
diff
changeset
|
136 |
char const *StateToString (enum WifiPhyState state); |
a2b30c6456c9
Phy80211 -> WifiPhy
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1889
diff
changeset
|
137 |
enum WifiPhyState GetState (void); |
1889 | 138 |
double GetEdThresholdW (void) const; |
139 |
double DbmToW (double dbm) const; |
|
140 |
double DbToRatio (double db) const; |
|
141 |
Time GetMaxPacketDuration (void) const; |
|
142 |
void CancelRx (void); |
|
143 |
double GetPowerDbm (uint8_t power) const; |
|
144 |
void NotifyTxStart (Time duration); |
|
145 |
void NotifyWakeup (void); |
|
146 |
void NotifySyncStart (Time duration); |
|
147 |
void NotifySyncEndOk (void); |
|
148 |
void NotifySyncEndError (void); |
|
149 |
void NotifyCcaBusyStart (Time duration); |
|
150 |
void LogPreviousIdleAndCcaBusyStates (void); |
|
151 |
void SwitchToTx (Time txDuration); |
|
152 |
void SwitchToSync (Time syncDuration); |
|
153 |
void SwitchFromSync (void); |
|
154 |
void SwitchMaybeToCcaBusy (Time duration); |
|
155 |
void AppendEvent (Ptr<RxEvent> event); |
|
156 |
double CalculateNoiseInterferenceW (Ptr<RxEvent> event, NiChanges *ni) const; |
|
1891
add6fb8761f3
use WifiMode rather than TransmissionMode
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1890
diff
changeset
|
157 |
double CalculateSnr (double signal, double noiseInterference, WifiMode mode) const; |
add6fb8761f3
use WifiMode rather than TransmissionMode
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1890
diff
changeset
|
158 |
double CalculateChunkSuccessRate (double snir, Time delay, WifiMode mode) const; |
1889 | 159 |
double CalculatePer (Ptr<const RxEvent> event, NiChanges *ni) const; |
1891
add6fb8761f3
use WifiMode rather than TransmissionMode
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1890
diff
changeset
|
160 |
void EndSync (Packet const packet, Ptr<RxEvent> event, uint32_t stuff); |
1892
7833628614bf
implement WifiPhy::GetChunkSuccessRate
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1891
diff
changeset
|
161 |
double Log2 (double val) const; |
7833628614bf
implement WifiPhy::GetChunkSuccessRate
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1891
diff
changeset
|
162 |
double GetBpskBer (double snr, uint32_t signalSpread, uint32_t phyRate) const; |
7833628614bf
implement WifiPhy::GetChunkSuccessRate
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1891
diff
changeset
|
163 |
double GetQamBer (double snr, unsigned int m, uint32_t signalSpread, uint32_t phyRate) const; |
7833628614bf
implement WifiPhy::GetChunkSuccessRate
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1891
diff
changeset
|
164 |
uint32_t Factorial (uint32_t k) const; |
7833628614bf
implement WifiPhy::GetChunkSuccessRate
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1891
diff
changeset
|
165 |
double Binomial (uint32_t k, double p, uint32_t n) const; |
7833628614bf
implement WifiPhy::GetChunkSuccessRate
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1891
diff
changeset
|
166 |
double CalculatePdOdd (double ber, unsigned int d) const; |
7833628614bf
implement WifiPhy::GetChunkSuccessRate
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1891
diff
changeset
|
167 |
double CalculatePdEven (double ber, unsigned int d) const; |
7833628614bf
implement WifiPhy::GetChunkSuccessRate
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1891
diff
changeset
|
168 |
double CalculatePd (double ber, unsigned int d) const; |
7833628614bf
implement WifiPhy::GetChunkSuccessRate
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1891
diff
changeset
|
169 |
double GetFecBpskBer (double snr, double nbits, |
7833628614bf
implement WifiPhy::GetChunkSuccessRate
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1891
diff
changeset
|
170 |
uint32_t signalSpread, uint32_t phyRate, |
7833628614bf
implement WifiPhy::GetChunkSuccessRate
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1891
diff
changeset
|
171 |
uint32_t dFree, uint32_t adFree) const; |
7833628614bf
implement WifiPhy::GetChunkSuccessRate
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1891
diff
changeset
|
172 |
double GetFecQamBer (double snr, uint32_t nbits, |
7833628614bf
implement WifiPhy::GetChunkSuccessRate
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1891
diff
changeset
|
173 |
uint32_t signalSpread, |
7833628614bf
implement WifiPhy::GetChunkSuccessRate
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1891
diff
changeset
|
174 |
uint32_t phyRate, |
7833628614bf
implement WifiPhy::GetChunkSuccessRate
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1891
diff
changeset
|
175 |
uint32_t m, uint32_t dfree, |
7833628614bf
implement WifiPhy::GetChunkSuccessRate
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1891
diff
changeset
|
176 |
uint32_t adFree, uint32_t adFreePlusOne) const; |
1891
add6fb8761f3
use WifiMode rather than TransmissionMode
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1890
diff
changeset
|
177 |
double GetChunkSuccessRate (WifiMode mode, double snr, uint32_t nbits) const; |
add6fb8761f3
use WifiMode rather than TransmissionMode
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1890
diff
changeset
|
178 |
/* rxPower unit is Watt */ |
add6fb8761f3
use WifiMode rather than TransmissionMode
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1890
diff
changeset
|
179 |
void ReceivePacket (Packet packet, |
add6fb8761f3
use WifiMode rather than TransmissionMode
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1890
diff
changeset
|
180 |
double rxPowerW, |
add6fb8761f3
use WifiMode rather than TransmissionMode
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1890
diff
changeset
|
181 |
WifiMode mode, |
add6fb8761f3
use WifiMode rather than TransmissionMode
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1890
diff
changeset
|
182 |
WifiMode headerMode, |
add6fb8761f3
use WifiMode rather than TransmissionMode
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1890
diff
changeset
|
183 |
uint32_t stuff); |
1889 | 184 |
private: |
185 |
uint64_t m_txPrepareDelayUs; |
|
186 |
uint64_t m_plcpPreambleDelayUs; |
|
187 |
uint32_t m_plcpHeaderLength; |
|
188 |
Time m_maxPacketDuration; |
|
189 |
||
190 |
double m_edThresholdW; /* unit: W */ |
|
1891
add6fb8761f3
use WifiMode rather than TransmissionMode
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1890
diff
changeset
|
191 |
double m_txGainDbm; |
add6fb8761f3
use WifiMode rather than TransmissionMode
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1890
diff
changeset
|
192 |
double m_rxGainDbm; |
1889 | 193 |
double m_rxNoiseRatio; |
194 |
double m_txPowerBaseDbm; |
|
195 |
double m_txPowerEndDbm; |
|
196 |
uint32_t m_nTxPower; |
|
197 |
||
198 |
||
199 |
bool m_syncing; |
|
200 |
Time m_endTx; |
|
201 |
Time m_endSync; |
|
202 |
Time m_endCcaBusy; |
|
203 |
Time m_startTx; |
|
204 |
Time m_startSync; |
|
205 |
Time m_startCcaBusy; |
|
206 |
Time m_previousStateChangeTime; |
|
207 |
||
1891
add6fb8761f3
use WifiMode rather than TransmissionMode
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1890
diff
changeset
|
208 |
Ptr<WifiChannel> m_channel; |
add6fb8761f3
use WifiMode rather than TransmissionMode
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1890
diff
changeset
|
209 |
Ptr<WifiNetDevice> m_device; |
1889 | 210 |
SyncOkCallback m_syncOkCallback; |
211 |
SyncErrorCallback m_syncErrorCallback; |
|
212 |
Modes m_modes; |
|
213 |
Listeners m_listeners; |
|
214 |
EventId m_endSyncEvent; |
|
215 |
Events m_events; |
|
216 |
UniformVariable m_random; |
|
217 |
/* param1: - true: sync completed ok |
|
218 |
* - false: sync completed with failure |
|
219 |
* Invoked when the last bit of a Signal (which was |
|
220 |
* synchronized upon) is received. |
|
221 |
* Reports whether or not the signal was received |
|
222 |
* successfully. |
|
223 |
*/ |
|
224 |
CallbackTraceSource<bool> m_endSyncLogger; |
|
225 |
/* param1: Duration |
|
226 |
* param2: signal Energy (w) |
|
227 |
* Invoked whenever the first bit of a signal is received. |
|
228 |
*/ |
|
229 |
CallbackTraceSource<Time,double> m_startRxLogger; |
|
230 |
/* param1: Duration |
|
231 |
* param2: signal Energy (w) |
|
232 |
* Invoked whenever the first bit of a signal is |
|
233 |
* synchronized upon. |
|
234 |
*/ |
|
235 |
CallbackTraceSource<Time,double> m_startSyncLogger; |
|
236 |
/* param1: Duration |
|
237 |
* param2: tx Mode (bit rate: bit/s) |
|
238 |
* param3: tx Power (dbm) |
|
239 |
* Invoked whenever we send the first bit of a signal. |
|
240 |
*/ |
|
241 |
CallbackTraceSource<Time, uint32_t, double> m_startTxLogger; |
|
242 |
/* 80211-phy-state |
|
243 |
* param1: Start |
|
244 |
* param2: Duration |
|
245 |
* param3: state: 0 -> TX, 1 -> SYNC, 2 -> CCA, 3 -> IDLE |
|
246 |
*/ |
|
247 |
CallbackTraceSource<Time,Time,uint8_t> m_stateLogger; |
|
248 |
}; |
|
249 |
||
250 |
}; // namespace ns3 |
|
251 |
||
252 |
||
1890
a2b30c6456c9
Phy80211 -> WifiPhy
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1889
diff
changeset
|
253 |
#endif /* WIFI_PHY_H */ |