@@ -1799,6 +1799,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]))
+ 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" },
{} },
};
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 Reviewed-by: apusaka@chromium.org --- Changes in v2: - Replace hard tabs with soft tabs in commit messages tools/btmgmt.c | 109 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+)