15#include "ns3/address-utils.h"
50 uint8_t operatingClass = 0;
51 uint8_t channelNumber = channel.GetNumber();
54 switch (channel.GetPhyBand())
57 if (channel.GetWidth() ==
MHz_u{20})
61 else if (channel.GetWidth() ==
MHz_u{40})
67 if (channel.GetWidth() ==
MHz_u{20})
69 if (channelNumber == 36 || channelNumber == 40 || channelNumber == 44 ||
74 else if (channelNumber == 52 || channelNumber == 56 || channelNumber == 60 ||
79 else if (channelNumber == 100 || channelNumber == 104 || channelNumber == 108 ||
80 channelNumber == 112 || channelNumber == 116 || channelNumber == 120 ||
81 channelNumber == 124 || channelNumber == 128 || channelNumber == 132 ||
82 channelNumber == 136 || channelNumber == 140 || channelNumber == 144)
86 else if (channelNumber == 149 || channelNumber == 153 || channelNumber == 157 ||
87 channelNumber == 161 || channelNumber == 165 || channelNumber == 169 ||
88 channelNumber == 173 || channelNumber == 177 || channelNumber == 181)
93 else if (channel.GetWidth() ==
MHz_u{40})
95 if (channelNumber == 38 || channelNumber == 46)
99 else if (channelNumber == 54 || channelNumber == 62)
101 operatingClass = 119;
103 else if (channelNumber == 102 || channelNumber == 110 || channelNumber == 118 ||
104 channelNumber == 126 || channelNumber == 134 || channelNumber == 142)
106 operatingClass = 122;
108 else if (channelNumber == 151 || channelNumber == 159 || channelNumber == 167 ||
109 channelNumber == 175)
111 operatingClass = 126;
114 else if (channel.GetWidth() ==
MHz_u{80})
116 if (channelNumber == 42 || channelNumber == 58 || channelNumber == 106 ||
117 channelNumber == 122 || channelNumber == 138 || channelNumber == 155 ||
118 channelNumber == 171)
120 operatingClass = 128;
123 else if (channel.GetWidth() ==
MHz_u{160})
125 if (channelNumber == 50 || channelNumber == 114 || channelNumber == 163)
127 operatingClass = 129;
132 if (channel.GetWidth() ==
MHz_u{20})
134 operatingClass = 131;
136 else if (channel.GetWidth() ==
MHz_u{40})
138 operatingClass = 132;
140 else if (channel.GetWidth() ==
MHz_u{80})
142 operatingClass = 133;
144 else if (channel.GetWidth() ==
MHz_u{160})
146 operatingClass = 134;
148 else if (channel.GetWidth() ==
MHz_u{320})
150 operatingClass = 137;
155 NS_ABORT_MSG(
"The provided channel has an unspecified PHY band");
160 "Operating class not found for channel number "
161 << +channelNumber <<
" width " << channel.GetWidth() <<
" MHz "
162 <<
"band " << channel.GetPhyBand());
165 MHz_u startingFreq{0};
167 switch (channel.GetPhyBand())
170 startingFreq =
MHz_u{2407};
173 startingFreq =
MHz_u{5000};
176 startingFreq =
MHz_u{5950};
180 NS_ABORT_MSG(
"The provided channel has an unspecified PHY band");
184 uint8_t primaryChannelNumber =
185 (channel.GetPrimaryChannelCenterFrequency(
MHz_u{20}) - startingFreq) /
MHz_u{5};
257 MHz_u startingFreq{0};
262 startingFreq =
MHz_u{2407};
265 startingFreq =
MHz_u{5000};
268 startingFreq =
MHz_u{5950};
277 auto primaryChannelCenterFrequency = startingFreq + primaryChannelNumber *
MHz_u{5};
279 uint8_t channelNumber = 0;
285 channel.band == band &&
286 primaryChannelCenterFrequency > (channel.frequency - (width / 2)) &&
287 primaryChannelCenterFrequency < (channel.frequency + (width / 2)))
302 switch (
static_cast<uint16_t
>(width))
305 if (channel.frequency == primaryChannelCenterFrequency)
311 if ((channel.frequency == primaryChannelCenterFrequency +
MHz_u{10}) ||
312 (channel.frequency == primaryChannelCenterFrequency -
MHz_u{10}))
318 NS_ABORT_MSG(
"No channel of width " << width <<
" MHz in the 2.4 GHz band");
324 channelNumber = channel.number;
325 frequency = channel.frequency;
336 const auto channelLowestFreq = frequency - width / 2;
337 const auto primaryChannelLowestFreq = primaryChannelCenterFrequency -
MHz_u{10};
366 if (it->hasBssid && !it->hasShortSsid && !it->hasBssParams && !it->has20MHzPsd &&
371 else if (it->hasBssid && it->hasShortSsid && it->hasBssParams && it->has20MHzPsd &&
378 NS_ABORT_MSG(
"Unsupported TBTT Information field contents");
382 it->tbttInfoHdr.tbttInfoLength = length;
392 switch (it->tbttInfoHdr.tbttInfoLength)
396 it->hasShortSsid =
false;
397 it->hasBssParams =
false;
398 it->has20MHzPsd =
false;
399 it->hasMldParams =
false;
403 it->hasShortSsid =
true;
404 it->hasBssParams =
true;
405 it->has20MHzPsd =
true;
406 it->hasMldParams =
true;
410 "Unsupported TBTT Information Length value: " << it->tbttInfoHdr.tbttInfoLength);
448 m_nbrApInfoFields.at(nbrApInfoId).tbttInformationSet.at(index).shortSsid = shortSsid;
473 uint8_t bssParameters)
478 m_nbrApInfoFields.at(nbrApInfoId).tbttInformationSet.at(index).bssParameters = bssParameters;
497 return m_nbrApInfoFields.at(nbrApInfoId).tbttInformationSet.at(index).bssParameters;
506 m_nbrApInfoFields.at(nbrApInfoId).tbttInformationSet.at(index).psd20MHz = psd20MHz;
536 auto it = std::next(
m_nbrApInfoFields.at(nbrApInfoId).tbttInformationSet.begin(), index);
537 it->mldParameters = mldParams;
556 return m_nbrApInfoFields.at(nbrApInfoId).tbttInformationSet.at(index).mldParameters;
587 size += 1 * neighborApInfo.tbttInformationSet.size();
589 if (neighborApInfo.hasBssid)
591 size += 6 * neighborApInfo.tbttInformationSet.size();
593 if (neighborApInfo.hasShortSsid)
595 size += 4 * neighborApInfo.tbttInformationSet.size();
597 if (neighborApInfo.hasBssParams)
599 size += 1 * neighborApInfo.tbttInformationSet.size();
601 if (neighborApInfo.has20MHzPsd)
603 size += 1 * neighborApInfo.tbttInformationSet.size();
605 if (neighborApInfo.hasMldParams)
607 size += 3 * neighborApInfo.tbttInformationSet.size();
626 uint16_t tbttInfoHdr = 0;
627 tbttInfoHdr |= neighborApInfo.tbttInfoHdr.type;
628 tbttInfoHdr |= (neighborApInfo.tbttInfoHdr.filtered << 2);
629 tbttInfoHdr |= (neighborApInfo.tbttInfoHdr.tbttInfoCount << 4);
630 tbttInfoHdr |= (neighborApInfo.tbttInfoHdr.tbttInfoLength << 8);
631 start.WriteHtolsbU16(tbttInfoHdr);
633 start.WriteU8(neighborApInfo.operatingClass);
634 start.WriteU8(neighborApInfo.channelNumber);
636 for (
const auto& tbttInformation : neighborApInfo.tbttInformationSet)
638 start.WriteU8(tbttInformation.neighborApTbttOffset);
640 if (neighborApInfo.hasBssid)
642 WriteTo(start, tbttInformation.bssid);
644 if (neighborApInfo.hasShortSsid)
646 start.WriteHtolsbU32(tbttInformation.shortSsid);
648 if (neighborApInfo.hasBssParams)
650 start.WriteU8(tbttInformation.bssParameters);
652 if (neighborApInfo.has20MHzPsd)
654 start.WriteU8(tbttInformation.psd20MHz);
656 if (neighborApInfo.hasMldParams)
658 start.WriteU8(tbttInformation.mldParameters.apMldId);
660 other |= (tbttInformation.mldParameters.linkId & 0x0f);
661 other |= (tbttInformation.mldParameters.bssParamsChangeCount << 4);
662 other |= (tbttInformation.mldParameters.allUpdates << 12);
663 other |= (tbttInformation.mldParameters.disabledLink << 13);
664 start.WriteHtolsbU16(other);
676 while (count < length)
683 m_nbrApInfoFields.back().tbttInfoHdr.tbttInfoCount = (tbttInfoHdr >> 4) & 0x000f;
684 m_nbrApInfoFields.back().tbttInfoHdr.tbttInfoLength = (tbttInfoHdr >> 8) & 0x00ff;
722 auto& mldParams =
m_nbrApInfoFields.back().tbttInformationSet.back().mldParameters;
723 mldParams.apMldId = i.
ReadU8();
726 mldParams.linkId = other & 0x000f;
727 mldParams.bssParamsChangeCount = (other >> 4) & 0x00ff;
728 mldParams.allUpdates = (other >> 12) & 0x01;
729 mldParams.disabledLink = (other >> 13) & 0x01;
740 os <<
"Reduced Neighbor Report=[";
743 os <<
"{Operating Class: " << +neighborApInfo.operatingClass
744 <<
", Channel Number: " << +neighborApInfo.channelNumber
745 <<
", TBTT Information Count: " << +neighborApInfo.tbttInfoHdr.tbttInfoCount
746 <<
", TBTT Information Length: " << +neighborApInfo.tbttInfoHdr.tbttInfoLength <<
"}, ";
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 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...
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.
const MldParameters & GetMldParameters(std::size_t nbrApInfoId, std::size_t index) const
Get the MLD Parameters subfield (must be present) in the i-th TBTT Information field of the given Nei...
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 ...
void SetMldParameters(std::size_t nbrApInfoId, std::size_t index, const MldParameters &mldParams)
Set the MLD Parameters subfield of the i-th TBTT Information field of the given Neighbor AP Informati...
void Print(std::ostream &os) const override
Generate human-readable form of IE.
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.
double MHz_u
MHz weak type.
std::size_t Count20MHzSubchannels(MHz_u channelWidth)
Return the number of 20 MHz subchannels covering the channel width.
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.