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++)
117 std::list<WifiAssocManager::RnrLinkInfo> apList;
131 mle->get().GetLinkIdInfo(),
136 std::list<uint8_t> localLinkIds;
138 for (uint8_t linkId = 0; linkId <
m_mac->GetNLinks(); linkId++)
140 if (linkId == bestAp.m_linkId)
147 if (
m_mac->GetWifiPhy(linkId)->HasFixedPhyBand())
149 localLinkIds.push_front(linkId);
153 localLinkIds.push_back(linkId);
158 for (
const auto& linkId : localLinkIds)
160 auto phy =
m_mac->GetWifiPhy(linkId);
161 auto apIt = apList.begin();
163 while (apIt != apList.end())
165 auto apChannel = rnr->get().GetOperatingChannel(apIt->m_nbrApInfoId);
170 if (phy->HasFixedPhyBand() && phy->GetPhyBand() != apChannel.GetPhyBand())
176 bool needChannelSwitch =
false;
177 if (phy->GetOperatingChannel() != apChannel)
179 needChannelSwitch =
true;
182 if (needChannelSwitch && phy->IsStateSwitching())
193 Mac48Address bssid = rnr->get().GetBssid(apIt->m_nbrApInfoId, apIt->m_tbttInfoFieldId);
196 rnr->get().GetLinkId(apIt->m_nbrApInfoId, apIt->m_tbttInfoFieldId),
199 if (needChannelSwitch)
201 if (phy->IsStateSleep())
204 phy->ResumeFromSleep();
209 if (apChannel.GetTotalWidth() > 80 &&
210 !phy->GetDevice()->GetVhtConfiguration()->Get160MHzOperationSupported())
212 apChannel = apChannel.GetPrimaryChannel(80);
215 NS_LOG_DEBUG(
"Switch link " << +linkId <<
" to using " << apChannel);
216 phy->SetOperatingChannel(apChannel);
237 return info.timer.IsPending();
255 return info.timer.IsPending();
272 auto it = std::find_if(setupLinks.begin(), setupLinks.end(), [&linkId](
auto&& linkIds) {
273 return linkIds.localLinkId == linkId;
276 setupLinks.erase(it);
279 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 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 SendProbeRequest(uint8_t linkId)
Enqueue a 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.