diff --git a/src/mesh/model/dot11s/peer-link-frame.cc b/src/mesh/model/dot11s/peer-link-frame.cc index 97436ce7b..ecdf70923 100644 --- a/src/mesh/model/dot11s/peer-link-frame.cc +++ b/src/mesh/model/dot11s/peer-link-frame.cc @@ -83,7 +83,7 @@ PeerLinkOpenStart::GetSerializedSize () const uint32_t size =0; //Peering protocol size += 2; //capability size += m_rates.GetSerializedSize (); - size += m_rates.extended.GetSerializedSize (); + if (m_rates.GetNRates () > 8) size += m_rates.extended->GetSerializedSize (); size += m_meshId.GetInformationFieldSize () + 2; size += m_config.GetInformationFieldSize () + 2; return size; @@ -95,7 +95,7 @@ PeerLinkOpenStart::Serialize (Buffer::Iterator start) const i.WriteHtolsbU16 (m_capability); i = m_rates.Serialize (i); - i = m_rates.extended.Serialize (i); + if (m_rates.GetNRates () > 8) i = m_rates.extended->Serialize (i); i = m_meshId.Serialize (i); i = m_config.Serialize (i); } @@ -106,7 +106,7 @@ PeerLinkOpenStart::Deserialize (Buffer::Iterator start) m_capability = i.ReadLsbtohU16 (); i = m_rates.Deserialize (i); - i = m_rates.extended.DeserializeIfPresent (i); + i = WifiInformationElement::DeserializeIfPresent (m_rates.extended, i); uint8_t id = i.ReadU8 (); uint8_t length = i.ReadU8 (); m_meshId.DeserializeInformationField (i, length); @@ -262,7 +262,7 @@ PeerLinkConfirmStart::GetSerializedSize () const size += 2; //capability size += 2; //AID of remote peer size += m_rates.GetSerializedSize (); - size += m_rates.extended.GetSerializedSize (); + if (m_rates.GetNRates () > 8) size += m_rates.extended->GetSerializedSize (); size += m_config.GetInformationFieldSize () + 2; return size; } @@ -274,7 +274,7 @@ PeerLinkConfirmStart::Serialize (Buffer::Iterator start) const i.WriteHtolsbU16 (m_capability); i.WriteHtolsbU16 (m_aid); i = m_rates.Serialize (i); - i = m_rates.extended.Serialize (i); + if (m_rates.GetNRates () > 8) i = m_rates.extended->Serialize (i); i = m_config.Serialize (i); } uint32_t @@ -285,7 +285,7 @@ PeerLinkConfirmStart::Deserialize (Buffer::Iterator start) m_capability = i.ReadLsbtohU16 (); m_aid = i.ReadLsbtohU16 (); i = m_rates.Deserialize (i); - i = m_rates.extended.DeserializeIfPresent (i); + i = WifiInformationElement::DeserializeIfPresent (m_rates.extended, i); uint8_t id = i.ReadU8 (); uint8_t length = i.ReadU8 (); m_config.DeserializeInformationField (i, length); diff --git a/src/wifi/model/mgt-headers.cc b/src/wifi/model/mgt-headers.cc index ac2d5b535..1adadcaac 100644 --- a/src/wifi/model/mgt-headers.cc +++ b/src/wifi/model/mgt-headers.cc @@ -168,7 +168,7 @@ MgtProbeRequestHeader::GetSerializedSize (void) const uint32_t size = 0; size += m_ssid.GetSerializedSize (); size += m_rates.GetSerializedSize (); - size += m_rates.extended.GetSerializedSize (); + if (m_rates.GetNRates () > 8) size += m_rates.extended->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 (); @@ -212,7 +212,7 @@ MgtProbeRequestHeader::Serialize (Buffer::Iterator start) const Buffer::Iterator i = start; i = m_ssid.Serialize (i); i = m_rates.Serialize (i); - i = m_rates.extended.Serialize (i); + if (m_rates.GetNRates () > 8) i = m_rates.extended->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); @@ -226,7 +226,7 @@ MgtProbeRequestHeader::Deserialize (Buffer::Iterator start) Buffer::Iterator i = start; i = m_ssid.Deserialize (i); i = m_rates.Deserialize (i); - i = m_rates.extended.DeserializeIfPresent (i); + i = WifiInformationElement::DeserializeIfPresent (m_rates.extended, i, &m_rates); i = WifiInformationElement::DeserializeIfPresent (m_extendedCapability, i); i = WifiInformationElement::DeserializeIfPresent (m_htCapability, i); i = WifiInformationElement::DeserializeIfPresent (m_vhtCapability, i); @@ -590,7 +590,7 @@ MgtProbeResponseHeader::GetSerializedSize (void) const size += m_rates.GetSerializedSize (); if (m_dsssParameterSet.has_value ()) size += m_dsssParameterSet->GetSerializedSize (); if (m_erpInformation.has_value ()) size += m_erpInformation->GetSerializedSize (); - size += m_rates.extended.GetSerializedSize (); + if (m_rates.GetNRates () > 8) size += m_rates.extended->GetSerializedSize (); if (m_edcaParameterSet.has_value ()) size += m_edcaParameterSet->GetSerializedSize (); if (m_extendedCapability.has_value ()) size += m_extendedCapability->GetSerializedSize (); if (m_htCapability.has_value ()) size += m_htCapability->GetSerializedSize (); @@ -633,7 +633,7 @@ MgtProbeResponseHeader::Serialize (Buffer::Iterator start) const i = m_rates.Serialize (i); if (m_dsssParameterSet.has_value ()) i = m_dsssParameterSet->Serialize (i); if (m_erpInformation.has_value ()) i = m_erpInformation->Serialize (i); - i = m_rates.extended.Serialize (i); + if (m_rates.GetNRates () > 8) i = m_rates.extended->Serialize (i); if (m_edcaParameterSet.has_value ()) i = m_edcaParameterSet->Serialize (i); if (m_extendedCapability.has_value ()) i = m_extendedCapability->Serialize (i); if (m_htCapability.has_value ()) i = m_htCapability->Serialize (i); @@ -660,7 +660,7 @@ MgtProbeResponseHeader::Deserialize (Buffer::Iterator start) i = m_rates.Deserialize (i); i = WifiInformationElement::DeserializeIfPresent (m_dsssParameterSet, i); i = WifiInformationElement::DeserializeIfPresent (m_erpInformation, i); - i = m_rates.extended.DeserializeIfPresent (i); + i = WifiInformationElement::DeserializeIfPresent (m_rates.extended, i, &m_rates); i = WifiInformationElement::DeserializeIfPresent (m_edcaParameterSet, i); i = WifiInformationElement::DeserializeIfPresent (m_extendedCapability, i); i = WifiInformationElement::DeserializeIfPresent (m_htCapability, i); @@ -907,7 +907,7 @@ MgtAssocRequestHeader::GetSerializedSize (void) const size += 2; size += m_ssid.GetSerializedSize (); size += m_rates.GetSerializedSize (); - size += m_rates.extended.GetSerializedSize (); + if (m_rates.GetNRates () > 8) size += m_rates.extended->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 (); @@ -937,7 +937,7 @@ MgtAssocRequestHeader::Serialize (Buffer::Iterator start) const i.WriteHtolsbU16 (m_listenInterval); i = m_ssid.Serialize (i); i = m_rates.Serialize (i); - i = m_rates.extended.Serialize (i); + if (m_rates.GetNRates () > 8) i = m_rates.extended->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); @@ -954,7 +954,7 @@ MgtAssocRequestHeader::Deserialize (Buffer::Iterator start) m_listenInterval = i.ReadLsbtohU16 (); i = m_ssid.Deserialize (i); i = m_rates.Deserialize (i); - i = m_rates.extended.DeserializeIfPresent (i); + i = WifiInformationElement::DeserializeIfPresent (m_rates.extended, i, &m_rates); i = WifiInformationElement::DeserializeIfPresent (m_extendedCapability, i); i = WifiInformationElement::DeserializeIfPresent (m_htCapability, i); i = WifiInformationElement::DeserializeIfPresent (m_vhtCapability, i); @@ -1182,7 +1182,7 @@ MgtReassocRequestHeader::GetSerializedSize (void) const size += 6; //current AP address size += m_ssid.GetSerializedSize (); size += m_rates.GetSerializedSize (); - size += m_rates.extended.GetSerializedSize (); + if (m_rates.GetNRates () > 8) size += m_rates.extended->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 (); @@ -1214,7 +1214,7 @@ MgtReassocRequestHeader::Serialize (Buffer::Iterator start) const WriteTo (i, m_currentApAddr); i = m_ssid.Serialize (i); i = m_rates.Serialize (i); - i = m_rates.extended.Serialize (i); + if (m_rates.GetNRates () > 8) i = m_rates.extended->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); @@ -1232,7 +1232,7 @@ MgtReassocRequestHeader::Deserialize (Buffer::Iterator start) ReadFrom (i, m_currentApAddr); i = m_ssid.Deserialize (i); i = m_rates.Deserialize (i); - i = m_rates.extended.DeserializeIfPresent (i); + i = WifiInformationElement::DeserializeIfPresent (m_rates.extended, i, &m_rates); i = WifiInformationElement::DeserializeIfPresent (m_extendedCapability, i); i = WifiInformationElement::DeserializeIfPresent (m_htCapability, i); i = WifiInformationElement::DeserializeIfPresent (m_vhtCapability, i); @@ -1556,7 +1556,7 @@ MgtAssocResponseHeader::GetSerializedSize (void) const size += 2; //aid size += m_rates.GetSerializedSize (); if (m_erpInformation.has_value ()) size += m_erpInformation->GetSerializedSize (); - size += m_rates.extended.GetSerializedSize (); + if (m_rates.GetNRates () > 8) size += m_rates.extended->GetSerializedSize (); if (m_edcaParameterSet.has_value ()) size += m_edcaParameterSet->GetSerializedSize (); if (m_extendedCapability.has_value ()) size += m_extendedCapability->GetSerializedSize (); if (m_htCapability.has_value ()) size += m_htCapability->GetSerializedSize (); @@ -1597,7 +1597,7 @@ MgtAssocResponseHeader::Serialize (Buffer::Iterator start) const i.WriteHtolsbU16 (m_aid); i = m_rates.Serialize (i); if (m_erpInformation.has_value ()) i = m_erpInformation->Serialize (i); - i = m_rates.extended.Serialize (i); + if (m_rates.GetNRates () > 8) i = m_rates.extended->Serialize (i); if (m_edcaParameterSet.has_value ()) i = m_edcaParameterSet->Serialize (i); if (m_extendedCapability.has_value ()) i = m_extendedCapability->Serialize (i); if (m_htCapability.has_value ()) i = m_htCapability->Serialize (i); @@ -1620,7 +1620,7 @@ MgtAssocResponseHeader::Deserialize (Buffer::Iterator start) m_aid = i.ReadLsbtohU16 (); i = m_rates.Deserialize (i); i = WifiInformationElement::DeserializeIfPresent (m_erpInformation, i); - i = m_rates.extended.DeserializeIfPresent (i); + i = WifiInformationElement::DeserializeIfPresent (m_rates.extended, i, &m_rates); i = WifiInformationElement::DeserializeIfPresent (m_edcaParameterSet, i); i = WifiInformationElement::DeserializeIfPresent (m_extendedCapability, i); i = WifiInformationElement::DeserializeIfPresent (m_htCapability, i); diff --git a/src/wifi/model/supported-rates.cc b/src/wifi/model/supported-rates.cc index a41d1f3d9..873b44ed5 100644 --- a/src/wifi/model/supported-rates.cc +++ b/src/wifi/model/supported-rates.cc @@ -43,7 +43,7 @@ SupportedRates::SupportedRates (const SupportedRates &rates) m_nRates = rates.m_nRates; memcpy (m_rates, rates.m_rates, MAX_SUPPORTED_RATES); //reset the back pointer to this object - extended.SetSupportedRates (this); + extended = ExtendedSupportedRatesIE (this); } SupportedRates& @@ -52,7 +52,7 @@ SupportedRates::operator= (const SupportedRates& rates) this->m_nRates = rates.m_nRates; memcpy (this->m_rates, rates.m_rates, MAX_SUPPORTED_RATES); //reset the back pointer to this object - this->extended.SetSupportedRates (this); + this->extended = ExtendedSupportedRatesIE(this); return (*this); } @@ -231,11 +231,9 @@ ExtendedSupportedRatesIE::SetSupportedRates (SupportedRates *sr) uint8_t ExtendedSupportedRatesIE::GetInformationFieldSize () const { - //If there are 8 or fewer rates then we don't need an Extended - //Supported Rates IE and so could return zero here, but we're - //overriding the GetSerializedSize() method, so if this function is - //invoked in that case then it indicates a programming error. Hence - //we have an assertion on that condition. + // If there are 8 or fewer rates then we don't need an Extended Supported + // Rates, so if this function is invoked in that case then it indicates a + // programming error. Hence we have an assertion on that condition. NS_ASSERT (m_supportedRates->m_nRates > 8); //The number of rates we have beyond the initial 8 is the size of @@ -249,43 +247,10 @@ ExtendedSupportedRatesIE::SerializeInformationField (Buffer::Iterator start) con //If there are 8 or fewer rates then there should be no Extended //Supported Rates Information Element at all so being here would //seemingly indicate a programming error. - // - //Our overridden version of the Serialize() method should ensure - //that this routine is never invoked in that case (by ensuring that - //WifiInformationElement::Serialize() is not invoked). NS_ASSERT (m_supportedRates->m_nRates > 8); start.Write (m_supportedRates->m_rates + 8, m_supportedRates->m_nRates - 8); } -Buffer::Iterator -ExtendedSupportedRatesIE::Serialize (Buffer::Iterator start) const -{ - //If there are 8 or fewer rates then we don't need an Extended - //Supported Rates IE, so we don't serialise anything. - if (m_supportedRates->m_nRates <= 8) - { - return start; - } - - //If there are more than 8 rates then we serialise as per normal. - return WifiInformationElement::Serialize (start); -} - -uint16_t -ExtendedSupportedRatesIE::GetSerializedSize () const -{ - //If there are 8 or fewer rates then we don't need an Extended - //Supported Rates IE, so it's serialised length will be zero. - if (m_supportedRates->m_nRates <= 8) - { - return 0; - } - - //Otherwise, the size of it will be the number of supported rates - //beyond 8, plus 2 for the Element ID and Length. - return WifiInformationElement::GetSerializedSize (); -} - uint8_t ExtendedSupportedRatesIE::DeserializeInformationField (Buffer::Iterator start, uint8_t length) diff --git a/src/wifi/model/supported-rates.h b/src/wifi/model/supported-rates.h index 4dd4a8fb6..9365ad9f4 100644 --- a/src/wifi/model/supported-rates.h +++ b/src/wifi/model/supported-rates.h @@ -57,12 +57,6 @@ public: void SerializeInformationField (Buffer::Iterator start) const override; uint8_t DeserializeInformationField (Buffer::Iterator start, uint8_t length) override; - /* This information element is a bit special in that it is only - included if there are more than 8 rates. 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 supported rates. @@ -199,7 +193,7 @@ public: * extended. */ friend class ExtendedSupportedRatesIE; - ExtendedSupportedRatesIE extended; //!< extended supported rates info element + std::optional extended; //!< extended supported rates info element private: