diff --git a/src/wifi/model/ap-wifi-mac.cc b/src/wifi/model/ap-wifi-mac.cc index a9eb399e8..5a8719fb1 100644 --- a/src/wifi/model/ap-wifi-mac.cc +++ b/src/wifi/model/ap-wifi-mac.cc @@ -463,21 +463,20 @@ ErpInformation ApWifiMac::GetErpInformation (uint8_t linkId) const { NS_LOG_FUNCTION (this << +linkId); + NS_ASSERT (GetErpSupported (linkId)); ErpInformation information; - information.SetErpSupported (1); - if (GetErpSupported (linkId)) + + information.SetNonErpPresent (m_numNonErpStations > 0); + information.SetUseProtection (GetUseNonErpProtection ()); + if (m_shortPreambleEnabled) { - information.SetNonErpPresent (m_numNonErpStations > 0); - information.SetUseProtection (GetUseNonErpProtection ()); - if (m_shortPreambleEnabled) - { - information.SetBarkerPreambleMode (0); - } - else - { - information.SetBarkerPreambleMode (1); - } + information.SetBarkerPreambleMode (0); } + else + { + information.SetBarkerPreambleMode (1); + } + return information; } diff --git a/src/wifi/model/mgt-headers.cc b/src/wifi/model/mgt-headers.cc index 9c732db11..755b4494d 100644 --- a/src/wifi/model/mgt-headers.cc +++ b/src/wifi/model/mgt-headers.cc @@ -496,7 +496,7 @@ MgtProbeResponseHeader::SetErpInformation (ErpInformation&& erpInformation) m_erpInformation = std::move (erpInformation); } -const ErpInformation& +const std::optional& MgtProbeResponseHeader::GetErpInformation (void) const { return m_erpInformation; @@ -589,7 +589,7 @@ MgtProbeResponseHeader::GetSerializedSize (void) const size += m_ssid.GetSerializedSize (); size += m_rates.GetSerializedSize (); size += m_dsssParameterSet.GetSerializedSize (); - size += m_erpInformation.GetSerializedSize (); + if (m_erpInformation.has_value ()) size += m_erpInformation->GetSerializedSize (); size += m_rates.extended.GetSerializedSize (); size += m_edcaParameterSet.GetSerializedSize (); size += m_extendedCapability.GetSerializedSize (); @@ -610,9 +610,9 @@ void MgtProbeResponseHeader::Print (std::ostream &os) const { os << "ssid=" << m_ssid << ", " - << "rates=" << m_rates << ", " - << "ERP information=" << m_erpInformation << ", " - << "Extended Capabilities=" << m_extendedCapability << " , "; + << "rates=" << m_rates << ", "; + if (m_erpInformation.has_value ()) os << "ERP information=" << *m_erpInformation << ", "; + os << "Extended Capabilities=" << m_extendedCapability << " , "; if (m_htCapability.has_value ()) os << "HT Capabilities=" << *m_htCapability << " , "; if (m_htOperation.has_value ()) os << "HT Operation=" << *m_htOperation << " , "; if (m_vhtCapability.has_value ()) os << "VHT Capabilities=" << *m_vhtCapability << " , "; @@ -632,7 +632,7 @@ MgtProbeResponseHeader::Serialize (Buffer::Iterator start) const i = m_ssid.Serialize (i); i = m_rates.Serialize (i); i = m_dsssParameterSet.Serialize (i); - i = m_erpInformation.Serialize (i); + if (m_erpInformation.has_value ()) i = m_erpInformation->Serialize (i); i = m_rates.extended.Serialize (i); i = m_edcaParameterSet.Serialize (i); i = m_extendedCapability.Serialize (i); @@ -659,7 +659,7 @@ MgtProbeResponseHeader::Deserialize (Buffer::Iterator start) i = m_ssid.Deserialize (i); i = m_rates.Deserialize (i); i = m_dsssParameterSet.DeserializeIfPresent (i); - i = m_erpInformation.DeserializeIfPresent (i); + i = WifiInformationElement::DeserializeIfPresent (m_erpInformation, i); i = m_rates.extended.DeserializeIfPresent (i); i = m_edcaParameterSet.DeserializeIfPresent (i); i = m_extendedCapability.DeserializeIfPresent (i); @@ -1488,7 +1488,7 @@ MgtAssocResponseHeader::SetErpInformation (ErpInformation&& erpInformation) m_erpInformation = std::move (erpInformation); } -const ErpInformation& +const std::optional& MgtAssocResponseHeader::GetErpInformation (void) const { return m_erpInformation; @@ -1555,7 +1555,7 @@ MgtAssocResponseHeader::GetSerializedSize (void) const size += m_code.GetSerializedSize (); size += 2; //aid size += m_rates.GetSerializedSize (); - size += m_erpInformation.GetSerializedSize (); + if (m_erpInformation.has_value ()) size += m_erpInformation->GetSerializedSize (); size += m_rates.extended.GetSerializedSize (); size += m_edcaParameterSet.GetSerializedSize (); size += m_extendedCapability.GetSerializedSize (); @@ -1576,9 +1576,9 @@ MgtAssocResponseHeader::Print (std::ostream &os) const { os << "status code=" << m_code << ", " << "aid=" << m_aid << ", " - << "rates=" << m_rates << ", " - << "ERP information=" << m_erpInformation << ", " - << "Extended Capabilities=" << m_extendedCapability << " , "; + << "rates=" << m_rates << ", "; + if (m_erpInformation.has_value ()) os << "ERP information=" << *m_erpInformation << ", "; + os << "Extended Capabilities=" << m_extendedCapability << " , "; if (m_htCapability.has_value ()) os << "HT Capabilities=" << *m_htCapability << " , "; if (m_htOperation.has_value ()) os << "HT Operation=" << *m_htOperation << " , "; if (m_vhtCapability.has_value ()) os << "VHT Capabilities=" << *m_vhtCapability << " , "; @@ -1596,7 +1596,7 @@ MgtAssocResponseHeader::Serialize (Buffer::Iterator start) const i = m_code.Serialize (i); i.WriteHtolsbU16 (m_aid); i = m_rates.Serialize (i); - i = m_erpInformation.Serialize (i); + if (m_erpInformation.has_value ()) i = m_erpInformation->Serialize (i); i = m_rates.extended.Serialize (i); i = m_edcaParameterSet.Serialize (i); i = m_extendedCapability.Serialize (i); @@ -1619,7 +1619,7 @@ MgtAssocResponseHeader::Deserialize (Buffer::Iterator start) i = m_code.Deserialize (i); m_aid = i.ReadLsbtohU16 (); i = m_rates.Deserialize (i); - i = m_erpInformation.DeserializeIfPresent (i); + i = WifiInformationElement::DeserializeIfPresent (m_erpInformation, i); i = m_rates.extended.DeserializeIfPresent (i); i = m_edcaParameterSet.DeserializeIfPresent (i); i = m_extendedCapability.DeserializeIfPresent (i); diff --git a/src/wifi/model/mgt-headers.h b/src/wifi/model/mgt-headers.h index d00c76177..9a4300b52 100644 --- a/src/wifi/model/mgt-headers.h +++ b/src/wifi/model/mgt-headers.h @@ -528,11 +528,11 @@ public: */ uint16_t GetAssociationId (void) const; /** - * Return the ERP information. + * Return the ERP information, if present. * - * \return the ERP information + * \return the ERP information, if present */ - const ErpInformation& GetErpInformation (void) const; + const std::optional& GetErpInformation (void) const; /** * Return the EDCA Parameter Set. * @@ -718,7 +718,7 @@ private: std::optional m_htOperation; //!< HT operation std::optional m_vhtCapability; //!< VHT capabilities std::optional m_vhtOperation; //!< VHT operation - ErpInformation m_erpInformation; //!< ERP information + std::optional m_erpInformation; //!< ERP information EdcaParameterSet m_edcaParameterSet; //!< EDCA Parameter Set std::optional m_heCapability; //!< HE capabilities std::optional m_heOperation; //!< HE operation @@ -968,11 +968,11 @@ public: */ const std::optional& GetEhtCapabilities (void) const; /** - * Return the ERP information. + * Return the ERP information, if present. * - * \return the ERP information + * \return the ERP information, if present */ - const ErpInformation& GetErpInformation (void) const; + const std::optional& GetErpInformation (void) const; /** * Return the EDCA Parameter Set. * @@ -1202,7 +1202,7 @@ private: std::optional m_vhtOperation; //!< VHT operation std::optional m_heCapability; //!< HE capabilities std::optional m_heOperation; //!< HE operation - ErpInformation m_erpInformation; //!< ERP information + std::optional m_erpInformation; //!< ERP information EdcaParameterSet m_edcaParameterSet; //!< EDCA Parameter Set MuEdcaParameterSet m_muEdcaParameterSet; //!< MU EDCA Parameter Set std::optional m_ehtCapability; //!< EHT capabilities diff --git a/src/wifi/model/non-ht/erp-information.cc b/src/wifi/model/non-ht/erp-information.cc index d04b95215..ee6a94690 100644 --- a/src/wifi/model/non-ht/erp-information.cc +++ b/src/wifi/model/non-ht/erp-information.cc @@ -23,8 +23,7 @@ namespace ns3 { ErpInformation::ErpInformation () - : m_erpInformation (0), - m_erpSupported (0) + : m_erpInformation (0) { } @@ -34,12 +33,6 @@ ErpInformation::ElementId () const return IE_ERP_INFORMATION; } -void -ErpInformation::SetErpSupported (uint8_t erpSupported) -{ - m_erpSupported = erpSupported; -} - void ErpInformation::SetBarkerPreambleMode (uint8_t barkerPreambleMode) { @@ -79,37 +72,13 @@ ErpInformation::GetNonErpPresent (void) const uint8_t ErpInformation::GetInformationFieldSize () const { - NS_ASSERT (m_erpSupported); return 1; } -Buffer::Iterator -ErpInformation::Serialize (Buffer::Iterator i) const -{ - if (!m_erpSupported) - { - return i; - } - return WifiInformationElement::Serialize (i); -} - -uint16_t -ErpInformation::GetSerializedSize () const -{ - if (!m_erpSupported) - { - return 0; - } - return WifiInformationElement::GetSerializedSize (); -} - void ErpInformation::SerializeInformationField (Buffer::Iterator start) const { - if (m_erpSupported) - { - start.WriteU8 (m_erpInformation); - } + start.WriteU8 (m_erpInformation); } uint8_t diff --git a/src/wifi/model/non-ht/erp-information.h b/src/wifi/model/non-ht/erp-information.h index 53fb4afe5..24a18bd51 100644 --- a/src/wifi/model/non-ht/erp-information.h +++ b/src/wifi/model/non-ht/erp-information.h @@ -43,20 +43,6 @@ public: uint8_t DeserializeInformationField (Buffer::Iterator start, uint8_t length) override; - /* This information element is a bit special in that it is only - included if the STA is an ERP STA. To support this we - override the Serialize and GetSerializedSize methods of - WifiInformationElement. */ - Buffer::Iterator Serialize (Buffer::Iterator start) const override; - uint16_t GetSerializedSize () const override; - - /** - * Set the ERP supported field. - * - * \param erpSupported the ERP supported field in the ErpInformation information element - */ - void SetErpSupported (uint8_t erpSupported); - /** * Set the Barker_Preamble_Mode field in the ErpInformation information element. * @@ -98,9 +84,6 @@ public: private: uint8_t m_erpInformation; ///< ERP information - - /// This is used to decide whether this element should be added to the frame or not - bool m_erpSupported; }; /** diff --git a/src/wifi/model/sta-wifi-mac.cc b/src/wifi/model/sta-wifi-mac.cc index 78f1df646..98e51bc6c 100644 --- a/src/wifi/model/sta-wifi-mac.cc +++ b/src/wifi/model/sta-wifi-mac.cc @@ -1070,11 +1070,11 @@ StaWifiMac::UpdateApInfo (const MgtFrameType& frame, const Mac48Address& apAddr, } bool isShortPreambleEnabled = capabilities.IsShortPreamble (); - if (GetErpSupported (linkId)) + if (const auto& erpInformation = frame.GetErpInformation (); + erpInformation.has_value () && GetErpSupported (linkId)) { - const ErpInformation& erpInformation = frame.GetErpInformation (); - isShortPreambleEnabled &= !erpInformation.GetBarkerPreambleMode (); - if (erpInformation.GetUseProtection () != 0) + isShortPreambleEnabled &= !erpInformation->GetBarkerPreambleMode (); + if (erpInformation->GetUseProtection () != 0) { GetWifiRemoteStationManager (linkId)->SetUseNonErpProtection (true); }