diff --git a/src/core/thread/network_data.cpp b/src/core/thread/network_data.cpp index 77219d3d1..c8a645cf7 100644 --- a/src/core/thread/network_data.cpp +++ b/src/core/thread/network_data.cpp @@ -47,6 +47,72 @@ namespace ot { namespace NetworkData { +void OnMeshPrefixConfig::SetFrom(const PrefixTlv & aPrefixTlv, + const BorderRouterTlv & aBorderRouterTlv, + const BorderRouterEntry &aBorderRouterEntry) +{ + Clear(); + + aPrefixTlv.CopyPrefixTo(GetPrefix()); + mPreference = aBorderRouterEntry.GetPreference(); + mPreferred = aBorderRouterEntry.IsPreferred(); + mSlaac = aBorderRouterEntry.IsSlaac(); + mDhcp = aBorderRouterEntry.IsDhcp(); + mConfigure = aBorderRouterEntry.IsConfigure(); + mDefaultRoute = aBorderRouterEntry.IsDefaultRoute(); + mOnMesh = aBorderRouterEntry.IsOnMesh(); + mStable = aBorderRouterTlv.IsStable(); + mRloc16 = aBorderRouterEntry.GetRloc(); + mNdDns = aBorderRouterEntry.IsNdDns(); + mDp = aBorderRouterEntry.IsDp(); +} + +void ExternalRouteConfig::SetFrom(Instance & aInstance, + const PrefixTlv & aPrefixTlv, + const HasRouteTlv & aHasRouteTlv, + const HasRouteEntry &aHasRouteEntry) +{ + Clear(); + + aPrefixTlv.CopyPrefixTo(GetPrefix()); + mPreference = aHasRouteEntry.GetPreference(); + mStable = aHasRouteTlv.IsStable(); + mRloc16 = aHasRouteEntry.GetRloc(); + mNextHopIsThisDevice = (aHasRouteEntry.GetRloc() == aInstance.Get().GetRloc16()); +} + +bool ServiceConfig::ServerConfig::operator==(const ServerConfig &aOther) const +{ + return (mStable == aOther.mStable) && (mServerDataLength == aOther.mServerDataLength) && + (memcmp(mServerData, aOther.mServerData, mServerDataLength) == 0); +} + +void ServiceConfig::ServerConfig::SetFrom(const ServerTlv &aServerTlv) +{ + mStable = aServerTlv.IsStable(); + mRloc16 = aServerTlv.GetServer16(); + mServerDataLength = aServerTlv.GetServerDataLength(); + memcpy(&mServerData, aServerTlv.GetServerData(), mServerDataLength); +} + +bool ServiceConfig::operator==(const ServiceConfig &aOther) const +{ + return (mEnterpriseNumber == aOther.mEnterpriseNumber) && (mServiceDataLength == aOther.mServiceDataLength) && + (memcmp(mServiceData, aOther.mServiceData, mServiceDataLength) == 0) && + (GetServerConfig() == aOther.GetServerConfig()); +} + +void ServiceConfig::SetFrom(const ServiceTlv &aServiceTlv, const ServerTlv &aServerTlv) +{ + Clear(); + + mServiceId = aServiceTlv.GetServiceId(); + mEnterpriseNumber = aServiceTlv.GetEnterpriseNumber(); + mServiceDataLength = aServiceTlv.GetServiceDataLength(); + memcpy(&mServiceData, aServiceTlv.GetServiceData(), mServiceDataLength); + GetServerConfig().SetFrom(aServerTlv); +} + NetworkData::NetworkData(Instance &aInstance, Type aType) : InstanceLocator(aInstance) , mType(aType) @@ -239,20 +305,7 @@ otError NetworkData::Iterate(Iterator &aIterator, uint16_t aRloc16, Config &aCon aConfig.mExternalRoute = nullptr; aConfig.mService = nullptr; - aConfig.mOnMeshPrefix->Clear(); - - prefixTlv->CopyPrefixTo(aConfig.mOnMeshPrefix->GetPrefix()); - aConfig.mOnMeshPrefix->mPreference = borderRouterEntry->GetPreference(); - aConfig.mOnMeshPrefix->mPreferred = borderRouterEntry->IsPreferred(); - aConfig.mOnMeshPrefix->mSlaac = borderRouterEntry->IsSlaac(); - aConfig.mOnMeshPrefix->mDhcp = borderRouterEntry->IsDhcp(); - aConfig.mOnMeshPrefix->mConfigure = borderRouterEntry->IsConfigure(); - aConfig.mOnMeshPrefix->mDefaultRoute = borderRouterEntry->IsDefaultRoute(); - aConfig.mOnMeshPrefix->mOnMesh = borderRouterEntry->IsOnMesh(); - aConfig.mOnMeshPrefix->mStable = borderRouter->IsStable(); - aConfig.mOnMeshPrefix->mRloc16 = borderRouterEntry->GetRloc(); - aConfig.mOnMeshPrefix->mNdDns = borderRouterEntry->IsNdDns(); - aConfig.mOnMeshPrefix->mDp = borderRouterEntry->IsDp(); + aConfig.mOnMeshPrefix->SetFrom(*prefixTlv, *borderRouter, *borderRouterEntry); ExitNow(error = OT_ERROR_NONE); } @@ -278,14 +331,7 @@ otError NetworkData::Iterate(Iterator &aIterator, uint16_t aRloc16, Config &aCon aConfig.mOnMeshPrefix = nullptr; aConfig.mService = nullptr; - aConfig.mExternalRoute->Clear(); - - prefixTlv->CopyPrefixTo(aConfig.mExternalRoute->GetPrefix()); - aConfig.mExternalRoute->mPreference = hasRouteEntry->GetPreference(); - aConfig.mExternalRoute->mStable = hasRoute->IsStable(); - aConfig.mExternalRoute->mRloc16 = hasRouteEntry->GetRloc(); - aConfig.mExternalRoute->mNextHopIsThisDevice = - (hasRouteEntry->GetRloc() == Get().GetRloc16()); + aConfig.mExternalRoute->SetFrom(GetInstance(), *prefixTlv, *hasRoute, *hasRouteEntry); ExitNow(error = OT_ERROR_NONE); } @@ -315,20 +361,7 @@ otError NetworkData::Iterate(Iterator &aIterator, uint16_t aRloc16, Config &aCon { aConfig.mOnMeshPrefix = nullptr; aConfig.mExternalRoute = nullptr; - aConfig.mService->Clear(); - - aConfig.mService->mServiceId = service->GetServiceId(); - aConfig.mService->mEnterpriseNumber = service->GetEnterpriseNumber(); - aConfig.mService->mServiceDataLength = service->GetServiceDataLength(); - - memcpy(&aConfig.mService->mServiceData, service->GetServiceData(), - service->GetServiceDataLength()); - - aConfig.mService->mServerConfig.mStable = server->IsStable(); - aConfig.mService->mServerConfig.mServerDataLength = server->GetServerDataLength(); - memcpy(&aConfig.mService->mServerConfig.mServerData, server->GetServerData(), - server->GetServerDataLength()); - aConfig.mService->mServerConfig.mRloc16 = server->GetServer16(); + aConfig.mService->SetFrom(*service, *server); iterator.MarkEntryAsNotNew(); @@ -369,7 +402,7 @@ bool NetworkData::ContainsOnMeshPrefixes(const NetworkData &aCompare, uint16_t a while ((error = GetNextOnMeshPrefix(innerIterator, aRloc16, innerConfig)) == OT_ERROR_NONE) { - if (memcmp(&outerConfig, &innerConfig, sizeof(outerConfig)) == 0) + if (outerConfig == innerConfig) { break; } @@ -399,7 +432,7 @@ bool NetworkData::ContainsExternalRoutes(const NetworkData &aCompare, uint16_t a while ((error = GetNextExternalRoute(innerIterator, aRloc16, innerConfig)) == OT_ERROR_NONE) { - if (memcmp(&outerConfig, &innerConfig, sizeof(outerConfig)) == 0) + if (outerConfig == innerConfig) { break; } @@ -429,13 +462,7 @@ bool NetworkData::ContainsServices(const NetworkData &aCompare, uint16_t aRloc16 while ((error = GetNextService(innerIterator, aRloc16, innerConfig)) == OT_ERROR_NONE) { - if ((outerConfig.mEnterpriseNumber == innerConfig.mEnterpriseNumber) && - (outerConfig.mServiceDataLength == innerConfig.mServiceDataLength) && - (memcmp(outerConfig.mServiceData, innerConfig.mServiceData, outerConfig.mServiceDataLength) == 0) && - (outerConfig.mServerConfig.mStable == innerConfig.mServerConfig.mStable) && - (outerConfig.mServerConfig.mServerDataLength == innerConfig.mServerConfig.mServerDataLength) && - (memcmp(outerConfig.mServerConfig.mServerData, innerConfig.mServerConfig.mServerData, - outerConfig.mServerConfig.mServerDataLength) == 0)) + if (outerConfig == innerConfig) { break; } diff --git a/src/core/thread/network_data.hpp b/src/core/thread/network_data.hpp index 1cd3a27a9..e8744cf89 100644 --- a/src/core/thread/network_data.hpp +++ b/src/core/thread/network_data.hpp @@ -41,6 +41,7 @@ #include "coap/coap.hpp" #include "common/clearable.hpp" +#include "common/equatable.hpp" #include "common/locator.hpp" #include "common/timer.hpp" #include "net/udp6.hpp" @@ -100,11 +101,15 @@ typedef otNetworkDataIterator Iterator; * This class represents an On Mesh Prefix (Border Router) configuration. * */ -class OnMeshPrefixConfig : public otBorderRouterConfig, public Clearable +class OnMeshPrefixConfig : public otBorderRouterConfig, + public Clearable, + public Equatable { + friend class NetworkData; + public: /** - * This method get the prefix. + * This method gets the prefix. * * @return The prefix. * @@ -112,23 +117,32 @@ public: const Ip6::Prefix &GetPrefix(void) const { return static_cast(mPrefix); } /** - * This method get the prefix. + * This method gets the prefix. * * @return The prefix. * */ Ip6::Prefix &GetPrefix(void) { return static_cast(mPrefix); } + +private: + void SetFrom(const PrefixTlv & aPrefixTlv, + const BorderRouterTlv & aBorderRouterTlv, + const BorderRouterEntry &aBorderRouterEntry); }; /** * This class represents an External Route configuration. * */ -class ExternalRouteConfig : public otExternalRouteConfig, public Clearable +class ExternalRouteConfig : public otExternalRouteConfig, + public Clearable, + public Equatable { + friend class NetworkData; + public: /** - * This method get the prefix. + * This method gets the prefix. * * @return The prefix. * @@ -136,12 +150,18 @@ public: const Ip6::Prefix &GetPrefix(void) const { return static_cast(mPrefix); } /** - * This method get the prefix. + * This method gets the prefix. * * @return The prefix. * */ Ip6::Prefix &GetPrefix(void) { return static_cast(mPrefix); } + +private: + void SetFrom(Instance & aInstance, + const PrefixTlv & aPrefixTlv, + const HasRouteTlv & aHasRouteTlv, + const HasRouteEntry &aEntry); }; /** @@ -150,6 +170,84 @@ public: */ class ServiceConfig : public otServiceConfig, public Clearable { + friend class NetworkData; + +public: + /** + * This class represents a Server configuration. + * + */ + class ServerConfig : public otServerConfig + { + friend class ServiceConfig; + + public: + /** + * This method overloads operator `==` to evaluate whether or not two `ServerConfig` instances are equal. + * + * @param[in] aOther The other `ServerConfig` instance to compare with. + * + * @retval TRUE If the two `ServerConfig` instances are equal. + * @retval FALSE If the two `ServerConfig` instances are not equal. + * + */ + bool operator==(const ServerConfig &aOther) const; + + /** + * This method overloads operator `!=` to evaluate whether or not two `ServerConfig` instances are unequal. + * + * @param[in] aOther The other `ServerConfig` instance to compare with. + * + * @retval TRUE If the two `ServerConfig` instances are unequal. + * @retval FALSE If the two `ServerConfig` instances are not unequal. + * + */ + bool operator!=(const ServerConfig &aOther) const { return !(*this == aOther); } + + private: + void SetFrom(const ServerTlv &aServerTlv); + }; + + /** + * This method gets the Server configuration. + * + * @returns The Server configuration. + * + */ + const ServerConfig &GetServerConfig(void) const { return static_cast(mServerConfig); } + + /** + * This method gets the Server configuration. + * + * @returns The Server configuration. + * + */ + ServerConfig &GetServerConfig(void) { return static_cast(mServerConfig); } + + /** + * This method overloads operator `==` to evaluate whether or not two `ServiceConfig` instances are equal. + * + * @param[in] aOther The other `ServiceConfig` instance to compare with. + * + * @retval TRUE If the two `ServiceConfig` instances are equal. + * @retval FALSE If the two `ServiceConfig` instances are not equal. + * + */ + bool operator==(const ServiceConfig &aOther) const; + + /** + * This method overloads operator `!=` to evaluate whether or not two `ServiceConfig` instances are unequal. + * + * @param[in] aOther The other `ServiceConfig` instance to compare with. + * + * @retval TRUE If the two `ServiceConfig` instances are unequal. + * @retval FALSE If the two `ServiceConfig` instances are not unequal. + * + */ + bool operator!=(const ServiceConfig &aOther) const { return !(*this == aOther); } + +private: + void SetFrom(const ServiceTlv &aServiceTlv, const ServerTlv &aServerTlv); }; /**