From 01cd73b174a65267e438c79afbeae43886cbf66f Mon Sep 17 00:00:00 2001 From: Stefano Avallone Date: Tue, 4 Apr 2023 21:13:24 +0200 Subject: [PATCH] wifi: Port probe request and association request to the new mgt header --- src/wifi/model/ap-wifi-mac.cc | 26 +- src/wifi/model/mgt-headers.cc | 918 ++-------------------- src/wifi/model/mgt-headers.h | 604 +++----------- src/wifi/model/sta-wifi-mac.cc | 36 +- src/wifi/test/wifi-eht-info-elems-test.cc | 6 +- src/wifi/test/wifi-mlo-test.cc | 2 +- 6 files changed, 240 insertions(+), 1352 deletions(-) diff --git a/src/wifi/model/ap-wifi-mac.cc b/src/wifi/model/ap-wifi-mac.cc index bd81c5e61..d9c1c80d1 100644 --- a/src/wifi/model/ap-wifi-mac.cc +++ b/src/wifi/model/ap-wifi-mac.cc @@ -1607,8 +1607,8 @@ ApWifiMac::Receive(Ptr mpdu, uint8_t linkId) } MgtProbeRequestHeader probeRequestHeader; packet->PeekHeader(probeRequestHeader); - const Ssid& ssid = probeRequestHeader.GetSsid(); - if (ssid == GetSsid() || ssid.IsBroadcast()) + const auto& ssid = probeRequestHeader.Get(); + if (ssid == GetSsid() || ssid->IsBroadcast()) { NS_LOG_DEBUG("Probe request received from " << from << ": send probe response"); SendProbeResp(from, linkId); @@ -1700,9 +1700,11 @@ ApWifiMac::ReceiveAssocRequest(const AssocReqRefVariant& assoc, // first, verify that the the station's supported // rate set is compatible with our Basic Rate set - const CapabilityInformation& capabilities = frame.GetCapabilities(); + const CapabilityInformation& capabilities = frame.Capabilities(); remoteStationManager->AddSupportedPhyPreamble(from, capabilities.IsShortPreamble()); - const auto& rates = frame.GetSupportedRates(); + NS_ASSERT(frame.template Get()); + const auto rates = AllSupportedRates{*frame.template Get(), + frame.template Get()}; if (rates.GetNRates() == 0) { @@ -1712,7 +1714,7 @@ ApWifiMac::ReceiveAssocRequest(const AssocReqRefVariant& assoc, if (GetHtSupported()) { // check whether the HT STA supports all MCSs in Basic MCS Set - const auto& htCapabilities = frame.GetHtCapabilities(); + const auto& htCapabilities = frame.template Get(); if (htCapabilities.has_value() && htCapabilities->IsSupportedMcs(0)) { for (uint8_t i = 0; i < remoteStationManager->GetNBasicMcs(); i++) @@ -1728,7 +1730,7 @@ ApWifiMac::ReceiveAssocRequest(const AssocReqRefVariant& assoc, if (GetVhtSupported(linkId)) { // check whether the VHT STA supports all MCSs in Basic MCS Set - const auto& vhtCapabilities = frame.GetVhtCapabilities(); + const auto& vhtCapabilities = frame.template Get(); if (vhtCapabilities.has_value() && vhtCapabilities->GetVhtCapabilitiesInfo() != 0) { for (uint8_t i = 0; i < remoteStationManager->GetNBasicMcs(); i++) @@ -1744,7 +1746,7 @@ ApWifiMac::ReceiveAssocRequest(const AssocReqRefVariant& assoc, if (GetHeSupported()) { // check whether the HE STA supports all MCSs in Basic MCS Set - const auto& heCapabilities = frame.GetHeCapabilities(); + const auto& heCapabilities = frame.template Get(); if (heCapabilities.has_value() && heCapabilities->GetSupportedMcsAndNss() != 0) { for (uint8_t i = 0; i < remoteStationManager->GetNBasicMcs(); i++) @@ -1782,7 +1784,7 @@ ApWifiMac::ReceiveAssocRequest(const AssocReqRefVariant& assoc, } if (GetHtSupported()) { - const auto& htCapabilities = frame.GetHtCapabilities(); + const auto& htCapabilities = frame.template Get(); if (htCapabilities.has_value() && htCapabilities->IsSupportedMcs(0)) { remoteStationManager->AddStationHtCapabilities(from, *htCapabilities); @@ -1792,7 +1794,7 @@ ApWifiMac::ReceiveAssocRequest(const AssocReqRefVariant& assoc, } if (GetVhtSupported(linkId)) { - const auto& vhtCapabilities = frame.GetVhtCapabilities(); + const auto& vhtCapabilities = frame.template Get(); // we will always fill in RxHighestSupportedLgiDataRate field at TX, so this can be used // to check whether it supports VHT if (vhtCapabilities.has_value() && @@ -1811,7 +1813,7 @@ ApWifiMac::ReceiveAssocRequest(const AssocReqRefVariant& assoc, } if (GetHeSupported()) { - const auto& heCapabilities = frame.GetHeCapabilities(); + const auto& heCapabilities = frame.template Get(); if (heCapabilities.has_value() && heCapabilities->GetSupportedMcsAndNss() != 0) { remoteStationManager->AddStationHeCapabilities(from, *heCapabilities); @@ -1827,7 +1829,7 @@ ApWifiMac::ReceiveAssocRequest(const AssocReqRefVariant& assoc, } if (GetEhtSupported()) { - if (const auto& ehtCapabilities = frame.GetEhtCapabilities()) + if (const auto& ehtCapabilities = frame.template Get()) { remoteStationManager->AddStationEhtCapabilities(from, *ehtCapabilities); } @@ -1855,7 +1857,7 @@ ApWifiMac::ParseReportedStaInfo(const AssocReqRefVariant& assoc, Mac48Address fr // lambda to process received Multi-Link Element auto recvMle = [&](auto&& frame) { - const auto& mle = frame.get().GetMultiLinkElement(); + const auto& mle = frame.get().template Get(); if (!mle.has_value()) { diff --git a/src/wifi/model/mgt-headers.cc b/src/wifi/model/mgt-headers.cc index 04ad75485..8ee803a87 100644 --- a/src/wifi/model/mgt-headers.cc +++ b/src/wifi/model/mgt-headers.cc @@ -33,169 +33,6 @@ namespace ns3 NS_OBJECT_ENSURE_REGISTERED(MgtProbeRequestHeader); -MgtProbeRequestHeader::~MgtProbeRequestHeader() -{ -} - -void -MgtProbeRequestHeader::SetSsid(const Ssid& ssid) -{ - m_ssid = ssid; -} - -void -MgtProbeRequestHeader::SetSsid(Ssid&& ssid) -{ - m_ssid = std::move(ssid); -} - -const Ssid& -MgtProbeRequestHeader::GetSsid() const -{ - return m_ssid; -} - -void -MgtProbeRequestHeader::SetSupportedRates(const AllSupportedRates& rates) -{ - m_rates = rates; -} - -void -MgtProbeRequestHeader::SetSupportedRates(AllSupportedRates&& rates) -{ - m_rates = std::move(rates); -} - -void -MgtProbeRequestHeader::SetExtendedCapabilities(const ExtendedCapabilities& extendedCapabilities) -{ - m_extendedCapability = extendedCapabilities; -} - -void -MgtProbeRequestHeader::SetExtendedCapabilities(ExtendedCapabilities&& extendedCapabilities) -{ - m_extendedCapability = std::move(extendedCapabilities); -} - -const std::optional& -MgtProbeRequestHeader::GetExtendedCapabilities() const -{ - return m_extendedCapability; -} - -void -MgtProbeRequestHeader::SetHtCapabilities(const HtCapabilities& htCapabilities) -{ - m_htCapability = htCapabilities; -} - -void -MgtProbeRequestHeader::SetHtCapabilities(HtCapabilities&& htCapabilities) -{ - m_htCapability = std::move(htCapabilities); -} - -const std::optional& -MgtProbeRequestHeader::GetHtCapabilities() const -{ - return m_htCapability; -} - -void -MgtProbeRequestHeader::SetVhtCapabilities(const VhtCapabilities& vhtCapabilities) -{ - m_vhtCapability = vhtCapabilities; -} - -void -MgtProbeRequestHeader::SetVhtCapabilities(VhtCapabilities&& vhtCapabilities) -{ - m_vhtCapability = std::move(vhtCapabilities); -} - -const std::optional& -MgtProbeRequestHeader::GetVhtCapabilities() const -{ - return m_vhtCapability; -} - -void -MgtProbeRequestHeader::SetHeCapabilities(const HeCapabilities& heCapabilities) -{ - m_heCapability = heCapabilities; -} - -void -MgtProbeRequestHeader::SetHeCapabilities(HeCapabilities&& heCapabilities) -{ - m_heCapability = std::move(heCapabilities); -} - -const std::optional& -MgtProbeRequestHeader::GetHeCapabilities() const -{ - return m_heCapability; -} - -void -MgtProbeRequestHeader::SetEhtCapabilities(const EhtCapabilities& ehtCapabilities) -{ - m_ehtCapability = ehtCapabilities; -} - -void -MgtProbeRequestHeader::SetEhtCapabilities(EhtCapabilities&& ehtCapabilities) -{ - m_ehtCapability = std::move(ehtCapabilities); -} - -const std::optional& -MgtProbeRequestHeader::GetEhtCapabilities() const -{ - return m_ehtCapability; -} - -const AllSupportedRates& -MgtProbeRequestHeader::GetSupportedRates() const -{ - return m_rates; -} - -uint32_t -MgtProbeRequestHeader::GetSerializedSize() const -{ - uint32_t size = 0; - size += m_ssid.GetSerializedSize(); - size += m_rates.rates.GetSerializedSize(); - if (m_rates.extendedRates) - { - size += m_rates.extendedRates->GetSerializedSize(); - } - if (m_extendedCapability.has_value()) - { - size += m_extendedCapability->GetSerializedSize(); - } - if (m_htCapability.has_value()) - { - size += m_htCapability->GetSerializedSize(); - } - if (m_vhtCapability.has_value()) - { - size += m_vhtCapability->GetSerializedSize(); - } - if (m_heCapability.has_value()) - { - size += m_heCapability->GetSerializedSize(); - } - if (m_ehtCapability.has_value()) - { - size += m_ehtCapability->GetSerializedSize(); - } - return size; -} - TypeId MgtProbeRequestHeader::GetTypeId() { @@ -212,87 +49,6 @@ MgtProbeRequestHeader::GetInstanceTypeId() const return GetTypeId(); } -void -MgtProbeRequestHeader::Print(std::ostream& os) const -{ - os << "ssid=" << m_ssid << ", " - << "rates=" << m_rates.rates << ", "; - if (m_rates.extendedRates.has_value()) - { - os << "Extended rates=" << *m_rates.extendedRates << ", "; - } - if (m_extendedCapability.has_value()) - { - os << "Extended Capabilities=" << *m_extendedCapability << " , "; - } - if (m_htCapability.has_value()) - { - os << "HT Capabilities=" << *m_htCapability << " , "; - } - if (m_vhtCapability.has_value()) - { - os << "VHT Capabilities=" << *m_vhtCapability << " , "; - } - if (m_heCapability.has_value()) - { - os << "HE Capabilities=" << *m_heCapability << " , "; - } - if (m_ehtCapability.has_value()) - { - os << "EHT Capabilities=" << *m_ehtCapability; - } -} - -void -MgtProbeRequestHeader::Serialize(Buffer::Iterator start) const -{ - Buffer::Iterator i = start; - i = m_ssid.Serialize(i); - i = m_rates.rates.Serialize(i); - if (m_rates.extendedRates) - { - i = m_rates.extendedRates->Serialize(i); - } - if (m_extendedCapability.has_value()) - { - i = m_extendedCapability->Serialize(i); - } - if (m_htCapability.has_value()) - { - i = m_htCapability->Serialize(i); - } - if (m_vhtCapability.has_value()) - { - i = m_vhtCapability->Serialize(i); - } - if (m_heCapability.has_value()) - { - i = m_heCapability->Serialize(i); - } - if (m_ehtCapability.has_value()) - { - i = m_ehtCapability->Serialize(i); - } -} - -uint32_t -MgtProbeRequestHeader::Deserialize(Buffer::Iterator start) -{ - Buffer::Iterator i = start; - i = m_ssid.Deserialize(i); - i = m_rates.rates.Deserialize(i); - i = WifiInformationElement::DeserializeIfPresent(m_rates.extendedRates, i); - i = WifiInformationElement::DeserializeIfPresent(m_extendedCapability, i); - i = WifiInformationElement::DeserializeIfPresent(m_htCapability, i); - i = WifiInformationElement::DeserializeIfPresent(m_vhtCapability, i); - i = WifiInformationElement::DeserializeIfPresent(m_heCapability, i); - const bool is2_4Ghz = m_rates.IsSupportedRate( - 1000000 /* 1 Mbit/s */); // TODO: use presence of VHT capabilities IE and HE 6 GHz Band - // Capabilities IE once the later is implemented - i = WifiInformationElement::DeserializeIfPresent(m_ehtCapability, i, is2_4Ghz, m_heCapability); - return i.GetDistanceFrom(start); -} - /*********************************************************** * Probe Response ***********************************************************/ @@ -411,189 +167,6 @@ MgtBeaconHeader::InitForDeserialization(std::optional& optElem NS_OBJECT_ENSURE_REGISTERED(MgtAssocRequestHeader); -MgtAssocRequestHeader::MgtAssocRequestHeader() - : m_listenInterval(0) -{ -} - -MgtAssocRequestHeader::~MgtAssocRequestHeader() -{ -} - -void -MgtAssocRequestHeader::SetSsid(const Ssid& ssid) -{ - m_ssid = ssid; -} - -void -MgtAssocRequestHeader::SetSsid(Ssid&& ssid) -{ - m_ssid = std::move(ssid); -} - -void -MgtAssocRequestHeader::SetSupportedRates(const AllSupportedRates& rates) -{ - m_rates = rates; -} - -void -MgtAssocRequestHeader::SetSupportedRates(AllSupportedRates&& rates) -{ - m_rates = std::move(rates); -} - -void -MgtAssocRequestHeader::SetListenInterval(uint16_t interval) -{ - m_listenInterval = interval; -} - -void -MgtAssocRequestHeader::SetCapabilities(const CapabilityInformation& capabilities) -{ - m_capability = capabilities; -} - -void -MgtAssocRequestHeader::SetCapabilities(CapabilityInformation&& capabilities) -{ - m_capability = std::move(capabilities); -} - -const CapabilityInformation& -MgtAssocRequestHeader::GetCapabilities() const -{ - return m_capability; -} - -void -MgtAssocRequestHeader::SetExtendedCapabilities(const ExtendedCapabilities& extendedCapabilities) -{ - m_extendedCapability = extendedCapabilities; -} - -void -MgtAssocRequestHeader::SetExtendedCapabilities(ExtendedCapabilities&& extendedCapabilities) -{ - m_extendedCapability = std::move(extendedCapabilities); -} - -const std::optional& -MgtAssocRequestHeader::GetExtendedCapabilities() const -{ - return m_extendedCapability; -} - -void -MgtAssocRequestHeader::SetHtCapabilities(const HtCapabilities& htCapabilities) -{ - m_htCapability = htCapabilities; -} - -void -MgtAssocRequestHeader::SetHtCapabilities(HtCapabilities&& htCapabilities) -{ - m_htCapability = std::move(htCapabilities); -} - -const std::optional& -MgtAssocRequestHeader::GetHtCapabilities() const -{ - return m_htCapability; -} - -void -MgtAssocRequestHeader::SetVhtCapabilities(const VhtCapabilities& vhtCapabilities) -{ - m_vhtCapability = vhtCapabilities; -} - -void -MgtAssocRequestHeader::SetVhtCapabilities(VhtCapabilities&& vhtCapabilities) -{ - m_vhtCapability = std::move(vhtCapabilities); -} - -const std::optional& -MgtAssocRequestHeader::GetVhtCapabilities() const -{ - return m_vhtCapability; -} - -void -MgtAssocRequestHeader::SetHeCapabilities(const HeCapabilities& heCapabilities) -{ - m_heCapability = heCapabilities; -} - -void -MgtAssocRequestHeader::SetHeCapabilities(HeCapabilities&& heCapabilities) -{ - m_heCapability = std::move(heCapabilities); -} - -const std::optional& -MgtAssocRequestHeader::GetHeCapabilities() const -{ - return m_heCapability; -} - -void -MgtAssocRequestHeader::SetEhtCapabilities(const EhtCapabilities& ehtCapabilities) -{ - m_ehtCapability = ehtCapabilities; -} - -void -MgtAssocRequestHeader::SetEhtCapabilities(EhtCapabilities&& ehtCapabilities) -{ - m_ehtCapability = std::move(ehtCapabilities); -} - -const std::optional& -MgtAssocRequestHeader::GetEhtCapabilities() const -{ - return m_ehtCapability; -} - -void -MgtAssocRequestHeader::SetMultiLinkElement(const MultiLinkElement& multiLinkElement) -{ - m_multiLinkElement = multiLinkElement; -} - -void -MgtAssocRequestHeader::SetMultiLinkElement(MultiLinkElement&& multiLinkElement) -{ - m_multiLinkElement = std::move(multiLinkElement); -} - -const std::optional& -MgtAssocRequestHeader::GetMultiLinkElement() const -{ - return m_multiLinkElement; -} - -const Ssid& -MgtAssocRequestHeader::GetSsid() const -{ - return m_ssid; -} - -const AllSupportedRates& -MgtAssocRequestHeader::GetSupportedRates() const -{ - return m_rates; -} - -uint16_t -MgtAssocRequestHeader::GetListenInterval() const -{ - return m_listenInterval; -} - TypeId MgtAssocRequestHeader::GetTypeId() { @@ -610,136 +183,63 @@ MgtAssocRequestHeader::GetInstanceTypeId() const return GetTypeId(); } +uint16_t +MgtAssocRequestHeader::GetListenInterval() const +{ + return m_listenInterval; +} + +void +MgtAssocRequestHeader::SetListenInterval(uint16_t interval) +{ + m_listenInterval = interval; +} + +const CapabilityInformation& +MgtAssocRequestHeader::Capabilities() const +{ + return m_capability; +} + +CapabilityInformation& +MgtAssocRequestHeader::Capabilities() +{ + return m_capability; +} + uint32_t -MgtAssocRequestHeader::GetSerializedSize() const +MgtAssocRequestHeader::GetSerializedSizeImpl() const { uint32_t size = 0; size += m_capability.GetSerializedSize(); - size += 2; - size += m_ssid.GetSerializedSize(); - size += m_rates.rates.GetSerializedSize(); - if (m_rates.extendedRates) - { - size += m_rates.extendedRates->GetSerializedSize(); - } - if (m_extendedCapability.has_value()) - { - size += m_extendedCapability->GetSerializedSize(); - } - if (m_htCapability.has_value()) - { - size += m_htCapability->GetSerializedSize(); - } - if (m_vhtCapability.has_value()) - { - size += m_vhtCapability->GetSerializedSize(); - } - if (m_heCapability.has_value()) - { - size += m_heCapability->GetSerializedSize(); - } - if (m_multiLinkElement.has_value()) - { - size += m_multiLinkElement->GetSerializedSize(); - } - if (m_ehtCapability.has_value()) - { - size += m_ehtCapability->GetSerializedSize(); - } + size += 2; // listen interval + size += WifiMgtHeader::GetSerializedSizeImpl(); return size; } void -MgtAssocRequestHeader::Print(std::ostream& os) const -{ - os << "ssid=" << m_ssid << ", " - << "rates=" << m_rates.rates << ", "; - if (m_rates.extendedRates.has_value()) - { - os << "Extended rates=" << *m_rates.extendedRates << ", "; - } - if (m_extendedCapability.has_value()) - { - os << "Extended Capabilities=" << *m_extendedCapability << " , "; - } - if (m_htCapability.has_value()) - { - os << "HT Capabilities=" << *m_htCapability << " , "; - } - if (m_vhtCapability.has_value()) - { - os << "VHT Capabilities=" << *m_vhtCapability << " , "; - } - if (m_heCapability.has_value()) - { - os << "HE Capabilities=" << *m_heCapability << " , "; - } - if (m_ehtCapability.has_value()) - { - os << "EHT Capabilities=" << *m_ehtCapability; - } -} - -void -MgtAssocRequestHeader::Serialize(Buffer::Iterator start) const +MgtAssocRequestHeader::SerializeImpl(Buffer::Iterator start) const { Buffer::Iterator i = start; i = m_capability.Serialize(i); i.WriteHtolsbU16(m_listenInterval); - i = m_ssid.Serialize(i); - i = m_rates.rates.Serialize(i); - if (m_rates.extendedRates) - { - i = m_rates.extendedRates->Serialize(i); - } - if (m_extendedCapability.has_value()) - { - i = m_extendedCapability->Serialize(i); - } - if (m_htCapability.has_value()) - { - i = m_htCapability->Serialize(i); - } - if (m_vhtCapability.has_value()) - { - i = m_vhtCapability->Serialize(i); - } - if (m_heCapability.has_value()) - { - i = m_heCapability->Serialize(i); - } - if (m_multiLinkElement.has_value()) - { - i = m_multiLinkElement->Serialize(i); - } - if (m_ehtCapability.has_value()) - { - i = m_ehtCapability->Serialize(i); - } + WifiMgtHeader::SerializeImpl(i); } uint32_t -MgtAssocRequestHeader::Deserialize(Buffer::Iterator start) +MgtAssocRequestHeader::DeserializeImpl(Buffer::Iterator start) { - Buffer::Iterator tmp; Buffer::Iterator i = start; i = m_capability.Deserialize(i); m_listenInterval = i.ReadLsbtohU16(); - i = m_ssid.Deserialize(i); - i = m_rates.rates.Deserialize(i); - i = WifiInformationElement::DeserializeIfPresent(m_rates.extendedRates, i); - i = WifiInformationElement::DeserializeIfPresent(m_extendedCapability, i); - i = WifiInformationElement::DeserializeIfPresent(m_htCapability, i); - i = WifiInformationElement::DeserializeIfPresent(m_vhtCapability, i); - i = WifiInformationElement::DeserializeIfPresent(m_heCapability, i); - i = WifiInformationElement::DeserializeIfPresent(m_multiLinkElement, - i, - WIFI_MAC_MGT_ASSOCIATION_REQUEST); - const bool is2_4Ghz = m_rates.IsSupportedRate( - 1000000 /* 1 Mbit/s */); // TODO: use presence of VHT capabilities IE and HE 6 GHz Band - // Capabilities IE once the later is implemented - i = WifiInformationElement::DeserializeIfPresent(m_ehtCapability, i, is2_4Ghz, m_heCapability); - return i.GetDistanceFrom(start); + auto distance = i.GetDistanceFrom(start); + return distance + WifiMgtHeader::DeserializeImpl(i); +} + +void +MgtAssocRequestHeader::InitForDeserialization(std::optional& optElem) +{ + optElem.emplace(WIFI_MAC_MGT_ASSOCIATION_REQUEST); } /*********************************************************** @@ -748,195 +248,6 @@ MgtAssocRequestHeader::Deserialize(Buffer::Iterator start) NS_OBJECT_ENSURE_REGISTERED(MgtReassocRequestHeader); -MgtReassocRequestHeader::MgtReassocRequestHeader() - : m_currentApAddr(Mac48Address()) -{ -} - -MgtReassocRequestHeader::~MgtReassocRequestHeader() -{ -} - -void -MgtReassocRequestHeader::SetSsid(const Ssid& ssid) -{ - m_ssid = ssid; -} - -void -MgtReassocRequestHeader::SetSsid(Ssid&& ssid) -{ - m_ssid = std::move(ssid); -} - -void -MgtReassocRequestHeader::SetSupportedRates(const AllSupportedRates& rates) -{ - m_rates = rates; -} - -void -MgtReassocRequestHeader::SetSupportedRates(AllSupportedRates&& rates) -{ - m_rates = std::move(rates); -} - -void -MgtReassocRequestHeader::SetListenInterval(uint16_t interval) -{ - m_listenInterval = interval; -} - -void -MgtReassocRequestHeader::SetCapabilities(const CapabilityInformation& capabilities) -{ - m_capability = capabilities; -} - -void -MgtReassocRequestHeader::SetCapabilities(CapabilityInformation&& capabilities) -{ - m_capability = std::move(capabilities); -} - -const CapabilityInformation& -MgtReassocRequestHeader::GetCapabilities() const -{ - return m_capability; -} - -void -MgtReassocRequestHeader::SetExtendedCapabilities(const ExtendedCapabilities& extendedCapabilities) -{ - m_extendedCapability = extendedCapabilities; -} - -void -MgtReassocRequestHeader::SetExtendedCapabilities(ExtendedCapabilities&& extendedCapabilities) -{ - m_extendedCapability = std::move(extendedCapabilities); -} - -const std::optional& -MgtReassocRequestHeader::GetExtendedCapabilities() const -{ - return m_extendedCapability; -} - -void -MgtReassocRequestHeader::SetHtCapabilities(const HtCapabilities& htCapabilities) -{ - m_htCapability = htCapabilities; -} - -void -MgtReassocRequestHeader::SetHtCapabilities(HtCapabilities&& htCapabilities) -{ - m_htCapability = std::move(htCapabilities); -} - -const std::optional& -MgtReassocRequestHeader::GetHtCapabilities() const -{ - return m_htCapability; -} - -void -MgtReassocRequestHeader::SetVhtCapabilities(const VhtCapabilities& vhtCapabilities) -{ - m_vhtCapability = vhtCapabilities; -} - -void -MgtReassocRequestHeader::SetVhtCapabilities(VhtCapabilities&& vhtCapabilities) -{ - m_vhtCapability = std::move(vhtCapabilities); -} - -const std::optional& -MgtReassocRequestHeader::GetVhtCapabilities() const -{ - return m_vhtCapability; -} - -void -MgtReassocRequestHeader::SetHeCapabilities(const HeCapabilities& heCapabilities) -{ - m_heCapability = heCapabilities; -} - -void -MgtReassocRequestHeader::SetHeCapabilities(HeCapabilities&& heCapabilities) -{ - m_heCapability = std::move(heCapabilities); -} - -const std::optional& -MgtReassocRequestHeader::GetHeCapabilities() const -{ - return m_heCapability; -} - -void -MgtReassocRequestHeader::SetEhtCapabilities(const EhtCapabilities& ehtCapabilities) -{ - m_ehtCapability = ehtCapabilities; -} - -void -MgtReassocRequestHeader::SetEhtCapabilities(EhtCapabilities&& ehtCapabilities) -{ - m_ehtCapability = std::move(ehtCapabilities); -} - -const std::optional& -MgtReassocRequestHeader::GetEhtCapabilities() const -{ - return m_ehtCapability; -} - -void -MgtReassocRequestHeader::SetMultiLinkElement(const MultiLinkElement& multiLinkElement) -{ - m_multiLinkElement = multiLinkElement; -} - -void -MgtReassocRequestHeader::SetMultiLinkElement(MultiLinkElement&& multiLinkElement) -{ - m_multiLinkElement = std::move(multiLinkElement); -} - -const std::optional& -MgtReassocRequestHeader::GetMultiLinkElement() const -{ - return m_multiLinkElement; -} - -const Ssid& -MgtReassocRequestHeader::GetSsid() const -{ - return m_ssid; -} - -const AllSupportedRates& -MgtReassocRequestHeader::GetSupportedRates() const -{ - return m_rates; -} - -uint16_t -MgtReassocRequestHeader::GetListenInterval() const -{ - return m_listenInterval; -} - -void -MgtReassocRequestHeader::SetCurrentApAddress(Mac48Address currentApAddr) -{ - m_currentApAddr = currentApAddr; -} - TypeId MgtReassocRequestHeader::GetTypeId() { @@ -953,140 +264,79 @@ MgtReassocRequestHeader::GetInstanceTypeId() const return GetTypeId(); } +uint16_t +MgtReassocRequestHeader::GetListenInterval() const +{ + return m_listenInterval; +} + +void +MgtReassocRequestHeader::SetListenInterval(uint16_t interval) +{ + m_listenInterval = interval; +} + +const CapabilityInformation& +MgtReassocRequestHeader::Capabilities() const +{ + return m_capability; +} + +CapabilityInformation& +MgtReassocRequestHeader::Capabilities() +{ + return m_capability; +} + +void +MgtReassocRequestHeader::SetCurrentApAddress(Mac48Address currentApAddr) +{ + m_currentApAddr = currentApAddr; +} + uint32_t -MgtReassocRequestHeader::GetSerializedSize() const +MgtReassocRequestHeader::GetSerializedSizeImpl() const { uint32_t size = 0; size += m_capability.GetSerializedSize(); size += 2; // listen interval size += 6; // current AP address - size += m_ssid.GetSerializedSize(); - size += m_rates.rates.GetSerializedSize(); - if (m_rates.extendedRates) - { - size += m_rates.extendedRates->GetSerializedSize(); - } - if (m_extendedCapability.has_value()) - { - size += m_extendedCapability->GetSerializedSize(); - } - if (m_htCapability.has_value()) - { - size += m_htCapability->GetSerializedSize(); - } - if (m_vhtCapability.has_value()) - { - size += m_vhtCapability->GetSerializedSize(); - } - if (m_heCapability.has_value()) - { - size += m_heCapability->GetSerializedSize(); - } - if (m_multiLinkElement.has_value()) - { - size += m_multiLinkElement->GetSerializedSize(); - } - if (m_ehtCapability.has_value()) - { - size += m_ehtCapability->GetSerializedSize(); - } + size += WifiMgtHeader::GetSerializedSizeImpl(); return size; } void -MgtReassocRequestHeader::Print(std::ostream& os) const +MgtReassocRequestHeader::PrintImpl(std::ostream& os) const { - os << "current AP address=" << m_currentApAddr << ", " - << "ssid=" << m_ssid << ", " - << "rates=" << m_rates.rates << ", "; - if (m_rates.extendedRates.has_value()) - { - os << "Extended rates=" << *m_rates.extendedRates << ", "; - } - if (m_extendedCapability.has_value()) - { - os << "Extended Capabilities=" << *m_extendedCapability << " , "; - } - if (m_htCapability.has_value()) - { - os << "HT Capabilities=" << *m_htCapability << " , "; - } - if (m_vhtCapability.has_value()) - { - os << "VHT Capabilities=" << *m_vhtCapability << " , "; - } - if (m_heCapability.has_value()) - { - os << "HE Capabilities=" << *m_heCapability << " , "; - } - if (m_ehtCapability.has_value()) - { - os << "EHT Capabilities=" << *m_ehtCapability; - } + os << "current AP address=" << m_currentApAddr << ", "; + WifiMgtHeader::PrintImpl(os); } void -MgtReassocRequestHeader::Serialize(Buffer::Iterator start) const +MgtReassocRequestHeader::SerializeImpl(Buffer::Iterator start) const { Buffer::Iterator i = start; i = m_capability.Serialize(i); i.WriteHtolsbU16(m_listenInterval); WriteTo(i, m_currentApAddr); - i = m_ssid.Serialize(i); - i = m_rates.rates.Serialize(i); - if (m_rates.extendedRates) - { - i = m_rates.extendedRates->Serialize(i); - } - if (m_extendedCapability.has_value()) - { - i = m_extendedCapability->Serialize(i); - } - if (m_htCapability.has_value()) - { - i = m_htCapability->Serialize(i); - } - if (m_vhtCapability.has_value()) - { - i = m_vhtCapability->Serialize(i); - } - if (m_heCapability.has_value()) - { - i = m_heCapability->Serialize(i); - } - if (m_multiLinkElement.has_value()) - { - i = m_multiLinkElement->Serialize(i); - } - if (m_ehtCapability.has_value()) - { - i = m_ehtCapability->Serialize(i); - } + WifiMgtHeader::SerializeImpl(i); } uint32_t -MgtReassocRequestHeader::Deserialize(Buffer::Iterator start) +MgtReassocRequestHeader::DeserializeImpl(Buffer::Iterator start) { - Buffer::Iterator tmp; Buffer::Iterator i = start; i = m_capability.Deserialize(i); m_listenInterval = i.ReadLsbtohU16(); ReadFrom(i, m_currentApAddr); - i = m_ssid.Deserialize(i); - i = m_rates.rates.Deserialize(i); - i = WifiInformationElement::DeserializeIfPresent(m_rates.extendedRates, i); - i = WifiInformationElement::DeserializeIfPresent(m_extendedCapability, i); - i = WifiInformationElement::DeserializeIfPresent(m_htCapability, i); - i = WifiInformationElement::DeserializeIfPresent(m_vhtCapability, i); - i = WifiInformationElement::DeserializeIfPresent(m_heCapability, i); - i = WifiInformationElement::DeserializeIfPresent(m_multiLinkElement, - i, - WIFI_MAC_MGT_REASSOCIATION_REQUEST); - const bool is2_4Ghz = m_rates.IsSupportedRate( - 1000000 /* 1 Mbit/s */); // TODO: use presence of VHT capabilities IE and HE 6 GHz Band - // Capabilities IE once the later is implemented - i = WifiInformationElement::DeserializeIfPresent(m_ehtCapability, i, is2_4Ghz, m_heCapability); - return i.GetDistanceFrom(start); + auto distance = i.GetDistanceFrom(start); + return distance + WifiMgtHeader::DeserializeImpl(i); +} + +void +MgtReassocRequestHeader::InitForDeserialization(std::optional& optElem) +{ + optElem.emplace(WIFI_MAC_MGT_REASSOCIATION_REQUEST); } /*********************************************************** diff --git a/src/wifi/model/mgt-headers.h b/src/wifi/model/mgt-headers.h index e543afe45..fe41e5c60 100644 --- a/src/wifi/model/mgt-headers.h +++ b/src/wifi/model/mgt-headers.h @@ -48,6 +48,16 @@ namespace ns3 { +/// List of Information Elements included in Probe Request frames +using ProbeRequestElems = std::tuple, + std::optional, + std::optional, + std::optional, + std::optional, + std::optional>; + /// List of Information Elements included in Probe Response frames using ProbeResponseElems = std::tuple, std::optional>; +/// List of Information Elements included in Association Request frames +using AssocRequestElems = std::tuple, + std::optional, + std::optional, + std::optional, + std::optional, + std::optional, + std::optional>; + /// List of Information Elements included in Association Response frames using AssocResponseElems = std::tuple, @@ -88,169 +109,12 @@ using AssocResponseElems = std::tuple { + friend class WifiMgtHeader; + public: - MgtAssocRequestHeader(); - ~MgtAssocRequestHeader() override; - - /** - * Set the Service Set Identifier (SSID). - * - * \param ssid SSID - */ - void SetSsid(const Ssid& ssid); - - /** \copydoc SetSsid */ - void SetSsid(Ssid&& ssid); - - /** - * Set the supported rates. - * - * \param rates the supported rates - */ - void SetSupportedRates(const AllSupportedRates& rates); - - /** \copydoc SetSupportedRates */ - void SetSupportedRates(AllSupportedRates&& rates); - - /** - * Set the listen interval. - * - * \param interval the listen interval - */ - void SetListenInterval(uint16_t interval); - - /** - * Set the Capability information. - * - * \param capabilities Capability information - */ - void SetCapabilities(const CapabilityInformation& capabilities); - - /** \copydoc SetCapabilities */ - void SetCapabilities(CapabilityInformation&& capabilities); - - /** - * Set the Extended Capabilities. - * - * \param extendedCapabilities the Extended Capabilities - */ - void SetExtendedCapabilities(const ExtendedCapabilities& extendedCapabilities); - - /** \copydoc SetExtendedCapabilities */ - void SetExtendedCapabilities(ExtendedCapabilities&& extendedCapabilities); - - /** - * Set the HT capabilities. - * - * \param htCapabilities HT capabilities - */ - void SetHtCapabilities(const HtCapabilities& htCapabilities); - - /** \copydoc SetHtCapabilities */ - void SetHtCapabilities(HtCapabilities&& htCapabilities); - - /** - * Set the VHT capabilities. - * - * \param vhtCapabilities VHT capabilities - */ - void SetVhtCapabilities(const VhtCapabilities& vhtCapabilities); - - /** \copydoc SetVhtCapabilities */ - void SetVhtCapabilities(VhtCapabilities&& vhtCapabilities); - - /** - * Set the HE capabilities. - * - * \param heCapabilities HE capabilities - */ - void SetHeCapabilities(const HeCapabilities& heCapabilities); - - /** \copydoc SetHeCapabilities */ - void SetHeCapabilities(HeCapabilities&& heCapabilities); - - /** - * Set the EHT capabilities. - * - * \param ehtCapabilities EHT capabilities - */ - void SetEhtCapabilities(const EhtCapabilities& ehtCapabilities); - - /** \copydoc SetEhtCapabilities */ - void SetEhtCapabilities(EhtCapabilities&& ehtCapabilities); - - /** - * Set the Multi-Link Element information element - * - * \param multiLinkElement the Multi-Link Element information element - */ - void SetMultiLinkElement(const MultiLinkElement& multiLinkElement); - - /** \copydoc SetMultiLinkElement */ - void SetMultiLinkElement(MultiLinkElement&& multiLinkElement); - - /** - * Return the Capability information. - * - * \return Capability information - */ - const CapabilityInformation& GetCapabilities() const; - /** - * Return the extended capabilities, if present. - * - * \return the extended capabilities, if present - */ - const std::optional& GetExtendedCapabilities() const; - /** - * Return the HT capabilities, if present. - * - * \return HT capabilities, if present - */ - const std::optional& GetHtCapabilities() const; - /** - * Return the VHT capabilities, if present. - * - * \return VHT capabilities, if present - */ - const std::optional& GetVhtCapabilities() const; - /** - * Return the HE capabilities, if present. - * - * \return HE capabilities, if present - */ - const std::optional& GetHeCapabilities() const; - /** - * Return the EHT capabilities, if present. - * - * \return EHT capabilities, if present - */ - const std::optional& GetEhtCapabilities() const; - /** - * Return the Service Set Identifier (SSID). - * - * \return SSID - */ - const Ssid& GetSsid() const; - /** - * Return the supported rates. - * - * \return the supported rates - */ - const AllSupportedRates& GetSupportedRates() const; - /** - * Return the listen interval. - * - * \return the listen interval - */ - uint16_t GetListenInterval() const; - /** - * Return the Multi-Link Element information element, if present. - * - * \return the Multi-Link Element information element, if present - */ - const std::optional& GetMultiLinkElement() const; + ~MgtAssocRequestHeader() override = default; /** * Register this type. @@ -258,54 +122,8 @@ class MgtAssocRequestHeader : public Header */ static TypeId GetTypeId(); + /** \copydoc Header::GetInstanceTypeId */ TypeId GetInstanceTypeId() const override; - void Print(std::ostream& os) const override; - uint32_t GetSerializedSize() const override; - void Serialize(Buffer::Iterator start) const override; - uint32_t Deserialize(Buffer::Iterator start) override; - - private: - Ssid m_ssid; //!< Service Set ID (SSID) - AllSupportedRates m_rates; //!< List of supported rates - CapabilityInformation m_capability; //!< Capability information - std::optional m_extendedCapability; //!< Extended capabilities - std::optional m_htCapability; //!< HT capabilities - std::optional m_vhtCapability; //!< VHT capabilities - std::optional m_heCapability; //!< HE capabilities - uint16_t m_listenInterval; //!< listen interval - std::optional m_ehtCapability; //!< EHT capabilities - std::optional m_multiLinkElement; //!< Multi-Link Element -}; - -/** - * \ingroup wifi - * Implement the header for management frames of type reassociation request. - */ -class MgtReassocRequestHeader : public Header -{ - public: - MgtReassocRequestHeader(); - ~MgtReassocRequestHeader() override; - - /** - * Set the Service Set Identifier (SSID). - * - * \param ssid SSID - */ - void SetSsid(const Ssid& ssid); - - /** \copydoc SetSsid */ - void SetSsid(Ssid&& ssid); - - /** - * Set the supported rates. - * - * \param rates the supported rates - */ - void SetSupportedRates(const AllSupportedRates& rates); - - /** \copydoc SetSupportedRates */ - void SetSupportedRates(AllSupportedRates&& rates); /** * Set the listen interval. @@ -313,137 +131,82 @@ class MgtReassocRequestHeader : public Header * \param interval the listen interval */ void SetListenInterval(uint16_t interval); - - /** - * Set the Capability information. - * - * \param capabilities Capability information - */ - void SetCapabilities(const CapabilityInformation& capabilities); - - /** \copydoc SetCapabilities */ - void SetCapabilities(CapabilityInformation&& capabilities); - - /** - * Set the Extended Capabilities. - * - * \param extendedCapabilities the Extended Capabilities - */ - void SetExtendedCapabilities(const ExtendedCapabilities& extendedCapabilities); - - /** \copydoc SetExtendedCapabilities */ - void SetExtendedCapabilities(ExtendedCapabilities&& extendedCapabilities); - - /** - * Set the HT capabilities. - * - * \param htCapabilities HT capabilities - */ - void SetHtCapabilities(const HtCapabilities& htCapabilities); - - /** \copydoc SetHtCapabilities */ - void SetHtCapabilities(HtCapabilities&& htCapabilities); - - /** - * Set the VHT capabilities. - * - * \param vhtCapabilities VHT capabilities - */ - void SetVhtCapabilities(const VhtCapabilities& vhtCapabilities); - - /** \copydoc SetVhtCapabilities */ - void SetVhtCapabilities(VhtCapabilities&& vhtCapabilities); - - /** - * Set the HE capabilities. - * - * \param heCapabilities HE capabilities - */ - void SetHeCapabilities(const HeCapabilities& heCapabilities); - - /** \copydoc SetHeCapabilities */ - void SetHeCapabilities(HeCapabilities&& heCapabilities); - - /** - * Set the EHT capabilities. - * - * \param ehtCapabilities EHT capabilities - */ - void SetEhtCapabilities(const EhtCapabilities& ehtCapabilities); - - /** \copydoc SetEhtCapabilities */ - void SetEhtCapabilities(EhtCapabilities&& ehtCapabilities); - - /** - * Set the Multi-Link Element information element - * - * \param multiLinkElement the Multi-Link Element information element - */ - void SetMultiLinkElement(const MultiLinkElement& multiLinkElement); - - /** \copydoc SetMultiLinkElement */ - void SetMultiLinkElement(MultiLinkElement&& multiLinkElement); - - /** - * Return the Capability information. - * - * \return Capability information - */ - const CapabilityInformation& GetCapabilities() const; - /** - * Return the extended capabilities, if present. - * - * \return the extended capabilities, if present - */ - const std::optional& GetExtendedCapabilities() const; - /** - * Return the HT capabilities, if present. - * - * \return HT capabilities, if present - */ - const std::optional& GetHtCapabilities() const; - /** - * Return the VHT capabilities, if present. - * - * \return VHT capabilities, if present - */ - const std::optional& GetVhtCapabilities() const; - /** - * Return the HE capabilities, if present. - * - * \return HE capabilities, if present - */ - const std::optional& GetHeCapabilities() const; - /** - * Return the EHT capabilities, if present. - * - * \return EHT capabilities, if present - */ - const std::optional& GetEhtCapabilities() const; - /** - * Return the Service Set Identifier (SSID). - * - * \return SSID - */ - const Ssid& GetSsid() const; - /** - * Return the supported rates. - * - * \return the supported rates - */ - const AllSupportedRates& GetSupportedRates() const; - /** - * Return the Multi-Link Element information element, if present. - * - * \return the Multi-Link Element information element, if present - */ - const std::optional& GetMultiLinkElement() const; /** * Return the listen interval. * * \return the listen interval */ uint16_t GetListenInterval() const; + /** + * \return a reference to the Capability information + */ + CapabilityInformation& Capabilities(); + /** + * \return a const reference to the Capability information + */ + const CapabilityInformation& Capabilities() const; + + protected: + /** \copydoc Header::GetSerializedSize */ + uint32_t GetSerializedSizeImpl() const; + /** \copydoc Header::Serialize */ + void SerializeImpl(Buffer::Iterator start) const; + /** \copydoc Header::Deserialize */ + uint32_t DeserializeImpl(Buffer::Iterator start); + + private: + using WifiMgtHeader::InitForDeserialization; + + /** + * \param optElem the MultiLinkElement object to initialize for deserializing the + * information element into + */ + void InitForDeserialization(std::optional& optElem); + + CapabilityInformation m_capability; //!< Capability information + uint16_t m_listenInterval{0}; //!< listen interval +}; + +/** + * \ingroup wifi + * Implement the header for management frames of type reassociation request. + */ +class MgtReassocRequestHeader : public WifiMgtHeader +{ + friend class WifiMgtHeader; + + public: + ~MgtReassocRequestHeader() override = default; + + /** + * Register this type. + * \return The TypeId. + */ + static TypeId GetTypeId(); + + /** \copydoc Header::GetInstanceTypeId */ + TypeId GetInstanceTypeId() const override; + + /** + * Set the listen interval. + * + * \param interval the listen interval + */ + void SetListenInterval(uint16_t interval); + /** + * Return the listen interval. + * + * \return the listen interval + */ + uint16_t GetListenInterval() const; + /** + * \return a reference to the Capability information + */ + CapabilityInformation& Capabilities(); + /** + * \return a const reference to the Capability information + */ + const CapabilityInformation& Capabilities() const; /** * Set the address of the current access point. * @@ -451,29 +214,28 @@ class MgtReassocRequestHeader : public Header */ void SetCurrentApAddress(Mac48Address currentApAddr); - /** - * Register this type. - * \return The TypeId. - */ - static TypeId GetTypeId(); - TypeId GetInstanceTypeId() const override; - void Print(std::ostream& os) const override; - uint32_t GetSerializedSize() const override; - void Serialize(Buffer::Iterator start) const override; - uint32_t Deserialize(Buffer::Iterator start) override; + protected: + /** \copydoc Header::GetSerializedSize */ + uint32_t GetSerializedSizeImpl() const; + /** \copydoc Header::Serialize */ + void SerializeImpl(Buffer::Iterator start) const; + /** \copydoc Header::Deserialize */ + uint32_t DeserializeImpl(Buffer::Iterator start); + /** \copydoc Header::Print */ + void PrintImpl(std::ostream& os) const; private: + using WifiMgtHeader::InitForDeserialization; + + /** + * \param optElem the MultiLinkElement object to initialize for deserializing the + * information element into + */ + void InitForDeserialization(std::optional& optElem); + Mac48Address m_currentApAddr; //!< Address of the current access point - Ssid m_ssid; //!< Service Set ID (SSID) - AllSupportedRates m_rates; //!< List of supported rates CapabilityInformation m_capability; //!< Capability information - std::optional m_extendedCapability; //!< Extended capabilities - std::optional m_htCapability; //!< HT capabilities - std::optional m_vhtCapability; //!< VHT capabilities - std::optional m_heCapability; //!< HE capabilities - uint16_t m_listenInterval; //!< listen interval - std::optional m_ehtCapability; //!< EHT capabilities - std::optional m_multiLinkElement; //!< Multi-Link Element + uint16_t m_listenInterval{0}; //!< listen interval }; /** @@ -557,149 +319,19 @@ class MgtAssocResponseHeader : public WifiMgtHeader { public: - ~MgtProbeRequestHeader() override; - - /** - * Set the Service Set Identifier (SSID). - * - * \param ssid SSID - */ - void SetSsid(const Ssid& ssid); - - /** \copydoc SetSsid */ - void SetSsid(Ssid&& ssid); - - /** - * Set the supported rates. - * - * \param rates the supported rates - */ - void SetSupportedRates(const AllSupportedRates& rates); - - /** \copydoc SetSupportedRates */ - void SetSupportedRates(AllSupportedRates&& rates); - - /** - * Set the extended capabilities. - * - * \param extendedCapabilities the extended capabilities - */ - void SetExtendedCapabilities(const ExtendedCapabilities& extendedCapabilities); - - /** \copydoc SetExtendedCapabilities */ - void SetExtendedCapabilities(ExtendedCapabilities&& extendedCapabilities); - - /** - * Set the HT capabilities. - * - * \param htCapabilities HT capabilities - */ - void SetHtCapabilities(const HtCapabilities& htCapabilities); - - /** \copydoc SetHtCapabilities */ - void SetHtCapabilities(HtCapabilities&& htCapabilities); - - /** - * Set the VHT capabilities. - * - * \param vhtCapabilities VHT capabilities - */ - void SetVhtCapabilities(const VhtCapabilities& vhtCapabilities); - - /** \copydoc SetVhtCapabilities */ - void SetVhtCapabilities(VhtCapabilities&& vhtCapabilities); - - /** - * Set the HE capabilities. - * - * \param heCapabilities HE capabilities - */ - void SetHeCapabilities(const HeCapabilities& heCapabilities); - - /** \copydoc SetHeCapabilities */ - void SetHeCapabilities(HeCapabilities&& heCapabilities); - - /** - * Set the EHT capabilities. - * - * \param ehtCapabilities EHT capabilities - */ - void SetEhtCapabilities(const EhtCapabilities& ehtCapabilities); - - /** \copydoc SetEhtCapabilities */ - void SetEhtCapabilities(EhtCapabilities&& ehtCapabilities); - - /** - * Return the Service Set Identifier (SSID). - * - * \return SSID - */ - const Ssid& GetSsid() const; - - /** - * Return the supported rates. - * - * \return the supported rates - */ - const AllSupportedRates& GetSupportedRates() const; - - /** - * Return the extended capabilities, if present. - * - * \return the extended capabilities, if present - */ - const std::optional& GetExtendedCapabilities() const; - - /** - * Return the HT capabilities, if present. - * - * \return HT capabilities, if present - */ - const std::optional& GetHtCapabilities() const; - - /** - * Return the VHT capabilities, if present. - * - * \return VHT capabilities, if present - */ - const std::optional& GetVhtCapabilities() const; - - /** - * Return the HE capabilities, if present. - * - * \return HE capabilities, if present - */ - const std::optional& GetHeCapabilities() const; - - /** - * Return the EHT capabilities, if present. - * - * \return EHT capabilities, if present - */ - const std::optional& GetEhtCapabilities() const; + ~MgtProbeRequestHeader() override = default; /** * Register this type. * \return The TypeId. */ static TypeId GetTypeId(); - TypeId GetInstanceTypeId() const override; - void Print(std::ostream& os) const override; - uint32_t GetSerializedSize() const override; - void Serialize(Buffer::Iterator start) const override; - uint32_t Deserialize(Buffer::Iterator start) override; - private: - Ssid m_ssid; //!< Service Set ID (SSID) - AllSupportedRates m_rates; //!< List of supported rates - std::optional m_extendedCapability; //!< extended capabilities - std::optional m_htCapability; //!< HT capabilities - std::optional m_vhtCapability; //!< VHT capabilities - std::optional m_heCapability; //!< HE capabilities - std::optional m_ehtCapability; //!< EHT capabilities + /** \copydoc Header::GetInstanceTypeId */ + TypeId GetInstanceTypeId() const override; }; /** diff --git a/src/wifi/model/sta-wifi-mac.cc b/src/wifi/model/sta-wifi-mac.cc index 8e2a4f141..2b77e799d 100644 --- a/src/wifi/model/sta-wifi-mac.cc +++ b/src/wifi/model/sta-wifi-mac.cc @@ -253,24 +253,26 @@ StaWifiMac::SendProbeRequest() hdr.SetDsNotTo(); Ptr packet = Create(); MgtProbeRequestHeader probe; - probe.SetSsid(GetSsid()); - probe.SetSupportedRates(GetSupportedRates(SINGLE_LINK_OP_ID)); + probe.Get() = GetSsid(); + auto supportedRates = GetSupportedRates(SINGLE_LINK_OP_ID); + probe.Get() = supportedRates.rates; + probe.Get() = supportedRates.extendedRates; if (GetHtSupported()) { - probe.SetExtendedCapabilities(GetExtendedCapabilities()); - probe.SetHtCapabilities(GetHtCapabilities(SINGLE_LINK_OP_ID)); + probe.Get() = GetExtendedCapabilities(); + probe.Get() = GetHtCapabilities(SINGLE_LINK_OP_ID); } if (GetVhtSupported(SINGLE_LINK_OP_ID)) { - probe.SetVhtCapabilities(GetVhtCapabilities(SINGLE_LINK_OP_ID)); + probe.Get() = GetVhtCapabilities(SINGLE_LINK_OP_ID); } if (GetHeSupported()) { - probe.SetHeCapabilities(GetHeCapabilities(SINGLE_LINK_OP_ID)); + probe.Get() = GetHeCapabilities(SINGLE_LINK_OP_ID); } if (GetEhtSupported()) { - probe.SetEhtCapabilities(GetEhtCapabilities(SINGLE_LINK_OP_ID)); + probe.Get() = GetEhtCapabilities(SINGLE_LINK_OP_ID); } packet->AddHeader(probe); @@ -311,26 +313,28 @@ StaWifiMac::GetAssociationRequest(bool isReassoc, uint8_t linkId) const // lambda to set the fields of the (Re)Association Request auto fill = [&](auto&& frame) { - frame.SetSsid(GetSsid()); - frame.SetSupportedRates(GetSupportedRates(linkId)); - frame.SetCapabilities(GetCapabilities(linkId)); + frame.template Get() = GetSsid(); + auto supportedRates = GetSupportedRates(linkId); + frame.template Get() = supportedRates.rates; + frame.template Get() = supportedRates.extendedRates; + frame.Capabilities() = GetCapabilities(linkId); frame.SetListenInterval(0); if (GetHtSupported()) { - frame.SetExtendedCapabilities(GetExtendedCapabilities()); - frame.SetHtCapabilities(GetHtCapabilities(linkId)); + frame.template Get() = GetExtendedCapabilities(); + frame.template Get() = GetHtCapabilities(linkId); } if (GetVhtSupported(linkId)) { - frame.SetVhtCapabilities(GetVhtCapabilities(linkId)); + frame.template Get() = GetVhtCapabilities(linkId); } if (GetHeSupported()) { - frame.SetHeCapabilities(GetHeCapabilities(linkId)); + frame.template Get() = GetHeCapabilities(linkId); } if (GetEhtSupported()) { - frame.SetEhtCapabilities(GetEhtCapabilities(linkId)); + frame.template Get() = GetEhtCapabilities(linkId); } }; @@ -421,7 +425,7 @@ StaWifiMac::SendAssociationRequest(bool isReassoc) GetWifiRemoteStationManager(linkId)->GetMldAddress(*link.bssid).has_value()) { auto addMle = [&](auto&& frame) { - frame.SetMultiLinkElement(GetMultiLinkElement(isReassoc, linkId)); + frame.template Get() = GetMultiLinkElement(isReassoc, linkId); }; std::visit(addMle, frame); } diff --git a/src/wifi/test/wifi-eht-info-elems-test.cc b/src/wifi/test/wifi-eht-info-elems-test.cc index c3c82a032..4ba089076 100644 --- a/src/wifi/test/wifi-eht-info-elems-test.cc +++ b/src/wifi/test/wifi-eht-info-elems-test.cc @@ -147,9 +147,9 @@ BasicMultiLinkElementTest::DoRun() capabilities.SetEss(); MgtAssocRequestHeader assoc; - assoc.SetSsid(Ssid("MySsid")); - assoc.SetSupportedRates(rates); - assoc.SetCapabilities(capabilities); + assoc.Get() = Ssid("MySsid"); + assoc.Get() = rates.rates; + assoc.Capabilities() = capabilities; assoc.SetListenInterval(0); MultiLinkElement::PerStaProfileSubelement perStaProfile(MultiLinkElement::BASIC_VARIANT, diff --git a/src/wifi/test/wifi-mlo-test.cc b/src/wifi/test/wifi-mlo-test.cc index 0d6d40f79..c28b064e9 100644 --- a/src/wifi/test/wifi-mlo-test.cc +++ b/src/wifi/test/wifi-mlo-test.cc @@ -756,7 +756,7 @@ MultiLinkSetupTest::CheckAssocRequest(Ptr mpdu, uint8_t linkId) "TA of Assoc Request frame is not the address of the link it is transmitted on"); MgtAssocRequestHeader assoc; mpdu->GetPacket()->PeekHeader(assoc); - const auto& mle = assoc.GetMultiLinkElement(); + const auto& mle = assoc.Get(); if (m_apMac->GetNLinks() == 1 || m_staMacs[0]->GetNLinks() == 1) {