1 /*
2 * Copyright (c) 2019, The OpenThread Authors.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * 3. Neither the name of the copyright holder nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 */
28
29 /**
30 * @file
31 * This file defines the OpenThread Backbone Router API (for Thread 1.2 FTD with
32 * `OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE`).
33 */
34
35 #include "openthread-core-config.h"
36
37 #if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE
38
39 #include <openthread/backbone_router_ftd.h>
40
41 #include "common/as_core_type.hpp"
42 #include "common/locator_getters.hpp"
43
44 using namespace ot;
45
otBackboneRouterSetEnabled(otInstance * aInstance,bool aEnabled)46 void otBackboneRouterSetEnabled(otInstance *aInstance, bool aEnabled)
47 {
48 return AsCoreType(aInstance).Get<BackboneRouter::Local>().SetEnabled(aEnabled);
49 }
50
otBackboneRouterGetState(otInstance * aInstance)51 otBackboneRouterState otBackboneRouterGetState(otInstance *aInstance)
52 {
53 return MapEnum(AsCoreType(aInstance).Get<BackboneRouter::Local>().GetState());
54 }
55
otBackboneRouterGetConfig(otInstance * aInstance,otBackboneRouterConfig * aConfig)56 void otBackboneRouterGetConfig(otInstance *aInstance, otBackboneRouterConfig *aConfig)
57 {
58 AssertPointerIsNotNull(aConfig);
59
60 AsCoreType(aInstance).Get<BackboneRouter::Local>().GetConfig(*aConfig);
61 }
62
otBackboneRouterSetConfig(otInstance * aInstance,const otBackboneRouterConfig * aConfig)63 otError otBackboneRouterSetConfig(otInstance *aInstance, const otBackboneRouterConfig *aConfig)
64 {
65 AssertPointerIsNotNull(aConfig);
66
67 return AsCoreType(aInstance).Get<BackboneRouter::Local>().SetConfig(*aConfig);
68 }
69
otBackboneRouterRegister(otInstance * aInstance)70 otError otBackboneRouterRegister(otInstance *aInstance)
71 {
72 return AsCoreType(aInstance).Get<BackboneRouter::Local>().AddService(true /* Force registration */);
73 }
74
otBackboneRouterGetRegistrationJitter(otInstance * aInstance)75 uint8_t otBackboneRouterGetRegistrationJitter(otInstance *aInstance)
76 {
77 return AsCoreType(aInstance).Get<BackboneRouter::Local>().GetRegistrationJitter();
78 }
79
otBackboneRouterSetRegistrationJitter(otInstance * aInstance,uint8_t aJitter)80 void otBackboneRouterSetRegistrationJitter(otInstance *aInstance, uint8_t aJitter)
81 {
82 return AsCoreType(aInstance).Get<BackboneRouter::Local>().SetRegistrationJitter(aJitter);
83 }
84
otBackboneRouterGetDomainPrefix(otInstance * aInstance,otBorderRouterConfig * aConfig)85 otError otBackboneRouterGetDomainPrefix(otInstance *aInstance, otBorderRouterConfig *aConfig)
86 {
87 return AsCoreType(aInstance).Get<BackboneRouter::Local>().GetDomainPrefix(AsCoreType(aConfig));
88 }
89
otBackboneRouterSetDomainPrefixCallback(otInstance * aInstance,otBackboneRouterDomainPrefixCallback aCallback,void * aContext)90 void otBackboneRouterSetDomainPrefixCallback(otInstance *aInstance,
91 otBackboneRouterDomainPrefixCallback aCallback,
92 void *aContext)
93 {
94 return AsCoreType(aInstance).Get<BackboneRouter::Local>().SetDomainPrefixCallback(aCallback, aContext);
95 }
96
97 #if OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE
otBackboneRouterSetNdProxyCallback(otInstance * aInstance,otBackboneRouterNdProxyCallback aCallback,void * aContext)98 void otBackboneRouterSetNdProxyCallback(otInstance *aInstance,
99 otBackboneRouterNdProxyCallback aCallback,
100 void *aContext)
101 {
102 AsCoreType(aInstance).Get<BackboneRouter::NdProxyTable>().SetCallback(aCallback, aContext);
103 }
104
otBackboneRouterGetNdProxyInfo(otInstance * aInstance,const otIp6Address * aDua,otBackboneRouterNdProxyInfo * aNdProxyInfo)105 otError otBackboneRouterGetNdProxyInfo(otInstance *aInstance,
106 const otIp6Address *aDua,
107 otBackboneRouterNdProxyInfo *aNdProxyInfo)
108 {
109 AssertPointerIsNotNull(aNdProxyInfo);
110
111 return AsCoreType(aInstance).Get<BackboneRouter::NdProxyTable>().GetInfo(
112 reinterpret_cast<const Ip6::Address &>(*aDua), *aNdProxyInfo);
113 }
114 #endif // OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE
115
116 #if OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE
otBackboneRouterSetMulticastListenerCallback(otInstance * aInstance,otBackboneRouterMulticastListenerCallback aCallback,void * aContext)117 void otBackboneRouterSetMulticastListenerCallback(otInstance *aInstance,
118 otBackboneRouterMulticastListenerCallback aCallback,
119 void *aContext)
120 {
121 AsCoreType(aInstance).Get<BackboneRouter::MulticastListenersTable>().SetCallback(aCallback, aContext);
122 }
123
otBackboneRouterMulticastListenerGetNext(otInstance * aInstance,otChildIp6AddressIterator * aIterator,otBackboneRouterMulticastListenerInfo * aListenerInfo)124 otError otBackboneRouterMulticastListenerGetNext(otInstance *aInstance,
125 otChildIp6AddressIterator *aIterator,
126 otBackboneRouterMulticastListenerInfo *aListenerInfo)
127 {
128 AssertPointerIsNotNull(aIterator);
129 AssertPointerIsNotNull(aListenerInfo);
130
131 return AsCoreType(aInstance).Get<BackboneRouter::MulticastListenersTable>().GetNext(*aIterator, *aListenerInfo);
132 }
133 #endif
134
135 #if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
136 #if OPENTHREAD_CONFIG_BACKBONE_ROUTER_DUA_NDPROXYING_ENABLE
otBackboneRouterConfigNextDuaRegistrationResponse(otInstance * aInstance,const otIp6InterfaceIdentifier * aMlIid,uint8_t aStatus)137 void otBackboneRouterConfigNextDuaRegistrationResponse(otInstance *aInstance,
138 const otIp6InterfaceIdentifier *aMlIid,
139 uint8_t aStatus)
140 {
141 AsCoreType(aInstance).Get<BackboneRouter::Manager>().ConfigNextDuaRegistrationResponse(AsCoreTypePtr(aMlIid),
142 aStatus);
143 }
144 #endif
145
146 #if OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE
otBackboneRouterConfigNextMulticastListenerRegistrationResponse(otInstance * aInstance,uint8_t aStatus)147 void otBackboneRouterConfigNextMulticastListenerRegistrationResponse(otInstance *aInstance, uint8_t aStatus)
148 {
149 OT_ASSERT(aStatus <= ThreadStatusTlv::kMlrStatusMax);
150
151 AsCoreType(aInstance).Get<BackboneRouter::Manager>().ConfigNextMulticastListenerRegistrationResponse(
152 static_cast<ThreadStatusTlv::MlrStatus>(aStatus));
153 }
154
otBackboneRouterMulticastListenerClear(otInstance * aInstance)155 void otBackboneRouterMulticastListenerClear(otInstance *aInstance)
156 {
157 AsCoreType(aInstance).Get<BackboneRouter::MulticastListenersTable>().Clear();
158 }
159
otBackboneRouterMulticastListenerAdd(otInstance * aInstance,const otIp6Address * aAddress,uint32_t aTimeout)160 otError otBackboneRouterMulticastListenerAdd(otInstance *aInstance, const otIp6Address *aAddress, uint32_t aTimeout)
161 {
162 if (aTimeout == 0)
163 {
164 BackboneRouter::Config config;
165 AsCoreType(aInstance).Get<BackboneRouter::Local>().GetConfig(config);
166 aTimeout = config.mMlrTimeout;
167 }
168
169 aTimeout = Min(aTimeout, Mle::kMlrTimeoutMax);
170 aTimeout = Time::SecToMsec(aTimeout);
171
172 return AsCoreType(aInstance).Get<BackboneRouter::MulticastListenersTable>().Add(AsCoreType(aAddress),
173 TimerMilli::GetNow() + aTimeout);
174 }
175 #endif // OPENTHREAD_CONFIG_BACKBONE_ROUTER_MULTICAST_ROUTING_ENABLE
176
177 #endif // OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
178
179 #endif // OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE
180