Commit 0f95f8b6 authored by Stefano Avallone's avatar Stefano Avallone
Browse files

wifi: Make EHT Capabilities IE optional in mgt frames

parent eeaadc4c
Showing with 56 additions and 109 deletions
+56 -109
......@@ -1478,7 +1478,7 @@ ApWifiMac::ReceiveAssocRequest (const AssocReqRefVariant& assoc, const Mac48Addr
if (GetEhtSupported ())
{
//check whether the EHT STA supports all MCSs in Basic MCS Set
// const EhtCapabilities& ehtCapabilities = frame.GetEhtCapabilities ();
// const auto& ehtCapabilities = frame.GetEhtCapabilities ();
//TODO: to be completed
}
......@@ -1542,9 +1542,9 @@ ApWifiMac::ReceiveAssocRequest (const AssocReqRefVariant& assoc, const Mac48Addr
}
if (GetEhtSupported ())
{
const EhtCapabilities& ehtCapabilities = frame.GetEhtCapabilities ();
const auto& ehtCapabilities = frame.GetEhtCapabilities ();
//TODO: once we support non constant rate managers, we should add checks here whether EHT is supported by the peer
remoteStationManager->AddStationEhtCapabilities (from, ehtCapabilities);
remoteStationManager->AddStationEhtCapabilities (from, *ehtCapabilities);
for (const auto & mcs : phy->GetMcsList (WIFI_MOD_CLASS_EHT))
{
//TODO: Add check whether MCS is supported from the capabilities
......
......@@ -23,7 +23,6 @@
namespace ns3 {
EhtCapabilities::EhtCapabilities ()
: m_ehtSupported (0)
{
}
......@@ -39,47 +38,16 @@ EhtCapabilities::ElementIdExt () const
return IE_EXT_EHT_CAPABILITIES;
}
void
EhtCapabilities::SetEhtSupported (uint8_t ehtSupported)
{
m_ehtSupported = ehtSupported;
}
uint8_t
EhtCapabilities::GetInformationFieldSize () const
{
//we should not be here if EHT is not supported
NS_ASSERT (m_ehtSupported > 0);
return 0; //FIXME
}
Buffer::Iterator
EhtCapabilities::Serialize (Buffer::Iterator i) const
{
if (m_ehtSupported < 1)
{
return i;
}
return WifiInformationElement::Serialize (i);
}
uint16_t
EhtCapabilities::GetSerializedSize () const
{
if (m_ehtSupported < 1)
{
return 0;
}
return WifiInformationElement::GetSerializedSize ();
return 1; //FIXME
}
void
EhtCapabilities::SerializeInformationField (Buffer::Iterator start) const
{
if (m_ehtSupported == 1)
{
//TODO
}
//TODO
}
uint8_t
......
......@@ -34,12 +34,6 @@ class EhtCapabilities : public WifiInformationElement
{
public:
EhtCapabilities ();
/**
* Set EHT supported
* \param ehtSupported the EHT supported indicator
*/
void SetEhtSupported (uint8_t ehtSupported);
// Implementations of pure virtual methods, or overridden from base class.
WifiInformationElementId ElementId () const;
WifiInformationElementId ElementIdExt () const;
......@@ -47,21 +41,8 @@ public:
void SerializeInformationField (Buffer::Iterator start) const;
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 EHT STA. To support this we
* override the Serialize and GetSerializedSize methods of
* WifiInformationElement.
*/
Buffer::Iterator Serialize (Buffer::Iterator start) const;
uint16_t GetSerializedSize () const;
private:
//TODO: add fields
/// This is used to decide if this element should be added to the frame or not
uint8_t m_ehtSupported;
};
/**
......
......@@ -150,7 +150,7 @@ MgtProbeRequestHeader::SetEhtCapabilities (EhtCapabilities&& ehtCapabilities)
m_ehtCapability = std::move (ehtCapabilities);
}
const EhtCapabilities&
const std::optional<EhtCapabilities>&
MgtProbeRequestHeader::GetEhtCapabilities (void) const
{
return m_ehtCapability;
......@@ -173,7 +173,7 @@ MgtProbeRequestHeader::GetSerializedSize (void) const
if (m_htCapability.has_value ()) size += m_htCapability->GetSerializedSize ();
if (m_vhtCapability.has_value ()) size += m_vhtCapability->GetSerializedSize ();
if (m_heCapability.has_value ()) size += m_heCapability->GetSerializedSize ();
size += m_ehtCapability.GetSerializedSize ();
if (m_ehtCapability.has_value ()) size += m_ehtCapability->GetSerializedSize ();
return size;
}
......@@ -203,7 +203,7 @@ MgtProbeRequestHeader::Print (std::ostream &os) const
if (m_htCapability.has_value ()) os << "HT Capabilities=" << *m_htCapability << " , ";
if (m_vhtCapability.has_value ()) os << "VHT Capabilities=" << *m_vhtCapability << " , ";
if (m_heCapability.has_value ()) os << "HE Capabilities=" << *m_heCapability << " , ";
os << "EHT Capabilities=" << m_ehtCapability;
if (m_ehtCapability.has_value ()) os << "EHT Capabilities=" << *m_ehtCapability;
}
void
......@@ -217,7 +217,7 @@ MgtProbeRequestHeader::Serialize (Buffer::Iterator start) const
if (m_htCapability.has_value ()) i = m_htCapability->Serialize (i);
if (m_vhtCapability.has_value ()) i = m_vhtCapability->Serialize (i);
if (m_heCapability.has_value ()) i = m_heCapability->Serialize (i);
i = m_ehtCapability.Serialize (i);
if (m_ehtCapability.has_value ()) i = m_ehtCapability->Serialize (i);
}
uint32_t
......@@ -231,7 +231,7 @@ MgtProbeRequestHeader::Deserialize (Buffer::Iterator start)
i = WifiInformationElement::DeserializeIfPresent (m_htCapability, i);
i = WifiInformationElement::DeserializeIfPresent (m_vhtCapability, i);
i = WifiInformationElement::DeserializeIfPresent (m_heCapability, i);
i = m_ehtCapability.DeserializeIfPresent (i);
i = WifiInformationElement::DeserializeIfPresent (m_ehtCapability, i);
return i.GetDistanceFrom (start);
}
......@@ -430,7 +430,7 @@ MgtProbeResponseHeader::SetEhtCapabilities (EhtCapabilities&& ehtCapabilities)
m_ehtCapability = std::move (ehtCapabilities);
}
const EhtCapabilities&
const std::optional<EhtCapabilities>&
MgtProbeResponseHeader::GetEhtCapabilities (void) const
{
return m_ehtCapability;
......@@ -600,7 +600,7 @@ MgtProbeResponseHeader::GetSerializedSize (void) const
if (m_heCapability.has_value ()) size += m_heCapability->GetSerializedSize ();
size += m_heOperation.GetSerializedSize ();
size += m_muEdcaParameterSet.GetSerializedSize ();
size += m_ehtCapability.GetSerializedSize ();
if (m_ehtCapability.has_value ()) size += m_ehtCapability->GetSerializedSize ();
if (m_reducedNeighborReport != nullptr) size += m_reducedNeighborReport->GetSerializedSize ();
if (m_multiLinkElement != nullptr) size += m_multiLinkElement->GetSerializedSize ();
return size;
......@@ -618,8 +618,8 @@ MgtProbeResponseHeader::Print (std::ostream &os) const
if (m_vhtCapability.has_value ()) os << "VHT Capabilities=" << *m_vhtCapability << " , ";
os << "VHT Operation=" << m_vhtOperation << " , ";
if (m_heCapability.has_value ()) os << "HE Capabilities=" << *m_heCapability << " , ";
os << "HE Operation=" << m_heOperation << " , "
<< "EHT Capabilities=" << m_ehtCapability;
os << "HE Operation=" << m_heOperation << " , ";
if (m_ehtCapability.has_value ()) os << "EHT Capabilities=" << *m_ehtCapability;
}
void
......@@ -643,7 +643,7 @@ MgtProbeResponseHeader::Serialize (Buffer::Iterator start) const
if (m_heCapability.has_value ()) i = m_heCapability->Serialize (i);
i = m_heOperation.Serialize (i);
i = m_muEdcaParameterSet.Serialize (i);
i = m_ehtCapability.Serialize (i);
if (m_ehtCapability.has_value ()) i = m_ehtCapability->Serialize (i);
if (m_reducedNeighborReport != nullptr) i = m_reducedNeighborReport->Serialize (i);
if (m_multiLinkElement != nullptr) i = m_multiLinkElement->Serialize (i);
}
......@@ -670,7 +670,7 @@ MgtProbeResponseHeader::Deserialize (Buffer::Iterator start)
i = WifiInformationElement::DeserializeIfPresent (m_heCapability, i);
i = m_heOperation.DeserializeIfPresent (i);
i = m_muEdcaParameterSet.DeserializeIfPresent (i);
i = m_ehtCapability.DeserializeIfPresent (i);
i = WifiInformationElement::DeserializeIfPresent (m_ehtCapability, i);
i = (m_reducedNeighborReport = Create<ReducedNeighborReport> ())->DeserializeIfPresent (tmp = i);
if (i.GetDistanceFrom (tmp) == 0) m_reducedNeighborReport = nullptr;
i = (m_multiLinkElement = Create<MultiLinkElement> (WIFI_MAC_MGT_BEACON))->DeserializeIfPresent (tmp = i);
......@@ -846,7 +846,7 @@ MgtAssocRequestHeader::SetEhtCapabilities (EhtCapabilities&& ehtCapabilities)
m_ehtCapability = std::move (ehtCapabilities);
}
const EhtCapabilities&
const std::optional<EhtCapabilities>&
MgtAssocRequestHeader::GetEhtCapabilities (void) const
{
return m_ehtCapability;
......@@ -912,7 +912,7 @@ MgtAssocRequestHeader::GetSerializedSize (void) const
if (m_htCapability.has_value ()) size += m_htCapability->GetSerializedSize ();
if (m_vhtCapability.has_value ()) size += m_vhtCapability->GetSerializedSize ();
if (m_heCapability.has_value ()) size += m_heCapability->GetSerializedSize ();
size += m_ehtCapability.GetSerializedSize ();
if (m_ehtCapability.has_value ()) size += m_ehtCapability->GetSerializedSize ();
if (m_multiLinkElement != nullptr) size += m_multiLinkElement->GetSerializedSize ();
return size;
}
......@@ -926,7 +926,7 @@ MgtAssocRequestHeader::Print (std::ostream &os) const
if (m_htCapability.has_value ()) os << "HT Capabilities=" << *m_htCapability << " , ";
if (m_vhtCapability.has_value ()) os << "VHT Capabilities=" << *m_vhtCapability << " , ";
if (m_heCapability.has_value ()) os << "HE Capabilities=" << *m_heCapability << " , ";
os << "EHT Capabilities=" << m_ehtCapability;
if (m_ehtCapability.has_value ()) os << "EHT Capabilities=" << *m_ehtCapability;
}
void
......@@ -942,7 +942,7 @@ MgtAssocRequestHeader::Serialize (Buffer::Iterator start) const
if (m_htCapability.has_value ()) i = m_htCapability->Serialize (i);
if (m_vhtCapability.has_value ()) i = m_vhtCapability->Serialize (i);
if (m_heCapability.has_value ()) i = m_heCapability->Serialize (i);
i = m_ehtCapability.Serialize (i);
if (m_ehtCapability.has_value ()) i = m_ehtCapability->Serialize (i);
if (m_multiLinkElement != nullptr) i = m_multiLinkElement->Serialize (i);
}
......@@ -959,7 +959,7 @@ MgtAssocRequestHeader::Deserialize (Buffer::Iterator start)
i = WifiInformationElement::DeserializeIfPresent (m_htCapability, i);
i = WifiInformationElement::DeserializeIfPresent (m_vhtCapability, i);
i = WifiInformationElement::DeserializeIfPresent (m_heCapability, i);
i = m_ehtCapability.DeserializeIfPresent (i);
i = WifiInformationElement::DeserializeIfPresent (m_ehtCapability, i);
m_multiLinkElement = Create<MultiLinkElement> (WIFI_MAC_MGT_ASSOCIATION_REQUEST);
i = m_multiLinkElement->DeserializeIfPresent (tmp = i);
if (i.GetDistanceFrom (tmp) == 0) m_multiLinkElement = nullptr;
......@@ -1114,7 +1114,7 @@ MgtReassocRequestHeader::SetEhtCapabilities (EhtCapabilities&& ehtCapabilities)
m_ehtCapability = std::move (ehtCapabilities);
}
const EhtCapabilities&
const std::optional<EhtCapabilities>&
MgtReassocRequestHeader::GetEhtCapabilities (void) const
{
return m_ehtCapability;
......@@ -1187,7 +1187,7 @@ MgtReassocRequestHeader::GetSerializedSize (void) const
if (m_htCapability.has_value ()) size += m_htCapability->GetSerializedSize ();
if (m_vhtCapability.has_value ()) size += m_vhtCapability->GetSerializedSize ();
if (m_heCapability.has_value ()) size += m_heCapability->GetSerializedSize ();
size += m_ehtCapability.GetSerializedSize ();
if (m_ehtCapability.has_value ()) size += m_ehtCapability->GetSerializedSize ();
if (m_multiLinkElement != nullptr) size += m_multiLinkElement->GetSerializedSize ();
return size;
}
......@@ -1202,7 +1202,7 @@ MgtReassocRequestHeader::Print (std::ostream &os) const
if (m_htCapability.has_value ()) os << "HT Capabilities=" << *m_htCapability << " , ";
if (m_vhtCapability.has_value ()) os << "VHT Capabilities=" << *m_vhtCapability << " , ";
if (m_heCapability.has_value ()) os << "HE Capabilities=" << *m_heCapability << " , ";
os << "EHT Capabilities=" << m_ehtCapability;
if (m_ehtCapability.has_value ()) os << "EHT Capabilities=" << *m_ehtCapability;
}
void
......@@ -1219,7 +1219,7 @@ MgtReassocRequestHeader::Serialize (Buffer::Iterator start) const
if (m_htCapability.has_value ()) i = m_htCapability->Serialize (i);
if (m_vhtCapability.has_value ()) i = m_vhtCapability->Serialize (i);
if (m_heCapability.has_value ()) i = m_heCapability->Serialize (i);
i = m_ehtCapability.Serialize (i);
if (m_ehtCapability.has_value ()) i = m_ehtCapability->Serialize (i);
if (m_multiLinkElement != nullptr) i = m_multiLinkElement->Serialize (i);
}
......@@ -1237,7 +1237,7 @@ MgtReassocRequestHeader::Deserialize (Buffer::Iterator start)
i = WifiInformationElement::DeserializeIfPresent (m_htCapability, i);
i = WifiInformationElement::DeserializeIfPresent (m_vhtCapability, i);
i = WifiInformationElement::DeserializeIfPresent (m_heCapability, i);
i = m_ehtCapability.DeserializeIfPresent (i);
i = WifiInformationElement::DeserializeIfPresent (m_ehtCapability, i);
m_multiLinkElement = Create<MultiLinkElement> (WIFI_MAC_MGT_REASSOCIATION_REQUEST);
i = m_multiLinkElement->DeserializeIfPresent (tmp = i);
if (i.GetDistanceFrom (tmp) == 0) m_multiLinkElement = nullptr;
......@@ -1446,7 +1446,7 @@ MgtAssocResponseHeader::SetEhtCapabilities (EhtCapabilities&& ehtCapabilities)
m_ehtCapability = std::move (ehtCapabilities);
}
const EhtCapabilities&
const std::optional<EhtCapabilities>&
MgtAssocResponseHeader::GetEhtCapabilities (void) const
{
return m_ehtCapability;
......@@ -1566,7 +1566,7 @@ MgtAssocResponseHeader::GetSerializedSize (void) const
if (m_heCapability.has_value ()) size += m_heCapability->GetSerializedSize ();
size += m_heOperation.GetSerializedSize ();
size += m_muEdcaParameterSet.GetSerializedSize ();
size += m_ehtCapability.GetSerializedSize ();
if (m_ehtCapability.has_value ()) size += m_ehtCapability->GetSerializedSize ();
if (m_multiLinkElement != nullptr) size += m_multiLinkElement->GetSerializedSize ();
return size;
}
......@@ -1584,8 +1584,8 @@ MgtAssocResponseHeader::Print (std::ostream &os) const
if (m_vhtCapability.has_value ()) os << "VHT Capabilities=" << *m_vhtCapability << " , ";
os << "VHT Operation=" << m_vhtOperation << " , ";
if (m_heCapability.has_value ()) os << "HE Capabilities=" << *m_heCapability << " , ";
os << "HE Operation=" << m_heOperation << " , "
<< "EHT Capabilities=" << m_ehtCapability;
os << "HE Operation=" << m_heOperation << " , ";
if (m_ehtCapability.has_value ()) os << "EHT Capabilities=" << *m_ehtCapability;
}
void
......@@ -1607,7 +1607,7 @@ MgtAssocResponseHeader::Serialize (Buffer::Iterator start) const
if (m_heCapability.has_value ()) i = m_heCapability->Serialize (i);
i = m_heOperation.Serialize (i);
i = m_muEdcaParameterSet.Serialize (i);
i = m_ehtCapability.Serialize (i);
if (m_ehtCapability.has_value ()) i = m_ehtCapability->Serialize (i);
if (m_multiLinkElement != nullptr) i = m_multiLinkElement->Serialize (i);
}
......@@ -1630,7 +1630,7 @@ MgtAssocResponseHeader::Deserialize (Buffer::Iterator start)
i = WifiInformationElement::DeserializeIfPresent (m_heCapability, i);
i = m_heOperation.DeserializeIfPresent (i);
i = m_muEdcaParameterSet.DeserializeIfPresent (i);
i = m_ehtCapability.DeserializeIfPresent (i);
i = WifiInformationElement::DeserializeIfPresent (m_ehtCapability, i);
m_multiLinkElement = Create<MultiLinkElement> (WIFI_MAC_MGT_ASSOCIATION_RESPONSE);
i = m_multiLinkElement->DeserializeIfPresent (tmp = i);
if (i.GetDistanceFrom (tmp) == 0) m_multiLinkElement = nullptr;
......
......@@ -179,11 +179,11 @@ public:
*/
const std::optional<HeCapabilities>& GetHeCapabilities (void) const;
/**
* Return the EHT capabilities.
* Return the EHT capabilities, if present.
*
* \return EHT capabilities
* \return EHT capabilities, if present
*/
const EhtCapabilities& GetEhtCapabilities (void) const;
const std::optional<EhtCapabilities>& GetEhtCapabilities (void) const;
/**
* Return the Service Set Identifier (SSID).
*
......@@ -233,7 +233,7 @@ private:
std::optional<VhtCapabilities> m_vhtCapability; //!< VHT capabilities
std::optional<HeCapabilities> m_heCapability; //!< HE capabilities
uint16_t m_listenInterval; //!< listen interval
EhtCapabilities m_ehtCapability; //!< EHT capabilities
std::optional<EhtCapabilities> m_ehtCapability; //!< EHT capabilities
Ptr<MultiLinkElement> m_multiLinkElement; //!< Multi-Link Element
};
......@@ -372,11 +372,11 @@ public:
*/
const std::optional<HeCapabilities>& GetHeCapabilities (void) const;
/**
* Return the EHT capabilities.
* Return the EHT capabilities, if present.
*
* \return EHT capabilities
* \return EHT capabilities, if present
*/
const EhtCapabilities& GetEhtCapabilities (void) const;
const std::optional<EhtCapabilities>& GetEhtCapabilities (void) const;
/**
* Return the Service Set Identifier (SSID).
*
......@@ -432,7 +432,7 @@ private:
std::optional<VhtCapabilities> m_vhtCapability; //!< VHT capabilities
std::optional<HeCapabilities> m_heCapability; //!< HE capabilities
uint16_t m_listenInterval; //!< listen interval
EhtCapabilities m_ehtCapability; //!< EHT capabilities
std::optional<EhtCapabilities> m_ehtCapability; //!< EHT capabilities
Ptr<MultiLinkElement> m_multiLinkElement; //!< Multi-Link Element
};
......@@ -508,11 +508,11 @@ public:
*/
const HeOperation& GetHeOperation (void) const;
/**
* Return the EHT capabilities.
* Return the EHT capabilities, if present.
*
* \return EHT capabilities
* \return EHT capabilities, if present
*/
const EhtCapabilities& GetEhtCapabilities (void) const;
const std::optional<EhtCapabilities>& GetEhtCapabilities (void) const;
/**
* Return the Multi-Link Element information element, if present, or a null
* pointer, otherwise.
......@@ -723,7 +723,7 @@ private:
std::optional<HeCapabilities> m_heCapability; //!< HE capabilities
HeOperation m_heOperation; //!< HE operation
MuEdcaParameterSet m_muEdcaParameterSet; //!< MU EDCA Parameter Set
EhtCapabilities m_ehtCapability; //!< EHT capabilities
std::optional<EhtCapabilities> m_ehtCapability; //!< EHT capabilities
Ptr<MultiLinkElement> m_multiLinkElement; //!< Multi-Link Element
};
......@@ -850,11 +850,11 @@ public:
const std::optional<HeCapabilities>& GetHeCapabilities (void) const;
/**
* Return the EHT capabilities.
* Return the EHT capabilities, if present.
*
* \return EHT capabilities
* \return EHT capabilities, if present
*/
const EhtCapabilities& GetEhtCapabilities (void) const;
const std::optional<EhtCapabilities>& GetEhtCapabilities (void) const;
/**
* Register this type.
......@@ -875,7 +875,7 @@ private:
std::optional<HtCapabilities> m_htCapability; //!< HT capabilities
std::optional<VhtCapabilities> m_vhtCapability; //!< VHT capabilities
std::optional<HeCapabilities> m_heCapability; //!< HE capabilities
EhtCapabilities m_ehtCapability; //!< EHT capabilities
std::optional<EhtCapabilities> m_ehtCapability; //!< EHT capabilities
};
......@@ -962,11 +962,11 @@ public:
*/
const HeOperation& GetHeOperation (void) const;
/**
* Return the EHT capabilities.
* Return the EHT capabilities, if present.
*
* \return EHT capabilities
* \return EHT capabilities, if present
*/
const EhtCapabilities& GetEhtCapabilities (void) const;
const std::optional<EhtCapabilities>& GetEhtCapabilities (void) const;
/**
* Return the ERP information.
*
......@@ -1205,7 +1205,7 @@ private:
ErpInformation m_erpInformation; //!< ERP information
EdcaParameterSet m_edcaParameterSet; //!< EDCA Parameter Set
MuEdcaParameterSet m_muEdcaParameterSet; //!< MU EDCA Parameter Set
EhtCapabilities m_ehtCapability; //!< EHT capabilities
std::optional<EhtCapabilities> m_ehtCapability; //!< EHT capabilities
Ptr<ReducedNeighborReport> m_reducedNeighborReport; //!< Reduced Neighbor Report information
Ptr<MultiLinkElement> m_multiLinkElement; //!< Multi-Link Element
};
......
......@@ -1179,9 +1179,9 @@ StaWifiMac::UpdateApInfo (const MgtFrameType& frame, const Mac48Address& apAddr,
if (!GetEhtSupported ()) return;
/* EHT station */
const EhtCapabilities& ehtCapabilities = frame.GetEhtCapabilities ();
const auto& ehtCapabilities = frame.GetEhtCapabilities ();
//TODO: once we support non constant rate managers, we should add checks here whether EHT is supported by the peer
GetWifiRemoteStationManager (linkId)->AddStationEhtCapabilities (apAddr, ehtCapabilities);
GetWifiRemoteStationManager (linkId)->AddStationEhtCapabilities (apAddr, *ehtCapabilities);
};
// process Information Elements included in the current frame variant
......
......@@ -1518,11 +1518,9 @@ EhtCapabilities
WifiMac::GetEhtCapabilities (void) const
{
NS_LOG_FUNCTION (this);
NS_ASSERT (GetEhtSupported ());
EhtCapabilities capabilities;
if (GetEhtSupported ())
{
//TODO: fill in EHT capabilities
}
// TODO: fill in EHT capabilities
return capabilities;
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment