From 98312b89298e5736b1f2eeca9eb92b6ed122e55a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deronne?= Date: Sun, 17 Dec 2017 10:26:16 +0100 Subject: [PATCH] wifi: introduce Extended Capabilities information element to HT and VHT management frames --- examples/wireless/examples-to-run.py | 2 +- src/wifi/model/ap-wifi-mac.cc | 3 ++ src/wifi/model/mgt-headers.cc | 60 ++++++++++++++++++++++++++++ src/wifi/model/mgt-headers.h | 53 ++++++++++++++++++++++++ src/wifi/model/regular-wifi-mac.cc | 20 +++++++++- src/wifi/model/regular-wifi-mac.h | 18 ++++++--- src/wifi/model/sta-wifi-mac.cc | 2 + src/wifi/wscript | 2 + 8 files changed, 152 insertions(+), 8 deletions(-) diff --git a/examples/wireless/examples-to-run.py b/examples/wireless/examples-to-run.py index 8be0dbaac..be1c01dd2 100755 --- a/examples/wireless/examples-to-run.py +++ b/examples/wireless/examples-to-run.py @@ -39,7 +39,7 @@ cpp_examples = [ ("ht-wifi-network --simulationTime=0.1 --minExpectedThroughput=5 --maxExpectedThroughput=134", "True", "True"), ("vht-wifi-network --simulationTime=0.1 --minExpectedThroughput=5 --maxExpectedThroughput=555", "True", "True"), ("he-wifi-network --simulationTime=0.25 --minExpectedThroughput=6.35 --maxExpectedThroughput=754", "True", "True"), - ("simple-ht-hidden-stations --simulationTime=1 --minExpectedThroughput=16.7 --maxExpectedThroughput=16.8", "True", "True"), + ("simple-ht-hidden-stations --simulationTime=1 --minExpectedThroughput=16.5 --maxExpectedThroughput=17", "True", "True"), ("mixed-network --simulationTime=1", "True", "True"), ("wifi-aggregation --simulationTime=1 --verifyResults=1", "True", "True"), ("80211e-txop --simulationTime=1 --verifyResults=1", "True", "True"), diff --git a/src/wifi/model/ap-wifi-mac.cc b/src/wifi/model/ap-wifi-mac.cc index 58833f392..120a894ab 100644 --- a/src/wifi/model/ap-wifi-mac.cc +++ b/src/wifi/model/ap-wifi-mac.cc @@ -695,6 +695,7 @@ ApWifiMac::SendProbeResp (Mac48Address to) } if (m_htSupported || m_vhtSupported || m_heSupported) { + probe.SetExtendedCapabilities (GetExtendedCapabilities ()); probe.SetHtCapabilities (GetHtCapabilities ()); probe.SetHtOperation (GetHtOperation ()); } @@ -754,6 +755,7 @@ ApWifiMac::SendAssocResp (Mac48Address to, bool success) } if (m_htSupported || m_vhtSupported || m_heSupported) { + assoc.SetExtendedCapabilities (GetExtendedCapabilities ()); assoc.SetHtCapabilities (GetHtCapabilities ()); assoc.SetHtOperation (GetHtOperation ()); } @@ -810,6 +812,7 @@ ApWifiMac::SendOneBeacon (void) } if (m_htSupported || m_vhtSupported) { + beacon.SetExtendedCapabilities (GetExtendedCapabilities ()); beacon.SetHtCapabilities (GetHtCapabilities ()); beacon.SetHtOperation (GetHtOperation ()); } diff --git a/src/wifi/model/mgt-headers.cc b/src/wifi/model/mgt-headers.cc index 00a3ba366..7b5912e0f 100644 --- a/src/wifi/model/mgt-headers.cc +++ b/src/wifi/model/mgt-headers.cc @@ -53,6 +53,18 @@ MgtProbeRequestHeader::SetSupportedRates (SupportedRates rates) m_rates = rates; } +void +MgtProbeRequestHeader::SetExtendedCapabilities (ExtendedCapabilities extendedcapabilities) +{ + m_extendedCapability = extendedcapabilities; +} + +ExtendedCapabilities +MgtProbeRequestHeader::GetExtendedCapabilities (void) const +{ + return m_extendedCapability; +} + void MgtProbeRequestHeader::SetHtCapabilities (HtCapabilities htcapabilities) { @@ -102,6 +114,7 @@ MgtProbeRequestHeader::GetSerializedSize (void) const size += m_ssid.GetSerializedSize (); size += m_rates.GetSerializedSize (); size += m_rates.extended.GetSerializedSize (); + size += m_extendedCapability.GetSerializedSize (); size += m_htCapability.GetSerializedSize (); size += m_vhtCapability.GetSerializedSize (); size += m_heCapability.GetSerializedSize (); @@ -142,6 +155,7 @@ MgtProbeRequestHeader::Serialize (Buffer::Iterator start) const i = m_ssid.Serialize (i); i = m_rates.Serialize (i); i = m_rates.extended.Serialize (i); + i = m_extendedCapability.Serialize (i); i = m_htCapability.Serialize (i); i = m_vhtCapability.Serialize (i); i = m_heCapability.Serialize (i); @@ -154,6 +168,7 @@ MgtProbeRequestHeader::Deserialize (Buffer::Iterator start) i = m_ssid.Deserialize (i); i = m_rates.Deserialize (i); i = m_rates.extended.DeserializeIfPresent (i); + i = m_extendedCapability.DeserializeIfPresent (i); i = m_htCapability.DeserializeIfPresent (i); i = m_vhtCapability.DeserializeIfPresent (i); i = m_heCapability.DeserializeIfPresent (i); @@ -211,6 +226,18 @@ MgtProbeResponseHeader::GetCapabilities (void) const return m_capability; } +void +MgtProbeResponseHeader::SetExtendedCapabilities (ExtendedCapabilities extendedcapabilities) +{ + m_extendedCapability = extendedcapabilities; +} + +ExtendedCapabilities +MgtProbeResponseHeader::GetExtendedCapabilities (void) const +{ + return m_extendedCapability; +} + void MgtProbeResponseHeader::SetHtCapabilities (HtCapabilities htcapabilities) { @@ -367,6 +394,7 @@ MgtProbeResponseHeader::GetSerializedSize (void) const size += m_erpInformation.GetSerializedSize (); size += m_rates.extended.GetSerializedSize (); size += m_edcaParameterSet.GetSerializedSize (); + size += m_extendedCapability.GetSerializedSize (); size += m_htCapability.GetSerializedSize (); size += m_htOperation.GetSerializedSize (); size += m_vhtCapability.GetSerializedSize (); @@ -412,6 +440,7 @@ MgtProbeResponseHeader::Serialize (Buffer::Iterator start) const i = m_erpInformation.Serialize (i); i = m_rates.extended.Serialize (i); i = m_edcaParameterSet.Serialize (i); + i = m_extendedCapability.Serialize (i); i = m_htCapability.Serialize (i); i = m_htOperation.Serialize (i); i = m_vhtCapability.Serialize (i); @@ -434,6 +463,7 @@ MgtProbeResponseHeader::Deserialize (Buffer::Iterator start) i = m_erpInformation.DeserializeIfPresent (i); i = m_rates.extended.DeserializeIfPresent (i); i = m_edcaParameterSet.DeserializeIfPresent (i); + i = m_extendedCapability.DeserializeIfPresent (i); i = m_htCapability.DeserializeIfPresent (i); i = m_htOperation.DeserializeIfPresent (i); i = m_vhtCapability.DeserializeIfPresent (i); @@ -508,6 +538,18 @@ MgtAssocRequestHeader::GetCapabilities (void) const return m_capability; } +void +MgtAssocRequestHeader::SetExtendedCapabilities (ExtendedCapabilities extendedcapabilities) +{ + m_extendedCapability = extendedcapabilities; +} + +ExtendedCapabilities +MgtAssocRequestHeader::GetExtendedCapabilities (void) const +{ + return m_extendedCapability; +} + void MgtAssocRequestHeader::SetHtCapabilities (HtCapabilities htcapabilities) { @@ -588,6 +630,7 @@ MgtAssocRequestHeader::GetSerializedSize (void) const size += m_ssid.GetSerializedSize (); size += m_rates.GetSerializedSize (); size += m_rates.extended.GetSerializedSize (); + size += m_extendedCapability.GetSerializedSize (); size += m_htCapability.GetSerializedSize (); size += m_vhtCapability.GetSerializedSize (); size += m_heCapability.GetSerializedSize (); @@ -613,6 +656,7 @@ MgtAssocRequestHeader::Serialize (Buffer::Iterator start) const i = m_ssid.Serialize (i); i = m_rates.Serialize (i); i = m_rates.extended.Serialize (i); + i = m_extendedCapability.Serialize (i); i = m_htCapability.Serialize (i); i = m_vhtCapability.Serialize (i); i = m_heCapability.Serialize (i); @@ -627,6 +671,7 @@ MgtAssocRequestHeader::Deserialize (Buffer::Iterator start) i = m_ssid.Deserialize (i); i = m_rates.Deserialize (i); i = m_rates.extended.DeserializeIfPresent (i); + i = m_extendedCapability.DeserializeIfPresent (i); i = m_htCapability.DeserializeIfPresent (i); i = m_vhtCapability.DeserializeIfPresent (i); i = m_heCapability.DeserializeIfPresent (i); @@ -685,6 +730,18 @@ MgtAssocResponseHeader::GetCapabilities (void) const return m_capability; } +void +MgtAssocResponseHeader::SetExtendedCapabilities (ExtendedCapabilities extendedcapabilities) +{ + m_extendedCapability = extendedcapabilities; +} + +ExtendedCapabilities +MgtAssocResponseHeader::GetExtendedCapabilities (void) const +{ + return m_extendedCapability; +} + void MgtAssocResponseHeader::SetHtCapabilities (HtCapabilities htcapabilities) { @@ -809,6 +866,7 @@ MgtAssocResponseHeader::GetSerializedSize (void) const size += m_erpInformation.GetSerializedSize (); size += m_rates.extended.GetSerializedSize (); size += m_edcaParameterSet.GetSerializedSize (); + size += m_extendedCapability.GetSerializedSize (); size += m_htCapability.GetSerializedSize (); size += m_htOperation.GetSerializedSize (); size += m_vhtCapability.GetSerializedSize (); @@ -843,6 +901,7 @@ MgtAssocResponseHeader::Serialize (Buffer::Iterator start) const i = m_erpInformation.Serialize (i); i = m_rates.extended.Serialize (i); i = m_edcaParameterSet.Serialize (i); + i = m_extendedCapability.Serialize (i); i = m_htCapability.Serialize (i); i = m_htOperation.Serialize (i); i = m_vhtCapability.Serialize (i); @@ -862,6 +921,7 @@ MgtAssocResponseHeader::Deserialize (Buffer::Iterator start) i = m_erpInformation.DeserializeIfPresent (i); i = m_rates.extended.DeserializeIfPresent (i); i = m_edcaParameterSet.DeserializeIfPresent (i); + i = m_extendedCapability.DeserializeIfPresent (i); i = m_htCapability.DeserializeIfPresent (i); i = m_htOperation.DeserializeIfPresent (i); i = m_vhtCapability.DeserializeIfPresent (i); diff --git a/src/wifi/model/mgt-headers.h b/src/wifi/model/mgt-headers.h index 79829067a..d73e0864a 100644 --- a/src/wifi/model/mgt-headers.h +++ b/src/wifi/model/mgt-headers.h @@ -28,6 +28,7 @@ #include "supported-rates.h" #include "ssid.h" #include "dsss-parameter-set.h" +#include "extended-capabilities.h" #include "ht-capabilities.h" #include "ht-operation.h" #include "vht-capabilities.h" @@ -73,6 +74,12 @@ public: * \param capabilities Capability information */ void SetCapabilities (CapabilityInformation capabilities); + /** + * Set the Extended Capabilities. + * + * \param extendedcapabilities the Extended Capabilities + */ + void SetExtendedCapabilities (ExtendedCapabilities extendedcapabilities); /** * Set the HT capabilities. * @@ -97,6 +104,12 @@ public: * \return Capability information */ CapabilityInformation GetCapabilities (void) const; + /** + * Return the extended capabilities. + * + * \return the extended capabilities + */ + ExtendedCapabilities GetExtendedCapabilities (void) const; /** * Return the HT capabilities. * @@ -150,6 +163,7 @@ private: Ssid m_ssid; //!< Service Set ID (SSID) SupportedRates m_rates; //!< List of supported rates CapabilityInformation m_capability; //!< Capability information + ExtendedCapabilities m_extendedCapability; //!< Extended capabilities HtCapabilities m_htCapability; //!< HT capabilities VhtCapabilities m_vhtCapability; //!< VHT capabilities HeCapabilities m_heCapability; //!< HE capabilities @@ -185,6 +199,12 @@ public: * \return Capability information */ CapabilityInformation GetCapabilities (void) const; + /** + * Return the extended capabilities. + * + * \return the extended capabilities + */ + ExtendedCapabilities GetExtendedCapabilities (void) const; /** * Return the HT capabilities. * @@ -239,6 +259,12 @@ public: * \param capabilities Capability information */ void SetCapabilities (CapabilityInformation capabilities); + /** + * Set the extended capabilities. + * + * \param extendedcapabilities the extended capabilities + */ + void SetExtendedCapabilities (ExtendedCapabilities extendedcapabilities); /** * Set the VHT operation. * @@ -317,6 +343,7 @@ private: CapabilityInformation m_capability; //!< Capability information StatusCode m_code; //!< Status code uint16_t m_aid; //!< aid + ExtendedCapabilities m_extendedCapability; //!< extended capabilities HtCapabilities m_htCapability; //!< HT capabilities HtOperation m_htOperation; //!< HT operation VhtCapabilities m_vhtCapability; //!< VHT capabilities @@ -349,6 +376,12 @@ public: * \param rates the supported rates */ void SetSupportedRates (SupportedRates rates); + /** + * Set the extended capabilities. + * + * \param extendedcapabilities the extended capabilities + */ + void SetExtendedCapabilities (ExtendedCapabilities extendedcapabilities); /** * Set the HT capabilities. * @@ -379,6 +412,12 @@ public: * \return the supported rates */ SupportedRates GetSupportedRates (void) const; + /** + * Return the extended capabilities. + * + * \return the extended capabilities + */ + ExtendedCapabilities GetExtendedCapabilities (void) const; /** * Return the HT capabilities. * @@ -413,6 +452,7 @@ public: private: Ssid m_ssid; //!< Service Set ID (SSID) SupportedRates m_rates; //!< List of supported rates + ExtendedCapabilities m_extendedCapability; //!< extended capabilities HtCapabilities m_htCapability; //!< HT capabilities VhtCapabilities m_vhtCapability; //!< VHT capabilities HeCapabilities m_heCapability; //!< HE capabilities @@ -459,6 +499,12 @@ public: * \return the DSSS Parameter Set */ DsssParameterSet GetDsssParameterSet (void) const; + /** + * Return the extended capabilities. + * + * \return the extended capabilities + */ + ExtendedCapabilities GetExtendedCapabilities (void) const; /** * Return the HT capabilities. * @@ -514,6 +560,12 @@ public: */ void SetCapabilities (CapabilityInformation capabilities); /** + * Set the extended capabilities. + * + * \param extendedcapabilities the extended capabilities + */ + void SetExtendedCapabilities (ExtendedCapabilities extendedcapabilities); + /* * Set the HT capabilities. * * \param htcapabilities HT capabilities @@ -611,6 +663,7 @@ private: SupportedRates m_rates; //!< List of supported rates CapabilityInformation m_capability; //!< Capability information DsssParameterSet m_dsssParameterSet; //!< DSSS Parameter Set + ExtendedCapabilities m_extendedCapability; //!< extended capabilities HtCapabilities m_htCapability; //!< HT capabilities HtOperation m_htOperation; //!< HT operation VhtCapabilities m_vhtCapability; //!< VHT capabilities diff --git a/src/wifi/model/regular-wifi-mac.cc b/src/wifi/model/regular-wifi-mac.cc index b7e6be3f1..cbae285e8 100644 --- a/src/wifi/model/regular-wifi-mac.cc +++ b/src/wifi/model/regular-wifi-mac.cc @@ -139,6 +139,25 @@ RegularWifiMac::GetWifiRemoteStationManager () const return m_stationManager; } +ExtendedCapabilities +RegularWifiMac::GetExtendedCapabilities (void) const +{ + NS_LOG_FUNCTION (this); + ExtendedCapabilities capabilities; + if (m_htSupported || m_vhtSupported) + { + if (m_htSupported) + { + capabilities.SetHtSupported (1); + } + if (m_vhtSupported) + { + capabilities.SetVhtSupported (1); + } + } + return capabilities; +} + HtCapabilities RegularWifiMac::GetHtCapabilities (void) const { @@ -146,7 +165,6 @@ RegularWifiMac::GetHtCapabilities (void) const HtCapabilities capabilities; if (m_htSupported) { - capabilities.SetHtSupported (1); capabilities.SetHtSupported (1); capabilities.SetLdpc (m_phy->GetLdpc ()); capabilities.SetSupportedChannelWidth (m_phy->GetChannelWidth () >= 40); diff --git a/src/wifi/model/regular-wifi-mac.h b/src/wifi/model/regular-wifi-mac.h index 5608d5c9f..6f30c96f6 100644 --- a/src/wifi/model/regular-wifi-mac.h +++ b/src/wifi/model/regular-wifi-mac.h @@ -234,21 +234,27 @@ public: */ Ptr GetWifiRemoteStationManager (void) const; /** - * Return the HT capability of the device. + * Return the extended capabilities of the device. * - * \return the HT capability that we support + * \return the extended capabilities that we support + */ + ExtendedCapabilities GetExtendedCapabilities (void) const; + /** + * Return the HT capabilities of the device. + * + * \return the HT capabilities that we support */ HtCapabilities GetHtCapabilities (void) const; /** - * Return the VHT capability of the device. + * Return the VHT capabilities of the device. * - * \return the VHT capability that we support + * \return the VHT capabilities that we support */ VhtCapabilities GetVhtCapabilities (void) const; /** - * Return the HE capability of the device. + * Return the HE capabilities of the device. * - * \return the HE capability that we support + * \return the HE capabilities that we support */ HeCapabilities GetHeCapabilities (void) const; diff --git a/src/wifi/model/sta-wifi-mac.cc b/src/wifi/model/sta-wifi-mac.cc index 5e86d5cdc..333bce7bb 100644 --- a/src/wifi/model/sta-wifi-mac.cc +++ b/src/wifi/model/sta-wifi-mac.cc @@ -143,6 +143,7 @@ StaWifiMac::SendProbeRequest (void) probe.SetSupportedRates (GetSupportedRates ()); if (m_htSupported || m_vhtSupported || m_heSupported) { + probe.SetExtendedCapabilities (GetExtendedCapabilities ()); probe.SetHtCapabilities (GetHtCapabilities ()); } if (m_vhtSupported || m_heSupported) @@ -188,6 +189,7 @@ StaWifiMac::SendAssociationRequest (void) assoc.SetCapabilities (GetCapabilities ()); if (m_htSupported || m_vhtSupported || m_heSupported) { + assoc.SetExtendedCapabilities (GetExtendedCapabilities ()); assoc.SetHtCapabilities (GetHtCapabilities ()); } if (m_vhtSupported || m_heSupported) diff --git a/src/wifi/wscript b/src/wifi/wscript index 465ba3d8c..9a6bac553 100644 --- a/src/wifi/wscript +++ b/src/wifi/wscript @@ -84,6 +84,7 @@ def build(bld): 'model/frame-capture-model.cc', 'model/simple-frame-capture-model.cc', 'model/he-operation.cc', + 'model/extended-capabilities.cc', 'helper/wifi-radio-energy-model-helper.cc', 'helper/vht-wifi-mac-helper.cc', 'helper/ht-wifi-mac-helper.cc', @@ -194,6 +195,7 @@ def build(bld): 'model/simple-frame-capture-model.h', 'model/qos-blocked-destinations.h', 'model/he-operation.h', + 'model/extended-capabilities.h', 'helper/wifi-radio-energy-model-helper.h', 'helper/vht-wifi-mac-helper.h', 'helper/ht-wifi-mac-helper.h',