23#include "ns3/attribute-container.h"
24#include "ns3/eht-configuration.h"
25#include "ns3/emlsr-manager.h"
26#include "ns3/he-configuration.h"
27#include "ns3/ht-configuration.h"
29#include "ns3/packet.h"
31#include "ns3/pointer.h"
32#include "ns3/random-variable-stream.h"
33#include "ns3/shuffle.h"
34#include "ns3/simulator.h"
35#include "ns3/string.h"
56 .AddAttribute(
"ProbeRequestTimeout",
57 "The duration to actively probe the channel.",
61 .AddAttribute(
"WaitBeaconTimeout",
62 "The duration to dwell on a channel while passively scanning for beacon",
66 .AddAttribute(
"AssocRequestTimeout",
67 "The interval between two consecutive association request attempts.",
71 .AddAttribute(
"MaxMissedBeacons",
72 "Number of beacons which much be consecutively missed before "
73 "we attempt to restart association.",
79 "If true, we send probe requests. If false, we don't."
80 "NOTE: if more than one STA in your simulation is using active probing, "
81 "you should enable it at a different simulation time for each STA, "
82 "otherwise all the STAs will start sending probes at the same time resulting in "
84 "See bug 1060 for more info.",
88 .AddAttribute(
"ProbeDelay",
89 "Delay (in microseconds) to be used prior to transmitting a "
90 "Probe frame during active scanning.",
91 StringValue(
"ns3::UniformRandomVariable[Min=50.0|Max=250.0]"),
94 .AddAttribute(
"AssocType",
95 "Type of association performed by this device (provided that it is "
96 "supported by the standard configured for this device, otherwise legacy "
97 "association is performed). By using this attribute, it is possible for "
98 "an EHT single-link device to perform ML setup with an AP MLD and for an "
99 "EHT multi-link device to perform legacy association with an AP MLD.",
110 "Enable/disable power save mode on the given link. The power management mode is "
111 "actually changed when the AP acknowledges a frame sent with the Power Management "
112 "field set to the value corresponding to the requested mode",
118 .AddAttribute(
"PmModeSwitchTimeout",
119 "If switching to a new Power Management mode is not completed within "
120 "this amount of time, make another attempt at switching Power "
125 .AddTraceSource(
"Assoc",
126 "Associated with an access point. If this is an MLD that associated "
127 "with an AP MLD, the AP MLD address is provided.",
129 "ns3::Mac48Address::TracedCallback")
130 .AddTraceSource(
"LinkSetupCompleted",
131 "A link was setup in the context of ML setup with an AP MLD. "
132 "Provides ID of the setup link and AP MAC address",
134 "ns3::StaWifiMac::LinkSetupCallback")
135 .AddTraceSource(
"DeAssoc",
136 "Association with an access point lost. If this is an MLD "
137 "that disassociated with an AP MLD, the AP MLD address is provided.",
139 "ns3::Mac48Address::TracedCallback")
140 .AddTraceSource(
"BeaconArrival",
141 "Time of beacons arrival from associated AP",
143 "ns3::Time::TracedCallback")
144 .AddTraceSource(
"ReceivedBeaconInfo",
145 "Information about every received Beacon frame",
147 "ns3::ApInfo::TracedCallback")
148 .AddTraceSource(
"EmlsrLinkSwitch",
149 "Trace start/end of EMLSR link switch events. Specifically, this trace "
150 "is fired: (i) when a PHY _operating on a link_ starts switching to "
151 "another link, thus the PHY is disconnected from the previous link; "
152 "(ii) when a PHY is connected to a new link after performing a channel "
153 "switch. This trace provides: the ID of the previous link, in "
154 "case the PHY is disconnected, or the ID of the new link, in case the "
155 "PHY is connected; a pointer to the PHY that switches link; a boolean "
156 "value indicating if the PHY is connected to (true) or disconnected "
157 "from (false) the given link.",
159 "ns3::StaWifiMac::EmlsrLinkSwitchCallback");
164 : m_state(UNASSOCIATED),
166 m_assocRequestEvent()
236std::unique_ptr<WifiMac::LinkEntity>
239 return std::make_unique<StaLinkEntity>();
259 auto currentStream = stream + 1;
261 return (currentStream - stream);
307 NS_LOG_DEBUG(
"STA is still scanning, reset scanning process");
323 for (
auto& phy : phys)
325 phy->SetCapabilitiesChangedCallback(
334 const auto width = phy->GetOperatingChannel().IsOfdm() ?
MHz_u{20} : phy->GetChannelWidth();
335 uint8_t ch = phy->GetPrimaryChannelNumber(width);
336 return {ch, phy->GetPhyBand()};
342 std::stringstream ss;
345 std::copy(linkIds.cbegin(), linkIds.cend(), std::ostream_iterator<uint16_t>(ss,
" "));
349 for (
const auto& [linkId, lnk] :
GetLinks())
353 if (linkIds.contains(linkId))
356 link.emlsrEnabled =
true;
362 if (link.emlsrEnabled)
366 link.emlsrEnabled =
false;
388 params.SetCurrentChannel(
GetWifiPhy(linkId)->GetChannelNumber());
417 const std::vector<uint8_t>& apLinkIds,
418 std::optional<uint8_t> apMldId)
const
425 NS_LOG_DEBUG(
"Legacy association, not including Multi-link Element");
448 packet->AddHeader(probeReq);
467std::variant<MgtAssocRequestHeader, MgtReassocRequestHeader>
472 std::variant<MgtAssocRequestHeader, MgtReassocRequestHeader> mgtFrame;
478 mgtFrame = std::move(reassoc);
486 auto fill = [&](
auto&& frame) {
487 frame.template Get<Ssid>() =
GetSsid();
489 frame.template Get<SupportedRates>() = supportedRates.rates;
490 frame.template Get<ExtendedSupportedRatesIE>() = supportedRates.extendedRates;
492 frame.SetListenInterval(0);
516 std::visit(fill, mgtFrame);
554 mldCapabilities.emplace();
555 mldCapabilities->maxNSimultaneousLinks =
GetNLinks() - 1;
556 mldCapabilities->srsSupport = 0;
561 mldCapabilities->tidToLinkMappingSupport =
562 static_cast<uint8_t
>(ehtConfiguration->m_tidLinkMappingSupport);
563 mldCapabilities->freqSepForStrApMld = 0;
564 mldCapabilities->aarSupport = 0;
570 for (
const auto& [index, link] :
GetLinks())
574 if (index != linkId && staLink.bssid.has_value())
586 perStaProfile.SetCompleteProfile();
591 perStaProfile.SetStaMacAddress(staLink.feManager->GetAddress());
596 return multiLinkElement;
601 std::optional<uint8_t> apMldId)
const
605 if (apMldId.has_value())
610 for (
const auto apLinkId : apLinkIds)
617 perStaProfile.SetCompleteProfile();
623std::vector<TidToLinkMapping>
631 auto negSupport = ehtConfig->m_tidLinkMappingSupport;
634 "Cannot request TID-to-Link Mapping if negotiation is not supported");
644 "Mapping TIDs to distinct link sets is incompatible with negotiation support of 1");
653 NS_LOG_DEBUG(
"Using default mapping because AP MLD advertised negotiation support of 1");
658 std::vector<TidToLinkMapping> ret(1);
663 auto fillIe = [&ret](
const auto& mapping) {
664 ret.back().m_control.defaultMapping = mapping.empty();
666 for (
const auto& [tid, linkSet] : mapping)
672 NS_ABORT_MSG_IF(linkSet.empty(),
"Cannot map a TID to an empty link set");
673 ret.back().SetLinkMappingOfTid(tid, linkSet);
706 "No link selected to send the (Re)Association Request");
707 uint8_t linkId = it->first;
710 "No BSSID set for the link on which the (Re)Association Request is to be sent");
716 hdr.
SetAddr2(link.feManager->GetAddress());
730 auto addMle = [&](
auto&& frame) {
733 std::visit(addMle, frame);
736 if (
const auto& mldCapabilities =
739 mldCapabilities->get().tidToLinkMappingSupport)) >
742 auto addTlm = [&](
auto&& frame) {
745 std::visit(addTlm, frame);
751 packet->AddHeader(std::get<MgtAssocRequestHeader>(frame));
755 packet->AddHeader(std::get<MgtReassocRequestHeader>(frame));
831 for (
const auto& [
id, link] :
GetLinks())
859 if (!bestAp.has_value())
861 NS_LOG_DEBUG(
"Exhausted list of candidate AP; restart scanning");
866 NS_LOG_DEBUG(
"Attempting to associate with AP: " << *bestAp);
872 staLink.sendAssocReq =
false;
873 staLink.bssid = std::nullopt;
878 std::shared_ptr<CommonInfoBasicMle> mleCommonInfo;
881 std::visit([](
auto&& frame) {
return frame.template Get<MultiLinkElement>(); },
883 std::map<uint8_t, uint8_t> swapInfo;
884 for (
const auto& [localLinkId, apLinkId, bssid] : bestAp->m_setupLinks)
887 NS_LOG_DEBUG(
"Setting up link (local ID=" << +localLinkId <<
", AP ID=" << +apLinkId
892 mleCommonInfo = std::make_shared<CommonInfoBasicMle>(mle->GetCommonInfoBasic());
895 swapInfo.emplace(localLinkId, apLinkId);
901 auto getBeaconInterval = [](
auto&& frame) {
902 using T = std::decay_t<
decltype(frame)>;
903 if constexpr (std::is_same_v<T, MgtBeaconHeader> ||
904 std::is_same_v<T, MgtProbeResponseHeader>)
914 Time beaconInterval = std::visit(getBeaconInterval, bestAp->m_frame);
953 for (
const auto& [
id, link] :
GetLinks())
955 if (link->phy && link->phy->IsStateRx())
957 delay = std::max(delay, link->phy->GetDelayUntilIdle());
970 for (
const auto& [
id, link] :
GetLinks())
977 bssid = std::nullopt;
980 NS_LOG_DEBUG(
"Set state to UNASSOCIATED and start scanning");
1022 std::set<uint8_t> linkIds;
1023 for (
const auto& [
id, link] :
GetLinks())
1036 for (
const auto& [
id, link] :
GetLinks())
1041 return link->feManager->GetAddress();
1055 const auto linkId = *linkIds.cbegin();
1084 auto& hdr = mpdu->GetHeader();
1090 uint8_t linkId = *linkIds.begin();
1093 hdr.SetAddr1(apMldAddr.value_or(
GetBssid(linkId)));
1116 std::vector<uint8_t> shuffledLinkIds(linkIds.cbegin(), linkIds.cend());
1119 std::stringstream ss;
1122 std::copy(shuffledLinkIds.cbegin(),
1123 shuffledLinkIds.cend(),
1124 std::ostream_iterator<uint16_t>(ss,
" "));
1128 for (
const auto linkId : shuffledLinkIds)
1130 std::map<AcIndex, bool> hasFramesToTransmit;
1146 hasFramesToTransmit[acIndex],
1157 const WifiMacHeader* hdr = &mpdu->GetOriginal()->GetHeader();
1177 NS_LOG_LOGIC(
"Received data frame while not associated: ignore");
1183 NS_LOG_LOGIC(
"Received data frame not from the DS: ignore");
1187 std::set<Mac48Address> apAddresses;
1192 if (!apAddresses.contains(mpdu->GetHeader().GetAddr2()))
1194 NS_LOG_LOGIC(
"Received data frame not from the BSS we are associated with: ignore");
1200 NS_LOG_LOGIC(
"Received (QoS) Null Data frame: ignore");
1208 NS_ASSERT(apAddresses.contains(mpdu->GetHeader().GetAddr3()));
1249 action.protectedEhtAction ==
1277 mpdu->GetPacket()->PeekHeader(beacon);
1286 goodBeacon = bssid.has_value() && (hdr.
GetAddr3() == *bssid);
1296 bool found = mpdu->GetPacket()->PeekPacketTag(snrTag);
1300 .m_snr = snrTag.
Get(),
1301 .m_frame = std::move(beacon),
1303 .m_linkId = linkId};
1343 mpdu->GetPacket()->PeekHeader(probeResp);
1353 bool found = mpdu->GetPacket()->PeekPacketTag(snrTag);
1357 .m_snr = snrTag.
Get(),
1358 .m_frame = std::move(probeResp),
1359 .m_channel = {GetCurrentChannel(linkId)},
1360 .m_linkId = linkId});
1371 mpdu->GetPacket()->PeekHeader(assocResp);
1386 std::optional<Mac48Address> apMldAddress;
1403 if (
const auto& mldCapabilities =
1406 mldCapabilities->get().tidToLinkMappingSupport) >
1452 std::list<uint8_t> setupLinks;
1453 for (
const auto& [
id, link] :
GetLinks())
1455 setupLinks.push_back(
id);
1459 setupLinks.remove(linkId);
1467 "The link on which the Association Response was received "
1468 "is not a link we requested to setup");
1470 "The link ID of the AP that transmitted the Association "
1471 "Response does not match the stored link ID");
1473 mle->GetMldMacAddress(),
1474 "The AP MLD MAC address in the received Multi-Link Element does not "
1475 "match the address stored in the station manager for link "
1478 for (std::size_t elem = 0; elem < mle->GetNPerStaProfileSubelements(); elem++)
1480 auto& perStaProfile = mle->GetPerStaProfile(elem);
1481 uint8_t apLinkId = perStaProfile.GetLinkId();
1482 auto it =
GetLinks().find(apLinkId);
1483 uint8_t staLinkid = 0;
1484 std::optional<Mac48Address> bssid;
1486 !(bssid =
GetLink((staLinkid = it->first)).
bssid).has_value(),
1487 "Setup for AP link ID " << apLinkId <<
" was not requested");
1489 "The BSSID in the Per-STA Profile for link ID "
1490 << +staLinkid <<
" does not match the stored BSSID");
1492 perStaProfile.GetStaMacAddress()) != mle->GetMldMacAddress(),
1493 "The AP MLD MAC address in the received Multi-Link Element does not "
1494 "match the address stored in the station manager for link "
1503 "AID should be the same for all the links");
1505 NS_LOG_DEBUG(
"Setup on link " << staLinkid <<
" completed");
1517 setupLinks.remove(staLinkid);
1526 for (
const auto&
id : setupLinks)
1535 for (
const auto& [
id, link] :
GetLinks())
1539 if (
const auto txop =
GetTxop())
1541 txop->StartAccessAfterEvent(
id,
1549 edca->StartAccessAfterEvent(
id,
1570 NS_ASSERT_MSG(psduMap.size() == 1 && psduMap.begin()->second->GetNMpdus() == 1 &&
1571 psduMap.begin()->second->GetHeader(0).IsAck(),
1572 "Expected a Normal Ack after Association Response frame");
1577 for (
const auto& [
id, lnk] :
GetLinks())
1604 std::pair<bool, uint8_t>{
true,
id});
1625 std::pair<bool, uint8_t>{
false,
id});
1635 phy->TraceConnectWithoutContext(
"PhyTxPsduBegin", cb);
1637 [=]() { phy->TraceDisconnectWithoutContext(
"PhyTxPsduBegin", cb); });
1647 auto check = [&](
auto&& mgtFrame) ->
bool {
1649 NS_ASSERT(mgtFrame.template Get<SupportedRates>());
1651 mgtFrame.template Get<ExtendedSupportedRatesIE>()};
1654 if (!rates.IsBssMembershipSelectorRate(selector))
1656 NS_LOG_DEBUG(
"Supported rates do not fit with the BSS membership selector");
1664 return std::visit(
check, frame);
1675 auto recordFromOpIes = [&](
auto&& frame) {
1676 const auto& edcaParameters = frame.template Get<EdcaParameterSet>();
1677 const auto qosSupported = edcaParameters.has_value();
1683 if (
const auto& htOperation = frame.template Get<HtOperation>())
1685 remoteStationManager->AddStationHtOperation(from, *htOperation);
1692 if (
const auto& vhtOperation = frame.template Get<VhtOperation>())
1694 remoteStationManager->AddStationVhtOperation(from, *vhtOperation);
1703 if (
const auto& heOperation = frame.template Get<HeOperation>())
1705 remoteStationManager->AddStationHeOperation(from, *heOperation);
1713 if (
const auto& ehtOperation = frame.template Get<EhtOperation>())
1715 remoteStationManager->AddStationEhtOperation(from, *ehtOperation);
1720 std::visit(recordFromOpIes, frame);
1732 const std::optional<ErpInformation>* erpInformation =
nullptr;
1734 if (
const auto* beacon = std::get_if<MgtBeaconHeader>(&frame))
1738 else if (
const auto* probe = std::get_if<MgtProbeResponseHeader>(&frame))
1744 auto processOtherIes = [&](
auto&& frame) {
1745 const auto& capabilities = frame.Capabilities();
1746 bool isShortPreambleEnabled = capabilities.IsShortPreamble();
1748 if (erpInformation && erpInformation->has_value() &&
GetErpSupported(linkId))
1750 isShortPreambleEnabled &= !(*erpInformation)->GetBarkerPreambleMode();
1751 if ((*erpInformation)->GetUseProtection() != 0)
1753 remoteStationManager->SetUseNonErpProtection(
true);
1757 remoteStationManager->SetUseNonErpProtection(
false);
1759 if (capabilities.IsShortSlotTime() ==
true)
1770 remoteStationManager->SetShortPreambleEnabled(isShortPreambleEnabled);
1771 remoteStationManager->SetShortSlotTimeEnabled(capabilities.IsShortSlotTime());
1778 const auto& edcaParameters = frame.template Get<EdcaParameterSet>();
1779 if (edcaParameters.has_value())
1784 edcaParameters->GetBeCWmin(),
1785 edcaParameters->GetBeCWmax(),
1786 edcaParameters->GetBeAifsn(),
1790 edcaParameters->GetBkCWmin(),
1791 edcaParameters->GetBkCWmax(),
1792 edcaParameters->GetBkAifsn(),
1796 edcaParameters->GetViCWmin(),
1797 edcaParameters->GetViCWmax(),
1798 edcaParameters->GetViAifsn(),
1802 edcaParameters->GetVoCWmin(),
1803 edcaParameters->GetVoCWmax(),
1804 edcaParameters->GetVoAifsn(),
1812 if (
const auto& htCapabilities = frame.template Get<HtCapabilities>();
1813 !htCapabilities.has_value())
1815 remoteStationManager->RemoveAllSupportedMcs(apAddr);
1824 if (
const auto& heOperation = frame.template Get<HeOperation>())
1829 const auto& muEdcaParameters = frame.template Get<MuEdcaParameterSet>();
1830 if (muEdcaParameters.has_value())
1833 muEdcaParameters->GetMuCwMin(
AC_BE),
1834 muEdcaParameters->GetMuCwMax(
AC_BE),
1835 muEdcaParameters->GetMuAifsn(
AC_BE),
1836 muEdcaParameters->GetMuEdcaTimer(
AC_BE)},
1839 muEdcaParameters->GetMuCwMin(
AC_BK),
1840 muEdcaParameters->GetMuCwMax(
AC_BK),
1841 muEdcaParameters->GetMuAifsn(
AC_BK),
1842 muEdcaParameters->GetMuEdcaTimer(
AC_BK)},
1845 muEdcaParameters->GetMuCwMin(
AC_VI),
1846 muEdcaParameters->GetMuCwMax(
AC_VI),
1847 muEdcaParameters->GetMuAifsn(
AC_VI),
1848 muEdcaParameters->GetMuEdcaTimer(
AC_VI)},
1851 muEdcaParameters->GetMuCwMin(
AC_VO),
1852 muEdcaParameters->GetMuCwMax(
AC_VO),
1853 muEdcaParameters->GetMuAifsn(
AC_VO),
1854 muEdcaParameters->GetMuEdcaTimer(
AC_VO)},
1863 if (
const auto& mle = frame.template Get<MultiLinkElement>(); mle &&
m_emlsrManager)
1865 if (mle->HasEmlCapabilities())
1867 m_emlsrManager->SetTransitionTimeout(mle->GetTransitionTimeout());
1869 if (
const auto& common = mle->GetCommonInfoBasic(); common.m_mediumSyncDelayInfo)
1871 m_emlsrManager->SetMediumSyncDuration(common.GetMediumSyncDelayTimer());
1872 m_emlsrManager->SetMediumSyncOfdmEdThreshold(common.GetMediumSyncOfdmEdThreshold());
1873 m_emlsrManager->SetMediumSyncMaxNTxops(common.GetMediumSyncMaxNTxops());
1879 std::visit(processOtherIes, frame);
1885 const auto [enable, linkId] = enableLinkIdPair;
1892 NS_LOG_DEBUG(
"Not associated yet, record the PM mode to switch to upon association");
1899 NS_LOG_DEBUG(
"Link " << +linkId <<
" has not been setup, ignore request");
1920 NS_LOG_DEBUG(
"Next transmitted frame will be sent with PM=" << enable);
1960 auto linkIds = mpdu->GetInFlightLinkIds();
1962 "The TA of the acked MPDU (" << *mpdu
1963 <<
") is not a link "
1964 "address and the MPDU is not inflight");
1969 linkId = *linkIds.begin();
1970 mpdu =
GetTxopQueue(mpdu->GetQueueAc())->GetAlias(mpdu, *linkId);
1973 auto& link =
GetLink(*linkId);
1994 NS_LOG_DEBUG(
"Adding supported rate of " << modeDataRate);
2014 return capabilities;
2027 edca->SetMinCw(params.cwMin, linkId);
2028 edca->SetMaxCw(params.cwMax, linkId);
2029 edca->SetAifsn(params.aifsn, linkId);
2030 edca->SetTxopLimit(params.txopLimit, linkId);
2037 edca->SetMuCwMin(params.cwMin, linkId);
2038 edca->SetMuCwMax(params.cwMax, linkId);
2039 edca->SetMuAifsn(params.aifsn, linkId);
2040 edca->SetMuEdcaTimer(params.muEdcaTimer, linkId);
2049 NS_LOG_DEBUG(
"PHY capabilities changed: send reassociation request");
2109 for (
auto& [
id, link] :
GetLinks())
2111 if (link->phy == phy &&
id != linkId)
2121 link->phy =
nullptr;
2127 auto connectPhy = [=,
this]()
mutable {
2128 auto& newLink =
GetLink(linkId);
2132 newLink.channelAccessManager->SetupPhyListener(phy);
2136 newLink.channelAccessManager->ResetState();
2139 newLink.feManager->ResetPhy();
2141 newLink.feManager->SetWifiPhy(phy);
2143 newLink.stationManager->SetupPhy(phy);
2156 auto lambda = [=,
this]()
mutable {
2157 const auto [maybeIcf, extension] =
m_emlsrManager->CheckPossiblyReceivingIcf(linkId);
2158 if (maybeIcf && extension.IsStrictlyPositive())
2161 "Only the main PHY is expected to move to a link on which another "
2162 "PHY is operating. PHY ID="
2163 << +phy->GetPhyId());
2164 NS_LOG_DEBUG(
"Connecting main PHY to link " << +linkId <<
" is postponed by "
2188 eventIt->second.Cancel();
2212 os <<
"BSSID=" << apInfo.
m_bssid <<
", AP addr=" << apInfo.
m_apAddr <<
", SNR=" << apInfo.
m_snr
2214 <<
"}, Link ID=" << +apInfo.
m_linkId <<
", Frame=[";
2215 std::visit([&os](
auto&& frame) { frame.Print(os); }, apInfo.
m_frame);
A container for one type of attribute.
AttributeValue implementation for Boolean.
Base class for Callback class.
bool IsNull() const
Check for null implementation.
The IEEE 802.11be EHT Capabilities.
Hold variables of type enum.
void Cancel()
This method is syntactic sugar for the ns3::Simulator::Cancel method.
bool IsPending() const
This method is syntactic sugar for !IsExpired().
bool IsExpired() const
This method is syntactic sugar for the ns3::Simulator::IsExpired method.
The Extended Capabilities Information Element.
The Extended Supported Rates Information Element.
The HE 6 GHz Band Capabilities (IEEE 802.11ax-2021 9.4.2.263)
The IEEE 802.11ax HE Capabilities.
The HT Capabilities Information Element.
static Mac48Address ConvertFrom(const Address &address)
void SetLinkId(uint8_t linkId)
Set the Link ID subfield in the STA Control field.
void AddPerStaProfileSubelement()
Add a Per-STA Profile Subelement in the Link Info field.
void SetEmlsrSupported(bool supported)
Set the EMLSR Support subfield of the EML Capabilities subfield in the Common Info field to 1 if EMLS...
CommonInfoBasicMle & GetCommonInfoBasic()
void SetEmlsrTransitionDelay(Time delay)
Set the EMLSR Transition Delay subfield of the EML Capabilities subfield in the Common Info field.
PerStaProfileSubelement & GetPerStaProfile(std::size_t i)
Get a reference to the i-th Per-STA Profile Subelement in the Link Info field.
void SetEmlsrPaddingDelay(Time delay)
Set the EMLSR Padding Delay subfield of the EML Capabilities subfield in the Common Info field.
void SetApMldId(uint8_t id)
Set the AP MLD ID subfield of Common Info field.
void SetMldMacAddress(Mac48Address address)
Set the MLD MAC Address subfield in the Common Info field.
std::size_t GetNPerStaProfileSubelements() const
Return the number of Per-STA Profile Subelement in the Link Info field.
bool TraceConnectWithoutContext(std::string name, const CallbackBase &cb)
Connect a TraceSource to a Callback without a context.
bool IsInitialized() const
Check if the object has been initialized.
AttributeValue implementation for Pair.
Smart pointer class similar to boost::intrusive_ptr.
bool HasFramesToTransmit(uint8_t linkId) override
Check if the Txop has frames to transmit over the given link.
virtual double GetValue()=0
Get the next random value drawn from the distribution.
void SetStream(int64_t stream)
Specifies the stream number for the RngStream.
static EventId Schedule(const Time &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
static Time Now()
Return the current simulation virtual time.
static EventId ScheduleNow(FUNC f, Ts &&... args)
Schedule an event to expire Now.
static Time GetDelayLeft(const EventId &id)
Get the remaining time until this event will execute.
Introspection did not find any typical Config paths.
double Get() const
Return the SNR value.
The IEEE 802.11 SSID Information Element.
The Wifi MAC high model for a non-AP STA in a BSS.
std::set< uint8_t > GetSetupLinkIds() const
Get the IDs of the setup links (if any).
void ScanningTimeout(const std::optional< ApInfo > &bestAp)
This method is called after wait beacon timeout or wait probe request timeout has occurred.
Time m_waitBeaconTimeout
wait beacon timeout
int64_t AssignStreams(int64_t stream) override
Assign a fixed random variable stream number to the random variables used by this model.
void SetPowerSaveMode(const std::pair< bool, uint8_t > &enableLinkIdPair)
Enable or disable Power Save mode on the given link.
Ptr< WifiAssocManager > m_assocManager
Association Manager.
void DoCompleteConfig() override
Allow subclasses to complete the configuration of the MAC layer components.
bool m_activeProbing
active probing
void DoInitialize() override
Initialize() implementation.
void SetAssocManager(Ptr< WifiAssocManager > assocManager)
Set the Association Manager.
bool CanForwardPacketsTo(Mac48Address to) const override
Return true if packets can be forwarded to the given destination, false otherwise.
std::unique_ptr< LinkEntity > CreateLinkEntity() const override
Create a LinkEntity object.
void SetState(MacState value)
Set the current MAC state.
Time m_beaconWatchdogEnd
beacon watchdog end
AllSupportedRates GetSupportedRates(uint8_t linkId) const
Return an instance of SupportedRates that contains all rates that we support including HT rates.
void SetEdcaParameters(const EdcaParams ¶ms, uint8_t linkId)
Set the EDCA parameters for the given link.
TracedCallback< Mac48Address > m_deAssocLogger
disassociation logger
MacState
The current MAC state of the STA.
void NotifyChannelSwitching(uint8_t linkId) override
Notify that channel on the given link has been switched.
bool GetActiveProbing() const
Return whether active probing is enabled.
EventId m_beaconWatchdog
beacon watchdog
void PhyCapabilitiesChanged()
Indicate that PHY capabilities have changed.
WifiAssocType m_assocType
type of association
StaLinkEntity & GetStaLink(const std::unique_ptr< WifiMac::LinkEntity > &link) const
Cast the given LinkEntity object to StaLinkEntity.
void ReceiveProbeResp(Ptr< const WifiMpdu > mpdu, uint8_t linkId)
Process the Probe Response frame received on the given link.
void SetPmModeAfterAssociation(uint8_t linkId)
Set the Power Management mode of the setup links after association.
WifiScanParams::Channel GetCurrentChannel(uint8_t linkId) const
Get the current primary20 channel used on the given link as a (channel number, PHY band) pair.
uint16_t GetAssociationId() const
Return the association ID.
void TryToEnsureAssociated()
Try to ensure that we are associated with an AP by taking an appropriate action depending on the curr...
void ReceiveAssocResp(Ptr< const WifiMpdu > mpdu, uint8_t linkId)
Process the (Re)Association Response frame received on the given link.
void NotifySwitchingEmlsrLink(Ptr< WifiPhy > phy, uint8_t linkId, Time delay)
Notify that the given PHY switched channel to operate on another EMLSR link.
std::variant< MgtAssocRequestHeader, MgtReassocRequestHeader > GetAssociationRequest(bool isReassoc, uint8_t linkId) const
Get the (Re)Association Request frame to send on a given link.
static TypeId GetTypeId()
Get the type ID.
MultiLinkElement GetBasicMultiLinkElement(bool isReassoc, uint8_t linkId) const
Return the Basic Multi-Link Element to include in the management frames transmitted on the given link...
void CancelEmlsrPhyConnectEvent(uint8_t phyId)
Cancel any scheduled event for connecting the given PHY to an EMLSR link.
void DoDispose() override
Destructor implementation.
void BlockTxOnLink(uint8_t linkId, WifiQueueBlockedReason reason)
Block transmissions on the given link for the given reason.
std::map< uint8_t, EventId > m_emlsrLinkSwitch
maps PHY ID to the event scheduled to switch the corresponding PHY to a new EMLSR link
void RecordOperations(const MgtFrameType &frame, const Mac48Address &addr, uint8_t linkId)
Update operations information from the given management frame.
StaLinkEntity & GetLink(uint8_t linkId) const
Get a reference to the link associated with the given ID.
uint32_t m_maxMissedBeacons
maximum missed beacons
TracedCallback< uint8_t, Mac48Address > m_setupCompleted
link setup completed logger
TracedCallback< Mac48Address > m_assocLogger
association logger
void SetWifiPhys(const std::vector< Ptr< WifiPhy > > &phys) override
void SetMuEdcaParameters(const MuEdcaParams ¶ms, uint8_t linkId)
Set the MU EDCA parameters for the given link.
void NotifyEmlsrModeChanged(const std::set< uint8_t > &linkIds)
Notify the MAC that EMLSR mode has changed on the given set of links.
bool CheckSupportedRates(std::variant< MgtBeaconHeader, MgtProbeResponseHeader > frame, uint8_t linkId)
Determine whether the supported rates indicated in a given Beacon frame or Probe Response frame fit w...
Mac48Address DoGetLocalAddress(const Mac48Address &remoteAddr) const override
This method is called if this device is an MLD to determine the MAC address of the affiliated STA use...
void RestartBeaconWatchdog(Time delay)
Restarts the beacon timer.
void SetEmlsrManager(Ptr< EmlsrManager > emlsrManager)
Set the EMLSR Manager.
void NotifyDropPacketToEnqueue(Ptr< Packet > packet, Mac48Address to) override
Allow subclasses to take actions when a packet to enqueue has been dropped.
Time m_pmModeSwitchTimeout
PM mode switch timeout.
void Disassociated()
Set the state to unassociated and try to associate again.
Ptr< EmlsrManager > GetEmlsrManager() const
void TxOk(Ptr< const WifiMpdu > mpdu)
Notify that the MPDU we sent was successfully received by the receiver (i.e.
MgtProbeRequestHeader GetProbeRequest(uint8_t linkId) const
Get the frame body of the Probe Request to transmit on the given link.
MgtProbeRequestHeader GetMultiLinkProbeRequest(uint8_t linkId, const std::vector< uint8_t > &apLinkIds, std::optional< uint8_t > apMldId) const
Get the frame body of the Multi-Link Probe Request to transmit on the given link.
void Receive(Ptr< const WifiMpdu > mpdu, uint8_t linkId) override
This method acts as the MacRxMiddle receive callback and is invoked to notify us that a frame has bee...
WifiTidLinkMapping m_ulTidLinkMappingInAssocReq
store the UL TID-to-Link Mapping included in the Association Request frame
WifiPowerManagementMode GetPmMode(uint8_t linkId) const
Ptr< RandomVariableStream > m_probeDelay
RandomVariable used to randomize the time of the first Probe Response on each channel.
TracedCallback< ApInfo > m_beaconInfo
beacon info logger
void MissedBeacons()
This method is called after we have not received a beacon from the AP on any link.
uint16_t m_aid
Association AID.
MacState m_state
MAC state.
bool IsEmlsrLink(uint8_t linkId) const
WifiAssocType GetAssocType() const
void StartScanning()
Start the scanning process which trigger active or passive scanning based on the active probing flag.
std::vector< TidToLinkMapping > GetTidToLinkMappingElements(WifiTidToLinkMappingNegSupport apNegSupport)
TracedCallback< Time > m_beaconArrival
beacon arrival logger
void UnblockTxOnLink(std::set< uint8_t > linkIds, WifiQueueBlockedReason reason)
Unblock transmissions on the given links for the given reason.
void AssocRequestTimeout()
This method is called after the association timeout occurred.
void Enqueue(Ptr< WifiMpdu > mpdu, Mac48Address to, Mac48Address from) override
Ptr< EmlsrManager > m_emlsrManager
EMLSR Manager.
void ApplyOperationalSettings(const MgtFrameType &frame, const Mac48Address &apAddr, const Mac48Address &bssid, uint8_t linkId)
Update operational settings based on associated AP's information provided by the given management fra...
Time m_assocRequestTimeout
association request timeout
void ReceiveBeacon(Ptr< const WifiMpdu > mpdu, uint8_t linkId)
Process the Beacon frame received on the given link.
Time m_probeRequestTimeout
probe request timeout
void SetActiveProbing(bool enable)
Enable or disable active probing.
CapabilityInformation GetCapabilities(uint8_t linkId) const
Return the Capability information for the given link.
bool IsAssociated() const
Return whether we are associated with an AP.
bool IsWaitAssocResp() const
Return whether we are waiting for an association response from an AP.
MultiLinkElement GetProbeReqMultiLinkElement(const std::vector< uint8_t > &apLinkIds, std::optional< uint8_t > apMldId) const
Return the Probe Request Multi-Link Element to include in the management frames to transmit.
EventId m_assocRequestEvent
association request event
void EnqueueProbeRequest(const MgtProbeRequestHeader &probeReq, uint8_t linkId, const Mac48Address &addr1=Mac48Address::GetBroadcast(), const Mac48Address &addr3=Mac48Address::GetBroadcast())
Enqueue the given probe request packet for transmission on the given link.
void SendAssociationRequest(bool isReassoc)
Forward an association or reassociation request packet to the DCF.
TracedCallback< uint8_t, Ptr< WifiPhy >, bool > m_emlsrLinkSwitchLogger
EMLSR link switch logger.
WifiTidLinkMapping m_dlTidLinkMappingInAssocReq
store the DL TID-to-Link Mapping included in the Association Request frame
bool IsSuccess() const
Return whether the status code is success.
Hold variables of type string.
The Supported Rates Information Element.
TID-to-Link Mapping Information Element.
Simulation virtual time values and global simulation resolution.
TimeWithUnit As(const Unit unit=Time::AUTO) const
Attach a unit to a Time, to facilitate output in a specific unit.
bool IsStrictlyPositive() const
Exactly equivalent to t > 0.
AttributeValue implementation for Time.
void StartAccessAfterEvent(uint8_t linkId, bool hadFramesToTransmit, bool checkMediumBusy)
Request channel access on the given link after the occurrence of an event that possibly requires to g...
static constexpr bool DIDNT_HAVE_FRAMES_TO_TRANSMIT
no packet available for transmission was in the queue
virtual void Queue(Ptr< WifiMpdu > mpdu)
static constexpr bool CHECK_MEDIUM_BUSY
generation of backoff (also) depends on the busy/idle state of the medium
a unique identifier for an interface.
@ ATTR_GET
The attribute can be read.
@ ATTR_SET
The attribute can be written.
@ ATTR_CONSTRUCT
The attribute can be written at construction-time.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Hold an unsigned integer type.
The IEEE 802.11ac VHT Capabilities.
base class for all MAC-level wifi objects.
Ptr< FrameExchangeManager > GetFrameExchangeManager(uint8_t linkId=SINGLE_LINK_OP_ID) const
Get the Frame Exchange Manager associated with the given link.
Ptr< QosTxop > GetBEQueue() const
Accessor for the AC_BE channel access function.
virtual void NotifyChannelSwitching(uint8_t linkId)
Notify that channel on the given link has been switched.
std::optional< Mac48Address > GetMldAddress(const Mac48Address &remoteAddr) const
Mac48Address GetBssid(uint8_t linkId) const
Ptr< HeConfiguration > GetHeConfiguration() const
const std::map< uint8_t, std::unique_ptr< LinkEntity > > & GetLinks() const
Ptr< Txop > GetTxop() const
Accessor for the Txop object.
VhtCapabilities GetVhtCapabilities(uint8_t linkId) const
Return the VHT capabilities of the device for the given link.
Callback< void > m_linkDown
Callback when a link is down.
bool GetQosSupported() const
Return whether the device supports QoS.
Ptr< Txop > m_txop
TXOP used for transmission of frames to non-QoS peers.
Ptr< WifiMacQueueScheduler > GetMacQueueScheduler() const
Get the wifi MAC queue scheduler.
uint8_t GetNLinks() const
Get the number of links (can be greater than 1 for 11be devices only).
void SwapLinks(std::map< uint8_t, uint8_t > links)
Swap the links based on the information included in the given map.
void DoInitialize() override
Initialize() implementation.
std::variant< MgtBeaconHeader, MgtProbeResponseHeader, MgtAssocResponseHeader > MgtFrameType
type of the management frames
bool GetErpSupported(uint8_t linkId) const
Return whether the device supports ERP on the given link.
Ptr< QosTxop > GetVOQueue() const
Accessor for the AC_VO channel access function.
void SetTypeOfStation(TypeOfStation type)
This method is invoked by a subclass to specify what type of station it is implementing.
Ptr< WifiPhy > GetWifiPhy(uint8_t linkId=SINGLE_LINK_OP_ID) const
void RecordCapabilities(const MgtFrameType &frame, const Mac48Address &addr, uint8_t linkId)
Update capabilities information from the given management frame.
bool GetEhtSupported() const
Return whether the device supports EHT.
bool GetHeSupported() const
Return whether the device supports HE.
HtCapabilities GetHtCapabilities(uint8_t linkId) const
Return the HT capabilities of the device for the given link.
virtual std::optional< uint8_t > GetLinkIdByAddress(const Mac48Address &address) const
Get the ID of the link having the given MAC address, if any.
virtual bool HasFramesToTransmit(uint8_t linkId)
Check if the MAC has frames to transmit over the given link.
UniformRandomBitGenerator m_shuffleLinkIdsGen
random number generator to shuffle link IDs
void ApplyTidLinkMapping(const Mac48Address &mldAddr, WifiDirection dir)
Apply the TID-to-Link Mapping negotiated with the given MLD for the given direction by properly confi...
Ptr< EhtConfiguration > GetEhtConfiguration() const
bool GetVhtSupported(uint8_t linkId) const
Return whether the device supports VHT on the given link.
virtual int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model.
virtual void DeaggregateAmsduAndForward(Ptr< const WifiMpdu > mpdu)
This method can be called to de-aggregate an A-MSDU and forward the constituent packets up the stack.
void SetBssid(Mac48Address bssid, uint8_t linkId)
Ptr< WifiNetDevice > GetDevice() const
Return the device this PHY is associated with.
void UpdateTidToLinkMapping(const Mac48Address &mldAddr, WifiDirection dir, const WifiTidLinkMapping &mapping)
Update the TID-to-Link Mappings for the given MLD in the given direction based on the given negotiate...
ExtendedCapabilities GetExtendedCapabilities() const
Return the extended capabilities of the device.
He6GhzBandCapabilities GetHe6GhzBandCapabilities(uint8_t linkId) const
Return the HE 6GHz band capabilities of the device for the given 6 GHz link.
virtual Ptr< WifiMacQueue > GetTxopQueue(AcIndex ac) const
Get the wifi MAC queue of the (Qos)Txop associated with the given AC, if such (Qos)Txop is installed,...
std::optional< uint8_t > GetLinkForPhy(Ptr< const WifiPhy > phy) const
Get the ID of the link (if any) on which the given PHY is operating.
bool GetShortSlotTimeSupported() const
void NotifyRxDrop(Ptr< const Packet > packet)
Ptr< WifiRemoteStationManager > GetWifiRemoteStationManager(uint8_t linkId=0) const
bool GetHtSupported(uint8_t linkId) const
Return whether the device supports HT on the given link.
void ForwardUp(Ptr< const Packet > packet, Mac48Address from, Mac48Address to)
Forward the packet up to the device.
bool Is6GhzBand(uint8_t linkId) const
Indicate if a given link is on the 6 GHz band.
virtual void Receive(Ptr< const WifiMpdu > mpdu, uint8_t linkId)
This method acts as the MacRxMiddle receive callback and is invoked to notify us that a frame has bee...
Mac48Address GetAddress() const
EhtCapabilities GetEhtCapabilities(uint8_t linkId) const
Return the EHT capabilities of the device for the given link.
Callback< void > m_linkUp
Callback when a link is up.
LinkEntity & GetLink(uint8_t linkId) const
Get a reference to the link associated with the given ID.
HeCapabilities GetHeCapabilities(uint8_t linkId) const
Return the HE capabilities of the device for the given link.
virtual void SetWifiPhys(const std::vector< Ptr< WifiPhy > > &phys)
Ptr< QosTxop > GetQosTxop(AcIndex ac) const
Accessor for a specified EDCA object.
void DoDispose() override
Destructor implementation.
std::list< uint8_t > GetBssMembershipSelectorList() const
The WifiPhy::BssMembershipSelector() method is used (e.g., by a WifiRemoteStationManager) to determin...
static Time CalculateTxDuration(uint32_t size, const WifiTxVector &txVector, WifiPhyBand band, uint16_t staId=SU_STA_ID)
void SetSlot(Time slot)
Set the slot duration for this PHY.
MHz_u GetChannelWidth() const
void SetOffMode()
Put in off mode.
std::list< WifiMode > GetModeList() const
The WifiPhy::GetModeList() method is used (e.g., by a WifiRemoteStationManager) to determine the set ...
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Ptr< const AttributeChecker > MakeBooleanChecker()
Ptr< const AttributeAccessor > MakeBooleanAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
Ptr< const AttributeAccessor > MakeEnumAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
Ptr< const AttributeAccessor > MakePairAccessor(T1 a1)
Create an AttributeAccessor for std::pair<>.
Ptr< AttributeChecker > MakePairChecker()
Make a PairChecker without abscissa and ordinate AttributeCheckers.
Ptr< const AttributeAccessor > MakePointerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
Ptr< AttributeChecker > MakePointerChecker()
Create a PointerChecker for a type.
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
Ptr< const AttributeChecker > MakeTimeChecker()
Helper to make an unbounded Time checker.
Ptr< const AttributeChecker > MakeUintegerChecker()
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
#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.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
#define NS_LOG_FUNCTION_NOARGS()
Output the name of the function.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Ptr< T > Create(Ts &&... args)
Create class instances by constructors with varying numbers of arguments and return them by Ptr.
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
Time NanoSeconds(uint64_t value)
Construct a Time in the indicated unit.
Time Seconds(double value)
Construct a Time in the indicated unit.
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
WifiPowerManagementMode
Enumeration for power management modes.
WifiQueueBlockedReason
Enumeration of the reasons to block container queues.
WifiAssocType
Type of association performed by this device (provided that it is supported by the standard configure...
@ WIFI_PM_SWITCHING_TO_ACTIVE
@ WIFI_PM_SWITCHING_TO_PS
@ WIFI_PHY_BAND_UNSPECIFIED
Unspecified.
@ WIFI_PHY_BAND_2_4GHZ
The 2.4 GHz band.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Callback< R, Args... > MakeCallback(R(T::*memPtr)(Args...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
WifiTidToLinkMappingNegSupport
TID-to-Link Mapping Negotiation Support.
std::ostream & operator<<(std::ostream &os, const Angles &a)
Ptr< const AttributeChecker > MakeEnumChecker(T v, std::string n, Ts... args)
Make an EnumChecker pre-configured with a set of allowed values by name.
void Shuffle(RND_ACCESS_ITER first, RND_ACCESS_ITER last, Ptr< UniformRandomVariable > rv)
Shuffle the elements in the range first to last.
const std::map< AcIndex, WifiAc > wifiAcList
Map containing the four ACs in increasing order of priority (according to Table 10-1 "UP-to-AC Mappin...
@ WIFI_MAC_MGT_PROBE_REQUEST
@ WIFI_MAC_MGT_ASSOCIATION_RESPONSE
@ WIFI_MAC_MGT_ASSOCIATION_REQUEST
@ WIFI_MAC_MGT_REASSOCIATION_REQUEST
@ WIFI_MAC_MGT_PROBE_RESPONSE
@ WIFI_MAC_MGT_REASSOCIATION_RESPONSE
bool TidToLinkMappingValidForNegType1(const WifiTidLinkMapping &dlLinkMapping, const WifiTidLinkMapping &ulLinkMapping)
Check if the given TID-to-Link Mappings are valid for a negotiation type of 1.
@ LOG_FUNCTION
Function tracing for non-trivial function calls.
Ptr< T1 > StaticCast(const Ptr< T2 > &p)
Cast a Ptr.
std::unordered_map< uint16_t, Ptr< const WifiPsdu > > WifiConstPsduMap
Map of const PSDUs indexed by STA-ID.
Struct containing all supported rates.
void AddBssMembershipSelectorRate(uint64_t bs)
Add a special value to the supported rate set, corresponding to a BSS membership selector.
void AddSupportedRate(uint64_t bs)
Add the given rate to the supported rates.
std::optional< MldCapabilities > m_mldCapabilities
MLD Capabilities.
Struct to hold information regarding observed AP through active/passive scanning.
MgtFrameType m_frame
The body of the management frame used to update AP info.
WifiScanParams::Channel m_channel
The channel the management frame was received on.
Mac48Address m_apAddr
AP MAC address.
uint8_t m_linkId
ID of the link used to communicate with the AP.
Mac48Address m_bssid
BSSID.
double m_snr
SNR in linear scale.
Structure holding information specific to a single link.
bool sendAssocReq
whether this link is used to send the Association Request frame
std::optional< Mac48Address > bssid
BSSID of the AP to associate with over this link.
bool emlsrEnabled
whether EMLSR mode is enabled on this link
WifiPowerManagementMode pmMode
the current PM mode, if the STA is associated, or the PM mode to switch to upon association,...
~StaLinkEntity() override
Destructor (a virtual method is needed to make this struct polymorphic)
Ptr< WifiPhy > phy
Wifi PHY object.
Ptr< FrameExchangeManager > feManager
Frame Exchange Manager object.
Struct identifying a channel to scan.
WifiPhyBand band
PHY band.
uint16_t number
channel number
Structure holding scan parameters.
std::list< Channel > ChannelList
typedef for a list of channels
std::vector< ChannelList > channelList
list of channels to scan, for each link
Time probeDelay
delay prior to transmitting a Probe Request
WifiScanType type
indicates either active or passive scanning
Time maxChannelTime
maximum time to spend on each channel
Ssid ssid
desired SSID or wildcard SSID
Time minChannelTime
minimum time to spend on each channel