A Discrete-Event Network Simulator
API
ht-operation.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2016 Sébastien Deronne
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation;
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program; if not, write to the Free Software
15  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16  *
17  * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
18  */
19 
20 #include "ht-operation.h"
21 
22 namespace ns3
23 {
24 
26  : m_primaryChannel(0),
27  m_secondaryChannelOffset(0),
28  m_staChannelWidth(0),
29  m_rifsMode(0),
30  m_reservedInformationSubset1(0),
31  m_htProtection(0),
32  m_nonGfHtStasPresent(1),
33  m_reservedInformationSubset2_1(0),
34  m_obssNonHtStasPresent(0),
35  m_reservedInformationSubset2_2(0),
36  m_reservedInformationSubset3_1(0),
37  m_dualBeacon(0),
38  m_dualCtsProtection(0),
39  m_stbcBeacon(0),
40  m_lSigTxopProtectionFullSupport(0),
41  m_pcoActive(0),
42  m_pcoPhase(0),
43  m_reservedInformationSubset3_2(0),
44  m_reservedMcsSet1(0),
45  m_rxHighestSupportedDataRate(0),
46  m_reservedMcsSet2(0),
47  m_txMcsSetDefined(0),
48  m_txRxMcsSetUnequal(0),
49  m_txMaxNSpatialStreams(0),
50  m_txUnequalModulation(0),
51  m_reservedMcsSet3(0)
52 {
53  for (uint8_t k = 0; k < MAX_SUPPORTED_MCS; k++)
54  {
55  m_rxMcsBitmask[k] = 0;
56  }
57 }
58 
61 {
62  return IE_HT_OPERATION;
63 }
64 
65 uint16_t
67 {
68  return 22;
69 }
70 
71 void
73 {
74  m_primaryChannel = ctrl;
75 }
76 
77 void
78 HtOperation::SetSecondaryChannelOffset(uint8_t secondaryChannelOffset)
79 {
80  m_secondaryChannelOffset = secondaryChannelOffset;
81 }
82 
83 void
84 HtOperation::SetStaChannelWidth(uint8_t staChannelWidth)
85 {
86  m_staChannelWidth = staChannelWidth;
87 }
88 
89 void
90 HtOperation::SetRifsMode(uint8_t rifsMode)
91 {
92  m_rifsMode = rifsMode;
93 }
94 
95 void
96 HtOperation::SetHtProtection(uint8_t htProtection)
97 {
98  m_htProtection = htProtection;
99 }
100 
101 void
102 HtOperation::SetNonGfHtStasPresent(uint8_t nonGfHtStasPresent)
103 {
104  m_nonGfHtStasPresent = nonGfHtStasPresent;
105 }
106 
107 void
108 HtOperation::SetObssNonHtStasPresent(uint8_t obssNonHtStasPresent)
109 {
110  m_obssNonHtStasPresent = obssNonHtStasPresent;
111 }
112 
113 void
114 HtOperation::SetDualBeacon(uint8_t dualBeacon)
115 {
116  m_dualBeacon = dualBeacon;
117 }
118 
119 void
120 HtOperation::SetDualCtsProtection(uint8_t dualCtsProtection)
121 {
122  m_dualCtsProtection = dualCtsProtection;
123 }
124 
125 void
126 HtOperation::SetStbcBeacon(uint8_t stbcBeacon)
127 {
128  m_stbcBeacon = stbcBeacon;
129 }
130 
131 void
132 HtOperation::SetLSigTxopProtectionFullSupport(uint8_t lSigTxopProtectionFullSupport)
133 {
134  m_lSigTxopProtectionFullSupport = lSigTxopProtectionFullSupport;
135 }
136 
137 void
138 HtOperation::SetPcoActive(uint8_t pcoActive)
139 {
140  m_pcoActive = pcoActive;
141 }
142 
143 void
144 HtOperation::SetPhase(uint8_t pcoPhase)
145 {
146  m_pcoPhase = pcoPhase;
147 }
148 
149 void
151 {
152  m_rxMcsBitmask[index] = 1;
153 }
154 
155 void
157 {
158  m_rxHighestSupportedDataRate = maxSupportedRate;
159 }
160 
161 void
162 HtOperation::SetTxMcsSetDefined(uint8_t txMcsSetDefined)
163 {
164  m_txMcsSetDefined = txMcsSetDefined;
165 }
166 
167 void
168 HtOperation::SetTxRxMcsSetUnequal(uint8_t txRxMcsSetUnequal)
169 {
170  m_txRxMcsSetUnequal = txRxMcsSetUnequal;
171 }
172 
173 void
174 HtOperation::SetTxMaxNSpatialStreams(uint8_t maxTxSpatialStreams)
175 {
176  m_txMaxNSpatialStreams = maxTxSpatialStreams - 1; // 0 for 1 SS, 1 for 2 SSs, etc
177 }
178 
179 void
180 HtOperation::SetTxUnequalModulation(uint8_t txUnequalModulation)
181 {
182  m_txUnequalModulation = txUnequalModulation;
183 }
184 
185 uint8_t
187 {
188  return m_primaryChannel;
189 }
190 
191 uint8_t
193 {
195 }
196 
197 uint8_t
199 {
200  return m_staChannelWidth;
201 }
202 
203 uint8_t
205 {
206  return m_rifsMode;
207 }
208 
209 uint8_t
211 {
212  return m_htProtection;
213 }
214 
215 uint8_t
217 {
218  return m_nonGfHtStasPresent;
219 }
220 
221 uint8_t
223 {
224  return m_obssNonHtStasPresent;
225 }
226 
227 uint8_t
229 {
230  return m_dualBeacon;
231 }
232 
233 uint8_t
235 {
236  return m_dualCtsProtection;
237 }
238 
239 uint8_t
241 {
242  return m_stbcBeacon;
243 }
244 
245 uint8_t
247 {
249 }
250 
251 uint8_t
253 {
254  return m_pcoActive;
255 }
256 
257 uint8_t
259 {
260  return m_pcoPhase;
261 }
262 
263 bool
264 HtOperation::IsSupportedMcs(uint8_t mcs) const
265 {
266  if (m_rxMcsBitmask[mcs] == 1)
267  {
268  return true;
269  }
270  return false;
271 }
272 
273 uint16_t
275 {
277 }
278 
279 uint8_t
281 {
282  return m_txMcsSetDefined;
283 }
284 
285 uint8_t
287 {
288  return m_txRxMcsSetUnequal;
289 }
290 
291 uint8_t
293 {
294  return m_txMaxNSpatialStreams;
295 }
296 
297 uint8_t
299 {
300  return m_txUnequalModulation;
301 }
302 
303 uint8_t
305 {
306  uint8_t val = 0;
307  val |= m_secondaryChannelOffset & 0x03;
308  val |= (m_staChannelWidth & 0x01) << 2;
309  val |= (m_rifsMode & 0x01) << 3;
310  val |= (m_reservedInformationSubset1 & 0x0f) << 4;
311  return val;
312 }
313 
314 void
316 {
317  m_secondaryChannelOffset = ctrl & 0x03;
318  m_staChannelWidth = (ctrl >> 2) & 0x01;
319  m_rifsMode = (ctrl >> 3) & 0x01;
320  m_reservedInformationSubset1 = (ctrl >> 4) & 0x0f;
321 }
322 
323 uint16_t
325 {
326  uint16_t val = 0;
327  val |= m_htProtection & 0x03;
328  val |= (m_nonGfHtStasPresent & 0x01) << 2;
329  val |= (m_reservedInformationSubset2_1 & 0x01) << 3;
330  val |= (m_obssNonHtStasPresent & 0x01) << 4;
331  val |= (m_reservedInformationSubset2_2 & 0x07ff) << 5;
332  return val;
333 }
334 
335 void
337 {
338  m_htProtection = ctrl & 0x03;
339  m_nonGfHtStasPresent = (ctrl >> 2) & 0x01;
340  m_reservedInformationSubset2_1 = (ctrl >> 3) & 0x01;
341  m_obssNonHtStasPresent = (ctrl >> 4) & 0x01;
342  m_reservedInformationSubset2_2 = static_cast<uint8_t>((ctrl >> 5) & 0x07ff);
343 }
344 
345 uint16_t
347 {
348  uint16_t val = 0;
349  val |= m_reservedInformationSubset3_1 & 0x3f;
350  val |= (m_dualBeacon & 0x01) << 6;
351  val |= (m_dualCtsProtection & 0x01) << 7;
352  val |= (m_stbcBeacon & 0x01) << 8;
353  val |= (m_lSigTxopProtectionFullSupport & 0x01) << 9;
354  val |= (m_pcoActive & 0x01) << 10;
355  val |= (m_pcoPhase & 0x01) << 11;
356  val |= (m_reservedInformationSubset3_2 & 0x0f) << 12;
357  return val;
358 }
359 
360 void
362 {
363  m_reservedInformationSubset3_1 = ctrl & 0x3f;
364  m_dualBeacon = (ctrl >> 6) & 0x01;
365  m_dualCtsProtection = (ctrl >> 7) & 0x01;
366  m_stbcBeacon = (ctrl >> 8) & 0x01;
367  m_lSigTxopProtectionFullSupport = (ctrl >> 9) & 0x01;
368  m_pcoActive = (ctrl >> 10) & 0x01;
369  m_pcoPhase = (ctrl >> 11) & 0x01;
370  m_reservedInformationSubset3_2 = (ctrl >> 12) & 0x0f;
371 }
372 
373 void
374 HtOperation::SetBasicMcsSet(uint64_t ctrl1, uint64_t ctrl2)
375 {
376  for (uint64_t i = 0; i < 77; i++)
377  {
378  if (i < 64)
379  {
380  m_rxMcsBitmask[i] = (ctrl1 >> i) & 0x01;
381  }
382  else
383  {
384  m_rxMcsBitmask[i] = (ctrl2 >> (i - 64)) & 0x01;
385  }
386  }
387  m_reservedMcsSet1 = (ctrl2 >> 13) & 0x07;
388  m_rxHighestSupportedDataRate = (ctrl2 >> 16) & 0x03ff;
389  m_reservedMcsSet2 = (ctrl2 >> 26) & 0x3f;
390  m_txMcsSetDefined = (ctrl2 >> 32) & 0x01;
391  m_txRxMcsSetUnequal = (ctrl2 >> 33) & 0x01;
392  m_txMaxNSpatialStreams = (ctrl2 >> 34) & 0x03;
393  m_txUnequalModulation = (ctrl2 >> 36) & 0x01;
394  m_reservedMcsSet3 = (ctrl2 >> 37) & 0x07ffffff;
395 }
396 
397 uint64_t
399 {
400  uint64_t val = 0;
401  for (uint64_t i = 63; i > 0; i--)
402  {
403  val = (val << 1) | (m_rxMcsBitmask[i] & 0x01);
404  }
405  val = (val << 1) | (m_rxMcsBitmask[0] & 0x01);
406  return val;
407 }
408 
409 uint64_t
411 {
412  uint64_t val = 0;
413  val = val | (m_reservedMcsSet3 & 0x07ffffff);
414  val = (val << 1) | (m_txUnequalModulation & 0x01);
415  val = (val << 2) | (m_txMaxNSpatialStreams & 0x03);
416  val = (val << 1) | (m_txRxMcsSetUnequal & 0x01);
417  val = (val << 1) | (m_txMcsSetDefined & 0x01);
418  val = (val << 6) | (m_reservedMcsSet2 & 0x3f);
419  val = (val << 10) | (m_rxHighestSupportedDataRate & 0x3ff);
420  val = (val << 3) | (m_reservedMcsSet1 & 0x07);
421 
422  for (uint64_t i = 13; i > 0; i--)
423  {
424  val = (val << 1) | (m_rxMcsBitmask[i + 63] & 0x01);
425  }
426  return val;
427 }
428 
429 void
431 {
432  // write the corresponding value for each bit
433  start.WriteU8(GetPrimaryChannel());
434  start.WriteU8(GetInformationSubset1());
435  start.WriteU16(GetInformationSubset2());
436  start.WriteU16(GetInformationSubset3());
437  start.WriteHtolsbU64(GetBasicMcsSet1());
438  start.WriteHtolsbU64(GetBasicMcsSet2());
439 }
440 
441 uint16_t
443 {
445  uint8_t primarychannel = i.ReadU8();
446  uint8_t informationsubset1 = i.ReadU8();
447  uint16_t informationsubset2 = i.ReadU16();
448  uint16_t informationsubset3 = i.ReadU16();
449  uint64_t mcsset1 = i.ReadLsbtohU64();
450  uint64_t mcsset2 = i.ReadLsbtohU64();
451  SetPrimaryChannel(primarychannel);
452  SetInformationSubset1(informationsubset1);
453  SetInformationSubset2(informationsubset2);
454  SetInformationSubset3(informationsubset3);
455  SetBasicMcsSet(mcsset1, mcsset2);
456  return length;
457 }
458 
459 std::ostream&
460 operator<<(std::ostream& os, const HtOperation& htOperation)
461 {
462  os << bool(htOperation.GetPrimaryChannel()) << "|" << +htOperation.GetSecondaryChannelOffset()
463  << "|" << bool(htOperation.GetStaChannelWidth()) << "|" << bool(htOperation.GetRifsMode())
464  << "|" << +htOperation.GetHtProtection() << "|" << bool(htOperation.GetNonGfHtStasPresent())
465  << "|" << bool(htOperation.GetObssNonHtStasPresent()) << "|"
466  << bool(htOperation.GetDualBeacon()) << "|" << bool(htOperation.GetDualCtsProtection())
467  << "|" << bool(htOperation.GetStbcBeacon()) << "|"
468  << bool(htOperation.GetLSigTxopProtectionFullSupport()) << "|"
469  << bool(htOperation.GetPcoActive()) << "|" << bool(htOperation.GetPhase()) << "|"
470  << htOperation.GetRxHighestSupportedDataRate() << "|"
471  << bool(htOperation.GetTxMcsSetDefined()) << "|" << bool(htOperation.GetTxRxMcsSetUnequal())
472  << "|" << +htOperation.GetTxMaxNSpatialStreams() << "|"
473  << bool(htOperation.GetTxUnequalModulation()) << "|";
474  for (uint8_t i = 0; i < MAX_SUPPORTED_MCS; i++)
475  {
476  os << htOperation.IsSupportedMcs(i) << " ";
477  }
478  return os;
479 }
480 
481 } // namespace ns3
iterator in a Buffer instance
Definition: buffer.h:100
uint8_t ReadU8()
Definition: buffer.h:1027
uint64_t ReadLsbtohU64()
Definition: buffer.cc:1097
uint16_t ReadU16()
Definition: buffer.h:1035
The HT Operation Information Element.
Definition: ht-operation.h:51
uint8_t GetTxRxMcsSetUnequal() const
Return transmit / receive MCS set unequal.
void SetObssNonHtStasPresent(uint8_t obssNonHtStasPresent)
Set the OBSS non HT STAs present.
uint8_t m_reservedInformationSubset1
reserved information subset 1
Definition: ht-operation.h:366
uint8_t GetDualBeacon() const
Return dual beacon.
void SetRifsMode(uint8_t rifsMode)
Set the RIFS mode.
Definition: ht-operation.cc:90
uint8_t GetRifsMode() const
Return the RIFS mode.
uint8_t m_obssNonHtStasPresent
OBSS NON HT STAs present.
Definition: ht-operation.h:372
void SetBasicMcsSet(uint64_t ctrl1, uint64_t ctrl2)
Set the Basic MCS Set field in the HT Operation information element.
uint8_t GetLSigTxopProtectionFullSupport() const
Return LSIG TXOP protection full support.
void SetSecondaryChannelOffset(uint8_t secondaryChannelOffset)
Set the secondary channel offset.
Definition: ht-operation.cc:78
uint8_t GetInformationSubset1() const
Return the Information Subset 1 field in the HT Operation information element.
uint8_t m_reservedInformationSubset3_1
reserved information subset 3-1
Definition: ht-operation.h:376
uint8_t m_stbcBeacon
STBC beacon.
Definition: ht-operation.h:379
uint16_t DeserializeInformationField(Buffer::Iterator start, uint16_t length) override
Deserialize information (i.e., the body of the IE, not including the Element ID and length octets)
void SetInformationSubset2(uint16_t ctrl)
Set the Information Subset 2 field in the HT Operation information element.
uint64_t GetBasicMcsSet1() const
Return the first 64 bytes of the Basic MCS Set field in the HT Operation information element.
uint16_t GetInformationFieldSize() const override
Length of serialized information (i.e., the length of the body of the IE, not including the Element I...
Definition: ht-operation.cc:66
uint8_t m_reservedInformationSubset3_2
reserved information subset 3-2
Definition: ht-operation.h:383
void SetPcoActive(uint8_t pcoActive)
Set the PCO active.
void SetTxUnequalModulation(uint8_t txUnequalModulation)
Set the transmit unequal modulation.
uint8_t m_rifsMode
RIFS mode.
Definition: ht-operation.h:365
uint8_t m_secondaryChannelOffset
secondary channel offset
Definition: ht-operation.h:363
uint8_t m_rxMcsBitmask[MAX_SUPPORTED_MCS]
receive MCS bitmask
Definition: ht-operation.h:394
uint16_t m_rxHighestSupportedDataRate
receive highest supported data rate
Definition: ht-operation.h:387
void SetInformationSubset3(uint16_t ctrl)
Set the Information Subset 3 field in the HT Operation information element.
void SetHtProtection(uint8_t htProtection)
Set the HT protection.
Definition: ht-operation.cc:96
uint8_t GetTxMcsSetDefined() const
Return transmit MCS set defined.
uint8_t m_staChannelWidth
STA channel width.
Definition: ht-operation.h:364
uint8_t GetPrimaryChannel() const
Return the Primary Channel field in the HT Operation information element.
void SetTxMaxNSpatialStreams(uint8_t maxTxSpatialStreams)
Set the transmit maximum number spatial streams.
void SerializeInformationField(Buffer::Iterator start) const override
Serialize information (i.e., the body of the IE, not including the Element ID and length octets)
uint8_t m_txUnequalModulation
transmit unequal modulation
Definition: ht-operation.h:392
uint16_t GetRxHighestSupportedDataRate() const
Return receive highest supported data rate.
void SetTxRxMcsSetUnequal(uint8_t txRxMcsSetUnequal)
Set the transmit / receive MCS set unequal.
uint8_t m_reservedMcsSet1
reserved MCS set 1
Definition: ht-operation.h:386
uint8_t m_txMaxNSpatialStreams
transmit maximum number spatial streams
Definition: ht-operation.h:391
WifiInformationElementId ElementId() const override
Get the wifi information element ID.
Definition: ht-operation.cc:60
uint8_t GetPcoActive() const
Return PCO active.
uint16_t GetInformationSubset3() const
Return the Information Subset 3 field in the HT Operation information element.
uint8_t GetStbcBeacon() const
Return STBC beacon.
uint8_t m_reservedInformationSubset2_1
reserved information subset 2-1
Definition: ht-operation.h:371
void SetDualBeacon(uint8_t dualBeacon)
Set the dual beacon.
uint8_t m_dualBeacon
dual beacon
Definition: ht-operation.h:377
uint8_t m_txMcsSetDefined
transmit MCS set defined
Definition: ht-operation.h:389
void SetNonGfHtStasPresent(uint8_t nonGfHtStasPresent)
Set the non GF HT STAs present.
uint64_t GetBasicMcsSet2() const
Return the last 64 bytes of the Basic MCS Set field in the HT Operation information element.
uint8_t m_dualCtsProtection
dual CTS protection
Definition: ht-operation.h:378
uint8_t m_lSigTxopProtectionFullSupport
L-SIG TXOP protection full support.
Definition: ht-operation.h:380
void SetTxMcsSetDefined(uint8_t txMcsSetDefined)
Set the transmit MCS set defined.
uint8_t GetHtProtection() const
Return the HT protection.
uint8_t m_reservedInformationSubset2_2
reserved information subset 2-2
Definition: ht-operation.h:373
uint8_t GetDualCtsProtection() const
Return dual CTS protection.
uint8_t m_reservedMcsSet2
reserved MCS set2
Definition: ht-operation.h:388
uint8_t GetStaChannelWidth() const
Return the STA channel width.
void SetLSigTxopProtectionFullSupport(uint8_t lSigTxopProtectionFullSupport)
Set the LSIG TXOP protection full support.
void SetStaChannelWidth(uint8_t staChannelWidth)
Set the STA channel width.
Definition: ht-operation.cc:84
uint8_t GetSecondaryChannelOffset() const
Return the secondary channel offset.
void SetInformationSubset1(uint8_t ctrl)
Set the Information Subset 1 field in the HT Operation information element.
uint16_t GetInformationSubset2() const
Return the Information Subset 2 field in the HT Operation information element.
void SetRxHighestSupportedDataRate(uint16_t maxSupportedRate)
Set the receive highest supported data rate.
uint8_t m_pcoActive
PCO active.
Definition: ht-operation.h:381
uint8_t GetTxUnequalModulation() const
Return transmit unequal modulation.
void SetRxMcsBitmask(uint8_t index)
Set the receive MCS bitmask.
uint32_t m_reservedMcsSet3
reserved MCS set 3
Definition: ht-operation.h:393
void SetPrimaryChannel(uint8_t ctrl)
Set the Primary Channel field in the HT Operation information element.
Definition: ht-operation.cc:72
uint8_t GetObssNonHtStasPresent() const
Return the OBSS non HT STAs present.
void SetDualCtsProtection(uint8_t dualCtsProtection)
Set the dual CTS protection.
uint8_t m_htProtection
HT protection.
Definition: ht-operation.h:369
void SetPhase(uint8_t pcoPhase)
Set the PCO phase.
bool IsSupportedMcs(uint8_t mcs) const
Return MCS is supported.
uint8_t m_txRxMcsSetUnequal
transmit / receive MCS set unequal
Definition: ht-operation.h:390
uint8_t GetTxMaxNSpatialStreams() const
Return transmit maximum number spatial streams.
uint8_t GetPhase() const
Return phase.
uint8_t GetNonGfHtStasPresent() const
Return the non GF HT STAs present.
uint8_t m_pcoPhase
PCO phase.
Definition: ht-operation.h:382
uint8_t m_primaryChannel
primary channel
Definition: ht-operation.h:360
void SetStbcBeacon(uint8_t stbcBeacon)
Set the STBC beacon.
uint8_t m_nonGfHtStasPresent
non GF HT STAs present
Definition: ht-operation.h:370
#define MAX_SUPPORTED_MCS
This defines the maximum number of supported MCSs that a STA is allowed to have.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
std::ostream & operator<<(std::ostream &os, const Angles &a)
Definition: angles.cc:129
uint8_t WifiInformationElementId
This type is used to represent an Information Element ID.
#define IE_HT_OPERATION