tools/mesh: Implement model group subscription commands 40/223840/1
authorInga Stotland <inga.stotland@intel.com>
Sat, 18 Jan 2020 04:22:33 +0000 (20:22 -0800)
committerAbhay Agarwal <ay.agarwal@samsung.com>
Fri, 31 Jan 2020 10:23:50 +0000 (15:53 +0530)
This adds implementation for:
Config Model Subscription Delete
Config Model Subscription Delete All
Config Model Subscription Overwrite

and adds handling vendor model IDs for
Config Model Subscription Add
Config Model Subscription Get

Change-Id: I204cdb350b8212bcca8b729493ed78b6f6db81ea
Signed-off-by: Abhay Agarwal <ay.agarwal@samsung.com>
tools/mesh/cfgcli.c

index f9aaf13..cfa573d 100644 (file)
@@ -246,14 +246,15 @@ static uint32_t print_mod_id(uint8_t *data, bool vendor, const char *offset)
 
        if (!vendor) {
                mod_id = get_le16(data);
-               bt_shell_printf("%sModel Id\t%4.4x\n", offset, mod_id);
+               bt_shell_printf("%sModel ID\t%4.4x\n", offset, mod_id);
                mod_id = VENDOR_ID_MASK | mod_id;
        } else {
                mod_id = get_le16(data + 2);
-               bt_shell_printf("%sModel Id\t%4.4x %4.4x\n", offset,
+               bt_shell_printf("%sModel ID\t%4.4x %4.4x\n", offset,
                                                        get_le16(data), mod_id);
                mod_id = get_le16(data) << 16 | mod_id;
        }
+
        return mod_id;
 }
 
@@ -606,13 +607,29 @@ static bool msg_recvd(uint16_t src, uint16_t idx, uint8_t *data,
                                src, mesh_status_str(data[0]));
 
                bt_shell_printf("Element Addr\t%4.4x\n", get_le16(data + 1));
-               bt_shell_printf("Model ID\t%4.4x\n", get_le16(data + 3));
+               print_mod_id(data + 3, false, "");
 
                for (i = 5; i < len; i += 2)
                        bt_shell_printf("Subscr Addr\t%4.4x\n",
                                                        get_le16(data + i));
                break;
 
+       case OP_CONFIG_VEND_MODEL_SUB_LIST:
+               if (len < 7)
+                       return true;
+
+               bt_shell_printf("\nNode %4.4x Subscription List status %s\n",
+                               src, mesh_status_str(data[0]));
+
+               bt_shell_printf("Element Addr\t%4.4x\n", get_le16(data + 1));
+               print_mod_id(data + 3, true, "");
+
+               for (i = 7; i < len; i += 2)
+                       bt_shell_printf("Subscr Addr\t%4.4x\n",
+                                                       get_le16(data + i));
+               break;
+
+
        /* Per Mesh Profile 4.3.2.50 */
        case OP_MODEL_APP_LIST:
                if (len < 5)
@@ -1241,60 +1258,104 @@ static void cmd_pub_get(int argc, char *argv[])
        return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
