diff options
author | Inga Stotland <inga.stotland@intel.com> | 2019-09-06 23:07:59 -0700 |
---|---|---|
committer | Brian Gix <brian.gix@intel.com> | 2019-09-08 07:14:30 -0700 |
commit | 7a5bccba5305729d32cf62aeb6be765fd9a7904f (patch) | |
tree | c499f0320ad6ff22d75f22774de1479a8fcc5ea9 /mesh/model.c | |
parent | f3cbe6609af9de3f2621329797e43539b940215c (diff) | |
download | bluez-7a5bccba5305729d32cf62aeb6be765fd9a7904f.tar.gz |
mesh: Handle messages sent to a fixed group address
This handles the case when an inbound message is addressed to
a fixed group, i.e., all-proxies, all-friends, all-relays and
all-nodes. The message is delivered to a primary element only,
and, with the exception of all-nodes case, if the corresponding
feature is enabled on the node.
Diffstat (limited to 'mesh/model.c')
-rw-r--r-- | mesh/model.c | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/mesh/model.c b/mesh/model.c index 8f3d67ecf..a06b684a5 100644 --- a/mesh/model.c +++ b/mesh/model.c @@ -311,7 +311,7 @@ static void forward_model(void *a, void *b) return; dst = fwd->dst; - if (dst == fwd->unicast || IS_ALL_NODES(dst)) + if (dst == fwd->unicast || IS_FIXED_GROUP_ADDRESS(dst)) fwd->has_dst = true; else if (fwd->virt) { virt = l_queue_find(mod->virtuals, simple_match, fwd->virt); @@ -886,8 +886,30 @@ bool mesh_model_rx(struct mesh_node *node, bool szmict, uint32_t seq0, if (!num_ele || IS_UNASSIGNED(addr)) goto done; + /* + * In case of fixed group addresses check if the + * corresponding mode is enabled. + */ + if (dst == PROXIES_ADDRESS && + (node_proxy_mode_get(node) != MESH_MODE_ENABLED)) + goto done; + + if (dst == FRIENDS_ADDRESS && + (node_friend_mode_get(node) != MESH_MODE_ENABLED)) + goto done; + + if (dst == RELAYS_ADDRESS) { + uint8_t cnt; + uint16_t interval; + + if (node_relay_mode_get(node, &cnt, &interval) != + MESH_MODE_ENABLED) + goto done; + } + is_subscription = !(IS_UNICAST(dst)); + for (i = 0; i < num_ele; i++) { struct l_queue *models; @@ -927,6 +949,14 @@ bool mesh_model_rx(struct mesh_node *node, bool szmict, uint32_t seq0, /* If the message was to unicast address, we are done */ if (!is_subscription && ele_idx == i) break; + + /* + * For the fixed group addresses, i.e., all-proxies, + * all-friends, all-relays, all-nodes, the message is delivered + * to a primary element only. + */ + if (IS_FIXED_GROUP_ADDRESS(dst)) + break; } done: |