summaryrefslogtreecommitdiff
path: root/mesh
diff options
context:
space:
mode:
authorMichaƂ Lowas-Rzechonek <michal.lowas-rzechonek@silvair.com>2019-07-04 14:33:36 +0200
committerBrian Gix <brian.gix@intel.com>2019-07-04 10:18:44 -0700
commit9dfc56d7d4e73da42b3f4c81728ec57f5ac1c4f9 (patch)
tree05cc5d324ddd019be87d21e0a43623973e0eecb2 /mesh
parente3c5b38f0943846d2322062d9d9140c32f0847b8 (diff)
downloadbluez-9dfc56d7d4e73da42b3f4c81728ec57f5ac1c4f9.tar.gz
mesh: Split APP_IDX_DEV into APP_IDX_DEV_LOCAL and APP_IDX_DEV_REMOTE
This is needed to distinguish incoming messages encrypted using a device key: if the key is local, the message can be forwarded to internal models. If the key is a known remote one, it will be forwarded to the application via DevKeyMessageReceived() API.
Diffstat (limited to 'mesh')
-rw-r--r--mesh/cfgmod-server.c15
-rw-r--r--mesh/model.c22
-rw-r--r--mesh/net.h8
3 files changed, 25 insertions, 20 deletions
diff --git a/mesh/cfgmod-server.c b/mesh/cfgmod-server.c
index bb78cead6..a19ddc72e 100644
--- a/mesh/cfgmod-server.c
+++ b/mesh/cfgmod-server.c
@@ -69,7 +69,8 @@ static void send_pub_status(struct mesh_node *node, uint16_t src, uint16_t dst,
n += 2;
}
- mesh_model_send(node, dst, src, APP_IDX_DEV, DEFAULT_TTL, msg, n);
+ mesh_model_send(node, dst, src, APP_IDX_DEV_LOCAL, DEFAULT_TTL,
+ msg, n);
}
static bool config_pub_get(struct mesh_node *node, uint16_t src, uint16_t dst,
@@ -254,7 +255,7 @@ static void send_sub_status(struct mesh_node *node, uint16_t src, uint16_t dst,
n += 2;
}
- mesh_model_send(node, dst, src, APP_IDX_DEV, DEFAULT_TTL, msg, n);
+ mesh_model_send(node, dst, src, APP_IDX_DEV_LOCAL, DEFAULT_TTL, msg, n);
}
static bool config_sub_get(struct mesh_node *node, uint16_t src, uint16_t dst,
@@ -312,7 +313,7 @@ static bool config_sub_get(struct mesh_node *node, uint16_t src, uint16_t dst,
*msg_status = (uint8_t) status;
- mesh_model_send(node, dst, src, APP_IDX_DEV, DEFAULT_TTL, msg, n);
+ mesh_model_send(node, dst, src, APP_IDX_DEV_LOCAL, DEFAULT_TTL, msg, n);
return true;
}
@@ -487,7 +488,7 @@ static void send_model_app_status(struct mesh_node *node, uint16_t src,
l_put_le16(id, msg + n);
n += 2;
- mesh_model_send(node, dst, src, APP_IDX_DEV, DEFAULT_TTL, msg, n);
+ mesh_model_send(node, dst, src, APP_IDX_DEV_LOCAL, DEFAULT_TTL, msg, n);
}
static void model_app_list(struct mesh_node *node, uint16_t src, uint16_t dst,
@@ -540,7 +541,7 @@ static void model_app_list(struct mesh_node *node, uint16_t src, uint16_t dst,
if (result >= 0) {
*status = result;
- mesh_model_send(node, dst, src, APP_IDX_DEV, DEFAULT_TTL,
+ mesh_model_send(node, dst, src, APP_IDX_DEV_LOCAL, DEFAULT_TTL,
msg, n);
}
@@ -758,7 +759,7 @@ static bool cfg_srv_pkt(uint16_t src, uint32_t dst,
uint16_t interval;
uint16_t n;
- if (idx != APP_IDX_DEV)
+ if (idx != APP_IDX_DEV_LOCAL)
return false;
if (mesh_model_opcode_get(pkt, size, &opcode, &n)) {
@@ -1259,7 +1260,7 @@ static bool cfg_srv_pkt(uint16_t src, uint32_t dst,
if (n) {
/* print_packet("App Tx", long_msg ? long_msg : msg, n); */
mesh_model_send(node, unicast, src,
- APP_IDX_DEV, DEFAULT_TTL,
+ APP_IDX_DEV_LOCAL, DEFAULT_TTL,
long_msg ? long_msg : msg, n);
}
l_free(long_msg);
diff --git a/mesh/model.c b/mesh/model.c
index b605d0148..d0b4498fc 100644
--- a/mesh/model.c
+++ b/mesh/model.c
@@ -304,7 +304,9 @@ static void forward_model(void *a, void *b)
bool result;
l_debug("model %8.8x with idx %3.3x", mod->id, fwd->idx);
- if (fwd->idx != APP_IDX_DEV && !has_binding(mod->bindings, fwd->idx))
+
+ if (fwd->idx != APP_IDX_DEV_LOCAL &&
+ !has_binding(mod->bindings, fwd->idx))
return;
dst = fwd->dst;
@@ -354,15 +356,15 @@ static int dev_packet_decrypt(struct mesh_node *node, const uint8_t *data,
uint16_t dst, uint8_t key_id, uint32_t seq,
uint32_t iv_idx, uint8_t *out)
{
- const uint8_t *dev_key;
+ const uint8_t *key;
- dev_key = node_get_device_key(node);
- if (!dev_key)
+ key = node_get_device_key(node);
+ if (!key)
return false;
if (mesh_crypto_payload_decrypt(NULL, 0, data, size, szmict, src,
- dst, key_id, seq, iv_idx, out, dev_key))
- return APP_IDX_DEV;
+ dst, key_id, seq, iv_idx, out, key))
+ return APP_IDX_DEV_LOCAL;
return -1;
}
@@ -940,7 +942,7 @@ bool mesh_model_send(struct mesh_node *node, uint16_t src, uint16_t target,
if (IS_UNASSIGNED(target))
return false;
- if (app_idx == APP_IDX_DEV) {
+ if (app_idx == APP_IDX_DEV_LOCAL) {
key = node_get_device_key(node);
if (!key)
return false;
@@ -1369,12 +1371,14 @@ struct mesh_model *mesh_model_setup(struct mesh_node *node, uint8_t ele_idx,
if (ele_idx != PRIMARY_ELE_IDX)
return NULL;
- l_queue_push_head(mod->bindings, L_UINT_TO_PTR(APP_IDX_DEV));
+ l_queue_push_head(mod->bindings,
+ L_UINT_TO_PTR(APP_IDX_DEV_LOCAL));
return mod;
}
if (db_mod->id == CONFIG_CLI_MODEL) {
- l_queue_push_head(mod->bindings, L_UINT_TO_PTR(APP_IDX_DEV));
+ l_queue_push_head(mod->bindings,
+ L_UINT_TO_PTR(APP_IDX_DEV_LOCAL));
return mod;
}
diff --git a/mesh/net.h b/mesh/net.h
index f19024766..8848e6df0 100644
--- a/mesh/net.h
+++ b/mesh/net.h
@@ -37,10 +37,10 @@ struct mesh_node;
#define SEQ_MASK 0xffffff
#define CREDFLAG_MASK 0x1000
-#define APP_IDX_MASK 0x0fff
-#define APP_IDX_DEV 0x7fff
-#define APP_IDX_ANY 0x8000
-#define APP_IDX_NET 0xffff
+
+#define APP_IDX_MASK 0x0fff
+#define APP_IDX_DEV_REMOTE 0x6fff
+#define APP_IDX_DEV_LOCAL 0x7fff
#define NET_IDX_INVALID 0xffff
#define NET_NID_INVALID 0xff