From 9c4937771630b2f5e182b965840d9434283574bb Mon Sep 17 00:00:00 2001 From: Sharan Naribole Date: Mon, 6 May 2024 14:00:46 +0200 Subject: [PATCH] wifi: Update Basic MLE variant to newer 802.11be draft --- src/wifi/model/eht/common-info-basic-mle.cc | 30 ++++++++++++++++++- src/wifi/model/eht/common-info-basic-mle.h | 12 ++++++++ src/wifi/model/eht/multi-link-element.cc | 33 +++++++++++++++++++++ src/wifi/model/eht/multi-link-element.h | 21 ++++++++++--- 4 files changed, 91 insertions(+), 5 deletions(-) diff --git a/src/wifi/model/eht/common-info-basic-mle.cc b/src/wifi/model/eht/common-info-basic-mle.cc index 0414f8004..46d475514 100644 --- a/src/wifi/model/eht/common-info-basic-mle.cc +++ b/src/wifi/model/eht/common-info-basic-mle.cc @@ -21,7 +21,8 @@ CommonInfoBasicMle::GetPresenceBitmap() const (m_bssParamsChangeCount.has_value() ? 0x0002 : 0x0) | (m_mediumSyncDelayInfo.has_value() ? 0x0004 : 0x0) | (m_emlCapabilities.has_value() ? 0x0008 : 0x0) | - (m_mldCapabilities.has_value() ? 0x0010 : 0x0); + (m_mldCapabilities.has_value() ? 0x0010 : 0x0) | (m_apMldId.has_value() ? 0x0020 : 0x0) | + (m_extMldCapabilities.has_value() ? 0x0040 : 0x0); } uint8_t @@ -33,6 +34,8 @@ CommonInfoBasicMle::GetSize() const ret += (m_mediumSyncDelayInfo.has_value() ? 2 : 0); ret += (m_emlCapabilities.has_value() ? 2 : 0); ret += (m_mldCapabilities.has_value() ? 2 : 0); + ret += (m_apMldId.has_value() ? 1 : 0); + ret += (m_extMldCapabilities.has_value() ? 2 : 0); return ret; } @@ -73,6 +76,17 @@ CommonInfoBasicMle::Serialize(Buffer::Iterator& start) const (m_mldCapabilities->freqSepForStrApMld << 7) | (m_mldCapabilities->aarSupport << 12); start.WriteHtolsbU16(val); } + if (m_apMldId.has_value()) + { + start.WriteU8(*m_apMldId); + } + if (m_extMldCapabilities.has_value()) + { + uint16_t val = m_extMldCapabilities->opParamUpdateSupp | + (m_extMldCapabilities->recommMaxSimulLinks << 1) | + (m_extMldCapabilities->nstrStatusUpdateSupp << 5); + start.WriteHtolsbU16(val); + } } uint8_t @@ -126,6 +140,20 @@ CommonInfoBasicMle::Deserialize(Buffer::Iterator start, uint16_t presence) m_mldCapabilities->aarSupport = (val >> 12) & 0x0001; count += 2; } + if ((presence & 0x0020) != 0) + { + m_apMldId = i.ReadU8(); + count++; + } + if ((presence & 0x0040) != 0) + { + m_extMldCapabilities = ExtMldCapabilities(); + auto val = i.ReadLsbtohU16(); + m_extMldCapabilities->opParamUpdateSupp = val & 0x0001; + m_extMldCapabilities->recommMaxSimulLinks = (val >> 1) & 0x000f; + m_extMldCapabilities->nstrStatusUpdateSupp = (val >> 5) & 0x0001; + count += 2; + } NS_ABORT_MSG_IF(count != length, "Common Info Length (" << +length diff --git a/src/wifi/model/eht/common-info-basic-mle.h b/src/wifi/model/eht/common-info-basic-mle.h index 9a067539a..9694c2620 100644 --- a/src/wifi/model/eht/common-info-basic-mle.h +++ b/src/wifi/model/eht/common-info-basic-mle.h @@ -60,6 +60,16 @@ struct CommonInfoBasicMle uint8_t aarSupport : 1; //!< AAR Support }; + /** + * Extended MLD Capabilities and Operations subfield + */ + struct ExtMldCapabilities + { + uint8_t opParamUpdateSupp : 1; ///< Operation Parameter Update Support + uint8_t recommMaxSimulLinks : 4; ///< Recommended Max Simultaneous Links + uint8_t nstrStatusUpdateSupp : 1; ///< NSTR Status Update Support + }; + /** * Subfields */ @@ -70,6 +80,8 @@ struct CommonInfoBasicMle m_mediumSyncDelayInfo; //!< Medium Synchronization Delay Information std::optional m_emlCapabilities; //!< EML Capabilities std::optional m_mldCapabilities; //!< MLD Capabilities + std::optional m_apMldId; ///< AP MLD ID + std::optional m_extMldCapabilities; ///< Extended MLD Capabilities /** * Get the Presence Bitmap subfield of the Common Info field diff --git a/src/wifi/model/eht/multi-link-element.cc b/src/wifi/model/eht/multi-link-element.cc index 1e4934b63..1dcbc409a 100644 --- a/src/wifi/model/eht/multi-link-element.cc +++ b/src/wifi/model/eht/multi-link-element.cc @@ -231,6 +231,39 @@ MultiLinkElement::GetTransitionTimeout() const return MicroSeconds(1 << (6 + emlCapabilities->transitionTimeout)); } +void +MultiLinkElement::SetApMldId(uint8_t id) +{ + const auto variant = GetVariant(); + switch (variant) + { + case BASIC_VARIANT: + std::get(m_commonInfo).m_apMldId = id; + return; + case PROBE_REQUEST_VARIANT: + std::get(m_commonInfo).m_apMldId = id; + return; + default: + NS_ABORT_MSG("AP MLD ID field not present in input variant " << variant); + } +} + +std::optional +MultiLinkElement::GetApMldId() const +{ + const auto variant = GetVariant(); + switch (variant) + { + case BASIC_VARIANT: + return std::get(m_commonInfo).m_apMldId; + case PROBE_REQUEST_VARIANT: + return std::get(m_commonInfo).m_apMldId; + default: + NS_LOG_DEBUG("AP MLD ID field not present in input variant"); + } + return std::nullopt; +} + MultiLinkElement::PerStaProfileSubelement::PerStaProfileSubelement(Variant variant) : m_variant(variant), m_staControl(0) diff --git a/src/wifi/model/eht/multi-link-element.h b/src/wifi/model/eht/multi-link-element.h index f3fe69255..651888aa3 100644 --- a/src/wifi/model/eht/multi-link-element.h +++ b/src/wifi/model/eht/multi-link-element.h @@ -36,12 +36,10 @@ using AssocReqRefVariant = std::variant GetApMldId() const; + mutable ContainingFrame m_containingFrame; //!< reference to the mgt frame containing this MLE /**