wifi: Make Extended Supported Rates IE optional in mgt frames

This commit is contained in:
Stefano Avallone
2022-07-13 10:49:33 +02:00
parent 552f251a1f
commit e2ece0fc98
4 changed files with 27 additions and 68 deletions

View File

@@ -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);

View File

@@ -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);

View File

@@ -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)

View File

@@ -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<ExtendedSupportedRatesIE> extended; //!< extended supported rates info element
private: