Line data Source code
1 1 : /** @file
2 : * @brief Bluetooth Mesh Protocol APIs.
3 : */
4 :
5 : /*
6 : * Copyright (c) 2017 Intel Corporation
7 : *
8 : * SPDX-License-Identifier: Apache-2.0
9 : */
10 : #ifndef ZEPHYR_INCLUDE_BLUETOOTH_MESH_MAIN_H_
11 : #define ZEPHYR_INCLUDE_BLUETOOTH_MESH_MAIN_H_
12 :
13 : #include <stdbool.h>
14 : #include <stdint.h>
15 :
16 : #include <zephyr/kernel.h>
17 : #include <zephyr/sys/iterable_sections.h>
18 :
19 : /**
20 : * @brief Provisioning
21 : * @defgroup bt_mesh_prov Provisioning
22 : * @ingroup bt_mesh
23 : * @{
24 : */
25 :
26 : #ifdef __cplusplus
27 : extern "C" {
28 : #endif
29 :
30 : /** Available authentication algorithms. */
31 0 : enum {
32 : BT_MESH_PROV_AUTH_CMAC_AES128_AES_CCM,
33 : BT_MESH_PROV_AUTH_HMAC_SHA256_AES_CCM,
34 : };
35 :
36 : /** OOB Type field values. */
37 1 : enum {
38 : BT_MESH_STATIC_OOB_AVAILABLE = BIT(0), /**< Static OOB information available */
39 : BT_MESH_OOB_AUTH_REQUIRED = BIT(1) /**< OOB authentication required */
40 : };
41 :
42 : /** Available Provisioning output authentication actions. */
43 0 : typedef enum {
44 : BT_MESH_NO_OUTPUT = 0,
45 : BT_MESH_BLINK = BIT(0), /**< Blink */
46 : BT_MESH_BEEP = BIT(1), /**< Beep */
47 : BT_MESH_VIBRATE = BIT(2), /**< Vibrate */
48 : BT_MESH_DISPLAY_NUMBER = BIT(3), /**< Output numeric */
49 : BT_MESH_DISPLAY_STRING = BIT(4), /**< Output alphanumeric */
50 : } bt_mesh_output_action_t;
51 :
52 : /** Available Provisioning input authentication actions. */
53 0 : typedef enum {
54 : BT_MESH_NO_INPUT = 0,
55 : BT_MESH_PUSH = BIT(0), /**< Push */
56 : BT_MESH_TWIST = BIT(1), /**< Twist */
57 : BT_MESH_ENTER_NUMBER = BIT(2), /**< Input number */
58 : BT_MESH_ENTER_STRING = BIT(3), /**< Input alphanumeric */
59 : } bt_mesh_input_action_t;
60 :
61 : /** Available Provisioning bearers. */
62 1 : typedef enum {
63 : BT_MESH_PROV_ADV = BIT(0), /**< PB-ADV bearer */
64 : BT_MESH_PROV_GATT = BIT(1), /**< PB-GATT bearer */
65 : BT_MESH_PROV_REMOTE = BIT(2), /**< PB-Remote bearer */
66 : } bt_mesh_prov_bearer_t;
67 :
68 : /** Out of Band information location. */
69 1 : typedef enum {
70 : BT_MESH_PROV_OOB_OTHER = BIT(0), /**< Other */
71 : BT_MESH_PROV_OOB_URI = BIT(1), /**< Electronic / URI */
72 : BT_MESH_PROV_OOB_2D_CODE = BIT(2), /**< 2D machine-readable code */
73 : BT_MESH_PROV_OOB_BAR_CODE = BIT(3), /**< Bar Code */
74 : BT_MESH_PROV_OOB_NFC = BIT(4), /**< Near Field Communication (NFC) */
75 : BT_MESH_PROV_OOB_NUMBER = BIT(5), /**< Number */
76 : BT_MESH_PROV_OOB_STRING = BIT(6), /**< String */
77 : BT_MESH_PROV_OOB_CERTIFICATE = BIT(7), /**< Support for certificate-based provisioning */
78 : BT_MESH_PROV_OOB_RECORDS = BIT(8), /**< Support for provisioning records */
79 : /* 9 - 10 are reserved */
80 : BT_MESH_PROV_OOB_ON_BOX = BIT(11), /**< On box */
81 : BT_MESH_PROV_OOB_IN_BOX = BIT(12), /**< Inside box */
82 : BT_MESH_PROV_OOB_ON_PAPER = BIT(13), /**< On piece of paper */
83 : BT_MESH_PROV_OOB_IN_MANUAL = BIT(14), /**< Inside manual */
84 : BT_MESH_PROV_OOB_ON_DEV = BIT(15), /**< On device */
85 : } bt_mesh_prov_oob_info_t;
86 :
87 : /** Device Capabilities. */
88 1 : struct bt_mesh_dev_capabilities {
89 : /** Number of elements supported by the device */
90 1 : uint8_t elem_count;
91 :
92 : /** Supported algorithms and other capabilities */
93 1 : uint16_t algorithms;
94 :
95 : /** Supported public key types */
96 1 : uint8_t pub_key_type;
97 :
98 : /** Supported OOB Types */
99 1 : uint8_t oob_type;
100 :
101 : /** Supported Output OOB Actions */
102 1 : bt_mesh_output_action_t output_actions;
103 :
104 : /** Supported Input OOB Actions */
105 1 : bt_mesh_input_action_t input_actions;
106 :
107 : /** Maximum size of Output OOB supported */
108 1 : uint8_t output_size;
109 :
110 : /** Maximum size in octets of Input OOB supported */
111 1 : uint8_t input_size;
112 : };
113 :
114 : /** Provisioning properties & capabilities. */
115 1 : struct bt_mesh_prov {
116 : /** The UUID that's used when advertising as unprovisioned */
117 1 : const uint8_t *uuid;
118 :
119 : /** Optional URI. This will be advertised separately from the
120 : * unprovisioned beacon, however the unprovisioned beacon will
121 : * contain a hash of it so the two can be associated by the
122 : * provisioner.
123 : */
124 1 : const char *uri;
125 :
126 : /** Out of Band information field. */
127 1 : bt_mesh_prov_oob_info_t oob_info;
128 :
129 : /** Pointer to Public Key in big-endian for OOB public key type support.
130 : *
131 : * Remember to enable @kconfig{CONFIG_BT_MESH_PROV_OOB_PUBLIC_KEY}
132 : * when initializing this parameter.
133 : *
134 : * Must be used together with @ref bt_mesh_prov::private_key_be.
135 : */
136 1 : const uint8_t *public_key_be;
137 : /** Pointer to Private Key in big-endian for OOB public key type support.
138 : *
139 : * Remember to enable @kconfig{CONFIG_BT_MESH_PROV_OOB_PUBLIC_KEY}
140 : * when initializing this parameter.
141 : *
142 : * Must be used together with @ref bt_mesh_prov::public_key_be.
143 : */
144 1 : const uint8_t *private_key_be;
145 :
146 : /** Static OOB value */
147 1 : const uint8_t *static_val;
148 : /** Static OOB value length */
149 1 : uint8_t static_val_len;
150 :
151 : /** Maximum size of Output OOB supported */
152 1 : uint8_t output_size;
153 : /** Supported Output OOB Actions */
154 1 : uint16_t output_actions;
155 :
156 : /** Maximum size of Input OOB supported */
157 1 : uint8_t input_size;
158 : /** Supported Input OOB Actions */
159 1 : uint16_t input_actions;
160 :
161 : /** @brief Provisioning Capabilities.
162 : *
163 : * This callback notifies the application that the provisioning capabilities
164 : * of the unprovisioned device has been received.
165 : *
166 : * The application can consequently call bt_mesh_auth_method_set_<*> to
167 : * select suitable provisioning oob authentication method.
168 : *
169 : * When this callback returns, the provisioner will start authentication with
170 : * the chosen method.
171 : *
172 : * @param cap capabilities supported by device.
173 : */
174 1 : void (*capabilities)(const struct bt_mesh_dev_capabilities *cap);
175 :
176 : /** @brief Output of a number is requested.
177 : *
178 : * This callback notifies the application that it should
179 : * output the given number using the given action.
180 : *
181 : * @param act Action for outputting the number.
182 : * @param num Number to be outputted.
183 : *
184 : * @return Zero on success or negative error code otherwise
185 : */
186 1 : int (*output_number)(bt_mesh_output_action_t act, uint32_t num);
187 :
188 : /** @brief Output of a string is requested.
189 : *
190 : * This callback notifies the application that it should
191 : * display the given string to the user.
192 : *
193 : * @param str String to be displayed.
194 : *
195 : * @return Zero on success or negative error code otherwise
196 : */
197 1 : int (*output_string)(const char *str);
198 :
199 : /** @brief Input is requested.
200 : *
201 : * This callback notifies the application that it should
202 : * request input from the user using the given action. The
203 : * requested input will either be a string or a number, and
204 : * the application needs to consequently call the
205 : * bt_mesh_input_string() or bt_mesh_input_number() functions
206 : * once the data has been acquired from the user.
207 : *
208 : * @param act Action for inputting data.
209 : * @param num Maximum size of the inputted data.
210 : *
211 : * @return Zero on success or negative error code otherwise
212 : */
213 1 : int (*input)(bt_mesh_input_action_t act, uint8_t size);
214 :
215 : /** @brief The other device finished their OOB input.
216 : *
217 : * This callback notifies the application that it should stop
218 : * displaying its output OOB value, as the other party finished their
219 : * OOB input.
220 : */
221 1 : void (*input_complete)(void);
222 :
223 : /** @brief Unprovisioned beacon has been received.
224 : *
225 : * This callback notifies the application that an unprovisioned
226 : * beacon has been received.
227 : *
228 : * @param uuid UUID
229 : * @param oob_info OOB Information
230 : * @param uri_hash Pointer to URI Hash value. NULL if no hash was
231 : * present in the beacon.
232 : */
233 1 : void (*unprovisioned_beacon)(uint8_t uuid[16],
234 : bt_mesh_prov_oob_info_t oob_info,
235 : uint32_t *uri_hash);
236 :
237 : /** @brief PB-GATT Unprovisioned Advertising has been received.
238 : *
239 : * This callback notifies the application that an PB-GATT
240 : * unprovisioned Advertising has been received.
241 : *
242 : * @param uuid UUID
243 : * @param oob_info OOB Information
244 : */
245 1 : void (*unprovisioned_beacon_gatt)(uint8_t uuid[16],
246 : bt_mesh_prov_oob_info_t oob_info);
247 :
248 : /** @brief Provisioning link has been opened.
249 : *
250 : * This callback notifies the application that a provisioning
251 : * link has been opened on the given provisioning bearer.
252 : *
253 : * @param bearer Provisioning bearer.
254 : */
255 1 : void (*link_open)(bt_mesh_prov_bearer_t bearer);
256 :
257 : /** @brief Provisioning link has been closed.
258 : *
259 : * This callback notifies the application that a provisioning
260 : * link has been closed on the given provisioning bearer.
261 : *
262 : * @param bearer Provisioning bearer.
263 : */
264 1 : void (*link_close)(bt_mesh_prov_bearer_t bearer);
265 :
266 : /** @brief Provisioning is complete.
267 : *
268 : * This callback notifies the application that provisioning has
269 : * been successfully completed, and that the local node has been
270 : * assigned the specified NetKeyIndex and primary element address.
271 : *
272 : * @param net_idx NetKeyIndex given during provisioning.
273 : * @param addr Primary element address.
274 : */
275 1 : void (*complete)(uint16_t net_idx, uint16_t addr);
276 :
277 : /** @brief Local node has been reprovisioned.
278 : *
279 : * This callback notifies the application that reprovisioning has
280 : * been successfully completed.
281 : *
282 : * @param addr New primary element address.
283 : */
284 1 : void (*reprovisioned)(uint16_t addr);
285 :
286 : /** @brief A new node has been added to the provisioning database.
287 : *
288 : * This callback notifies the application that provisioning has
289 : * been successfully completed, and that a node has been assigned
290 : * the specified NetKeyIndex and primary element address.
291 : *
292 : * @param net_idx NetKeyIndex given during provisioning.
293 : * @param uuid UUID of the added node
294 : * @param addr Primary element address.
295 : * @param num_elem Number of elements that this node has.
296 : */
297 1 : void (*node_added)(uint16_t net_idx, uint8_t uuid[16], uint16_t addr,
298 : uint8_t num_elem);
299 :
300 : /** @brief Node has been reset.
301 : *
302 : * This callback notifies the application that the local node
303 : * has been reset and needs to be provisioned again. The node will
304 : * not automatically advertise as unprovisioned, rather the
305 : * bt_mesh_prov_enable() API needs to be called to enable
306 : * unprovisioned advertising on one or more provisioning bearers.
307 : */
308 1 : void (*reset)(void);
309 : };
310 :
311 : struct bt_mesh_rpr_cli;
312 : struct bt_mesh_rpr_node;
313 :
314 : /** @brief Provide provisioning input OOB string.
315 : *
316 : * This is intended to be called after the bt_mesh_prov input callback
317 : * has been called with BT_MESH_ENTER_STRING as the action.
318 : *
319 : * @param str String.
320 : *
321 : * @return Zero on success or (negative) error code otherwise.
322 : */
323 1 : int bt_mesh_input_string(const char *str);
324 :
325 : /** @brief Provide provisioning input OOB number.
326 : *
327 : * This is intended to be called after the bt_mesh_prov input callback
328 : * has been called with BT_MESH_ENTER_NUMBER as the action.
329 : *
330 : * @param num Number.
331 : *
332 : * @return Zero on success or (negative) error code otherwise.
333 : */
334 1 : int bt_mesh_input_number(uint32_t num);
335 :
336 : /** @brief Provide Device public key.
337 : *
338 : * @param public_key Device public key in big-endian.
339 : *
340 : * @return Zero on success or (negative) error code otherwise.
341 : */
342 1 : int bt_mesh_prov_remote_pub_key_set(const uint8_t public_key[64]);
343 :
344 : /** @brief Use Input OOB authentication.
345 : *
346 : * Provisioner only.
347 : *
348 : * Instruct the unprovisioned device to use the specified Input OOB
349 : * authentication action. When using @ref BT_MESH_PUSH, @ref BT_MESH_TWIST or
350 : * @ref BT_MESH_ENTER_NUMBER, the @ref bt_mesh_prov::output_number callback is
351 : * called with a random number that has to be entered on the unprovisioned
352 : * device.
353 : *
354 : * When using @ref BT_MESH_ENTER_STRING, the @ref bt_mesh_prov::output_string
355 : * callback is called with a random string that has to be entered on the
356 : * unprovisioned device.
357 : *
358 : * @param action Authentication action used by the unprovisioned device.
359 : * @param size Authentication size.
360 : *
361 : * @return Zero on success or (negative) error code otherwise.
362 : */
363 1 : int bt_mesh_auth_method_set_input(bt_mesh_input_action_t action, uint8_t size);
364 :
365 : /** @brief Use Output OOB authentication.
366 : *
367 : * Provisioner only.
368 : *
369 : * Instruct the unprovisioned device to use the specified Output OOB
370 : * authentication action. The @ref bt_mesh_prov::input callback will
371 : * be called.
372 : *
373 : * When using @ref BT_MESH_BLINK, @ref BT_MESH_BEEP, @ref BT_MESH_VIBRATE
374 : * or @ref BT_MESH_DISPLAY_NUMBER, and the application has to call
375 : * @ref bt_mesh_input_number with the random number indicated by
376 : * the unprovisioned device.
377 : *
378 : * When using @ref BT_MESH_DISPLAY_STRING, the application has to call
379 : * @ref bt_mesh_input_string with the random string displayed by the
380 : * unprovisioned device.
381 : *
382 : * @param action Authentication action used by the unprovisioned device.
383 : * @param size Authentication size.
384 : *
385 : * @return Zero on success or (negative) error code otherwise.
386 : */
387 1 : int bt_mesh_auth_method_set_output(bt_mesh_output_action_t action, uint8_t size);
388 :
389 : /** @brief Use static OOB authentication.
390 : *
391 : * Provisioner only.
392 : *
393 : * Instruct the unprovisioned device to use static OOB authentication, and use
394 : * the given static authentication value when provisioning.
395 : *
396 : * @param static_val Static OOB value.
397 : * @param size Static OOB value size.
398 : *
399 : * @return Zero on success or (negative) error code otherwise.
400 : */
401 1 : int bt_mesh_auth_method_set_static(const uint8_t *static_val, uint8_t size);
402 :
403 : /** @brief Don't use OOB authentication.
404 : *
405 : * Provisioner only.
406 : *
407 : * Don't use any authentication when provisioning new devices. This is the
408 : * default behavior.
409 : *
410 : * @warning Not using any authentication exposes the mesh network to
411 : * impersonation attacks, where attackers can pretend to be the
412 : * unprovisioned device to gain access to the network. Authentication
413 : * is strongly encouraged.
414 : *
415 : * @return Zero on success or (negative) error code otherwise.
416 : */
417 1 : int bt_mesh_auth_method_set_none(void);
418 :
419 : /** @brief Enable specific provisioning bearers
420 : *
421 : * Enable one or more provisioning bearers.
422 : *
423 : * @param bearers Bit-wise or of provisioning bearers.
424 : *
425 : * @return Zero on success or (negative) error code otherwise.
426 : */
427 1 : int bt_mesh_prov_enable(bt_mesh_prov_bearer_t bearers);
428 :
429 : /** @brief Disable specific provisioning bearers
430 : *
431 : * Disable one or more provisioning bearers.
432 : *
433 : * @param bearers Bit-wise or of provisioning bearers.
434 : *
435 : * @return Zero on success or (negative) error code otherwise.
436 : */
437 1 : int bt_mesh_prov_disable(bt_mesh_prov_bearer_t bearers);
438 :
439 : /** @brief Provision the local Mesh Node.
440 : *
441 : * This API should normally not be used directly by the application. The
442 : * only exception is for testing purposes where manual provisioning is
443 : * desired without an actual external provisioner.
444 : *
445 : * @param net_key Network Key
446 : * @param net_idx Network Key Index
447 : * @param flags Provisioning Flags
448 : * @param iv_index IV Index
449 : * @param addr Primary element address
450 : * @param dev_key Device Key
451 : *
452 : * @return Zero on success or (negative) error code otherwise.
453 : */
454 1 : int bt_mesh_provision(const uint8_t net_key[16], uint16_t net_idx,
455 : uint8_t flags, uint32_t iv_index, uint16_t addr,
456 : const uint8_t dev_key[16]);
457 :
458 : /** @brief Provision a Mesh Node using PB-ADV
459 : *
460 : * @param uuid UUID
461 : * @param net_idx Network Key Index
462 : * @param addr Address to assign to remote device. If addr is 0,
463 : * the lowest available address will be chosen.
464 : * @param attention_duration The attention duration to be send to remote device
465 : *
466 : * @return Zero on success or (negative) error code otherwise.
467 : */
468 1 : int bt_mesh_provision_adv(const uint8_t uuid[16], uint16_t net_idx, uint16_t addr,
469 : uint8_t attention_duration);
470 :
471 : /** @brief Provision a Mesh Node using PB-GATT
472 : *
473 : * @param uuid UUID
474 : * @param net_idx Network Key Index
475 : * @param addr Address to assign to remote device. If addr is 0,
476 : * the lowest available address will be chosen.
477 : * @param attention_duration The attention duration to be send to remote device
478 : *
479 : * @return Zero on success or (negative) error code otherwise.
480 : */
481 1 : int bt_mesh_provision_gatt(const uint8_t uuid[16], uint16_t net_idx, uint16_t addr,
482 : uint8_t attention_duration);
483 :
484 : /** @brief Provision a Mesh Node using PB-Remote
485 : *
486 : * @param cli Remote Provisioning Client Model to provision with.
487 : * @param srv Remote Provisioning Server that should be used to tunnel the
488 : * provisioning.
489 : * @param uuid UUID of the unprovisioned node
490 : * @param net_idx Network Key Index to give to the unprovisioned node.
491 : * @param addr Address to assign to remote device. If addr is 0,
492 : * the lowest available address will be chosen.
493 : *
494 : * @return Zero on success or (negative) error code otherwise.
495 : */
496 1 : int bt_mesh_provision_remote(struct bt_mesh_rpr_cli *cli,
497 : const struct bt_mesh_rpr_node *srv,
498 : const uint8_t uuid[16], uint16_t net_idx,
499 : uint16_t addr);
500 :
501 : /** @brief Reprovision a Mesh Node using PB-Remote
502 : *
503 : * Reprovisioning can be used to change the device key, unicast address and
504 : * composition data of another device. The reprovisioning procedure uses the
505 : * same protocol as normal provisioning, with the same level of security.
506 : *
507 : * There are three tiers of reprovisioning:
508 : * 1. Refreshing the device key
509 : * 2. Refreshing the device key and node address. Composition data may change,
510 : * including the number of elements.
511 : * 3. Refreshing the device key and composition data, in case the composition
512 : * data of the target node changed due to a firmware update or a similar
513 : * procedure.
514 : *
515 : * The target node indicates that its composition data changed by instantiating
516 : * its composition data page 128. If the number of elements have changed, it
517 : * may be necessary to move the unicast address of the target node as well, to
518 : * avoid overlapping addresses.
519 : *
520 : * @note Changing the unicast addresses of the target node requires changes to
521 : * all nodes that publish directly to any of the target node's models.
522 : *
523 : * @param cli Remote Provisioning Client Model to provision on
524 : * @param srv Remote Provisioning Server to reprovision
525 : * @param addr Address to assign to remote device. If addr is 0, the
526 : * lowest available address will be chosen.
527 : * @param comp_change The target node has indicated that its composition
528 : * data has changed. Note that the target node will reject
529 : * the update if this isn't true.
530 : *
531 : * @return Zero on success or (negative) error code otherwise.
532 : */
533 1 : int bt_mesh_reprovision_remote(struct bt_mesh_rpr_cli *cli,
534 : struct bt_mesh_rpr_node *srv,
535 : uint16_t addr, bool comp_change);
536 :
537 : /** @brief Check if the local node has been provisioned.
538 : *
539 : * This API can be used to check if the local node has been provisioned
540 : * or not. It can e.g. be helpful to determine if there was a stored
541 : * network in flash, i.e. if the network was restored after calling
542 : * settings_load().
543 : *
544 : * @return True if the node is provisioned. False otherwise.
545 : */
546 1 : bool bt_mesh_is_provisioned(void);
547 :
548 : /**
549 : * @}
550 : */
551 :
552 : /**
553 : * @brief Bluetooth Mesh
554 : * @defgroup bt_mesh Bluetooth Mesh
555 : * @ingroup bluetooth
556 : * @{
557 : */
558 :
559 : /** Primary Network Key index */
560 1 : #define BT_MESH_NET_PRIMARY 0x000
561 :
562 : /** Relay feature */
563 1 : #define BT_MESH_FEAT_RELAY BIT(0)
564 : /** GATT Proxy feature */
565 1 : #define BT_MESH_FEAT_PROXY BIT(1)
566 : /** Friend feature */
567 1 : #define BT_MESH_FEAT_FRIEND BIT(2)
568 : /** Low Power Node feature */
569 1 : #define BT_MESH_FEAT_LOW_POWER BIT(3)
570 : /** Supported heartbeat publication features */
571 1 : #define BT_MESH_FEAT_SUPPORTED (BT_MESH_FEAT_RELAY | \
572 : BT_MESH_FEAT_PROXY | \
573 : BT_MESH_FEAT_FRIEND | \
574 : BT_MESH_FEAT_LOW_POWER)
575 :
576 : /** @brief Initialize Mesh support
577 : *
578 : * After calling this API, the node will not automatically advertise as
579 : * unprovisioned, rather the bt_mesh_prov_enable() API needs to be called
580 : * to enable unprovisioned advertising on one or more provisioning bearers.
581 : *
582 : * @param prov Node provisioning information.
583 : * @param comp Node Composition.
584 : *
585 : * @return Zero on success or (negative) error code otherwise.
586 : */
587 1 : int bt_mesh_init(const struct bt_mesh_prov *prov,
588 : const struct bt_mesh_comp *comp);
589 :
590 : /** @brief Reset the state of the local Mesh node.
591 : *
592 : * Resets the state of the node, which means that it needs to be
593 : * reprovisioned to become an active node in a Mesh network again.
594 : *
595 : * After calling this API, the node will not automatically advertise as
596 : * unprovisioned, rather the bt_mesh_prov_enable() API needs to be called
597 : * to enable unprovisioned advertising on one or more provisioning bearers.
598 : *
599 : */
600 1 : void bt_mesh_reset(void);
601 :
602 : /** @brief Suspend the Mesh network temporarily.
603 : *
604 : * This API can be used for power saving purposes, but the user should be
605 : * aware that leaving the local node suspended for a long period of time
606 : * may cause it to become permanently disconnected from the Mesh network.
607 : * If at all possible, the Friendship feature should be used instead, to
608 : * make the node into a Low Power Node.
609 : *
610 : * @return 0 on success, or (negative) error code on failure.
611 : */
612 1 : int bt_mesh_suspend(void);
613 :
614 : /** @brief Resume a suspended Mesh network.
615 : *
616 : * This API resumes the local node, after it has been suspended using the
617 : * bt_mesh_suspend() API.
618 : *
619 : * @return 0 on success, or (negative) error code on failure.
620 : */
621 1 : int bt_mesh_resume(void);
622 :
623 : /** @brief Toggle the IV Update test mode
624 : *
625 : * This API is only available if the IV Update test mode has been enabled
626 : * in Kconfig. It is needed for passing most of the IV Update qualification
627 : * test cases.
628 : *
629 : * @param enable true to enable IV Update test mode, false to disable it.
630 : */
631 1 : void bt_mesh_iv_update_test(bool enable);
632 :
633 : /** @brief Toggle the IV Update state
634 : *
635 : * This API is only available if the IV Update test mode has been enabled
636 : * in Kconfig. It is needed for passing most of the IV Update qualification
637 : * test cases.
638 : *
639 : * @return true if IV Update In Progress state was entered, false otherwise.
640 : */
641 1 : bool bt_mesh_iv_update(void);
642 :
643 : /** @brief Toggle the Low Power feature of the local device
644 : *
645 : * Enables or disables the Low Power feature of the local device. This is
646 : * exposed as a run-time feature, since the device might want to change
647 : * this e.g. based on being plugged into a stable power source or running
648 : * from a battery power source.
649 : *
650 : * @param enable true to enable LPN functionality, false to disable it.
651 : *
652 : * @return Zero on success or (negative) error code otherwise.
653 : */
654 1 : int bt_mesh_lpn_set(bool enable);
655 :
656 : /** @brief Send out a Friend Poll message.
657 : *
658 : * Send a Friend Poll message to the Friend of this node. If there is no
659 : * established Friendship the function will return an error.
660 : *
661 : * @return Zero on success or (negative) error code otherwise.
662 : */
663 1 : int bt_mesh_lpn_poll(void);
664 :
665 : /** Low Power Node callback functions. */
666 1 : struct bt_mesh_lpn_cb {
667 : /** @brief Friendship established.
668 : *
669 : * This callback notifies the application that friendship has
670 : * been successfully established.
671 : *
672 : * @param net_idx NetKeyIndex used during friendship establishment.
673 : * @param friend_addr Friend address.
674 : * @param queue_size Friend queue size.
675 : * @param recv_window Low Power Node's listens duration for
676 : * Friend response.
677 : */
678 1 : void (*established)(uint16_t net_idx, uint16_t friend_addr,
679 : uint8_t queue_size, uint8_t recv_window);
680 :
681 : /** @brief Friendship terminated.
682 : *
683 : * This callback notifies the application that friendship has
684 : * been terminated.
685 : *
686 : * @param net_idx NetKeyIndex used during friendship establishment.
687 : * @param friend_addr Friend address.
688 : */
689 1 : void (*terminated)(uint16_t net_idx, uint16_t friend_addr);
690 :
691 : /** @brief Local Poll Request.
692 : *
693 : * This callback notifies the application that the local node has
694 : * polled the friend node.
695 : *
696 : * This callback will be called before @ref bt_mesh_lpn_cb::established
697 : * when attempting to establish a friendship.
698 : *
699 : * @param net_idx NetKeyIndex used during friendship establishment.
700 : * @param friend_addr Friend address.
701 : * @param retry Retry or first poll request for each transaction.
702 : */
703 1 : void (*polled)(uint16_t net_idx, uint16_t friend_addr, bool retry);
704 : };
705 :
706 : /**
707 : * @brief Register a callback structure for Friendship events.
708 : *
709 : * @param _name Name of callback structure.
710 : */
711 1 : #define BT_MESH_LPN_CB_DEFINE(_name) \
712 : static const STRUCT_SECTION_ITERABLE(bt_mesh_lpn_cb, \
713 : _CONCAT(bt_mesh_lpn_cb_, \
714 : _name))
715 :
716 : /** Friend Node callback functions. */
717 1 : struct bt_mesh_friend_cb {
718 : /** @brief Friendship established.
719 : *
720 : * This callback notifies the application that friendship has
721 : * been successfully established.
722 : *
723 : * @param net_idx NetKeyIndex used during friendship establishment.
724 : * @param lpn_addr Low Power Node address.
725 : * @param recv_delay Receive Delay in units of 1 millisecond.
726 : * @param polltimeout PollTimeout in units of 1 millisecond.
727 : */
728 1 : void (*established)(uint16_t net_idx, uint16_t lpn_addr,
729 : uint8_t recv_delay, uint32_t polltimeout);
730 :
731 : /** @brief Friendship terminated.
732 : *
733 : * This callback notifies the application that friendship has
734 : * been terminated.
735 : *
736 : * @param net_idx NetKeyIndex used during friendship establishment.
737 : * @param lpn_addr Low Power Node address.
738 : */
739 1 : void (*terminated)(uint16_t net_idx, uint16_t lpn_addr);
740 :
741 : /** @brief Friend Poll Request.
742 : *
743 : * This callback notifies the application that the low power node has
744 : * polled the friend node.
745 : *
746 : * This callback will be called before @ref bt_mesh_friend_cb::established
747 : * when attempting to establish a friendship.
748 : *
749 : * @param net_idx NetKeyIndex used during friendship establishment.
750 : * @param lpn_addr LPN address.
751 : */
752 1 : void (*polled)(uint16_t net_idx, uint16_t lpn_addr);
753 : };
754 :
755 : /**
756 : * @brief Register a callback structure for Friendship events.
757 : *
758 : * Registers a callback structure that will be called whenever Friendship
759 : * gets established or terminated.
760 : *
761 : * @param _name Name of callback structure.
762 : */
763 1 : #define BT_MESH_FRIEND_CB_DEFINE(_name) \
764 : static const STRUCT_SECTION_ITERABLE(bt_mesh_friend_cb, \
765 : _CONCAT(bt_mesh_friend_cb_, \
766 : _name))
767 : #if defined(CONFIG_BT_TESTING)
768 : struct bt_mesh_snb {
769 : /** Flags */
770 : uint8_t flags;
771 :
772 : /** Network ID */
773 : uint64_t net_id;
774 :
775 : /** IV Index */
776 : uint32_t iv_idx;
777 :
778 : /** Authentication Value */
779 : uint64_t auth_val;
780 : };
781 :
782 : struct bt_mesh_prb {
783 : /** Random */
784 : uint8_t random[13];
785 :
786 : /** Flags */
787 : uint8_t flags;
788 :
789 : /** IV Index */
790 : uint32_t iv_idx;
791 :
792 : /** Authentication tag */
793 : uint64_t auth_tag;
794 : };
795 :
796 : /** Beacon callback functions. */
797 : struct bt_mesh_beacon_cb {
798 : /** @brief Secure Network Beacon received.
799 : *
800 : * This callback notifies the application that Secure Network Beacon
801 : * was received.
802 : *
803 : * @param snb Structure describing received Secure Network Beacon
804 : */
805 : void (*snb_received)(const struct bt_mesh_snb *snb);
806 :
807 : /** @brief Private Beacon received.
808 : *
809 : * This callback notifies the application that Private Beacon
810 : * was received and successfully decrypted.
811 : *
812 : * @param prb Structure describing received Private Beacon
813 : */
814 : void (*priv_received)(const struct bt_mesh_prb *prb);
815 : };
816 :
817 : /**
818 : * @brief Register a callback structure for beacon events.
819 : *
820 : * Registers a callback structure that will be called whenever beacon advertisement
821 : * is received.
822 : *
823 : * @param _name Name of callback structure.
824 : */
825 : #define BT_MESH_BEACON_CB_DEFINE(_name) \
826 : static const STRUCT_SECTION_ITERABLE(bt_mesh_beacon_cb, \
827 : _CONCAT(bt_mesh_beacon_cb_, \
828 : _name))
829 : #endif
830 :
831 : /** @brief Terminate Friendship.
832 : *
833 : * Terminated Friendship for given LPN.
834 : *
835 : * @param lpn_addr Low Power Node address.
836 : *
837 : * @return Zero on success or (negative) error code otherwise.
838 : */
839 1 : int bt_mesh_friend_terminate(uint16_t lpn_addr);
840 :
841 : /** @brief Store pending RPL entry(ies) in the persistent storage.
842 : *
843 : * This API allows the user to store pending RPL entry(ies) in the persistent
844 : * storage without waiting for the timeout.
845 : *
846 : * @note When flash is used as the persistent storage, calling this API too
847 : * frequently may wear it out.
848 : *
849 : * @param addr Address of the node which RPL entry needs to be stored or
850 : * @ref BT_MESH_ADDR_ALL_NODES to store all pending RPL entries.
851 : */
852 1 : void bt_mesh_rpl_pending_store(uint16_t addr);
853 :
854 : /** @brief Iterate stored Label UUIDs.
855 : *
856 : * When @c addr is @ref BT_MESH_ADDR_UNASSIGNED, this function iterates over all available addresses
857 : * starting with @c uuid. In this case, use @c retaddr to get virtual address representation of
858 : * the returned Label UUID. When @c addr is a virtual address, this function returns next Label
859 : * UUID corresponding to the @c addr. When @c uuid is NULL, this function returns the first
860 : * available UUID. If @c uuid is previously returned uuid, this function returns following uuid.
861 : *
862 : * @param addr Virtual address to search for, or @ref BT_MESH_ADDR_UNASSIGNED.
863 : * @param uuid Pointer to the previously returned Label UUID or NULL.
864 : * @param retaddr Pointer to a memory where virtual address representation of the returning UUID is
865 : * to be stored to.
866 : *
867 : * @return Pointer to Label UUID, or NULL if no more entries found.
868 : */
869 1 : const uint8_t *bt_mesh_va_uuid_get(uint16_t addr, const uint8_t *uuid, uint16_t *retaddr);
870 :
871 : #ifdef __cplusplus
872 : }
873 : #endif
874 :
875 : /**
876 : * @}
877 : */
878 :
879 : #endif /* ZEPHYR_INCLUDE_BLUETOOTH_MESH_MAIN_H_ */
|