wifi: add missing files in previous commit

This commit is contained in:
Sébastien Deronne
2017-12-17 10:37:06 +01:00
parent 98312b8929
commit f5c022f25f
2 changed files with 708 additions and 0 deletions

View File

@@ -0,0 +1,430 @@
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2017
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation;
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Authors: Sébastien Deronne <sebastien.deronne@gmail.com>
*/
#include "extended-capabilities.h"
namespace ns3 {
ExtendedCapabilities::ExtendedCapabilities ()
: m_20_40_bssCoexistenceManagementSupport (0),
m_extendedChannelSwitching (0),
m_psmpCapability (0),
m_spsmpSupport (0),
m_event (0),
m_diagnostics (0),
m_multicastDiagnostics (0),
m_locationTracking (0),
m_fms (0),
m_proxyArpService (0),
m_collocatedInterferenceReporting (0),
m_civicLocation (0),
m_geospatialLocation (0),
m_tfs (0),
m_wnmSleepMode (0),
m_timBroadcast (0),
m_bssTransition (0),
m_qosTrafficCapability (0),
m_acStationCount (0),
m_multipleBssid (0),
m_timingMeasurement (0),
m_channelUsage (0),
m_ssidList (0),
m_dms (0),
m_utcTsfOffset (0),
m_tpuBufferStaSupport (0),
m_tdlsPeerPsmSupport (0),
m_tdlsChannelSwitching (0),
m_interworking (0),
m_qosMap (0),
m_ebr (0),
m_sspnInterface (0),
m_msgcfCapability (0),
m_tdlsSupport (0),
m_tdlsProhibited (0),
m_tdlsChannelSwitchingProhibited (0),
m_rejectUnadmittedFrame (0),
m_serviceIntervalGranularity (0),
m_identifierLocation (0),
m_uapsdCoexistence (0),
m_wnmNotification (0),
m_qabCapability (0),
m_utf8Ssid (0),
m_qmfActivated (0),
m_qmfReconfigurationActivated (0),
m_robustAvStreaming (0),
m_advancedGcr (0),
m_meshGcr (0),
m_scs (0),
m_qloadReport (0),
m_alternateEdca (0),
m_unprotectedTxopNegotiation (0),
m_protectedTxopNegotiation (0),
m_protectedQloadReport (0),
m_tdlsWiderBandwidth (0),
m_operatingModeNotification (0),
m_maxNumberOfMsdusInAmsdu (0),
m_htSupported (0),
m_vhtSupported (0)
{
}
WifiInformationElementId
ExtendedCapabilities::ElementId () const
{
return IE_EXTENDED_CAPABILITIES;
}
void
ExtendedCapabilities::SetHtSupported (uint8_t htSupported)
{
m_htSupported = htSupported;
}
void
ExtendedCapabilities::SetVhtSupported (uint8_t vhtSupported)
{
m_vhtSupported = vhtSupported;
}
uint8_t
ExtendedCapabilities::GetInformationFieldSize () const
{
//we should not be here if it is not supported
NS_ASSERT (m_htSupported > 0 || m_vhtSupported > 0);
if (!m_vhtSupported)
{
return 1;
}
return 8;
}
Buffer::Iterator
ExtendedCapabilities::Serialize (Buffer::Iterator i) const
{
if (m_htSupported < 1 && m_vhtSupported < 1)
{
return i;
}
return WifiInformationElement::Serialize (i);
}
uint16_t
ExtendedCapabilities::GetSerializedSize () const
{
if (m_htSupported < 1 && m_vhtSupported < 1)
{
return 0;
}
return WifiInformationElement::GetSerializedSize ();
}
void
ExtendedCapabilities::SetExtendedCapabilitiesByte1 (uint8_t ctrl)
{
m_20_40_bssCoexistenceManagementSupport = ctrl & 0x01;
m_extendedChannelSwitching = (ctrl >> 2) & 0x01;
m_psmpCapability = (ctrl >> 4) & 0x01;
m_spsmpSupport = (ctrl >> 6) & 0x01;
m_event = (ctrl >> 7) & 0x01;
}
uint8_t
ExtendedCapabilities::GetExtendedCapabilitiesByte1 (void) const
{
uint8_t val = 0;
val |= m_20_40_bssCoexistenceManagementSupport & 0x01;
val |= (m_extendedChannelSwitching & 0x01) << 2;
val |= (m_psmpCapability & 0x01) << 4;
val |= (m_spsmpSupport & 0x01) << 6;
val |= (m_event & 0x01) << 7;
return val;
}
void
ExtendedCapabilities::SetExtendedCapabilitiesByte2 (uint8_t ctrl)
{
m_diagnostics = ctrl & 0x01;
m_multicastDiagnostics = (ctrl >> 1) & 0x01;
m_locationTracking = (ctrl >> 2) & 0x01;
m_fms = (ctrl >> 3) & 0x01;
m_proxyArpService = (ctrl >> 4) & 0x01;
m_collocatedInterferenceReporting = (ctrl >> 5) & 0x01;
m_civicLocation = (ctrl >> 6) & 0x01;
m_geospatialLocation = (ctrl >> 7) & 0x01;
}
uint8_t
ExtendedCapabilities::GetExtendedCapabilitiesByte2 (void) const
{
uint8_t val = 0;
val |= m_diagnostics & 0x01;
val |= (m_multicastDiagnostics & 0x01) << 1;
val |= (m_locationTracking & 0x01) << 2;
val |= (m_fms & 0x01) << 3;
val |= (m_proxyArpService & 0x01) << 4;
val |= (m_collocatedInterferenceReporting & 0x01) << 5;
val |= (m_civicLocation & 0x01) << 6;
val |= (m_geospatialLocation & 0x01) << 7;
return val;
}
void
ExtendedCapabilities::SetExtendedCapabilitiesByte3 (uint8_t ctrl)
{
m_tfs = ctrl & 0x01;
m_wnmSleepMode = (ctrl >> 1) & 0x01;
m_timBroadcast = (ctrl >> 2) & 0x01;
m_bssTransition = (ctrl >> 3) & 0x01;
m_qosTrafficCapability = (ctrl >> 4) & 0x01;
m_acStationCount = (ctrl >> 5) & 0x01;
m_multipleBssid = (ctrl >> 6) & 0x01;
m_timingMeasurement = (ctrl >> 7) & 0x01;
}
uint8_t
ExtendedCapabilities::GetExtendedCapabilitiesByte3 (void) const
{
uint8_t val = 0;
val |= m_tfs & 0x01;
val |= (m_wnmSleepMode & 0x01) << 1;
val |= (m_timBroadcast & 0x01) << 2;
val |= (m_bssTransition & 0x01) << 3;
val |= (m_qosTrafficCapability & 0x01) << 4;
val |= (m_acStationCount & 0x01) << 5;
val |= (m_multipleBssid & 0x01) << 6;
val |= (m_timingMeasurement & 0x01) << 7;
return val;
}
void
ExtendedCapabilities::SetExtendedCapabilitiesByte4 (uint8_t ctrl)
{
m_channelUsage = ctrl & 0x01;
m_ssidList = (ctrl >> 1) & 0x01;
m_dms = (ctrl >> 2) & 0x01;
m_utcTsfOffset = (ctrl >> 3) & 0x01;
m_tpuBufferStaSupport = (ctrl >> 4) & 0x01;
m_tdlsPeerPsmSupport = (ctrl >> 5) & 0x01;
m_tdlsChannelSwitching = (ctrl >> 6) & 0x01;
m_interworking = (ctrl >> 7) & 0x01;
}
uint8_t
ExtendedCapabilities::GetExtendedCapabilitiesByte4 (void) const
{
uint8_t val = 0;
val |= m_channelUsage & 0x01;
val |= (m_ssidList & 0x01) << 1;
val |= (m_dms & 0x01) << 2;
val |= (m_utcTsfOffset & 0x01) << 3;
val |= (m_tpuBufferStaSupport & 0x01) << 4;
val |= (m_tdlsPeerPsmSupport & 0x01) << 5;
val |= (m_tdlsChannelSwitching & 0x01) << 6;
val |= (m_interworking & 0x01) << 7;
return val;
}
void
ExtendedCapabilities::SetExtendedCapabilitiesByte5 (uint8_t ctrl)
{
m_qosMap = ctrl & 0x01;
m_ebr = (ctrl >> 1) & 0x01;
m_sspnInterface = (ctrl >> 2) & 0x01;
m_msgcfCapability = (ctrl >> 4) & 0x01;
m_tdlsSupport = (ctrl >> 5) & 0x01;
m_tdlsProhibited = (ctrl >> 6) & 0x01;
m_tdlsChannelSwitchingProhibited = (ctrl >> 7) & 0x01;
}
uint8_t
ExtendedCapabilities::GetExtendedCapabilitiesByte5 (void) const
{
uint8_t val = 0;
val |= m_qosMap & 0x01;
val |= (m_ebr & 0x01) << 1;
val |= (m_sspnInterface & 0x01) << 2;
val |= (m_msgcfCapability & 0x01) << 4;
val |= (m_tdlsSupport & 0x01) << 5;
val |= (m_tdlsProhibited & 0x01) << 6;
val |= (m_tdlsChannelSwitchingProhibited & 0x01) << 7;
return val;
}
void
ExtendedCapabilities::SetExtendedCapabilitiesByte6 (uint8_t ctrl)
{
m_rejectUnadmittedFrame = ctrl & 0x01;
m_serviceIntervalGranularity = (ctrl >> 1) & 0x07;
m_identifierLocation = (ctrl >> 4) & 0x01;
m_uapsdCoexistence = (ctrl >> 5) & 0x01;
m_wnmNotification = (ctrl >> 6) & 0x01;
m_qabCapability = (ctrl >> 7) & 0x01;
}
uint8_t
ExtendedCapabilities::GetExtendedCapabilitiesByte6 (void) const
{
uint8_t val = 0;
val |= m_rejectUnadmittedFrame & 0x01;
val |= (m_serviceIntervalGranularity & 0x07) << 1;
val |= (m_identifierLocation & 0x01) << 4;
val |= (m_uapsdCoexistence & 0x01) << 5;
val |= (m_wnmNotification & 0x01) << 6;
val |= (m_qabCapability & 0x01) << 7;
return val;
}
void
ExtendedCapabilities::SetExtendedCapabilitiesByte7 (uint8_t ctrl)
{
m_utf8Ssid = ctrl & 0x01;
m_qmfActivated = (ctrl >> 1) & 0x01;
m_qmfReconfigurationActivated = (ctrl >> 2) & 0x01;
m_robustAvStreaming = (ctrl >> 3) & 0x01;
m_advancedGcr = (ctrl >> 4) & 0x01;
m_meshGcr = (ctrl >> 5) & 0x01;
m_scs = (ctrl >> 6) & 0x01;
m_qloadReport = (ctrl >> 7) & 0x01;
}
uint8_t
ExtendedCapabilities::GetExtendedCapabilitiesByte7 (void) const
{
uint8_t val = 0;
val |= m_utf8Ssid & 0x01;
val |= (m_qmfActivated & 0x01) << 1;
val |= (m_qmfReconfigurationActivated & 0x01) << 2;
val |= (m_robustAvStreaming & 0x01) << 3;
val |= (m_advancedGcr & 0x01) << 4;
val |= (m_meshGcr & 0x01) << 5;
val |= (m_scs & 0x01) << 6;
val |= (m_qloadReport & 0x01) << 7;
return val;
}
void
ExtendedCapabilities::SetExtendedCapabilitiesByte8 (uint8_t ctrl)
{
m_alternateEdca = ctrl & 0x01;
m_unprotectedTxopNegotiation = (ctrl >> 1) & 0x01;
m_protectedTxopNegotiation = (ctrl >> 2) & 0x01;
m_protectedQloadReport = (ctrl >> 3) & 0x01;
m_tdlsWiderBandwidth = (ctrl >> 4) & 0x01;
m_operatingModeNotification = (ctrl >> 5) & 0x01;
m_maxNumberOfMsdusInAmsdu = (ctrl >> 6) & 0x03;
}
uint8_t
ExtendedCapabilities::GetExtendedCapabilitiesByte8 (void) const
{
uint8_t val = 0;
val |= m_alternateEdca & 0x01;
val |= (m_unprotectedTxopNegotiation & 0x01) << 1;
val |= (m_protectedTxopNegotiation & 0x01) << 2;
val |= (m_protectedQloadReport & 0x01) << 3;
val |= (m_tdlsWiderBandwidth & 0x01) << 4;
val |= (m_operatingModeNotification & 0x01) << 5;
val |= (m_maxNumberOfMsdusInAmsdu & 0x03) << 6;
return val;
}
void
ExtendedCapabilities::SerializeInformationField (Buffer::Iterator start) const
{
if (m_htSupported > 0 && m_vhtSupported == 0)
{
//write the corresponding value for each bit
start.WriteU8 (GetExtendedCapabilitiesByte1 () & 0x7f);
}
else if (m_vhtSupported > 0)
{
//write the corresponding value for each bit
start.WriteU8 (GetExtendedCapabilitiesByte1 ());
start.WriteU8 (GetExtendedCapabilitiesByte2 ());
start.WriteU8 (GetExtendedCapabilitiesByte3 ());
start.WriteU8 (GetExtendedCapabilitiesByte4 ());
start.WriteU8 (GetExtendedCapabilitiesByte5 ());
start.WriteU8 (GetExtendedCapabilitiesByte6 ());
start.WriteU8 (GetExtendedCapabilitiesByte7 ());
start.WriteU8 (GetExtendedCapabilitiesByte8 ());
}
}
uint8_t
ExtendedCapabilities::DeserializeInformationField (Buffer::Iterator start, uint8_t length)
{
Buffer::Iterator i = start;
if (m_htSupported > 0 && m_vhtSupported == 0)
{
uint8_t byte1 = i.ReadU8 ();
SetExtendedCapabilitiesByte1 (byte1 & 0x7f);
}
else if (m_vhtSupported > 0)
{
uint8_t byte1 = i.ReadU8 ();
uint8_t byte2 = i.ReadU8 ();
uint8_t byte3 = i.ReadU8 ();
uint8_t byte4 = i.ReadU8 ();
uint8_t byte5 = i.ReadU8 ();
uint8_t byte6 = i.ReadU8 ();
uint8_t byte7 = i.ReadU8 ();
uint8_t byte8 = i.ReadU8 ();
SetExtendedCapabilitiesByte1 (byte1);
SetExtendedCapabilitiesByte2 (byte2);
SetExtendedCapabilitiesByte3 (byte3);
SetExtendedCapabilitiesByte4 (byte4);
SetExtendedCapabilitiesByte5 (byte5);
SetExtendedCapabilitiesByte6 (byte6);
SetExtendedCapabilitiesByte7 (byte7);
SetExtendedCapabilitiesByte8 (byte8);
}
return length;
}
ATTRIBUTE_HELPER_CPP (ExtendedCapabilities);
/**
* output stream output operator
*
* \param os output stream
* \param extendedcapabilities the extended capabilities
*
* \returns output stream
*/
std::ostream &
operator << (std::ostream &os, const ExtendedCapabilities &extendedcapabilities)
{
return os;
}
/**
* input stream input operator
*
* \param is input stream
* \param extendedcapabilities the extended capabilities
*
* \returns input stream
*/
std::istream &operator >> (std::istream &is, ExtendedCapabilities &extendedcapabilities)
{
return is;
}
} //namespace ns3

