diff mbox series

[BlueZ,4/4] tools/mesh: Implement model group subscription commands

Message ID 20200118042233.15338-5-inga.stotland@intel.com
State New
Headers show
Series Add functionality to mesh-cfgclient tool | expand

Commit Message

Inga Stotland Jan. 18, 2020, 4:22 a.m. UTC
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
---
 tools/mesh/cfgcli.c | 105 ++++++++++++++++++++++++++++++++++++--------
 1 file changed, 86 insertions(+), 19 deletions(-)
diff mbox series

Patch

diff --git a/tools/mesh/cfgcli.c b/tools/mesh/cfgcli.c
index f9aaf137d..cfa573de3 100644
--- a/tools/mesh/cfgcli.c
+++ b/tools/mesh/cfgcli.c
@@ -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"},