25 #include "ns3/attribute-container.h"
26 #include "ns3/eht-configuration.h"
49 "Comparing two ApInfo objects with the same BSSID: " << lhs.
m_bssid);
51 bool lhsBefore = m_manager.Compare(lhs, rhs);
57 bool rhsBefore = m_manager.Compare(rhs, lhs);
72 TypeId(
"ns3::WifiAssocManager")
77 "Only Beacon and Probe Response frames received on a link belonging to the given "
78 "set are processed. An empty set is equivalent to the set of all links.",
81 MakeAttributeContainerChecker<UintegerValue>(MakeUintegerChecker<uint8_t>()));
131 if (
auto beacon = std::get_if<MgtBeaconHeader>(&apInfo.
m_frame); beacon)
133 apSsid = beacon->Get<
Ssid>().value();
137 auto probeResp = std::get_if<MgtProbeResponseHeader>(&apInfo.
m_frame);
139 apSsid = probeResp->Get<
Ssid>().value();
150 auto channelMatch = [&apInfo](
auto&&
channel) {
214 auto [hashIt, hashInserted] =
m_apListIt.insert({apInfo.m_bssid, {}});
222 auto [listIt, listInserted] =
m_apList.insert(std::move(apInfo));
225 "An entry (" << listIt->m_apAddr <<
", " << listIt->m_bssid <<
", "
227 <<
") prevented insertion of given ApInfo object");
228 hashIt->second = listIt;
253 std::list<StaWifiMac::ApInfo::SetupLinksInfo>&
256 return const_cast<std::list<StaWifiMac::ApInfo::SetupLinksInfo>&
>(apInfo.
m_setupLinks);
271 if (
auto beacon = std::get_if<MgtBeaconHeader>(&
m_apList.begin()->m_frame); beacon)
278 auto probeResp = std::get_if<MgtProbeResponseHeader>(&
m_apList.begin()->m_frame);
284 if (!mle.has_value())
286 NS_LOG_DEBUG(
"No Multi-Link Element in Beacon/Probe Response");
290 if (!rnr.has_value() || rnr->get().GetNNbrApInfoFields() == 0)
292 NS_LOG_DEBUG(
"No Reduced Neighbor Report Element in Beacon/Probe Response");
298 if (!mle->get().HasLinkIdInfo())
300 NS_LOG_DEBUG(
"No Link ID Info subfield in the Multi-Link Element");
304 if (
const auto& mldCapabilities = mle->get().GetCommonInfoBasic().m_mldCapabilities)
309 ehtConfig->GetAttributeFailSafe(
"TidToLinkMappingNegSupport", negSupport);
317 if (mldCapabilities->tidToLinkMappingSupport > 0 && negSupport.
Get() == 0)
319 NS_LOG_DEBUG(
"AP MLD supports TID-to-Link Mapping negotiation, while we don't");
327 std::optional<WifiAssocManager::RnrLinkInfo>
341 std::size_t tbttInfoFieldIndex = 0;
343 rnr.
GetMldId(nbrApInfoId, tbttInfoFieldIndex) != 0)
345 tbttInfoFieldIndex++;
352 return RnrLinkInfo{nbrApInfoId, tbttInfoFieldIndex};
360 std::list<WifiAssocManager::RnrLinkInfo>
363 std::list<WifiAssocManager::RnrLinkInfo> apList;
364 std::size_t nbrApInfoId = 0;
365 std::optional<WifiAssocManager::RnrLinkInfo> next;
369 apList.push_back({*next});
370 nbrApInfoId = next->m_nbrApInfoId + 1;
A container for one type of attribute.
Hold variables of type enum.
A base class which provides memory management and object aggregation.
The Reduced Neighbor Report element.
std::size_t GetNNbrApInfoFields() const
Get the number of Neighbor AP Information fields.
std::size_t GetNTbttInformationFields(std::size_t nbrApInfoId) const
Get the number of TBTT Information fields included in the TBTT Information Set field of the given Nei...
uint8_t GetMldId(std::size_t nbrApInfoId, std::size_t index) const
Get the MLD ID value in the MLD Parameters subfield (must be present) in the i-th TBTT Information fi...
bool HasMldParameters(std::size_t nbrApInfoId) const
Return true if the MLD Parameters subfield is present in all the TBTT Information fields of the given...
The IEEE 802.11 SSID Information Element.
bool IsEqual(const Ssid &o) const
Check if the two SSIDs are equal.
bool IsBroadcast() const
Check if the SSID is broadcast.
void ScanningTimeout(const std::optional< ApInfo > &bestAp)
This method is called after wait beacon timeout or wait probe request timeout has occurred.
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Abstract base class for the Association Manager, which manages scanning and association for single li...
const SortedList & GetSortedList() const
std::optional< std::reference_wrapper< const MultiLinkElement > > OptMleConstRef
typedef for an optional const reference to a MultiLinkElement object
virtual void NotifyApInfo(const StaWifiMac::ApInfo &&apInfo)
STA wifi MAC received a Beacon frame or Probe Response frame while scanning and notifies us the AP in...
Ptr< StaWifiMac > m_mac
pointer to the STA wifi MAC
virtual void DoStartScanning()=0
Start a scanning procedure.
void SetStaWifiMac(Ptr< StaWifiMac > mac)
Set the pointer to the STA wifi MAC.
std::list< StaWifiMac::ApInfo::SetupLinksInfo > & GetSetupLinks(const StaWifiMac::ApInfo &apInfo)
Get a reference to the list of the links to setup with the given AP.
void ScanningTimeout()
Extract the best AP to associate with from the sorted list and return it, if any, to the STA wifi MAC...
virtual bool CanBeInserted(const StaWifiMac::ApInfo &apInfo) const =0
Allow subclasses to choose whether the given ApInfo shall be considered and hence inserted in the sor...
std::optional< std::reference_wrapper< const ReducedNeighborReport > > OptRnrConstRef
typedef for an optional const reference to a ReducedNeighborReport object
SortedList m_apList
sorted list of candidate APs
static std::optional< WifiAssocManager::RnrLinkInfo > GetNextAffiliatedAp(const ReducedNeighborReport &rnr, std::size_t nbrApInfoId)
Search the given RNR element for APs affiliated to the same AP MLD as the reporting AP.
WifiScanParams m_scanParams
scanning parameters
virtual bool CanBeReturned(const StaWifiMac::ApInfo &apInfo) const =0
Allow subclasses to choose whether the given ApInfo shall be returned or discarded when the STA wifi ...
void StartScanning(WifiScanParams &&scanParams)
Request the Association Manager to start a scanning procedure according to the given scanning paramet...
std::set< StaWifiMac::ApInfo, ApInfoCompare > SortedList
typedef for the sorted list of ApInfo objects
std::set< uint8_t > m_allowedLinks
"Only Beacon and Probe Response frames received on a link belonging to the this set are processed
static std::list< WifiAssocManager::RnrLinkInfo > GetAllAffiliatedAps(const ReducedNeighborReport &rnr)
Find all the APs affiliated to the same AP MLD as the reporting AP that sent the given RNR element.
static TypeId GetTypeId()
Get the type ID.
const WifiScanParams & GetScanParams() const
void DoDispose() override
Destructor implementation.
~WifiAssocManager() override
std::unordered_map< Mac48Address, SortedList::const_iterator, WifiAddressHash > m_apListIt
hash table to help locate ApInfo objects in the sorted list based on the BSSID
bool CanSetupMultiLink(OptMleConstRef &mle, OptRnrConstRef &rnr)
Check whether 11be Multi-Link setup can be established with the current best AP.
WifiAssocManager()
Constructor (protected as this is an abstract base class)
bool MatchScanParams(const StaWifiMac::ApInfo &apInfo) const
Check whether the given AP information match the current scanning parameters.
uint8_t GetNLinks() const
Get the number of links (can be greater than 1 for 11be devices only).
Ptr< EhtConfiguration > GetEhtConfiguration() const
#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...
#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(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.
@ WIFI_PHY_BAND_UNSPECIFIED
Unspecified.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
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.
std::list< SetupLinksInfo > m_setupLinks
information about the links to setup between MLDs
uint8_t m_linkId
ID of the link used to communicate with the AP.
Mac48Address m_bssid
BSSID.
Struct providing a function call operator to compare two ApInfo objects.
ApInfoCompare(const WifiAssocManager &manager)
Constructor.
bool operator()(const StaWifiMac::ApInfo &lhs, const StaWifiMac::ApInfo &rhs) const
Function call operator.
Struct to identify a specific TBTT Information field of a Neighbor AP Information field in a Reduced ...
WifiPhyBand band
PHY band.
uint16_t number
channel number
Structure holding scan parameters.
std::vector< ChannelList > channelList
list of channels to scan, for each link
Ssid ssid
desired SSID or wildcard SSID