diff --git a/src/core/backbone_router/bbr_manager.cpp b/src/core/backbone_router/bbr_manager.cpp index 00e1f10ba..666d2ee2f 100644 --- a/src/core/backbone_router/bbr_manager.cpp +++ b/src/core/backbone_router/bbr_manager.cpp @@ -189,9 +189,8 @@ void Manager::HandleMulticastListenerRegistration(const Coap::Message &aMessage, if (Tlv::Find(aMessage, commissionerSessionId) == kErrorNone) { - const MeshCoP::CommissionerSessionIdTlv *commissionerSessionIdTlv = - static_cast( - Get().GetCommissioningDataSubTlv(MeshCoP::Tlv::kCommissionerSessionId)); + const MeshCoP::CommissionerSessionIdTlv *commissionerSessionIdTlv = As( + Get().GetCommissioningDataSubTlv(MeshCoP::Tlv::kCommissionerSessionId)); VerifyOrExit(commissionerSessionIdTlv != nullptr && commissionerSessionIdTlv->GetCommissionerSessionId() == commissionerSessionId, diff --git a/src/core/common/tlvs.cpp b/src/core/common/tlvs.cpp index 12edf4d2a..c045db6cd 100644 --- a/src/core/common/tlvs.cpp +++ b/src/core/common/tlvs.cpp @@ -41,8 +41,7 @@ namespace ot { uint32_t Tlv::GetSize(void) const { - return IsExtended() ? sizeof(ExtendedTlv) + static_cast(this)->GetLength() - : sizeof(Tlv) + GetLength(); + return IsExtended() ? sizeof(ExtendedTlv) + As(this)->GetLength() : sizeof(Tlv) + GetLength(); } uint8_t *Tlv::GetValue(void) diff --git a/src/core/common/tlvs.hpp b/src/core/common/tlvs.hpp index 7d07b34dc..d624ff9cb 100644 --- a/src/core/common/tlvs.hpp +++ b/src/core/common/tlvs.hpp @@ -468,6 +468,66 @@ private: uint16_t mLength; } OT_TOOL_PACKED_END; +/** + * This template method casts a `Tlv` pointer to a given subclass `TlvType` pointer. + * + * @tparam TlvType The TLV type to cast into. MUST be a subclass of `Tlv`. + * + * @param[in] aTlv A pointer to a `Tlv` to convert/cast to a `TlvType`. + * + * @returns A `TlvType` pointer to `aTlv`. + * + */ +template TlvType *As(Tlv *aTlv) +{ + return static_cast(aTlv); +} + +/** + * This template method casts a `Tlv` pointer to a given subclass `TlvType` pointer. + * + * @tparam TlvType The TLV type to cast into. MUST be a subclass of `Tlv`. + * + * @param[in] aTlv A pointer to a `Tlv` to convert/cast to a `TlvType`. + * + * @returns A `TlvType` pointer to `aTlv`. + * + */ +template const TlvType *As(const Tlv *aTlv) +{ + return static_cast(aTlv); +} + +/** + * This template method casts a `Tlv` reference to a given subclass `TlvType` reference. + * + * @tparam TlvType The TLV type to cast into. MUST be a subclass of `Tlv`. + * + * @param[in] aTlv A reference to a `Tlv` to convert/cast to a `TlvType`. + * + * @returns A `TlvType` reference to `aTlv`. + * + */ +template TlvType &As(Tlv &aTlv) +{ + return static_cast(aTlv); +} + +/** + * This template method casts a `Tlv` reference to a given subclass `TlvType` reference. + * + * @tparam TlvType The TLV type to cast into. MUST be a subclass of `Tlv`. + * + * @param[in] aTlv A reference to a `Tlv` to convert/cast to a `TlvType`. + * + * @returns A `TlvType` reference to `aTlv`. + * + */ +template const TlvType &As(const Tlv &aTlv) +{ + return static_cast(aTlv); +} + /** * This class defines constants for a TLV. * diff --git a/src/core/meshcop/dataset.cpp b/src/core/meshcop/dataset.cpp index ea78a490c..cbff80149 100644 --- a/src/core/meshcop/dataset.cpp +++ b/src/core/meshcop/dataset.cpp @@ -191,16 +191,16 @@ void Dataset::ConvertTo(Info &aDatasetInfo) const switch (cur->GetType()) { case Tlv::kActiveTimestamp: - aDatasetInfo.SetActiveTimestamp(static_cast(cur)->GetTimestamp().GetSeconds()); + aDatasetInfo.SetActiveTimestamp(As(cur)->GetTimestamp().GetSeconds()); break; case Tlv::kChannel: - aDatasetInfo.SetChannel(static_cast(cur)->GetChannel()); + aDatasetInfo.SetChannel(As(cur)->GetChannel()); break; case Tlv::kChannelMask: { - uint32_t mask = static_cast(cur)->GetChannelMask(); + uint32_t mask = As(cur)->GetChannelMask(); if (mask != 0) { @@ -211,45 +211,40 @@ void Dataset::ConvertTo(Info &aDatasetInfo) const } case Tlv::kDelayTimer: - aDatasetInfo.SetDelay(static_cast(cur)->GetDelayTimer()); + aDatasetInfo.SetDelay(As(cur)->GetDelayTimer()); break; case Tlv::kExtendedPanId: - aDatasetInfo.SetExtendedPanId(static_cast(cur)->GetExtendedPanId()); + aDatasetInfo.SetExtendedPanId(As(cur)->GetExtendedPanId()); break; case Tlv::kMeshLocalPrefix: - aDatasetInfo.SetMeshLocalPrefix(static_cast(cur)->GetMeshLocalPrefix()); + aDatasetInfo.SetMeshLocalPrefix(As(cur)->GetMeshLocalPrefix()); break; case Tlv::kNetworkKey: - aDatasetInfo.SetNetworkKey(static_cast(cur)->GetNetworkKey()); + aDatasetInfo.SetNetworkKey(As(cur)->GetNetworkKey()); break; case Tlv::kNetworkName: - aDatasetInfo.SetNetworkName(static_cast(cur)->GetNetworkName()); + aDatasetInfo.SetNetworkName(As(cur)->GetNetworkName()); break; case Tlv::kPanId: - aDatasetInfo.SetPanId(static_cast(cur)->GetPanId()); + aDatasetInfo.SetPanId(As(cur)->GetPanId()); break; case Tlv::kPendingTimestamp: - aDatasetInfo.SetPendingTimestamp( - static_cast(cur)->GetTimestamp().GetSeconds()); + aDatasetInfo.SetPendingTimestamp(As(cur)->GetTimestamp().GetSeconds()); break; case Tlv::kPskc: - aDatasetInfo.SetPskc(static_cast(cur)->GetPskc()); + aDatasetInfo.SetPskc(As(cur)->GetPskc()); break; case Tlv::kSecurityPolicy: - { - const SecurityPolicyTlv *tlv = static_cast(cur); - - aDatasetInfo.SetSecurityPolicy(tlv->GetSecurityPolicy()); + aDatasetInfo.SetSecurityPolicy(As(cur)->GetSecurityPolicy()); break; - } default: break; @@ -486,8 +481,8 @@ Error Dataset::AppendMleDatasetTlv(Type aType, Message &aMessage) const } else if (cur->GetType() == Tlv::kDelayTimer) { - uint32_t elapsed = TimerMilli::GetNow() - mUpdateTime; - DelayTimerTlv delayTimer(static_cast(*cur)); + uint32_t elapsed = TimerMilli::GetNow() - mUpdateTime; + DelayTimerTlv delayTimer = *As(cur); if (delayTimer.GetDelayTimer() > elapsed) { @@ -538,7 +533,7 @@ Error Dataset::ApplyConfiguration(Instance &aInstance, bool *aIsNetworkKeyUpdate { case Tlv::kChannel: { - uint8_t channel = static_cast(static_cast(cur)->GetChannel()); + uint8_t channel = static_cast(As(cur)->GetChannel()); error = mac.SetPanChannel(channel); @@ -553,20 +548,20 @@ Error Dataset::ApplyConfiguration(Instance &aInstance, bool *aIsNetworkKeyUpdate } case Tlv::kPanId: - mac.SetPanId(static_cast(cur)->GetPanId()); + mac.SetPanId(As(cur)->GetPanId()); break; case Tlv::kExtendedPanId: - mac.SetExtendedPanId(static_cast(cur)->GetExtendedPanId()); + mac.SetExtendedPanId(As(cur)->GetExtendedPanId()); break; case Tlv::kNetworkName: - IgnoreError(mac.SetNetworkName(static_cast(cur)->GetNetworkName())); + IgnoreError(mac.SetNetworkName(As(cur)->GetNetworkName())); break; case Tlv::kNetworkKey: { - const NetworkKeyTlv *key = static_cast(cur); + const NetworkKeyTlv *key = As(cur); NetworkKey networkKey; keyManager.GetNetworkKey(networkKey); @@ -583,22 +578,18 @@ Error Dataset::ApplyConfiguration(Instance &aInstance, bool *aIsNetworkKeyUpdate #if OPENTHREAD_FTD case Tlv::kPskc: - keyManager.SetPskc(static_cast(cur)->GetPskc()); + keyManager.SetPskc(As(cur)->GetPskc()); break; #endif case Tlv::kMeshLocalPrefix: - aInstance.Get().SetMeshLocalPrefix( - static_cast(cur)->GetMeshLocalPrefix()); + aInstance.Get().SetMeshLocalPrefix(As(cur)->GetMeshLocalPrefix()); break; case Tlv::kSecurityPolicy: - { - const SecurityPolicyTlv *securityPolicy = static_cast(cur); - keyManager.SetSecurityPolicy(securityPolicy->GetSecurityPolicy()); + keyManager.SetSecurityPolicy(As(cur)->GetSecurityPolicy()); break; - } default: break; diff --git a/src/core/meshcop/dataset.hpp b/src/core/meshcop/dataset.hpp index 69357314c..2c8b27c54 100644 --- a/src/core/meshcop/dataset.hpp +++ b/src/core/meshcop/dataset.hpp @@ -647,7 +647,7 @@ public: */ template TlvType *GetTlv(void) { - return static_cast(GetTlv(static_cast(TlvType::kType))); + return As(GetTlv(static_cast(TlvType::kType))); } /** @@ -658,7 +658,7 @@ public: */ template const TlvType *GetTlv(void) const { - return static_cast(GetTlv(static_cast(TlvType::kType))); + return As(GetTlv(static_cast(TlvType::kType))); } /** diff --git a/src/core/meshcop/dataset_manager_ftd.cpp b/src/core/meshcop/dataset_manager_ftd.cpp index 68a8515c4..347edb0d5 100644 --- a/src/core/meshcop/dataset_manager_ftd.cpp +++ b/src/core/meshcop/dataset_manager_ftd.cpp @@ -169,7 +169,7 @@ Error DatasetManager::HandleSet(Coap::Message &aMessage, const Ip6::MessageInfo isUpdateFromCommissioner = true; - localId = static_cast( + localId = As( Get().GetCommissioningDataSubTlv(Tlv::kCommissionerSessionId)); VerifyOrExit(localId != nullptr && localId->GetCommissionerSessionId() == sessionId); @@ -203,7 +203,7 @@ Error DatasetManager::HandleSet(Coap::Message &aMessage, const Ip6::MessageInfo case Tlv::kDelayTimer: { - DelayTimerTlv &delayTimerTlv = static_cast(static_cast(datasetTlv)); + DelayTimerTlv &delayTimerTlv = As(datasetTlv); if (doesAffectNetworkKey && delayTimerTlv.GetDelayTimer() < DelayTimerTlv::kDelayTimerDefault) { @@ -241,7 +241,7 @@ Error DatasetManager::HandleSet(Coap::Message &aMessage, const Ip6::MessageInfo const CommissionerSessionIdTlv *localSessionId; Ip6::Address destination; - localSessionId = static_cast( + localSessionId = As( Get().GetCommissioningDataSubTlv(Tlv::kCommissionerSessionId)); VerifyOrExit(localSessionId != nullptr); diff --git a/src/core/meshcop/joiner_router.cpp b/src/core/meshcop/joiner_router.cpp index a5d373bd6..0ae92a53e 100644 --- a/src/core/meshcop/joiner_router.cpp +++ b/src/core/meshcop/joiner_router.cpp @@ -106,8 +106,7 @@ uint16_t JoinerRouter::GetJoinerUdpPort(void) VerifyOrExit(!mIsJoinerPortConfigured, rval = mJoinerUdpPort); - joinerUdpPort = static_cast( - Get().GetCommissioningDataSubTlv(Tlv::kJoinerUdpPort)); + joinerUdpPort = As(Get().GetCommissioningDataSubTlv(Tlv::kJoinerUdpPort)); VerifyOrExit(joinerUdpPort != nullptr); rval = joinerUdpPort->GetUdpPort(); diff --git a/src/core/meshcop/meshcop.cpp b/src/core/meshcop/meshcop.cpp index ac206e8a4..121144a7f 100644 --- a/src/core/meshcop/meshcop.cpp +++ b/src/core/meshcop/meshcop.cpp @@ -303,7 +303,7 @@ Error GetBorderAgentRloc(ThreadNetif &aNetif, uint16_t &aRloc) Error error = kErrorNone; const BorderAgentLocatorTlv *borderAgentLocator; - borderAgentLocator = static_cast( + borderAgentLocator = As( aNetif.Get().GetCommissioningDataSubTlv(Tlv::kBorderAgentLocator)); VerifyOrExit(borderAgentLocator != nullptr, error = kErrorNotFound); diff --git a/src/core/meshcop/meshcop_leader.cpp b/src/core/meshcop/meshcop_leader.cpp index ecf5de476..69e6b4307 100644 --- a/src/core/meshcop/meshcop_leader.cpp +++ b/src/core/meshcop/meshcop_leader.cpp @@ -170,8 +170,8 @@ void Leader::HandleKeepAlive(Coap::Message &aMessage, const Ip6::MessageInfo &aM SuccessOrExit(Tlv::Find(aMessage, sessionId)); - borderAgentLocator = static_cast( - Get().GetCommissioningDataSubTlv(Tlv::kBorderAgentLocator)); + borderAgentLocator = + As(Get().GetCommissioningDataSubTlv(Tlv::kBorderAgentLocator)); if ((borderAgentLocator == nullptr) || (sessionId != mSessionId)) { diff --git a/src/core/meshcop/meshcop_tlvs.cpp b/src/core/meshcop/meshcop_tlvs.cpp index f2c72b238..a4a7abdec 100644 --- a/src/core/meshcop/meshcop_tlvs.cpp +++ b/src/core/meshcop/meshcop_tlvs.cpp @@ -48,39 +48,39 @@ bool Tlv::IsValid(const Tlv &aTlv) switch (aTlv.GetType()) { case Tlv::kChannel: - rval = static_cast(aTlv).IsValid(); + rval = As(aTlv).IsValid(); break; case Tlv::kPanId: - rval = static_cast(aTlv).IsValid(); + rval = As(aTlv).IsValid(); break; case Tlv::kExtendedPanId: - rval = static_cast(aTlv).IsValid(); + rval = As(aTlv).IsValid(); break; case Tlv::kNetworkName: - rval = static_cast(aTlv).IsValid(); + rval = As(aTlv).IsValid(); break; case Tlv::kNetworkKey: - rval = static_cast(aTlv).IsValid(); + rval = As(aTlv).IsValid(); break; case Tlv::kPskc: - rval = static_cast(aTlv).IsValid(); + rval = As(aTlv).IsValid(); break; case Tlv::kMeshLocalPrefix: - rval = static_cast(aTlv).IsValid(); + rval = As(aTlv).IsValid(); break; case Tlv::kSecurityPolicy: - rval = static_cast(aTlv).IsValid(); + rval = As(aTlv).IsValid(); break; case Tlv::kChannelMask: - rval = static_cast(aTlv).IsValid(); + rval = As(aTlv).IsValid(); break; default: diff --git a/src/core/meshcop/meshcop_tlvs.hpp b/src/core/meshcop/meshcop_tlvs.hpp index 42209a42a..378319df9 100644 --- a/src/core/meshcop/meshcop_tlvs.hpp +++ b/src/core/meshcop/meshcop_tlvs.hpp @@ -139,7 +139,7 @@ public: * @returns A pointer to the next TLV. * */ - Tlv *GetNext(void) { return static_cast(ot::Tlv::GetNext()); } + Tlv *GetNext(void) { return As(ot::Tlv::GetNext()); } /** * This method returns a pointer to the next TLV. @@ -147,7 +147,7 @@ public: * @returns A pointer to the next TLV. * */ - const Tlv *GetNext(void) const { return static_cast(ot::Tlv::GetNext()); } + const Tlv *GetNext(void) const { return As(ot::Tlv::GetNext()); } /** * This static method reads the requested TLV out of @p aMessage. @@ -235,7 +235,7 @@ public: */ template static TlvType *FindTlv(uint8_t *aTlvsStart, uint16_t aTlvsLength) { - return static_cast(FindTlv(aTlvsStart, aTlvsLength, static_cast(TlvType::kType))); + return As(FindTlv(aTlvsStart, aTlvsLength, static_cast(TlvType::kType))); } /** @@ -250,7 +250,7 @@ public: */ template static const TlvType *FindTlv(const uint8_t *aTlvsStart, uint16_t aTlvsLength) { - return static_cast(FindTlv(aTlvsStart, aTlvsLength, static_cast(TlvType::kType))); + return As(FindTlv(aTlvsStart, aTlvsLength, static_cast(TlvType::kType))); } } OT_TOOL_PACKED_END; diff --git a/src/core/thread/network_data.cpp b/src/core/thread/network_data.cpp index 2aa3f1e8e..2b7032d29 100644 --- a/src/core/thread/network_data.cpp +++ b/src/core/thread/network_data.cpp @@ -151,13 +151,13 @@ Error NetworkData::Iterate(Iterator &aIterator, uint16_t aRloc16, Config &aConfi case NetworkDataTlv::kTypePrefix: if ((aConfig.mOnMeshPrefix != nullptr) || (aConfig.mExternalRoute != nullptr)) { - subTlvs = static_cast(cur)->GetSubTlvs(); + subTlvs = As(cur)->GetSubTlvs(); } break; case NetworkDataTlv::kTypeService: if (aConfig.mService != nullptr) { - subTlvs = static_cast(cur)->GetSubTlvs(); + subTlvs = As(cur)->GetSubTlvs(); } break; default: @@ -175,13 +175,13 @@ Error NetworkData::Iterate(Iterator &aIterator, uint16_t aRloc16, Config &aConfi { if (cur->GetType() == NetworkDataTlv::kTypePrefix) { - const PrefixTlv *prefixTlv = static_cast(cur); + const PrefixTlv *prefixTlv = As(cur); switch (subCur->GetType()) { case NetworkDataTlv::kTypeBorderRouter: { - const BorderRouterTlv *borderRouter = static_cast(subCur); + const BorderRouterTlv *borderRouter = As(subCur); if (aConfig.mOnMeshPrefix == nullptr) { @@ -207,7 +207,7 @@ Error NetworkData::Iterate(Iterator &aIterator, uint16_t aRloc16, Config &aConfi case NetworkDataTlv::kTypeHasRoute: { - const HasRouteTlv *hasRoute = static_cast(subCur); + const HasRouteTlv *hasRoute = As(subCur); if (aConfig.mExternalRoute == nullptr) { @@ -237,7 +237,7 @@ Error NetworkData::Iterate(Iterator &aIterator, uint16_t aRloc16, Config &aConfi } else // cur is `ServiceTLv` { - const ServiceTlv *service = static_cast(cur); + const ServiceTlv *service = As(cur); if (aConfig.mService == nullptr) { @@ -246,7 +246,7 @@ Error NetworkData::Iterate(Iterator &aIterator, uint16_t aRloc16, Config &aConfi if (subCur->GetType() == NetworkDataTlv::kTypeServer) { - const ServerTlv *server = static_cast(subCur); + const ServerTlv *server = As(subCur); if (!iterator.IsNewEntry()) { @@ -402,7 +402,7 @@ void MutableNetworkData::RemoveTemporaryData(void) { case NetworkDataTlv::kTypePrefix: { - PrefixTlv *prefix = static_cast(cur); + PrefixTlv *prefix = As(cur); RemoveTemporaryDataIn(*prefix); @@ -417,7 +417,8 @@ void MutableNetworkData::RemoveTemporaryData(void) case NetworkDataTlv::kTypeService: { - ServiceTlv *service = static_cast(cur); + ServiceTlv *service = As(cur); + RemoveTemporaryDataIn(*service); if (service->GetSubTlvsLength() == 0) @@ -456,7 +457,7 @@ void MutableNetworkData::RemoveTemporaryDataIn(PrefixTlv &aPrefix) { case NetworkDataTlv::kTypeBorderRouter: { - BorderRouterTlv *borderRouter = static_cast(cur); + BorderRouterTlv *borderRouter = As(cur); ContextTlv * context = aPrefix.FindSubTlv(); // Replace p_border_router_16 @@ -478,7 +479,7 @@ void MutableNetworkData::RemoveTemporaryDataIn(PrefixTlv &aPrefix) case NetworkDataTlv::kTypeHasRoute: { - HasRouteTlv *hasRoute = static_cast(cur); + HasRouteTlv *hasRoute = As(cur); // Replace r_border_router_16 for (HasRouteEntry *entry = hasRoute->GetFirstEntry(); entry <= hasRoute->GetLastEntry(); @@ -518,11 +519,8 @@ void MutableNetworkData::RemoveTemporaryDataIn(ServiceTlv &aService) switch (cur->GetType()) { case NetworkDataTlv::kTypeServer: - { - ServerTlv *server = static_cast(cur); - server->SetServer16(Mle::Mle::ServiceAlocFromId(aService.GetServiceId())); + As(cur)->SetServer16(Mle::Mle::ServiceAlocFromId(aService.GetServiceId())); break; - } default: break; diff --git a/src/core/thread/network_data_leader.cpp b/src/core/thread/network_data_leader.cpp index fec66ce3d..9ff6ac3e1 100644 --- a/src/core/thread/network_data_leader.cpp +++ b/src/core/thread/network_data_leader.cpp @@ -394,8 +394,7 @@ Error LeaderBase::SetCommissioningData(const uint8_t *aValue, uint8_t aValueLeng if (aValueLength > 0) { VerifyOrExit(aValueLength <= kMaxSize - sizeof(CommissioningDataTlv), error = kErrorNoBufs); - commissioningDataTlv = - static_cast(AppendTlv(sizeof(CommissioningDataTlv) + aValueLength)); + commissioningDataTlv = As(AppendTlv(sizeof(CommissioningDataTlv) + aValueLength)); VerifyOrExit(commissioningDataTlv != nullptr, error = kErrorNoBufs); commissioningDataTlv->Init(); @@ -471,7 +470,7 @@ Error LeaderBase::SteeringDataCheck(const FilterIndexes &aFilterIndexes) const steeringDataTlv = GetCommissioningDataSubTlv(MeshCoP::Tlv::kSteeringData); VerifyOrExit(steeringDataTlv != nullptr, error = kErrorInvalidState); - static_cast(steeringDataTlv)->CopyTo(steeringData); + As(steeringDataTlv)->CopyTo(steeringData); VerifyOrExit(steeringData.Contains(aFilterIndexes), error = kErrorNotFound); diff --git a/src/core/thread/network_data_leader_ftd.cpp b/src/core/thread/network_data_leader_ftd.cpp index 2921f2136..da44fa1f0 100644 --- a/src/core/thread/network_data_leader_ftd.cpp +++ b/src/core/thread/network_data_leader_ftd.cpp @@ -223,7 +223,7 @@ void Leader::HandleCommissioningSet(Coap::Message &aMessage, const Ip6::MessageI } else if (type == MeshCoP::Tlv::kCommissionerSessionId) { - MeshCoP::CommissionerSessionIdTlv *tlv = static_cast(cur); + MeshCoP::CommissionerSessionIdTlv *tlv = As(cur); VerifyOrExit(tlv->IsValid()); sessionId = tlv->GetCommissionerSessionId(); @@ -255,8 +255,7 @@ void Leader::HandleCommissioningSet(Coap::Message &aMessage, const Ip6::MessageI { if (cur->GetType() == MeshCoP::Tlv::kCommissionerSessionId) { - VerifyOrExit(sessionId == - static_cast(cur)->GetCommissionerSessionId()); + VerifyOrExit(sessionId == As(cur)->GetCommissionerSessionId()); } else if (cur->GetType() == MeshCoP::Tlv::kBorderAgentLocator) { @@ -412,7 +411,7 @@ Error Leader::Validate(const NetworkData &aNetworkData, uint16_t aRloc16) { case NetworkDataTlv::kTypePrefix: { - const PrefixTlv *prefix = static_cast(cur); + const PrefixTlv *prefix = As(cur); VerifyOrExit(prefix->IsValid(), error = kErrorParse); @@ -426,7 +425,7 @@ Error Leader::Validate(const NetworkData &aNetworkData, uint16_t aRloc16) case NetworkDataTlv::kTypeService: { - const ServiceTlv *service = static_cast(cur); + const ServiceTlv *service = As(cur); ServiceData serviceData; VerifyOrExit(service->IsValid(), error = kErrorParse); @@ -473,7 +472,7 @@ Error Leader::ValidatePrefix(const PrefixTlv &aPrefix, uint16_t aRloc16) { case NetworkDataTlv::kTypeBorderRouter: { - const BorderRouterTlv *borderRouter = static_cast(subCur); + const BorderRouterTlv *borderRouter = As(subCur); // Ensure Prefix TLV contains at most one stable and one // temporary Border Router sub-TLV and the sub-TLVs have @@ -497,7 +496,7 @@ Error Leader::ValidatePrefix(const PrefixTlv &aPrefix, uint16_t aRloc16) case NetworkDataTlv::kTypeHasRoute: { - const HasRouteTlv *hasRoute = static_cast(subCur); + const HasRouteTlv *hasRoute = As(subCur); // Ensure Prefix TLV contains at most one stable and one // temporary Has Route sub-TLV and the sub-TLVs have a @@ -550,7 +549,7 @@ Error Leader::ValidateService(const ServiceTlv &aService, uint16_t aRloc16) { case NetworkDataTlv::kTypeServer: { - const ServerTlv *server = static_cast(subCur); + const ServerTlv *server = As(subCur); VerifyOrExit(!foundServer); foundServer = true; @@ -716,11 +715,11 @@ void Leader::RegisterNetworkData(uint16_t aRloc16, const NetworkData &aNetworkDa switch (cur->GetType()) { case NetworkDataTlv::kTypePrefix: - SuccessOrExit(error = AddPrefix(*static_cast(cur), flags)); + SuccessOrExit(error = AddPrefix(*As(cur), flags)); break; case NetworkDataTlv::kTypeService: - SuccessOrExit(error = AddService(*static_cast(cur), flags)); + SuccessOrExit(error = AddService(*As(cur), flags)); break; default: @@ -747,7 +746,7 @@ Error Leader::AddPrefix(const PrefixTlv &aPrefix, ChangedFlags &aChangedFlags) if (dstPrefix == nullptr) { - dstPrefix = static_cast(AppendTlv(PrefixTlv::CalculateSize(aPrefix.GetPrefixLength()))); + dstPrefix = As(AppendTlv(PrefixTlv::CalculateSize(aPrefix.GetPrefixLength()))); VerifyOrExit(dstPrefix != nullptr, error = kErrorNoBufs); dstPrefix->Init(aPrefix.GetDomainId(), aPrefix.GetPrefixLength(), aPrefix.GetPrefix()); @@ -758,12 +757,11 @@ Error Leader::AddPrefix(const PrefixTlv &aPrefix, ChangedFlags &aChangedFlags) switch (subCur->GetType()) { case NetworkDataTlv::kTypeHasRoute: - SuccessOrExit(error = AddHasRoute(*static_cast(subCur), *dstPrefix, aChangedFlags)); + SuccessOrExit(error = AddHasRoute(*As(subCur), *dstPrefix, aChangedFlags)); break; case NetworkDataTlv::kTypeBorderRouter: - SuccessOrExit( - error = AddBorderRouter(*static_cast(subCur), *dstPrefix, aChangedFlags)); + SuccessOrExit(error = AddBorderRouter(*As(subCur), *dstPrefix, aChangedFlags)); break; default: @@ -802,7 +800,7 @@ Error Leader::AddService(const ServiceTlv &aService, ChangedFlags &aChangedFlags SuccessOrExit(error = AllocateServiceId(serviceId)); - dstService = static_cast( + dstService = As( AppendTlv(ServiceTlv::CalculateSize(aService.GetEnterpriseNumber(), serviceData.GetLength()))); VerifyOrExit(dstService != nullptr, error = kErrorNoBufs); @@ -840,7 +838,7 @@ Error Leader::AddHasRoute(const HasRouteTlv &aHasRoute, PrefixTlv &aDstPrefix, C // Ensure there is space for `HasRouteTlv` and a single entry. VerifyOrExit(CanInsert(sizeof(HasRouteTlv) + sizeof(HasRouteEntry)), error = kErrorNoBufs); - dstHasRoute = static_cast(aDstPrefix.GetNext()); + dstHasRoute = As(aDstPrefix.GetNext()); Insert(dstHasRoute, sizeof(HasRouteTlv)); aDstPrefix.IncreaseLength(sizeof(HasRouteTlv)); dstHasRoute->Init(); @@ -890,7 +888,7 @@ Error Leader::AddBorderRouter(const BorderRouterTlv &aBorderRouter, PrefixTlv &a ((dstContext == nullptr) ? sizeof(ContextTlv) : 0)), error = kErrorNoBufs); - dstBorderRouter = static_cast(aDstPrefix.GetNext()); + dstBorderRouter = As(aDstPrefix.GetNext()); Insert(dstBorderRouter, sizeof(BorderRouterTlv)); aDstPrefix.IncreaseLength(sizeof(BorderRouterTlv)); dstBorderRouter->Init(); @@ -906,7 +904,7 @@ Error Leader::AddBorderRouter(const BorderRouterTlv &aBorderRouter, PrefixTlv &a // Ensure there is space for a `ContextTlv` and a single entry. VerifyOrExit(CanInsert(sizeof(BorderRouterEntry) + sizeof(ContextTlv)), error = kErrorNoBufs); - dstContext = static_cast(aDstPrefix.GetNext()); + dstContext = As(aDstPrefix.GetNext()); Insert(dstContext, sizeof(ContextTlv)); aDstPrefix.IncreaseLength(sizeof(ContextTlv)); dstContext->Init(static_cast(contextId), aDstPrefix.GetPrefixLength()); @@ -947,7 +945,7 @@ Error Leader::AddServer(const ServerTlv &aServer, ServiceTlv &aDstService, Chang aServer.GetServerData(serverData); - dstServer = static_cast(aDstService.GetNext()); + dstServer = As(aDstService.GetNext()); Insert(dstServer, tlvSize); dstServer->Init(aServer.GetServer16(), serverData); @@ -1068,7 +1066,7 @@ void Leader::RemoveRloc(uint16_t aRloc16, { case NetworkDataTlv::kTypePrefix: { - PrefixTlv * prefix = static_cast(cur); + PrefixTlv * prefix = As(cur); const PrefixTlv *excludePrefix = aExcludeNetworkData.FindPrefix(prefix->GetPrefix(), prefix->GetPrefixLength()); @@ -1085,7 +1083,7 @@ void Leader::RemoveRloc(uint16_t aRloc16, case NetworkDataTlv::kTypeService: { - ServiceTlv * service = static_cast(cur); + ServiceTlv * service = As(cur); ServiceData serviceData; const ServiceTlv *excludeService; @@ -1130,8 +1128,7 @@ void Leader::RemoveRlocInPrefix(PrefixTlv & aPrefix, switch (cur->GetType()) { case NetworkDataTlv::kTypeHasRoute: - RemoveRlocInHasRoute(aPrefix, *static_cast(cur), aRloc16, aMatchMode, aExcludePrefix, - aChangedFlags); + RemoveRlocInHasRoute(aPrefix, *As(cur), aRloc16, aMatchMode, aExcludePrefix, aChangedFlags); if (cur->GetLength() == 0) { @@ -1143,7 +1140,7 @@ void Leader::RemoveRlocInPrefix(PrefixTlv & aPrefix, break; case NetworkDataTlv::kTypeBorderRouter: - RemoveRlocInBorderRouter(aPrefix, *static_cast(cur), aRloc16, aMatchMode, aExcludePrefix, + RemoveRlocInBorderRouter(aPrefix, *As(cur), aRloc16, aMatchMode, aExcludePrefix, aChangedFlags); if (cur->GetLength() == 0) diff --git a/src/core/thread/network_data_local.cpp b/src/core/thread/network_data_local.cpp index 9cc7c5752..84415e761 100644 --- a/src/core/thread/network_data_local.cpp +++ b/src/core/thread/network_data_local.cpp @@ -96,7 +96,7 @@ Error Local::AddPrefix(const Ip6::Prefix &aPrefix, NetworkDataTlv::Type aSubTlvT ? sizeof(BorderRouterTlv) + sizeof(BorderRouterEntry) : sizeof(HasRouteTlv) + sizeof(HasRouteEntry); - prefixTlv = static_cast(AppendTlv(sizeof(PrefixTlv) + aPrefix.GetBytesSize() + subTlvLength)); + prefixTlv = As(AppendTlv(sizeof(PrefixTlv) + aPrefix.GetBytesSize() + subTlvLength)); VerifyOrExit(prefixTlv != nullptr, error = kErrorNoBufs); prefixTlv->Init(0, aPrefix); @@ -104,7 +104,7 @@ Error Local::AddPrefix(const Ip6::Prefix &aPrefix, NetworkDataTlv::Type aSubTlvT if (aSubTlvType == NetworkDataTlv::kTypeBorderRouter) { - BorderRouterTlv *brTlv = static_cast(prefixTlv->GetSubTlvs()); + BorderRouterTlv *brTlv = As(prefixTlv->GetSubTlvs()); brTlv->Init(); brTlv->SetLength(brTlv->GetLength() + sizeof(BorderRouterEntry)); brTlv->GetEntry(0)->Init(); @@ -112,7 +112,7 @@ Error Local::AddPrefix(const Ip6::Prefix &aPrefix, NetworkDataTlv::Type aSubTlvT } else // aSubTlvType is NetworkDataTlv::kTypeHasRoute { - HasRouteTlv *hasRouteTlv = static_cast(prefixTlv->GetSubTlvs()); + HasRouteTlv *hasRouteTlv = As(prefixTlv->GetSubTlvs()); hasRouteTlv->Init(); hasRouteTlv->SetLength(hasRouteTlv->GetLength() + sizeof(HasRouteEntry)); hasRouteTlv->GetEntry(0)->Init(); @@ -154,11 +154,11 @@ void Local::UpdateRloc(PrefixTlv &aPrefixTlv) switch (cur->GetType()) { case NetworkDataTlv::kTypeHasRoute: - static_cast(cur)->GetEntry(0)->SetRloc(rloc16); + As(cur)->GetEntry(0)->SetRloc(rloc16); break; case NetworkDataTlv::kTypeBorderRouter: - static_cast(cur)->GetEntry(0)->SetRloc(rloc16); + As(cur)->GetEntry(0)->SetRloc(rloc16); break; default: @@ -198,13 +198,13 @@ Error Local::AddService(uint32_t aEnterpriseNumber, VerifyOrExit(serviceTlvSize <= kMaxSize, error = kErrorNoBufs); - serviceTlv = static_cast(AppendTlv(serviceTlvSize)); + serviceTlv = As(AppendTlv(serviceTlvSize)); VerifyOrExit(serviceTlv != nullptr, error = kErrorNoBufs); serviceTlv->Init(/* aServiceId */ 0, aEnterpriseNumber, aServiceData); serviceTlv->SetSubTlvsLength(sizeof(ServerTlv) + aServerData.GetLength()); - serverTlv = static_cast(serviceTlv->GetSubTlvs()); + serverTlv = As(serviceTlv->GetSubTlvs()); serverTlv->Init(Get().GetRloc16(), aServerData); // According to Thread spec 1.1.1, section 5.18.6 Service TLV: @@ -245,7 +245,7 @@ void Local::UpdateRloc(ServiceTlv &aService) switch (cur->GetType()) { case NetworkDataTlv::kTypeServer: - static_cast(cur)->SetServer16(rloc16); + As(cur)->SetServer16(rloc16); break; default: @@ -271,14 +271,14 @@ void Local::UpdateRloc(void) { #if OPENTHREAD_CONFIG_BORDER_ROUTER_ENABLE case NetworkDataTlv::kTypePrefix: - UpdateRloc(*static_cast(cur)); + UpdateRloc(*As(cur)); break; #endif #if OPENTHREAD_CONFIG_TMF_NETDATA_SERVICE_ENABLE case NetworkDataTlv::kTypeService: - UpdateRloc(*static_cast(cur)); + UpdateRloc(*As(cur)); break; #endif diff --git a/src/core/thread/network_data_tlvs.hpp b/src/core/thread/network_data_tlvs.hpp index 6b3282c19..2fd372ed9 100644 --- a/src/core/thread/network_data_tlvs.hpp +++ b/src/core/thread/network_data_tlvs.hpp @@ -61,6 +61,68 @@ using ot::Encoding::BigEndian::HostSwap32; * */ +class NetworkDataTlv; + +/** + * This template method casts a `NetworkDataTlv` pointer to a given subclass `TlvType` pointer. + * + * @tparam TlvType The TLV type to cast into. MUST be a subclass of `NetworkDataTlv`. + * + * @param[in] aTlv A pointer to a `NetworkDataTlv` to convert/cast to a `TlvType`. + * + * @returns A `TlvType` pointer to `aTlv`. + * + */ +template TlvType *As(NetworkDataTlv *aTlv) +{ + return static_cast(aTlv); +} + +/** + * This template method casts a `NetworkDataTlv` pointer to a given subclass `TlvType` pointer. + * + * @tparam TlvType The TLV type to cast into. MUST be a subclass of `NetworkDataTlv`. + * + * @param[in] aTlv A pointer to a `NetworkDataTlv` to convert/cast to a `TlvType`. + * + * @returns A `TlvType` pointer to `aTlv`. + * + */ +template const TlvType *As(const NetworkDataTlv *aTlv) +{ + return static_cast(aTlv); +} + +/** + * This template method casts a `NetworkDataTlv` reference to a given subclass `TlvType` reference. + * + * @tparam TlvType The TLV type to cast into. MUST be a subclass of `NetworkDataTlv`. + * + * @param[in] aTlv A reference to a `NetworkDataTlv` to convert/cast to a `TlvType`. + * + * @returns A `TlvType` reference to `aTlv`. + * + */ +template TlvType &As(NetworkDataTlv &aTlv) +{ + return static_cast(aTlv); +} + +/** + * This template method casts a `NetworkDataTlv` reference to a given subclass `TlvType` reference. + * + * @tparam TlvType The TLV type to cast into. MUST be a subclass of `NetworkDataTlv`. + * + * @param[in] aTlv A reference to a `NetworkDataTlv` to convert/cast to a `TlvType`. + * + * @returns A `TlvType` reference to `aTlv`. + * + */ +template const TlvType &As(const NetworkDataTlv &aTlv) +{ + return static_cast(aTlv); +} + /** * This class implements Thread Network Data TLV generation and parsing. * @@ -250,7 +312,7 @@ public: */ template static TlvType *Find(NetworkDataTlv *aStart, NetworkDataTlv *aEnd) { - return static_cast(Find(aStart, aEnd, TlvType::kType)); + return As(Find(aStart, aEnd, TlvType::kType)); } /** @@ -266,7 +328,7 @@ public: */ template static const TlvType *Find(const NetworkDataTlv *aStart, const NetworkDataTlv *aEnd) { - return static_cast(Find(aStart, aEnd, TlvType::kType)); + return As(Find(aStart, aEnd, TlvType::kType)); } /** @@ -318,7 +380,7 @@ public: */ template static TlvType *Find(NetworkDataTlv *aStart, NetworkDataTlv *aEnd, bool aStable) { - return static_cast(Find(aStart, aEnd, TlvType::kType, aStable)); + return As(Find(aStart, aEnd, TlvType::kType, aStable)); } /** @@ -337,7 +399,7 @@ public: template static const TlvType *Find(const NetworkDataTlv *aStart, const NetworkDataTlv *aEnd, bool aStable) { - return static_cast(Find(aStart, aEnd, TlvType::kType, aStable)); + return As(Find(aStart, aEnd, TlvType::kType, aStable)); } private: @@ -738,7 +800,7 @@ public: */ template SubTlvType *FindSubTlv(void) { - return static_cast(FindSubTlv(SubTlvType::kType)); + return As(FindSubTlv(SubTlvType::kType)); } /** @@ -751,7 +813,7 @@ public: */ template const SubTlvType *FindSubTlv(void) const { - return static_cast(FindSubTlv(SubTlvType::kType)); + return As(FindSubTlv(SubTlvType::kType)); } /** @@ -766,7 +828,7 @@ public: */ template SubTlvType *FindSubTlv(bool aStable) { - return static_cast(FindSubTlv(static_cast(SubTlvType::kType), aStable)); + return As(FindSubTlv(static_cast(SubTlvType::kType), aStable)); } /** @@ -781,7 +843,7 @@ public: */ template const SubTlvType *FindSubTlv(bool aStable) const { - return static_cast(FindSubTlv(static_cast(SubTlvType::kType), aStable)); + return As(FindSubTlv(static_cast(SubTlvType::kType), aStable)); } /** @@ -1567,10 +1629,7 @@ public: * @returns A pointer to the next TLV, or `nullptr` if it can not be found. * */ - template const TlvType *Iterate(void) - { - return static_cast(Iterate(TlvType::kType)); - } + template const TlvType *Iterate(void) { return As(Iterate(TlvType::kType)); } /** * This template method iterates to the next TLV with a given type and stable flag. @@ -1584,7 +1643,7 @@ public: */ template const TlvType *Iterate(bool aStable) { - return static_cast(Iterate(TlvType::kType, aStable)); + return As(Iterate(TlvType::kType, aStable)); } private: diff --git a/src/core/thread/network_diagnostic.cpp b/src/core/thread/network_diagnostic.cpp index 00eaa7b2a..7e11b5ebb 100644 --- a/src/core/thread/network_diagnostic.cpp +++ b/src/core/thread/network_diagnostic.cpp @@ -802,7 +802,7 @@ Error NetworkDiagnostic::GetNextDiagTlv(const Coap::Message &aMessage, case NetworkDiagnosticTlv::kIp6AddressList: { - Ip6AddressListTlv &ip6AddrList = static_cast(tlv); + Ip6AddressListTlv &ip6AddrList = As(tlv); VerifyOrExit(ip6AddrList.IsValid(), error = kErrorParse); VerifyOrExit(sizeof(aNetworkDiagTlv.mData.mIp6AddrList.mList) >= ip6AddrList.GetLength(), @@ -834,7 +834,7 @@ Error NetworkDiagnostic::GetNextDiagTlv(const Coap::Message &aMessage, case NetworkDiagnosticTlv::kChildTable: { - ChildTableTlv &childTable = static_cast(tlv); + ChildTableTlv &childTable = As(tlv); VerifyOrExit(childTable.IsValid(), error = kErrorParse); VerifyOrExit(childTable.GetNumEntries() <= OT_ARRAY_LENGTH(aNetworkDiagTlv.mData.mChildTable.mTable),