View File

@@ -0,0 +1,278 @@
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2017
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation;
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Authors: Sébastien Deronne <sebastien.deronne@gmail.com>
*/
#ifndef EXTENDED_CAPABILITIES_H
#define EXTENDED_CAPABILITIES_H
#include "wifi-information-element.h"
namespace ns3 {
/**
* \brief The Extended Capabilities Information Element
* \ingroup wifi
*
* This class knows how to serialise and deserialise the Extended Capabilities Information Element
*
* \see attribute_ExtendedCapabilities
*/
class ExtendedCapabilities : public WifiInformationElement
{
public:
ExtendedCapabilities ();
/**
* Set the HT Supported flag.
*
* \param htsupported flag whether HT is supported
*/
void SetHtSupported (uint8_t htsupported);
/**
* Set the VHT Supported flag.
*
* \param vhtsupported flag whether VHT is supported
*/
void SetVhtSupported (uint8_t vhtsupported);
/**
* Set the first byte in the Extended Capabilities information element.
*
* \param ctrl the first byte in the Extended Capabilities information element
*/
void SetExtendedCapabilitiesByte1 (uint8_t ctrl);
/**
* Set the second byte in the Extended Capabilities information element.
*
* \param ctrl the second byte in the Extended Capabilities information element
*/
void SetExtendedCapabilitiesByte2 (uint8_t ctrl);
/**
* Set the third byte in the Extended Capabilities information element.
*
* \param ctrl the third byte in the Extended Capabilities information element
*/
void SetExtendedCapabilitiesByte3 (uint8_t ctrl);
/**
* Set the fourth byte in the Extended Capabilities information element.
*
* \param ctrl the fourth byte in the Extended Capabilities information element
*/
void SetExtendedCapabilitiesByte4 (uint8_t ctrl);
/**
* Set the fifth byte in the Extended Capabilities information element.
*
* \param ctrl the fifth byte in the Extended Capabilities information element
*/
void SetExtendedCapabilitiesByte5 (uint8_t ctrl);
/**
* Set the sixth byte in the Extended Capabilities information element.
*
* \param ctrl the sixth byte in the Extended Capabilities information element
*/
void SetExtendedCapabilitiesByte6 (uint8_t ctrl);
/**
* Set the seventh byte in the Extended Capabilities information element.
*
* \param ctrl the seventh byte in the Extended Capabilities information element
*/
void SetExtendedCapabilitiesByte7 (uint8_t ctrl);
/**
* Set the eighth byte in the Extended Capabilities information element.
*
* \param ctrl the eighth byte in the Extended Capabilities information element
*/
void SetExtendedCapabilitiesByte8 (uint8_t ctrl);
/**
* Return the first byte in the Extended Capabilities information element.
*
* \return the first byte in the Extended Capabilities information element
*/
uint8_t GetExtendedCapabilitiesByte1 (void) const;
/**
* Return the second byte in the Extended Capabilities information element.
*
* \return the second byte in the Extended Capabilities information element
*/
uint8_t GetExtendedCapabilitiesByte2 (void) const;
/**
* Return the third byte in the Extended Capabilities information element.
*
* \return the third byte in the Extended Capabilities information element
*/
uint8_t GetExtendedCapabilitiesByte3 (void) const;
/**
* Return the fourth byte in the Extended Capabilities information element.
*
* \return the fourth byte in the Extended Capabilities information element
*/
uint8_t GetExtendedCapabilitiesByte4 (void) const;
/**
* Return the fifth byte in the Extended Capabilities information element.
*
* \return the fifth byte in the Extended Capabilities information element
*/
uint8_t GetExtendedCapabilitiesByte5 (void) const;
/**
* Return the sixth byte in the Extended Capabilities information element.
*
* \return the sixth byte in the Extended Capabilities information element
*/
uint8_t GetExtendedCapabilitiesByte6 (void) const;
/**
* Return the seventh byte in the Extended Capabilities information element.
*
* \return the seventh byte in the Extended Capabilities information element
*/
uint8_t GetExtendedCapabilitiesByte7 (void) const;
/**
* Return the eighth byte in the Extended Capabilities information element.
*
* \return the eighth byte in the Extended Capabilities information element
*/
uint8_t GetExtendedCapabilitiesByte8 (void) const;
/**
* Return the element ID.
*
* \return the element ID
*/
WifiInformationElementId ElementId () const;
/**
* Return the information field size.
*
* \return the information field size
*/
uint8_t GetInformationFieldSize () const;
/**
* Serialize the information field.
*
* \param start the information field
*/
void SerializeInformationField (Buffer::Iterator start) const;
/**
* Return the information field.
*
* \param start field
* \param length field length
*
* \return the information field
*/
uint8_t DeserializeInformationField (Buffer::Iterator start,
uint8_t length);
/**
* This information element is a bit special in that it is only
* included if the STA is an HT or a VHT STA. To support this we
* override the Serialize and GetSerializedSize methods of
* WifiInformationElement.
*
* \param start
*
* \return an iterator
*/
Buffer::Iterator Serialize (Buffer::Iterator start) const;
/**
* Return the serialized size of this extended capabilities information element.
*
* \return the serialized size of this extended capabilities information element
*/
uint16_t GetSerializedSize () const;
private:
//fields supported by HT and VHT
uint8_t m_20_40_bssCoexistenceManagementSupport; ///< 20/40 BSS Coexistence Management Support
uint8_t m_extendedChannelSwitching; ///< Extended Channel Switching
uint8_t m_psmpCapability; ///< PSMP Capability
uint8_t m_spsmpSupport; ///< S-PSMP Support
//fields supported by VHT
uint8_t m_event; ///< Event
uint8_t m_diagnostics; ///< Diagnostics
uint8_t m_multicastDiagnostics; ///< Multicast Diagnostics
uint8_t m_locationTracking; ///< Location Tracking
uint8_t m_fms; ///< FMS
uint8_t m_proxyArpService; ///< Proxy ARP Service
uint8_t m_collocatedInterferenceReporting; ///< Collocated Interference Reporting
uint8_t m_civicLocation; ///< Civic Location
uint8_t m_geospatialLocation; ///< Geospatial Location
uint8_t m_tfs; ///< TFS
uint8_t m_wnmSleepMode; ///< WNM Sleep Mode
uint8_t m_timBroadcast; ///< TIM Broadcast
uint8_t m_bssTransition; ///< BSS Transition
uint8_t m_qosTrafficCapability; ///< QoS Traffic Capability
uint8_t m_acStationCount; ///< AC Station Count
uint8_t m_multipleBssid; ///< Multiple BSSID
uint8_t m_timingMeasurement; ///< Timing Measurement
uint8_t m_channelUsage; ///< Channel Usage
uint8_t m_ssidList; ///< SSID List
uint8_t m_dms; ///< DMS
uint8_t m_utcTsfOffset; ///< UTC TSF Offset
uint8_t m_tpuBufferStaSupport; ///< TPU Buffer STA Support
uint8_t m_tdlsPeerPsmSupport; ///< TDLS Peer PSM Support
uint8_t m_tdlsChannelSwitching; ///< TDLS Channel Switching
uint8_t m_interworking; ///< Interworking
uint8_t m_qosMap; ///< QoS Map
uint8_t m_ebr; ///< EBR
uint8_t m_sspnInterface; ///< SSPN Interface
uint8_t m_msgcfCapability; ///< MSGCF Capability
uint8_t m_tdlsSupport; ///< TDLS Support
uint8_t m_tdlsProhibited; ///< TDLS Prohibited
uint8_t m_tdlsChannelSwitchingProhibited; ///< TDLS Channel Switching Prohibited
uint8_t m_rejectUnadmittedFrame; ///< Reject Unadmitted Frame
uint8_t m_serviceIntervalGranularity; ///< Service Interval Granularity
uint8_t m_identifierLocation; ///< Identifier Location
uint8_t m_uapsdCoexistence; ///< U-APSD Coexistence
uint8_t m_wnmNotification; ///< WNM Notification
uint8_t m_qabCapability; ///< QAB Capability
uint8_t m_utf8Ssid; ///< UTF-8 SSID
uint8_t m_qmfActivated; ///< QMFActivated
uint8_t m_qmfReconfigurationActivated; ///< QMFReconfigurationActivated
uint8_t m_robustAvStreaming; ///< Robust AV Streaming
uint8_t m_advancedGcr; ///< Advanced GCR
uint8_t m_meshGcr; ///< Mesh GCR
uint8_t m_scs; ///< SCS
uint8_t m_qloadReport; ///< QLoad Report
uint8_t m_alternateEdca; ///< Alternate EDCA
uint8_t m_unprotectedTxopNegotiation; ///< Unprotected TXOP Negotiation
uint8_t m_protectedTxopNegotiation; ///< Protected TXOP Negotiation
uint8_t m_protectedQloadReport; ///< Protected QLoad Report
uint8_t m_tdlsWiderBandwidth; ///< TDLS Wider Bandwidth
uint8_t m_operatingModeNotification; ///< Operating Mode Notification
uint8_t m_maxNumberOfMsdusInAmsdu; ///< Max Number Of MSDUs In A-MSDU
/// Those are used to decide whether this element should be added to the frame or not
uint8_t m_htSupported;
uint8_t m_vhtSupported;
};
std::ostream &operator << (std::ostream &os, const ExtendedCapabilities &extendedcapabilities);
std::istream &operator >> (std::istream &is, ExtendedCapabilities &extendedcapabilities);
ATTRIBUTE_HELPER_HEADER (ExtendedCapabilities);
} //namespace ns3
#endif /* EXTENDED_CAPABILITIES_H */