mesh: Split APP_IDX_DEV into APP_IDX_DEV_LOCAL and APP_IDX_DEV_REMOTE
authorMichał Lowas-Rzechonek <michal.lowas-rzechonek@silvair.com>
Thu, 4 Jul 2019 12:33:36 +0000 (14:33 +0200)
committerAnupam Roy <anupam.r@samsung.com>
Tue, 17 Dec 2019 15:21:10 +0000 (20:51 +0530)
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.

Change-Id: I4cd92b881b29e24d3579e6db22f866cb0b3a2fa9
Signed-off-by: Anupam Roy <anupam.r@samsung.com>
mesh/cfgmod-server.c
mesh/model.c
mesh/net.h

index bb78cea..a19ddc7 100644 (file)
@@ -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);
index b605d01..d0b4498 100644 (file)
@@ -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;
        }
 
index f190247..8848e6d 100644 (file)
@@ -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