mesh: Clean up handling of config net and app key messages
authorInga Stotland <inga.stotland@intel.com>
Fri, 7 Aug 2020 01:38:29 +0000 (18:38 -0700)
committerAbhay Agarwal <ay.agarwal@samsung.com>
Mon, 28 Dec 2020 06:20:04 +0000 (11:50 +0530)
This modification allows using a single point for sending out
the composed status messages by the Config Server.

Change-Id: If73686f788afbcbc0988faaa8631469474280c94
Signed-off-by: anuj.bhumiya <anuj.bhumiya@samsung.com>
mesh/cfgmod-server.c

index be4fddb..8db8021 100644 (file)
@@ -546,6 +546,81 @@ static void node_reset(void *user_data)
        node_remove(node);
 }
 
+static uint16_t cfg_appkey_msg(struct mesh_node *node, const uint8_t *pkt,
+                                                               int opcode)
+{
+       uint16_t n_idx, a_idx, n;
+       struct mesh_net *net = node_get_net(node);
+
+       n_idx = l_get_le16(pkt) & 0xfff;
+       if (n_idx > NET_IDX_MAX)
+               return 0;
+
+       a_idx = l_get_le16(pkt + 1) >> 4;
+       if (a_idx > APP_IDX_MAX)
+               return 0;
+
+       n = mesh_model_opcode_set(OP_APPKEY_STATUS, msg);
+
+       if (opcode == OP_APPKEY_ADD)
+               msg[n] = appkey_key_add(net, n_idx, a_idx, pkt + 3);
+       else if (opcode == OP_APPKEY_UPDATE)
+               msg[n] = appkey_key_update(net, n_idx, a_idx, pkt + 3);
+       else
+               msg[n] = appkey_key_delete(net, n_idx, a_idx);
+
+       l_debug("AppKey Command %s: Net_Idx %3.3x, App_Idx %3.3x",
+                       (msg[n] == MESH_STATUS_SUCCESS) ? "success" : "fail",
+                                                               n_idx, a_idx);
+
+       memcpy(msg + n + 1, &pkt[0], 3);
+
+       return n + 4;
+}
+
+static uint16_t cfg_netkey_msg(struct mesh_node *node, const uint8_t *pkt,
+                                                               int opcode)
+{
+       uint16_t n_idx, n;
+       struct mesh_net *net = node_get_net(node);
+
+       n_idx = l_get_le16(pkt);
+       if (n_idx > NET_IDX_MAX)
+               return 0;
+
+       n = mesh_model_opcode_set(OP_NETKEY_STATUS, msg);
+
+       if (opcode == OP_NETKEY_ADD)
+               msg[n] = mesh_net_add_key(net, n_idx, pkt + 2);
+       else if (opcode == OP_NETKEY_UPDATE)
+               msg[n] = mesh_net_update_key(net, n_idx, pkt + 2);
+       else
+               msg[n] = mesh_net_del_key(net, n_idx);
+
+       l_debug("NetKey Command %s: Net_Idx %3.3x",
+                       (msg[n] == MESH_STATUS_SUCCESS) ? "success" : "fail",
+                                                                       n_idx);
+
+       memcpy(msg + n + 1, &pkt[0], 2);
+
+       return n + 3;
+}
+
+static uint16_t cfg_get_appkeys_msg(struct mesh_node *node, const uint8_t *pkt)
+{
+       uint16_t n_idx, sz, n;
+
+       n_idx = l_get_le16(pkt);
+
+       n = mesh_model_opcode_set(OP_APPKEY_LIST, msg);
+       l_put_le16(n_idx, msg + n + 1);
+
+       msg[n] = appkey_list(node_get_net(node), n_idx, msg + n + 3,
+                                               MAX_MSG_LEN - (n + 3), &sz);
+
+       return n + 3 + sz;
+}
+
 static uint16_t get_composition(struct mesh_node *node, uint8_t page,
                                                                uint8_t *buf)
 {
@@ -584,7 +659,7 @@ static bool cfg_srv_pkt(uint16_t src, uint16_t dst, uint16_t app_idx,
        uint32_t opcode, tmp32;
        int b_res = MESH_STATUS_SUCCESS;
        struct mesh_net_heartbeat *hb;
-       uint16_t n_idx, a_idx;
+       uint16_t n_idx;
        uint8_t state, status;
        uint8_t phase;
        bool virt = false;
@@ -857,60 +932,19 @@ static bool cfg_srv_pkt(uint16_t src, uint16_t dst, uint16_t app_idx,
                if (size != 19)
                        return true;
 
-               n_idx = l_get_le16(pkt) & 0xfff;
-               a_idx = l_get_le16(pkt + 1) >> 4;
-
-               if (opcode == OP_APPKEY_ADD)
-                       b_res = appkey_key_add(net, n_idx, a_idx, pkt + 3);
-               else
-                       b_res = appkey_key_update(net, n_idx, a_idx,
-                                                               pkt + 3);
-
-               l_debug("Add/Update AppKey %s: Net_Idx %3.3x, App_Idx %3.3x",
-                       (b_res == MESH_STATUS_SUCCESS) ? "success" : "fail",
-                                                       n_idx, a_idx);
-
-
-               n = mesh_model_opcode_set(OP_APPKEY_STATUS, msg);
-
-               msg[n++] = b_res;
-               msg[n++] = pkt[0];
-               msg[n++] = pkt[1];
-               msg[n++] = pkt[2];
-               break;
-
+               /* Fall Through */
        case OP_APPKEY_DELETE:
-               if (size != 3)
+               if (opcode == OP_APPKEY_DELETE && size != 3)
                        return true;
 
-               n_idx = l_get_le16(pkt) & 0xfff;
-               a_idx = l_get_le16(pkt + 1) >> 4;
-               b_res = appkey_key_delete(net, n_idx, a_idx);
-               l_debug("Delete AppKey %s Net_Idx %3.3x to App_Idx %3.3x",
-                       (b_res == MESH_STATUS_SUCCESS) ? "success" : "fail",
-                                                       n_idx, a_idx);
-
-               n = mesh_model_opcode_set(OP_APPKEY_STATUS, msg);
-               msg[n++] = b_res;
-               msg[n++] = pkt[0];
-               msg[n++] = pkt[1];
-               msg[n++] = pkt[2];
+               n = cfg_appkey_msg(node, pkt, opcode);
                break;
 
        case OP_APPKEY_GET:
                if (size != 2)
                        return true;
 
-               n_idx = l_get_le16(pkt);
-
-               n = mesh_model_opcode_set(OP_APPKEY_LIST, msg);
-
-               status = appkey_list(net, n_idx, msg + n + 3,
-                                               MAX_MSG_LEN - n - 3, &size);
-
-               msg[n] = status;
-               l_put_le16(n_idx, msg + n + 1);
-               n += (size + 3);
+               n = cfg_get_appkeys_msg(node, pkt);
                break;
 
        case OP_NETKEY_ADD:
@@ -918,35 +952,12 @@ static bool cfg_srv_pkt(uint16_t src, uint16_t dst, uint16_t app_idx,
                if (size != 18)
                        return true;
 
-               n_idx = l_get_le16(pkt);
-
-               if (opcode == OP_NETKEY_ADD)
-                       b_res = mesh_net_add_key(net, n_idx, pkt + 2);
-               else
-                       b_res = mesh_net_update_key(net, n_idx, pkt + 2);
-
-               l_debug("NetKey Add/Update %s",
-                       (b_res == MESH_STATUS_SUCCESS) ? "success" : "fail");
-
-               n = mesh_model_opcode_set(OP_NETKEY_STATUS, msg);
-               msg[n++] = b_res;
-               l_put_le16(l_get_le16(pkt), msg + n);
-               n += 2;
-               break;
-
+               /* Fall Through */
        case OP_NETKEY_DELETE:
-               if (size != 2)
+               if (opcode == OP_NETKEY_DELETE && size != 2)
                        return true;
 
-               b_res = mesh_net_del_key(net, l_get_le16(pkt));
-
-               l_debug("NetKey delete %s",
-                       (b_res == MESH_STATUS_SUCCESS) ? "success" : "fail");
-
-               n = mesh_model_opcode_set(OP_NETKEY_STATUS, msg);
-               msg[n++] = b_res;
-               l_put_le16(l_get_le16(pkt), msg + n);
-               n += 2;
+               n = cfg_netkey_msg(node, pkt, opcode);
                break;
 
        case OP_NETKEY_GET: