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 * @brief 32 * This file defines the OpenThread Backbone Router API (for Thread 1.2 FTD with 33 * `OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE`). 34 * 35 */ 36 37 #ifndef OPENTHREAD_BACKBONE_ROUTER_FTD_H_ 38 #define OPENTHREAD_BACKBONE_ROUTER_FTD_H_ 39 40 #include <openthread/backbone_router.h> 41 #include <openthread/ip6.h> 42 #include <openthread/netdata.h> 43 44 #ifdef __cplusplus 45 extern "C" { 46 #endif 47 48 /** 49 * @addtogroup api-backbone-router 50 * 51 * @{ 52 * 53 */ 54 55 /** 56 * Represents the Backbone Router Status. 57 * 58 */ 59 typedef enum 60 { 61 OT_BACKBONE_ROUTER_STATE_DISABLED = 0, ///< Backbone function is disabled. 62 OT_BACKBONE_ROUTER_STATE_SECONDARY = 1, ///< Secondary Backbone Router. 63 OT_BACKBONE_ROUTER_STATE_PRIMARY = 2, ///< The Primary Backbone Router. 64 } otBackboneRouterState; 65 66 /** 67 * This function enables or disables Backbone functionality. 68 * 69 * @param[in] aInstance A pointer to an OpenThread instance. 70 * @param[in] aEnable TRUE to enable Backbone functionality, FALSE otherwise. 71 * 72 * @sa otBackboneRouterGetState 73 * @sa otBackboneRouterGetConfig 74 * @sa otBackboneRouterSetConfig 75 * @sa otBackboneRouterRegister 76 * 77 */ 78 void otBackboneRouterSetEnabled(otInstance *aInstance, bool aEnable); 79 80 /** 81 * This function gets the Backbone Router state. 82 * 83 * @param[in] aInstance A pointer to an OpenThread instance. 84 * 85 * @retval OT_BACKBONE_ROUTER_STATE_DISABLED Backbone functionality is disabled. 86 * @retval OT_BACKBONE_ROUTER_STATE_SECONDARY Secondary Backbone Router. 87 * @retval OT_BACKBONE_ROUTER_STATE_PRIMARY The Primary Backbone Router. 88 * 89 * @sa otBackboneRouterSetEnabled 90 * @sa otBackboneRouterGetConfig 91 * @sa otBackboneRouterSetConfig 92 * @sa otBackboneRouterRegister 93 * 94 */ 95 otBackboneRouterState otBackboneRouterGetState(otInstance *aInstance); 96 97 /** 98 * This function gets the local Backbone Router configuration. 99 * 100 * @param[in] aInstance A pointer to an OpenThread instance. 101 * @param[out] aConfig A pointer where to put local Backbone Router configuration. 102 * 103 * 104 * @sa otBackboneRouterSetEnabled 105 * @sa otBackboneRouterGetState 106 * @sa otBackboneRouterSetConfig 107 * @sa otBackboneRouterRegister 108 * 109 */ 110 void otBackboneRouterGetConfig(otInstance *aInstance, otBackboneRouterConfig *aConfig); 111 112 /** 113 * This function sets the local Backbone Router configuration. 114 * 115 * @param[in] aInstance A pointer to an OpenThread instance. 116 * @param[in] aConfig A pointer to the Backbone Router configuration to take effect. 117 * 118 * @retval OT_ERROR_NONE Successfully updated configuration. 119 * @retval OT_ERROR_INVALID_ARGS The configuration in @p aConfig is invalid. 120 * 121 * @sa otBackboneRouterSetEnabled 122 * @sa otBackboneRouterGetState 123 * @sa otBackboneRouterGetConfig 124 * @sa otBackboneRouterRegister 125 * 126 */ 127 otError otBackboneRouterSetConfig(otInstance *aInstance, const otBackboneRouterConfig *aConfig); 128 129 /** 130 * This function explicitly registers local Backbone Router configuration. 131 * 132 * @param[in] aInstance A pointer to an OpenThread instance. 133 * 134 * @retval OT_ERROR_NO_BUFS Insufficient space to add the Backbone Router service. 135 * @retval OT_ERROR_NONE Successfully queued a Server Data Request message for delivery. 136 * 137 * @sa otBackboneRouterSetEnabled 138 * @sa otBackboneRouterGetState 139 * @sa otBackboneRouterGetConfig 140 * @sa otBackboneRouterSetConfig 141 * 142 */ 143 otError otBackboneRouterRegister(otInstance *aInstance); 144 145 /** 146 * This method returns the Backbone Router registration jitter value. 147 * 148 * @returns The Backbone Router registration jitter value. 149 * 150 * @sa otBackboneRouterSetRegistrationJitter 151 * 152 */ 153 uint8_t otBackboneRouterGetRegistrationJitter(otInstance *aInstance); 154 155 /** 156 * This method sets the Backbone Router registration jitter value. 157 * 158 * @param[in] aJitter the Backbone Router registration jitter value to set. 159 * 160 * @sa otBackboneRouterGetRegistrationJitter 161 * 162 */ 163 void otBackboneRouterSetRegistrationJitter(otInstance *aInstance, uint8_t aJitter); 164 165 /** 166 * This method gets the local Domain Prefix configuration. 167 * 168 * @param[in] aInstance A pointer to an OpenThread instance. 169 * @param[out] aConfig A pointer to the Domain Prefix configuration. 170 * 171 * @retval OT_ERROR_NONE Successfully got the Domain Prefix configuration. 172 * @retval OT_ERROR_NOT_FOUND No Domain Prefix was configured. 173 * 174 */ 175 otError otBackboneRouterGetDomainPrefix(otInstance *aInstance, otBorderRouterConfig *aConfig); 176 177 /** 178 * This method configures response status for next DUA registration. 179 * 180 * Note: available only when `OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE` is enabled. 181 * Only used for test and certification. 182 * 183 * TODO: (DUA) support coap error code and corresponding process for certification purpose. 184 * 185 * @param[in] aInstance A pointer to an OpenThread instance. 186 * @param[in] aMlIid A pointer to the Mesh Local IID. If NULL, respond with @p aStatus for any 187 * coming DUA.req, otherwise only respond the one with matching @p aMlIid. 188 * @param[in] aStatus The status to respond. 189 * 190 * 191 */ 192 void otBackboneRouterConfigNextDuaRegistrationResponse(otInstance * aInstance, 193 const otIp6InterfaceIdentifier *aMlIid, 194 uint8_t aStatus); 195 196 /** 197 * This method configures response status for next Multicast Listener Registration. 198 * 199 * Note: available only when `OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE` is enabled. 200 * Only used for test and certification. 201 * 202 * @param[in] aInstance A pointer to an OpenThread instance. 203 * @param[in] aStatus The status to respond. 204 * 205 */ 206 void otBackboneRouterConfigNextMulticastListenerRegistrationResponse(otInstance *aInstance, uint8_t aStatus); 207 208 /** 209 * Represents the Multicast Listener events. 210 * 211 */ 212 typedef enum 213 { 214 OT_BACKBONE_ROUTER_MULTICAST_LISTENER_ADDED = 0, ///< Multicast Listener was added. 215 OT_BACKBONE_ROUTER_MULTICAST_LISTENER_REMOVED = 1, ///< Multicast Listener was removed or expired. 216 } otBackboneRouterMulticastListenerEvent; 217 218 /** 219 * This function pointer is called whenever the Multicast Listeners change. 220 * 221 * @param[in] aContext The user context pointer. 222 * @param[in] aEvent The Multicast Listener event. 223 * @param[in] aAddress The IPv6 multicast address of the Multicast Listener. 224 * 225 */ 226 typedef void (*otBackboneRouterMulticastListenerCallback)(void * aContext, 227 otBackboneRouterMulticastListenerEvent aEvent, 228 const otIp6Address * aAddress); 229 230 /** 231 * This method sets the Backbone Router Multicast Listener callback. 232 * 233 * @param[in] aInstance A pointer to an OpenThread instance. 234 * @param[in] aCallback A pointer to the Multicast Listener callback. 235 * @param[in] aContext A user context pointer. 236 * 237 */ 238 void otBackboneRouterSetMulticastListenerCallback(otInstance * aInstance, 239 otBackboneRouterMulticastListenerCallback aCallback, 240 void * aContext); 241 242 /** 243 * This method clears the Multicast Listeners. 244 * 245 * Note: available only when `OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE` is enabled. 246 * Only used for test and certification. 247 * 248 * @param[in] aInstance A pointer to an OpenThread instance. 249 * 250 * @sa otBackboneRouterMulticastListenerAdd 251 * @sa otBackboneRouterMulticastListenerGetNext 252 * 253 */ 254 void otBackboneRouterMulticastListenerClear(otInstance *aInstance); 255 256 /** 257 * This method adds a Multicast Listener. 258 * 259 * Note: available only when `OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE` is enabled. 260 * Only used for test and certification. 261 * 262 * @param[in] aInstance A pointer to an OpenThread instance. 263 * @param[in] aAddress The Multicast Listener address. 264 * @param[in] aTimeout The timeout (in seconds) of the Multicast Listener, or 0 to use the default MLR timeout. 265 * 266 * @retval OT_ERROR_NONE If the Multicast Listener was successfully added. 267 * @retval OT_ERROR_INVALID_ARGS If the Multicast Listener address was invalid. 268 * @retval OT_ERROR_NO_BUFS No space available to save the Multicast Listener. 269 * 270 * @sa otBackboneRouterMulticastListenerClear 271 * @sa otBackboneRouterMulticastListenerGetNext 272 * 273 */ 274 otError otBackboneRouterMulticastListenerAdd(otInstance *aInstance, const otIp6Address *aAddress, uint32_t aTimeout); 275 276 #define OT_BACKBONE_ROUTER_MULTICAST_LISTENER_ITERATOR_INIT \ 277 0 ///< Initializer for otBackboneRouterMulticastListenerIterator 278 279 typedef uint16_t otBackboneRouterMulticastListenerIterator; ///< Used to iterate through Multicast Listeners. 280 281 /** 282 * This structure represents a Backbone Router Multicast Listener info. 283 * 284 */ 285 typedef struct otBackboneRouterMulticastListenerInfo 286 { 287 otIp6Address mAddress; // Multicast Listener address. 288 uint32_t mTimeout; // Timeout (in seconds). 289 } otBackboneRouterMulticastListenerInfo; 290 291 /** 292 * This function gets the next Multicast Listener info (using an iterator). 293 * 294 * @param[in] aInstance A pointer to an OpenThread instance. 295 * @param[inout] aIterator A pointer to the iterator. On success the iterator will be updated to point to next 296 * Multicast Listener. To get the first entry the iterator should be set to 297 * OT_BACKBONE_ROUTER_MULTICAST_LISTENER_ITERATOR_INIT. 298 * @param[out] aListenerInfo A pointer to an `otBackboneRouterMulticastListenerInfo` where information of next 299 * Multicast Listener is placed (on success). 300 * 301 * @retval OT_ERROR_NONE Successfully found the next Multicast Listener info (@p aListenerInfo was successfully 302 * updated). 303 * @retval OT_ERROR_NOT_FOUND No subsequent Multicast Listener info was found. 304 * 305 * @sa otBackboneRouterMulticastListenerClear 306 * @sa otBackboneRouterMulticastListenerAdd 307 * 308 */ 309 otError otBackboneRouterMulticastListenerGetNext(otInstance * aInstance, 310 otBackboneRouterMulticastListenerIterator *aIterator, 311 otBackboneRouterMulticastListenerInfo * aListenerInfo); 312 313 /** 314 * Represents the ND Proxy events. 315 * 316 */ 317 typedef enum 318 { 319 OT_BACKBONE_ROUTER_NDPROXY_ADDED = 0, ///< ND Proxy was added. 320 OT_BACKBONE_ROUTER_NDPROXY_REMOVED = 1, ///< ND Proxy was removed. 321 OT_BACKBONE_ROUTER_NDPROXY_RENEWED = 2, ///< ND Proxy was renewed. 322 OT_BACKBONE_ROUTER_NDPROXY_CLEARED = 3, ///< All ND Proxies were cleared. 323 } otBackboneRouterNdProxyEvent; 324 325 /** 326 * This function pointer is called whenever the Nd Proxy changed. 327 * 328 * @param[in] aContext The user context pointer. 329 * @param[in] aEvent The ND Proxy event. 330 * @param[in] aDua The Domain Unicast Address of the ND Proxy, or `nullptr` if @p aEvent is 331 * `OT_BACKBONE_ROUTER_NDPROXY_CLEARED`. 332 * 333 */ 334 typedef void (*otBackboneRouterNdProxyCallback)(void * aContext, 335 otBackboneRouterNdProxyEvent aEvent, 336 const otIp6Address * aDua); 337 338 /** 339 * This method sets the Backbone Router ND Proxy callback. 340 * 341 * @param[in] aInstance A pointer to an OpenThread instance. 342 * @param[in] aCallback A pointer to the ND Proxy callback. 343 * @param[in] aContext A user context pointer. 344 * 345 */ 346 void otBackboneRouterSetNdProxyCallback(otInstance * aInstance, 347 otBackboneRouterNdProxyCallback aCallback, 348 void * aContext); 349 350 /** 351 * Represents the Backbone Router ND Proxy info. 352 * 353 */ 354 struct otBackboneRouterNdProxyInfo 355 { 356 otIp6InterfaceIdentifier *mMeshLocalIid; ///< Mesh-local IID 357 uint32_t mTimeSinceLastTransaction; ///< Time since last transaction (Seconds) 358 uint16_t mRloc16; ///< RLOC16 359 }; 360 361 /** 362 * This method gets the Backbone Router ND Proxy info. 363 * 364 * @param[in] aInstance A pointer to an OpenThread instance. 365 * @param[in] aDua The Domain Unicast Address. 366 * @param[out] aNdProxyInfo A pointer to the ND Proxy info. 367 * 368 * @retval OT_ERROR_NONE Successfully got the ND Proxy info. 369 * @retval OT_ERROR_NOT_FOUND Failed to find the Domain Unicast Address in the ND Proxy table. 370 * 371 */ 372 otError otBackboneRouterGetNdProxyInfo(otInstance * aInstance, 373 const otIp6Address * aDua, 374 otBackboneRouterNdProxyInfo *aNdProxyInfo); 375 376 /** 377 * Represents the Domain Prefix events. 378 * 379 */ 380 typedef enum 381 { 382 OT_BACKBONE_ROUTER_DOMAIN_PREFIX_ADDED = 0, ///< Domain Prefix was added. 383 OT_BACKBONE_ROUTER_DOMAIN_PREFIX_REMOVED = 1, ///< Domain Prefix was removed. 384 OT_BACKBONE_ROUTER_DOMAIN_PREFIX_CHANGED = 2, ///< Domain Prefix was changed. 385 } otBackboneRouterDomainPrefixEvent; 386 387 /** 388 * This function pointer is called whenever the Domain Prefix changed. 389 * 390 * @param[in] aContext The user context pointer. 391 * @param[in] aEvent The Domain Prefix event. 392 * @param[in] aDomainPrefix The new Domain Prefix if added or changed, nullptr otherwise. 393 * 394 */ 395 typedef void (*otBackboneRouterDomainPrefixCallback)(void * aContext, 396 otBackboneRouterDomainPrefixEvent aEvent, 397 const otIp6Prefix * aDomainPrefix); 398 /** 399 * This method sets the Backbone Router Domain Prefix callback. 400 * 401 * @param[in] aInstance A pointer to an OpenThread instance. 402 * @param[in] aCallback A pointer to the Domain Prefix callback. 403 * @param[in] aContext A user context pointer. 404 * 405 */ 406 void otBackboneRouterSetDomainPrefixCallback(otInstance * aInstance, 407 otBackboneRouterDomainPrefixCallback aCallback, 408 void * aContext); 409 410 /** 411 * @} 412 * 413 */ 414 415 #ifdef __cplusplus 416 } // extern "C" 417 #endif 418 419 #endif // OPENTHREAD_BACKBONE_ROUTER_FTD_H_ 420