wifi: Make Extended Supported Rates IE optional in mgt frames
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user