Coverage Report

Created: 2023-12-14 14:18

/src/openthread/include/openthread/commissioner.h
Line
Count
Source (jump to first uncovered line)
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 includes functions for the Thread Commissioner role.
33
 */
34
35
#ifndef OPENTHREAD_COMMISSIONER_H_
36
#define OPENTHREAD_COMMISSIONER_H_
37
38
#include <openthread/dataset.h>
39
#include <openthread/ip6.h>
40
#include <openthread/joiner.h>
41
#include <openthread/platform/radio.h>
42
#include <openthread/platform/toolchain.h>
43
44
#ifdef __cplusplus
45
extern "C" {
46
#endif
47
48
/**
49
 * @addtogroup api-commissioner
50
 *
51
 * @brief
52
 *   This module includes functions for the Thread Commissioner role.
53
 *
54
 * @{
55
 *
56
 */
57
58
/**
59
 * This enumeration defines the Commissioner State.
60
 *
61
 */
62
typedef enum otCommissionerState
63
{
64
    OT_COMMISSIONER_STATE_DISABLED = 0, ///< Commissioner role is disabled.
65
    OT_COMMISSIONER_STATE_PETITION = 1, ///< Currently petitioning to become a Commissioner.
66
    OT_COMMISSIONER_STATE_ACTIVE   = 2, ///< Commissioner role is active.
67
} otCommissionerState;
68
69
/**
70
 * This enumeration defines a Joiner Event on the Commissioner.
71
 *
72
 */
73
typedef enum otCommissionerJoinerEvent
74
{
75
    OT_COMMISSIONER_JOINER_START     = 0,
76
    OT_COMMISSIONER_JOINER_CONNECTED = 1,
77
    OT_COMMISSIONER_JOINER_FINALIZE  = 2,
78
    OT_COMMISSIONER_JOINER_END       = 3,
79
    OT_COMMISSIONER_JOINER_REMOVED   = 4,
80
} otCommissionerJoinerEvent;
81
82
#define OT_COMMISSIONING_PASSPHRASE_MIN_SIZE 6   ///< Minimum size of the Commissioning Passphrase
83
0
#define OT_COMMISSIONING_PASSPHRASE_MAX_SIZE 255 ///< Maximum size of the Commissioning Passphrase
84
85
#define OT_PROVISIONING_URL_MAX_SIZE 64 ///< Max size (number of chars) in Provisioning URL string (excludes null char).
86
87
#define OT_STEERING_DATA_MAX_LENGTH 16 ///< Max steering data length (bytes)
88
89
/**
90
 * This structure represents the steering data.
91
 *
92
 */
93
typedef struct otSteeringData
94
{
95
    uint8_t mLength;                         ///< Length of steering data (bytes)
96
    uint8_t m8[OT_STEERING_DATA_MAX_LENGTH]; ///< Byte values
97
} otSteeringData;
98
99
/**
100
 * This structure represents a Commissioning Dataset.
101
 *
102
 */
103
typedef struct otCommissioningDataset
104
{
105
    uint16_t       mLocator;       ///< Border Router RLOC16
106
    uint16_t       mSessionId;     ///< Commissioner Session Id
107
    otSteeringData mSteeringData;  ///< Steering Data
108
    uint16_t       mJoinerUdpPort; ///< Joiner UDP Port
109
110
    bool mIsLocatorSet : 1;       ///< TRUE if Border Router RLOC16 is set, FALSE otherwise.
111
    bool mIsSessionIdSet : 1;     ///< TRUE if Commissioner Session Id is set, FALSE otherwise.
112
    bool mIsSteeringDataSet : 1;  ///< TRUE if Steering Data is set, FALSE otherwise.
113
    bool mIsJoinerUdpPortSet : 1; ///< TRUE if Joiner UDP Port is set, FALSE otherwise.
114
} otCommissioningDataset;
115
116
#define OT_JOINER_MAX_PSKD_LENGTH 32 ///< Maximum string length of a Joiner PSKd (does not include null char).
117
118
/**
119
 * This structure represents a Joiner PSKd.
120
 *
121
 */
122
typedef struct otJoinerPskd
123
{
124
    char m8[OT_JOINER_MAX_PSKD_LENGTH + 1]; ///< Char string array (must be null terminated - +1 is for null char).
125
} otJoinerPskd;
126
127
/**
128
 * This enumeration defines a Joiner Info Type.
129
 *
130
 */
131
typedef enum otJoinerInfoType
132
{
133
    OT_JOINER_INFO_TYPE_ANY       = 0, ///< Accept any Joiner (no EUI64 or Discerner is specified).
134
    OT_JOINER_INFO_TYPE_EUI64     = 1, ///< Joiner EUI-64 is specified (`mSharedId.mEui64` in `otJoinerInfo`).
135
    OT_JOINER_INFO_TYPE_DISCERNER = 2, ///< Joiner Discerner is specified (`mSharedId.mDiscerner` in `otJoinerInfo`).
136
} otJoinerInfoType;
137
138
/**
139
 * This structure represents a Joiner Info.
140
 *
141
 */
142
typedef struct otJoinerInfo
143
{
144
    otJoinerInfoType mType; ///< Joiner type.
145
    union
146
    {
147
        otExtAddress      mEui64;     ///< Joiner EUI64 (when `mType` is `OT_JOINER_INFO_TYPE_EUI64`)
148
        otJoinerDiscerner mDiscerner; ///< Joiner Discerner (when `mType` is `OT_JOINER_INFO_TYPE_DISCERNER`)
149
    } mSharedId;                      ///< Shared fields
150
    otJoinerPskd mPskd;               ///< Joiner PSKd
151
    uint32_t     mExpirationTime;     ///< Joiner expiration time in msec
152
} otJoinerInfo;
153
154
/**
155
 * This function pointer is called whenever the commissioner state changes.
156
 *
157
 * @param[in]  aState    The Commissioner state.
158
 * @param[in]  aContext  A pointer to application-specific context.
159
 *
160
 */
161
typedef void (*otCommissionerStateCallback)(otCommissionerState aState, void *aContext);
162
163
/**
164
 * This function pointer is called whenever the joiner state changes.
165
 *
166
 * @param[in]  aEvent       The joiner event type.
167
 * @param[in]  aJoinerInfo  A pointer to the Joiner Info.
168
 * @param[in]  aJoinerId    A pointer to the Joiner ID (if not known, it will be NULL).
169
 * @param[in]  aContext     A pointer to application-specific context.
170
 *
171
 */
172
typedef void (*otCommissionerJoinerCallback)(otCommissionerJoinerEvent aEvent,
173
                                             const otJoinerInfo       *aJoinerInfo,
174
                                             const otExtAddress       *aJoinerId,
175
                                             void                     *aContext);
176
177
/**
178
 * This function enables the Thread Commissioner role.
179
 *
180
 * @param[in]  aInstance         A pointer to an OpenThread instance.
181
 * @param[in]  aStateCallback    A pointer to a function that is called when the commissioner state changes.
182
 * @param[in]  aJoinerCallback   A pointer to a function that is called with a joiner event occurs.
183
 * @param[in]  aCallbackContext  A pointer to application-specific context.
184
 *
185
 * @retval OT_ERROR_NONE           Successfully started the Commissioner service.
186
 * @retval OT_ERROR_ALREADY        Commissioner is already started.
187
 * @retval OT_ERROR_INVALID_STATE  Device is not currently attached to a network.
188
 *
189
 */
190
otError otCommissionerStart(otInstance                  *aInstance,
191
                            otCommissionerStateCallback  aStateCallback,
192
                            otCommissionerJoinerCallback aJoinerCallback,
193
                            void                        *aCallbackContext);
194
195
/**
196
 * This function disables the Thread Commissioner role.
197
 *
198
 * @param[in]  aInstance         A pointer to an OpenThread instance.
199
 *
200
 * @retval OT_ERROR_NONE     Successfully stopped the Commissioner service.
201
 * @retval OT_ERROR_ALREADY  Commissioner is already stopped.
202
 *
203
 */
204
otError otCommissionerStop(otInstance *aInstance);
205
206
/**
207
 * This function returns the Commissioner Id.
208
 *
209
 * @param[in]  aInstance         A pointer to an OpenThread instance.
210
 *
211
 * @returns The Commissioner Id.
212
 *
213
 */
214
const char *otCommissionerGetId(otInstance *aInstance);
215
216
/**
217
 * This function sets the Commissioner Id.
218
 *
219
 * @param[in]  aInstance     A pointer to an OpenThread instance.
220
 * @param[in]  aId           A pointer to a string character array. Must be null terminated.
221
 *
222
 * @retval OT_ERROR_NONE            Successfully set the Commissioner Id.
223
 * @retval OT_ERROR_INVALID_ARGS    Given name is too long.
224
 * @retval OT_ERROR_INVALID_STATE   The commissioner is active and id cannot be changed.
225
 *
226
 */
227
otError otCommissionerSetId(otInstance *aInstance, const char *aId);
228
229
/**
230
 * This function adds a Joiner entry.
231
 *
232
 * @param[in]  aInstance          A pointer to an OpenThread instance.
233
 * @param[in]  aEui64             A pointer to the Joiner's IEEE EUI-64 or NULL for any Joiner.
234
 * @param[in]  aPskd              A pointer to the PSKd.
235
 * @param[in]  aTimeout           A time after which a Joiner is automatically removed, in seconds.
236
 *
237
 * @retval OT_ERROR_NONE          Successfully added the Joiner.
238
 * @retval OT_ERROR_NO_BUFS       No buffers available to add the Joiner.
239
 * @retval OT_ERROR_INVALID_ARGS  @p aEui64 or @p aPskd is invalid.
240
 * @retval OT_ERROR_INVALID_STATE The commissioner is not active.
241
 *
242
 * @note Only use this after successfully starting the Commissioner role with otCommissionerStart().
243
 *
244
 */
245
otError otCommissionerAddJoiner(otInstance         *aInstance,
246
                                const otExtAddress *aEui64,
247
                                const char         *aPskd,
248
                                uint32_t            aTimeout);
249
250
/**
251
 * This function adds a Joiner entry with a given Joiner Discerner value.
252
 *
253
 * @param[in]  aInstance          A pointer to an OpenThread instance.
254
 * @param[in]  aDiscerner         A pointer to the Joiner Discerner.
255
 * @param[in]  aPskd              A pointer to the PSKd.
256
 * @param[in]  aTimeout           A time after which a Joiner is automatically removed, in seconds.
257
 *
258
 * @retval OT_ERROR_NONE          Successfully added the Joiner.
259
 * @retval OT_ERROR_NO_BUFS       No buffers available to add the Joiner.
260
 * @retval OT_ERROR_INVALID_ARGS  @p aDiscerner or @p aPskd is invalid.
261
 * @retval OT_ERROR_INVALID_STATE The commissioner is not active.
262
 *
263
 * @note Only use this after successfully starting the Commissioner role with otCommissionerStart().
264
 *
265
 */
266
otError otCommissionerAddJoinerWithDiscerner(otInstance              *aInstance,
267
                                             const otJoinerDiscerner *aDiscerner,
268
                                             const char              *aPskd,
269
                                             uint32_t                 aTimeout);
270
271
/**
272
 * This method get joiner info at aIterator position.
273
 *
274
 * @param[in]      aInstance   A pointer to instance.
275
 * @param[in,out]  aIterator   A pointer to the Joiner Info iterator context.
276
 * @param[out]     aJoiner     A reference to Joiner info.
277
 *
278
 * @retval OT_ERROR_NONE       Successfully get the Joiner info.
279
 * @retval OT_ERROR_NOT_FOUND  Not found next Joiner.
280
 *
281
 */
282
otError otCommissionerGetNextJoinerInfo(otInstance *aInstance, uint16_t *aIterator, otJoinerInfo *aJoiner);
283
284
/**
285
 * This function removes a Joiner entry.
286
 *
287
 * @param[in]  aInstance          A pointer to an OpenThread instance.
288
 * @param[in]  aEui64             A pointer to the Joiner's IEEE EUI-64 or NULL for any Joiner.
289
 *
290
 * @retval OT_ERROR_NONE          Successfully removed the Joiner.
291
 * @retval OT_ERROR_NOT_FOUND     The Joiner specified by @p aEui64 was not found.
292
 * @retval OT_ERROR_INVALID_ARGS  @p aEui64 is invalid.
293
 * @retval OT_ERROR_INVALID_STATE The commissioner is not active.
294
 *
295
 * @note Only use this after successfully starting the Commissioner role with otCommissionerStart().
296
 *
297
 */
298
otError otCommissionerRemoveJoiner(otInstance *aInstance, const otExtAddress *aEui64);
299
300
/**
301
 * This function removes a Joiner entry.
302
 *
303
 * @param[in]  aInstance          A pointer to an OpenThread instance.
304
 * @param[in]  aDiscerner         A pointer to the Joiner Discerner.
305
 *
306
 * @retval OT_ERROR_NONE          Successfully removed the Joiner.
307
 * @retval OT_ERROR_NOT_FOUND     The Joiner specified by @p aEui64 was not found.
308
 * @retval OT_ERROR_INVALID_ARGS  @p aDiscerner is invalid.
309
 * @retval OT_ERROR_INVALID_STATE The commissioner is not active.
310
 *
311
 * @note Only use this after successfully starting the Commissioner role with otCommissionerStart().
312
 *
313
 */
314
otError otCommissionerRemoveJoinerWithDiscerner(otInstance *aInstance, const otJoinerDiscerner *aDiscerner);
315
316
/**
317
 * This function gets the Provisioning URL.
318
 *
319
 * @param[in]    aInstance       A pointer to an OpenThread instance.
320
 *
321
 * @returns A pointer to the URL string.
322
 *
323
 */
324
const char *otCommissionerGetProvisioningUrl(otInstance *aInstance);
325
326
/**
327
 * This function sets the Provisioning URL.
328
 *
329
 * @param[in]  aInstance             A pointer to an OpenThread instance.
330
 * @param[in]  aProvisioningUrl      A pointer to the Provisioning URL (may be NULL to set as empty string).
331
 *
332
 * @retval OT_ERROR_NONE          Successfully set the Provisioning URL.
333
 * @retval OT_ERROR_INVALID_ARGS  @p aProvisioningUrl is invalid (too long).
334
 *
335
 */
336
otError otCommissionerSetProvisioningUrl(otInstance *aInstance, const char *aProvisioningUrl);
337
338
/**
339
 * This function sends an Announce Begin message.
340
 *
341
 * @param[in]  aInstance             A pointer to an OpenThread instance.
342
 * @param[in]  aChannelMask          The channel mask value.
343
 * @param[in]  aCount                The number of Announcement messages per channel.
344
 * @param[in]  aPeriod               The time between two successive MLE Announce transmissions (in milliseconds).
345
 * @param[in]  aAddress              A pointer to the IPv6 destination.
346
 *
347
 * @retval OT_ERROR_NONE          Successfully enqueued the Announce Begin message.
348
 * @retval OT_ERROR_NO_BUFS       Insufficient buffers to generate an Announce Begin message.
349
 * @retval OT_ERROR_INVALID_STATE The commissioner is not active.
350
 *
351
 * @note Only use this after successfully starting the Commissioner role with otCommissionerStart().
352
 *
353
 */
354
otError otCommissionerAnnounceBegin(otInstance         *aInstance,
355
                                    uint32_t            aChannelMask,
356
                                    uint8_t             aCount,
357
                                    uint16_t            aPeriod,
358
                                    const otIp6Address *aAddress);
359
360
/**
361
 * This function pointer is called when the Commissioner receives an Energy Report.
362
 *
363
 * @param[in]  aChannelMask       The channel mask value.
364
 * @param[in]  aEnergyList        A pointer to the energy measurement list.
365
 * @param[in]  aEnergyListLength  Number of entries in @p aEnergyListLength.
366
 * @param[in]  aContext           A pointer to application-specific context.
367
 *
368
 */
369
typedef void (*otCommissionerEnergyReportCallback)(uint32_t       aChannelMask,
370
                                                   const uint8_t *aEnergyList,
371
                                                   uint8_t        aEnergyListLength,
372
                                                   void          *aContext);
373
374
/**
375
 * This function sends an Energy Scan Query message.
376
 *
377
 * @param[in]  aInstance             A pointer to an OpenThread instance.
378
 * @param[in]  aChannelMask          The channel mask value.
379
 * @param[in]  aCount                The number of energy measurements per channel.
380
 * @param[in]  aPeriod               The time between energy measurements (milliseconds).
381
 * @param[in]  aScanDuration         The scan duration for each energy measurement (milliseconds).
382
 * @param[in]  aAddress              A pointer to the IPv6 destination.
383
 * @param[in]  aCallback             A pointer to a function called on receiving an Energy Report message.
384
 * @param[in]  aContext              A pointer to application-specific context.
385
 *
386
 * @retval OT_ERROR_NONE          Successfully enqueued the Energy Scan Query message.
387
 * @retval OT_ERROR_NO_BUFS       Insufficient buffers to generate an Energy Scan Query message.
388
 * @retval OT_ERROR_INVALID_STATE The commissioner is not active.
389
 *
390
 * @note Only use this after successfully starting the Commissioner role with otCommissionerStart().
391
 *
392
 */
393
otError otCommissionerEnergyScan(otInstance                        *aInstance,
394
                                 uint32_t                           aChannelMask,
395
                                 uint8_t                            aCount,
396
                                 uint16_t                           aPeriod,
397
                                 uint16_t                           aScanDuration,
398
                                 const otIp6Address                *aAddress,
399
                                 otCommissionerEnergyReportCallback aCallback,
400
                                 void                              *aContext);
401
402
/**
403
 * This function pointer is called when the Commissioner receives a PAN ID Conflict message.
404
 *
405
 * @param[in]  aPanId             The PAN ID value.
406
 * @param[in]  aChannelMask       The channel mask value.
407
 * @param[in]  aContext           A pointer to application-specific context.
408
 *
409
 */
410
typedef void (*otCommissionerPanIdConflictCallback)(uint16_t aPanId, uint32_t aChannelMask, void *aContext);
411
412
/**
413
 * This function sends a PAN ID Query message.
414
 *
415
 * @param[in]  aInstance             A pointer to an OpenThread instance.
416
 * @param[in]  aPanId                The PAN ID to query.
417
 * @param[in]  aChannelMask          The channel mask value.
418
 * @param[in]  aAddress              A pointer to the IPv6 destination.
419
 * @param[in]  aCallback             A pointer to a function called on receiving a PAN ID Conflict message.
420
 * @param[in]  aContext              A pointer to application-specific context.
421
 *
422
 * @retval OT_ERROR_NONE          Successfully enqueued the PAN ID Query message.
423
 * @retval OT_ERROR_NO_BUFS       Insufficient buffers to generate a PAN ID Query message.
424
 * @retval OT_ERROR_INVALID_STATE The commissioner is not active.
425
 *
426
 * @note Only use this after successfully starting the Commissioner role with otCommissionerStart().
427
 *
428
 */
429
otError otCommissionerPanIdQuery(otInstance                         *aInstance,
430
                                 uint16_t                            aPanId,
431
                                 uint32_t                            aChannelMask,
432
                                 const otIp6Address                 *aAddress,
433
                                 otCommissionerPanIdConflictCallback aCallback,
434
                                 void                               *aContext);
435
436
/**
437
 * This function sends MGMT_COMMISSIONER_GET.
438
 *
439
 * @param[in]  aInstance  A pointer to an OpenThread instance.
440
 * @param[in]  aTlvs      A pointer to TLVs.
441
 * @param[in]  aLength    The length of TLVs.
442
 *
443
 * @retval OT_ERROR_NONE          Successfully send the meshcop dataset command.
444
 * @retval OT_ERROR_NO_BUFS       Insufficient buffer space to send.
445
 * @retval OT_ERROR_INVALID_STATE The commissioner is not active.
446
 *
447
 */
448
otError otCommissionerSendMgmtGet(otInstance *aInstance, const uint8_t *aTlvs, uint8_t aLength);
449
450
/**
451
 * This function sends MGMT_COMMISSIONER_SET.
452
 *
453
 * @param[in]  aInstance  A pointer to an OpenThread instance.
454
 * @param[in]  aDataset   A pointer to commissioning dataset.
455
 * @param[in]  aTlvs      A pointer to TLVs.
456
 * @param[in]  aLength    The length of TLVs.
457
 *
458
 * @retval OT_ERROR_NONE          Successfully send the meshcop dataset command.
459
 * @retval OT_ERROR_NO_BUFS       Insufficient buffer space to send.
460
 * @retval OT_ERROR_INVALID_STATE The commissioner is not active.
461
 *
462
 */
463
otError otCommissionerSendMgmtSet(otInstance                   *aInstance,
464
                                  const otCommissioningDataset *aDataset,
465
                                  const uint8_t                *aTlvs,
466
                                  uint8_t                       aLength);
467
468
/**
469
 * This function returns the Commissioner Session ID.
470
 *
471
 * @param[in]  aInstance  A pointer to an OpenThread instance.
472
 *
473
 * @returns The current commissioner session id.
474
 *
475
 */
476
uint16_t otCommissionerGetSessionId(otInstance *aInstance);
477
478
/**
479
 * This function returns the Commissioner State.
480
 *
481
 * @param[in]  aInstance  A pointer to an OpenThread instance.
482
 *
483
 * @retval OT_COMMISSIONER_STATE_DISABLED  Commissioner disabled.
484
 * @retval OT_COMMISSIONER_STATE_PETITION  Becoming the commissioner.
485
 * @retval OT_COMMISSIONER_STATE_ACTIVE    Commissioner enabled.
486
 *
487
 */
488
otCommissionerState otCommissionerGetState(otInstance *aInstance);
489
490
/**
491
 * @}
492
 *
493
 */
494
495
#ifdef __cplusplus
496
} // end of extern "C"
497
#endif
498
499
#endif // OPENTHREAD_COMMISSIONER_H_