Line data Source code
1 1 : /** @file
2 : * @brief Access layer 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_ACCESS_H_
11 : #define ZEPHYR_INCLUDE_BLUETOOTH_MESH_ACCESS_H_
12 :
13 : #include <zephyr/sys/util.h>
14 : #include <zephyr/settings/settings.h>
15 : #include <zephyr/bluetooth/mesh/msg.h>
16 :
17 : /* Internal macros used to initialize array members */
18 0 : #define BT_MESH_KEY_UNUSED_ELT_(IDX, _) BT_MESH_KEY_UNUSED
19 0 : #define BT_MESH_ADDR_UNASSIGNED_ELT_(IDX, _) BT_MESH_ADDR_UNASSIGNED
20 0 : #define BT_MESH_UUID_UNASSIGNED_ELT_(IDX, _) NULL
21 0 : #define BT_MESH_MODEL_KEYS_UNUSED(_keys) \
22 : { LISTIFY(_keys, BT_MESH_KEY_UNUSED_ELT_, (,)) }
23 0 : #define BT_MESH_MODEL_GROUPS_UNASSIGNED(_grps) \
24 : { LISTIFY(_grps, BT_MESH_ADDR_UNASSIGNED_ELT_, (,)) }
25 : #if CONFIG_BT_MESH_LABEL_COUNT > 0
26 : #define BT_MESH_MODEL_UUIDS_UNASSIGNED() \
27 : .uuids = (const uint8_t *[]){ LISTIFY(CONFIG_BT_MESH_LABEL_COUNT, \
28 : BT_MESH_UUID_UNASSIGNED_ELT_, (,)) },
29 : #else
30 0 : #define BT_MESH_MODEL_UUIDS_UNASSIGNED()
31 : #endif
32 :
33 0 : #define BT_MESH_MODEL_RUNTIME_INIT(_user_data) \
34 : .rt = &(struct bt_mesh_model_rt_ctx){ .user_data = (_user_data) },
35 :
36 : /**
37 : * @brief Access layer
38 : * @defgroup bt_mesh_access Access layer
39 : * @ingroup bt_mesh
40 : * @{
41 : */
42 :
43 : #ifdef __cplusplus
44 : extern "C" {
45 : #endif
46 :
47 : /**
48 : * @name Group addresses
49 : * @{
50 : */
51 1 : #define BT_MESH_ADDR_UNASSIGNED 0x0000 /**< unassigned */
52 1 : #define BT_MESH_ADDR_ALL_NODES 0xffff /**< all-nodes */
53 1 : #define BT_MESH_ADDR_RELAYS 0xfffe /**< all-relays */
54 1 : #define BT_MESH_ADDR_FRIENDS 0xfffd /**< all-friends */
55 1 : #define BT_MESH_ADDR_PROXIES 0xfffc /**< all-proxies */
56 1 : #define BT_MESH_ADDR_DFW_NODES 0xfffb /**< all-directed-forwarding-nodes */
57 1 : #define BT_MESH_ADDR_IP_NODES 0xfffa /**< all-ipt-nodes */
58 1 : #define BT_MESH_ADDR_IP_BR_ROUTERS 0xfff9 /**< all-ipt-border-routers */
59 : /**
60 : * @}
61 : */
62 :
63 : /**
64 : * @name Predefined key indexes
65 : * @{
66 : */
67 1 : #define BT_MESH_KEY_UNUSED 0xffff /**< Key unused */
68 1 : #define BT_MESH_KEY_ANY 0xffff /**< Any key index */
69 1 : #define BT_MESH_KEY_DEV 0xfffe /**< Device key */
70 1 : #define BT_MESH_KEY_DEV_LOCAL BT_MESH_KEY_DEV /**< Local device key */
71 1 : #define BT_MESH_KEY_DEV_REMOTE 0xfffd /**< Remote device key */
72 1 : #define BT_MESH_KEY_DEV_ANY 0xfffc /**< Any device key */
73 : /**
74 : * @}
75 : */
76 :
77 : /**
78 : * Check if a Bluetooth Mesh address is a unicast address.
79 : */
80 1 : #define BT_MESH_ADDR_IS_UNICAST(addr) ((addr) && (addr) < 0x8000)
81 : /**
82 : * Check if a Bluetooth Mesh address is a group address.
83 : */
84 1 : #define BT_MESH_ADDR_IS_GROUP(addr) ((addr) >= 0xc000 && (addr) < 0xff00)
85 : /**
86 : * Check if a Bluetooth Mesh address is a fixed group address.
87 : */
88 1 : #define BT_MESH_ADDR_IS_FIXED_GROUP(addr) ((addr) >= 0xff00 && (addr) < 0xffff)
89 : /**
90 : * Check if a Bluetooth Mesh address is a virtual address.
91 : */
92 1 : #define BT_MESH_ADDR_IS_VIRTUAL(addr) ((addr) >= 0x8000 && (addr) < 0xc000)
93 : /**
94 : * Check if a Bluetooth Mesh address is an RFU address.
95 : */
96 1 : #define BT_MESH_ADDR_IS_RFU(addr) ((addr) >= 0xff00 && (addr) <= 0xfff8)
97 :
98 : /**
99 : * Check if a Bluetooth Mesh key is a device key.
100 : */
101 1 : #define BT_MESH_IS_DEV_KEY(key) (key == BT_MESH_KEY_DEV_LOCAL || \
102 : key == BT_MESH_KEY_DEV_REMOTE)
103 :
104 : /** Maximum size of an access message segment (in octets). */
105 1 : #define BT_MESH_APP_SEG_SDU_MAX 12
106 :
107 : /** Maximum payload size of an unsegmented access message (in octets). */
108 1 : #define BT_MESH_APP_UNSEG_SDU_MAX 15
109 :
110 : /** Maximum number of segments supported for incoming messages. */
111 : #if defined(CONFIG_BT_MESH_RX_SEG_MAX)
112 : #define BT_MESH_RX_SEG_MAX CONFIG_BT_MESH_RX_SEG_MAX
113 : #else
114 1 : #define BT_MESH_RX_SEG_MAX 0
115 : #endif
116 :
117 : /** Maximum number of segments supported for outgoing messages. */
118 : #if defined(CONFIG_BT_MESH_TX_SEG_MAX)
119 : #define BT_MESH_TX_SEG_MAX CONFIG_BT_MESH_TX_SEG_MAX
120 : #else
121 1 : #define BT_MESH_TX_SEG_MAX 0
122 : #endif
123 :
124 : /** Maximum possible payload size of an outgoing access message (in octets). */
125 1 : #define BT_MESH_TX_SDU_MAX MAX((BT_MESH_TX_SEG_MAX * \
126 : BT_MESH_APP_SEG_SDU_MAX), \
127 : BT_MESH_APP_UNSEG_SDU_MAX)
128 :
129 : /** Maximum possible payload size of an incoming access message (in octets). */
130 1 : #define BT_MESH_RX_SDU_MAX MAX((BT_MESH_RX_SEG_MAX * \
131 : BT_MESH_APP_SEG_SDU_MAX), \
132 : BT_MESH_APP_UNSEG_SDU_MAX)
133 :
134 : /** Helper to define a mesh element within an array.
135 : *
136 : * In case the element has no SIG or Vendor models the helper
137 : * macro BT_MESH_MODEL_NONE can be given instead.
138 : *
139 : * @param _loc Location Descriptor.
140 : * @param _mods Array of models.
141 : * @param _vnd_mods Array of vendor models.
142 : */
143 1 : #define BT_MESH_ELEM(_loc, _mods, _vnd_mods) \
144 : { \
145 : .rt = &(struct bt_mesh_elem_rt_ctx) { 0 }, \
146 : .loc = (_loc), \
147 : .model_count = ARRAY_SIZE(_mods), \
148 : .vnd_model_count = ARRAY_SIZE(_vnd_mods), \
149 : .models = (_mods), \
150 : .vnd_models = (_vnd_mods), \
151 : }
152 :
153 : /** Abstraction that describes a Mesh Element */
154 1 : struct bt_mesh_elem {
155 : /** Mesh Element runtime information */
156 1 : struct bt_mesh_elem_rt_ctx {
157 : /** Unicast Address. Set at runtime during provisioning. */
158 1 : uint16_t addr;
159 0 : } * const rt;
160 :
161 : /** Location Descriptor (GATT Bluetooth Namespace Descriptors) */
162 1 : const uint16_t loc;
163 : /** The number of SIG models in this element */
164 1 : const uint8_t model_count;
165 : /** The number of vendor models in this element */
166 1 : const uint8_t vnd_model_count;
167 :
168 : /** The list of SIG models in this element */
169 1 : const struct bt_mesh_model * const models;
170 : /** The list of vendor models in this element */
171 1 : const struct bt_mesh_model * const vnd_models;
172 : };
173 :
174 : /**
175 : * @name Foundation Models
176 : * @{
177 : */
178 : /** Configuration Server */
179 1 : #define BT_MESH_MODEL_ID_CFG_SRV 0x0000
180 : /** Configuration Client */
181 1 : #define BT_MESH_MODEL_ID_CFG_CLI 0x0001
182 : /** Health Server */
183 1 : #define BT_MESH_MODEL_ID_HEALTH_SRV 0x0002
184 : /** Health Client */
185 1 : #define BT_MESH_MODEL_ID_HEALTH_CLI 0x0003
186 : /** Remote Provisioning Server */
187 1 : #define BT_MESH_MODEL_ID_REMOTE_PROV_SRV 0x0004
188 : /** Remote Provisioning Client */
189 1 : #define BT_MESH_MODEL_ID_REMOTE_PROV_CLI 0x0005
190 : /** Bridge Configuration Sever */
191 1 : #define BT_MESH_MODEL_ID_BRG_CFG_SRV 0x0008
192 : /** Bridge Configuration Client */
193 1 : #define BT_MESH_MODEL_ID_BRG_CFG_CLI 0x0009
194 : /** Private Beacon Server */
195 1 : #define BT_MESH_MODEL_ID_PRIV_BEACON_SRV 0x000a
196 : /** Private Beacon Client */
197 1 : #define BT_MESH_MODEL_ID_PRIV_BEACON_CLI 0x000b
198 : /** SAR Configuration Server */
199 1 : #define BT_MESH_MODEL_ID_SAR_CFG_SRV 0x000e
200 : /** SAR Configuration Client */
201 1 : #define BT_MESH_MODEL_ID_SAR_CFG_CLI 0x000f
202 : /** Opcodes Aggregator Server */
203 1 : #define BT_MESH_MODEL_ID_OP_AGG_SRV 0x0010
204 : /** Opcodes Aggregator Client */
205 1 : #define BT_MESH_MODEL_ID_OP_AGG_CLI 0x0011
206 : /** Large Composition Data Server */
207 1 : #define BT_MESH_MODEL_ID_LARGE_COMP_DATA_SRV 0x0012
208 : /** Large Composition Data Client */
209 1 : #define BT_MESH_MODEL_ID_LARGE_COMP_DATA_CLI 0x0013
210 : /** Solicitation PDU RPL Configuration Client */
211 1 : #define BT_MESH_MODEL_ID_SOL_PDU_RPL_SRV 0x0014
212 : /** Solicitation PDU RPL Configuration Server */
213 1 : #define BT_MESH_MODEL_ID_SOL_PDU_RPL_CLI 0x0015
214 : /** Private Proxy Server */
215 1 : #define BT_MESH_MODEL_ID_ON_DEMAND_PROXY_SRV 0x000c
216 : /** Private Proxy Client */
217 1 : #define BT_MESH_MODEL_ID_ON_DEMAND_PROXY_CLI 0x000d
218 : /**
219 : * @}
220 : */
221 :
222 : /**
223 : * @name Models from the Mesh Model Specification
224 : * @{
225 : */
226 : /** Generic OnOff Server */
227 1 : #define BT_MESH_MODEL_ID_GEN_ONOFF_SRV 0x1000
228 : /** Generic OnOff Client */
229 1 : #define BT_MESH_MODEL_ID_GEN_ONOFF_CLI 0x1001
230 : /** Generic Level Server */
231 1 : #define BT_MESH_MODEL_ID_GEN_LEVEL_SRV 0x1002
232 : /** Generic Level Client */
233 1 : #define BT_MESH_MODEL_ID_GEN_LEVEL_CLI 0x1003
234 : /** Generic Default Transition Time Server */
235 1 : #define BT_MESH_MODEL_ID_GEN_DEF_TRANS_TIME_SRV 0x1004
236 : /** Generic Default Transition Time Client */
237 1 : #define BT_MESH_MODEL_ID_GEN_DEF_TRANS_TIME_CLI 0x1005
238 : /** Generic Power OnOff Server */
239 1 : #define BT_MESH_MODEL_ID_GEN_POWER_ONOFF_SRV 0x1006
240 : /** Generic Power OnOff Setup Server */
241 1 : #define BT_MESH_MODEL_ID_GEN_POWER_ONOFF_SETUP_SRV 0x1007
242 : /** Generic Power OnOff Client */
243 1 : #define BT_MESH_MODEL_ID_GEN_POWER_ONOFF_CLI 0x1008
244 : /** Generic Power Level Server */
245 1 : #define BT_MESH_MODEL_ID_GEN_POWER_LEVEL_SRV 0x1009
246 : /** Generic Power Level Setup Server */
247 1 : #define BT_MESH_MODEL_ID_GEN_POWER_LEVEL_SETUP_SRV 0x100a
248 : /** Generic Power Level Client */
249 1 : #define BT_MESH_MODEL_ID_GEN_POWER_LEVEL_CLI 0x100b
250 : /** Generic Battery Server */
251 1 : #define BT_MESH_MODEL_ID_GEN_BATTERY_SRV 0x100c
252 : /** Generic Battery Client */
253 1 : #define BT_MESH_MODEL_ID_GEN_BATTERY_CLI 0x100d
254 : /** Generic Location Server */
255 1 : #define BT_MESH_MODEL_ID_GEN_LOCATION_SRV 0x100e
256 : /** Generic Location Setup Server */
257 1 : #define BT_MESH_MODEL_ID_GEN_LOCATION_SETUPSRV 0x100f
258 : /** Generic Location Client */
259 1 : #define BT_MESH_MODEL_ID_GEN_LOCATION_CLI 0x1010
260 : /** Generic Admin Property Server */
261 1 : #define BT_MESH_MODEL_ID_GEN_ADMIN_PROP_SRV 0x1011
262 : /** Generic Manufacturer Property Server */
263 1 : #define BT_MESH_MODEL_ID_GEN_MANUFACTURER_PROP_SRV 0x1012
264 : /** Generic User Property Server */
265 1 : #define BT_MESH_MODEL_ID_GEN_USER_PROP_SRV 0x1013
266 : /** Generic Client Property Server */
267 1 : #define BT_MESH_MODEL_ID_GEN_CLIENT_PROP_SRV 0x1014
268 : /** Generic Property Client */
269 1 : #define BT_MESH_MODEL_ID_GEN_PROP_CLI 0x1015
270 : /** Sensor Server */
271 1 : #define BT_MESH_MODEL_ID_SENSOR_SRV 0x1100
272 : /** Sensor Setup Server */
273 1 : #define BT_MESH_MODEL_ID_SENSOR_SETUP_SRV 0x1101
274 : /** Sensor Client */
275 1 : #define BT_MESH_MODEL_ID_SENSOR_CLI 0x1102
276 : /** Time Server */
277 1 : #define BT_MESH_MODEL_ID_TIME_SRV 0x1200
278 : /** Time Setup Server */
279 1 : #define BT_MESH_MODEL_ID_TIME_SETUP_SRV 0x1201
280 : /** Time Client */
281 1 : #define BT_MESH_MODEL_ID_TIME_CLI 0x1202
282 : /** Scene Server */
283 1 : #define BT_MESH_MODEL_ID_SCENE_SRV 0x1203
284 : /** Scene Setup Server */
285 1 : #define BT_MESH_MODEL_ID_SCENE_SETUP_SRV 0x1204
286 : /** Scene Client */
287 1 : #define BT_MESH_MODEL_ID_SCENE_CLI 0x1205
288 : /** Scheduler Server */
289 1 : #define BT_MESH_MODEL_ID_SCHEDULER_SRV 0x1206
290 : /** Scheduler Setup Server */
291 1 : #define BT_MESH_MODEL_ID_SCHEDULER_SETUP_SRV 0x1207
292 : /** Scheduler Client */
293 1 : #define BT_MESH_MODEL_ID_SCHEDULER_CLI 0x1208
294 : /** Light Lightness Server */
295 1 : #define BT_MESH_MODEL_ID_LIGHT_LIGHTNESS_SRV 0x1300
296 : /** Light Lightness Setup Server */
297 1 : #define BT_MESH_MODEL_ID_LIGHT_LIGHTNESS_SETUP_SRV 0x1301
298 : /** Light Lightness Client */
299 1 : #define BT_MESH_MODEL_ID_LIGHT_LIGHTNESS_CLI 0x1302
300 : /** Light CTL Server */
301 1 : #define BT_MESH_MODEL_ID_LIGHT_CTL_SRV 0x1303
302 : /** Light CTL Setup Server */
303 1 : #define BT_MESH_MODEL_ID_LIGHT_CTL_SETUP_SRV 0x1304
304 : /** Light CTL Client */
305 1 : #define BT_MESH_MODEL_ID_LIGHT_CTL_CLI 0x1305
306 : /** Light CTL Temperature Server */
307 1 : #define BT_MESH_MODEL_ID_LIGHT_CTL_TEMP_SRV 0x1306
308 : /** Light HSL Server */
309 1 : #define BT_MESH_MODEL_ID_LIGHT_HSL_SRV 0x1307
310 : /** Light HSL Setup Server */
311 1 : #define BT_MESH_MODEL_ID_LIGHT_HSL_SETUP_SRV 0x1308
312 : /** Light HSL Client */
313 1 : #define BT_MESH_MODEL_ID_LIGHT_HSL_CLI 0x1309
314 : /** Light HSL Hue Server */
315 1 : #define BT_MESH_MODEL_ID_LIGHT_HSL_HUE_SRV 0x130a
316 : /** Light HSL Saturation Server */
317 1 : #define BT_MESH_MODEL_ID_LIGHT_HSL_SAT_SRV 0x130b
318 : /** Light xyL Server */
319 1 : #define BT_MESH_MODEL_ID_LIGHT_XYL_SRV 0x130c
320 : /** Light xyL Setup Server */
321 1 : #define BT_MESH_MODEL_ID_LIGHT_XYL_SETUP_SRV 0x130d
322 : /** Light xyL Client */
323 1 : #define BT_MESH_MODEL_ID_LIGHT_XYL_CLI 0x130e
324 : /** Light LC Server */
325 1 : #define BT_MESH_MODEL_ID_LIGHT_LC_SRV 0x130f
326 : /** Light LC Setup Server */
327 1 : #define BT_MESH_MODEL_ID_LIGHT_LC_SETUPSRV 0x1310
328 : /** Light LC Client */
329 1 : #define BT_MESH_MODEL_ID_LIGHT_LC_CLI 0x1311
330 : /**
331 : * @}
332 : */
333 :
334 : /**
335 : * @name Models from the Mesh Binary Large Object Transfer Model Specification
336 : * @{
337 : */
338 : /** BLOB Transfer Server */
339 1 : #define BT_MESH_MODEL_ID_BLOB_SRV 0x1400
340 : /** BLOB Transfer Client */
341 1 : #define BT_MESH_MODEL_ID_BLOB_CLI 0x1401
342 : /**
343 : * @}
344 : */
345 :
346 : /**
347 : * @name Models from the Mesh Device Firmware Update Model Specification
348 : * @{
349 : */
350 : /** Firmware Update Server */
351 1 : #define BT_MESH_MODEL_ID_DFU_SRV 0x1402
352 : /** Firmware Update Client */
353 1 : #define BT_MESH_MODEL_ID_DFU_CLI 0x1403
354 : /** Firmware Distribution Server */
355 1 : #define BT_MESH_MODEL_ID_DFD_SRV 0x1404
356 : /** Firmware Distribution Client */
357 1 : #define BT_MESH_MODEL_ID_DFD_CLI 0x1405
358 : /**
359 : * @}
360 : */
361 :
362 : /** Model opcode handler. */
363 1 : struct bt_mesh_model_op {
364 : /** OpCode encoded using the BT_MESH_MODEL_OP_* macros */
365 1 : const uint32_t opcode;
366 :
367 : /** Message length. If the message has variable length then this value
368 : * indicates minimum message length and should be positive. Handler
369 : * function should verify precise length based on the contents of the
370 : * message. If the message has fixed length then this value should
371 : * be negative. Use BT_MESH_LEN_* macros when defining this value.
372 : */
373 1 : const ssize_t len;
374 :
375 : /** @brief Handler function for this opcode.
376 : *
377 : * @param model Model instance receiving the message.
378 : * @param ctx Message context for the message.
379 : * @param buf Message buffer containing the message payload, not
380 : * including the opcode.
381 : *
382 : * @return Zero on success or (negative) error code otherwise.
383 : */
384 1 : int (*const func)(const struct bt_mesh_model *model,
385 : struct bt_mesh_msg_ctx *ctx,
386 : struct net_buf_simple *buf);
387 : };
388 :
389 0 : #define BT_MESH_MODEL_OP_1(b0) (b0)
390 0 : #define BT_MESH_MODEL_OP_2(b0, b1) (((b0) << 8) | (b1))
391 0 : #define BT_MESH_MODEL_OP_3(b0, cid) ((((b0) << 16) | 0xc00000) | (cid))
392 :
393 : /** Macro for encoding exact message length for fixed-length messages. */
394 1 : #define BT_MESH_LEN_EXACT(len) (-len)
395 : /** Macro for encoding minimum message length for variable-length messages. */
396 1 : #define BT_MESH_LEN_MIN(len) (len)
397 :
398 : /** End of the opcode list. Must always be present. */
399 1 : #define BT_MESH_MODEL_OP_END { 0, 0, NULL }
400 :
401 : #if !defined(__cplusplus) || defined(__DOXYGEN__)
402 : /**
403 : * @brief Helper to define an empty opcode list.
404 : *
405 : * This macro uses compound literal feature of C99 standard and thus is available only from C,
406 : * not C++.
407 : */
408 1 : #define BT_MESH_MODEL_NO_OPS ((struct bt_mesh_model_op []) \
409 : { BT_MESH_MODEL_OP_END })
410 :
411 : /**
412 : * @brief Helper to define an empty model array
413 : *
414 : * This macro uses compound literal feature of C99 standard and thus is available only from C,
415 : * not C++.
416 : */
417 1 : #define BT_MESH_MODEL_NONE ((const struct bt_mesh_model []){})
418 :
419 : /**
420 : * @brief Composition data SIG model entry with callback functions
421 : * with specific number of keys & groups.
422 : *
423 : * This macro uses compound literal feature of C99 standard and thus is available only from C,
424 : * not C++.
425 : *
426 : * @param _id Model ID.
427 : * @param _op Array of model opcode handlers.
428 : * @param _pub Model publish parameters.
429 : * @param _user_data User data for the model.
430 : * @param _keys Number of keys that can be bound to the model.
431 : * Shall not exceed @kconfig{CONFIG_BT_MESH_MODEL_KEY_COUNT}.
432 : * @param _grps Number of addresses that the model can be subscribed to.
433 : * Shall not exceed @kconfig{CONFIG_BT_MESH_MODEL_GROUP_COUNT}.
434 : * @param _cb Callback structure, or NULL to keep no callbacks.
435 : */
436 1 : #define BT_MESH_MODEL_CNT_CB(_id, _op, _pub, _user_data, _keys, _grps, _cb) \
437 : { \
438 : .id = (_id), \
439 : BT_MESH_MODEL_RUNTIME_INIT(_user_data) \
440 : .pub = _pub, \
441 : .keys = (uint16_t []) BT_MESH_MODEL_KEYS_UNUSED(_keys), \
442 : .keys_cnt = _keys, \
443 : .groups = (uint16_t []) BT_MESH_MODEL_GROUPS_UNASSIGNED(_grps), \
444 : .groups_cnt = _grps, \
445 : BT_MESH_MODEL_UUIDS_UNASSIGNED() \
446 : .op = _op, \
447 : .cb = _cb, \
448 : }
449 :
450 : /**
451 : * @brief Composition data vendor model entry with callback functions
452 : * with specific number of keys & groups.
453 : *
454 : * This macro uses compound literal feature of C99 standard and thus is available only from C,
455 : * not C++.
456 : *
457 : * @param _company Company ID.
458 : * @param _id Model ID.
459 : * @param _op Array of model opcode handlers.
460 : * @param _pub Model publish parameters.
461 : * @param _user_data User data for the model.
462 : * @param _keys Number of keys that can be bound to the model.
463 : * Shall not exceed @kconfig{CONFIG_BT_MESH_MODEL_KEY_COUNT}.
464 : * @param _grps Number of addresses that the model can be subscribed to.
465 : * Shall not exceed @kconfig{CONFIG_BT_MESH_MODEL_GROUP_COUNT}.
466 : * @param _cb Callback structure, or NULL to keep no callbacks.
467 : */
468 1 : #define BT_MESH_MODEL_CNT_VND_CB(_company, _id, _op, _pub, _user_data, _keys, _grps, _cb) \
469 : { \
470 : .vnd.company = (_company), \
471 : .vnd.id = (_id), \
472 : BT_MESH_MODEL_RUNTIME_INIT(_user_data) \
473 : .op = _op, \
474 : .pub = _pub, \
475 : .keys = (uint16_t []) BT_MESH_MODEL_KEYS_UNUSED(_keys), \
476 : .keys_cnt = _keys, \
477 : .groups = (uint16_t []) BT_MESH_MODEL_GROUPS_UNASSIGNED(_grps), \
478 : .groups_cnt = _grps, \
479 : BT_MESH_MODEL_UUIDS_UNASSIGNED() \
480 : .cb = _cb, \
481 : }
482 :
483 : /**
484 : * @brief Composition data SIG model entry with callback functions.
485 : *
486 : * This macro uses compound literal feature of C99 standard and thus is available only from C,
487 : * not C++.
488 : *
489 : * @param _id Model ID.
490 : * @param _op Array of model opcode handlers.
491 : * @param _pub Model publish parameters.
492 : * @param _user_data User data for the model.
493 : * @param _cb Callback structure, or NULL to keep no callbacks.
494 : */
495 1 : #define BT_MESH_MODEL_CB(_id, _op, _pub, _user_data, _cb) \
496 : BT_MESH_MODEL_CNT_CB(_id, _op, _pub, _user_data, \
497 : CONFIG_BT_MESH_MODEL_KEY_COUNT, \
498 : CONFIG_BT_MESH_MODEL_GROUP_COUNT, _cb)
499 :
500 :
501 : /**
502 : *
503 : * @brief Composition data SIG model entry with callback functions and metadata.
504 : *
505 : * This macro uses compound literal feature of C99 standard and thus is available only from C,
506 : * not C++.
507 : *
508 : * @param _id Model ID.
509 : * @param _op Array of model opcode handlers.
510 : * @param _pub Model publish parameters.
511 : * @param _user_data User data for the model.
512 : * @param _cb Callback structure, or NULL to keep no callbacks.
513 : * @param _metadata Metadata structure. Used if @kconfig{CONFIG_BT_MESH_LARGE_COMP_DATA_SRV}
514 : * is enabled.
515 : */
516 : #if defined(CONFIG_BT_MESH_LARGE_COMP_DATA_SRV)
517 : #define BT_MESH_MODEL_METADATA_CB(_id, _op, _pub, _user_data, _cb, _metadata) \
518 : { \
519 : .id = (_id), \
520 : BT_MESH_MODEL_RUNTIME_INIT(_user_data) \
521 : .pub = _pub, \
522 : .keys = (uint16_t []) BT_MESH_MODEL_KEYS_UNUSED(CONFIG_BT_MESH_MODEL_KEY_COUNT), \
523 : .keys_cnt = CONFIG_BT_MESH_MODEL_KEY_COUNT, \
524 : .groups = (uint16_t []) BT_MESH_MODEL_GROUPS_UNASSIGNED(CONFIG_BT_MESH_MODEL_GROUP_COUNT), \
525 : .groups_cnt = CONFIG_BT_MESH_MODEL_GROUP_COUNT, \
526 : BT_MESH_MODEL_UUIDS_UNASSIGNED() \
527 : .op = _op, \
528 : .cb = _cb, \
529 : .metadata = _metadata, \
530 : }
531 : #else
532 1 : #define BT_MESH_MODEL_METADATA_CB(_id, _op, _pub, _user_data, _cb, _metadata) \
533 : BT_MESH_MODEL_CB(_id, _op, _pub, _user_data, _cb)
534 : #endif
535 :
536 : /**
537 : *
538 : * @brief Composition data vendor model entry with callback functions.
539 : *
540 : * This macro uses compound literal feature of C99 standard and thus is available only from C,
541 : * not C++.
542 : *
543 : * @param _company Company ID.
544 : * @param _id Model ID.
545 : * @param _op Array of model opcode handlers.
546 : * @param _pub Model publish parameters.
547 : * @param _user_data User data for the model.
548 : * @param _cb Callback structure, or NULL to keep no callbacks.
549 : */
550 1 : #define BT_MESH_MODEL_VND_CB(_company, _id, _op, _pub, _user_data, _cb) \
551 : BT_MESH_MODEL_CNT_VND_CB(_company, _id, _op, _pub, _user_data, \
552 : CONFIG_BT_MESH_MODEL_KEY_COUNT, \
553 : CONFIG_BT_MESH_MODEL_GROUP_COUNT, _cb)
554 :
555 : /**
556 : *
557 : * @brief Composition data vendor model entry with callback functions and metadata.
558 : *
559 : * This macro uses compound literal feature of C99 standard and thus is available only from C,
560 : * not C++.
561 : *
562 : * @param _company Company ID.
563 : * @param _id Model ID.
564 : * @param _op Array of model opcode handlers.
565 : * @param _pub Model publish parameters.
566 : * @param _user_data User data for the model.
567 : * @param _cb Callback structure, or NULL to keep no callbacks.
568 : * @param _metadata Metadata structure. Used if @kconfig{CONFIG_BT_MESH_LARGE_COMP_DATA_SRV}
569 : * is enabled.
570 : */
571 : #if defined(CONFIG_BT_MESH_LARGE_COMP_DATA_SRV)
572 : #define BT_MESH_MODEL_VND_METADATA_CB(_company, _id, _op, _pub, _user_data, _cb, _metadata) \
573 : { \
574 : .vnd.company = (_company), \
575 : .vnd.id = (_id), \
576 : BT_MESH_MODEL_RUNTIME_INIT(_user_data) \
577 : .op = _op, \
578 : .pub = _pub, \
579 : .keys = (uint16_t []) BT_MESH_MODEL_KEYS_UNUSED(CONFIG_BT_MESH_MODEL_KEY_COUNT), \
580 : .keys_cnt = CONFIG_BT_MESH_MODEL_KEY_COUNT, \
581 : .groups = (uint16_t []) BT_MESH_MODEL_GROUPS_UNASSIGNED(CONFIG_BT_MESH_MODEL_GROUP_COUNT), \
582 : .groups_cnt = CONFIG_BT_MESH_MODEL_GROUP_COUNT, \
583 : BT_MESH_MODEL_UUIDS_UNASSIGNED() \
584 : .cb = _cb, \
585 : .metadata = _metadata, \
586 : }
587 : #else
588 1 : #define BT_MESH_MODEL_VND_METADATA_CB(_company, _id, _op, _pub, _user_data, _cb, _metadata) \
589 : BT_MESH_MODEL_VND_CB(_company, _id, _op, _pub, _user_data, _cb)
590 : #endif
591 : /**
592 : * @brief Composition data SIG model entry.
593 : *
594 : * This macro uses compound literal feature of C99 standard and thus is available only from C,
595 : * not C++.
596 : *
597 : * @param _id Model ID.
598 : * @param _op Array of model opcode handlers.
599 : * @param _pub Model publish parameters.
600 : * @param _user_data User data for the model.
601 : */
602 1 : #define BT_MESH_MODEL(_id, _op, _pub, _user_data) \
603 : BT_MESH_MODEL_CB(_id, _op, _pub, _user_data, NULL)
604 :
605 : /**
606 : * @brief Composition data vendor model entry.
607 : *
608 : * This macro uses compound literal feature of C99 standard and thus is available only from C,
609 : * not C++.
610 : *
611 : * @param _company Company ID.
612 : * @param _id Model ID.
613 : * @param _op Array of model opcode handlers.
614 : * @param _pub Model publish parameters.
615 : * @param _user_data User data for the model.
616 : */
617 1 : #define BT_MESH_MODEL_VND(_company, _id, _op, _pub, _user_data) \
618 : BT_MESH_MODEL_VND_CB(_company, _id, _op, _pub, _user_data, NULL)
619 : #endif /* !defined(__cplusplus) || defined(__DOXYGEN__) */
620 :
621 : /**
622 : * @brief Encode transmission count & interval steps.
623 : *
624 : * @param count Number of retransmissions (first transmission is excluded).
625 : * @param int_ms Interval steps in milliseconds. Must be greater than 0,
626 : * less than or equal to 320, and a multiple of 10.
627 : *
628 : * @return Mesh transmit value that can be used e.g. for the default
629 : * values of the configuration model data.
630 : */
631 1 : #define BT_MESH_TRANSMIT(count, int_ms) ((count) | (((int_ms / 10) - 1) << 3))
632 :
633 : /**
634 : * @brief Decode transmit count from a transmit value.
635 : *
636 : * @param transmit Encoded transmit count & interval value.
637 : *
638 : * @return Transmission count (actual transmissions is N + 1).
639 : */
640 1 : #define BT_MESH_TRANSMIT_COUNT(transmit) (((transmit) & (uint8_t)BIT_MASK(3)))
641 :
642 : /**
643 : * @brief Decode transmit interval from a transmit value.
644 : *
645 : * @param transmit Encoded transmit count & interval value.
646 : *
647 : * @return Transmission interval in milliseconds.
648 : */
649 1 : #define BT_MESH_TRANSMIT_INT(transmit) ((((transmit) >> 3) + 1) * 10)
650 :
651 : /**
652 : * @brief Encode Publish Retransmit count & interval steps.
653 : *
654 : * @param count Number of retransmissions (first transmission is excluded).
655 : * @param int_ms Interval steps in milliseconds. Must be greater than 0 and a
656 : * multiple of 50.
657 : *
658 : * @return Mesh transmit value that can be used e.g. for the default
659 : * values of the configuration model data.
660 : */
661 1 : #define BT_MESH_PUB_TRANSMIT(count, int_ms) BT_MESH_TRANSMIT(count, \
662 : (int_ms) / 5)
663 :
664 : /**
665 : * @brief Decode Publish Retransmit count from a given value.
666 : *
667 : * @param transmit Encoded Publish Retransmit count & interval value.
668 : *
669 : * @return Retransmission count (actual transmissions is N + 1).
670 : */
671 1 : #define BT_MESH_PUB_TRANSMIT_COUNT(transmit) BT_MESH_TRANSMIT_COUNT(transmit)
672 :
673 : /**
674 : * @brief Decode Publish Retransmit interval from a given value.
675 : *
676 : * @param transmit Encoded Publish Retransmit count & interval value.
677 : *
678 : * @return Transmission interval in milliseconds.
679 : */
680 1 : #define BT_MESH_PUB_TRANSMIT_INT(transmit) ((((transmit) >> 3) + 1) * 50)
681 :
682 : /**
683 : * @brief Get total number of messages within one publication interval including initial
684 : * publication.
685 : *
686 : * @param pub Model publication context.
687 : *
688 : * @return total number of messages.
689 : */
690 1 : #define BT_MESH_PUB_MSG_TOTAL(pub) (BT_MESH_PUB_TRANSMIT_COUNT((pub)->retransmit) + 1)
691 :
692 : /**
693 : * @brief Get message number within one publication interval.
694 : *
695 : * Meant to be used inside @ref bt_mesh_model_pub.update.
696 : *
697 : * @param pub Model publication context.
698 : *
699 : * @return message number starting from 1.
700 : */
701 1 : #define BT_MESH_PUB_MSG_NUM(pub) (BT_MESH_PUB_TRANSMIT_COUNT((pub)->retransmit) + 1 - (pub)->count)
702 :
703 : /** Model publication context.
704 : *
705 : * The context should primarily be created using the
706 : * BT_MESH_MODEL_PUB_DEFINE macro.
707 : */
708 1 : struct bt_mesh_model_pub {
709 : /** The model the context belongs to. Initialized by the stack. */
710 1 : const struct bt_mesh_model *mod;
711 :
712 1 : uint16_t addr; /**< Publish Address. */
713 1 : const uint8_t *uuid; /**< Label UUID if Publish Address is Virtual Address. */
714 1 : uint16_t key:12, /**< Publish AppKey Index. */
715 1 : cred:1, /**< Friendship Credentials Flag. */
716 1 : send_rel:1, /**< Force reliable sending (segment acks) */
717 1 : fast_period:1, /**< Use FastPeriodDivisor */
718 1 : retr_update:1; /**< Call update callback on every retransmission. */
719 :
720 1 : uint8_t ttl; /**< Publish Time to Live. */
721 1 : uint8_t retransmit; /**< Retransmit Count & Interval Steps. */
722 1 : uint8_t period; /**< Publish Period. */
723 1 : uint8_t period_div:4, /**< Divisor for the Period. */
724 1 : count:4; /**< Transmissions left. */
725 :
726 1 : uint8_t delayable:1; /**< Use random delay for publishing. */
727 :
728 1 : uint32_t period_start; /**< Start of the current period. */
729 :
730 : /** @brief Publication buffer, containing the publication message.
731 : *
732 : * This will get correctly created when the publication context
733 : * has been defined using the BT_MESH_MODEL_PUB_DEFINE macro.
734 : *
735 : * BT_MESH_MODEL_PUB_DEFINE(name, update, size);
736 : */
737 1 : struct net_buf_simple *msg;
738 :
739 : /** @brief Callback for updating the publication buffer.
740 : *
741 : * When set to NULL, the model is assumed not to support
742 : * periodic publishing. When set to non-NULL the callback
743 : * will be called periodically and is expected to update
744 : * @ref bt_mesh_model_pub.msg with a valid publication
745 : * message.
746 : *
747 : * If the callback returns non-zero, the publication is skipped
748 : * and will resume on the next periodic publishing interval.
749 : *
750 : * When @ref bt_mesh_model_pub.retr_update is set to 1,
751 : * the callback will be called on every retransmission.
752 : *
753 : * @param mod The Model the Publication Context belongs to.
754 : *
755 : * @return Zero on success or (negative) error code otherwise.
756 : */
757 1 : int (*update)(const struct bt_mesh_model *mod);
758 :
759 : /** Publish Period Timer. Only for stack-internal use. */
760 1 : struct k_work_delayable timer;
761 : };
762 :
763 : /**
764 : * Define a model publication context.
765 : *
766 : * @param _name Variable name given to the context.
767 : * @param _update Optional message update callback (may be NULL).
768 : * @param _msg_len Length of the publication message.
769 : */
770 1 : #define BT_MESH_MODEL_PUB_DEFINE(_name, _update, _msg_len) \
771 : NET_BUF_SIMPLE_DEFINE_STATIC(bt_mesh_pub_msg_##_name, _msg_len); \
772 : static struct bt_mesh_model_pub _name = { \
773 : .msg = &bt_mesh_pub_msg_##_name, \
774 : .update = _update, \
775 : }
776 :
777 : /** Models Metadata Entry struct
778 : *
779 : * The struct should primarily be created using the
780 : * BT_MESH_MODELS_METADATA_ENTRY macro.
781 : */
782 1 : struct bt_mesh_models_metadata_entry {
783 : /* Length of the metadata */
784 0 : const uint16_t len;
785 :
786 : /* ID of the metadata */
787 0 : const uint16_t id;
788 :
789 : /* Pointer to raw data */
790 0 : const void * const data;
791 : };
792 :
793 : /**
794 : *
795 : * Initialize a Models Metadata entry structure in a list.
796 : *
797 : * @param _len Length of the metadata entry.
798 : * @param _id ID of the Models Metadata entry.
799 : * @param _data Pointer to a contiguous memory that contains the metadata.
800 : */
801 1 : #define BT_MESH_MODELS_METADATA_ENTRY(_len, _id, _data) \
802 : { \
803 : .len = (_len), .id = _id, .data = _data, \
804 : }
805 :
806 : /** Helper to define an empty Models metadata array */
807 1 : #define BT_MESH_MODELS_METADATA_NONE NULL
808 :
809 : /** End of the Models Metadata list. Must always be present. */
810 1 : #define BT_MESH_MODELS_METADATA_END { 0, 0, NULL }
811 :
812 : /** Model callback functions. */
813 1 : struct bt_mesh_model_cb {
814 : /** @brief Set value handler of user data tied to the model.
815 : *
816 : * @sa settings_handler::h_set
817 : *
818 : * @param model Model to set the persistent data of.
819 : * @param name Name/key of the settings item.
820 : * @param len_rd The size of the data found in the backend.
821 : * @param read_cb Function provided to read the data from the backend.
822 : * @param cb_arg Arguments for the read function provided by the
823 : * backend.
824 : *
825 : * @return 0 on success, error otherwise.
826 : */
827 1 : int (*const settings_set)(const struct bt_mesh_model *model,
828 : const char *name, size_t len_rd,
829 : settings_read_cb read_cb, void *cb_arg);
830 :
831 : /** @brief Callback called when the mesh is started.
832 : *
833 : * This handler gets called after the node has been provisioned, or
834 : * after all mesh data has been loaded from persistent storage.
835 : *
836 : * When this callback fires, the mesh model may start its behavior,
837 : * and all Access APIs are ready for use.
838 : *
839 : * @param model Model this callback belongs to.
840 : *
841 : * @return 0 on success, error otherwise.
842 : */
843 1 : int (*const start)(const struct bt_mesh_model *model);
844 :
845 : /** @brief Model init callback.
846 : *
847 : * Called on every model instance during mesh initialization.
848 : *
849 : * If any of the model init callbacks return an error, the Mesh
850 : * subsystem initialization will be aborted, and the error will be
851 : * returned to the caller of @ref bt_mesh_init.
852 : *
853 : * @param model Model to be initialized.
854 : *
855 : * @return 0 on success, error otherwise.
856 : */
857 1 : int (*const init)(const struct bt_mesh_model *model);
858 :
859 : /** @brief Model reset callback.
860 : *
861 : * Called when the mesh node is reset. All model data is deleted on
862 : * reset, and the model should clear its state.
863 : *
864 : * @note If the model stores any persistent data, this needs to be
865 : * erased manually.
866 : *
867 : * @param model Model this callback belongs to.
868 : */
869 1 : void (*const reset)(const struct bt_mesh_model *model);
870 :
871 : /** @brief Callback used to store pending model's user data.
872 : *
873 : * Triggered by @ref bt_mesh_model_data_store_schedule.
874 : *
875 : * To store the user data, call @ref bt_mesh_model_data_store.
876 : *
877 : * @param model Model this callback belongs to.
878 : */
879 1 : void (*const pending_store)(const struct bt_mesh_model *model);
880 : };
881 :
882 : /** Vendor model ID */
883 1 : struct bt_mesh_mod_id_vnd {
884 : /** Vendor's company ID */
885 1 : uint16_t company;
886 : /** Model ID */
887 1 : uint16_t id;
888 : };
889 :
890 : /** Abstraction that describes a Mesh Model instance */
891 1 : struct bt_mesh_model {
892 : union {
893 : /** SIG model ID */
894 1 : const uint16_t id;
895 : /** Vendor model ID */
896 1 : const struct bt_mesh_mod_id_vnd vnd;
897 0 : };
898 :
899 : /* Model runtime information */
900 0 : struct bt_mesh_model_rt_ctx {
901 0 : uint8_t elem_idx; /* Belongs to Nth element */
902 0 : uint8_t mod_idx; /* Is the Nth model in the element */
903 0 : uint16_t flags; /* Model flags for internal bookkeeping */
904 :
905 : #ifdef CONFIG_BT_MESH_MODEL_EXTENSIONS
906 : /* Pointer to the next model in a model extension list. */
907 0 : const struct bt_mesh_model *next;
908 : #endif
909 : /** Model-specific user data */
910 1 : void *user_data;
911 0 : } * const rt;
912 :
913 : /** Model Publication */
914 1 : struct bt_mesh_model_pub * const pub;
915 :
916 : /** AppKey List */
917 1 : uint16_t * const keys;
918 0 : const uint16_t keys_cnt;
919 :
920 : /** Subscription List (group or virtual addresses) */
921 1 : uint16_t * const groups;
922 0 : const uint16_t groups_cnt;
923 :
924 : #if (CONFIG_BT_MESH_LABEL_COUNT > 0) || defined(__DOXYGEN__)
925 : /** List of Label UUIDs the model is subscribed to. */
926 1 : const uint8_t ** const uuids;
927 : #endif
928 :
929 : /** Opcode handler list */
930 1 : const struct bt_mesh_model_op * const op;
931 :
932 : /** Model callback structure. */
933 1 : const struct bt_mesh_model_cb * const cb;
934 :
935 : #if defined(CONFIG_BT_MESH_LARGE_COMP_DATA_SRV) || defined(__DOXYGEN__)
936 : /* Pointer to the array of model metadata entries. */
937 0 : const struct bt_mesh_models_metadata_entry * const metadata;
938 : #endif
939 : };
940 :
941 : /** Callback structure for monitoring model message sending */
942 1 : struct bt_mesh_send_cb {
943 : /** @brief Handler called at the start of the transmission.
944 : *
945 : * @param duration The duration of the full transmission.
946 : * @param err Error occurring during sending.
947 : * @param cb_data Callback data, as passed to the send API.
948 : */
949 1 : void (*start)(uint16_t duration, int err, void *cb_data);
950 : /** @brief Handler called at the end of the transmission.
951 : *
952 : * @param err Error occurring during sending.
953 : * @param cb_data Callback data, as passed to the send API.
954 : */
955 1 : void (*end)(int err, void *cb_data);
956 : };
957 :
958 :
959 : /** Special TTL value to request using configured default TTL */
960 1 : #define BT_MESH_TTL_DEFAULT 0xff
961 :
962 : /** Maximum allowed TTL value */
963 1 : #define BT_MESH_TTL_MAX 0x7f
964 :
965 : /** @brief Send an Access Layer message.
966 : *
967 : * @param model Mesh (client) Model that the message belongs to.
968 : * @param ctx Message context, includes keys, TTL, etc.
969 : * @param msg Access Layer payload (the actual message to be sent).
970 : * @param cb Optional "message sent" callback.
971 : * @param cb_data User data to be passed to the callback.
972 : *
973 : * @return 0 on success, or (negative) error code on failure.
974 : */
975 1 : int bt_mesh_model_send(const struct bt_mesh_model *model,
976 : struct bt_mesh_msg_ctx *ctx,
977 : struct net_buf_simple *msg,
978 : const struct bt_mesh_send_cb *cb,
979 : void *cb_data);
980 :
981 : /** @brief Send a model publication message.
982 : *
983 : * Before calling this function, the user needs to ensure that the model
984 : * publication message (@ref bt_mesh_model_pub.msg) contains a valid
985 : * message to be sent. Note that this API is only to be used for
986 : * non-period publishing. For periodic publishing the app only needs
987 : * to make sure that @ref bt_mesh_model_pub.msg contains a valid message
988 : * whenever the @ref bt_mesh_model_pub.update callback is called.
989 : *
990 : * @param model Mesh (client) Model that's publishing the message.
991 : *
992 : * @return 0 on success, or (negative) error code on failure.
993 : */
994 1 : int bt_mesh_model_publish(const struct bt_mesh_model *model);
995 :
996 : /** @brief Check if a message is being retransmitted.
997 : *
998 : * Meant to be used inside the @ref bt_mesh_model_pub.update callback.
999 : *
1000 : * @param model Mesh Model that supports publication.
1001 : *
1002 : * @return true if this is a retransmission, false if this is a first publication.
1003 : */
1004 1 : static inline bool bt_mesh_model_pub_is_retransmission(const struct bt_mesh_model *model)
1005 : {
1006 : return model->pub->count != BT_MESH_PUB_TRANSMIT_COUNT(model->pub->retransmit);
1007 : }
1008 :
1009 : /** @brief Get the element that a model belongs to.
1010 : *
1011 : * @param mod Mesh model.
1012 : *
1013 : * @return Pointer to the element that the given model belongs to.
1014 : */
1015 1 : const struct bt_mesh_elem *bt_mesh_model_elem(const struct bt_mesh_model *mod);
1016 :
1017 : /** @brief Find a SIG model.
1018 : *
1019 : * @param elem Element to search for the model in.
1020 : * @param id Model ID of the model.
1021 : *
1022 : * @return A pointer to the Mesh model matching the given parameters, or NULL
1023 : * if no SIG model with the given ID exists in the given element.
1024 : */
1025 1 : const struct bt_mesh_model *bt_mesh_model_find(const struct bt_mesh_elem *elem,
1026 : uint16_t id);
1027 :
1028 : /** @brief Find a vendor model.
1029 : *
1030 : * @param elem Element to search for the model in.
1031 : * @param company Company ID of the model.
1032 : * @param id Model ID of the model.
1033 : *
1034 : * @return A pointer to the Mesh model matching the given parameters, or NULL
1035 : * if no vendor model with the given ID exists in the given element.
1036 : */
1037 1 : const struct bt_mesh_model *bt_mesh_model_find_vnd(const struct bt_mesh_elem *elem,
1038 : uint16_t company, uint16_t id);
1039 :
1040 : /** @brief Get whether the model is in the primary element of the device.
1041 : *
1042 : * @param mod Mesh model.
1043 : *
1044 : * @return true if the model is on the primary element, false otherwise.
1045 : */
1046 1 : static inline bool bt_mesh_model_in_primary(const struct bt_mesh_model *mod)
1047 : {
1048 : return (mod->rt->elem_idx == 0);
1049 : }
1050 :
1051 : /** @brief Immediately store the model's user data in persistent storage.
1052 : *
1053 : * @param mod Mesh model.
1054 : * @param vnd This is a vendor model.
1055 : * @param name Name/key of the settings item. Only
1056 : * @ref SETTINGS_MAX_DIR_DEPTH bytes will be used at most.
1057 : * @param data Model data to store, or NULL to delete any model data.
1058 : * @param data_len Length of the model data.
1059 : *
1060 : * @return 0 on success, or (negative) error code on failure.
1061 : */
1062 1 : int bt_mesh_model_data_store(const struct bt_mesh_model *mod, bool vnd,
1063 : const char *name, const void *data,
1064 : size_t data_len);
1065 :
1066 : /** @brief Schedule the model's user data store in persistent storage.
1067 : *
1068 : * This function triggers the @ref bt_mesh_model_cb.pending_store callback
1069 : * for the corresponding model after delay defined by
1070 : * @kconfig{CONFIG_BT_MESH_STORE_TIMEOUT}.
1071 : *
1072 : * The delay is global for all models. Once scheduled, the callback can
1073 : * not be re-scheduled until previous schedule completes.
1074 : *
1075 : * @param mod Mesh model.
1076 : */
1077 1 : void bt_mesh_model_data_store_schedule(const struct bt_mesh_model *mod);
1078 :
1079 : /** @brief Let a model extend another.
1080 : *
1081 : * Mesh models may be extended to reuse their functionality, forming a more
1082 : * complex model. A Mesh model may extend any number of models, in any element.
1083 : * The extensions may also be nested, ie a model that extends another may
1084 : * itself be extended.
1085 : *
1086 : * A set of models that extend each other form a model extension list.
1087 : *
1088 : * All models in an extension list share one subscription list per element. The
1089 : * access layer will utilize the combined subscription list of all models in an
1090 : * extension list and element, giving the models extended subscription list
1091 : * capacity.
1092 : *
1093 : * If @kconfig{CONFIG_BT_MESH_COMP_PAGE_1} is enabled, it is not allowed to call
1094 : * this function before the @ref bt_mesh_model_cb.init callback is called
1095 : * for both models, except if it is called as part of the final callback.
1096 : *
1097 : * @param extending_mod Mesh model that is extending the base model.
1098 : * @param base_mod The model being extended.
1099 : *
1100 : * @retval 0 Successfully extended the base_mod model.
1101 : */
1102 1 : int bt_mesh_model_extend(const struct bt_mesh_model *extending_mod,
1103 : const struct bt_mesh_model *base_mod);
1104 :
1105 : /** @brief Let a model correspond to another.
1106 : *
1107 : * Mesh models may correspond to each other, which means that if one is present,
1108 : * other must be present too. A Mesh model may correspond to any number of models,
1109 : * in any element. All models connected together via correspondence form single
1110 : * Correspondence Group, which has it's unique Correspondence ID. Information about
1111 : * Correspondence is used to construct Composition Data Page 1.
1112 : *
1113 : * This function must be called on already initialized base_mod. Because this function
1114 : * is designed to be called in corresponding_mod initializer, this means that base_mod
1115 : * shall be initialized before corresponding_mod is.
1116 : *
1117 : * @param corresponding_mod Mesh model that is corresponding to the base model.
1118 : * @param base_mod The model being corresponded to.
1119 : *
1120 : * @retval 0 Successfully saved correspondence to the base_mod model.
1121 : * @retval -ENOMEM There is no more space to save this relation.
1122 : * @retval -ENOTSUP Composition Data Page 1 is not supported.
1123 : */
1124 :
1125 1 : int bt_mesh_model_correspond(const struct bt_mesh_model *corresponding_mod,
1126 : const struct bt_mesh_model *base_mod);
1127 :
1128 : /** @brief Check if model is extended by another model.
1129 : *
1130 : * @param model The model to check.
1131 : *
1132 : * @retval true If model is extended by another model, otherwise false
1133 : */
1134 1 : bool bt_mesh_model_is_extended(const struct bt_mesh_model *model);
1135 :
1136 : /** @brief Indicate that the composition data will change on next bootup.
1137 : *
1138 : * Tell the config server that the composition data is expected to change on
1139 : * the next bootup, and the current composition data should be backed up.
1140 : *
1141 : * @return Zero on success or (negative) error code otherwise.
1142 : */
1143 1 : int bt_mesh_comp_change_prepare(void);
1144 :
1145 : /** @brief Indicate that the metadata will change on next bootup.
1146 : *
1147 : * Tell the config server that the models metadata is expected to change on
1148 : * the next bootup, and the current models metadata should be backed up.
1149 : *
1150 : * @return Zero on success or (negative) error code otherwise.
1151 : */
1152 1 : int bt_mesh_models_metadata_change_prepare(void);
1153 :
1154 : /** Node Composition */
1155 1 : struct bt_mesh_comp {
1156 1 : uint16_t cid; /**< Company ID */
1157 1 : uint16_t pid; /**< Product ID */
1158 1 : uint16_t vid; /**< Version ID */
1159 :
1160 1 : size_t elem_count; /**< The number of elements in this device. */
1161 1 : const struct bt_mesh_elem *elem; /**< List of elements. */
1162 : };
1163 :
1164 : /** Composition data page 2 record. */
1165 1 : struct bt_mesh_comp2_record {
1166 : /** Mesh profile ID. */
1167 1 : uint16_t id;
1168 : /** Mesh Profile Version. */
1169 : struct {
1170 : /** Major version. */
1171 1 : uint8_t x;
1172 : /** Minor version. */
1173 1 : uint8_t y;
1174 : /** Z version. */
1175 1 : uint8_t z;
1176 1 : } version;
1177 : /** Element offset count. */
1178 1 : uint8_t elem_offset_cnt;
1179 : /** Element offset list. */
1180 1 : const uint8_t *elem_offset;
1181 : /** Length of additional data. */
1182 1 : uint16_t data_len;
1183 : /** Additional data. */
1184 1 : const void *data;
1185 : };
1186 :
1187 : /** Node Composition data page 2 */
1188 1 : struct bt_mesh_comp2 {
1189 : /** The number of Mesh Profile records on a device. */
1190 1 : size_t record_cnt;
1191 : /** List of records. */
1192 1 : const struct bt_mesh_comp2_record *record;
1193 : };
1194 :
1195 : /** @brief Register composition data page 2 of the device.
1196 : *
1197 : * Register Mesh Profiles information (Ref section 3.12 in
1198 : * Bluetooth SIG Assigned Numbers) for composition data
1199 : * page 2 of the device.
1200 : *
1201 : * @note There must be at least one record present in @c comp2
1202 : *
1203 : * @param comp2 Pointer to composition data page 2.
1204 : *
1205 : * @return Zero on success or (negative) error code otherwise.
1206 : */
1207 1 : int bt_mesh_comp2_register(const struct bt_mesh_comp2 *comp2);
1208 :
1209 : #ifdef __cplusplus
1210 : }
1211 : #endif
1212 :
1213 : /**
1214 : * @}
1215 : */
1216 :
1217 : #endif /* ZEPHYR_INCLUDE_BLUETOOTH_MESH_ACCESS_H_ */
|