14#include "ns3/address-utils.h"
49 uint8_t operatingClass = 0;
50 uint8_t channelNumber = channel.GetNumber();
53 switch (channel.GetPhyBand())
56 if (channel.GetWidth() == 20)
60 else if (channel.GetWidth() == 40)
66 if (channel.GetWidth() == 20)
68 if (channelNumber == 36 || channelNumber == 40 || channelNumber == 44 ||
73 else if (channelNumber == 52 || channelNumber == 56 || channelNumber == 60 ||
78 else if (channelNumber == 100 || channelNumber == 104 || channelNumber == 108 ||
79 channelNumber == 112 || channelNumber == 116 || channelNumber == 120 ||
80 channelNumber == 124 || channelNumber == 128 || channelNumber == 132 ||
81 channelNumber == 136 || channelNumber == 140 || channelNumber == 144)
85 else if (channelNumber == 149 || channelNumber == 153 || channelNumber == 157 ||
86 channelNumber == 161 || channelNumber == 165 || channelNumber == 169 ||
87 channelNumber == 173 || channelNumber == 177 || channelNumber == 181)
92 else if (channel.GetWidth() == 40)
94 if (channelNumber == 38 || channelNumber == 46)
98 else if (channelNumber == 54 || channelNumber == 62)
100 operatingClass = 119;
102 else if (channelNumber == 102 || channelNumber == 110 || channelNumber == 118 ||
103 channelNumber == 126 || channelNumber == 134 || channelNumber == 142)
105 operatingClass = 122;
107 else if (channelNumber == 151 || channelNumber == 159 || channelNumber == 167 ||
108 channelNumber == 175)
110 operatingClass = 126;
113 else if (channel.GetWidth() == 80)
115 if (channelNumber == 42 || channelNumber == 58 || channelNumber == 106 ||
116 channelNumber == 122 || channelNumber == 138 || channelNumber == 155 ||
117 channelNumber == 171)
119 operatingClass = 128;
122 else if (channel.GetWidth() == 160)
124 if (channelNumber == 50 || channelNumber == 114 || channelNumber == 163)
126 operatingClass = 129;
131 if (channel.GetWidth() == 20)
133 operatingClass = 131;
135 else if (channel.GetWidth() == 40)
137 operatingClass = 132;
139 else if (channel.GetWidth() == 80)
141 operatingClass = 133;
143 else if (channel.GetWidth() == 160)
145 operatingClass = 134;
150 NS_ABORT_MSG(
"The provided channel has an unspecified PHY band");
155 "Operating class not found for channel number "
156 << channelNumber <<
" width " << channel.GetWidth() <<
" MHz "
157 <<
"band " << channel.GetPhyBand());
160 MHz_u startingFreq = 0;
162 switch (channel.GetPhyBand())
175 NS_ABORT_MSG(
"The provided channel has an unspecified PHY band");
179 uint8_t primaryChannelNumber =
180 (channel.GetPrimaryChannelCenterFrequency(20) - startingFreq) / 5;
248 MHz_u startingFreq = 0;
268 MHz_u primaryChannelCenterFrequency = startingFreq + primaryChannelNumber * 5;
270 uint8_t channelNumber = 0;
276 channel.band == band &&
277 primaryChannelCenterFrequency > (channel.frequency - (width / 2)) &&
278 primaryChannelCenterFrequency < (channel.frequency + (width / 2)))
293 switch (
static_cast<uint16_t
>(width))
296 if (channel.frequency == primaryChannelCenterFrequency)
302 if ((channel.frequency == primaryChannelCenterFrequency + 10) ||
303 (channel.frequency == primaryChannelCenterFrequency - 10))
309 NS_ABORT_MSG(
"No channel of width " << width <<
" MHz in the 2.4 GHz band");
315 channelNumber = channel.number;
316 frequency = channel.frequency;
327 MHz_u channelLowestFreq = frequency - width / 2;
328 MHz_u primaryChannelLowestFreq = primaryChannelCenterFrequency - 10;
329 channel.SetPrimary20Index((primaryChannelLowestFreq - channelLowestFreq) / 20);
357 if (it->hasBssid && !it->hasShortSsid && !it->hasBssParams && !it->has20MHzPsd &&
362 else if (it->hasBssid && it->hasShortSsid && it->hasBssParams && it->has20MHzPsd &&
369 NS_ABORT_MSG(
"Unsupported TBTT Information field contents");
373 it->tbttInfoHdr.tbttInfoLength = length;
383 switch (it->tbttInfoHdr.tbttInfoLength)
387 it->hasShortSsid =
false;
388 it->hasBssParams =
false;
389 it->has20MHzPsd =
false;
390 it->hasMldParams =
false;
394 it->hasShortSsid =
true;
395 it->hasBssParams =
true;
396 it->has20MHzPsd =
true;
397 it->hasMldParams =
true;
401 "Unsupported TBTT Information Length value: " << it->tbttInfoHdr.tbttInfoLength);
439 m_nbrApInfoFields.at(nbrApInfoId).tbttInformationSet.at(index).shortSsid = shortSsid;
464 uint8_t bssParameters)
469 m_nbrApInfoFields.at(nbrApInfoId).tbttInformationSet.at(index).bssParameters = bssParameters;
488 return m_nbrApInfoFields.at(nbrApInfoId).tbttInformationSet.at(index).bssParameters;
497 m_nbrApInfoFields.at(nbrApInfoId).tbttInformationSet.at(index).psd20MHz = psd20MHz;
529 auto it = std::next(
m_nbrApInfoFields.at(nbrApInfoId).tbttInformationSet.begin(), index);
530 it->mldParameters.mldId = mldId;
531 it->mldParameters.linkId = (linkId & 0x0f);
532 it->mldParameters.bssParamsChangeCount = changeCount;
551 return m_nbrApInfoFields.at(nbrApInfoId).tbttInformationSet.at(index).mldParameters.mldId;
560 return m_nbrApInfoFields.at(nbrApInfoId).tbttInformationSet.at(index).mldParameters.linkId &
592 size += 1 * neighborApInfo.tbttInformationSet.size();
594 if (neighborApInfo.hasBssid)
596 size += 6 * neighborApInfo.tbttInformationSet.size();
598 if (neighborApInfo.hasShortSsid)
600 size += 4 * neighborApInfo.tbttInformationSet.size();
602 if (neighborApInfo.hasBssParams)
604 size += 1 * neighborApInfo.tbttInformationSet.size();
606 if (neighborApInfo.has20MHzPsd)
608 size += 1 * neighborApInfo.tbttInformationSet.size();
610 if (neighborApInfo.hasMldParams)
612 size += 3 * neighborApInfo.tbttInformationSet.size();
631 uint16_t tbttInfoHdr = 0;
632 tbttInfoHdr |= neighborApInfo.tbttInfoHdr.type;
633 tbttInfoHdr |= (neighborApInfo.tbttInfoHdr.filtered << 2);
634 tbttInfoHdr |= (neighborApInfo.tbttInfoHdr.tbttInfoCount << 4);
635 tbttInfoHdr |= (neighborApInfo.tbttInfoHdr.tbttInfoLength << 8);
636 start.WriteHtolsbU16(tbttInfoHdr);
638 start.WriteU8(neighborApInfo.operatingClass);
639 start.WriteU8(neighborApInfo.channelNumber);
641 for (
const auto& tbttInformation : neighborApInfo.tbttInformationSet)
643 start.WriteU8(tbttInformation.neighborApTbttOffset);
645 if (neighborApInfo.hasBssid)
647 WriteTo(start, tbttInformation.bssid);
649 if (neighborApInfo.hasShortSsid)
651 start.WriteHtolsbU32(tbttInformation.shortSsid);
653 if (neighborApInfo.hasBssParams)
655 start.WriteU8(tbttInformation.bssParameters);
657 if (neighborApInfo.has20MHzPsd)
659 start.WriteU8(tbttInformation.psd20MHz);
661 if (neighborApInfo.hasMldParams)
663 start.WriteU8(tbttInformation.mldParameters.mldId);
665 other |= (tbttInformation.mldParameters.linkId & 0x0f);
666 other |= (tbttInformation.mldParameters.bssParamsChangeCount << 4);
667 start.WriteHtolsbU16(other);
679 while (count < length)
686 m_nbrApInfoFields.back().tbttInfoHdr.tbttInfoCount = (tbttInfoHdr >> 4) & 0x000f;
687 m_nbrApInfoFields.back().tbttInfoHdr.tbttInfoLength = (tbttInfoHdr >> 8) & 0x00ff;
731 .tbttInformationSet.back()
732 .mldParameters.bssParamsChangeCount = (other >> 4) & 0x00ff;
iterator in a Buffer instance
void WriteTbttInformationLength(std::size_t nbrApInfoId) const
Set the TBTT Information Length field of the given Neighbor AP Information field based on the xxxPres...
Mac48Address GetBssid(std::size_t nbrApInfoId, std::size_t index) const
Get the BSSID field (must be present) in the i-th TBTT Information field of the given Neighbor AP Inf...
std::vector< NeighborApInformation > m_nbrApInfoFields
one or more Neighbor AP Information fields
void SerializeInformationField(Buffer::Iterator start) const override
Serialize information (i.e., the body of the IE, not including the Element ID and length octets)
bool HasShortSsid(std::size_t nbrApInfoId) const
Return true if the Short SSID field is present in all the TBTT Information fields of the given Neighb...
std::size_t GetNNbrApInfoFields() const
Get the number of Neighbor AP Information fields.
void WriteTbttInformationCount(std::size_t nbrApInfoId) const
Set the TBTT Information Count field of the given Neighbor AP Information field based on the size of ...
bool HasBssid(std::size_t nbrApInfoId) const
Return true if the BSSID field is present in all the TBTT Information fields of the given Neighbor AP...
uint8_t ReadTbttInformationCount(std::size_t nbrApInfoId) const
Get the TBTT Information Count field of the given Neighbor AP Information field.
void SetMldParameters(std::size_t nbrApInfoId, std::size_t index, uint8_t mldId, uint8_t linkId, uint8_t changeSequence)
Set the MLD Parameters subfield of the i-th TBTT Information field of the given Neighbor AP Informati...
void SetShortSsid(std::size_t nbrApInfoId, std::size_t index, uint32_t shortSsid)
Set the Short SSID field of the i-th TBTT Information field of the given Neighbor AP Information fiel...
uint32_t GetShortSsid(std::size_t nbrApInfoId, std::size_t index) const
Get the Short SSID field (must be present) in the i-th TBTT Information field of the given Neighbor A...
void SetBssid(std::size_t nbrApInfoId, std::size_t index, Mac48Address bssid)
Set the BSSID field of the i-th TBTT Information field of the given Neighbor AP Information field.
std::size_t GetNTbttInformationFields(std::size_t nbrApInfoId) const
Get the number of TBTT Information fields included in the TBTT Information Set field of the given Nei...
uint8_t GetLinkId(std::size_t nbrApInfoId, std::size_t index) const
Get the Link ID value in the MLD Parameters subfield (must be present) in the i-th TBTT Information f...
uint8_t GetMldId(std::size_t nbrApInfoId, std::size_t index) const
Get the MLD ID value in the MLD Parameters subfield (must be present) in the i-th TBTT Information fi...
void SetPsd20MHz(std::size_t nbrApInfoId, std::size_t index, uint8_t psd20MHz)
Set the 20 MHz PSD field of the i-th TBTT Information field of the given Neighbor AP Information fiel...
WifiInformationElementId ElementId() const override
Get the wifi information element ID.
void AddNbrApInfoField()
Add a Neighbor AP Information field.
WifiPhyOperatingChannel GetOperatingChannel(std::size_t nbrApInfoId) const
Get the operating channel coded into the Operating Class and the Channel Number fields of the given N...
void SetBssParameters(std::size_t nbrApInfoId, std::size_t index, uint8_t bssParameters)
Set the BSS Parameters field of the i-th TBTT Information field of the given Neighbor AP Information ...
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)
uint8_t GetPsd20MHz(std::size_t nbrApInfoId, std::size_t index) const
Get the 20 MHz PSD field (must be present) in the i-th TBTT Information field of the given Neighbor A...
bool HasMldParameters(std::size_t nbrApInfoId) const
Return true if the MLD Parameters subfield is present in all the TBTT Information fields of the given...
void AddTbttInformationField(std::size_t nbrApInfoId)
Add a TBTT Information fields to the TBTT Information Set field of the given Neighbor AP Information ...
void ReadTbttInformationLength(std::size_t nbrApInfoId)
Use the TBTT Information Length field of the given Neighbor AP Information field to set the xxxPresen...
bool HasBssParameters(std::size_t nbrApInfoId) const
Return true if the BSS Parameters field is present in all the TBTT Information fields of the given Ne...
uint16_t GetInformationFieldSize() const override
Length of serialized information (i.e., the length of the body of the IE, not including the Element I...
void SetOperatingChannel(std::size_t nbrApInfoId, const WifiPhyOperatingChannel &channel)
Set the Operating Class and the Channel Number fields of the given Neighbor AP Information field base...
bool HasPsd20MHz(std::size_t nbrApInfoId) const
Return true if the 20 MHz PSD field is present in all the TBTT Information fields of the given Neighb...
uint8_t GetBssParameters(std::size_t nbrApInfoId, std::size_t index) const
Get the BSS Parameters field (must be present) in the i-th TBTT Information field of the given Neighb...
Class that keeps track of all information about the current PHY operating channel.
static const std::set< FrequencyChannelInfo > m_frequencyChannels
Available frequency channels.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
#define NS_ABORT_MSG(msg)
Unconditional abnormal program termination with a message.
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
#define NS_ABORT_IF(cond)
Abnormal program termination if a condition is true.
WifiPhyBand
Identifies the PHY band.
@ WIFI_STANDARD_UNSPECIFIED
@ WIFI_PHY_BAND_6GHZ
The 6 GHz band.
@ WIFI_PHY_BAND_UNSPECIFIED
Unspecified.
@ WIFI_PHY_BAND_2_4GHZ
The 2.4 GHz band.
@ WIFI_PHY_BAND_5GHZ
The 5 GHz band.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
void WriteTo(Buffer::Iterator &i, Ipv4Address ad)
Write an Ipv4Address to a Buffer.
uint8_t WifiInformationElementId
This type is used to represent an Information Element ID.
void ReadFrom(Buffer::Iterator &i, Ipv4Address &ad)
Read an Ipv4Address from a Buffer.