17#include "ns3/simulator.h"
18#include "ns3/vht-configuration.h"
33 TypeId(
"ns3::WifiDefaultAssocManager")
35 .AddConstructor<WifiDefaultAssocManager>()
37 .AddAttribute(
"ChannelSwitchTimeout",
38 "After requesting a channel switch on a link to setup that link, "
39 "wait at most this amount of time. If a channel switch is not "
40 "notified within this amount of time, we give up setting up that link.",
90 for (uint8_t linkId = 0; linkId <
m_mac->GetNLinks(); linkId++)
95 m_mac->GetProbeRequest(linkId),
120 std::list<WifiAssocManager::RnrLinkInfo> apList;
134 mle->get().GetLinkIdInfo(),
139 std::list<uint8_t> localLinkIds;
141 for (uint8_t linkId = 0; linkId <
m_mac->GetNLinks(); linkId++)
143 if (linkId == bestAp.m_linkId)
150 if (
m_mac->GetWifiPhy(linkId)->HasFixedPhyBand())
152 localLinkIds.push_front(linkId);
156 localLinkIds.push_back(linkId);
161 for (
const auto& linkId : localLinkIds)
163 auto phy =
m_mac->GetWifiPhy(linkId);
164 auto apIt = apList.begin();
166 while (apIt != apList.end())
168 auto apChannel = rnr->get().GetOperatingChannel(apIt->m_nbrApInfoId);
173 if (phy->HasFixedPhyBand() && phy->GetPhyBand() != apChannel.GetPhyBand())
179 bool needChannelSwitch =
false;
180 if (phy->GetOperatingChannel() != apChannel)
182 needChannelSwitch =
true;
185 if (needChannelSwitch && phy->IsStateSwitching())
196 Mac48Address bssid = rnr->get().GetBssid(apIt->m_nbrApInfoId, apIt->m_tbttInfoFieldId);
199 rnr->get().GetMldParameters(apIt->m_nbrApInfoId, apIt->m_tbttInfoFieldId).linkId,
202 if (needChannelSwitch)
204 if (phy->IsStateSleep())
207 phy->ResumeFromSleep();
212 if (apChannel.GetTotalWidth() >
MHz_u{80} &&
213 !phy->GetDevice()->GetVhtConfiguration()->m_160MHzSupported)
215 apChannel = apChannel.GetPrimaryChannel(
MHz_u{80});
218 NS_LOG_DEBUG(
"Switch link " << +linkId <<
" to using " << apChannel);
219 phy->SetOperatingChannel(apChannel);
240 return info.timer.IsPending();
258 return info.timer.IsPending();
275 auto it = std::find_if(setupLinks.begin(), setupLinks.end(), [&linkId](
auto&& linkIds) {
276 return linkIds.localLinkId == linkId;
279 setupLinks.erase(it);
282 return info.timer.IsPending();
void Cancel()
This method is syntactic sugar for the ns3::Simulator::Cancel method.
bool IsPending() const
This method is syntactic sugar for !IsExpired().
static Mac48Address GetBroadcast()
static EventId Schedule(const Time &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
static EventId ScheduleNow(FUNC f, Ts &&... args)
Schedule an event to expire Now.
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.
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
Ptr< StaWifiMac > m_mac
pointer to the STA wifi MAC
std::optional< std::reference_wrapper< const MultiLinkElement > > OptMleConstRef
typedef for an optional const reference to a MultiLinkElement object
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.
std::optional< std::reference_wrapper< const ReducedNeighborReport > > OptRnrConstRef
typedef for an optional const reference to a ReducedNeighborReport object
void ScanningTimeout()
Extract the best AP to associate with from the sorted list and return it, if any, to the STA wifi MAC...
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.
const WifiScanParams & GetScanParams() const
void DoDispose() override
Destructor implementation.
bool CanSetupMultiLink(OptMleConstRef &mle, OptRnrConstRef &rnr)
Check whether 11be Multi-Link setup can be established with the current best AP.
void EndScanning()
Perform operations to do at the end of a scanning procedure, such as identifying the links to setup i...
void DoDispose() override
Destructor implementation.
EventId m_probeRequestEvent
probe request event
~WifiDefaultAssocManager() override
void DoStartScanning() override
Start a scanning procedure.
bool CanBeInserted(const StaWifiMac::ApInfo &apInfo) const override
Allow subclasses to choose whether the given ApInfo shall be considered and hence inserted in the sor...
Time m_channelSwitchTimeout
maximum delay for channel switching
void NotifyChannelSwitched(uint8_t linkId) override
Notify that the given link has completed channel switching.
WifiDefaultAssocManager()
bool Compare(const StaWifiMac::ApInfo &lhs, const StaWifiMac::ApInfo &rhs) const override
Compare two ApInfo objects for the purpose of keeping a sorted list of ApInfo objects.
EventId m_waitBeaconEvent
wait beacon event
static TypeId GetTypeId()
Get the type ID.
void ChannelSwitchTimeout(uint8_t linkId)
Take action upon the expiration of the timer set when requesting channel switch on the given link.
std::vector< ChannelSwitchInfo > m_channelSwitchInfo
per-link channel switch info
bool CanBeReturned(const StaWifiMac::ApInfo &apInfo) const override
Allow subclasses to choose whether the given ApInfo shall be returned or discarded when the STA wifi ...
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
#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.
Time Seconds(double value)
Construct a Time in the indicated unit.
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
Ptr< const AttributeChecker > MakeTimeChecker()
Helper to make an unbounded Time checker.
Information about links to setup.
Struct to hold information regarding observed AP through active/passive scanning.
double m_snr
SNR in linear scale.