diff --git a/src/wifi/model/eht/emlsr-manager.cc b/src/wifi/model/eht/emlsr-manager.cc index e145083ff..a8a3c5820 100644 --- a/src/wifi/model/eht/emlsr-manager.cc +++ b/src/wifi/model/eht/emlsr-manager.cc @@ -461,14 +461,16 @@ EmlsrManager::NotifyTxopEnd(uint8_t linkId) Simulator::ScheduleNow([=, this]() { // unblock transmissions and resume medium access on other EMLSR links + std::set linkIds; for (auto id : m_staMac->GetLinkIds()) { if ((id != linkId) && m_staMac->IsEmlsrLink(id)) { - m_staMac->UnblockTxOnLink(id, WifiQueueBlockedReason::USING_OTHER_EMLSR_LINK); m_staMac->GetChannelAccessManager(id)->NotifyStopUsingOtherEmlsrLink(); + linkIds.insert(id); } } + m_staMac->UnblockTxOnLink(linkIds, WifiQueueBlockedReason::USING_OTHER_EMLSR_LINK); StartMediumSyncDelayTimer(linkId); }); diff --git a/src/wifi/model/sta-wifi-mac.cc b/src/wifi/model/sta-wifi-mac.cc index 2ec86f1c1..25eec0ddb 100644 --- a/src/wifi/model/sta-wifi-mac.cc +++ b/src/wifi/model/sta-wifi-mac.cc @@ -1067,14 +1067,18 @@ StaWifiMac::BlockTxOnLink(uint8_t linkId, WifiQueueBlockedReason reason) } void -StaWifiMac::UnblockTxOnLink(uint8_t linkId, WifiQueueBlockedReason reason) +StaWifiMac::UnblockTxOnLink(std::set linkIds, WifiQueueBlockedReason reason) { - NS_LOG_FUNCTION(this << linkId << reason); + std::stringstream ss; + std::copy(linkIds.cbegin(), linkIds.cend(), std::ostream_iterator(ss, " ")); + NS_LOG_FUNCTION(this << ss.str() << reason); - auto bssid = GetBssid(linkId); - auto apAddress = GetWifiRemoteStationManager(linkId)->GetMldAddress(bssid).value_or(bssid); + const auto linkId = *linkIds.cbegin(); + const auto bssid = GetBssid(linkId); + const auto apAddress = + GetWifiRemoteStationManager(linkId)->GetMldAddress(bssid).value_or(bssid); - UnblockUnicastTxOnLinks(reason, apAddress, {linkId}); + UnblockUnicastTxOnLinks(reason, apAddress, linkIds); // the only type of broadcast frames that a non-AP STA can send are management frames for (const auto& [acIndex, ac] : wifiAcList) { @@ -1084,7 +1088,7 @@ StaWifiMac::UnblockTxOnLink(uint8_t linkId, WifiQueueBlockedReason reason) Mac48Address::GetBroadcast(), GetFrameExchangeManager(linkId)->GetAddress(), {}, - {linkId}); + linkIds); } } diff --git a/src/wifi/model/sta-wifi-mac.h b/src/wifi/model/sta-wifi-mac.h index 32b4e556f..0bab57123 100644 --- a/src/wifi/model/sta-wifi-mac.h +++ b/src/wifi/model/sta-wifi-mac.h @@ -322,12 +322,12 @@ class StaWifiMac : public WifiMac void BlockTxOnLink(uint8_t linkId, WifiQueueBlockedReason reason); /** - * Unblock transmissions on the given link for the given reason. + * Unblock transmissions on the given links for the given reason. * - * \param linkId the ID of the given link - * \param reason the reason for unblocking transmissions on the given link + * \param linkIds the IDs of the given links + * \param reason the reason for unblocking transmissions on the given links */ - void UnblockTxOnLink(uint8_t linkId, WifiQueueBlockedReason reason); + void UnblockTxOnLink(std::set linkIds, WifiQueueBlockedReason reason); protected: /**