16#include "ns3/boolean.h" 
   18#include "ns3/simulator.h" 
   19#include "ns3/vht-configuration.h" 
   34        TypeId(
"ns3::WifiDefaultAssocManager")
 
   36            .AddConstructor<WifiDefaultAssocManager>()
 
   38            .AddAttribute(
"ChannelSwitchTimeout",
 
   39                          "After requesting a channel switch on a link to setup that link, " 
   40                          "wait at most this amount of time. If a channel switch is not " 
   41                          "notified within this amount of time, we give up setting up that link.",
 
   46                "SkipAssocIncompatibleChannelWidth",
 
   47                "If set to true, it does not include APs with incompatible channel width with the " 
   48                "STA in the list of candidate APs. An incompatible channel width is one that the " 
   49                "STA cannot advertise to the AP, unless AP operates on a channel width that is " 
   50                "equal or lower than that channel width.",
 
 
  100        for (uint8_t linkId = 0; linkId < 
m_mac->GetNLinks(); linkId++)
 
  105                                m_mac->GetProbeRequest(linkId),
 
 
  130    std::list<WifiAssocManager::RnrLinkInfo> apList;
 
  144                                                               mle->get().GetLinkIdInfo(),
 
  149    std::list<uint8_t> localLinkIds;
 
  151    for (uint8_t linkId = 0; linkId < 
m_mac->GetNLinks(); linkId++)
 
  153        if (linkId == bestAp.m_linkId)
 
  160        if (
m_mac->GetWifiPhy(linkId)->HasFixedPhyBand())
 
  162            localLinkIds.push_front(linkId);
 
  166            localLinkIds.push_back(linkId);
 
  171    for (
const auto& linkId : localLinkIds)
 
  173        auto phy = 
m_mac->GetWifiPhy(linkId);
 
  174        auto apIt = apList.begin();
 
  176        while (apIt != apList.end())
 
  178            auto apChannel = rnr->get().GetOperatingChannel(apIt->m_nbrApInfoId);
 
  183            if (phy->HasFixedPhyBand() && phy->GetPhyBand() != apChannel.GetPhyBand())
 
  189            bool needChannelSwitch = 
false;
 
  190            if (phy->GetOperatingChannel() != apChannel)
 
  192                needChannelSwitch = 
true;
 
  195            if (needChannelSwitch && phy->IsStateSwitching())
 
  206            Mac48Address bssid = rnr->get().GetBssid(apIt->m_nbrApInfoId, apIt->m_tbttInfoFieldId);
 
  209                rnr->get().GetMldParameters(apIt->m_nbrApInfoId, apIt->m_tbttInfoFieldId).linkId,
 
  212            if (needChannelSwitch)
 
  214                if (phy->IsStateSleep())
 
  217                    phy->ResumeFromSleep();
 
  223                if (apChannel.GetTotalWidth() > phy->GetChannelWidth())
 
  225                    apChannel = apChannel.GetPrimaryChannel(phy->GetChannelWidth());
 
  228                NS_LOG_DEBUG(
"Switch link " << +linkId << 
" to using " << apChannel);
 
  229                phy->SetOperatingChannel(apChannel);
 
  250            return info.timer.IsPending();
 
 
  268                return info.timer.IsPending();
 
 
  285    auto it = std::find_if(setupLinks.begin(), setupLinks.end(), [&linkId](
auto&& linkIds) {
 
  286        return linkIds.localLinkId == linkId;
 
  289    setupLinks.erase(it);
 
  292            return info.timer.IsPending();
 
 
AttributeValue implementation for Boolean.
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.
AttributeValue implementation for Time.
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
bool IsChannelWidthCompatible(const StaWifiMac::ApInfo &apInfo) const
Check whether the channel width of the STA is compatible with the channel width of the operating chan...
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.
bool m_skipAssocIncompatibleChannelWidth
flag whether to skip APs with incompatible channel width
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,...
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 > 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.
#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.
Information about links to setup.
Struct to hold information regarding observed AP through active/passive scanning.
double m_snr
SNR in linear scale.