diff --git a/etc/cmake/options.cmake b/etc/cmake/options.cmake index 7d552f593..22f338b9f 100644 --- a/etc/cmake/options.cmake +++ b/etc/cmake/options.cmake @@ -44,6 +44,22 @@ endif() option(OT_BACKBONE_ROUTER "enable backbone router functionality") if(OT_BACKBONE_ROUTER) target_compile_definitions(ot-config INTERFACE "OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE=1") + set(OT_BACKBONE_ROUTER_DUA_NDPROXYING ON CACHE BOOL "Enable DUA NDProxying by default") + set(OT_BACKBONE_ROUTER_MULTICAST_ROUTING ON CACHE BOOL "Enable Multicast Routing by default") +endif() + +option(OT_BACKBONE_ROUTER_DUA_NDPROXYING "enable Backbone Router DUA ND Proxying functionality" OFF) +if(OT_BACKBONE_ROUTER_DUA_NDPROXYING) + target_compile_definitions(ot-config INTERFACE "OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE=1") +else() + target_compile_definitions(ot-config INTERFACE "OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE=0") +endif() + +option(OT_BACKBONE_ROUTER_MULTICAST_ROUTING "enable Backbone Router Multicast Routing functionality" OFF) +if(OT_BACKBONE_ROUTER_MULTICAST_ROUTING) + target_compile_definitions(ot-config INTERFACE "OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE=1") +else() + target_compile_definitions(ot-config INTERFACE "OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE=0") endif() option(OT_BORDER_AGENT "enable border agent support") diff --git a/script/check-simulation-build-cmake b/script/check-simulation-build-cmake index 44859d753..487893009 100755 --- a/script/check-simulation-build-cmake +++ b/script/check-simulation-build-cmake @@ -46,6 +46,14 @@ build_all_features() reset_source "$(dirname "$0")"/cmake-build simulation -DOT_OTNS=ON -DOT_SIMULATION_VIRTUAL_TIME=ON -DOT_THREAD_VERSION=1.2 -DOT_DUA=ON -DOT_MLR=ON -DOT_BACKBONE_ROUTER=ON -DOT_CSL_RECEIVER=ON + # Build Thread 1.2 Backbone Router without DUA ND Proxying + reset_source + "$(dirname "$0")"/cmake-build simulation -DOT_OTNS=ON -DOT_SIMULATION_VIRTUAL_TIME=ON -DOT_THREAD_VERSION=1.2 -DOT_MLR=ON -DOT_BACKBONE_ROUTER=ON -DOT_CSL_RECEIVER=ON -DOT_BACKBONE_ROUTER_DUA_NDPROXYING=OFF + + # Build Thread 1.2 Backbone Router without Multicast Routing + reset_source + "$(dirname "$0")"/cmake-build simulation -DOT_OTNS=ON -DOT_SIMULATION_VIRTUAL_TIME=ON -DOT_THREAD_VERSION=1.2 -DOT_MLR=ON -DOT_BACKBONE_ROUTER=ON -DOT_CSL_RECEIVER=ON -DOT_BACKBONE_ROUTER_MULTICAST_ROUTING=OFF + # Build with Vendor Extension reset_source "$(dirname "$0")"/cmake-build simulation -DOT_VENDOR_EXTENSION=../../src/core/common/extension_example.cpp diff --git a/src/cli/cli.cpp b/src/cli/cli.cpp index 553546dd1..df6be4601 100644 --- a/src/cli/cli.cpp +++ b/src/cli/cli.cpp @@ -300,12 +300,14 @@ otError Interpreter::ProcessBackboneRouter(uint8_t aArgsLength, char *aArgs[]) #if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE if (strcmp(aArgs[0], "mgmt") == 0) { - uint8_t status; - - VerifyOrExit(aArgsLength >= 2, error = OT_ERROR_INVALID_COMMAND); - - if (strcmp(aArgs[1], "dua") == 0) + if (aArgsLength < 2) { + ExitNow(error = OT_ERROR_INVALID_COMMAND); + } +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE + else if (strcmp(aArgs[1], "dua") == 0) + { + uint8_t status; otIp6InterfaceIdentifier *mlIid = nullptr; otIp6InterfaceIdentifier iid; @@ -322,11 +324,14 @@ otError Interpreter::ProcessBackboneRouter(uint8_t aArgsLength, char *aArgs[]) otBackboneRouterConfigNextDuaRegistrationResponse(mInstance, mlIid, status); ExitNow(); } +#endif +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE else if (strcmp(aArgs[1], "mlr") == 0) { error = ProcessBackboneRouterMgmtMlr(aArgsLength - 2, aArgs + 2); ExitNow(); } +#endif } #endif // OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE SuccessOrExit(error = ProcessBackboneRouterLocal(aArgsLength, aArgs)); @@ -339,7 +344,7 @@ exit: #if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE -#if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE +#if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE && OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE otError Interpreter::ProcessBackboneRouterMgmtMlr(uint8_t aArgsLength, char *aArgs[]) { otError error = OT_ERROR_INVALID_COMMAND; @@ -405,7 +410,7 @@ void Interpreter::PrintMulticastListenersTable(void) } } -#endif // OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE +#endif // OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE && OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE otError Interpreter::ProcessBackboneRouterLocal(uint8_t aArgsLength, char *aArgs[]) { @@ -1547,7 +1552,7 @@ otError Interpreter::ProcessFake(uint8_t aArgsLength, char *aArgs[]) SuccessOrExit(error = ParseAsHexString(aArgs[3], mlIid.mFields.m8)); otThreadSendAddressNotification(mInstance, &destination, &target, &mlIid); } -#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE else if (strcmp(aArgs[0], "/b/ba") == 0) { otIp6Address target; diff --git a/src/cli/cli.hpp b/src/cli/cli.hpp index 6d3576dbd..ae171177f 100644 --- a/src/cli/cli.hpp +++ b/src/cli/cli.hpp @@ -299,7 +299,7 @@ private: #if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE otError ProcessBackboneRouterLocal(uint8_t aArgsLength, char *aArgs[]); -#if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE +#if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE && OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE otError ProcessBackboneRouterMgmtMlr(uint8_t aArgsLength, char *aArgs[]); void PrintMulticastListenersTable(void); #endif diff --git a/src/core/api/backbone_router_ftd_api.cpp b/src/core/api/backbone_router_ftd_api.cpp index e62a42be9..82bd37654 100644 --- a/src/core/api/backbone_router_ftd_api.cpp +++ b/src/core/api/backbone_router_ftd_api.cpp @@ -111,6 +111,37 @@ otError otBackboneRouterGetDomainPrefix(otInstance *aInstance, otBorderRouterCon *static_cast(aConfig)); } +void otBackboneRouterSetDomainPrefixCallback(otInstance * aInstance, + otBackboneRouterDomainPrefixCallback aCallback, + void * aContext) +{ + Instance &instance = *static_cast(aInstance); + + return instance.Get().SetDomainPrefixCallback(aCallback, aContext); +} + +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE +void otBackboneRouterSetNdProxyCallback(otInstance * aInstance, + otBackboneRouterNdProxyCallback aCallback, + void * aContext) +{ + Instance &instance = *static_cast(aInstance); + + instance.Get().SetCallback(aCallback, aContext); +} + +otError otBackboneRouterGetNdProxyInfo(otInstance * aInstance, + const otIp6Address * aDua, + otBackboneRouterNdProxyInfo *aNdProxyInfo) +{ + Instance &instance = *static_cast(aInstance); + + return instance.Get().GetInfo(reinterpret_cast(*aDua), + *aNdProxyInfo); +} +#endif // OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE + +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE void otBackboneRouterSetMulticastListenerCallback(otInstance * aInstance, otBackboneRouterMulticastListenerCallback aCallback, void * aContext) @@ -131,8 +162,10 @@ otError otBackboneRouterMulticastListenerGetNext(otInstance * return instance.Get().GetNext(*aIterator, *aListenerInfo); } +#endif #if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE void otBackboneRouterConfigNextDuaRegistrationResponse(otInstance * aInstance, const otIp6InterfaceIdentifier *aMlIid, uint8_t aStatus) @@ -142,7 +175,9 @@ void otBackboneRouterConfigNextDuaRegistrationResponse(otInstance * instance.Get().ConfigNextDuaRegistrationResponse( static_cast(aMlIid), aStatus); } +#endif +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE void otBackboneRouterConfigNextMulticastListenerRegistrationResponse(otInstance *aInstance, uint8_t aStatus) { Instance &instance = *static_cast(aInstance); @@ -180,34 +215,7 @@ otError otBackboneRouterMulticastListenerAdd(otInstance *aInstance, const otIp6A return instance.Get().Add(static_cast(*aAddress), TimerMilli::GetNow() + aTimeout); } +#endif // OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE #endif // OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE -void otBackboneRouterSetNdProxyCallback(otInstance * aInstance, - otBackboneRouterNdProxyCallback aCallback, - void * aContext) -{ - Instance &instance = *static_cast(aInstance); - - instance.Get().SetCallback(aCallback, aContext); -} - -otError otBackboneRouterGetNdProxyInfo(otInstance * aInstance, - const otIp6Address * aDua, - otBackboneRouterNdProxyInfo *aNdProxyInfo) -{ - Instance &instance = *static_cast(aInstance); - - return instance.Get().GetInfo(reinterpret_cast(*aDua), - *aNdProxyInfo); -} - -void otBackboneRouterSetDomainPrefixCallback(otInstance * aInstance, - otBackboneRouterDomainPrefixCallback aCallback, - void * aContext) -{ - Instance &instance = *static_cast(aInstance); - - return instance.Get().SetDomainPrefixCallback(aCallback, aContext); -} - #endif // OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE diff --git a/src/core/api/thread_ftd_api.cpp b/src/core/api/thread_ftd_api.cpp index 66e8151b4..eb5dc3a5f 100644 --- a/src/core/api/thread_ftd_api.cpp +++ b/src/core/api/thread_ftd_api.cpp @@ -408,7 +408,7 @@ void otThreadSendAddressNotification(otInstance * aInstance, static_cast(*aDestination)); } -#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE otError otThreadSendProactiveBackboneNotification(otInstance * aInstance, otIp6Address * aTarget, otIp6InterfaceIdentifier *aMlIid, diff --git a/src/core/backbone_router/bbr_leader.cpp b/src/core/backbone_router/bbr_leader.cpp index 0ad01c025..cf5f11e08 100644 --- a/src/core/backbone_router/bbr_leader.cpp +++ b/src/core/backbone_router/bbr_leader.cpp @@ -302,8 +302,10 @@ void Leader::UpdateDomainPrefixConfig(void) #if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE Get().HandleDomainPrefixUpdate(state); +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE Get().HandleDomainPrefixUpdate(state); #endif +#endif #if OPENTHREAD_CONFIG_DUA_ENABLE || OPENTHREAD_CONFIG_TMF_PROXY_DUA_ENABLE Get().HandleDomainPrefixUpdate(state); diff --git a/src/core/backbone_router/bbr_manager.cpp b/src/core/backbone_router/bbr_manager.cpp index b14155908..8e61f10b1 100644 --- a/src/core/backbone_router/bbr_manager.cpp +++ b/src/core/backbone_router/bbr_manager.cpp @@ -51,23 +51,39 @@ namespace BackboneRouter { Manager::Manager(Instance &aInstance) : InstanceLocator(aInstance) +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE , mMulticastListenerRegistration(UriPath::kMlr, Manager::HandleMulticastListenerRegistration, this) +#endif +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE , mDuaRegistration(UriPath::kDuaRegistrationRequest, Manager::HandleDuaRegistration, this) , mBackboneQuery(UriPath::kBackboneQuery, Manager::HandleBackboneQuery, this) , mBackboneAnswer(UriPath::kBackboneAnswer, Manager::HandleBackboneAnswer, this) , mNdProxyTable(aInstance) +#endif +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE , mMulticastListenersTable(aInstance) +#endif , mTimer(aInstance, Manager::HandleTimer, this) , mBackboneTmfAgent(aInstance) #if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE , mDuaResponseStatus(ThreadStatusTlv::kDuaSuccess) +#endif +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE , mMlrResponseStatus(ThreadStatusTlv::kMlrSuccess) +#endif +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE , mDuaResponseIsSpecified(false) +#endif +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE , mMlrResponseIsSpecified(false) #endif +#endif { +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE mBackboneTmfAgent.AddResource(mBackboneQuery); mBackboneTmfAgent.AddResource(mBackboneAnswer); +#endif } void Manager::HandleNotifierEvents(Events aEvents) @@ -78,10 +94,14 @@ void Manager::HandleNotifierEvents(Events aEvents) { if (Get().GetState() == OT_BACKBONE_ROUTER_STATE_DISABLED) { +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE Get().RemoveResource(mMulticastListenerRegistration); - Get().RemoveResource(mDuaRegistration); - mTimer.Stop(); mMulticastListenersTable.Clear(); +#endif +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE + Get().RemoveResource(mDuaRegistration); +#endif + mTimer.Stop(); error = mBackboneTmfAgent.Stop(); @@ -96,8 +116,12 @@ void Manager::HandleNotifierEvents(Events aEvents) } else { +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE Get().AddResource(mMulticastListenerRegistration); +#endif +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE Get().AddResource(mDuaRegistration); +#endif if (!mTimer.IsRunning()) { mTimer.Start(kTimerInterval); @@ -119,12 +143,18 @@ void Manager::HandleNotifierEvents(Events aEvents) void Manager::HandleTimer(void) { +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE mMulticastListenersTable.Expire(); +#endif + +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE mNdProxyTable.HandleTimer(); +#endif mTimer.Start(kTimerInterval); } +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE void Manager::HandleMulticastListenerRegistration(const Coap::Message &aMessage, const Ip6::MessageInfo &aMessageInfo) { otError error = OT_ERROR_NONE; @@ -338,7 +368,9 @@ exit: FreeMessageOnError(message, error); otLogInfoBbr("Sent BMLR.ntf: %s", otThreadErrorToString(error)); } +#endif // OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE void Manager::HandleDuaRegistration(const Coap::Message &aMessage, const Ip6::MessageInfo &aMessageInfo) { otError error = OT_ERROR_NONE; @@ -438,8 +470,10 @@ exit: otLogInfoBbr("Sent DUA.rsp for DUA %s, status %d %s", aTarget.ToString().AsCString(), aStatus, otThreadErrorToString(error)); } +#endif // OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE #if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE void Manager::ConfigNextDuaRegistrationResponse(const Ip6::InterfaceIdentifier *aMlIid, uint8_t aStatus) { mDuaResponseIsSpecified = true; @@ -455,14 +489,18 @@ void Manager::ConfigNextDuaRegistrationResponse(const Ip6::InterfaceIdentifier * mDuaResponseStatus = aStatus; } +#endif +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE void Manager::ConfigNextMulticastListenerRegistrationResponse(ThreadStatusTlv::MlrStatus aStatus) { mMlrResponseIsSpecified = true; mMlrResponseStatus = aStatus; } #endif +#endif +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE NdProxyTable &Manager::GetNdProxyTable(void) { return mNdProxyTable; @@ -758,6 +796,7 @@ exit: otLogInfoBbr("HandleProactiveBackboneNotification: %s, target=%s, mliid=%s, LTT=%lds", otThreadErrorToString(error), aDua.ToString().AsCString(), aMeshLocalIid.ToString().AsCString(), aTimeSinceLastTransaction); } +#endif // OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE } // namespace BackboneRouter diff --git a/src/core/backbone_router/bbr_manager.hpp b/src/core/backbone_router/bbr_manager.hpp index 62ffa6b6e..597aa03f4 100644 --- a/src/core/backbone_router/bbr_manager.hpp +++ b/src/core/backbone_router/bbr_manager.hpp @@ -70,6 +70,7 @@ public: */ explicit Manager(Instance &aInstance); +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE /** * This method returns the NdProxy Table. * @@ -77,6 +78,7 @@ public: * */ NdProxyTable &GetNdProxyTable(void); +#endif #if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE /** @@ -92,6 +94,7 @@ public: */ void ConfigNextDuaRegistrationResponse(const Ip6::InterfaceIdentifier *aMlIid, uint8_t aStatus); +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE /** * This method configures response status for next Multicast Listener Registration. * @@ -102,9 +105,10 @@ public: * */ void ConfigNextMulticastListenerRegistrationResponse(ThreadStatusTlv::MlrStatus aStatus); - +#endif #endif +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE /** * This method gets the Multicast Listeners Table. * @@ -112,6 +116,7 @@ public: * */ MulticastListenersTable &GetMulticastListenersTable(void) { return mMulticastListenersTable; } +#endif /** * This method returns if messages destined to a given Domain Unicast Address should be forwarded to the Backbone @@ -168,6 +173,7 @@ private: kTimerInterval = 1000, }; +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE static void HandleMulticastListenerRegistration(void * aContext, otMessage * aMessage, const otMessageInfo *aMessageInfo) @@ -176,6 +182,7 @@ private: *static_cast(aMessage), *static_cast(aMessageInfo)); } void HandleMulticastListenerRegistration(const Coap::Message &aMessage, const Ip6::MessageInfo &aMessageInfo); + void SendMulticastListenerRegistrationResponse(const Coap::Message & aMessage, const Ip6::MessageInfo & aMessageInfo, ThreadStatusTlv::MlrStatus aStatus, @@ -184,7 +191,9 @@ private: void SendBackboneMulticastListenerRegistration(const Ip6::Address *aAddresses, uint8_t aAddressNum, uint32_t aTimeout); +#endif +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE static void HandleDuaRegistration(void *aContext, otMessage *aMessage, const otMessageInfo *aMessageInfo) { static_cast(aContext)->HandleDuaRegistration(*static_cast(aMessage), @@ -217,29 +226,43 @@ private: const Ip6::MessageInfo & aMessageInfo, const Ip6::Address & aTarget, ThreadStatusTlv::DuaStatus aStatus); - +#endif void HandleNotifierEvents(Events aEvents); static void HandleTimer(Timer &aTimer) { aTimer.GetOwner().HandleTimer(); } void HandleTimer(void); +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE Coap::Resource mMulticastListenerRegistration; +#endif +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE Coap::Resource mDuaRegistration; Coap::Resource mBackboneQuery; Coap::Resource mBackboneAnswer; NdProxyTable mNdProxyTable; +#endif +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE MulticastListenersTable mMulticastListenersTable; - TimerMilli mTimer; +#endif + TimerMilli mTimer; BackboneTmfAgent mBackboneTmfAgent; #if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE - Ip6::InterfaceIdentifier mDuaResponseTargetMlIid; - uint8_t mDuaResponseStatus; +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE + Ip6::InterfaceIdentifier mDuaResponseTargetMlIid; + uint8_t mDuaResponseStatus; +#endif +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE ThreadStatusTlv::MlrStatus mMlrResponseStatus; - bool mDuaResponseIsSpecified : 1; - bool mMlrResponseIsSpecified : 1; +#endif +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE + bool mDuaResponseIsSpecified : 1; +#endif +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE + bool mMlrResponseIsSpecified : 1; +#endif #endif }; diff --git a/src/core/backbone_router/multicast_listeners_table.cpp b/src/core/backbone_router/multicast_listeners_table.cpp index f1e9ed8ac..83e8d45c0 100644 --- a/src/core/backbone_router/multicast_listeners_table.cpp +++ b/src/core/backbone_router/multicast_listeners_table.cpp @@ -33,7 +33,7 @@ #include "multicast_listeners_table.hpp" -#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE +#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE #include "common/code_utils.hpp" #include "common/instance.hpp" @@ -311,4 +311,4 @@ exit: } // namespace ot -#endif // OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE +#endif // OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE diff --git a/src/core/backbone_router/multicast_listeners_table.hpp b/src/core/backbone_router/multicast_listeners_table.hpp index 759d8a721..0ff015946 100644 --- a/src/core/backbone_router/multicast_listeners_table.hpp +++ b/src/core/backbone_router/multicast_listeners_table.hpp @@ -36,7 +36,7 @@ #include "openthread-core-config.h" -#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE +#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE #include @@ -235,6 +235,6 @@ private: } // namespace ot -#endif // OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE +#endif // OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE #endif // MULTICAST_LISTENERS_TABLE_HPP diff --git a/src/core/backbone_router/ndproxy_table.cpp b/src/core/backbone_router/ndproxy_table.cpp index f755f0f43..d8f3a8873 100644 --- a/src/core/backbone_router/ndproxy_table.cpp +++ b/src/core/backbone_router/ndproxy_table.cpp @@ -33,7 +33,7 @@ #include "ndproxy_table.hpp" -#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE +#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE #include "common/locator-getters.hpp" #include "common/logging.hpp" @@ -361,4 +361,4 @@ exit: } // namespace ot -#endif // OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE +#endif // OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE diff --git a/src/core/backbone_router/ndproxy_table.hpp b/src/core/backbone_router/ndproxy_table.hpp index 24081be59..ece89b901 100644 --- a/src/core/backbone_router/ndproxy_table.hpp +++ b/src/core/backbone_router/ndproxy_table.hpp @@ -35,7 +35,7 @@ #include "openthread-core-config.h" -#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE +#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE #include @@ -311,6 +311,6 @@ private: } // namespace ot -#endif // OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE +#endif // OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE #endif // NDPROXY_TABLE_HPP_ diff --git a/src/core/common/instance.hpp b/src/core/common/instance.hpp index 8a57c61ee..031f501ff 100644 --- a/src/core/common/instance.hpp +++ b/src/core/common/instance.hpp @@ -777,15 +777,20 @@ template <> inline BackboneRouter::Manager &Instance::Get(void) { return mThreadNetif.mBackboneRouterManager; } + +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE template <> inline BackboneRouter::MulticastListenersTable &Instance::Get(void) { return mThreadNetif.mBackboneRouterManager.GetMulticastListenersTable(); } +#endif +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE template <> inline BackboneRouter::NdProxyTable &Instance::Get(void) { return mThreadNetif.mBackboneRouterManager.GetNdProxyTable(); } +#endif template <> inline BackboneRouter::BackboneTmfAgent &Instance::Get(void) { diff --git a/src/core/config/backbone_router.h b/src/core/config/backbone_router.h index a54e675cc..e2bdbd338 100644 --- a/src/core/config/backbone_router.h +++ b/src/core/config/backbone_router.h @@ -45,6 +45,46 @@ #define OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE 0 #endif +/** + * @def OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE + * + * Define to 1 to enable Backbone Router ND Proxying for Thread 1.2 DUA feature. + * It's turned on by default for Thread 1.2 Backbone Router. + * + */ +#ifndef OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE +#define OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE +#endif + +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE && !OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE +#error \ + "OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE is required for OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE" +#endif + +/** + * @def OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE + * + * Define to 1 to enable Backbone Router Multicast Routing for Thread 1.2 MLR feature. + * It's turned on by default for Thread 1.2 Backbone Router. + * + */ +#ifndef OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE +#define OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE +#endif + +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE && !OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE +#error \ + "OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE is required for OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE" +#endif + +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE +#if !OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE && \ + !OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE +#error \ + "At least one of OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE and OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE must be enabled for OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE" +#endif +#endif + /** * @def OPENTHREAD_CONFIG_MAX_MULTICAST_LISTENERS * diff --git a/src/core/net/ip6.cpp b/src/core/net/ip6.cpp index 79bc807f6..93da2099f 100644 --- a/src/core/net/ip6.cpp +++ b/src/core/net/ip6.cpp @@ -1324,7 +1324,7 @@ bool Ip6::ShouldForwardToThread(const MessageInfo &aMessageInfo, bool aFromNcpHo else if (IsOnLink(aMessageInfo.GetSockAddr())) { // on-link global address -#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE +#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE ExitNow(rval = (aFromNcpHost || !Get().ShouldForwardDuaToBackbone(aMessageInfo.GetSockAddr()))); #else diff --git a/src/core/thread/address_resolver.cpp b/src/core/thread/address_resolver.cpp index 1c05a1c76..7d2f0e7af 100644 --- a/src/core/thread/address_resolver.cpp +++ b/src/core/thread/address_resolver.cpp @@ -545,7 +545,7 @@ exit: Get().RegisterReceiver(TimeTicker::kAddressResolver); FreeMessageOnError(message, error); -#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE if (Get().IsPrimary() && Get().IsDomainUnicast(aEid)) { uint16_t selfRloc16 = Get().GetRloc16(); @@ -796,7 +796,7 @@ void AddressResolver::HandleAddressQuery(Coap::Message &aMessage, const Ip6::Mes } } -#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE +#if OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE if (Get().IsPrimary() && Get().IsDomainUnicast(target)) { uint16_t srcRloc16 = aMessageInfo.GetPeerAddr().GetIid().GetLocator(); diff --git a/tests/unit/test_multicast_listeners_table.cpp b/tests/unit/test_multicast_listeners_table.cpp index 7c66aa097..70efcde95 100644 --- a/tests/unit/test_multicast_listeners_table.cpp +++ b/tests/unit/test_multicast_listeners_table.cpp @@ -28,7 +28,7 @@ #include "openthread-core-config.h" -#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE +#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE #include "test_platform.h" @@ -210,4 +210,4 @@ int main(void) { return 0; } -#endif +#endif // OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE diff --git a/tests/unit/test_ndproxy_table.cpp b/tests/unit/test_ndproxy_table.cpp index 042cd2634..73db96591 100644 --- a/tests/unit/test_ndproxy_table.cpp +++ b/tests/unit/test_ndproxy_table.cpp @@ -28,7 +28,7 @@ #include "openthread-core-config.h" -#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE +#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE #include "test_platform.h" @@ -120,4 +120,4 @@ int main(void) { return 0; } -#endif +#endif // OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE