From 040ee160019dae8a21ac1ffd7f98e7d56eb7b474 Mon Sep 17 00:00:00 2001 From: Stefano Avallone Date: Tue, 15 Jan 2019 14:19:54 +0100 Subject: [PATCH] wifi: WifiRemoteStationState stores the station capabilities Also, remove m_ldpc and m_stbc, as they can be obtained via the VHT capabilities, and m_shortGuardInterval, m_streams and m_greenfield, as they can be obtained via the HT capabilities. --- src/wifi/model/wifi-remote-station-manager.cc | 103 ++++++++++++------ src/wifi/model/wifi-remote-station-manager.h | 38 +++++-- 2 files changed, 99 insertions(+), 42 deletions(-) diff --git a/src/wifi/model/wifi-remote-station-manager.cc b/src/wifi/model/wifi-remote-station-manager.cc index dd1688fcf..c1ed5dd49 100644 --- a/src/wifi/model/wifi-remote-station-manager.cc +++ b/src/wifi/model/wifi-remote-station-manager.cc @@ -29,9 +29,6 @@ #include "wifi-utils.h" #include "wifi-mac-header.h" #include "wifi-mac-trailer.h" -#include "ht-capabilities.h" -#include "vht-capabilities.h" -#include "he-capabilities.h" #include "ht-configuration.h" #include "vht-configuration.h" #include "he-configuration.h" @@ -1107,19 +1104,14 @@ WifiRemoteStationManager::LookupState (Mac48Address address) const state->m_address = address; state->m_operationalRateSet.push_back (GetDefaultMode ()); state->m_operationalMcsSet.push_back (GetDefaultMcs ()); + state->m_htCapabilities = 0; + state->m_vhtCapabilities = 0; + state->m_heCapabilities = 0; state->m_channelWidth = m_wifiPhy->GetChannelWidth (); - state->m_shortGuardInterval = GetShortGuardIntervalSupported (); state->m_guardInterval = GetGuardInterval (); - state->m_greenfield = GetGreenfieldSupported (); - state->m_streams = 1; state->m_ness = 0; state->m_aggregation = false; - state->m_stbc = false; - state->m_ldpc = false; state->m_qosSupported = false; - state->m_htSupported = false; - state->m_vhtSupported = false; - state->m_heSupported = false; const_cast (this)->m_states.push_back (state); NS_LOG_DEBUG ("WifiRemoteStationManager::LookupState returning new state"); return state; @@ -1179,7 +1171,6 @@ WifiRemoteStationManager::AddStationHtCapabilities (Mac48Address from, HtCapabil NS_LOG_FUNCTION (this << from << htCapabilities); WifiRemoteStationState *state; state = LookupState (from); - state->m_shortGuardInterval = htCapabilities.GetShortGuardInterval20 (); if (htCapabilities.GetSupportedChannelWidth () == 1) { state->m_channelWidth = 40; @@ -1189,8 +1180,6 @@ WifiRemoteStationManager::AddStationHtCapabilities (Mac48Address from, HtCapabil state->m_channelWidth = 20; } SetQosSupport (from, true); - state->m_greenfield = htCapabilities.GetGreenfield (); - state->m_streams = htCapabilities.GetRxHighestSupportedAntennas (); for (uint8_t j = 0; j < m_wifiPhy->GetNMcs (); j++) { WifiMode mcs = m_wifiPhy->GetMcs (j); @@ -1199,7 +1188,7 @@ WifiRemoteStationManager::AddStationHtCapabilities (Mac48Address from, HtCapabil AddSupportedMcs (from, mcs); } } - state->m_htSupported = true; + state->m_htCapabilities = Create (htCapabilities); } void @@ -1223,8 +1212,6 @@ WifiRemoteStationManager::AddStationVhtCapabilities (Mac48Address from, VhtCapab { state->m_channelWidth = m_wifiPhy->GetChannelWidth (); } - state->m_ldpc = (vhtCapabilities.GetRxLdpc () != 0); - state->m_stbc = (vhtCapabilities.GetTxStbc () != 0 || vhtCapabilities.GetRxStbc () != 0); for (uint8_t i = 1; i <= m_wifiPhy->GetMaxSupportedTxSpatialStreams (); i++) { for (uint8_t j = 0; j < m_wifiPhy->GetNMcs (); j++) @@ -1236,7 +1223,7 @@ WifiRemoteStationManager::AddStationVhtCapabilities (Mac48Address from, VhtCapab } } } - state->m_vhtSupported = true; + state->m_vhtCapabilities = Create (vhtCapabilities); } void @@ -1294,14 +1281,38 @@ WifiRemoteStationManager::AddStationHeCapabilities (Mac48Address from, HeCapabil } } } - state->m_heSupported = true; + state->m_heCapabilities = Create (heCapabilities); SetQosSupport (from, true); } +Ptr +WifiRemoteStationManager::GetStationHtCapabilities (Mac48Address from) +{ + return LookupState (from)->m_htCapabilities; +} + +Ptr +WifiRemoteStationManager::GetStationVhtCapabilities (Mac48Address from) +{ + return LookupState (from)->m_vhtCapabilities; +} + +Ptr +WifiRemoteStationManager::GetStationHeCapabilities (Mac48Address from) +{ + return LookupState (from)->m_heCapabilities; +} + bool WifiRemoteStationManager::GetGreenfieldSupported (Mac48Address address) const { - return LookupState (address)->m_greenfield; + Ptr htCapabilities = LookupState (address)->m_htCapabilities; + + if (!htCapabilities) + { + return false; + } + return htCapabilities->GetGreenfield (); } WifiMode @@ -1536,7 +1547,13 @@ WifiRemoteStationManager::GetChannelWidth (const WifiRemoteStation *station) con bool WifiRemoteStationManager::GetShortGuardIntervalSupported (const WifiRemoteStation *station) const { - return station->m_state->m_shortGuardInterval; + Ptr htCapabilities = station->m_state->m_htCapabilities; + + if (!htCapabilities) + { + return false; + } + return htCapabilities->GetShortGuardInterval20 (); } uint16_t @@ -1548,7 +1565,13 @@ WifiRemoteStationManager::GetGuardInterval (const WifiRemoteStation *station) co bool WifiRemoteStationManager::GetGreenfield (const WifiRemoteStation *station) const { - return station->m_state->m_greenfield; + Ptr htCapabilities = station->m_state->m_htCapabilities; + + if (!htCapabilities) + { + return false; + } + return htCapabilities->GetGreenfield (); } bool @@ -1560,7 +1583,13 @@ WifiRemoteStationManager::GetAggregation (const WifiRemoteStation *station) cons uint8_t WifiRemoteStationManager::GetNumberOfSupportedStreams (const WifiRemoteStation *station) const { - return station->m_state->m_streams; + Ptr htCapabilities = station->m_state->m_htCapabilities; + + if (!htCapabilities) + { + return 1; + } + return htCapabilities->GetRxHighestSupportedAntennas (); } uint8_t @@ -1596,19 +1625,19 @@ WifiRemoteStationManager::GetQosSupported (const WifiRemoteStation *station) con bool WifiRemoteStationManager::GetHtSupported (const WifiRemoteStation *station) const { - return station->m_state->m_htSupported; + return (station->m_state->m_htCapabilities != 0); } bool WifiRemoteStationManager::GetVhtSupported (const WifiRemoteStation *station) const { - return station->m_state->m_vhtSupported; + return (station->m_state->m_vhtCapabilities != 0); } bool WifiRemoteStationManager::GetHeSupported (const WifiRemoteStation *station) const { - return station->m_state->m_heSupported; + return (station->m_state->m_heCapabilities != 0); } uint8_t @@ -1641,13 +1670,25 @@ WifiRemoteStationManager::GetChannelWidthSupported (Mac48Address address) const bool WifiRemoteStationManager::GetShortGuardIntervalSupported (Mac48Address address) const { - return LookupState (address)->m_shortGuardInterval; + Ptr htCapabilities = LookupState (address)->m_htCapabilities; + + if (!htCapabilities) + { + return false; + } + return htCapabilities->GetShortGuardInterval20 (); } uint8_t WifiRemoteStationManager::GetNumberOfSupportedStreams (Mac48Address address) const { - return LookupState (address)->m_streams; + Ptr htCapabilities = LookupState (address)->m_htCapabilities; + + if (!htCapabilities) + { + return 1; + } + return htCapabilities->GetRxHighestSupportedAntennas (); } uint8_t @@ -1659,19 +1700,19 @@ WifiRemoteStationManager::GetNMcsSupported (Mac48Address address) const bool WifiRemoteStationManager::GetHtSupported (Mac48Address address) const { - return LookupState (address)->m_htSupported; + return (LookupState (address)->m_htCapabilities != 0); } bool WifiRemoteStationManager::GetVhtSupported (Mac48Address address) const { - return LookupState (address)->m_vhtSupported; + return (LookupState (address)->m_vhtCapabilities != 0); } bool WifiRemoteStationManager::GetHeSupported (Mac48Address address) const { - return LookupState (address)->m_heSupported; + return (LookupState (address)->m_heCapabilities != 0); } void diff --git a/src/wifi/model/wifi-remote-station-manager.h b/src/wifi/model/wifi-remote-station-manager.h index 1e7bb09ec..5bb6033cc 100644 --- a/src/wifi/model/wifi-remote-station-manager.h +++ b/src/wifi/model/wifi-remote-station-manager.h @@ -28,6 +28,9 @@ #include "wifi-mode.h" #include "wifi-utils.h" #include "wifi-remote-station-info.h" +#include "ht-capabilities.h" +#include "vht-capabilities.h" +#include "he-capabilities.h" namespace ns3 { @@ -35,9 +38,6 @@ class WifiPhy; class WifiMac; class WifiMacHeader; class Packet; -class HtCapabilities; -class VhtCapabilities; -class HeCapabilities; class WifiTxVector; struct WifiRemoteStationState; @@ -91,22 +91,17 @@ struct WifiRemoteStationState WifiModeList m_operationalMcsSet; //!< operational MCS set Mac48Address m_address; //!< Mac48Address of the remote station WifiRemoteStationInfo m_info; //!< remote station info + Ptr m_htCapabilities; //!< remote station HT capabilities + Ptr m_vhtCapabilities; //!< remote station VHT capabilities + Ptr m_heCapabilities; //!< remote station HE capabilities uint16_t m_channelWidth; //!< Channel width (in MHz) supported by the remote station - bool m_shortGuardInterval; //!< Flag if HT/VHT short guard interval is supported by the remote station uint16_t m_guardInterval; //!< HE Guard interval duration (in nanoseconds) supported by the remote station - uint8_t m_streams; //!< Number of supported streams by the remote station uint8_t m_ness; //!< Number of streams in beamforming of the remote station - bool m_stbc; //!< Flag if STBC is supported by the remote station - bool m_ldpc; //!< Flag if LDPC is supported by the remote station bool m_aggregation; //!< Flag if MPDU aggregation is used by the remote station - bool m_greenfield; //!< Flag if greenfield is supported by the remote station bool m_shortPreamble; //!< Flag if short PLCP preamble is supported by the remote station bool m_shortSlotTime; //!< Flag if short ERP slot time is supported by the remote station bool m_qosSupported; //!< Flag if HT is supported by the station - bool m_htSupported; //!< Flag if HT is supported by the station - bool m_vhtSupported; //!< Flag if VHT is supported by the station - bool m_heSupported; //!< Flag if HE is supported by the station }; /** @@ -224,6 +219,27 @@ public: * \param hecapabilities the HE capabilities of the station */ void AddStationHeCapabilities (Mac48Address from, HeCapabilities hecapabilities); + /** + * Return the HT capabilities sent by the remote station. + * + * \param from the address of the remote station + * \return the HT capabilities sent by the remote station + */ + Ptr GetStationHtCapabilities (Mac48Address from); + /** + * Return the VHT capabilities sent by the remote station. + * + * \param from the address of the remote station + * \return the VHT capabilities sent by the remote station + */ + Ptr GetStationVhtCapabilities (Mac48Address from); + /** + * Return the HE capabilities sent by the remote station. + * + * \param from the address of the remote station + * \return the HE capabilities sent by the remote station + */ + Ptr GetStationHeCapabilities (Mac48Address from); /** * Return whether the device has HT capability support enabled. *