btmgmt: Add command set-sysconfig
authorHoward Chung <howardchung@google.com>
Tue, 5 Jan 2021 03:12:56 +0000 (11:12 +0800)
committerAyush Garg <ayush.garg@samsung.com>
Fri, 11 Mar 2022 13:38:34 +0000 (19:08 +0530)
Add command set-sysconfig in btmgmt

Example usage:
[mgmt]# set-sysconfig -h
Parameters:
        -v <type:length:value>...
e.g.:
        set-sysconfig -v 001a:2:1234 001f:1:00
[mgmt]# set-sysconfig -v 8:2:abcd 1:02:0100 0016:2:0600

Signed-off-by: Anuj Jain <anuj01.jain@samsung.com>
Signed-off-by: Ayush Garg <ayush.garg@samsung.com>
tools/btmgmt.c

index 081d730..3cbdd9c 100755 (executable)
@@ -1797,6 +1797,113 @@ static void cmd_read_sysconfig(int argc, char **argv)
        }
 }
 
+static bool parse_mgmt_tlv(const char *input, uint16_t *type, uint8_t *length,
+                                                               uint8_t *value)
+{
+       int i, value_starting_pos;
+
+       if (sscanf(input, "%4hx:%1hhu:%n", type, length,
+                                               &value_starting_pos) < 2) {
+               return false;
+       }
+
+       input += value_starting_pos;
+
+       if (*length * 2 != strlen(input))
+               return false;
+
+       for (i = 0; i < *length; i++) {
+               if (sscanf(input + i * 2, "%2hhx", &value[i]) < 1)
+                       return false;
+       }
+
+       return true;
+}
+
+static void set_sysconfig_rsp(uint8_t status, uint16_t len, const void *param,
+                                                               void *user_data)
+{
+       if (status != MGMT_STATUS_SUCCESS) {
+               error("Could not set default system configuration with status "
+                               "0x%02x (%s)", status, mgmt_errstr(status));
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
+       }
+
+       print("Set default system configuration success");
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
+}
+
+static bool set_sysconfig(int argc, char **argv)
+{
+       struct mgmt_tlv_list *tlv_list = NULL;
+       int i;
+       uint16_t index, type;
+       uint8_t length;
+       uint8_t value[256] = {};
+       bool success = false;
+
+       index = mgmt_index;
+       if (index == MGMT_INDEX_NONE)
+               index = 0;
+
+       tlv_list = mgmt_tlv_list_new();
+       if (!tlv_list) {
+               error("tlv_list failed to init");
+               goto failed;
+       }
+
+       for (i = 0; i < argc; i++) {
+               if (!parse_mgmt_tlv(argv[i], &type, &length, value)) {
+                       error("failed to parse");
+                       goto failed;
+               }
+
+               if (!mgmt_tlv_add(tlv_list, type, length, value)) {
+                       error("failed to add");
+                       goto failed;
+               }
+       }
+
+       if (!mgmt_send_tlv(mgmt, MGMT_OP_SET_DEF_SYSTEM_CONFIG, index,
+                               tlv_list, set_sysconfig_rsp, NULL, NULL)) {
+               error("Failed to send \"Set Default System Configuration\""
+                                                               " command");
+               goto failed;
+       }
+
+       success = true;
+
+failed:
+       if (tlv_list)
+               mgmt_tlv_list_free(tlv_list);
+
+       return success;
+}
+
+static void set_sysconfig_usage(void)
+{
+       bt_shell_usage();
+       print("Parameters:\n\t-v <type:length:value>...\n"
+               "e.g.:\n\tset-sysconfig -v 001a:2:1234 001f:1:00");
+}
+
+static void cmd_set_sysconfig(int argc, char **argv)
+{
+       bool success = false;
+
+       if (strcasecmp(argv[1], "-v") == 0 && argc > 2) {
+               argc -= 2;
+               argv += 2;
+               success = set_sysconfig(argc, argv);
+       }
+
+       if (!success) {
+               set_sysconfig_usage();
+               bt_shell_noninteractive_quit(EXIT_FAILURE);
+       }
+}
+
 static void auto_power_enable_rsp(uint8_t status, uint16_t len,
                                        const void *param, void *user_data)
 {
@@ -5079,6 +5186,8 @@ static const struct bt_shell_menu main_menu = {
                cmd_exp_debug,          "Set debug feature"             },
        { "read-sysconfig",     NULL,
                cmd_read_sysconfig,     "Read System Configuration"     },
+       { "set-sysconfig",      "<-v|-h> [options...]",
+               cmd_set_sysconfig,      "Set System Configuration"      },
        {} },
 };