|
57 |
void NotifyTxSuccess (uint32_t retryCounter); |
57 |
void NotifyTxSuccess (uint32_t retryCounter); |
58 |
/// Updates average frame error rate when final data or RTS has failed. |
58 |
/// Updates average frame error rate when final data or RTS has failed. |
59 |
void NotifyTxFailed (); |
59 |
void NotifyTxFailed (); |
60 |
/// Returns frame error rate (probability that frame is corrupted due to transmission error). |
60 |
/// Return frame error rate (probability that frame is corrupted due to transmission error). |
61 |
double GetFrameErrorRate () const; |
61 |
double GetFrameErrorRate () const; |
62 |
private: |
62 |
private: |
63 |
/** |
63 |
/** |
64 |
* \brief Calculate averaging coefficient for frame error rate. Depends on time of the last update. |
64 |
* \brief Calculate averaging coefficient for frame error rate. Depends on time of the last update. |
65 |
* \attention Calling this method twice gives different results, |
65 |
* \attention Calling this method twice gives different results, |
66 |
* because it resets time of last update. |
66 |
* because it resets time of last update. |
|
|
67 |
* |
68 |
* \return average coefficient for frame error rate |
67 |
*/ |
69 |
*/ |
68 |
double CalculateAveragingCoefficient (); |
70 |
double CalculateAveragingCoefficient (); |
69 |
/// averaging coefficient depends on the memory time |
71 |
/// averaging coefficient depends on the memory time |
|
88 |
WifiRemoteStationManager (); |
90 |
WifiRemoteStationManager (); |
89 |
virtual ~WifiRemoteStationManager (); |
91 |
virtual ~WifiRemoteStationManager (); |
90 |
|
92 |
|
|
|
93 |
/** |
94 |
* Set up PHY associated with this device since it is the object that |
95 |
* knows the full set of transmit rates that are supported. |
96 |
* |
97 |
* \param phy the PHY of this device |
98 |
*/ |
91 |
virtual void SetupPhy (Ptr<WifiPhy> phy); |
99 |
virtual void SetupPhy (Ptr<WifiPhy> phy); |
92 |
|
100 |
|
|
|
101 |
/** |
102 |
* Return the maximum STA short retry count (SSRC). |
103 |
* |
104 |
* \return the maximum SSRC |
105 |
*/ |
93 |
uint32_t GetMaxSsrc (void) const; |
106 |
uint32_t GetMaxSsrc (void) const; |
|
|
107 |
/** |
108 |
* Return the maximum STA long retry count (SLRC). |
109 |
* |
110 |
* \return the maximum SLRC |
111 |
*/ |
94 |
uint32_t GetMaxSlrc (void) const; |
112 |
uint32_t GetMaxSlrc (void) const; |
|
|
113 |
/** |
114 |
* Return the RTS threshold. |
115 |
* |
116 |
* \return the RTS threshold |
117 |
*/ |
95 |
uint32_t GetRtsCtsThreshold (void) const; |
118 |
uint32_t GetRtsCtsThreshold (void) const; |
|
|
119 |
/** |
120 |
* Return the fragmentation threshold. |
121 |
* |
122 |
* \return the fragmentation threshold |
123 |
*/ |
96 |
uint32_t GetFragmentationThreshold (void) const; |
124 |
uint32_t GetFragmentationThreshold (void) const; |
|
|
125 |
/** |
126 |
* Sets the maximum STA short retry count (SSRC). |
127 |
* |
128 |
* \param the maximum SSRC |
129 |
*/ |
97 |
void SetMaxSsrc (uint32_t maxSsrc); |
130 |
void SetMaxSsrc (uint32_t maxSsrc); |
|
|
131 |
/** |
132 |
* Sets the maximum STA long retry count (SLRC). |
133 |
* |
134 |
* \param the maximum SLRC |
135 |
*/ |
98 |
void SetMaxSlrc (uint32_t maxSlrc); |
136 |
void SetMaxSlrc (uint32_t maxSlrc); |
|
|
137 |
/** |
138 |
* Sets the RTS threshold. |
139 |
* |
140 |
* \param the RTS threshold |
141 |
*/ |
99 |
void SetRtsCtsThreshold (uint32_t threshold); |
142 |
void SetRtsCtsThreshold (uint32_t threshold); |
|
|
143 |
/** |
144 |
* Sets a fragmentation threshold. The method calls a private method |
145 |
* DoSetFragmentationThreshold that checks the validity of the value given. |
146 |
* |
147 |
* \param threshold the fragmentation threshold |
148 |
*/ |
100 |
void SetFragmentationThreshold (uint32_t threshold); |
149 |
void SetFragmentationThreshold (uint32_t threshold); |
101 |
void AddStationHtCapabilities (Mac48Address from,HtCapabilities htcapabilities); |
150 |
/** |
|
|
151 |
* Records HT capabilities of remote station. |
152 |
* |
153 |
* \param from the address of the station being recorded |
154 |
* \param htcapabilities the HT capabilities of the station |
155 |
*/ |
156 |
void AddStationHtCapabilities (Mac48Address from, HtCapabilities htcapabilities); |
157 |
/** |
158 |
* Enable or disable HT capability support. |
159 |
* |
160 |
* \param enable enable or disable HT capability support |
161 |
*/ |
102 |
void SetHtSupported (bool enable); |
162 |
void SetHtSupported (bool enable); |
|
|
163 |
/** |
164 |
* Return whether the device has HT capability support enabled. |
165 |
* |
166 |
* \return true if HT capability support is enabled, false otherwise |
167 |
*/ |
103 |
bool HasHtSupported (void) const; |
168 |
bool HasHtSupported (void) const; |
104 |
|
169 |
|
105 |
// Invoked in a STA upon dis-association |
170 |
/** |
106 |
// or in an AP upon reboot |
171 |
* Reset the station, invoked in a STA upon dis-association or in an AP upon reboot. |
|
|
172 |
*/ |
107 |
void Reset (void); |
173 |
void Reset (void); |
108 |
// Invoked in a STA upon association to store |
174 |
/** |
109 |
// the set of rates which belong to the |
175 |
* Invoked in a STA upon association to store the set of rates which belong to the |
110 |
// BSSBasicRateSet of the associated AP |
176 |
* BSSBasicRateSet of the associated AP and which are supported locally. |
111 |
// and which are supported locally. |
177 |
* Invoked in an AP to configure the BSSBasicRateSet. |
112 |
// Invoked in an AP to configure the BSSBasicRateSet |
178 |
* |
|
|
179 |
* \param mode the WifiMode to be added to the basic mode set |
180 |
*/ |
113 |
void AddBasicMode (WifiMode mode); |
181 |
void AddBasicMode (WifiMode mode); |
114 |
|
182 |
|
|
|
183 |
/** |
184 |
* Return the default transmission mode. |
185 |
* |
186 |
* \return WifiMode the default transmission mode |
187 |
*/ |
115 |
WifiMode GetDefaultMode (void) const; |
188 |
WifiMode GetDefaultMode (void) const; |
|
|
189 |
/** |
190 |
* Return the number of basic modes we support. |
191 |
* |
192 |
* \return the number of basic modes we support |
193 |
*/ |
116 |
uint32_t GetNBasicModes (void) const; |
194 |
uint32_t GetNBasicModes (void) const; |
|
|
195 |
/** |
196 |
* Return a basic mode from the set of basic modes. |
197 |
* |
198 |
* \param i index of the basic mode in the basic mode set |
199 |
* \return the basic mode at the given index |
200 |
*/ |
117 |
WifiMode GetBasicMode (uint32_t i) const; |
201 |
WifiMode GetBasicMode (uint32_t i) const; |
|
|
202 |
/** |
203 |
* Return whether the station supports Greenfield or not. |
204 |
* |
205 |
* \param address the address of the station |
206 |
* \return true if Greenfield is supported by the station, |
207 |
* false otherwise |
208 |
*/ |
118 |
bool GetGreenfieldSupported (Mac48Address address) const; |
209 |
bool GetGreenfieldSupported (Mac48Address address) const; |
119 |
void AddBasicMcs (uint8_t mcs); |
210 |
void AddBasicMcs (uint8_t mcs); |
120 |
|
211 |
|
|
123 |
uint8_t GetBasicMcs (uint32_t i) const; |
214 |
uint8_t GetBasicMcs (uint32_t i) const; |
124 |
void AddSupportedMcs (Mac48Address address, uint8_t mcs); |
215 |
void AddSupportedMcs (Mac48Address address, uint8_t mcs); |
125 |
|
216 |
|
|
|
217 |
/** |
218 |
* Return a mode for non-unicast packets. |
219 |
* |
220 |
* \return WifiMode for non-unicast packets |
221 |
*/ |
126 |
WifiMode GetNonUnicastMode (void) const; |
222 |
WifiMode GetNonUnicastMode (void) const; |
127 |
|
223 |
|
128 |
|
224 |
|
129 |
/** |
225 |
/** |
130 |
* Invoked in an AP upon disassociation of a |
226 |
* Invoked in an AP upon disassociation of a |
131 |
* specific STA. |
227 |
* specific STA. |
|
|
228 |
* |
229 |
* \param address the address of the STA |
132 |
*/ |
230 |
*/ |
133 |
void Reset (Mac48Address address); |
231 |
void Reset (Mac48Address address); |
134 |
/** |
232 |
/** |
|
137 |
* also supported locally. |
235 |
* also supported locally. |
138 |
* The set of supported modes includes |
236 |
* The set of supported modes includes |
139 |
* the BSSBasicRateSet. |
237 |
* the BSSBasicRateSet. |
|
|
238 |
* |
239 |
* \param address the address of the station being recorded |
240 |
* \param mode the WifiMode supports by the station |
140 |
*/ |
241 |
*/ |
141 |
void AddSupportedMode (Mac48Address address, WifiMode mode); |
242 |
void AddSupportedMode (Mac48Address address, WifiMode mode); |
142 |
//void AddBssMembershipParameters(Mac48Address address, uint32_t selector); |
243 |
//void AddBssMembershipParameters(Mac48Address address, uint32_t selector); |
143 |
|
244 |
|
|
|
245 |
/** |
246 |
* Return whether the station state is brand new. |
247 |
* |
248 |
* \param address the address of the station |
249 |
* \return true if the state of the station is brand new, |
250 |
* false otherwise |
251 |
*/ |
144 |
bool IsBrandNew (Mac48Address address) const; |
252 |
bool IsBrandNew (Mac48Address address) const; |
|
|
253 |
/** |
254 |
* Return whether the station associated. |
255 |
* |
256 |
* \param address the address of the station |
257 |
* \return true if the station is associated, |
258 |
* false otherwise |
259 |
*/ |
145 |
bool IsAssociated (Mac48Address address) const; |
260 |
bool IsAssociated (Mac48Address address) const; |
|
|
261 |
/** |
262 |
* Return whether we are waiting for an ACK for |
263 |
* the association response we sent. |
264 |
* |
265 |
* \param address the address of the station |
266 |
* \return true if the station is associated, |
267 |
* false otherwise |
268 |
*/ |
146 |
bool IsWaitAssocTxOk (Mac48Address address) const; |
269 |
bool IsWaitAssocTxOk (Mac48Address address) const; |
|
|
270 |
/** |
271 |
* Records that we are waiting for an ACK for |
272 |
* the association response we sent. |
273 |
* |
274 |
* \param address the address of the station |
275 |
*/ |
147 |
void RecordWaitAssocTxOk (Mac48Address address); |
276 |
void RecordWaitAssocTxOk (Mac48Address address); |
|
|
277 |
/** |
278 |
* Records that we got an ACK for |
279 |
* the association response we sent. |
280 |
* |
281 |
* \param address the address of the station |
282 |
*/ |
148 |
void RecordGotAssocTxOk (Mac48Address address); |
283 |
void RecordGotAssocTxOk (Mac48Address address); |
|
|
284 |
/** |
285 |
* Records that we missed an ACK for |
286 |
* the association response we sent. |
287 |
* |
288 |
* \param address the address of the station |
289 |
*/ |
149 |
void RecordGotAssocTxFailed (Mac48Address address); |
290 |
void RecordGotAssocTxFailed (Mac48Address address); |
|
|
291 |
/** |
292 |
* Records that the STA was disassociated. |
293 |
* |
294 |
* \param address the address of the station |
295 |
*/ |
150 |
void RecordDisassociated (Mac48Address address); |
296 |
void RecordDisassociated (Mac48Address address); |
151 |
|
297 |
|
152 |
/** |
298 |
/** |
|
168 |
* \param header MAC header |
314 |
* \param header MAC header |
169 |
* \param packet the packet to send |
315 |
* \param packet the packet to send |
170 |
* \param fullPacketSize the size of the packet after its 802.11 MAC header has been added. |
316 |
* \param fullPacketSize the size of the packet after its 802.11 MAC header has been added. |
171 |
* \returns the transmission mode to use to send this packet |
317 |
* \return the transmission mode to use to send this packet |
172 |
*/ |
318 |
*/ |
173 |
WifiTxVector GetDataTxVector (Mac48Address address, const WifiMacHeader *header, |
319 |
WifiTxVector GetDataTxVector (Mac48Address address, const WifiMacHeader *header, |
174 |
Ptr<const Packet> packet, uint32_t fullPacketSize); |
320 |
Ptr<const Packet> packet, uint32_t fullPacketSize); |
|
176 |
* \param address remote address |
322 |
* \param address remote address |
177 |
* \param header MAC header |
323 |
* \param header MAC header |
178 |
* \param packet the packet to send |
324 |
* \param packet the packet to send |
179 |
* \returns the transmission mode to use to send the RTS prior to the |
325 |
* |
|
|
326 |
* \return the transmission mode to use to send the RTS prior to the |
180 |
* transmission of the data packet itself. |
327 |
* transmission of the data packet itself. |
181 |
*/ |
328 |
*/ |
182 |
WifiTxVector GetRtsTxVector (Mac48Address address, const WifiMacHeader *header, |
329 |
WifiTxVector GetRtsTxVector (Mac48Address address, const WifiMacHeader *header, |
183 |
Ptr<const Packet> packet); |
330 |
Ptr<const Packet> packet); |
184 |
|
331 |
|
|
|
332 |
/** |
333 |
* \param header MAC header |
334 |
* \param packet the packet to send |
335 |
* |
336 |
* \return the transmission mode to use to send the CTS-to-self prior to the |
337 |
* transmission of the data packet itself. |
338 |
*/ |
185 |
WifiTxVector GetCtsToSelfTxVector (const WifiMacHeader *header, |
339 |
WifiTxVector GetCtsToSelfTxVector (const WifiMacHeader *header, |
186 |
Ptr<const Packet> packet); |
340 |
Ptr<const Packet> packet); |
187 |
|
341 |
|
188 |
//Since CTS to Self parameters don't depened on the station it is implemented in wifiremote station manager |
342 |
/** |
|
|
343 |
* Since CTS-to-self parameters are not dependent on the station, |
344 |
* it is implemented in wifiremote station manager |
345 |
*/ |
189 |
WifiTxVector DoGetCtsToSelfTxVector (void); |
346 |
WifiTxVector DoGetCtsToSelfTxVector (void); |
190 |
|
347 |
|
191 |
|
348 |
|
192 |
/** |
349 |
/** |
193 |
* Should be invoked whenever the RtsTimeout associated to a transmission |
350 |
* Should be invoked whenever the RtsTimeout associated to a transmission |
194 |
* attempt expires. |
351 |
* attempt expires. |
|
|
352 |
* |
353 |
* \param address the address of the receiver |
354 |
* \param header MAC header of the DATA packet |
195 |
*/ |
355 |
*/ |
196 |
void ReportRtsFailed (Mac48Address address, const WifiMacHeader *header); |
356 |
void ReportRtsFailed (Mac48Address address, const WifiMacHeader *header); |
197 |
/** |
357 |
/** |
198 |
* Should be invoked whenever the AckTimeout associated to a transmission |
358 |
* Should be invoked whenever the AckTimeout associated to a transmission |
199 |
* attempt expires. |
359 |
* attempt expires. |
|
|
360 |
* |
361 |
* \param address the address of the receiver |
362 |
* \param header MAC header of the DATA packet |
200 |
*/ |
363 |
*/ |
201 |
void ReportDataFailed (Mac48Address address, const WifiMacHeader *header); |
364 |
void ReportDataFailed (Mac48Address address, const WifiMacHeader *header); |
202 |
/** |
365 |
/** |
203 |
* Should be invoked whenever we receive the Cts associated to an RTS |
366 |
* Should be invoked whenever we receive the Cts associated to an RTS |
204 |
* we just sent. |
367 |
* we just sent. Note that we also get the SNR of the RTS we sent since |
|
|
368 |
* the receiver put a SnrTag in the CTS. |
369 |
* |
370 |
* \param address the address of the receiver |
371 |
* \param header MAC header of the DATA packet |
372 |
* \param ctsSnr the SNR of the CTS we received |
373 |
* \param ctsMode the WifiMode the receiver used to send the CTS |
374 |
* \param rtsSnr the SNR of the RTS we sent |
205 |
*/ |
375 |
*/ |
206 |
void ReportRtsOk (Mac48Address address, const WifiMacHeader *header, |
376 |
void ReportRtsOk (Mac48Address address, const WifiMacHeader *header, |
207 |
double ctsSnr, WifiMode ctsMode, double rtsSnr); |
377 |
double ctsSnr, WifiMode ctsMode, double rtsSnr); |
208 |
/** |
378 |
/** |
209 |
* Should be invoked whenever we receive the Ack associated to a data packet |
379 |
* Should be invoked whenever we receive the Ack associated to a data packet |
210 |
* we just sent. |
380 |
* we just sent. |
|
|
381 |
* |
382 |
* \param address the address of the receiver |
383 |
* \param header MAC header of the DATA packet |
384 |
* \param ackSnr the SNR of the ACK we received |
385 |
* \param ackMode the WifiMode the receiver used to send the ACK |
386 |
* \param dataSnr the SNR of the DATA we sent |
211 |
*/ |
387 |
*/ |
212 |
void ReportDataOk (Mac48Address address, const WifiMacHeader *header, |
388 |
void ReportDataOk (Mac48Address address, const WifiMacHeader *header, |
213 |
double ackSnr, WifiMode ackMode, double dataSnr); |
389 |
double ackSnr, WifiMode ackMode, double dataSnr); |
214 |
/** |
390 |
/** |
215 |
* Should be invoked after calling ReportRtsFailed if |
391 |
* Should be invoked after calling ReportRtsFailed if |
216 |
* NeedRtsRetransmission returns false |
392 |
* NeedRtsRetransmission returns false |
|
|
393 |
* |
394 |
* \param address the address of the receiver |
395 |
* \param header MAC header of the DATA packet |
217 |
*/ |
396 |
*/ |
218 |
void ReportFinalRtsFailed (Mac48Address address, const WifiMacHeader *header); |
397 |
void ReportFinalRtsFailed (Mac48Address address, const WifiMacHeader *header); |
219 |
/** |
398 |
/** |
220 |
* Should be invoked after calling ReportDataFailed if |
399 |
* Should be invoked after calling ReportDataFailed if |
221 |
* NeedDataRetransmission returns false |
400 |
* NeedDataRetransmission returns false |
|
|
401 |
* |
402 |
* \param address the address of the receiver |
403 |
* \param header MAC header of the DATA packet |
222 |
*/ |
404 |
*/ |
223 |
void ReportFinalDataFailed (Mac48Address address, const WifiMacHeader *header); |
405 |
void ReportFinalDataFailed (Mac48Address address, const WifiMacHeader *header); |
224 |
|
406 |
|
|
237 |
* \param address remote address |
419 |
* \param address remote address |
238 |
* \param header MAC header |
420 |
* \param header MAC header |
239 |
* \param packet the packet to send |
421 |
* \param packet the packet to send |
240 |
* \returns true if we want to use an RTS/CTS handshake for this |
422 |
* \return true if we want to use an RTS/CTS handshake for this |
241 |
* packet before sending it, false otherwise. |
423 |
* packet before sending it, false otherwise. |
242 |
*/ |
424 |
*/ |
243 |
bool NeedRts (Mac48Address address, const WifiMacHeader *header, |
425 |
bool NeedRts (Mac48Address address, const WifiMacHeader *header, |
244 |
Ptr<const Packet> packet); |
426 |
Ptr<const Packet> packet); |
|
|
427 |
/** |
428 |
* Return if we need to do Cts-to-self before sending a DATA. |
429 |
* |
430 |
* \return true if Cts-to-self is needed, false otherwise |
431 |
*/ |
245 |
bool NeedCtsToSelf (WifiTxVector txVector); |
432 |
bool NeedCtsToSelf (WifiTxVector txVector); |
246 |
|
433 |
|
247 |
/** |
434 |
/** |
248 |
* \param address remote address |
435 |
* \param address remote address |
249 |
* \param header MAC header |
436 |
* \param header MAC header |
250 |
* \param packet the packet to send |
437 |
* \param packet the packet to send |
251 |
* \returns true if we want to restart a failed RTS/CTS |
438 |
* \return true if we want to restart a failed RTS/CTS |
252 |
* handshake, false otherwise. |
439 |
* handshake, false otherwise. |
253 |
*/ |
440 |
*/ |
254 |
bool NeedRtsRetransmission (Mac48Address address, const WifiMacHeader *header, |
441 |
bool NeedRtsRetransmission (Mac48Address address, const WifiMacHeader *header, |
|
257 |
* \param address remote address |
444 |
* \param address remote address |
258 |
* \param header MAC header |
445 |
* \param header MAC header |
259 |
* \param packet the packet to send |
446 |
* \param packet the packet to send |
260 |
* \returns true if we want to resend a packet |
447 |
* \return true if we want to resend a packet |
261 |
* after a failed transmission attempt, false otherwise. |
448 |
* after a failed transmission attempt, false otherwise. |
262 |
*/ |
449 |
*/ |
263 |
bool NeedDataRetransmission (Mac48Address address, const WifiMacHeader *header, |
450 |
bool NeedDataRetransmission (Mac48Address address, const WifiMacHeader *header, |
|
267 |
* \param address remote address |
454 |
* \param address remote address |
268 |
* \param header MAC header |
455 |
* \param header MAC header |
269 |
* \param packet the packet to send |
456 |
* \param packet the packet to send |
270 |
* \returns true if this packet should be fragmented, false otherwise. |
457 |
* \return true if this packet should be fragmented, false otherwise. |
271 |
*/ |
458 |
*/ |
272 |
bool NeedFragmentation (Mac48Address address, const WifiMacHeader *header, |
459 |
bool NeedFragmentation (Mac48Address address, const WifiMacHeader *header, |
273 |
Ptr<const Packet> packet); |
460 |
Ptr<const Packet> packet); |
|
276 |
* \param header MAC header |
463 |
* \param header MAC header |
277 |
* \param packet the packet to send |
464 |
* \param packet the packet to send |
278 |
* \param fragmentNumber the fragment index of the next fragment to send (starts at zero). |
465 |
* \param fragmentNumber the fragment index of the next fragment to send (starts at zero). |
279 |
* \returns the size of the corresponding fragment. |
466 |
* \return the size of the corresponding fragment. |
280 |
*/ |
467 |
*/ |
281 |
uint32_t GetFragmentSize (Mac48Address address, const WifiMacHeader *header, |
468 |
uint32_t GetFragmentSize (Mac48Address address, const WifiMacHeader *header, |
282 |
Ptr<const Packet> packet, uint32_t fragmentNumber); |
469 |
Ptr<const Packet> packet, uint32_t fragmentNumber); |
|
285 |
* \param header MAC header |
472 |
* \param header MAC header |
286 |
* \param packet the packet to send |
473 |
* \param packet the packet to send |
287 |
* \param fragmentNumber the fragment index of the next fragment to send (starts at zero). |
474 |
* \param fragmentNumber the fragment index of the next fragment to send (starts at zero). |
288 |
* \returns the offset within the original packet where this fragment starts. |
475 |
* \return the offset within the original packet where this fragment starts. |
289 |
*/ |
476 |
*/ |
290 |
uint32_t GetFragmentOffset (Mac48Address address, const WifiMacHeader *header, |
477 |
uint32_t GetFragmentOffset (Mac48Address address, const WifiMacHeader *header, |
291 |
Ptr<const Packet> packet, uint32_t fragmentNumber); |
478 |
Ptr<const Packet> packet, uint32_t fragmentNumber); |
|
294 |
* \param header MAC header |
481 |
* \param header MAC header |
295 |
* \param packet the packet to send |
482 |
* \param packet the packet to send |
296 |
* \param fragmentNumber the fragment index of the next fragment to send (starts at zero). |
483 |
* \param fragmentNumber the fragment index of the next fragment to send (starts at zero). |
297 |
* \returns true if this is the last fragment, false otherwise. |
484 |
* \return true if this is the last fragment, false otherwise. |
298 |
*/ |
485 |
*/ |
299 |
bool IsLastFragment (Mac48Address address, const WifiMacHeader *header, |
486 |
bool IsLastFragment (Mac48Address address, const WifiMacHeader *header, |
300 |
Ptr<const Packet> packet, uint32_t fragmentNumber); |
487 |
Ptr<const Packet> packet, uint32_t fragmentNumber); |
|
302 |
/** |
489 |
/** |
303 |
* \param address remote address |
490 |
* \param address remote address |
304 |
* \param rtsMode the transmission mode used to send an RTS we just received |
491 |
* \param rtsMode the transmission mode used to send an RTS we just received |
305 |
* \returns the transmission mode to use for the CTS to complete the RTS/CTS |
492 |
* \return the transmission mode to use for the CTS to complete the RTS/CTS |
306 |
* handshake. |
493 |
* handshake. |
307 |
*/ |
494 |
*/ |
308 |
WifiTxVector GetCtsTxVector (Mac48Address address, WifiMode rtsMode); |
495 |
WifiTxVector GetCtsTxVector (Mac48Address address, WifiMode rtsMode); |
309 |
/** |
496 |
/** |
310 |
* \param address |
497 |
* \param address |
311 |
* \param dataMode the transmission mode used to send an ACK we just received |
498 |
* \param dataMode the transmission mode used to send an ACK we just received |
312 |
* \returns the transmission mode to use for the ACK to complete the data/ACK |
499 |
* \return the transmission mode to use for the ACK to complete the data/ACK |
313 |
* handshake. |
500 |
* handshake. |
314 |
*/ |
501 |
*/ |
315 |
WifiTxVector GetAckTxVector (Mac48Address address, WifiMode dataMode); |
502 |
WifiTxVector GetAckTxVector (Mac48Address address, WifiMode dataMode); |
316 |
/** |
503 |
/** |
317 |
* \param address |
504 |
* \param address |
318 |
* \param dataMode the transmission mode used to send an ACK we just received |
505 |
* \param dataMode the transmission mode used to send an ACK we just received |
319 |
* \returns the transmission mode to use for the ACK to complete the data/ACK |
506 |
* \return the transmission mode to use for the ACK to complete the data/ACK |
320 |
* handshake. |
507 |
* handshake. |
321 |
*/ |
508 |
*/ |
322 |
WifiTxVector GetBlockAckTxVector (Mac48Address address, WifiMode dataMode); |
509 |
WifiTxVector GetBlockAckTxVector (Mac48Address address, WifiMode dataMode); |
323 |
/** |
510 |
/** |
324 |
* \returns the default transmission power |
511 |
* \return the default transmission power |
325 |
*/ |
512 |
*/ |
326 |
uint8_t GetDefaultTxPowerLevel (void) const; |
513 |
uint8_t GetDefaultTxPowerLevel (void) const; |
327 |
/** |
514 |
/** |
328 |
* \param address of the remote station |
515 |
* \param address of the remote station |
329 |
* \returns information regarding the remote station associated with the given address |
516 |
* \return information regarding the remote station associated with the given address |
330 |
*/ |
517 |
*/ |
331 |
WifiRemoteStationInfo GetInfo (Mac48Address address); |
518 |
WifiRemoteStationInfo GetInfo (Mac48Address address); |
332 |
/** |
519 |
/** |
333 |
* Set the default transmission power level |
520 |
* Set the default transmission power level |
|
|
521 |
* |
522 |
* \param the default transmission power level |
334 |
*/ |
523 |
*/ |
335 |
void SetDefaultTxPowerLevel (uint8_t txPower); |
524 |
void SetDefaultTxPowerLevel (uint8_t txPower); |
336 |
/** |
525 |
/** |
337 |
* \returns the number of transmit antennas supported by the phy layer |
526 |
* \return the number of transmit antennas supported by the phy layer |
338 |
*/ |
527 |
*/ |
339 |
uint32_t GetNumberOfTransmitAntennas (void); |
528 |
uint32_t GetNumberOfTransmitAntennas (void); |
340 |
|
529 |
|
341 |
protected: |
530 |
protected: |
342 |
virtual void DoDispose (void); |
531 |
virtual void DoDispose (void); |
343 |
// for convenience |
532 |
/** |
|
|
533 |
* Return whether mode associated with the specified station at the specified index. |
534 |
* |
535 |
* \param station the station being queried |
536 |
* \param i the index |
537 |
* \return WifiMode at the given index of the specified station |
538 |
*/ |
344 |
WifiMode GetSupported (const WifiRemoteStation *station, uint32_t i) const; |
539 |
WifiMode GetSupported (const WifiRemoteStation *station, uint32_t i) const; |
|
|
540 |
/** |
541 |
* Return the number of modes supported by the given station. |
542 |
* |
543 |
* \param station the station being queried |
544 |
* \return the number of modes supported by the given station |
545 |
*/ |
345 |
uint32_t GetNSupported (const WifiRemoteStation *station) const; |
546 |
uint32_t GetNSupported (const WifiRemoteStation *station) const; |
346 |
uint8_t GetMcsSupported (const WifiRemoteStation *station, uint32_t i) const; |
547 |
uint8_t GetMcsSupported (const WifiRemoteStation *station, uint32_t i) const; |
347 |
uint32_t GetNMcsSupported (const WifiRemoteStation *station) const; |
548 |
uint32_t GetNMcsSupported (const WifiRemoteStation *station) const; |
348 |
|
549 |
|
|
|
550 |
/** |
551 |
* Return whether the given station supports short guard interval. |
552 |
* |
553 |
* \param station the station being queried |
554 |
* \return true if the station supports short guard interval, |
555 |
* false otherwise |
556 |
*/ |
349 |
bool GetShortGuardInterval (const WifiRemoteStation *station) const; |
557 |
bool GetShortGuardInterval (const WifiRemoteStation *station) const; |
350 |
bool GetStbc (const WifiRemoteStation *station) const; |
558 |
bool GetStbc (const WifiRemoteStation *station) const; |
|
|
559 |
/** |
560 |
* Return whether the station supports Greenfield or not. |
561 |
* |
562 |
* \param station the station being queried |
563 |
* \return true if Greenfield is supported by the station, |
564 |
* false otherwise |
565 |
*/ |
351 |
bool GetGreenfield (const WifiRemoteStation *station) const; |
566 |
bool GetGreenfield (const WifiRemoteStation *station) const; |
|
|
567 |
/** |
568 |
* Return the number of receive antenna the station has. |
569 |
* |
570 |
* \param station the station being queried |
571 |
* \return the number of receive antenna the station has |
572 |
*/ |
352 |
uint32_t GetNumberOfReceiveAntennas (const WifiRemoteStation *station) const; |
573 |
uint32_t GetNumberOfReceiveAntennas (const WifiRemoteStation *station) const; |
|
|
574 |
/** |
575 |
* Return the number of transmit antenna the station has. |
576 |
* |
577 |
* \param station the station being queried |
578 |
* \return the number of transmit antenna the station has |
579 |
*/ |
353 |
uint32_t GetNumberOfTransmitAntennas (const WifiRemoteStation *station) const; |
580 |
uint32_t GetNumberOfTransmitAntennas (const WifiRemoteStation *station) const; |
|
|
581 |
/** |
582 |
* Return the long retry limit of the given station. |
583 |
* |
584 |
* \param station the station being queried |
585 |
* \return the long retry limit of the the station |
586 |
*/ |
354 |
uint32_t GetLongRetryCount (const WifiRemoteStation *station) const; |
587 |
uint32_t GetLongRetryCount (const WifiRemoteStation *station) const; |
|
|
588 |
/** |
589 |
* Return the short retry limit of the given station. |
590 |
* |
591 |
* \param station the station being queried |
592 |
* \return the short retry limit of the the station |
593 |
*/ |
355 |
uint32_t GetShortRetryCount (const WifiRemoteStation *station) const; |
594 |
uint32_t GetShortRetryCount (const WifiRemoteStation *station) const; |
356 |
private: |
595 |
private: |
357 |
/** |
596 |
/** |
|
359 |
* \param packet the packet to send |
598 |
* \param packet the packet to send |
360 |
* \param normally indicates whether the normal 802.11 rts enable mechanism would |
599 |
* \param normally indicates whether the normal 802.11 rts enable mechanism would |
361 |
* request that the rts is sent or not. |
600 |
* request that the rts is sent or not. |
362 |
* \returns true if we want to use an RTS/CTS handshake for this |
601 |
* \return true if we want to use an RTS/CTS handshake for this |
363 |
* packet before sending it, false otherwise. |
602 |
* packet before sending it, false otherwise. |
364 |
* |
603 |
* |
365 |
* Note: This method is called before a unicast packet is sent on the medium. |
604 |
* Note: This method is called before a unicast packet is sent on the medium. |
|
371 |
* \param packet the packet to send |
610 |
* \param packet the packet to send |
372 |
* \param normally indicates whether the normal 802.11 rts enable mechanism would |
611 |
* \param normally indicates whether the normal 802.11 rts enable mechanism would |
373 |
* request that the rts is retransmitted or not. |
612 |
* request that the rts is retransmitted or not. |
374 |
* \returns true if we want to restart a failed RTS/CTS |
613 |
* \return true if we want to restart a failed RTS/CTS |
375 |
* handshake, false otherwise. |
614 |
* handshake, false otherwise. |
376 |
* |
615 |
* |
377 |
* Note: This method is called after an rts/cts handshake has been attempted |
616 |
* Note: This method is called after an rts/cts handshake has been attempted |
|
384 |
* \param packet the packet to send |
623 |
* \param packet the packet to send |
385 |
* \param normally indicates whether the normal 802.11 data retransmission mechanism |
624 |
* \param normally indicates whether the normal 802.11 data retransmission mechanism |
386 |
* would request that the data is retransmitted or not. |
625 |
* would request that the data is retransmitted or not. |
387 |
* \returns true if we want to resend a packet |
626 |
* \return true if we want to resend a packet |
388 |
* after a failed transmission attempt, false otherwise. |
627 |
* after a failed transmission attempt, false otherwise. |
389 |
* |
628 |
* |
390 |
* Note: This method is called after a unicast packet transmission has been attempted |
629 |
* Note: This method is called after a unicast packet transmission has been attempted |
|
398 |
* \param packet the packet to send |
637 |
* \param packet the packet to send |
399 |
* \param normally indicates whether the normal 802.11 data fragmentation mechanism |
638 |
* \param normally indicates whether the normal 802.11 data fragmentation mechanism |
400 |
* would request that the data packet is fragmented or not. |
639 |
* would request that the data packet is fragmented or not. |
401 |
* \returns true if this packet should be fragmented, false otherwise. |
640 |
* \return true if this packet should be fragmented, false otherwise. |
402 |
* |
641 |
* |
403 |
* Note: This method is called before sending a unicast packet. |
642 |
* Note: This method is called before sending a unicast packet. |
404 |
*/ |
643 |
*/ |
405 |
virtual bool DoNeedFragmentation (WifiRemoteStation *station, |
644 |
virtual bool DoNeedFragmentation (WifiRemoteStation *station, |
406 |
Ptr<const Packet> packet, bool normally); |
645 |
Ptr<const Packet> packet, bool normally); |
407 |
/** |
646 |
/** |
408 |
* \returns whether this manager is a manager designed to work in low-latency |
647 |
* \return whether this manager is a manager designed to work in low-latency |
409 |
* environments. |
648 |
* environments. |
410 |
* |
649 |
* |
411 |
* Note: In this context, low vs high latency is defined in <i>IEEE 802.11 Rate Adaptation: |
650 |
* Note: In this context, low vs high latency is defined in <i>IEEE 802.11 Rate Adaptation: |
|
419 |
/** |
658 |
/** |
420 |
* \param station the station with which we need to communicate |
659 |
* \param station the station with which we need to communicate |
421 |
* \param size size of the packet or fragment we want to send |
660 |
* \param size size of the packet or fragment we want to send |
422 |
* \returns the transmission mode to use to send a packet to the station |
661 |
* \return the transmission mode to use to send a packet to the station |
423 |
* |
662 |
* |
424 |
* Note: This method is called before sending a unicast packet or a fragment |
663 |
* Note: This method is called before sending a unicast packet or a fragment |
425 |
* of a unicast packet to decide which transmission mode to use. |
664 |
* of a unicast packet to decide which transmission mode to use. |
|
428 |
uint32_t size) = 0; |
667 |
uint32_t size) = 0; |
429 |
/** |
668 |
/** |
430 |
* \param station the station with which we need to communicate |
669 |
* \param station the station with which we need to communicate |
431 |
* \returns the transmission mode to use to send an rts to the station |
670 |
* \return the transmission mode to use to send an rts to the station |
432 |
* |
671 |
* |
433 |
* Note: This method is called before sending an rts to a station |
672 |
* Note: This method is called before sending an rts to a station |
434 |
* to decide which transmission mode to use for the rts. |
673 |
* to decide which transmission mode to use for the rts. |
|
446 |
|
685 |
|
447 |
/** |
686 |
/** |
448 |
* \param address the address of the recipient of the ACK |
687 |
* \param address the address of the recipient of the ACK |
449 |
* \param ctsMode the mode to be used for the ACK |
688 |
* \param ackMode the mode to be used for the ACK |
450 |
* |
689 |
* |
451 |
* \return the power level to be used to send the ACK |
690 |
* \return the power level to be used to send the ACK |
452 |
*/ |
691 |
*/ |
|
454 |
|
693 |
|
455 |
/** |
694 |
/** |
456 |
* \param address the address of the recipient of the Block ACK |
695 |
* \param address the address of the recipient of the Block ACK |
457 |
* \param ctsMode the mode to be used for the Block ACK |
696 |
* \param blockAckMode the mode to be used for the Block ACK |
458 |
* |
697 |
* |
459 |
* \return the power level to be used to send the Block ACK |
698 |
* \return the power level to be used to send the Block ACK |
460 |
*/ |
699 |
*/ |
|
474 |
virtual uint8_t DoGetBlockAckTxNess(Mac48Address address, WifiMode blockAckMode); |
713 |
virtual uint8_t DoGetBlockAckTxNess(Mac48Address address, WifiMode blockAckMode); |
475 |
virtual bool DoGetBlockAckTxStbc(Mac48Address address, WifiMode blockAckMode); |
714 |
virtual bool DoGetBlockAckTxStbc(Mac48Address address, WifiMode blockAckMode); |
476 |
|
715 |
|
|
|
716 |
/** |
717 |
* This method is a pure virtual method that must be implemented by the sub-class. |
718 |
* This allows different types of WifiRemoteStationManager to respond differently, |
719 |
* |
720 |
* \param station the station with which we failed to send RTS |
721 |
*/ |
477 |
virtual void DoReportRtsFailed (WifiRemoteStation *station) = 0; |
722 |
virtual void DoReportRtsFailed (WifiRemoteStation *station) = 0; |
|
|
723 |
/** |
724 |
* This method is a pure virtual method that must be implemented by the sub-class. |
725 |
* This allows different types of WifiRemoteStationManager to respond differently, |
726 |
* |
727 |
* \param station the station with which we failed to send DATA |
728 |
*/ |
478 |
virtual void DoReportDataFailed (WifiRemoteStation *station) = 0; |
729 |
virtual void DoReportDataFailed (WifiRemoteStation *station) = 0; |
|
|
730 |
/** |
731 |
* This method is a pure virtual method that must be implemented by the sub-class. |
732 |
* This allows different types of WifiRemoteStationManager to respond differently, |
733 |
* |
734 |
* \param station the station with which we successfully sent RTS |
735 |
* \param ctsSnr the SNR of the CTS we received |
736 |
* \param ctsMode the WifiMode the receiver used to send the CTS |
737 |
* \param rtsSnr the SNR of the RTS we sent |
738 |
*/ |
479 |
virtual void DoReportRtsOk (WifiRemoteStation *station, |
739 |
virtual void DoReportRtsOk (WifiRemoteStation *station, |
480 |
double ctsSnr, WifiMode ctsMode, double rtsSnr) = 0; |
740 |
double ctsSnr, WifiMode ctsMode, double rtsSnr) = 0; |
|
|
741 |
/** |
742 |
* This method is a pure virtual method that must be implemented by the sub-class. |
743 |
* This allows different types of WifiRemoteStationManager to respond differently, |
744 |
* |
745 |
* \param station the station with which we successfully sent RTS |
746 |
* \param ackSnr the SNR of the ACK we received |
747 |
* \param ackMode the WifiMode the receiver used to send the ACK |
748 |
* \param dataSnr the SNR of the DATA we sent |
749 |
*/ |
481 |
virtual void DoReportDataOk (WifiRemoteStation *station, |
750 |
virtual void DoReportDataOk (WifiRemoteStation *station, |
482 |
double ackSnr, WifiMode ackMode, double dataSnr) = 0; |
751 |
double ackSnr, WifiMode ackMode, double dataSnr) = 0; |
|
|
752 |
/** |
753 |
* This method is a pure virtual method that must be implemented by the sub-class. |
754 |
* This allows different types of WifiRemoteStationManager to respond differently, |
755 |
* |
756 |
* \param station the station with which we failed to send RTS |
757 |
*/ |
483 |
virtual void DoReportFinalRtsFailed (WifiRemoteStation *station) = 0; |
758 |
virtual void DoReportFinalRtsFailed (WifiRemoteStation *station) = 0; |
|
|
759 |
/** |
760 |
* This method is a pure virtual method that must be implemented by the sub-class. |
761 |
* This allows different types of WifiRemoteStationManager to respond differently, |
762 |
* |
763 |
* \param station the station with which we failed to send DATA |
764 |
*/ |
484 |
virtual void DoReportFinalDataFailed (WifiRemoteStation *station) = 0; |
765 |
virtual void DoReportFinalDataFailed (WifiRemoteStation *station) = 0; |
|
|
766 |
/** |
767 |
* This method is a pure virtual method that must be implemented by the sub-class. |
768 |
* This allows different types of WifiRemoteStationManager to respond differently, |
769 |
* |
770 |
* \param station the station that sent the DATA to us |
771 |
* \param rxSnr the SNR of the DATA we received |
772 |
* \param txMode the WifiMode the sender used to send the DATA |
773 |
*/ |
485 |
virtual void DoReportRxOk (WifiRemoteStation *station, |
774 |
virtual void DoReportRxOk (WifiRemoteStation *station, |
486 |
double rxSnr, WifiMode txMode) = 0; |
775 |
double rxSnr, WifiMode txMode) = 0; |
487 |
|
776 |
|
|
|
777 |
/** |
778 |
* Return the state of the station associated with the given address. |
779 |
* |
780 |
* \param address the address of the station |
781 |
* \return WifiRemoteStationState corresponding to the address |
782 |
*/ |
488 |
WifiRemoteStationState* LookupState (Mac48Address address) const; |
783 |
WifiRemoteStationState* LookupState (Mac48Address address) const; |
|
|
784 |
/** |
785 |
* Return the station associated with the given address and TID. |
786 |
* |
787 |
* \param address the address of the station |
788 |
* \param tid the TID |
789 |
* \return WifiRemoteStation corresponding to the address |
790 |
*/ |
489 |
WifiRemoteStation* Lookup (Mac48Address address, uint8_t tid) const; |
791 |
WifiRemoteStation* Lookup (Mac48Address address, uint8_t tid) const; |
490 |
/// Find a remote station by its remote address and TID taken from MAC header |
792 |
/// Find a remote station by its remote address and TID taken from MAC header |
|
|
793 |
/** |
794 |
* Return the station associated with the given address and MAC header. |
795 |
* It simply gets TID from the MAC header and calls Lookup with tid. |
796 |
* |
797 |
* \param address the address of the station |
798 |
* \param header MAC header |
799 |
* \return WifiRemoteStation corresponding to the address |
800 |
*/ |
491 |
WifiRemoteStation* Lookup (Mac48Address address, const WifiMacHeader *header) const; |
801 |
WifiRemoteStation* Lookup (Mac48Address address, const WifiMacHeader *header) const; |
492 |
WifiMode GetControlAnswerMode (Mac48Address address, WifiMode reqMode); |
802 |
WifiMode GetControlAnswerMode (Mac48Address address, WifiMode reqMode); |
493 |
|
803 |
|
|
|
804 |
/** |
805 |
* Actually sets the fragmentation threshold, it also checks the validity of |
806 |
* the given threshold. |
807 |
* |
808 |
* \param threshold the fragmentation threshold |
809 |
*/ |
494 |
void DoSetFragmentationThreshold (uint32_t threshold); |
810 |
void DoSetFragmentationThreshold (uint32_t threshold); |
|
|
811 |
/** |
812 |
* Return the current fragmentation threshold |
813 |
* |
814 |
* \return the fragmentation threshold |
815 |
*/ |
495 |
uint32_t DoGetFragmentationThreshold (void) const; |
816 |
uint32_t DoGetFragmentationThreshold (void) const; |
|
|
817 |
/** |
818 |
* Return the number of fragments needed for the given packet. |
819 |
* |
820 |
* \param header MAC header |
821 |
* \param packet the packet to be fragmented |
822 |
* \return the number of fragments needed |
823 |
*/ |
496 |
uint32_t GetNFragments (const WifiMacHeader *header, Ptr<const Packet> packet); |
824 |
uint32_t GetNFragments (const WifiMacHeader *header, Ptr<const Packet> packet); |
497 |
|
825 |
|
|
|
826 |
/** |
827 |
* A vector of WifiRemoteStations |
828 |
*/ |
498 |
typedef std::vector <WifiRemoteStation *> Stations; |
829 |
typedef std::vector <WifiRemoteStation *> Stations; |
|
|
830 |
/** |
831 |
* A vector of WifiRemoteStationStates |
832 |
*/ |
499 |
typedef std::vector <WifiRemoteStationState *> StationStates; |
833 |
typedef std::vector <WifiRemoteStationState *> StationStates; |
500 |
|
834 |
|
501 |
StationStates m_states; |
835 |
StationStates m_states; |
|
552 |
|
886 |
|
553 |
}; |
887 |
}; |
554 |
|
888 |
|
|
|
889 |
/** |
890 |
* A struct that holds information about each remote station. |
891 |
*/ |
555 |
struct WifiRemoteStationState |
892 |
struct WifiRemoteStationState |
556 |
{ |
893 |
{ |
557 |
enum |
894 |
enum |