1 /*
2  *  Copyright (c) 2016, 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 Thread API (for both FTD and MTD).
33  */
34 
35 #ifndef OPENTHREAD_THREAD_H_
36 #define OPENTHREAD_THREAD_H_
37 
38 #include <openthread/dataset.h>
39 #include <openthread/link.h>
40 #include <openthread/message.h>
41 
42 #ifdef __cplusplus
43 extern "C" {
44 #endif
45 
46 /**
47  * @addtogroup api-thread-general
48  *
49  * @note
50  *   The functions in this module require `OPENTHREAD_FTD=1` or `OPENTHREAD_MTD=1`.
51  *
52  * @{
53  *
54  */
55 
56 #define OT_THREAD_VERSION_INVALID 0 ///< Invalid Thread version
57 #define OT_THREAD_VERSION_1_1 2     ///< Thread Version 1.1
58 #define OT_THREAD_VERSION_1_2 3     ///< Thread Version 1.2
59 #define OT_THREAD_VERSION_1_3 4     ///< Thread Version 1.3
60 #define OT_THREAD_VERSION_1_3_1 5   ///< Thread Version 1.3.1 (alias for 1.4)
61 #define OT_THREAD_VERSION_1_4 5     ///< Thread Version 1.4
62 
63 /**
64  * Maximum value length of Thread Base TLV.
65  */
66 #define OT_NETWORK_BASE_TLV_MAX_LENGTH 254
67 
68 #define OT_NETWORK_MAX_ROUTER_ID 62 ///< Maximum Router ID
69 
70 /**
71  * Represents a Thread device role.
72  *
73  */
74 typedef enum
75 {
76     OT_DEVICE_ROLE_DISABLED = 0, ///< The Thread stack is disabled.
77     OT_DEVICE_ROLE_DETACHED = 1, ///< Not currently participating in a Thread network/partition.
78     OT_DEVICE_ROLE_CHILD    = 2, ///< The Thread Child role.
79     OT_DEVICE_ROLE_ROUTER   = 3, ///< The Thread Router role.
80     OT_DEVICE_ROLE_LEADER   = 4, ///< The Thread Leader role.
81 } otDeviceRole;
82 
83 /**
84  * Represents an MLE Link Mode configuration.
85  */
86 typedef struct otLinkModeConfig
87 {
88     bool mRxOnWhenIdle : 1; ///< 1, if the sender has its receiver on when not transmitting. 0, otherwise.
89     bool mDeviceType : 1;   ///< 1, if the sender is an FTD. 0, otherwise.
90     bool mNetworkData : 1;  ///< 1, if the sender requires the full Network Data. 0, otherwise.
91 } otLinkModeConfig;
92 
93 /**
94  * Holds diagnostic information for a neighboring Thread node
95  *
96  */
97 typedef struct
98 {
99     otExtAddress mExtAddress;           ///< IEEE 802.15.4 Extended Address
100     uint32_t     mAge;                  ///< Seconds since last heard
101     uint32_t     mConnectionTime;       ///< Seconds since link establishment (requires `CONFIG_UPTIME_ENABLE`)
102     uint16_t     mRloc16;               ///< RLOC16
103     uint32_t     mLinkFrameCounter;     ///< Link Frame Counter
104     uint32_t     mMleFrameCounter;      ///< MLE Frame Counter
105     uint8_t      mLinkQualityIn;        ///< Link Quality In
106     int8_t       mAverageRssi;          ///< Average RSSI
107     int8_t       mLastRssi;             ///< Last observed RSSI
108     uint8_t      mLinkMargin;           ///< Link Margin
109     uint16_t     mFrameErrorRate;       ///< Frame error rate (0xffff->100%). Requires error tracking feature.
110     uint16_t     mMessageErrorRate;     ///< (IPv6) msg error rate (0xffff->100%). Requires error tracking feature.
111     uint16_t     mVersion;              ///< Thread version of the neighbor
112     bool         mRxOnWhenIdle : 1;     ///< rx-on-when-idle
113     bool         mFullThreadDevice : 1; ///< Full Thread Device
114     bool         mFullNetworkData : 1;  ///< Full Network Data
115     bool         mIsChild : 1;          ///< Is the neighbor a child
116 } otNeighborInfo;
117 
118 #define OT_NEIGHBOR_INFO_ITERATOR_INIT 0 ///< Initializer for otNeighborInfoIterator.
119 
120 typedef int16_t otNeighborInfoIterator; ///< Used to iterate through neighbor table.
121 
122 /**
123  * Represents the Thread Leader Data.
124  *
125  */
126 typedef struct otLeaderData
127 {
128     uint32_t mPartitionId;       ///< Partition ID
129     uint8_t  mWeighting;         ///< Leader Weight
130     uint8_t  mDataVersion;       ///< Full Network Data Version
131     uint8_t  mStableDataVersion; ///< Stable Network Data Version
132     uint8_t  mLeaderRouterId;    ///< Leader Router ID
133 } otLeaderData;
134 
135 /**
136  * Holds diagnostic information for a Thread Router
137  *
138  */
139 typedef struct
140 {
141     otExtAddress mExtAddress;          ///< IEEE 802.15.4 Extended Address
142     uint16_t     mRloc16;              ///< RLOC16
143     uint8_t      mRouterId;            ///< Router ID
144     uint8_t      mNextHop;             ///< Next hop to router
145     uint8_t      mPathCost;            ///< Path cost to router
146     uint8_t      mLinkQualityIn;       ///< Link Quality In
147     uint8_t      mLinkQualityOut;      ///< Link Quality Out
148     uint8_t      mAge;                 ///< Time last heard
149     bool         mAllocated : 1;       ///< Router ID allocated or not
150     bool         mLinkEstablished : 1; ///< Link established with Router ID or not
151     uint8_t      mVersion;             ///< Thread version
152 
153     /**
154      * Parent CSL parameters are only relevant when OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE is enabled.
155      *
156      */
157     uint8_t mCslClockAccuracy; ///< CSL clock accuracy, in ± ppm
158     uint8_t mCslUncertainty;   ///< CSL uncertainty, in ±10 us
159 } otRouterInfo;
160 
161 /**
162  * Represents the IP level counters.
163  *
164  */
165 typedef struct otIpCounters
166 {
167     uint32_t mTxSuccess; ///< The number of IPv6 packets successfully transmitted.
168     uint32_t mRxSuccess; ///< The number of IPv6 packets successfully received.
169     uint32_t mTxFailure; ///< The number of IPv6 packets failed to transmit.
170     uint32_t mRxFailure; ///< The number of IPv6 packets failed to receive.
171 } otIpCounters;
172 
173 /**
174  * Represents the Thread MLE counters.
175  *
176  */
177 typedef struct otMleCounters
178 {
179     uint16_t mDisabledRole;                  ///< Number of times device entered OT_DEVICE_ROLE_DISABLED role.
180     uint16_t mDetachedRole;                  ///< Number of times device entered OT_DEVICE_ROLE_DETACHED role.
181     uint16_t mChildRole;                     ///< Number of times device entered OT_DEVICE_ROLE_CHILD role.
182     uint16_t mRouterRole;                    ///< Number of times device entered OT_DEVICE_ROLE_ROUTER role.
183     uint16_t mLeaderRole;                    ///< Number of times device entered OT_DEVICE_ROLE_LEADER role.
184     uint16_t mAttachAttempts;                ///< Number of attach attempts while device was detached.
185     uint16_t mPartitionIdChanges;            ///< Number of changes to partition ID.
186     uint16_t mBetterPartitionAttachAttempts; ///< Number of attempts to attach to a better partition.
187 
188     /**
189      * Role time tracking.
190      *
191      * When uptime feature is enabled (OPENTHREAD_CONFIG_UPTIME_ENABLE = 1) time spent in each MLE role is tracked.
192      *
193      */
194     uint64_t mDisabledTime; ///< Number of milliseconds device has been in OT_DEVICE_ROLE_DISABLED role.
195     uint64_t mDetachedTime; ///< Number of milliseconds device has been in OT_DEVICE_ROLE_DETACHED role.
196     uint64_t mChildTime;    ///< Number of milliseconds device has been in OT_DEVICE_ROLE_CHILD role.
197     uint64_t mRouterTime;   ///< Number of milliseconds device has been in OT_DEVICE_ROLE_ROUTER role.
198     uint64_t mLeaderTime;   ///< Number of milliseconds device has been in OT_DEVICE_ROLE_LEADER role.
199     uint64_t mTrackedTime;  ///< Number of milliseconds tracked by previous counters.
200 
201     /**
202      * Number of times device changed its parent.
203      *
204      * A parent change can happen if device detaches from its current parent and attaches to a different one, or even
205      * while device is attached when the periodic parent search feature is enabled  (please see option
206      * OPENTHREAD_CONFIG_PARENT_SEARCH_ENABLE).
207      *
208      */
209     uint16_t mParentChanges;
210 } otMleCounters;
211 
212 /**
213  * Represents the MLE Parent Response data.
214  *
215  */
216 typedef struct otThreadParentResponseInfo
217 {
218     otExtAddress mExtAddr;      ///< IEEE 802.15.4 Extended Address of the Parent
219     uint16_t     mRloc16;       ///< Short address of the Parent
220     int8_t       mRssi;         ///< Rssi of the Parent
221     int8_t       mPriority;     ///< Parent priority
222     uint8_t      mLinkQuality3; ///< Parent Link Quality 3
223     uint8_t      mLinkQuality2; ///< Parent Link Quality 2
224     uint8_t      mLinkQuality1; ///< Parent Link Quality 1
225     bool         mIsAttached;   ///< Is the node receiving parent response attached
226 } otThreadParentResponseInfo;
227 
228 /**
229  * This callback informs the application that the detaching process has finished.
230  *
231  * @param[in] aContext A pointer to application-specific context.
232  *
233  */
234 typedef void (*otDetachGracefullyCallback)(void *aContext);
235 
236 /**
237  * Starts Thread protocol operation.
238  *
239  * The interface must be up when calling this function.
240  *
241  * Calling this function with @p aEnabled set to FALSE stops any ongoing processes of detaching started by
242  * otThreadDetachGracefully(). Its callback will be called.
243  *
244  * @param[in] aInstance A pointer to an OpenThread instance.
245  * @param[in] aEnabled  TRUE if Thread is enabled, FALSE otherwise.
246  *
247  * @retval OT_ERROR_NONE           Successfully started Thread protocol operation.
248  * @retval OT_ERROR_INVALID_STATE  The network interface was not up.
249  *
250  */
251 otError otThreadSetEnabled(otInstance *aInstance, bool aEnabled);
252 
253 /**
254  * Gets the Thread protocol version.
255  *
256  * The constants `OT_THREAD_VERSION_*` define the numerical version values.
257  *
258  * @returns the Thread protocol version.
259  *
260  */
261 uint16_t otThreadGetVersion(void);
262 
263 /**
264  * Indicates whether a node is the only router on the network.
265  *
266  * @param[in] aInstance A pointer to an OpenThread instance.
267  *
268  * @retval TRUE   It is the only router in the network.
269  * @retval FALSE  It is a child or is not a single router in the network.
270  *
271  */
272 bool otThreadIsSingleton(otInstance *aInstance);
273 
274 /**
275  * Starts a Thread Discovery scan.
276  *
277  * @note A successful call to this function enables the rx-on-when-idle mode for the entire scan procedure.
278  *
279  * @param[in]  aInstance              A pointer to an OpenThread instance.
280  * @param[in]  aScanChannels          A bit vector indicating which channels to scan (e.g. OT_CHANNEL_11_MASK).
281  * @param[in]  aPanId                 The PAN ID filter (set to Broadcast PAN to disable filter).
282  * @param[in]  aJoiner                Value of the Joiner Flag in the Discovery Request TLV.
283  * @param[in]  aEnableEui64Filtering  TRUE to filter responses on EUI-64, FALSE otherwise.
284  * @param[in]  aCallback              A pointer to a function called on receiving an MLE Discovery Response or
285  *                                    scan completes.
286  * @param[in]  aCallbackContext       A pointer to application-specific context.
287  *
288  * @retval OT_ERROR_NONE           Successfully started a Thread Discovery Scan.
289  * @retval OT_ERROR_INVALID_STATE  The IPv6 interface is not enabled (netif is not up).
290  * @retval OT_ERROR_NO_BUFS        Could not allocate message for Discovery Request.
291  * @retval OT_ERROR_BUSY           Thread Discovery Scan is already in progress.
292  *
293  */
294 otError otThreadDiscover(otInstance              *aInstance,
295                          uint32_t                 aScanChannels,
296                          uint16_t                 aPanId,
297                          bool                     aJoiner,
298                          bool                     aEnableEui64Filtering,
299                          otHandleActiveScanResult aCallback,
300                          void                    *aCallbackContext);
301 
302 /**
303  * Determines if an MLE Thread Discovery is currently in progress.
304  *
305  * @param[in] aInstance A pointer to an OpenThread instance.
306  *
307  */
308 bool otThreadIsDiscoverInProgress(otInstance *aInstance);
309 
310 /**
311  * Sets the Thread Joiner Advertisement when discovering Thread network.
312  *
313  * Thread Joiner Advertisement is used to allow a Joiner to advertise its own application-specific information
314  * (such as Vendor ID, Product ID, Discriminator, etc.) via a newly-proposed Joiner Advertisement TLV,
315  * and to make this information available to Commissioners or Commissioner Candidates without human interaction.
316  *
317  * @param[in]  aInstance        A pointer to an OpenThread instance.
318  * @param[in]  aOui             The Vendor IEEE OUI value that will be included in the Joiner Advertisement. Only the
319  *                              least significant 3 bytes will be used, and the most significant byte will be ignored.
320  * @param[in]  aAdvData         A pointer to the AdvData that will be included in the Joiner Advertisement.
321  * @param[in]  aAdvDataLength   The length of AdvData in bytes.
322  *
323  * @retval OT_ERROR_NONE         Successfully set Joiner Advertisement.
324  * @retval OT_ERROR_INVALID_ARGS Invalid AdvData.
325  *
326  */
327 otError otThreadSetJoinerAdvertisement(otInstance    *aInstance,
328                                        uint32_t       aOui,
329                                        const uint8_t *aAdvData,
330                                        uint8_t        aAdvDataLength);
331 
332 #define OT_JOINER_ADVDATA_MAX_LENGTH 64 ///< Maximum AdvData Length of Joiner Advertisement
333 
334 /**
335  * Gets the Thread Child Timeout (in seconds) used when operating in the Child role.
336  *
337  * @param[in]  aInstance A pointer to an OpenThread instance.
338  *
339  * @returns The Thread Child Timeout value in seconds.
340  *
341  * @sa otThreadSetChildTimeout
342  *
343  */
344 uint32_t otThreadGetChildTimeout(otInstance *aInstance);
345 
346 /**
347  * Sets the Thread Child Timeout (in seconds) used when operating in the Child role.
348  *
349  * @param[in]  aInstance A pointer to an OpenThread instance.
350  * @param[in]  aTimeout  The timeout value in seconds.
351  *
352  * @sa otThreadGetChildTimeout
353  *
354  */
355 void otThreadSetChildTimeout(otInstance *aInstance, uint32_t aTimeout);
356 
357 /**
358  * Gets the IEEE 802.15.4 Extended PAN ID.
359  *
360  * @param[in]  aInstance A pointer to an OpenThread instance.
361  *
362  * @returns A pointer to the IEEE 802.15.4 Extended PAN ID.
363  *
364  * @sa otThreadSetExtendedPanId
365  *
366  */
367 const otExtendedPanId *otThreadGetExtendedPanId(otInstance *aInstance);
368 
369 /**
370  * Sets the IEEE 802.15.4 Extended PAN ID.
371  *
372  * @note Can only be called while Thread protocols are disabled. A successful
373  * call to this function invalidates the Active and Pending Operational Datasets in
374  * non-volatile memory.
375  *
376  * @param[in]  aInstance       A pointer to an OpenThread instance.
377  * @param[in]  aExtendedPanId  A pointer to the IEEE 802.15.4 Extended PAN ID.
378  *
379  * @retval OT_ERROR_NONE           Successfully set the Extended PAN ID.
380  * @retval OT_ERROR_INVALID_STATE  Thread protocols are enabled.
381  *
382  * @sa otThreadGetExtendedPanId
383  *
384  */
385 otError otThreadSetExtendedPanId(otInstance *aInstance, const otExtendedPanId *aExtendedPanId);
386 
387 /**
388  * Returns a pointer to the Leader's RLOC.
389  *
390  * @param[in]   aInstance    A pointer to an OpenThread instance.
391  * @param[out]  aLeaderRloc  A pointer to the Leader's RLOC.
392  *
393  * @retval OT_ERROR_NONE          The Leader's RLOC was successfully written to @p aLeaderRloc.
394  * @retval OT_ERROR_INVALID_ARGS  @p aLeaderRloc was NULL.
395  * @retval OT_ERROR_DETACHED      Not currently attached to a Thread Partition.
396  *
397  */
398 otError otThreadGetLeaderRloc(otInstance *aInstance, otIp6Address *aLeaderRloc);
399 
400 /**
401  * Get the MLE Link Mode configuration.
402  *
403  * @param[in]  aInstance A pointer to an OpenThread instance.
404  *
405  * @returns The MLE Link Mode configuration.
406  *
407  * @sa otThreadSetLinkMode
408  *
409  */
410 otLinkModeConfig otThreadGetLinkMode(otInstance *aInstance);
411 
412 /**
413  * Set the MLE Link Mode configuration.
414  *
415  * @param[in]  aInstance A pointer to an OpenThread instance.
416  * @param[in]  aConfig   A pointer to the Link Mode configuration.
417  *
418  * @retval OT_ERROR_NONE  Successfully set the MLE Link Mode configuration.
419  *
420  * @sa otThreadGetLinkMode
421  *
422  */
423 otError otThreadSetLinkMode(otInstance *aInstance, otLinkModeConfig aConfig);
424 
425 /**
426  * Get the Thread Network Key.
427  *
428  * @param[in]   aInstance     A pointer to an OpenThread instance.
429  * @param[out]  aNetworkKey   A pointer to an `otNetworkKey` to return the Thread Network Key.
430  *
431  * @sa otThreadSetNetworkKey
432  *
433  */
434 void otThreadGetNetworkKey(otInstance *aInstance, otNetworkKey *aNetworkKey);
435 
436 /**
437  * Get the `otNetworkKeyRef` for Thread Network Key.
438  *
439  * Requires the build-time feature `OPENTHREAD_CONFIG_PLATFORM_KEY_REFERENCES_ENABLE` to be enabled.
440  *
441  * @param[in]   aInstance   A pointer to an OpenThread instance.
442  *
443  * @returns Reference to the Thread Network Key stored in memory.
444  *
445  * @sa otThreadSetNetworkKeyRef
446  *
447  */
448 otNetworkKeyRef otThreadGetNetworkKeyRef(otInstance *aInstance);
449 
450 /**
451  * Set the Thread Network Key.
452  *
453  * Succeeds only when Thread protocols are disabled.  A successful
454  * call to this function invalidates the Active and Pending Operational Datasets in
455  * non-volatile memory.
456  *
457  * @param[in]  aInstance   A pointer to an OpenThread instance.
458  * @param[in]  aKey        A pointer to a buffer containing the Thread Network Key.
459  *
460  * @retval OT_ERROR_NONE            Successfully set the Thread Network Key.
461  * @retval OT_ERROR_INVALID_STATE   Thread protocols are enabled.
462  *
463  * @sa otThreadGetNetworkKey
464  *
465  */
466 otError otThreadSetNetworkKey(otInstance *aInstance, const otNetworkKey *aKey);
467 
468 /**
469  * Set the Thread Network Key as a `otNetworkKeyRef`.
470  *
471  * Succeeds only when Thread protocols are disabled.  A successful
472  * call to this function invalidates the Active and Pending Operational Datasets in
473  * non-volatile memory.
474  *
475  * Requires the build-time feature `OPENTHREAD_CONFIG_PLATFORM_KEY_REFERENCES_ENABLE` to be enabled.
476  *
477  * @param[in]  aInstance   A pointer to an OpenThread instance.
478  * @param[in]  aKeyRef     Reference to the Thread Network Key.
479  *
480  * @retval OT_ERROR_NONE            Successfully set the Thread Network Key.
481  * @retval OT_ERROR_INVALID_STATE   Thread protocols are enabled.
482  *
483  * @sa otThreadGetNetworkKeyRef
484  *
485  */
486 otError otThreadSetNetworkKeyRef(otInstance *aInstance, otNetworkKeyRef aKeyRef);
487 
488 /**
489  * Gets the Thread Routing Locator (RLOC) address.
490  *
491  * @param[in]  aInstance A pointer to an OpenThread instance.
492  *
493  * @returns A pointer to the Thread Routing Locator (RLOC) address.
494  *
495  */
496 const otIp6Address *otThreadGetRloc(otInstance *aInstance);
497 
498 /**
499  * Gets the Mesh Local EID address.
500  *
501  * @param[in]  aInstance A pointer to an OpenThread instance.
502  *
503  * @returns A pointer to the Mesh Local EID address.
504  *
505  */
506 const otIp6Address *otThreadGetMeshLocalEid(otInstance *aInstance);
507 
508 /**
509  * Returns a pointer to the Mesh Local Prefix.
510  *
511  * @param[in]  aInstance A pointer to an OpenThread instance.
512  *
513  * @returns A pointer to the Mesh Local Prefix.
514  *
515  */
516 const otMeshLocalPrefix *otThreadGetMeshLocalPrefix(otInstance *aInstance);
517 
518 /**
519  * Sets the Mesh Local Prefix.
520  *
521  * Succeeds only when Thread protocols are disabled.  A successful
522  * call to this function invalidates the Active and Pending Operational Datasets in
523  * non-volatile memory.
524  *
525  * @param[in]  aInstance         A pointer to an OpenThread instance.
526  * @param[in]  aMeshLocalPrefix  A pointer to the Mesh Local Prefix.
527  *
528  * @retval OT_ERROR_NONE           Successfully set the Mesh Local Prefix.
529  * @retval OT_ERROR_INVALID_STATE  Thread protocols are enabled.
530  *
531  */
532 otError otThreadSetMeshLocalPrefix(otInstance *aInstance, const otMeshLocalPrefix *aMeshLocalPrefix);
533 
534 /**
535  * Gets the Thread link-local IPv6 address.
536  *
537  * The Thread link local address is derived using IEEE802.15.4 Extended Address as Interface Identifier.
538  *
539  * @param[in]  aInstance A pointer to an OpenThread instance.
540  *
541  * @returns A pointer to Thread link-local IPv6 address.
542  *
543  */
544 const otIp6Address *otThreadGetLinkLocalIp6Address(otInstance *aInstance);
545 
546 /**
547  * Gets the Thread Link-Local All Thread Nodes multicast address.
548  *
549  * The address is a link-local Unicast Prefix-Based Multicast Address [RFC 3306], with:
550  *   - flgs set to 3 (P = 1 and T = 1)
551  *   - scop set to 2
552  *   - plen set to 64
553  *   - network prefix set to the Mesh Local Prefix
554  *   - group ID set to 1
555  *
556  * @param[in]  aInstance A pointer to an OpenThread instance.
557  *
558  * @returns A pointer to Thread Link-Local All Thread Nodes multicast address.
559  *
560  */
561 const otIp6Address *otThreadGetLinkLocalAllThreadNodesMulticastAddress(otInstance *aInstance);
562 
563 /**
564  * Gets the Thread Realm-Local All Thread Nodes multicast address.
565  *
566  * The address is a realm-local Unicast Prefix-Based Multicast Address [RFC 3306], with:
567  *   - flgs set to 3 (P = 1 and T = 1)
568  *   - scop set to 3
569  *   - plen set to 64
570  *   - network prefix set to the Mesh Local Prefix
571  *   - group ID set to 1
572  *
573  * @param[in]  aInstance A pointer to an OpenThread instance.
574  *
575  * @returns A pointer to Thread Realm-Local All Thread Nodes multicast address.
576  *
577  */
578 const otIp6Address *otThreadGetRealmLocalAllThreadNodesMulticastAddress(otInstance *aInstance);
579 
580 /**
581  * Retrieves the Service ALOC for given Service ID.
582  *
583  * @param[in]   aInstance     A pointer to an OpenThread instance.
584  * @param[in]   aServiceId    Service ID to get ALOC for.
585  * @param[out]  aServiceAloc  A pointer to output the Service ALOC. MUST NOT BE NULL.
586  *
587  * @retval OT_ERROR_NONE      Successfully retrieved the Service ALOC.
588  * @retval OT_ERROR_DETACHED  The Thread interface is not currently attached to a Thread Partition.
589  */
590 otError otThreadGetServiceAloc(otInstance *aInstance, uint8_t aServiceId, otIp6Address *aServiceAloc);
591 
592 /**
593  * Get the Thread Network Name.
594  *
595  * @param[in]  aInstance A pointer to an OpenThread instance.
596  *
597  * @returns A pointer to the Thread Network Name.
598  *
599  * @sa otThreadSetNetworkName
600  *
601  */
602 const char *otThreadGetNetworkName(otInstance *aInstance);
603 
604 /**
605  * Set the Thread Network Name.
606  *
607  * Succeeds only when Thread protocols are disabled.  A successful
608  * call to this function invalidates the Active and Pending Operational Datasets in
609  * non-volatile memory.
610  *
611  * @param[in]  aInstance     A pointer to an OpenThread instance.
612  * @param[in]  aNetworkName  A pointer to the Thread Network Name.
613  *
614  * @retval OT_ERROR_NONE           Successfully set the Thread Network Name.
615  * @retval OT_ERROR_INVALID_STATE  Thread protocols are enabled.
616  *
617  * @sa otThreadGetNetworkName
618  *
619  */
620 otError otThreadSetNetworkName(otInstance *aInstance, const char *aNetworkName);
621 
622 /**
623  * Gets the Thread Domain Name.
624  *
625  * @note Available since Thread 1.2.
626  *
627  * @param[in]  aInstance A pointer to an OpenThread instance.
628  *
629  * @returns A pointer to the Thread Domain Name.
630  *
631  * @sa otThreadSetDomainName
632  *
633  */
634 const char *otThreadGetDomainName(otInstance *aInstance);
635 
636 /**
637  * Sets the Thread Domain Name. Only succeeds when Thread protocols are disabled.
638  *
639  * @note Available since Thread 1.2.
640  *
641  * @param[in]  aInstance     A pointer to an OpenThread instance.
642  * @param[in]  aDomainName   A pointer to the Thread Domain Name.
643  *
644  * @retval OT_ERROR_NONE           Successfully set the Thread Domain Name.
645  * @retval OT_ERROR_INVALID_STATE  Thread protocols are enabled.
646  *
647  * @sa otThreadGetDomainName
648  *
649  */
650 otError otThreadSetDomainName(otInstance *aInstance, const char *aDomainName);
651 
652 /**
653  * Sets or clears the Interface Identifier manually specified for the Thread Domain Unicast Address.
654  *
655  * Available when `OPENTHREAD_CONFIG_DUA_ENABLE` is enabled.
656  *
657  * @note Only available since Thread 1.2.
658  *
659  * @param[in]  aInstance   A pointer to an OpenThread instance.
660  * @param[in]  aIid        A pointer to the Interface Identifier to set or NULL to clear.
661  *
662  * @retval OT_ERROR_NONE           Successfully set/cleared the Interface Identifier.
663  * @retval OT_ERROR_INVALID_ARGS   The specified Interface Identifier is reserved.
664  *
665  * @sa otThreadGetFixedDuaInterfaceIdentifier
666  */
667 otError otThreadSetFixedDuaInterfaceIdentifier(otInstance *aInstance, const otIp6InterfaceIdentifier *aIid);
668 
669 /**
670  * Gets the Interface Identifier manually specified for the Thread Domain Unicast Address.
671  *
672  * Available when `OPENTHREAD_CONFIG_DUA_ENABLE` is enabled.
673  *
674  * @note Only available since Thread 1.2.
675  *
676  * @param[in]  aInstance A pointer to an OpenThread instance.
677  *
678  * @returns A pointer to the Interface Identifier which was set manually, or NULL if none was set.
679  *
680  * @sa otThreadSetFixedDuaInterfaceIdentifier
681  *
682  */
683 const otIp6InterfaceIdentifier *otThreadGetFixedDuaInterfaceIdentifier(otInstance *aInstance);
684 
685 /**
686  * Gets the thrKeySequenceCounter.
687  *
688  * @param[in]  aInstance A pointer to an OpenThread instance.
689  *
690  * @returns The thrKeySequenceCounter value.
691  *
692  * @sa otThreadSetKeySequenceCounter
693  *
694  */
695 uint32_t otThreadGetKeySequenceCounter(otInstance *aInstance);
696 
697 /**
698  * Sets the thrKeySequenceCounter.
699  *
700  * @note This API is reserved for testing and demo purposes only. Changing settings with
701  * this API will render a production application non-compliant with the Thread Specification.
702  *
703  * @param[in]  aInstance            A pointer to an OpenThread instance.
704  * @param[in]  aKeySequenceCounter  The thrKeySequenceCounter value.
705  *
706  * @sa otThreadGetKeySequenceCounter
707  *
708  */
709 void otThreadSetKeySequenceCounter(otInstance *aInstance, uint32_t aKeySequenceCounter);
710 
711 /**
712  * Gets the thrKeySwitchGuardTime (in hours).
713  *
714  * @param[in]  aInstance A pointer to an OpenThread instance.
715  *
716  * @returns The thrKeySwitchGuardTime value (in hours).
717  *
718  * @sa otThreadSetKeySwitchGuardTime
719  *
720  */
721 uint16_t otThreadGetKeySwitchGuardTime(otInstance *aInstance);
722 
723 /**
724  * Sets the thrKeySwitchGuardTime (in hours).
725  *
726  * @note This API is reserved for testing and demo purposes only. Changing settings with
727  * this API will render a production application non-compliant with the Thread Specification.
728  *
729  * @param[in]  aInstance            A pointer to an OpenThread instance.
730  * @param[in]  aKeySwitchGuardTime  The thrKeySwitchGuardTime value (in hours).
731  *
732  * @sa otThreadGetKeySwitchGuardTime
733  *
734  */
735 void otThreadSetKeySwitchGuardTime(otInstance *aInstance, uint16_t aKeySwitchGuardTime);
736 
737 /**
738  * Detach from the Thread network.
739  *
740  * @param[in]  aInstance A pointer to an OpenThread instance.
741  *
742  * @retval OT_ERROR_NONE           Successfully detached from the Thread network.
743  * @retval OT_ERROR_INVALID_STATE  Thread is disabled.
744  *
745  */
746 otError otThreadBecomeDetached(otInstance *aInstance);
747 
748 /**
749  * Attempt to reattach as a child.
750  *
751  * @note This API is reserved for testing and demo purposes only. Changing settings with
752  * this API will render a production application non-compliant with the Thread Specification.
753  *
754  * @param[in]  aInstance A pointer to an OpenThread instance.
755  *
756  * @retval OT_ERROR_NONE           Successfully begin attempt to become a child.
757  * @retval OT_ERROR_INVALID_STATE  Thread is disabled.
758  *
759  */
760 otError otThreadBecomeChild(otInstance *aInstance);
761 
762 /**
763  * Gets the next neighbor information. It is used to go through the entries of
764  * the neighbor table.
765  *
766  * @param[in]      aInstance  A pointer to an OpenThread instance.
767  * @param[in,out]  aIterator  A pointer to the iterator context. To get the first neighbor entry
768                               it should be set to OT_NEIGHBOR_INFO_ITERATOR_INIT.
769  * @param[out]     aInfo      A pointer to the neighbor information.
770  *
771  * @retval OT_ERROR_NONE         Successfully found the next neighbor entry in table.
772  * @retval OT_ERROR_NOT_FOUND     No subsequent neighbor entry exists in the table.
773  * @retval OT_ERROR_INVALID_ARGS  @p aIterator or @p aInfo was NULL.
774  *
775  */
776 otError otThreadGetNextNeighborInfo(otInstance *aInstance, otNeighborInfoIterator *aIterator, otNeighborInfo *aInfo);
777 
778 /**
779  * Get the device role.
780  *
781  * @param[in]  aInstance A pointer to an OpenThread instance.
782  *
783  * @retval OT_DEVICE_ROLE_DISABLED  The Thread stack is disabled.
784  * @retval OT_DEVICE_ROLE_DETACHED  The device is not currently participating in a Thread network/partition.
785  * @retval OT_DEVICE_ROLE_CHILD     The device is currently operating as a Thread Child.
786  * @retval OT_DEVICE_ROLE_ROUTER    The device is currently operating as a Thread Router.
787  * @retval OT_DEVICE_ROLE_LEADER    The device is currently operating as a Thread Leader.
788  *
789  */
790 otDeviceRole otThreadGetDeviceRole(otInstance *aInstance);
791 
792 /**
793  * Convert the device role to human-readable string.
794  *
795  * @param[in] aRole   The device role to convert.
796  *
797  * @returns A string representing @p aRole.
798  *
799  */
800 const char *otThreadDeviceRoleToString(otDeviceRole aRole);
801 
802 /**
803  * Get the Thread Leader Data.
804  *
805  * @param[in]   aInstance    A pointer to an OpenThread instance.
806  * @param[out]  aLeaderData  A pointer to where the leader data is placed.
807  *
808  * @retval OT_ERROR_NONE          Successfully retrieved the leader data.
809  * @retval OT_ERROR_DETACHED      Not currently attached.
810  *
811  */
812 otError otThreadGetLeaderData(otInstance *aInstance, otLeaderData *aLeaderData);
813 
814 /**
815  * Get the Leader's Router ID.
816  *
817  * @param[in]  aInstance A pointer to an OpenThread instance.
818  *
819  * @returns The Leader's Router ID.
820  *
821  */
822 uint8_t otThreadGetLeaderRouterId(otInstance *aInstance);
823 
824 /**
825  * Get the Leader's Weight.
826  *
827  * @param[in]  aInstance A pointer to an OpenThread instance.
828  *
829  * @returns The Leader's Weight.
830  *
831  */
832 uint8_t otThreadGetLeaderWeight(otInstance *aInstance);
833 
834 /**
835  * Get the Partition ID.
836  *
837  * @param[in]  aInstance A pointer to an OpenThread instance.
838  *
839  * @returns The Partition ID.
840  *
841  */
842 uint32_t otThreadGetPartitionId(otInstance *aInstance);
843 
844 /**
845  * Get the RLOC16.
846  *
847  * @param[in]  aInstance A pointer to an OpenThread instance.
848  *
849  * @returns The RLOC16.
850  *
851  */
852 uint16_t otThreadGetRloc16(otInstance *aInstance);
853 
854 /**
855  * The function retrieves diagnostic information for a Thread Router as parent.
856  *
857  * @param[in]   aInstance    A pointer to an OpenThread instance.
858  * @param[out]  aParentInfo  A pointer to where the parent router information is placed.
859  *
860  */
861 otError otThreadGetParentInfo(otInstance *aInstance, otRouterInfo *aParentInfo);
862 
863 /**
864  * The function retrieves the average RSSI for the Thread Parent.
865  *
866  * @param[in]   aInstance    A pointer to an OpenThread instance.
867  * @param[out]  aParentRssi  A pointer to where the parent RSSI should be placed.
868  *
869  */
870 otError otThreadGetParentAverageRssi(otInstance *aInstance, int8_t *aParentRssi);
871 
872 /**
873  * The function retrieves the RSSI of the last packet from the Thread Parent.
874  *
875  * @param[in]   aInstance    A pointer to an OpenThread instance.
876  * @param[out]  aLastRssi    A pointer to where the last RSSI should be placed.
877  *
878  * @retval OT_ERROR_NONE          Successfully retrieved the RSSI data.
879  * @retval OT_ERROR_FAILED        Unable to get RSSI data.
880  * @retval OT_ERROR_INVALID_ARGS  @p aLastRssi is NULL.
881  *
882  */
883 otError otThreadGetParentLastRssi(otInstance *aInstance, int8_t *aLastRssi);
884 
885 /**
886  * Starts the process for child to search for a better parent while staying attached to its current parent.
887  *
888  * Must be used when device is attached as a child.
889  *
890  * @retval OT_ERROR_NONE           Successfully started the process to search for a better parent.
891  * @retval OT_ERROR_INVALID_STATE  Device role is not child.
892  *
893  */
894 otError otThreadSearchForBetterParent(otInstance *aInstance);
895 
896 /**
897  * Gets the IPv6 counters.
898  *
899  * @param[in]  aInstance  A pointer to an OpenThread instance.
900  *
901  * @returns A pointer to the IPv6 counters.
902  *
903  */
904 const otIpCounters *otThreadGetIp6Counters(otInstance *aInstance);
905 
906 /**
907  * Resets the IPv6 counters.
908  *
909  * @param[in]  aInstance  A pointer to an OpenThread instance.
910  *
911  */
912 void otThreadResetIp6Counters(otInstance *aInstance);
913 
914 /**
915  * Gets the time-in-queue histogram for messages in the TX queue.
916  *
917  * Requires `OPENTHREAD_CONFIG_TX_QUEUE_STATISTICS_ENABLE`.
918  *
919  * Histogram of the time-in-queue of messages in the transmit queue is collected. The time-in-queue is tracked for
920  * direct transmissions only and is measured as the duration from when a message is added to the transmit queue until
921  * it is passed to the MAC layer for transmission or dropped.
922  *
923  * The histogram is returned as an array of `uint32_t` values with `aNumBins` entries. The first entry in the array
924  * (at index 0) represents the number of messages with a time-in-queue less than `aBinInterval`. The second entry
925  * represents the number of messages with a time-in-queue greater than or equal to `aBinInterval`, but less than
926  * `2 * aBinInterval`. And so on. The last entry represents the number of messages with time-in-queue  greater than or
927  * equal to `(aNumBins - 1) * aBinInterval`.
928  *
929  * The collected statistics can be reset by calling `otThreadResetTimeInQueueStat()`. The histogram information is
930  * collected since the OpenThread instance was initialized or since the last time statistics collection was reset by
931  * calling the `otThreadResetTimeInQueueStat()`.
932  *
933  * Pointers @p aNumBins and @p aBinInterval MUST NOT be NULL.
934  *
935  * @param[in]  aInstance      A pointer to an OpenThread instance.
936  * @param[out] aNumBins       Pointer to return the number of bins in histogram (array length).
937  * @param[out] aBinInterval   Pointer to return the histogram bin interval length in milliseconds.
938  *
939  * @returns A pointer to an array of @p aNumBins entries representing the collected histogram info.
940  *
941  */
942 const uint32_t *otThreadGetTimeInQueueHistogram(otInstance *aInstance, uint16_t *aNumBins, uint32_t *aBinInterval);
943 
944 /**
945  * Gets the maximum time-in-queue for messages in the TX queue.
946  *
947  * Requires `OPENTHREAD_CONFIG_TX_QUEUE_STATISTICS_ENABLE`.
948  *
949  * The time-in-queue is tracked for direct transmissions only and is measured as the duration from when a message is
950  * added to the transmit queue until it is passed to the MAC layer for transmission or dropped.
951  *
952  * The collected statistics can be reset by calling `otThreadResetTimeInQueueStat()`.
953  *
954  * @param[in]  aInstance      A pointer to an OpenThread instance.
955  *
956  * @returns The maximum time-in-queue in milliseconds for all messages in the TX queue (so far).
957  *
958  */
959 uint32_t otThreadGetMaxTimeInQueue(otInstance *aInstance);
960 
961 /**
962  * Resets the TX queue time-in-queue statistics.
963  *
964  * Requires `OPENTHREAD_CONFIG_TX_QUEUE_STATISTICS_ENABLE`.
965  *
966  * @param[in]  aInstance      A pointer to an OpenThread instance.
967  *
968  */
969 void otThreadResetTimeInQueueStat(otInstance *aInstance);
970 
971 /**
972  * Gets the Thread MLE counters.
973  *
974  * @param[in]  aInstance  A pointer to an OpenThread instance.
975  *
976  * @returns A pointer to the Thread MLE counters.
977  *
978  */
979 const otMleCounters *otThreadGetMleCounters(otInstance *aInstance);
980 
981 /**
982  * Resets the Thread MLE counters.
983  *
984  * @param[in]  aInstance  A pointer to an OpenThread instance.
985  *
986  */
987 void otThreadResetMleCounters(otInstance *aInstance);
988 
989 /**
990  * Pointer is called every time an MLE Parent Response message is received.
991  *
992  * This is used in `otThreadRegisterParentResponseCallback()`.
993  *
994  * @param[in]  aInfo     A pointer to a location on stack holding the stats data.
995  * @param[in]  aContext  A pointer to callback client-specific context.
996  *
997  */
998 typedef void (*otThreadParentResponseCallback)(otThreadParentResponseInfo *aInfo, void *aContext);
999 
1000 /**
1001  * Registers a callback to receive MLE Parent Response data.
1002  *
1003  * Requires `OPENTHREAD_CONFIG_MLE_PARENT_RESPONSE_CALLBACK_API_ENABLE`.
1004  *
1005  * @param[in]  aInstance  A pointer to an OpenThread instance.
1006  * @param[in]  aCallback  A pointer to a function that is called upon receiving an MLE Parent Response message.
1007  * @param[in]  aContext   A pointer to callback client-specific context.
1008  *
1009  */
1010 void otThreadRegisterParentResponseCallback(otInstance                    *aInstance,
1011                                             otThreadParentResponseCallback aCallback,
1012                                             void                          *aContext);
1013 
1014 /**
1015  * Represents the Thread Discovery Request data.
1016  *
1017  */
1018 typedef struct otThreadDiscoveryRequestInfo
1019 {
1020     otExtAddress mExtAddress;   ///< IEEE 802.15.4 Extended Address of the requester
1021     uint8_t      mVersion : 4;  ///< Thread version.
1022     bool         mIsJoiner : 1; ///< Whether is from joiner.
1023 } otThreadDiscoveryRequestInfo;
1024 
1025 /**
1026  * Pointer is called every time an MLE Discovery Request message is received.
1027  *
1028  * @param[in]  aInfo     A pointer to the Discovery Request info data.
1029  * @param[in]  aContext  A pointer to callback application-specific context.
1030  *
1031  */
1032 typedef void (*otThreadDiscoveryRequestCallback)(const otThreadDiscoveryRequestInfo *aInfo, void *aContext);
1033 
1034 /**
1035  * Sets a callback to receive MLE Discovery Request data.
1036  *
1037  * @param[in]  aInstance  A pointer to an OpenThread instance.
1038  * @param[in]  aCallback  A pointer to a function that is called upon receiving an MLE Discovery Request message.
1039  * @param[in]  aContext   A pointer to callback application-specific context.
1040  *
1041  */
1042 void otThreadSetDiscoveryRequestCallback(otInstance                      *aInstance,
1043                                          otThreadDiscoveryRequestCallback aCallback,
1044                                          void                            *aContext);
1045 
1046 /**
1047  * Pointer type defines the callback to notify the outcome of a `otThreadLocateAnycastDestination()`
1048  * request.
1049  *
1050  * @param[in] aContext            A pointer to an arbitrary context (provided when callback is registered).
1051  * @param[in] aError              The error when handling the request. OT_ERROR_NONE indicates success.
1052  *                                OT_ERROR_RESPONSE_TIMEOUT indicates a destination could not be found.
1053  *                                OT_ERROR_ABORT indicates the request was aborted.
1054  * @param[in] aMeshLocalAddress   A pointer to the mesh-local EID of the closest destination of the anycast address
1055  *                                when @p aError is OT_ERROR_NONE, NULL otherwise.
1056  * @param[in] aRloc16             The RLOC16 of the destination if found, otherwise invalid RLOC16 (0xfffe).
1057  *
1058  */
1059 typedef void (*otThreadAnycastLocatorCallback)(void               *aContext,
1060                                                otError             aError,
1061                                                const otIp6Address *aMeshLocalAddress,
1062                                                uint16_t            aRloc16);
1063 
1064 /**
1065  * Requests the closest destination of a given anycast address to be located.
1066  *
1067  * Is only available when `OPENTHREAD_CONFIG_TMF_ANYCAST_LOCATOR_ENABLE` is enabled.
1068  *
1069  * If a previous request is ongoing, a subsequent call to this function will cancel and replace the earlier request.
1070  *
1071  * @param[in] aInstance         A pointer to an OpenThread instance.
1072  * @param[in] aAnycastAddress   The anycast address to locate. MUST NOT be NULL.
1073  * @param[in] aCallback         The callback function to report the result.
1074  * @param[in] aContext          An arbitrary context used with @p aCallback.
1075  *
1076  * @retval OT_ERROR_NONE          The request started successfully. @p aCallback will be invoked to report the result.
1077  * @retval OT_ERROR_INVALID_ARGS  The @p aAnycastAddress is not a valid anycast address or @p aCallback is NULL.
1078  * @retval OT_ERROR_NO_BUFS       Out of buffer to prepare and send the request message.
1079  *
1080  */
1081 otError otThreadLocateAnycastDestination(otInstance                    *aInstance,
1082                                          const otIp6Address            *aAnycastAddress,
1083                                          otThreadAnycastLocatorCallback aCallback,
1084                                          void                          *aContext);
1085 
1086 /**
1087  * Indicates whether an anycast locate request is currently in progress.
1088  *
1089  * Is only available when `OPENTHREAD_CONFIG_TMF_ANYCAST_LOCATOR_ENABLE` is enabled.
1090  *
1091  * @param[in] aInstance A pointer to an OpenThread instance.
1092  *
1093  * @returns TRUE if an anycast locate request is currently in progress, FALSE otherwise.
1094  *
1095  */
1096 bool otThreadIsAnycastLocateInProgress(otInstance *aInstance);
1097 
1098 /**
1099  * Sends a Proactive Address Notification (ADDR_NTF.ntf) message.
1100  *
1101  * Is only available when `OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE` is enabled.
1102  *
1103  * @param[in]  aInstance     A pointer to an OpenThread instance.
1104  * @param[in]  aDestination  The destination to send the ADDR_NTF.ntf message.
1105  * @param[in]  aTarget       The target address of the ADDR_NTF.ntf message.
1106  * @param[in]  aMlIid        The ML-IID of the ADDR_NTF.ntf message.
1107  *
1108  */
1109 void otThreadSendAddressNotification(otInstance               *aInstance,
1110                                      otIp6Address             *aDestination,
1111                                      otIp6Address             *aTarget,
1112                                      otIp6InterfaceIdentifier *aMlIid);
1113 
1114 /**
1115  * Sends a Proactive Backbone Notification (PRO_BB.ntf) message on the Backbone link.
1116  *
1117  * Is only available when `OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE` is enabled.
1118  *
1119  * @param[in]  aInstance                    A pointer to an OpenThread instance.
1120  * @param[in]  aTarget                      The target address of the PRO_BB.ntf message.
1121  * @param[in]  aMlIid                       The ML-IID of the PRO_BB.ntf message.
1122  * @param[in]  aTimeSinceLastTransaction    Time since last transaction (in seconds).
1123  *
1124  * @retval OT_ERROR_NONE           Successfully sent PRO_BB.ntf on backbone link.
1125  * @retval OT_ERROR_NO_BUFS        If insufficient message buffers available.
1126  *
1127  */
1128 otError otThreadSendProactiveBackboneNotification(otInstance               *aInstance,
1129                                                   otIp6Address             *aTarget,
1130                                                   otIp6InterfaceIdentifier *aMlIid,
1131                                                   uint32_t                  aTimeSinceLastTransaction);
1132 
1133 /**
1134  * Notifies other nodes in the network (if any) and then stops Thread protocol operation.
1135  *
1136  * It sends an Address Release if it's a router, or sets its child timeout to 0 if it's a child.
1137  *
1138  * @param[in] aInstance A pointer to an OpenThread instance.
1139  * @param[in] aCallback A pointer to a function that is called upon finishing detaching.
1140  * @param[in] aContext  A pointer to callback application-specific context.
1141  *
1142  * @retval OT_ERROR_NONE Successfully started detaching.
1143  * @retval OT_ERROR_BUSY Detaching is already in progress.
1144  *
1145  */
1146 otError otThreadDetachGracefully(otInstance *aInstance, otDetachGracefullyCallback aCallback, void *aContext);
1147 
1148 #define OT_DURATION_STRING_SIZE 21 ///< Recommended size for string representation of `uint32_t` duration in seconds.
1149 
1150 /**
1151  * Converts an `uint32_t` duration (in seconds) to a human-readable string.
1152  *
1153  * Requires `OPENTHREAD_CONFIG_UPTIME_ENABLE` to be enabled.
1154  *
1155  * The string follows the format "<hh>:<mm>:<ss>" for hours, minutes, seconds (if duration is shorter than one day) or
1156  * "<dd>d.<hh>:<mm>:<ss>" (if longer than a day).
1157  *
1158  * If the resulting string does not fit in @p aBuffer (within its @p aSize characters), the string will be truncated
1159  * but the outputted string is always null-terminated.
1160  *
1161  * Is intended for use with `mAge` or `mConnectionTime` in `otNeighborInfo` or `otChildInfo` structures.
1162  *
1163  * @param[in]  aDuration A duration interval in seconds.
1164  * @param[out] aBuffer   A pointer to a char array to output the string.
1165  * @param[in]  aSize     The size of @p aBuffer (in bytes). Recommended to use `OT_DURATION_STRING_SIZE`.
1166  *
1167  */
1168 void otConvertDurationInSecondsToString(uint32_t aDuration, char *aBuffer, uint16_t aSize);
1169 
1170 /**
1171  * Sets the store frame counter ahead.
1172  *
1173  * Requires `OPENTHREAD_CONFIG_DYNAMIC_STORE_FRAME_AHEAD_COUNTER_ENABLE` to be enabled.
1174  *
1175  * The OpenThread stack stores the MLE and MAC security frame counter values in non-volatile storage,
1176  * ensuring they persist across device resets. These saved values are set to be ahead of their current
1177  * values by the "frame counter ahead" value.
1178  *
1179  * @param[in] aInstance                  A pointer to an OpenThread instance.
1180  * @param[in] aStoreFrameCounterAhead    The store frame counter ahead to set.
1181  *
1182  */
1183 void otThreadSetStoreFrameCounterAhead(otInstance *aInstance, uint32_t aStoreFrameCounterAhead);
1184 
1185 /**
1186  * Gets the store frame counter ahead.
1187  *
1188  * Requires `OPENTHREAD_CONFIG_DYNAMIC_STORE_FRAME_AHEAD_COUNTER_ENABLE` to be enabled.
1189  *
1190  * @param[in] aInstance A pointer to an OpenThread instance.
1191  *
1192  * @returns The current store frame counter ahead.
1193  *
1194  */
1195 uint32_t otThreadGetStoreFrameCounterAhead(otInstance *aInstance);
1196 
1197 /**
1198  * @}
1199  *
1200  */
1201 
1202 #ifdef __cplusplus
1203 } // extern "C"
1204 #endif
1205 
1206 #endif // OPENTHREAD_THREAD_H_
1207