-static void cmd_sub_add(int argc, char *argv[])
+static void subscription_cmd(int argc, char *argv[], uint32_t opcode)
 {
        uint16_t n;
        uint8_t msg[32];
        int parm_cnt;
 
-       n = mesh_opcode_set(OP_CONFIG_MODEL_SUB_ADD, msg);
+       n = mesh_opcode_set(opcode, msg);
 
        parm_cnt = read_input_parameters(argc, argv);
-       if (parm_cnt != 3) {
+       if (parm_cnt != 3 && parm_cnt != 4) {
                bt_shell_printf("Bad arguments: %s\n", argv[1]);
                return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
-       /* Per Mesh Profile 4.3.2.19 */
        /* Element Address */
        put_le16(parms[0], msg + n);
        n += 2;
        /* Subscription Address */
        put_le16(parms[1], msg + n);
        n += 2;
-       /* SIG Model ID */
-       put_le16(parms[2], msg + n);
-       n += 2;
 
-       if (!config_send(msg, n, OP_CONFIG_MODEL_SUB_ADD))
+       /* Model ID */
+       n += put_model_id(msg + n, &parms[2], parm_cnt == 4);
+
+       if (!config_send(msg, n, opcode))
                return bt_shell_noninteractive_quit(EXIT_FAILURE);
 
        return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
-static void cmd_sub_get(int argc, char *argv[])
+static void cmd_sub_add(int argc, char *argv[])
+{
+       subscription_cmd(argc, argv, OP_CONFIG_MODEL_SUB_ADD);
+}
+
+static void cmd_sub_del(int argc, char *argv[])
+{
+       subscription_cmd(argc, argv, OP_CONFIG_MODEL_SUB_DELETE);
+}
+
+static void cmd_sub_ovwrt(int argc, char *argv[])
+{
+       subscription_cmd(argc, argv, OP_CONFIG_MODEL_SUB_OVERWRITE);
+}
+
+static void cmd_sub_del_all(int argc, char *argv[])
 {
        uint16_t n;
        uint8_t msg[32];
        int parm_cnt;
 
-       n = mesh_opcode_set(OP_CONFIG_MODEL_SUB_GET, msg);
+       n = mesh_opcode_set(OP_CONFIG_MODEL_SUB_DELETE_ALL, msg);
 
        parm_cnt = read_input_parameters(argc, argv);
-       if (parm_cnt != 2) {
+       if (parm_cnt != 2 && parm_cnt != 3) {
                bt_shell_printf("Bad arguments: %s\n", argv[1]);
                return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
-       /* Per Mesh Profile 4.3.2.27 */
        /* Element Address */
        put_le16(parms[0], msg + n);
        n += 2;
+
        /* Model ID */
-       put_le16(parms[1], msg + n);
+       n += put_model_id(msg + n, &parms[1], parm_cnt == 3);
+
+       if (!config_send(msg, n, OP_CONFIG_MODEL_SUB_DELETE_ALL))
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
+}
+
+static void cmd_sub_get(int argc, char *argv[])
+{
+       uint16_t n;
+       uint8_t msg[32];
+       int parm_cnt;
+       bool vendor;
+       uint32_t opcode;
+
+       parm_cnt = read_input_parameters(argc, argv);
+       if (parm_cnt != 2 && parm_cnt != 3) {
+               bt_shell_printf("Bad arguments: %s\n", argv[1]);
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
+       }
+
+       vendor = (parm_cnt == 3);
+       opcode = !vendor ? OP_CONFIG_MODEL_SUB_GET :
+                                               OP_CONFIG_VEND_MODEL_SUB_GET;
+       n = mesh_opcode_set(opcode, msg);
+
+       /* Element Address */
+       put_le16(parms[0], msg + n);
        n += 2;
+       /* Model ID */
+       n += put_model_id(msg + n, &parms[1], vendor);
 
-       if (!config_send(msg, n, OP_CONFIG_MODEL_SUB_GET))
+       if (!config_send(msg, n, opcode))
                return bt_shell_noninteractive_quit(EXIT_FAILURE);
 
        return bt_shell_noninteractive_quit(EXIT_SUCCESS);
@@ -1564,9 +1625,15 @@ static const struct bt_shell_menu cfg_menu = {
                                "Set heartbeat subscribe"},
        {"hb-sub-get", NULL, cmd_hb_sub_get,
                                "Get heartbeat subscribe"},
-       {"sub-add", "<ele_addr> <sub_addr> <model_id>", cmd_sub_add,
+       {"sub-add", "<ele_addr> <sub_addr> <model_id> [vendor]", cmd_sub_add,
                                "Add subscription"},
-       {"sub-get", "<ele_addr> <model_id>", cmd_sub_get,
+       {"sub-del", "<ele_addr> <sub_addr> <model_id> [vendor]", cmd_sub_del,
+                               "Delete subscription"},
+       {"sub-wrt", "<ele_addr> <sub_addr> <model_id> [vendor]", cmd_sub_ovwrt,
+                               "Overwrite subscription"},
+       {"sub-del-all", "<ele_addr> <model_id> [vendor]", cmd_sub_del_all,
+                               "Delete subscription"},
+       {"sub-get", "<ele_addr> <model_id> [vendor]", cmd_sub_get,
                                "Get subscription"},
        {"node-reset", NULL, cmd_node_reset,
                                "Reset a node and remove it from network"},