mirror of
https://github.com/zephyrproject-rtos/zephyr
synced 2025-09-04 07:41:56 +00:00
Adds the model extension concept to the access layer, as described in the Mesh Profile Specification, Section 2.3.6. Extensions are implemented as a tree, using two pointers in each model: The extends pointer points to the first extended model, and the next pointer points to the next sibling or (if the NEXT_IS_PARENT flag is set) the parent model in the tree, forming a cyclical "Left-child right-sibling" (LCRS) tree. The tree root can be obtained by calling bt_mesh_model_root_get(), and the extended models can be walked by calling bt_mesh_model_tree_walk(). According to the Mesh Profile Specification Section 4.2.3, all models in the same extension tree share one subscription list per element. This is implemented by walking the model's extension tree, and pooling the subscription lists of all models in the same element into one. If the config server adds a subscription to a model, it may be stored in any of the model tree's models' subscription lists. No two models in the same extension tree and element will have duplicate groups listed. This allows us to increase extended models' capacity for subscriptions significantly. Signed-off-by: Trond Einar Snekvik <Trond.Einar.Snekvik@nordicsemi.no>
62 lines
1.6 KiB
C
62 lines
1.6 KiB
C
/* Bluetooth Mesh */
|
|
|
|
/*
|
|
* Copyright (c) 2017 Intel Corporation
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
/* bt_mesh_model.flags */
|
|
enum {
|
|
BT_MESH_MOD_BIND_PENDING = BIT(0),
|
|
BT_MESH_MOD_SUB_PENDING = BIT(1),
|
|
BT_MESH_MOD_PUB_PENDING = BIT(2),
|
|
BT_MESH_MOD_DATA_PRESENT = BIT(3),
|
|
BT_MESH_MOD_NEXT_IS_PARENT = BIT(4),
|
|
};
|
|
|
|
/* Tree walk return codes */
|
|
enum bt_mesh_walk {
|
|
BT_MESH_WALK_STOP,
|
|
BT_MESH_WALK_CONTINUE,
|
|
};
|
|
|
|
void bt_mesh_elem_register(struct bt_mesh_elem *elem, u8_t count);
|
|
|
|
u8_t bt_mesh_elem_count(void);
|
|
|
|
/* Find local element based on unicast or group address */
|
|
struct bt_mesh_elem *bt_mesh_elem_find(u16_t addr);
|
|
|
|
struct bt_mesh_model *bt_mesh_model_root(struct bt_mesh_model *mod);
|
|
void bt_mesh_model_tree_walk(struct bt_mesh_model *root,
|
|
enum bt_mesh_walk (*cb)(struct bt_mesh_model *mod,
|
|
u32_t depth,
|
|
void *user_data),
|
|
void *user_data);
|
|
|
|
u16_t *bt_mesh_model_find_group(struct bt_mesh_model **mod, u16_t addr);
|
|
|
|
bool bt_mesh_fixed_group_match(u16_t addr);
|
|
|
|
void bt_mesh_model_foreach(void (*func)(struct bt_mesh_model *mod,
|
|
struct bt_mesh_elem *elem,
|
|
bool vnd, bool primary,
|
|
void *user_data),
|
|
void *user_data);
|
|
|
|
s32_t bt_mesh_model_pub_period_get(struct bt_mesh_model *mod);
|
|
|
|
void bt_mesh_comp_provision(u16_t addr);
|
|
void bt_mesh_comp_unprovision(void);
|
|
|
|
u16_t bt_mesh_primary_addr(void);
|
|
|
|
const struct bt_mesh_comp *bt_mesh_comp_get(void);
|
|
|
|
struct bt_mesh_model *bt_mesh_model_get(bool vnd, u8_t elem_idx, u8_t mod_idx);
|
|
|
|
void bt_mesh_model_recv(struct bt_mesh_net_rx *rx, struct net_buf_simple *buf);
|
|
|
|
int bt_mesh_comp_register(const struct bt_mesh_comp *comp);
|