38#include "ns3/eht-configuration.h"
39#include "ns3/eht-frame-exchange-manager.h"
40#include "ns3/he-configuration.h"
41#include "ns3/ht-configuration.h"
43#include "ns3/multi-link-element.h"
44#include "ns3/packet.h"
45#include "ns3/pointer.h"
46#include "ns3/random-variable-stream.h"
47#include "ns3/simulator.h"
48#include "ns3/string.h"
67 "Delay between two beacons",
71 .AddAttribute(
"BeaconJitter",
72 "A uniform random variable to cause the initial beacon starting time "
73 "(after simulation time 0) "
74 "to be distributed between 0 and the BeaconInterval.",
77 MakePointerChecker<UniformRandomVariable>())
78 .AddAttribute(
"EnableBeaconJitter",
79 "If beacons are enabled, whether to jitter the initial send event.",
83 .AddAttribute(
"BeaconGeneration",
84 "Whether or not beacons are generated.",
88 .AddAttribute(
"FdBeaconInterval6GHz",
89 "Time between a Beacon frame and a FILS Discovery (FD) frame or between "
90 "two FD frames to be sent on a 6GHz link. A value of zero disables the "
91 "transmission of FD frames.",
95 .AddAttribute(
"FdBeaconIntervalNon6GHz",
96 "Time between a Beacon frame and a FILS Discovery (FD) frame or between "
97 "two FD frames to be sent on a non-6GHz link. A value of zero disables "
98 "the transmission of FD frames.",
102 .AddAttribute(
"SendUnsolProbeResp",
103 "Send unsolicited broadcast Probe Response instead of FILS Discovery",
107 .AddAttribute(
"EnableNonErpProtection",
108 "Whether or not protection mechanism should be used when non-ERP STAs "
109 "are present within the BSS."
110 "This parameter is only used when ERP is supported by the AP.",
114 .AddAttribute(
"BsrLifetime",
115 "Lifetime of Buffer Status Reports received from stations.",
121 "The CW min values that the AP advertises in EDCA Parameter Set elements and the "
122 "associated stations will use. The value of this attribute is an AC-indexed map "
123 "containing the CW min values for given ACs for all the links (sorted in "
124 "increasing order of link ID). If no values are provided for an AC, the same "
125 "values used by the AP are advertised. In case a string is used to set this "
126 "attribute, the string shall contain the pairs separated by a semicolon (;); "
127 "in every pair, the AC index and the list of values are separated by a blank "
128 "space, and the values of a list are separated by a comma (,) without spaces. "
129 "E.g. \"BE 31,31,31; VI 15,15,15\" defines the CW min values for AC BE and AC VI "
130 "for an AP MLD having three links.",
132 MakeAttributeContainerAccessor<UintAccessParamsPairValue, ';'>(
134 GetUintAccessParamsChecker<uint32_t>())
137 "The CW max values that the AP advertises in EDCA Parameter Set elements and the "
138 "associated stations will use. The value of this attribute is an AC-indexed map "
139 "containing the CW max values for given ACs for all the links (sorted in "
140 "increasing order of link ID). If no values are provided for an AC, the same "
141 "values used by the AP are advertised. In case a string is used to set this "
142 "attribute, the string shall contain the pairs separated by a semicolon (;); "
143 "in every pair, the AC index and the list of values are separated by a blank "
144 "space, and the values of a list are separated by a comma (,) without spaces. "
145 "E.g. \"BE 31,31,31; VI 15,15,15\" defines the CW max values for AC BE and AC VI "
146 "for an AP MLD having three links.",
148 MakeAttributeContainerAccessor<UintAccessParamsPairValue, ';'>(
150 GetUintAccessParamsChecker<uint32_t>())
153 "The AIFSN values that the AP advertises in EDCA Parameter Set elements and the "
154 "associated stations will use. The value of this attribute is an AC-indexed map "
155 "containing the AIFSN values for given ACs for all the links (sorted in "
156 "increasing order of link ID). If no values are provided for an AC, the same "
157 "values used by the AP are advertised. In case a string is used to set this "
158 "attribute, the string shall contain the pairs separated by a semicolon (;); "
159 "in every pair, the AC index and the list of values are separated by a blank "
160 "space, and the values of a list are separated by a comma (,) without spaces. "
161 "E.g. \"BE 3,3,3; VI 2,2,2\" defines the AIFSN values for AC BE and AC VI "
162 "for an AP MLD having three links.",
164 MakeAttributeContainerAccessor<UintAccessParamsPairValue, ';'>(
166 GetUintAccessParamsChecker<uint8_t>())
169 "The TXOP limit values that the AP advertises in EDCA Parameter Set elements and "
170 "the associated stations will use. The value of this attribute is an AC-indexed "
171 "map containing the TXOP limit values for given ACs for all the links (sorted in "
172 "increasing order of link ID). If no values are provided for an AC, the same "
173 "values used by the AP are advertised. In case a string is used to set this "
174 "attribute, the string shall contain the pairs separated by a semicolon (;); "
175 "in every pair, the AC index and the list of values are separated by a blank "
176 "space, and the values of a list are separated by a comma (,) without spaces. "
177 "E.g. \"BE 3200us,3200us,3200us; VI 2400us,2400us,2400us\" defines the TXOP limit "
178 "values for AC BE and AC VI for an AP MLD having three links.",
180 MakeAttributeContainerAccessor<TimeAccessParamsPairValue, ';'>(
183 .AddTraceSource(
"AssociatedSta",
184 "A station associated with this access point.",
186 "ns3::ApWifiMac::AssociationCallback")
187 .AddTraceSource(
"DeAssociatedSta",
188 "A station lost association with this access point.",
190 "ns3::ApWifiMac::AssociationCallback");
198 return MakeAttributeContainerChecker<UintAccessParamsPairValue, ';'>(
203 MakeUintegerChecker<T>())));
209 return MakeAttributeContainerChecker<TimeAccessParamsPairValue, ';'>(
216 : m_enableBeaconGeneration(false)
247std::unique_ptr<WifiMac::LinkEntity>
250 return std::make_unique<ApLinkEntity>();
268 for (uint8_t linkId = 0; linkId <
GetNLinks(); linkId++)
288 for (uint8_t linkId = 0; linkId <
GetNLinks(); ++linkId)
328 NS_FATAL_ERROR(
"beacon interval should be multiple of 1024us (802.11 time unit), see IEEE "
334 "beacon interval should be smaller then or equal to 65535 * 1024us (802.11 time unit)");
344 auto currentStream = stream + 1;
347 return (currentStream - stream);
357 for (
const auto& sta : link.staList)
361 link.shortSlotTimeEnabled =
false;
365 link.shortSlotTimeEnabled =
true;
369 link.shortSlotTimeEnabled =
false;
380 for (
const auto& sta : link.staList)
385 link.shortPreambleEnabled =
false;
389 link.shortPreambleEnabled =
true;
393 link.shortPreambleEnabled =
false;
455 std::list<Mac48Address> addr2Set;
459 for (uint8_t linkId = 0; linkId <
GetNLinks(); linkId++)
470 NS_ASSERT_MSG(linkId,
"Station " << to <<
"is not associated, cannot send it a frame");
477 for (
const auto& addr2 : addr2Set)
542 for (
const auto& mode :
GetWifiPhy(linkId)->GetModeList())
544 uint64_t modeDataRate = mode.GetDataRate(
GetWifiPhy(linkId)->GetChannelWidth());
545 NS_LOG_DEBUG(
"Adding supported rate of " << modeDataRate);
553 NS_LOG_DEBUG(
"Adding basic mode " << mode.GetUniqueName());
572 for (
const auto& selector :
GetWifiPhy(linkId)->GetBssMembershipSelectorList())
587 return dsssParameters;
610 if (
GetLink(linkId).shortPreambleEnabled)
635 : edca->GetMinCw(linkId));
637 : edca->GetMaxCw(linkId));
639 : edca->GetAifsn(linkId));
641 : edca->GetTxopLimit(linkId);
647 : edca->GetMinCw(linkId));
649 : edca->GetMaxCw(linkId));
651 : edca->GetAifsn(linkId));
653 : edca->GetTxopLimit(linkId);
659 : edca->GetMinCw(linkId));
661 : edca->GetMaxCw(linkId));
663 : edca->GetAifsn(linkId));
665 : edca->GetTxopLimit(linkId);
671 : edca->GetMinCw(linkId));
673 : edca->GetMaxCw(linkId));
675 : edca->GetAifsn(linkId));
677 : edca->GetTxopLimit(linkId);
682 return edcaParameters;
685std::optional<MuEdcaParameterSet>
700 heConfiguration->GetAttribute(
"MuBeAifsn", uintegerValue);
702 heConfiguration->GetAttribute(
"MuBeCwMin", uintegerValue);
704 heConfiguration->GetAttribute(
"MuBeCwMax", uintegerValue);
706 heConfiguration->GetAttribute(
"BeMuEdcaTimer", timeValue);
709 heConfiguration->GetAttribute(
"MuBkAifsn", uintegerValue);
711 heConfiguration->GetAttribute(
"MuBkCwMin", uintegerValue);
713 heConfiguration->GetAttribute(
"MuBkCwMax", uintegerValue);
715 heConfiguration->GetAttribute(
"BkMuEdcaTimer", timeValue);
718 heConfiguration->GetAttribute(
"MuViAifsn", uintegerValue);
720 heConfiguration->GetAttribute(
"MuViCwMin", uintegerValue);
722 heConfiguration->GetAttribute(
"MuViCwMax", uintegerValue);
724 heConfiguration->GetAttribute(
"ViMuEdcaTimer", timeValue);
727 heConfiguration->GetAttribute(
"MuVoAifsn", uintegerValue);
729 heConfiguration->GetAttribute(
"MuVoCwMin", uintegerValue);
731 heConfiguration->GetAttribute(
"MuVoCwMax", uintegerValue);
733 heConfiguration->GetAttribute(
"VoMuEdcaTimer", timeValue);
738 auto timerNotNull = [&muEdcaParameters](uint8_t aci) {
741 auto aci = {0, 1, 2, 3};
742 if (std::all_of(aci.begin(), aci.end(), timerNotNull))
744 return muEdcaParameters;
748 "MU EDCA Timers must be all zero if the IE is not advertised.");
753std::optional<ReducedNeighborReport>
766 for (uint8_t index = 0; index <
GetNLinks(); ++index)
799 ehtConfiguration->GetAttributeFailSafe(
"EmlsrActivated", emlsrActivated) &&
800 emlsrActivated.
Get())
809 ehtConfiguration->GetAttribute(
"TransitionTimeout", time);
820 ehtConfiguration->GetAttribute(
"MediumSyncDuration", time);
824 ehtConfiguration->GetAttribute(
"MsdOfdmEdThreshold", ofdmEdThres);
825 commonInfo.SetMediumSyncOfdmEdThreshold(ofdmEdThres.
Get());
828 ehtConfiguration->GetAttribute(
"MsdMaxNTxops", maxNTxops);
829 commonInfo.SetMediumSyncMaxNTxops(maxNTxops.
Get());
842 mldCapabilities.emplace();
843 mldCapabilities->maxNSimultaneousLinks =
GetNLinks() - 1;
844 mldCapabilities->srsSupport = 0;
846 ehtConfiguration->GetAttributeFailSafe(
"TidToLinkMappingNegSupport", negSupport);
847 mldCapabilities->tidToLinkMappingSupport =
static_cast<uint8_t
>(negSupport.
Get());
848 mldCapabilities->freqSepForStrApMld = 0;
849 mldCapabilities->aarSupport = 0;
857 staMldAddress.has_value())
859 for (uint8_t i = 0; i <
GetNLinks(); i++)
862 if (
auto staAddress = remoteStationManager->GetAffiliatedStaAddress(*staMldAddress);
863 i != linkId && staAddress.has_value() &&
864 (remoteStationManager->IsWaitAssocTxOk(*staAddress) ||
865 remoteStationManager->IsAssocRefused(*staAddress)))
878 perStaProfile.SetCompleteProfile();
882 perStaProfile.SetAssocResponse(
GetAssocResp(*staAddress, i));
902 if (phy->GetChannelWidth() > 20)
907 if (
GetLink(linkId).numNonHtStations == 0)
915 uint64_t maxSupportedRate = 0;
918 uint8_t nss = (mcs.GetMcsValue() / 8) + 1;
921 mcs.GetDataRate(phy->GetChannelWidth(),
924 if (dataRate > maxSupportedRate)
926 maxSupportedRate = dataRate;
927 NS_LOG_DEBUG(
"Updating maxSupportedRate to " << maxSupportedRate);
930 uint8_t maxSpatialStream = phy->GetMaxSupportedTxSpatialStreams();
932 uint8_t nMcs = mcsList.size();
933 for (
const auto& sta :
GetLink(linkId).staList)
935 if (remoteStationManager->GetHtSupported(sta.second) ||
936 remoteStationManager->GetStationHe6GhzCapabilities(sta.second))
938 uint64_t maxSupportedRateByHtSta = 0;
939 auto itMcs = mcsList.begin();
941 j < (std::min(nMcs, remoteStationManager->GetNMcsSupported(sta.second)));
948 remoteStationManager->GetChannelWidthSupported(sta.second),
949 remoteStationManager->GetShortGuardIntervalSupported(sta.second) ? 400 : 800,
951 if (dataRate > maxSupportedRateByHtSta)
953 maxSupportedRateByHtSta = dataRate;
956 if (maxSupportedRateByHtSta < maxSupportedRate)
958 maxSupportedRate = maxSupportedRateByHtSta;
960 if (remoteStationManager->GetNMcsSupported(sta.second) < nMcs)
962 nMcs = remoteStationManager->GetNMcsSupported(sta.second);
964 if (remoteStationManager->GetNumberOfSupportedStreams(sta.second) < maxSpatialStream)
966 maxSpatialStream = remoteStationManager->GetNumberOfSupportedStreams(sta.second);
971 static_cast<uint16_t
>(maxSupportedRate / 1e6));
998 const uint16_t bssBandwidth = phy->GetChannelWidth();
1008 (bssBandwidth == 160)
1009 ? phy->GetOperatingChannel().GetPrimaryChannelNumber(80, phy->GetStandard())
1010 : phy->GetChannelNumber());
1017 uint8_t maxSpatialStream = phy->GetMaxSupportedRxSpatialStreams();
1018 for (
const auto& sta :
GetLink(linkId).staList)
1020 if (remoteStationManager->GetVhtSupported(sta.second))
1022 if (remoteStationManager->GetNumberOfSupportedStreams(sta.second) < maxSpatialStream)
1024 maxSpatialStream = remoteStationManager->GetNumberOfSupportedStreams(sta.second);
1028 for (uint8_t nss = 1; nss <= maxSpatialStream; nss++)
1047 for (
const auto& sta :
GetLink(linkId).staList)
1049 if (remoteStationManager->GetHeSupported(sta.second))
1051 if (remoteStationManager->GetNumberOfSupportedStreams(sta.second) < maxSpatialStream)
1053 maxSpatialStream = remoteStationManager->GetNumberOfSupportedStreams(sta.second);
1057 for (uint8_t nss = 1; nss <= maxSpatialStream; nss++)
1068 const auto bw = phy->GetChannelWidth();
1069 const auto ch = phy->GetOperatingChannel();
1070 op6Ghz.
m_chWid = (bw == 20) ? 0 : (bw == 40) ? 1 : (bw == 80) ? 2 : 3;
1092 for (
const auto& sta :
GetLink(linkId).staList)
1094 if (remoteStationManager->GetEhtSupported(sta.second))
1096 if (remoteStationManager->GetNumberOfSupportedStreams(sta.second) < maxSpatialStream)
1098 maxSpatialStream = remoteStationManager->GetNumberOfSupportedStreams(sta.second);
1127 GetLink(linkId).shortPreambleEnabled);
1129 GetLink(linkId).shortSlotTimeEnabled);
1196 packet->AddHeader(probe);
1225 if (remoteStationManager->IsWaitAssocTxOk(to))
1231 NS_ABORT_IF(!remoteStationManager->IsAssocRefused(to));
1233 remoteStationManager->RecordDisassociated(to);
1291 linkIdStaAddrMap[linkId] = to;
1298 "Sending a Multi-Link Element to a single link device");
1299 for (std::size_t idx = 0; idx < mle->GetNPerStaProfileSubelements(); idx++)
1301 auto& perStaProfile = mle->GetPerStaProfile(idx);
1302 if (perStaProfile.HasAssocResponse() &&
1303 perStaProfile.GetAssocResponse().GetStatusCode().IsSuccess())
1305 uint8_t otherLinkId = perStaProfile.GetLinkId();
1307 ->GetAffiliatedStaAddress(*staMldAddress);
1309 "No STA to associate with on link " << +otherLinkId);
1310 const auto [it, inserted] = linkIdStaAddrMap.insert({otherLinkId, *staAddress});
1312 "More than one Association Response to MLD "
1313 << *staMldAddress <<
" on link ID " << +otherLinkId);
1318 return linkIdStaAddrMap;
1324 if (linkIdStaAddrMap.empty())
1331 std::set<uint16_t> aids;
1332 std::map<uint8_t , uint16_t > linkIdAidMap;
1334 for (
const auto& [
id, staAddr] : linkIdStaAddrMap)
1336 for (
const auto& [aid, addr] :
GetLink(
id).staList)
1338 if (addr == staAddr)
1341 linkIdAidMap[id] = aid;
1349 while (!aids.empty())
1351 const uint16_t aid = *aids.begin();
1354 for (
const auto& [
id, staAddr] : linkIdStaAddrMap)
1356 if (
auto it =
GetLink(
id).staList.find(aid);
1357 it !=
GetLink(
id).staList.end() && it->second != staAddr)
1361 aids.erase(aids.begin());
1379 aid = *aids.begin();
1383 std::list<uint8_t> linkIds;
1384 std::transform(linkIdStaAddrMap.cbegin(),
1385 linkIdStaAddrMap.cend(),
1386 std::back_inserter(linkIds),
1387 [](
auto&& linkIdStaAddrPair) { return linkIdStaAddrPair.first; });
1392 const auto& [linkId, staAddr] = *linkIdStaAddrMap.cbegin();
1396 for (
const auto& [
id, staAddr] : linkIdStaAddrMap)
1401 if (
auto it = linkIdAidMap.find(
id); it == linkIdAidMap.end() || it->second != aid)
1404 link.staList.insert(std::make_pair(aid, staAddr));
1406 remoteStationManager->SetAssociationId(staAddr, aid);
1408 if (it == linkIdAidMap.end())
1411 if (remoteStationManager->GetDsssSupported(staAddr) &&
1412 !remoteStationManager->GetErpOfdmSupported(staAddr))
1414 link.numNonErpStations++;
1416 if (!remoteStationManager->GetHtSupported(staAddr) &&
1417 !remoteStationManager->GetStationHe6GhzCapabilities(staAddr))
1419 link.numNonHtStations++;
1427 link.staList.erase(it->second);
1443 for (std::size_t idx = 0; idx < mle->GetNPerStaProfileSubelements(); idx++)
1445 if (
const auto& perStaProfile = mle->GetPerStaProfile(idx);
1446 perStaProfile.HasAssocResponse() &&
1447 perStaProfile.GetAssocResponse().GetStatusCode().IsSuccess())
1449 perStaProfile.GetAssocResponse().SetAssociationId(aid);
1482 SetAid(assoc, linkIdStaAddrMap);
1485 packet->AddHeader(assoc);
1516 hdr.
SetAddr2(link.feManager->GetAddress());
1517 hdr.
SetAddr3(link.feManager->GetAddress());
1595 packet->AddHeader(beacon);
1597 NS_LOG_INFO(
"Generating beacon from " << link.feManager->GetAddress() <<
" linkID " << +linkId);
1610 if (link.shortSlotTimeEnabled)
1629 hdr.
SetAddr2(link.feManager->GetAddress());
1630 hdr.
SetAddr3(link.feManager->GetAddress());
1644 fils.
m_fdCap->SetOpChannelWidth(link.phy->GetChannelWidth());
1645 fils.
m_fdCap->SetMaxNss(std::min(link.phy->GetMaxSupportedTxSpatialStreams(),
1646 link.phy->GetMaxSupportedRxSpatialStreams()));
1647 fils.
m_fdCap->SetStandard(link.phy->GetStandard());
1652 auto packet = Create<Packet>();
1653 packet->AddHeader(fils);
1654 packet->AddHeader(actionHdr);
1656 return Create<WifiMpdu>(packet, hdr);
1668 if (!fdBeaconInterval.IsStrictlyPositive())
1670 NS_LOG_DEBUG(
"Sending FILS Discovery/unsolicited Probe Response disabled");
1675 for (uint8_t count = 1; count < (
m_beaconInterval / fdBeaconInterval).GetHigh(); ++count)
1710 if (
auto staMldAddress =
1712 staMldAddress.has_value())
1725 for (uint8_t i = 0; i <
GetNLinks(); i++)
1728 if (
auto staAddress = stationManager->GetAffiliatedStaAddress(*staMldAddress);
1729 staAddress.has_value() && i != *linkId &&
1730 stationManager->IsWaitAssocTxOk(*staAddress))
1733 <<
" associated with STA=" << *staAddress);
1734 stationManager->RecordGotAssocTxOk(*staAddress);
1747 action.protectedEhtAction ==
1757 eventIt->second.PeekEventImpl()->Invoke();
1758 eventIt->second.Cancel();
1778 <<
" association failed with STA=" << hdr.
GetAddr1());
1782 if (
auto staMldAddress =
1784 staMldAddress.has_value())
1787 for (uint8_t i = 0; i <
GetNLinks(); i++)
1790 if (
auto staAddress = stationManager->GetAffiliatedStaAddress(*staMldAddress);
1791 staAddress.has_value() && i != *linkId &&
1792 stationManager->IsWaitAssocTxOk(*staAddress))
1795 <<
" association failed with STA=" << *staAddress);
1796 stationManager->RecordGotAssocTxFailed(*staAddress);
1811 if (!staInPsMode && mpdu->GetHeader().IsPowerManagement())
1816 else if (staInPsMode && !mpdu->GetHeader().IsPowerManagement())
1831 NS_LOG_DEBUG(
"Block destination " << staAddr <<
" on link " << +linkId);
1846 NS_LOG_DEBUG(
"Unblock destination " << staAddr <<
" on link " << +linkId);
1853std::optional<uint8_t>
1856 for (uint8_t linkId = 0; linkId <
GetNLinks(); linkId++)
1864 return std::nullopt;
1875std::optional<Mac48Address>
1881 return staIt->second;
1883 return std::nullopt;
1891 const WifiMacHeader* hdr = &mpdu->GetOriginal()->GetHeader();
1896 std::optional<uint8_t> apLinkId;
1898 (apLinkId =
IsAssociated(mpdu->GetHeader().GetAddr2())) &&
1917 <<
", size=" << packet->GetSize());
1933 NS_LOG_DEBUG(
"forwarding frame from=" << from <<
", to=" << to);
1970 else if (hdr->
IsMgt())
1993 packet->PeekHeader(probeRequestHeader);
1994 const auto& ssid = probeRequestHeader.Get<
Ssid>();
1995 if (ssid ==
GetSsid() || ssid->IsBroadcast())
1997 NS_LOG_DEBUG(
"Probe request received from " << from <<
": send probe response");
2009 <<
" request received from " << from
2010 << ((
GetNLinks() > 1) ?
" on link ID " + std::to_string(linkId) :
""));
2017 packet->PeekHeader(assocReq);
2021 packet->PeekHeader(reassocReq);
2035 for (
auto it = staList.begin(); it != staList.end(); ++it)
2037 if (it->second == from)
2061 auto pkt = mpdu->GetPacket()->Copy();
2064 action.protectedEhtAction ==
2070 pkt->RemoveHeader(frame);
2097 auto failure = [&](
const std::string& msg) ->
bool {
2098 NS_LOG_DEBUG(
"Association Request from " << from <<
" refused: " << msg);
2099 remoteStationManager->RecordAssocRefused(from);
2104 auto recvAssocRequest = [&](
auto&& frameRefWrapper) ->
bool {
2105 const auto& frame = frameRefWrapper.get();
2110 remoteStationManager->AddSupportedPhyPreamble(from, capabilities.
IsShortPreamble());
2111 NS_ASSERT(frame.template Get<SupportedRates>());
2113 frame.template Get<ExtendedSupportedRatesIE>()};
2115 if (rates.GetNRates() == 0)
2117 return failure(
"STA's supported rate set not compatible with our Basic Rate set");
2123 const auto& htCapabilities = frame.template Get<HtCapabilities>();
2124 if (htCapabilities.has_value() && htCapabilities->IsSupportedMcs(0))
2126 for (uint8_t i = 0; i < remoteStationManager->GetNBasicMcs(); i++)
2128 WifiMode mcs = remoteStationManager->GetBasicMcs(i);
2129 if (!htCapabilities->IsSupportedMcs(mcs.
GetMcsValue()))
2131 return failure(
"HT STA does not support all MCSs in Basic MCS Set");
2139 const auto& vhtCapabilities = frame.template Get<VhtCapabilities>();
2140 if (vhtCapabilities.has_value() && vhtCapabilities->GetVhtCapabilitiesInfo() != 0)
2142 for (uint8_t i = 0; i < remoteStationManager->GetNBasicMcs(); i++)
2144 WifiMode mcs = remoteStationManager->GetBasicMcs(i);
2145 if (!vhtCapabilities->IsSupportedTxMcs(mcs.
GetMcsValue()))
2147 return failure(
"VHT STA does not support all MCSs in Basic MCS Set");
2155 const auto& heCapabilities = frame.template Get<HeCapabilities>();
2156 if (heCapabilities.has_value() && heCapabilities->GetSupportedMcsAndNss() != 0)
2158 for (uint8_t i = 0; i < remoteStationManager->GetNBasicMcs(); i++)
2160 WifiMode mcs = remoteStationManager->GetBasicMcs(i);
2161 if (!heCapabilities->IsSupportedTxMcs(mcs.
GetMcsValue()))
2163 return failure(
"HE STA does not support all MCSs in Basic MCS Set");
2169 if (
const auto& he6GhzCapabilities = frame.template Get<He6GhzBandCapabilities>())
2171 remoteStationManager->AddStationHe6GhzCapabilities(from, *he6GhzCapabilities);
2181 if (
const auto& tidLinkMapping = frame.template Get<TidToLinkMapping>();
2182 !tidLinkMapping.empty())
2190 if (tidLinkMapping.size() > 2)
2192 return failure(
"More than two TID-to-Link Mapping IEs");
2197 bool bothDirIfOneTlm =
2198 tidLinkMapping.size() != 1 ||
2205 bool distinctDirsIfTwoTlms =
2206 tidLinkMapping.size() != 2 ||
2209 tidLinkMapping[0].m_control.direction !=
2210 tidLinkMapping[1].m_control.direction);
2212 if (!bothDirIfOneTlm || !distinctDirsIfTwoTlms)
2214 return failure(
"Incorrect directions in TID-to-Link Mapping IEs");
2218 ehtConfig->GetAttributeFailSafe(
"TidToLinkMappingNegSupport", negSupport);
2222 return failure(
"TID-to-Link Mapping negotiation not supported");
2230 for (uint8_t tid = 0; tid < 8; tid++)
2234 mapping.emplace(tid, std::move(linkSet));
2242 switch (tidLinkMapping[0].m_control.direction)
2245 getMapping(tidLinkMapping.at(0), dlMapping);
2246 ulMapping = dlMapping;
2249 getMapping(tidLinkMapping.at(0), dlMapping);
2250 getMapping(tidLinkMapping.at(1), ulMapping);
2253 getMapping(tidLinkMapping.at(0), ulMapping);
2254 getMapping(tidLinkMapping.at(1), dlMapping);
2261 return failure(
"Mapping TIDs to distinct link sets is incompatible with "
2262 "negotiation support of 1");
2266 const auto& mle = frame.template Get<MultiLinkElement>();
2268 "Multi-Link Element not present in an Association Request including "
2269 "TID-to-Link Mapping element(s)");
2270 auto mldAddr = mle->GetMldMacAddress();
2282 for (
const auto& mode : phy->GetModeList())
2284 if (rates.IsSupportedRate(mode.GetDataRate(phy->GetChannelWidth())))
2286 remoteStationManager->AddSupportedMode(from, mode);
2289 if (
GetErpSupported(linkId) && remoteStationManager->GetErpOfdmSupported(from) &&
2292 remoteStationManager->AddSupportedErpSlotTime(from,
true);
2296 const auto& htCapabilities = frame.template Get<HtCapabilities>();
2297 if (htCapabilities.has_value() && htCapabilities->IsSupportedMcs(0))
2299 remoteStationManager->AddStationHtCapabilities(from, *htCapabilities);
2306 const auto& vhtCapabilities = frame.template Get<VhtCapabilities>();
2309 if (vhtCapabilities.has_value() &&
2310 vhtCapabilities->GetRxHighestSupportedLgiDataRate() > 0)
2312 remoteStationManager->AddStationVhtCapabilities(from, *vhtCapabilities);
2315 if (vhtCapabilities->IsSupportedTxMcs(mcs.GetMcsValue()))
2317 remoteStationManager->AddSupportedMcs(from, mcs);
2325 const auto& heCapabilities = frame.template Get<HeCapabilities>();
2326 if (heCapabilities.has_value() && heCapabilities->GetSupportedMcsAndNss() != 0)
2328 remoteStationManager->AddStationHeCapabilities(from, *heCapabilities);
2331 if (heCapabilities->IsSupportedTxMcs(mcs.GetMcsValue()))
2333 remoteStationManager->AddSupportedMcs(from, mcs);
2341 if (
const auto& ehtCapabilities = frame.template Get<EhtCapabilities>())
2343 remoteStationManager->AddStationEhtCapabilities(from, *ehtCapabilities);
2348 remoteStationManager->AddSupportedMcs(from, mcs);
2353 NS_LOG_DEBUG(
"Association Request from " << from <<
" accepted");
2354 remoteStationManager->RecordWaitAssocTxOk(from);
2358 return std::visit(recvAssocRequest, assoc);
2367 auto recvMle = [&](
auto&& frame) {
2368 const auto& mle = frame.get().template Get<MultiLinkElement>();
2370 if (!mle.has_value())
2375 auto mleCommonInfo = std::make_shared<CommonInfoBasicMle>(mle->GetCommonInfoBasic());
2378 for (std::size_t i = 0; i < mle->GetNPerStaProfileSubelements(); i++)
2380 auto& perStaProfile = mle->GetPerStaProfile(i);
2381 if (!perStaProfile.HasStaMacAddress())
2384 <<
"] Cannot setup a link if the STA MAC address is missing");
2387 uint8_t newLinkId = perStaProfile.GetLinkId();
2388 if (newLinkId == linkId || newLinkId >=
GetNLinks())
2390 NS_LOG_DEBUG(
"[i=" << i <<
"] Link ID " << newLinkId <<
" not valid");
2393 if (!perStaProfile.HasAssocRequest() && !perStaProfile.HasReassocRequest())
2395 NS_LOG_DEBUG(
"[i=" << i <<
"] No (Re)Association Request frame body present");
2400 perStaProfile.GetStaMacAddress(),
2403 perStaProfile.GetStaMacAddress(),
2408 std::visit(recvMle, assoc);
2419 !ehtConfiguration ||
2420 !ehtConfiguration->GetAttributeFailSafe(
"EmlsrActivated", emlsrActivated) ||
2421 !emlsrActivated.
Get())
2424 "Received an EML Operating Mode Notification frame but EMLSR is not activated");
2431 auto emlCapabilities =
2433 NS_ASSERT_MSG(emlCapabilities,
"EML Capabilities not stored for STA " << sender);
2437 emlCapabilities->get().emlsrTransitionDelay = frame.
m_emlsrParamUpdate->transitionDelay;
2441 NS_ASSERT_MSG(mldAddress,
"No MLD address stored for STA " << sender);
2452 NS_ASSERT_MSG(psduMap.size() == 1 && psduMap.begin()->second->GetNMpdus() == 1 &&
2453 psduMap.begin()->second->GetHeader(0).IsAck(),
2454 "Expected a Normal Ack after EML Notification frame");
2460 ehtConfiguration->GetAttribute(
"TransitionTimeout", transitionTimeout);
2464 for (uint8_t id = 0; id < GetNLinks(); id++)
2467 GetWifiRemoteStationManager(id)->GetAffiliatedStaAddress(*mldAddress);
2474 if (!emlsrLinks.empty())
2488 auto enabled = std::find(emlsrLinks.cbegin(), emlsrLinks.cend(), id) !=
2492 StaSwitchingToActiveModeOrDeassociated(*linkAddress, id);
2494 GetWifiRemoteStationManager(id)->SetEmlsrEnabled(*linkAddress, enabled);
2512 GetWifiRemoteStationManager(id)->GetEmlsrEnabled(*linkAddress))
2514 StaSwitchingToPsMode(*linkAddress, id);
2516 GetWifiRemoteStationManager(id)->SetEmlsrEnabled(*linkAddress, false);
2525 phy->TraceConnectWithoutContext(
"PhyTxPsduBegin", cb);
2527 [=]() { phy->TraceDisconnectWithoutContext(
"PhyTxPsduBegin", cb); });
2535 frame.m_emlControl.emlsrParamUpdateCtrl = 0;
2543 frame.m_emlsrParamUpdate.reset();
2546 ehtFem->SendEmlOmn(sender, frame);
2555 auto from = i.second.GetSourceAddr();
2556 auto to = i.second.GetDestinationAddr();
2560 NS_LOG_DEBUG(
"forwarding QoS frame from=" << from <<
", to=" << to);
2561 ForwardDown(i.first->Copy(), from, to, mpdu->GetHeader().GetQosTid());
2574 for (uint8_t linkId = 0; linkId <
GetNLinks(); ++linkId)
2584 NS_LOG_DEBUG(
"Scheduling initial beacon for access point "
2585 <<
GetAddress() <<
" at time " << jitterUs <<
"us");
2606 return useProtection;
2613 for (uint16_t nextAid = 1; nextAid <= 2007; nextAid++)
2615 if (std::all_of(linkIds.begin(), linkIds.end(), [&](
auto&& linkId) {
2616 auto& staList = GetLink(linkId).staList;
2617 return !staList.contains(nextAid);
2627const std::map<uint16_t, Mac48Address>&
2647 return it->second.value;
2667 uint8_t maxSize = 0;
2670 for (uint8_t tid = 0; tid < 8; tid++)
2675 maxSize = std::max(maxSize, size);
void SendAssocResp(Mac48Address to, bool isReassoc, uint8_t linkId)
Forward an association or a reassociation response packet to the DCF/EDCA.
uint16_t GetAssociationId(Mac48Address addr, uint8_t linkId) const
std::unique_ptr< LinkEntity > CreateLinkEntity() const override
Create a LinkEntity object.
Ptr< Txop > m_beaconTxop
Dedicated Txop for beacons.
void SetBeaconGeneration(bool enable)
Enable or disable beacon generation of the AP.
void ParseReportedStaInfo(const AssocReqRefVariant &assoc, Mac48Address from, uint8_t linkId)
Given a (Re)Association Request frame body containing a Multi-Link Element, check if a link can be se...
void UpdateShortSlotTimeEnabled(uint8_t linkId)
Update whether short slot time should be enabled or not in the BSS corresponding to the given link.
void DoCompleteConfig() override
Allow subclasses to complete the configuration of the MAC layer components.
const std::map< uint16_t, Mac48Address > & GetStaList(uint8_t linkId) const
Get a const reference to the map of associated stations on the given link.
void DoDispose() override
Destructor implementation.
void SetBeaconInterval(Time interval)
bool ReceiveAssocRequest(const AssocReqRefVariant &assoc, const Mac48Address &from, uint8_t linkId)
Check whether the supported rate set included in the received (Re)Association Request frame is compat...
std::map< uint8_t, Mac48Address > LinkIdStaAddrMap
Map of (link ID, remote STA address) of the links to setup.
std::map< Mac48Address, EventId > m_transitionTimeoutEvents
transition timeout events running for EMLSR clients
UintAccessParamsMap m_cwMaxsForSta
Per-AC CW max values to advertise to stations.
void ScheduleFilsDiscOrUnsolProbeRespFrames(uint8_t linkId)
Schedule the transmission of FILS Discovery frames or unsolicited Probe Response frames on the given ...
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...
CapabilityInformation GetCapabilities(uint8_t linkId) const
Return the Capability information of the current AP for the given link.
Ptr< UniformRandomVariable > m_beaconJitter
UniformRandomVariable used to randomize the time of the first beacon.
bool CanForwardPacketsTo(Mac48Address to) const override
Return true if packets can be forwarded to the given destination, false otherwise.
bool m_enableNonErpProtection
Flag whether protection mechanism is used or not when non-ERP STAs are present within the BSS.
EdcaParameterSet GetEdcaParameterSet(uint8_t linkId) const
Return the EDCA Parameter Set of the current AP for the given link.
void StaSwitchingToActiveModeOrDeassociated(const Mac48Address &staAddr, uint8_t linkId)
Perform the necessary actions when a given station deassociates or switches from powersave mode to ac...
MultiLinkElement GetMultiLinkElement(uint8_t linkId, WifiMacType frameType, const Mac48Address &to=Mac48Address::GetBroadcast())
Return the Multi-Link Element that the current AP includes in the management frames of the given type...
HtOperation GetHtOperation(uint8_t linkId) const
Return the HT operation of the current AP for the given link.
std::optional< Mac48Address > GetMldOrLinkAddressByAid(uint16_t aid) const
void UpdateShortPreambleEnabled(uint8_t linkId)
Update whether short preamble should be enabled or not in the BSS corresponding to the given link.
void TxOk(Ptr< const WifiMpdu > mpdu)
The packet we sent was successfully received by the receiver (i.e.
Time m_fdBeaconIntervalNon6GHz
Time elapsing between a beacon and FILS Discovery (FD) frame or between two FD frames on 2....
std::map< uint16_t, Mac48Address > m_aidToMldOrLinkAddress
Maps AIDs to MLD addresses (for MLDs) or link addresses (in case of single link devices)
TracedCallback< uint16_t, Mac48Address > m_deAssocLogger
deassociation logger
LinkIdStaAddrMap GetLinkIdStaAddrMap(MgtAssocResponseHeader &assoc, const Mac48Address &to, uint8_t linkId)
Get a map of (link ID, remote STA address) of the links to setup.
void SetAid(MgtAssocResponseHeader &assoc, const LinkIdStaAddrMap &linkIdStaAddrMap)
Set the AID field of the given Association Response frame.
static Ptr< const AttributeChecker > GetTimeAccessParamsChecker()
Get a checker for the TxopLimitsForSta attribute, which can be used to deserialize an ACI-indexed map...
bool m_enableBeaconGeneration
Flag whether beacons are being generated.
Time m_beaconInterval
Beacon interval.
uint16_t GetNextAssociationId(std::list< uint8_t > linkIds)
bool m_enableBeaconJitter
Flag whether the first beacon should be generated at random time.
std::unordered_map< WifiAddressTidPair, BsrType, WifiAddressTidHash > m_bufferStatus
Per (MAC address, TID) buffer status reports.
void SendProbeResp(Mac48Address to, uint8_t linkId)
Send a Probe Response in response to a Probe Request received from the STA with the given address on ...
DsssParameterSet GetDsssParameterSet(uint8_t linkId) const
Return the DSSS Parameter Set that we support on the given link.
TracedCallback< uint16_t, Mac48Address > m_assocLogger
association logger
Time GetBeaconInterval() const
static TypeId GetTypeId()
Get the type ID.
std::optional< ReducedNeighborReport > GetReducedNeighborReport(uint8_t linkId) const
Return the Reduced Neighbor Report (RNR) element that the current AP sends on the given link,...
void ReceiveEmlOmn(MgtEmlOmn &frame, const Mac48Address &sender, uint8_t linkId)
Take necessary actions upon receiving the given EML Operating Mode Notification frame from the given ...
void Enqueue(Ptr< Packet > packet, Mac48Address to) override
Time m_fdBeaconInterval6GHz
Time elapsing between a beacon and FILS Discovery (FD) frame or between two FD frames on 6GHz links.
uint8_t GetMaxBufferStatus(Mac48Address address) const
Return the maximum among the values of the Queue Size subfield of the last QoS Data or QoS Null frame...
Time m_bsrLifetime
Lifetime of Buffer Status Reports.
ApLinkEntity & GetLink(uint8_t linkId) const
Get a reference to the link associated with the given ID.
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...
uint8_t GetBufferStatus(uint8_t tid, Mac48Address address) const
Return the value of the Queue Size subfield of the last QoS Data or QoS Null frame received from the ...
EhtOperation GetEhtOperation(uint8_t linkId) const
Return the EHT operation of the current AP for the given link.
bool m_sendUnsolProbeResp
send unsolicited Probe Response instead of FILS Discovery
ErpInformation GetErpInformation(uint8_t linkId) const
Return the ERP information of the current AP for the given link.
void SetLinkUpCallback(Callback< void > linkUp) override
VhtOperation GetVhtOperation(uint8_t linkId) const
Return the VHT operation of the current AP for the given link.
void TxFailed(WifiMacDropReason timeoutReason, Ptr< const WifiMpdu > mpdu)
The packet we sent was successfully received by the receiver (i.e.
HeOperation GetHeOperation(uint8_t linkId) const
Return the HE operation of the current AP for the given link.
void SetBufferStatus(uint8_t tid, Mac48Address address, uint8_t size)
Store the value of the Queue Size subfield of the last QoS Data or QoS Null frame received from the s...
TimeAccessParamsMap m_txopLimitsForSta
Per-AC TXOP limits values to advertise to stations.
int64_t AssignStreams(int64_t stream) override
Assign a fixed random variable stream number to the random variables used by this model.
std::optional< MuEdcaParameterSet > GetMuEdcaParameterSet() const
Return the MU EDCA Parameter Set of the current AP, if one needs to be advertised.
void ProcessPowerManagementFlag(Ptr< const WifiMpdu > mpdu, uint8_t linkId)
Process the Power Management bit in the Frame Control field of an MPDU successfully received on the g...
void DeaggregateAmsduAndForward(Ptr< const WifiMpdu > mpdu) override
This method is called to de-aggregate an A-MSDU and forward the constituent packets up the stack.
bool SupportsSendFrom() const override
MgtAssocResponseHeader GetAssocResp(Mac48Address to, uint8_t linkId)
Get the Association Response frame to send on a given link.
void ForwardDown(Ptr< Packet > packet, Mac48Address from, Mac48Address to)
Forward the packet down to DCF/EDCAF (enqueue the packet).
Ptr< WifiMpdu > GetFilsDiscovery(uint8_t linkId) const
Get the FILS Discovery frame to send on the given link.
static Ptr< const AttributeChecker > GetUintAccessParamsChecker()
Get a checker for the CwMinsForSta, CwMaxsForSta and AifsnsForSta attributes, which can be used to de...
void DoInitialize() override
Initialize() implementation.
std::optional< uint8_t > IsAssociated(const Mac48Address &address) const
Get the ID of a link (if any) that has been setup with the station having the given MAC address.
void SendOneBeacon(uint8_t linkId)
Forward a beacon packet to the beacon special DCF for transmission on the given link.
Ptr< WifiMacQueue > GetTxopQueue(AcIndex ac) const override
Get the wifi MAC queue of the (Qos)Txop associated with the given AC, if such (Qos)Txop is installed,...
bool GetUseNonErpProtection(uint8_t linkId) const
Return whether protection for non-ERP stations is used in the BSS corresponding to the given link.
UintAccessParamsMap m_cwMinsForSta
Per-AC CW min values to advertise to stations.
UintAccessParamsMap m_aifsnsForSta
Per-AC AIFS values to advertise to stations.
void StaSwitchingToPsMode(const Mac48Address &staAddr, uint8_t linkId)
Perform the necessary actions when a given station switches from active mode to powersave mode.
AllSupportedRates GetSupportedRates(uint8_t linkId) const
Return an instance of SupportedRates that contains all rates that we support for the given link (incl...
A container for one type of attribute.
AttributeValue implementation for Boolean.
Base class for Callback class.
void Add(Ptr< Txop > txop)
void SetCurrentChannel(uint8_t currentChannel)
Set the Current Channel field in the DsssParameterSet information element.
void SetViTxopLimit(uint16_t txop)
Set the AC_VI TXOP Limit field in the EdcaParameterSet information element.
void SetViAifsn(uint8_t aifsn)
Set the AC_VI AIFSN field in the EdcaParameterSet information element.
void SetVoAci(uint8_t aci)
Set the AC_VO ACI field in the EdcaParameterSet information element.
void SetVoCWmax(uint32_t cwMax)
Set the AC_VO CWmax field in the EdcaParameterSet information element.
void SetViCWmin(uint32_t cwMin)
Set the AC_VI CWmin field in the EdcaParameterSet information element.
void SetVoTxopLimit(uint16_t txop)
Set the AC_VO TXOP Limit field in the EdcaParameterSet information element.
void SetVoAifsn(uint8_t aifsn)
Set the AC_VO AIFSN field in the EdcaParameterSet information element.
void SetQosInfo(uint8_t qosInfo)
Set the QoS Info field in the EdcaParameterSet information element.
void SetBkCWmin(uint32_t cwMin)
Set the AC_BK CWmin field in the EdcaParameterSet information element.
void SetViAci(uint8_t aci)
Set the AC_VI ACI field in the EdcaParameterSet information element.
void SetViCWmax(uint32_t cwMax)
Set the AC_VI CWmax field in the EdcaParameterSet information element.
void SetVoCWmin(uint32_t cwMin)
Set the AC_VO CWmin field in the EdcaParameterSet information element.
void SetBeTxopLimit(uint16_t txop)
Set the AC_BE TXOP Limit field in the EdcaParameterSet information element.
void SetBeCWmax(uint32_t cwMax)
Set the AC_BE CWmax field in the EdcaParameterSet information element.
void SetBeAci(uint8_t aci)
Set the AC_BE ACI field in the EdcaParameterSet information element.
void SetBkCWmax(uint32_t cwMax)
Set the AC_BK CWmax field in the EdcaParameterSet information element.
void SetBkTxopLimit(uint16_t txop)
Set the AC_BK TXOP Limit field in the EdcaParameterSet information element.
void SetBkAifsn(uint8_t aifsn)
Set the AC_BK AIFSN field in the EdcaParameterSet information element.
void SetBeCWmin(uint32_t cwMin)
Set the AC_BE CWmin field in the EdcaParameterSet information element.
void SetBkAci(uint8_t aci)
Set the AC_BK ACI field in the EdcaParameterSet information element.
void SetBeAifsn(uint8_t aifsn)
Set the AC_BE AIFSN field in the EdcaParameterSet information element.
The IEEE 802.11be EHT Capabilities.
EHT Operation Information Element.
void SetMaxTxNss(uint8_t maxNss, uint8_t mcsStart, uint8_t mcsEnd)
Set the max Tx NSS for input MCS index range.
void SetMaxRxNss(uint8_t maxNss, uint8_t mcsStart, uint8_t mcsEnd)
Set the max Rx NSS for input MCS index range.
Hold variables of type enum.
void Cancel()
This method is syntactic sugar for the ns3::Simulator::Cancel 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 HE Operation Information Element.
OptFieldWithPresenceInd< OpInfo6GHz > m_6GHzOpInfo
6 GHz Operation Information field
void SetMaxHeMcsPerNss(uint8_t nss, uint8_t maxHeMcs)
Set the Basic HE-MCS and NSS field in the HE Operation information element by specifying the pair (ns...
BssColorInfo m_bssColorInfo
BSS Color Information field.
The HT Capabilities Information Element.
The HT Operation Information Element.
void SetObssNonHtStasPresent(uint8_t obssNonHtStasPresent)
Set the OBSS non HT STAs present.
void SetRifsMode(uint8_t rifsMode)
Set the RIFS mode.
void SetSecondaryChannelOffset(uint8_t secondaryChannelOffset)
Set the secondary channel offset.
void SetPcoActive(uint8_t pcoActive)
Set the PCO active.
void SetTxUnequalModulation(uint8_t txUnequalModulation)
Set the transmit unequal modulation.
void SetHtProtection(uint8_t htProtection)
Set the HT protection.
void SetTxMaxNSpatialStreams(uint8_t maxTxSpatialStreams)
Set the transmit maximum number spatial streams.
void SetTxRxMcsSetUnequal(uint8_t txRxMcsSetUnequal)
Set the transmit / receive MCS set unequal.
void SetDualBeacon(uint8_t dualBeacon)
Set the dual beacon.
void SetNonGfHtStasPresent(uint8_t nonGfHtStasPresent)
Set the non GF HT STAs present.
void SetTxMcsSetDefined(uint8_t txMcsSetDefined)
Set the transmit MCS set defined.
void SetLSigTxopProtectionFullSupport(uint8_t lSigTxopProtectionFullSupport)
Set the LSIG TXOP protection full support.
void SetStaChannelWidth(uint8_t staChannelWidth)
Set the STA channel width.
void SetRxHighestSupportedDataRate(uint16_t maxSupportedRate)
Set the receive highest supported data rate.
void SetRxMcsBitmask(uint8_t index)
Set the receive MCS bitmask.
void SetPrimaryChannel(uint8_t ctrl)
Set the Primary Channel field in the HT Operation information element.
void SetDualCtsProtection(uint8_t dualCtsProtection)
Set the dual CTS protection.
void SetPhase(uint8_t pcoPhase)
Set the PCO phase.
void SetStbcBeacon(uint8_t stbcBeacon)
Set the STBC beacon.
Hold a signed integer type.
static Mac48Address GetBroadcast()
Implement the header for Action frames of type EML Operating Mode Notification.
EmlControl m_emlControl
EML Control field.
std::optional< EmlsrParamUpdate > m_emlsrParamUpdate
EMLSR Parameter Update field.
std::list< uint8_t > GetLinkBitmap() const
The MU EDCA Parameter Set.
void SetMuCwMin(uint8_t aci, uint16_t cwMin)
Set the ECWmin subfield of the ECWmin/ECWmax field in the MU AC Parameter Record field corresponding ...
void SetMuEdcaTimer(uint8_t aci, Time timer)
Set the MU EDCA Timer field in the MU AC Parameter Record field corresponding to the given AC Index (...
void SetMuAifsn(uint8_t aci, uint8_t aifsn)
Set the AIFSN subfield of the ACI/AIFSN field in the MU AC Parameter Record field corresponding to th...
void SetQosInfo(uint8_t qosInfo)
Set the QoS Info field in the MuEdcaParameterSet information element.
Time GetMuEdcaTimer(uint8_t aci) const
Get the MU EDCA Timer value encoded in the MU AC Parameter Record field corresponding to the given AC...
void SetMuCwMax(uint8_t aci, uint16_t cwMax)
Set the ECWmax subfield of the ECWmin/ECWmax field in the MU AC Parameter Record field corresponding ...
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...
void SetBssParamsChangeCount(uint8_t count)
Set the BSS Parameters Change Count subfield in the Common Info field.
void SetLinkIdInfo(uint8_t linkIdInfo)
Set the Link ID Info subfield in the Common Info field.
CommonInfoBasicMle & GetCommonInfoBasic()
PerStaProfileSubelement & GetPerStaProfile(std::size_t i)
Get a reference to the i-th Per-STA Profile Subelement in the Link Info field.
void SetMldMacAddress(Mac48Address address)
Set the MLD MAC Address subfield in the Common Info field.
void SetTransitionTimeout(Time timeout)
Set the Transition Timeout subfield of the EML Capabilities 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.
void Initialize()
Invoke DoInitialize on all Objects aggregated to this one.
void Dispose()
Dispose of this Object.
Smart pointer class similar to boost::intrusive_ptr.
void SetStream(int64_t stream)
Specifies the stream number for the RngStream.
The Reduced Neighbor Report element.
std::size_t GetNNbrApInfoFields() const
Get the number of Neighbor AP Information fields.
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...
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.
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...
void AddNbrApInfoField()
Add a Neighbor AP Information field.
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 AddTbttInformationField(std::size_t nbrApInfoId)
Add a TBTT Information fields to the TBTT Information Set field of the given Neighbor AP Information ...
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...
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.
The IEEE 802.11 SSID Information Element.
Status code for association response.
bool IsSuccess() const
Return whether the status code is success.
void SetFailure()
Set success bit to 1 (failure).
void SetSuccess()
Set success bit to 0 (success).
Hold variables of type string.
The Supported Rates Information Element.
TID-to-Link Mapping Information Element.
std::set< uint8_t > GetLinkMappingOfTid(uint8_t tid) const
Get the Link Mapping field of the given TID.
TidToLinkMapping::Control m_control
TID-to-link Mapping Control.
Simulation virtual time values and global simulation resolution.
bool IsZero() const
Exactly equivalent to t == 0.
int64_t GetMicroSeconds() const
Get an approximation of the time stored in this instance in the indicated unit.
AttributeValue implementation for Time.
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model.
void SetMaxCws(const std::vector< uint32_t > &maxCws)
Set the maximum contention window size for each link.
void SetAifsns(const std::vector< uint8_t > &aifsns)
Set the number of slots that make up an AIFS for each link.
Ptr< WifiMacQueue > GetWifiMacQueue() const
Return the packet queue associated with this Txop.
virtual void SetWifiMac(const Ptr< WifiMac > mac)
Set the wifi MAC this Txop is associated to.
void SetTxMiddle(const Ptr< MacTxMiddle > txMiddle)
Set MacTxMiddle this Txop is associated to.
void SetMinCws(const std::vector< uint32_t > &minCws)
Set the minimum contention window size for each link.
virtual void Queue(Ptr< Packet > packet, const WifiMacHeader &hdr)
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Hold an unsigned integer type.
The IEEE 802.11ac VHT Capabilities.
The VHT Operation Information Element.
void SetMaxVhtMcsPerNss(uint8_t nss, uint8_t maxVhtMcs)
Set the Basic VHT-MCS and NSS field in the VHT Operation information element by specifying the tuple ...
void SetChannelWidth(uint8_t channelWidth)
Set the Channel Width field in the VHT Operation information element.
void SetChannelCenterFrequencySegment1(uint8_t channelCenterFrequencySegment1)
Set the Channel Center Frequency Segment 1 field in the VHT Operation information element.
void SetChannelCenterFrequencySegment0(uint8_t channelCenterFrequencySegment0)
Set the Channel Center Frequency Segment 0 field in the VHT Operation information element.
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.
std::optional< Mac48Address > GetMldAddress(const Mac48Address &remoteAddr) const
Ptr< HeConfiguration > GetHeConfiguration() 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.
bool GetQosSupported() const
Return whether the device supports QoS.
uint8_t GetNLinks() const
Get the number of links (can be greater than 1 for 11be devices only).
void DoInitialize() override
Initialize() implementation.
void UnblockUnicastTxOnLinks(WifiQueueBlockedReason reason, const Mac48Address &address, const std::set< uint8_t > &linkIds)
Unblock the transmission on the given links of all unicast frames addressed to the station with the g...
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 BlockUnicastTxOnLinks(WifiQueueBlockedReason reason, const Mac48Address &address, const std::set< uint8_t > &linkIds)
Block the transmission on the given links of all unicast frames addressed to the station with the giv...
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.
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.
Ptr< MacTxMiddle > m_txMiddle
TX middle (aggregation etc.)
virtual int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model.
Ptr< HtConfiguration > GetHtConfiguration() const
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,...
bool GetShortSlotTimeSupported() const
void NotifyRxDrop(Ptr< const Packet > packet)
virtual void SetLinkUpCallback(Callback< void > linkUp)
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.
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.
Ptr< QosTxop > GetQosTxop(AcIndex ac) const
Accessor for a specified EDCA object.
void NotifyTxDrop(Ptr< const Packet > packet)
void DoDispose() override
Destructor implementation.
bool GetDsssSupported(uint8_t linkId) const
Return whether the device supports DSSS on the given link.
represent a single transmission mode
std::string GetUniqueName() const
uint64_t GetDataRate(uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) const
uint8_t GetMcsValue() const
uint8_t GetMaxSupportedRxSpatialStreams() const
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.
const WifiPhyOperatingChannel & GetOperatingChannel() const
Get a const reference to the operating channel.
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< AttributeChecker > MakeAttributeContainerChecker()
Make uninitialized AttributeContainerChecker using explicit types.
Ptr< const AttributeAccessor > MakeBooleanAccessor(T1 a1)
Ptr< const AttributeChecker > MakeBooleanChecker()
Ptr< AttributeChecker > MakePairChecker()
Make a PairChecker without abscissa and ordinate AttributeCheckers.
Ptr< const AttributeAccessor > MakePointerAccessor(T1 a1)
Ptr< const AttributeChecker > MakeTimeChecker()
Helper to make an unbounded Time checker.
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
#define NS_ABORT_MSG_UNLESS(cond, msg)
Abnormal program termination if a condition is false, with a message.
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
#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_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_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
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 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.
WifiMacDropReason
The reason why an MPDU was dropped.
uint8_t QosUtilsGetTidForPacket(Ptr< const Packet > packet)
If a QoS tag is attached to the packet, returns a value < 8.
AcIndex
This enumeration defines the Access Categories as an enumeration with values corresponding to the AC ...
@ WIFI_PHY_BAND_6GHZ
The 6 GHz band.
@ WIFI_MOD_CLASS_HR_DSSS
HR/DSSS (Clause 16)
@ WIFI_MOD_CLASS_HT
HT (Clause 19)
@ WIFI_MOD_CLASS_EHT
EHT (Clause 36)
@ WIFI_MOD_CLASS_VHT
VHT (Clause 22)
@ WIFI_MOD_CLASS_HE
HE (Clause 27)
Every class exported by the ns3 library is enclosed in the ns3 namespace.
U * PeekPointer(const Ptr< U > &p)
std::unordered_map< uint16_t, Ptr< const WifiPsdu > > WifiConstPsduMap
Map of const PSDUs indexed by STA-ID.
const Time WIFI_TU
Wi-Fi Time Unit (see IEEE 802.11-2020 sec. 3.1)
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...
std::variant< std::reference_wrapper< MgtAssocRequestHeader >, std::reference_wrapper< MgtReassocRequestHeader > > AssocReqRefVariant
variant holding a reference to a (Re)Association Request
Ptr< const AttributeChecker > MakeEnumChecker(T v, std::string n, Ts... args)
Make an EnumChecker pre-configured with a set of allowed values by name.
constexpr uint8_t WIFI_EHT_MAX_MCS_INDEX
IEEE 802.11be D2.0 Figure 9-1002ai.
WifiMacType
Combination of valid MAC header type/subtype.
@ WIFI_MAC_MGT_ASSOCIATION_RESPONSE
@ WIFI_MAC_MGT_DISASSOCIATION
@ 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.
std::pair< Mac48Address, uint8_t > WifiAddressTidPair
(MAC address, TID) pair
std::map< uint8_t, std::set< uint8_t > > WifiTidLinkMapping
TID-indexed map of the link set to which the TID is mapped.
Struct containing all supported rates.
void SetBasicRate(uint64_t bs)
Set the given rate to basic 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.
Structure holding information specific to a single link.
std::map< uint16_t, Mac48Address > staList
Map of all stations currently associated to the AP with their association ID.
EventId beaconEvent
Event to generate one beacon.
~ApLinkEntity() override
Destructor (a virtual method is needed to make this struct polymorphic)
uint16_t numNonHtStations
Number of non-HT stations currently associated to the AP.
uint16_t numNonErpStations
Number of non-ERP stations currently associated to the AP.
std::optional< MldCapabilities > m_mldCapabilities
MLD Capabilities.
void SetMediumSyncDelayTimer(Time delay)
Set the Medium Synchronization Duration subfield of the Medium Synchronization Delay Information in t...
uint8_t m_bssColor
BSS Color.
6 GHz Operation Information field
uint8_t m_chCntrFreqSeg0
Channel center frequency segment 0.
uint8_t m_chWid
Channel Width.
uint8_t m_chCntrFreqSeg1
Channel center frequency segment 1.
uint8_t m_primCh
Primary Channel.
uint8_t emlsrMode
EMLSR Mode.
uint8_t emlsrParamUpdateCtrl
EMLSR Parameter Update Control.
bool defaultMapping
Default link mapping.
Ptr< WifiPhy > phy
Wifi PHY object.
Ptr< FrameExchangeManager > feManager
Frame Exchange Manager object.
Ptr< ChannelAccessManager > channelAccessManager
channel access manager object