| /* |
| * |
| * BlueZ - Bluetooth protocol stack for Linux |
| * |
| * Copyright (C) 2012 Intel Corporation. All rights reserved. |
| * |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation; either version 2 of the License, or |
| * (at your option) any later version. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
| * |
| */ |
| |
| #ifdef HAVE_CONFIG_H |
| #include <config.h> |
| #endif |
| |
| #include <stdlib.h> |
| #include <stdbool.h> |
| #include <sys/ioctl.h> |
| |
| #include <glib.h> |
| |
| #include "lib/bluetooth.h" |
| #include "lib/hci.h" |
| #include "lib/hci_lib.h" |
| #include "lib/mgmt.h" |
| |
| #include "monitor/bt.h" |
| #include "emulator/bthost.h" |
| #include "emulator/hciemu.h" |
| |
| #include "src/shared/util.h" |
| #include "src/shared/tester.h" |
| #include "src/shared/mgmt.h" |
| |
| struct test_data { |
| tester_data_func_t test_setup; |
| const void *test_data; |
| uint8_t expected_version; |
| uint16_t expected_manufacturer; |
| uint32_t expected_supported_settings; |
| uint32_t initial_settings; |
| struct mgmt *mgmt; |
| struct mgmt *mgmt_alt; |
| unsigned int mgmt_settings_id; |
| unsigned int mgmt_alt_settings_id; |
| unsigned int mgmt_alt_ev_id; |
| unsigned int mgmt_discov_ev_id; |
| uint8_t mgmt_version; |
| uint16_t mgmt_revision; |
| uint16_t mgmt_index; |
| struct hciemu *hciemu; |
| enum hciemu_type hciemu_type; |
| int unmet_conditions; |
| }; |
| |
| static void mgmt_debug(const char *str, void *user_data) |
| { |
| const char *prefix = user_data; |
| |
| tester_print("%s%s", prefix, str); |
| } |
| |
| static void read_version_callback(uint8_t status, uint16_t length, |
| const void *param, void *user_data) |
| { |
| struct test_data *data = tester_get_data(); |
| const struct mgmt_rp_read_version *rp = param; |
| |
| tester_print("Read Version callback"); |
| tester_print(" Status: %s (0x%02x)", mgmt_errstr(status), status); |
| |
| if (status || !param) { |
| tester_pre_setup_failed(); |
| return; |
| } |
| |
| data->mgmt_version = rp->version; |
| data->mgmt_revision = btohs(rp->revision); |
| |
| tester_print(" Version %u.%u", |
| data->mgmt_version, data->mgmt_revision); |
| } |
| |
| static void read_commands_callback(uint8_t status, uint16_t length, |
| const void *param, void *user_data) |
| { |
| tester_print("Read Commands callback"); |
| tester_print(" Status: %s (0x%02x)", mgmt_errstr(status), status); |
| |
| if (status || !param) { |
| tester_pre_setup_failed(); |
| return; |
| } |
| } |
| |
| static void read_info_callback(uint8_t status, uint16_t length, |
| const void *param, void *user_data) |
| { |
| struct test_data *data = tester_get_data(); |
| const struct mgmt_rp_read_info *rp = param; |
| char addr[18]; |
| uint16_t manufacturer; |
| uint32_t supported_settings, current_settings; |
| struct bthost *bthost; |
| |
| tester_print("Read Info callback"); |
| tester_print(" Status: %s (0x%02x)", mgmt_errstr(status), status); |
| |
| if (status || !param) { |
| tester_pre_setup_failed(); |
| return; |
| } |
| |
| ba2str(&rp->bdaddr, addr); |
| manufacturer = btohs(rp->manufacturer); |
| supported_settings = btohl(rp->supported_settings); |
| current_settings = btohl(rp->current_settings); |
| |
| tester_print(" Address: %s", addr); |
| tester_print(" Version: 0x%02x", rp->version); |
| tester_print(" Manufacturer: 0x%04x", manufacturer); |
| tester_print(" Supported settings: 0x%08x", supported_settings); |
| tester_print(" Current settings: 0x%08x", current_settings); |
| tester_print(" Class: 0x%02x%02x%02x", |
| rp->dev_class[2], rp->dev_class[1], rp->dev_class[0]); |
| tester_print(" Name: %s", rp->name); |
| tester_print(" Short name: %s", rp->short_name); |
| |
| if (strcmp(hciemu_get_address(data->hciemu), addr)) { |
| tester_pre_setup_failed(); |
| return; |
| } |
| |
| if (rp->version != data->expected_version) { |
| tester_pre_setup_failed(); |
| return; |
| } |
| |
| if (manufacturer != data->expected_manufacturer) { |
| tester_pre_setup_failed(); |
| return; |
| } |
| |
| if (supported_settings != data->expected_supported_settings) { |
| tester_pre_setup_failed(); |
| return; |
| } |
| |
| if (current_settings != data->initial_settings) { |
| tester_pre_setup_failed(); |
| return; |
| } |
| |
| if (rp->dev_class[0] != 0x00 || rp->dev_class[1] != 0x00 || |
| rp->dev_class[2] != 0x00) { |
| tester_pre_setup_failed(); |
| return; |
| } |
| |
| bthost = hciemu_client_get_host(data->hciemu); |
| bthost_notify_ready(bthost, tester_pre_setup_complete); |
| } |
| |
| static void index_added_callback(uint16_t index, uint16_t length, |
| const void *param, void *user_data) |
| { |
| struct test_data *data = tester_get_data(); |
| |
| tester_print("Index Added callback"); |
| tester_print(" Index: 0x%04x", index); |
| |
| data->mgmt_index = index; |
| |
| mgmt_send(data->mgmt, MGMT_OP_READ_INFO, data->mgmt_index, 0, NULL, |
| read_info_callback, NULL, NULL); |
| } |
| |
| static void index_removed_callback(uint16_t index, uint16_t length, |
| const void *param, void *user_data) |
| { |
| struct test_data *data = tester_get_data(); |
| |
| tester_print("Index Removed callback"); |
| tester_print(" Index: 0x%04x", index); |
| |
| if (index != data->mgmt_index) |
| return; |
| |
| mgmt_unregister_index(data->mgmt, data->mgmt_index); |
| mgmt_unregister_index(data->mgmt_alt, data->mgmt_index); |
| |
| mgmt_unref(data->mgmt); |
| data->mgmt = NULL; |
| |
| mgmt_unref(data->mgmt_alt); |
| data->mgmt_alt = NULL; |
| |
| tester_post_teardown_complete(); |
| } |
| |
| static void read_index_list_callback(uint8_t status, uint16_t length, |
| const void *param, void *user_data) |
| { |
| struct test_data *data = tester_get_data(); |
| |
| tester_print("Read Index List callback"); |
| tester_print(" Status: %s (0x%02x)", mgmt_errstr(status), status); |
| |
| if (status || !param) { |
| tester_pre_setup_failed(); |
| return; |
| } |
| |
| mgmt_register(data->mgmt, MGMT_EV_INDEX_ADDED, MGMT_INDEX_NONE, |
| index_added_callback, NULL, NULL); |
| |
| mgmt_register(data->mgmt, MGMT_EV_INDEX_REMOVED, MGMT_INDEX_NONE, |
| index_removed_callback, NULL, NULL); |
| |
| data->hciemu = hciemu_new(data->hciemu_type); |
| if (!data->hciemu) { |
| tester_warn("Failed to setup HCI emulation"); |
| tester_pre_setup_failed(); |
| } |
| } |
| |
| static void test_pre_setup(const void *test_data) |
| { |
| struct test_data *data = tester_get_data(); |
| |
| data->mgmt = mgmt_new_default(); |
| if (!data->mgmt) { |
| tester_warn("Failed to setup management interface"); |
| tester_pre_setup_failed(); |
| return; |
| } |
| |
| data->mgmt_alt = mgmt_new_default(); |
| if (!data->mgmt_alt) { |
| tester_warn("Failed to setup alternate management interface"); |
| tester_pre_setup_failed(); |
| |
| mgmt_unref(data->mgmt); |
| data->mgmt = NULL; |
| return; |
| } |
| |
| if (tester_use_debug()) { |
| mgmt_set_debug(data->mgmt, mgmt_debug, "mgmt: ", NULL); |
| mgmt_set_debug(data->mgmt_alt, mgmt_debug, "mgmt-alt: ", NULL); |
| } |
| |
| mgmt_send(data->mgmt, MGMT_OP_READ_VERSION, MGMT_INDEX_NONE, 0, NULL, |
| read_version_callback, NULL, NULL); |
| |
| mgmt_send(data->mgmt, MGMT_OP_READ_COMMANDS, MGMT_INDEX_NONE, 0, NULL, |
| read_commands_callback, NULL, NULL); |
| |
| mgmt_send(data->mgmt, MGMT_OP_READ_INDEX_LIST, MGMT_INDEX_NONE, 0, NULL, |
| read_index_list_callback, NULL, NULL); |
| } |
| |
| static void test_post_teardown(const void *test_data) |
| { |
| struct test_data *data = tester_get_data(); |
| |
| hciemu_unref(data->hciemu); |
| data->hciemu = NULL; |
| } |
| |
| static void test_add_condition(struct test_data *data) |
| { |
| data->unmet_conditions++; |
| |
| tester_print("Test condition added, total %d", data->unmet_conditions); |
| } |
| |
| static void test_condition_complete(struct test_data *data) |
| { |
| data->unmet_conditions--; |
| |
| tester_print("Test condition complete, %d left", |
| data->unmet_conditions); |
| |
| if (data->unmet_conditions > 0) |
| return; |
| |
| tester_test_passed(); |
| } |
| |
| #define test_bredrle_full(name, data, setup, func, timeout) \ |
| do { \ |
| struct test_data *user; \ |
| user = malloc(sizeof(struct test_data)); \ |
| if (!user) \ |
| break; \ |
| user->hciemu_type = HCIEMU_TYPE_BREDRLE; \ |
| user->test_setup = setup; \ |
| user->test_data = data; \ |
| user->expected_version = 0x08; \ |
| user->expected_manufacturer = 0x003f; \ |
| user->expected_supported_settings = 0x0000bfff; \ |
| user->initial_settings = 0x00000080; \ |
| user->unmet_conditions = 0; \ |
| tester_add_full(name, data, \ |
| test_pre_setup, test_setup, func, NULL, \ |
| test_post_teardown, timeout, user, free); \ |
| } while (0) |
| |
| #define test_bredrle(name, data, setup, func) \ |
| test_bredrle_full(name, data, setup, func, 2) |
| |
| #define test_bredr20(name, data, setup, func) \ |
| do { \ |
| struct test_data *user; \ |
| user = malloc(sizeof(struct test_data)); \ |
| if (!user) \ |
| break; \ |
| user->hciemu_type = HCIEMU_TYPE_LEGACY; \ |
| user->test_setup = setup; \ |
| user->test_data = data; \ |
| user->expected_version = 0x03; \ |
| user->expected_manufacturer = 0x003f; \ |
| user->expected_supported_settings = 0x000010bf; \ |
| user->initial_settings = 0x00000080; \ |
| user->unmet_conditions = 0; \ |
| tester_add_full(name, data, \ |
| test_pre_setup, test_setup, func, NULL, \ |
| test_post_teardown, 2, user, free); \ |
| } while (0) |
| |
| #define test_bredr(name, data, setup, func) \ |
| do { \ |
| struct test_data *user; \ |
| user = malloc(sizeof(struct test_data)); \ |
| if (!user) \ |
| break; \ |
| user->hciemu_type = HCIEMU_TYPE_BREDR; \ |
| user->test_setup = setup; \ |
| user->test_data = data; \ |
| user->expected_version = 0x05; \ |
| user->expected_manufacturer = 0x003f; \ |
| user->expected_supported_settings = 0x000011ff; \ |
| user->initial_settings = 0x00000080; \ |
| user->unmet_conditions = 0; \ |
| tester_add_full(name, data, \ |
| test_pre_setup, test_setup, func, NULL, \ |
| test_post_teardown, 2, user, free); \ |
| } while (0) |
| |
| #define test_le(name, data, setup, func) \ |
| do { \ |
| struct test_data *user; \ |
| user = malloc(sizeof(struct test_data)); \ |
| if (!user) \ |
| break; \ |
| user->hciemu_type = HCIEMU_TYPE_LE; \ |
| user->test_setup = setup; \ |
| user->test_data = data; \ |
| user->expected_version = 0x08; \ |
| user->expected_manufacturer = 0x003f; \ |
| user->expected_supported_settings = 0x0000be1b; \ |
| user->initial_settings = 0x00000200; \ |
| user->unmet_conditions = 0; \ |
| tester_add_full(name, data, \ |
| test_pre_setup, test_setup, func, NULL, \ |
| test_post_teardown, 2, user, free); \ |
| } while (0) |
| |
| static void controller_setup(const void *test_data) |
| { |
| tester_test_passed(); |
| } |
| |
| struct generic_data { |
| const uint16_t *setup_settings; |
| bool setup_nobredr; |
| bool setup_limited_discov; |
| uint16_t setup_expect_hci_command; |
| const void *setup_expect_hci_param; |
| uint8_t setup_expect_hci_len; |
| uint16_t setup_send_opcode; |
| const void *setup_send_param; |
| uint16_t setup_send_len; |
| bool send_index_none; |
| uint16_t send_opcode; |
| const void *send_param; |
| uint16_t send_len; |
| const void * (*send_func)(uint16_t *len); |
| uint8_t expect_status; |
| bool expect_ignore_param; |
| const void *expect_param; |
| uint16_t expect_len; |
| const void * (*expect_func)(uint16_t *len); |
| uint32_t expect_settings_set; |
| uint32_t expect_settings_unset; |
| uint16_t expect_alt_ev; |
| const void *expect_alt_ev_param; |
| bool (*verify_alt_ev_func)(const void *param, uint16_t length); |
| uint16_t expect_alt_ev_len; |
| uint16_t expect_hci_command; |
| const void *expect_hci_param; |
| uint8_t expect_hci_len; |
| const void * (*expect_hci_func)(uint8_t *len); |
| bool expect_pin; |
| uint8_t pin_len; |
| const void *pin; |
| uint8_t client_pin_len; |
| const void *client_pin; |
| bool client_enable_ssp; |
| uint8_t io_cap; |
| uint8_t client_io_cap; |
| uint8_t client_auth_req; |
| bool reject_confirm; |
| bool client_reject_confirm; |
| bool just_works; |
| bool client_enable_le; |
| bool client_enable_sc; |
| bool client_enable_adv; |
| bool expect_sc_key; |
| bool force_power_off; |
| bool addr_type_avail; |
| uint8_t addr_type; |
| bool set_adv; |
| const uint8_t *adv_data; |
| uint8_t adv_data_len; |
| }; |
| |
| static const char dummy_data[] = { 0x00 }; |
| |
| static const struct generic_data invalid_command_test = { |
| .send_opcode = 0xffff, |
| .expect_status = MGMT_STATUS_UNKNOWN_COMMAND, |
| }; |
| |
| static const struct generic_data read_version_success_test = { |
| .send_index_none = true, |
| .send_opcode = MGMT_OP_READ_VERSION, |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_len = 3, |
| }; |
| |
| static const struct generic_data read_version_invalid_param_test = { |
| .send_index_none = true, |
| .send_opcode = MGMT_OP_READ_VERSION, |
| .send_param = dummy_data, |
| .send_len = sizeof(dummy_data), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data read_version_invalid_index_test = { |
| .send_opcode = MGMT_OP_READ_VERSION, |
| .expect_status = MGMT_STATUS_INVALID_INDEX, |
| }; |
| |
| static const struct generic_data read_commands_invalid_param_test = { |
| .send_index_none = true, |
| .send_opcode = MGMT_OP_READ_COMMANDS, |
| .send_param = dummy_data, |
| .send_len = sizeof(dummy_data), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data read_commands_invalid_index_test = { |
| .send_opcode = MGMT_OP_READ_COMMANDS, |
| .expect_status = MGMT_STATUS_INVALID_INDEX, |
| }; |
| |
| static const struct generic_data read_index_list_invalid_param_test = { |
| .send_index_none = true, |
| .send_opcode = MGMT_OP_READ_INDEX_LIST, |
| .send_param = dummy_data, |
| .send_len = sizeof(dummy_data), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data read_index_list_invalid_index_test = { |
| .send_opcode = MGMT_OP_READ_INDEX_LIST, |
| .expect_status = MGMT_STATUS_INVALID_INDEX, |
| }; |
| |
| static const struct generic_data read_info_invalid_param_test = { |
| .send_opcode = MGMT_OP_READ_INFO, |
| .send_param = dummy_data, |
| .send_len = sizeof(dummy_data), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data read_info_invalid_index_test = { |
| .send_index_none = true, |
| .send_opcode = MGMT_OP_READ_INFO, |
| .expect_status = MGMT_STATUS_INVALID_INDEX, |
| }; |
| |
| static const struct generic_data read_unconf_index_list_invalid_param_test = { |
| .send_index_none = true, |
| .send_opcode = MGMT_OP_READ_UNCONF_INDEX_LIST, |
| .send_param = dummy_data, |
| .send_len = sizeof(dummy_data), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data read_unconf_index_list_invalid_index_test = { |
| .send_opcode = MGMT_OP_READ_UNCONF_INDEX_LIST, |
| .expect_status = MGMT_STATUS_INVALID_INDEX, |
| }; |
| |
| static const struct generic_data read_config_info_invalid_param_test = { |
| .send_opcode = MGMT_OP_READ_CONFIG_INFO, |
| .send_param = dummy_data, |
| .send_len = sizeof(dummy_data), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data read_config_info_invalid_index_test = { |
| .send_index_none = true, |
| .send_opcode = MGMT_OP_READ_CONFIG_INFO, |
| .expect_status = MGMT_STATUS_INVALID_INDEX, |
| }; |
| |
| static const struct generic_data read_ext_index_list_invalid_param_test = { |
| .send_index_none = true, |
| .send_opcode = MGMT_OP_READ_EXT_INDEX_LIST, |
| .send_param = dummy_data, |
| .send_len = sizeof(dummy_data), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data read_ext_index_list_invalid_index_test = { |
| .send_opcode = MGMT_OP_READ_EXT_INDEX_LIST, |
| .expect_status = MGMT_STATUS_INVALID_INDEX, |
| }; |
| |
| static const char set_powered_on_param[] = { 0x01 }; |
| static const char set_powered_invalid_param[] = { 0x02 }; |
| static const char set_powered_garbage_param[] = { 0x01, 0x00 }; |
| static const char set_powered_settings_param[] = { 0x81, 0x00, 0x00, 0x00 }; |
| |
| static const struct generic_data set_powered_on_success_test = { |
| .send_opcode = MGMT_OP_SET_POWERED, |
| .send_param = set_powered_on_param, |
| .send_len = sizeof(set_powered_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_powered_settings_param, |
| .expect_len = sizeof(set_powered_settings_param), |
| .expect_settings_set = MGMT_SETTING_POWERED, |
| }; |
| |
| static const struct generic_data set_powered_on_invalid_param_test_1 = { |
| .send_opcode = MGMT_OP_SET_POWERED, |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data set_powered_on_invalid_param_test_2 = { |
| .send_opcode = MGMT_OP_SET_POWERED, |
| .send_param = set_powered_invalid_param, |
| .send_len = sizeof(set_powered_invalid_param), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data set_powered_on_invalid_param_test_3 = { |
| .send_opcode = MGMT_OP_SET_POWERED, |
| .send_param = set_powered_garbage_param, |
| .send_len = sizeof(set_powered_garbage_param), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data set_powered_on_invalid_index_test = { |
| .send_index_none = true, |
| .send_opcode = MGMT_OP_SET_POWERED, |
| .send_param = set_powered_on_param, |
| .send_len = sizeof(set_powered_on_param), |
| .expect_status = MGMT_STATUS_INVALID_INDEX, |
| }; |
| |
| static uint16_t settings_powered_advertising_privacy[] = { |
| MGMT_OP_SET_PRIVACY, |
| MGMT_OP_SET_ADVERTISING, |
| MGMT_OP_SET_POWERED, 0 }; |
| |
| static const char set_adv_off_param[] = { 0x00 }; |
| |
| static const struct generic_data set_powered_on_privacy_adv_test = { |
| .setup_settings = settings_powered_advertising_privacy, |
| .send_opcode = MGMT_OP_SET_ADVERTISING, |
| .send_param = set_adv_off_param, |
| .send_len = sizeof(set_adv_off_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_ignore_param = true, |
| }; |
| |
| static const uint16_t settings_powered[] = { MGMT_OP_SET_POWERED, 0 }; |
| |
| static const char set_powered_off_param[] = { 0x00 }; |
| static const char set_powered_off_settings_param[] = { 0x80, 0x00, 0x00, 0x00 }; |
| static const char set_powered_off_class_of_dev[] = { 0x00, 0x00, 0x00 }; |
| |
| static const struct generic_data set_powered_off_success_test = { |
| .setup_settings = settings_powered, |
| .send_opcode = MGMT_OP_SET_POWERED, |
| .send_param = set_powered_off_param, |
| .send_len = sizeof(set_powered_off_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_powered_off_settings_param, |
| .expect_len = sizeof(set_powered_off_settings_param), |
| .expect_settings_unset = MGMT_SETTING_POWERED, |
| }; |
| |
| static const struct generic_data set_powered_off_class_test = { |
| .send_opcode = MGMT_OP_SET_POWERED, |
| .send_param = set_powered_off_param, |
| .send_len = sizeof(set_powered_off_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_powered_off_settings_param, |
| .expect_len = sizeof(set_powered_off_settings_param), |
| .expect_settings_unset = MGMT_SETTING_POWERED, |
| .expect_alt_ev = MGMT_EV_CLASS_OF_DEV_CHANGED, |
| .expect_alt_ev_param = set_powered_off_class_of_dev, |
| .expect_alt_ev_len = sizeof(set_powered_off_class_of_dev), |
| }; |
| |
| static const struct generic_data set_powered_off_invalid_param_test_1 = { |
| .setup_settings = settings_powered, |
| .send_opcode = MGMT_OP_SET_POWERED, |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data set_powered_off_invalid_param_test_2 = { |
| .setup_settings = settings_powered, |
| .send_opcode = MGMT_OP_SET_POWERED, |
| .send_param = set_powered_invalid_param, |
| .send_len = sizeof(set_powered_invalid_param), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data set_powered_off_invalid_param_test_3 = { |
| .setup_settings = settings_powered, |
| .send_opcode = MGMT_OP_SET_POWERED, |
| .send_param = set_powered_garbage_param, |
| .send_len = sizeof(set_powered_garbage_param), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const char set_connectable_on_param[] = { 0x01 }; |
| static const char set_connectable_invalid_param[] = { 0x02 }; |
| static const char set_connectable_garbage_param[] = { 0x01, 0x00 }; |
| static const char set_connectable_settings_param_1[] = { 0x82, 0x00, 0x00, 0x00 }; |
| static const char set_connectable_settings_param_2[] = { 0x83, 0x00, 0x00, 0x00 }; |
| static const char set_connectable_scan_enable_param[] = { 0x02 }; |
| |
| static const struct generic_data set_connectable_on_success_test_1 = { |
| .send_opcode = MGMT_OP_SET_CONNECTABLE, |
| .send_param = set_connectable_on_param, |
| .send_len = sizeof(set_connectable_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_connectable_settings_param_1, |
| .expect_len = sizeof(set_connectable_settings_param_1), |
| .expect_settings_set = MGMT_SETTING_CONNECTABLE, |
| }; |
| |
| static const struct generic_data set_connectable_on_success_test_2 = { |
| .setup_settings = settings_powered, |
| .send_opcode = MGMT_OP_SET_CONNECTABLE, |
| .send_param = set_connectable_on_param, |
| .send_len = sizeof(set_connectable_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_connectable_settings_param_2, |
| .expect_len = sizeof(set_connectable_settings_param_2), |
| .expect_settings_set = MGMT_SETTING_CONNECTABLE, |
| .expect_hci_command = BT_HCI_CMD_WRITE_SCAN_ENABLE, |
| .expect_hci_param = set_connectable_scan_enable_param, |
| .expect_hci_len = sizeof(set_connectable_scan_enable_param), |
| }; |
| |
| static const struct generic_data set_connectable_on_invalid_param_test_1 = { |
| .send_opcode = MGMT_OP_SET_CONNECTABLE, |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data set_connectable_on_invalid_param_test_2 = { |
| .send_opcode = MGMT_OP_SET_CONNECTABLE, |
| .send_param = set_connectable_invalid_param, |
| .send_len = sizeof(set_connectable_invalid_param), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data set_connectable_on_invalid_param_test_3 = { |
| .send_opcode = MGMT_OP_SET_CONNECTABLE, |
| .send_param = set_connectable_garbage_param, |
| .send_len = sizeof(set_connectable_garbage_param), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data set_connectable_on_invalid_index_test = { |
| .send_index_none = true, |
| .send_opcode = MGMT_OP_SET_CONNECTABLE, |
| .send_param = set_connectable_on_param, |
| .send_len = sizeof(set_connectable_on_param), |
| .expect_status = MGMT_STATUS_INVALID_INDEX, |
| }; |
| |
| static uint16_t settings_powered_advertising[] = { MGMT_OP_SET_ADVERTISING, |
| MGMT_OP_SET_POWERED, 0 }; |
| |
| static const char set_connectable_le_settings_param_1[] = { 0x02, 0x02, 0x00, 0x00 }; |
| static const char set_connectable_le_settings_param_2[] = { 0x03, 0x02, 0x00, 0x00 }; |
| static const char set_connectable_le_settings_param_3[] = { 0x03, 0x06, 0x00, 0x00 }; |
| |
| static const struct generic_data set_connectable_on_le_test_1 = { |
| .send_opcode = MGMT_OP_SET_CONNECTABLE, |
| .send_param = set_connectable_on_param, |
| .send_len = sizeof(set_connectable_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_connectable_le_settings_param_1, |
| .expect_len = sizeof(set_connectable_le_settings_param_1), |
| .expect_settings_set = MGMT_SETTING_CONNECTABLE, |
| }; |
| |
| static const struct generic_data set_connectable_on_le_test_2 = { |
| .setup_settings = settings_powered, |
| .send_opcode = MGMT_OP_SET_CONNECTABLE, |
| .send_param = set_connectable_on_param, |
| .send_len = sizeof(set_connectable_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_connectable_le_settings_param_2, |
| .expect_len = sizeof(set_connectable_le_settings_param_2), |
| .expect_settings_set = MGMT_SETTING_CONNECTABLE, |
| }; |
| |
| static uint8_t set_connectable_on_adv_param[] = { |
| 0x00, 0x08, /* min_interval */ |
| 0x00, 0x08, /* max_interval */ |
| 0x00, /* type */ |
| 0x00, /* own_addr_type */ |
| 0x00, /* direct_addr_type */ |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* direct_addr */ |
| 0x07, /* channel_map */ |
| 0x00, /* filter_policy */ |
| }; |
| |
| static const struct generic_data set_connectable_on_le_test_3 = { |
| .setup_settings = settings_powered_advertising, |
| .send_opcode = MGMT_OP_SET_CONNECTABLE, |
| .send_param = set_connectable_on_param, |
| .send_len = sizeof(set_connectable_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_connectable_le_settings_param_3, |
| .expect_len = sizeof(set_connectable_le_settings_param_3), |
| .expect_settings_set = MGMT_SETTING_CONNECTABLE, |
| .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_PARAMETERS, |
| .expect_hci_param = set_connectable_on_adv_param, |
| .expect_hci_len = sizeof(set_connectable_on_adv_param), |
| }; |
| |
| static const uint16_t settings_connectable[] = { MGMT_OP_SET_CONNECTABLE, 0 }; |
| static const uint16_t settings_powered_connectable[] = { |
| MGMT_OP_SET_CONNECTABLE, |
| MGMT_OP_SET_POWERED, 0 }; |
| static const uint16_t settings_powered_discoverable[] = { |
| MGMT_OP_SET_CONNECTABLE, |
| MGMT_OP_SET_DISCOVERABLE, |
| MGMT_OP_SET_POWERED, 0 }; |
| |
| static const char set_connectable_off_param[] = { 0x00 }; |
| static const char set_connectable_off_settings_1[] = { 0x80, 0x00, 0x00, 0x00 }; |
| static const char set_connectable_off_settings_2[] = { 0x81, 0x00, 0x00, 0x00 }; |
| static const char set_connectable_off_scan_enable_param[] = { 0x00 }; |
| |
| static const struct generic_data set_connectable_off_success_test_1 = { |
| .setup_settings = settings_connectable, |
| .send_opcode = MGMT_OP_SET_CONNECTABLE, |
| .send_param = set_connectable_off_param, |
| .send_len = sizeof(set_connectable_off_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_connectable_off_settings_1, |
| .expect_len = sizeof(set_connectable_off_settings_1), |
| .expect_settings_unset = MGMT_SETTING_CONNECTABLE, |
| }; |
| |
| static const struct generic_data set_connectable_off_success_test_2 = { |
| .setup_settings = settings_powered_connectable, |
| .send_opcode = MGMT_OP_SET_CONNECTABLE, |
| .send_param = set_connectable_off_param, |
| .send_len = sizeof(set_connectable_off_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_connectable_off_settings_2, |
| .expect_len = sizeof(set_connectable_off_settings_2), |
| .expect_settings_unset = MGMT_SETTING_CONNECTABLE, |
| .expect_hci_command = BT_HCI_CMD_WRITE_SCAN_ENABLE, |
| .expect_hci_param = set_connectable_off_scan_enable_param, |
| .expect_hci_len = sizeof(set_connectable_off_scan_enable_param), |
| }; |
| |
| static const struct generic_data set_connectable_off_success_test_3 = { |
| .setup_settings = settings_powered_discoverable, |
| .send_opcode = MGMT_OP_SET_CONNECTABLE, |
| .send_param = set_connectable_off_param, |
| .send_len = sizeof(set_connectable_off_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_connectable_off_settings_2, |
| .expect_len = sizeof(set_connectable_off_settings_2), |
| .expect_settings_unset = MGMT_SETTING_CONNECTABLE, |
| .expect_hci_command = BT_HCI_CMD_WRITE_SCAN_ENABLE, |
| .expect_hci_param = set_connectable_off_scan_enable_param, |
| .expect_hci_len = sizeof(set_connectable_off_scan_enable_param), |
| }; |
| |
| static const struct generic_data set_connectable_off_success_test_4 = { |
| .setup_settings = settings_powered_discoverable, |
| .send_opcode = MGMT_OP_SET_CONNECTABLE, |
| .send_param = set_connectable_off_param, |
| .send_len = sizeof(set_connectable_off_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_connectable_off_settings_2, |
| .expect_len = sizeof(set_connectable_off_settings_2), |
| .expect_settings_unset = MGMT_SETTING_CONNECTABLE, |
| .expect_hci_command = BT_HCI_CMD_WRITE_SCAN_ENABLE, |
| .expect_hci_param = set_connectable_scan_enable_param, |
| .expect_hci_len = sizeof(set_connectable_scan_enable_param), |
| }; |
| |
| static const char set_connectable_off_le_settings_1[] = { 0x00, 0x02, 0x00, 0x00 }; |
| static const char set_connectable_off_le_settings_2[] = { 0x01, 0x06, 0x00, 0x00 }; |
| |
| static uint16_t settings_le_connectable[] = { MGMT_OP_SET_LE, |
| MGMT_OP_SET_CONNECTABLE, 0 }; |
| |
| static const struct generic_data set_connectable_off_le_test_1 = { |
| .setup_settings = settings_le_connectable, |
| .send_opcode = MGMT_OP_SET_CONNECTABLE, |
| .send_param = set_connectable_off_param, |
| .send_len = sizeof(set_connectable_off_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_connectable_off_le_settings_1, |
| .expect_len = sizeof(set_connectable_off_le_settings_1), |
| .expect_settings_unset = MGMT_SETTING_CONNECTABLE, |
| }; |
| |
| static uint16_t settings_powered_le_connectable_advertising[] = { |
| MGMT_OP_SET_LE, |
| MGMT_OP_SET_CONNECTABLE, |
| MGMT_OP_SET_ADVERTISING, |
| MGMT_OP_SET_POWERED, 0 }; |
| |
| static uint8_t set_connectable_off_adv_param[] = { |
| 0x00, 0x08, /* min_interval */ |
| 0x00, 0x08, /* max_interval */ |
| 0x03, /* type */ |
| 0x01, /* own_addr_type */ |
| 0x00, /* direct_addr_type */ |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* direct_addr */ |
| 0x07, /* channel_map */ |
| 0x00, /* filter_policy */ |
| }; |
| |
| static const struct generic_data set_connectable_off_le_test_2 = { |
| .setup_settings = settings_powered_le_connectable_advertising, |
| .send_opcode = MGMT_OP_SET_CONNECTABLE, |
| .send_param = set_connectable_off_param, |
| .send_len = sizeof(set_connectable_off_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_connectable_off_le_settings_2, |
| .expect_len = sizeof(set_connectable_off_le_settings_2), |
| .expect_settings_unset = MGMT_SETTING_CONNECTABLE, |
| .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_PARAMETERS, |
| .expect_hci_param = set_connectable_off_adv_param, |
| .expect_hci_len = sizeof(set_connectable_off_adv_param), |
| }; |
| |
| static uint16_t settings_powered_le_discoverable[] = { |
| MGMT_OP_SET_LE, |
| MGMT_OP_SET_CONNECTABLE, |
| MGMT_OP_SET_POWERED, |
| MGMT_OP_SET_DISCOVERABLE, 0 }; |
| |
| static uint16_t settings_powered_le_discoverable_advertising[] = { |
| MGMT_OP_SET_LE, |
| MGMT_OP_SET_CONNECTABLE, |
| MGMT_OP_SET_ADVERTISING, |
| MGMT_OP_SET_POWERED, |
| MGMT_OP_SET_DISCOVERABLE, 0 }; |
| |
| static const struct generic_data set_connectable_off_le_test_3 = { |
| .setup_settings = settings_powered_le_discoverable_advertising, |
| .send_opcode = MGMT_OP_SET_CONNECTABLE, |
| .send_param = set_connectable_off_param, |
| .send_len = sizeof(set_connectable_off_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_connectable_off_le_settings_2, |
| .expect_len = sizeof(set_connectable_off_le_settings_2), |
| .expect_settings_unset = MGMT_SETTING_CONNECTABLE, |
| .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_PARAMETERS, |
| .expect_hci_param = set_connectable_off_adv_param, |
| .expect_hci_len = sizeof(set_connectable_off_adv_param), |
| }; |
| |
| static const struct generic_data set_connectable_off_le_test_4 = { |
| .setup_settings = settings_powered_le_discoverable_advertising, |
| .setup_limited_discov = true, |
| .send_opcode = MGMT_OP_SET_CONNECTABLE, |
| .send_param = set_connectable_off_param, |
| .send_len = sizeof(set_connectable_off_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_connectable_off_le_settings_2, |
| .expect_len = sizeof(set_connectable_off_le_settings_2), |
| .expect_settings_unset = MGMT_SETTING_CONNECTABLE, |
| .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_PARAMETERS, |
| .expect_hci_param = set_connectable_off_adv_param, |
| .expect_hci_len = sizeof(set_connectable_off_adv_param), |
| }; |
| |
| static const char set_fast_conn_on_param[] = { 0x01 }; |
| static const char set_fast_conn_on_settings_1[] = { 0x87, 0x00, 0x00, 0x00 }; |
| static const char set_fast_conn_on_settings_2[] = { 0x85, 0x00, 0x00, 0x00 }; |
| static const char set_fast_conn_on_settings_3[] = { 0x84, 0x00, 0x00, 0x00 }; |
| |
| static const struct generic_data set_fast_conn_on_success_test_1 = { |
| .setup_settings = settings_powered_connectable, |
| .send_opcode = MGMT_OP_SET_FAST_CONNECTABLE, |
| .send_param = set_fast_conn_on_param, |
| .send_len = sizeof(set_fast_conn_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_fast_conn_on_settings_1, |
| .expect_len = sizeof(set_fast_conn_on_settings_1), |
| .expect_settings_set = MGMT_SETTING_FAST_CONNECTABLE, |
| }; |
| |
| static const struct generic_data set_fast_conn_on_success_test_2 = { |
| .setup_settings = settings_powered, |
| .send_opcode = MGMT_OP_SET_FAST_CONNECTABLE, |
| .send_param = set_fast_conn_on_param, |
| .send_len = sizeof(set_fast_conn_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_fast_conn_on_settings_2, |
| .expect_len = sizeof(set_fast_conn_on_settings_2), |
| .expect_settings_set = MGMT_SETTING_FAST_CONNECTABLE, |
| }; |
| |
| static const struct generic_data set_fast_conn_on_success_test_3 = { |
| .send_opcode = MGMT_OP_SET_FAST_CONNECTABLE, |
| .send_param = set_fast_conn_on_param, |
| .send_len = sizeof(set_fast_conn_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_fast_conn_on_settings_3, |
| .expect_len = sizeof(set_fast_conn_on_settings_3), |
| .expect_settings_set = MGMT_SETTING_FAST_CONNECTABLE, |
| }; |
| |
| static const struct generic_data set_fast_conn_on_not_supported_test_1 = { |
| .setup_settings = settings_powered_connectable, |
| .send_opcode = MGMT_OP_SET_FAST_CONNECTABLE, |
| .send_param = set_fast_conn_on_param, |
| .send_len = sizeof(set_fast_conn_on_param), |
| .expect_status = MGMT_STATUS_NOT_SUPPORTED, |
| }; |
| |
| static const char set_fast_conn_nval_param[] = { 0xff }; |
| |
| static const struct generic_data set_fast_conn_nval_param_test_1 = { |
| .send_opcode = MGMT_OP_SET_FAST_CONNECTABLE, |
| .send_param = set_fast_conn_nval_param, |
| .send_len = sizeof(set_fast_conn_nval_param), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const char set_bondable_on_param[] = { 0x01 }; |
| static const char set_bondable_invalid_param[] = { 0x02 }; |
| static const char set_bondable_garbage_param[] = { 0x01, 0x00 }; |
| static const char set_bondable_settings_param[] = { 0x90, 0x00, 0x00, 0x00 }; |
| |
| static const struct generic_data set_bondable_on_success_test = { |
| .send_opcode = MGMT_OP_SET_BONDABLE, |
| .send_param = set_bondable_on_param, |
| .send_len = sizeof(set_bondable_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_bondable_settings_param, |
| .expect_len = sizeof(set_bondable_settings_param), |
| .expect_settings_set = MGMT_SETTING_BONDABLE, |
| }; |
| |
| static const struct generic_data set_bondable_on_invalid_param_test_1 = { |
| .send_opcode = MGMT_OP_SET_BONDABLE, |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data set_bondable_on_invalid_param_test_2 = { |
| .send_opcode = MGMT_OP_SET_BONDABLE, |
| .send_param = set_bondable_invalid_param, |
| .send_len = sizeof(set_bondable_invalid_param), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data set_bondable_on_invalid_param_test_3 = { |
| .send_opcode = MGMT_OP_SET_BONDABLE, |
| .send_param = set_bondable_garbage_param, |
| .send_len = sizeof(set_bondable_garbage_param), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data set_bondable_on_invalid_index_test = { |
| .send_index_none = true, |
| .send_opcode = MGMT_OP_SET_BONDABLE, |
| .send_param = set_bondable_on_param, |
| .send_len = sizeof(set_bondable_on_param), |
| .expect_status = MGMT_STATUS_INVALID_INDEX, |
| }; |
| |
| static const uint8_t set_discoverable_on_param[] = { 0x01, 0x00, 0x00 }; |
| static const uint8_t set_discoverable_timeout_param[] = { 0x01, 0x0a, 0x00 }; |
| static const uint8_t set_discoverable_invalid_param[] = { 0x02, 0x00, 0x00 }; |
| static const uint8_t set_discoverable_off_param[] = { 0x00, 0x00, 0x00 }; |
| static const uint8_t set_discoverable_offtimeout_param[] = { 0x00, 0x01, 0x00 }; |
| static const uint8_t set_discoverable_garbage_param[] = { 0x01, 0x00, 0x00, 0x00 }; |
| static const uint8_t set_discoverable_on_settings_param_1[] = { 0x8a, 0x00, 0x00, 0x00 }; |
| static const uint8_t set_discoverable_on_settings_param_2[] = { 0x8b, 0x00, 0x00, 0x00 }; |
| static const uint8_t set_discoverable_off_settings_param_1[] = { 0x82, 0x00, 0x00, 0x00 }; |
| static const uint8_t set_discoverable_off_settings_param_2[] = { 0x83, 0x00, 0x00, 0x00 }; |
| static const uint8_t set_discoverable_on_scan_enable_param[] = { 0x03 }; |
| static const uint8_t set_discoverable_off_scan_enable_param[] = { 0x02 }; |
| |
| static const struct generic_data set_discoverable_on_invalid_param_test_1 = { |
| .send_opcode = MGMT_OP_SET_DISCOVERABLE, |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data set_discoverable_on_invalid_param_test_2 = { |
| .send_opcode = MGMT_OP_SET_DISCOVERABLE, |
| .send_param = set_discoverable_invalid_param, |
| .send_len = sizeof(set_discoverable_invalid_param), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data set_discoverable_on_invalid_param_test_3 = { |
| .send_opcode = MGMT_OP_SET_DISCOVERABLE, |
| .send_param = set_discoverable_garbage_param, |
| .send_len = sizeof(set_discoverable_garbage_param), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data set_discoverable_on_invalid_param_test_4 = { |
| .send_opcode = MGMT_OP_SET_DISCOVERABLE, |
| .send_param = set_discoverable_offtimeout_param, |
| .send_len = sizeof(set_discoverable_offtimeout_param), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data set_discoverable_on_not_powered_test_1 = { |
| .send_opcode = MGMT_OP_SET_DISCOVERABLE, |
| .send_param = set_discoverable_timeout_param, |
| .send_len = sizeof(set_discoverable_timeout_param), |
| .expect_status = MGMT_STATUS_NOT_POWERED, |
| }; |
| |
| static const struct generic_data set_discoverable_on_not_powered_test_2 = { |
| .setup_settings = settings_connectable, |
| .send_opcode = MGMT_OP_SET_DISCOVERABLE, |
| .send_param = set_discoverable_timeout_param, |
| .send_len = sizeof(set_discoverable_timeout_param), |
| .expect_status = MGMT_STATUS_NOT_POWERED, |
| }; |
| |
| static const struct generic_data set_discoverable_on_rejected_test_1 = { |
| .setup_settings = settings_powered, |
| .send_opcode = MGMT_OP_SET_DISCOVERABLE, |
| .send_param = set_discoverable_on_param, |
| .send_len = sizeof(set_discoverable_on_param), |
| .expect_status = MGMT_STATUS_REJECTED, |
| }; |
| |
| static const struct generic_data set_discoverable_on_rejected_test_2 = { |
| .setup_settings = settings_powered, |
| .send_opcode = MGMT_OP_SET_DISCOVERABLE, |
| .send_param = set_discoverable_on_param, |
| .send_len = sizeof(set_discoverable_on_param), |
| .expect_status = MGMT_STATUS_REJECTED, |
| }; |
| |
| static const struct generic_data set_discoverable_on_rejected_test_3 = { |
| .setup_settings = settings_powered, |
| .send_opcode = MGMT_OP_SET_DISCOVERABLE, |
| .send_param = set_discoverable_timeout_param, |
| .send_len = sizeof(set_discoverable_timeout_param), |
| .expect_status = MGMT_STATUS_REJECTED, |
| }; |
| |
| static const struct generic_data set_discoverable_on_success_test_1 = { |
| .setup_settings = settings_connectable, |
| .send_opcode = MGMT_OP_SET_DISCOVERABLE, |
| .send_param = set_discoverable_on_param, |
| .send_len = sizeof(set_discoverable_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_discoverable_on_settings_param_1, |
| .expect_len = sizeof(set_discoverable_on_settings_param_1), |
| .expect_settings_set = MGMT_SETTING_DISCOVERABLE, |
| }; |
| |
| static const struct generic_data set_discoverable_on_success_test_2 = { |
| .setup_settings = settings_powered_connectable, |
| .send_opcode = MGMT_OP_SET_DISCOVERABLE, |
| .send_param = set_discoverable_on_param, |
| .send_len = sizeof(set_discoverable_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_discoverable_on_settings_param_2, |
| .expect_len = sizeof(set_discoverable_on_settings_param_2), |
| .expect_settings_set = MGMT_SETTING_DISCOVERABLE, |
| .expect_hci_command = BT_HCI_CMD_WRITE_SCAN_ENABLE, |
| .expect_hci_param = set_discoverable_on_scan_enable_param, |
| .expect_hci_len = sizeof(set_discoverable_on_scan_enable_param), |
| }; |
| |
| static uint8_t set_discov_on_le_param[] = { 0x0b, 0x06, 0x00, 0x00 }; |
| static uint8_t set_discov_adv_data[32] = { 0x06, 0x02, 0x01, 0x06, |
| 0x02, 0x0a, }; |
| |
| static const struct generic_data set_discov_on_le_success_1 = { |
| .setup_settings = settings_powered_le_connectable_advertising, |
| .send_opcode = MGMT_OP_SET_DISCOVERABLE, |
| .send_param = set_discoverable_on_param, |
| .send_len = sizeof(set_discoverable_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_discov_on_le_param, |
| .expect_len = sizeof(set_discov_on_le_param), |
| .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_DATA, |
| .expect_hci_param = set_discov_adv_data, |
| .expect_hci_len = sizeof(set_discov_adv_data), |
| }; |
| |
| static const struct generic_data set_discoverable_off_success_test_1 = { |
| .setup_settings = settings_connectable, |
| .send_opcode = MGMT_OP_SET_DISCOVERABLE, |
| .send_param = set_discoverable_off_param, |
| .send_len = sizeof(set_discoverable_off_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_discoverable_off_settings_param_1, |
| .expect_len = sizeof(set_discoverable_off_settings_param_1), |
| }; |
| |
| static const struct generic_data set_discoverable_off_success_test_2 = { |
| .setup_settings = settings_powered_discoverable, |
| .send_opcode = MGMT_OP_SET_DISCOVERABLE, |
| .send_param = set_discoverable_off_param, |
| .send_len = sizeof(set_discoverable_off_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_discoverable_off_settings_param_2, |
| .expect_len = sizeof(set_discoverable_off_settings_param_2), |
| .expect_hci_command = BT_HCI_CMD_WRITE_SCAN_ENABLE, |
| .expect_hci_param = set_discoverable_off_scan_enable_param, |
| .expect_hci_len = sizeof(set_discoverable_off_scan_enable_param), |
| }; |
| |
| static const uint8_t set_limited_discov_on_param[] = { 0x02, 0x01, 0x00 }; |
| |
| static const struct generic_data set_limited_discov_on_success_1 = { |
| .setup_settings = settings_powered_connectable, |
| .send_opcode = MGMT_OP_SET_DISCOVERABLE, |
| .send_param = set_limited_discov_on_param, |
| .send_len = sizeof(set_limited_discov_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_discoverable_on_settings_param_2, |
| .expect_len = sizeof(set_discoverable_on_settings_param_2), |
| .expect_hci_command = BT_HCI_CMD_WRITE_SCAN_ENABLE, |
| .expect_hci_param = set_discoverable_on_scan_enable_param, |
| .expect_hci_len = sizeof(set_discoverable_on_scan_enable_param), |
| }; |
| |
| static uint8_t write_current_iac_lap_limited[] = { 0x01, 0x00, 0x8b, 0x9e }; |
| |
| static const struct generic_data set_limited_discov_on_success_2 = { |
| .setup_settings = settings_powered_connectable, |
| .send_opcode = MGMT_OP_SET_DISCOVERABLE, |
| .send_param = set_limited_discov_on_param, |
| .send_len = sizeof(set_limited_discov_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_discoverable_on_settings_param_2, |
| .expect_len = sizeof(set_discoverable_on_settings_param_2), |
| .expect_hci_command = BT_HCI_CMD_WRITE_CURRENT_IAC_LAP, |
| .expect_hci_param = write_current_iac_lap_limited, |
| .expect_hci_len = sizeof(write_current_iac_lap_limited), |
| }; |
| |
| static uint8_t write_cod_limited[] = { 0x00, 0x20, 0x00 }; |
| |
| static const struct generic_data set_limited_discov_on_success_3 = { |
| .setup_settings = settings_powered_connectable, |
| .send_opcode = MGMT_OP_SET_DISCOVERABLE, |
| .send_param = set_limited_discov_on_param, |
| .send_len = sizeof(set_limited_discov_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_discoverable_on_settings_param_2, |
| .expect_len = sizeof(set_discoverable_on_settings_param_2), |
| .expect_hci_command = BT_HCI_CMD_WRITE_CLASS_OF_DEV, |
| .expect_hci_param = write_cod_limited, |
| .expect_hci_len = sizeof(write_cod_limited), |
| }; |
| |
| static uint8_t set_limited_discov_adv_data[32] = { 0x06, 0x02, 0x01, 0x05, |
| 0x02, 0x0a, }; |
| |
| static const struct generic_data set_limited_discov_on_le_success_1 = { |
| .setup_settings = settings_powered_le_connectable_advertising, |
| .send_opcode = MGMT_OP_SET_DISCOVERABLE, |
| .send_param = set_limited_discov_on_param, |
| .send_len = sizeof(set_limited_discov_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_discov_on_le_param, |
| .expect_len = sizeof(set_discov_on_le_param), |
| .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_DATA, |
| .expect_hci_param = set_limited_discov_adv_data, |
| .expect_hci_len = sizeof(set_limited_discov_adv_data), |
| }; |
| |
| static uint16_t settings_link_sec[] = { MGMT_OP_SET_LINK_SECURITY, 0 }; |
| |
| static const char set_link_sec_on_param[] = { 0x01 }; |
| static const char set_link_sec_invalid_param[] = { 0x02 }; |
| static const char set_link_sec_garbage_param[] = { 0x01, 0x00 }; |
| static const char set_link_sec_settings_param_1[] = { 0xa0, 0x00, 0x00, 0x00 }; |
| static const char set_link_sec_settings_param_2[] = { 0xa1, 0x00, 0x00, 0x00 }; |
| static const char set_link_sec_auth_enable_param[] = { 0x01 }; |
| |
| static const struct generic_data set_link_sec_on_success_test_1 = { |
| .send_opcode = MGMT_OP_SET_LINK_SECURITY, |
| .send_param = set_link_sec_on_param, |
| .send_len = sizeof(set_link_sec_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_link_sec_settings_param_1, |
| .expect_len = sizeof(set_link_sec_settings_param_1), |
| .expect_settings_set = MGMT_SETTING_LINK_SECURITY, |
| }; |
| |
| static const struct generic_data set_link_sec_on_success_test_2 = { |
| .setup_settings = settings_powered, |
| .send_opcode = MGMT_OP_SET_LINK_SECURITY, |
| .send_param = set_link_sec_on_param, |
| .send_len = sizeof(set_link_sec_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_link_sec_settings_param_2, |
| .expect_len = sizeof(set_link_sec_settings_param_2), |
| .expect_settings_set = MGMT_SETTING_LINK_SECURITY, |
| .expect_hci_command = BT_HCI_CMD_WRITE_AUTH_ENABLE, |
| .expect_hci_param = set_link_sec_auth_enable_param, |
| .expect_hci_len = sizeof(set_link_sec_auth_enable_param), |
| }; |
| |
| static const struct generic_data set_link_sec_on_success_test_3 = { |
| .setup_settings = settings_link_sec, |
| .send_opcode = MGMT_OP_SET_POWERED, |
| .send_param = set_powered_on_param, |
| .send_len = sizeof(set_powered_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_link_sec_settings_param_2, |
| .expect_len = sizeof(set_link_sec_settings_param_2), |
| .expect_settings_set = MGMT_SETTING_LINK_SECURITY, |
| .expect_hci_command = BT_HCI_CMD_WRITE_AUTH_ENABLE, |
| .expect_hci_param = set_link_sec_auth_enable_param, |
| .expect_hci_len = sizeof(set_link_sec_auth_enable_param), |
| }; |
| |
| static const struct generic_data set_link_sec_on_invalid_param_test_1 = { |
| .send_opcode = MGMT_OP_SET_LINK_SECURITY, |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data set_link_sec_on_invalid_param_test_2 = { |
| .send_opcode = MGMT_OP_SET_LINK_SECURITY, |
| .send_param = set_link_sec_invalid_param, |
| .send_len = sizeof(set_link_sec_invalid_param), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data set_link_sec_on_invalid_param_test_3 = { |
| .send_opcode = MGMT_OP_SET_LINK_SECURITY, |
| .send_param = set_link_sec_garbage_param, |
| .send_len = sizeof(set_link_sec_garbage_param), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data set_link_sec_on_invalid_index_test = { |
| .send_index_none = true, |
| .send_opcode = MGMT_OP_SET_LINK_SECURITY, |
| .send_param = set_link_sec_on_param, |
| .send_len = sizeof(set_link_sec_on_param), |
| .expect_status = MGMT_STATUS_INVALID_INDEX, |
| }; |
| |
| static const uint16_t settings_powered_link_sec[] = { |
| MGMT_OP_SET_LINK_SECURITY, |
| MGMT_OP_SET_POWERED, 0 }; |
| |
| static const char set_link_sec_off_param[] = { 0x00 }; |
| static const char set_link_sec_off_settings_1[] = { 0x80, 0x00, 0x00, 0x00 }; |
| static const char set_link_sec_off_settings_2[] = { 0x81, 0x00, 0x00, 0x00 }; |
| static const char set_link_sec_off_auth_enable_param[] = { 0x00 }; |
| |
| static const struct generic_data set_link_sec_off_success_test_1 = { |
| .setup_settings = settings_link_sec, |
| .send_opcode = MGMT_OP_SET_LINK_SECURITY, |
| .send_param = set_link_sec_off_param, |
| .send_len = sizeof(set_link_sec_off_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_link_sec_off_settings_1, |
| .expect_len = sizeof(set_link_sec_off_settings_1), |
| .expect_settings_unset = MGMT_SETTING_LINK_SECURITY, |
| }; |
| |
| static const struct generic_data set_link_sec_off_success_test_2 = { |
| .setup_settings = settings_powered_link_sec, |
| .send_opcode = MGMT_OP_SET_LINK_SECURITY, |
| .send_param = set_link_sec_off_param, |
| .send_len = sizeof(set_link_sec_off_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_link_sec_off_settings_2, |
| .expect_len = sizeof(set_link_sec_off_settings_2), |
| .expect_settings_unset = MGMT_SETTING_LINK_SECURITY, |
| .expect_hci_command = BT_HCI_CMD_WRITE_AUTH_ENABLE, |
| .expect_hci_param = set_link_sec_off_auth_enable_param, |
| .expect_hci_len = sizeof(set_link_sec_off_auth_enable_param), |
| }; |
| |
| static uint16_t settings_ssp[] = { MGMT_OP_SET_SSP, 0 }; |
| |
| static const char set_ssp_on_param[] = { 0x01 }; |
| static const char set_ssp_invalid_param[] = { 0x02 }; |
| static const char set_ssp_garbage_param[] = { 0x01, 0x00 }; |
| static const char set_ssp_settings_param_1[] = { 0xc0, 0x00, 0x00, 0x00 }; |
| static const char set_ssp_settings_param_2[] = { 0xc1, 0x00, 0x00, 0x00 }; |
| static const char set_ssp_on_write_ssp_mode_param[] = { 0x01 }; |
| |
| static const struct generic_data set_ssp_on_success_test_1 = { |
| .send_opcode = MGMT_OP_SET_SSP, |
| .send_param = set_ssp_on_param, |
| .send_len = sizeof(set_ssp_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_ssp_settings_param_1, |
| .expect_len = sizeof(set_ssp_settings_param_1), |
| .expect_settings_set = MGMT_SETTING_SSP, |
| }; |
| |
| static const struct generic_data set_ssp_on_success_test_2 = { |
| .setup_settings = settings_powered, |
| .send_opcode = MGMT_OP_SET_SSP, |
| .send_param = set_ssp_on_param, |
| .send_len = sizeof(set_ssp_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_ssp_settings_param_2, |
| .expect_len = sizeof(set_ssp_settings_param_2), |
| .expect_settings_set = MGMT_SETTING_SSP, |
| .expect_hci_command = BT_HCI_CMD_WRITE_SIMPLE_PAIRING_MODE, |
| .expect_hci_param = set_ssp_on_write_ssp_mode_param, |
| .expect_hci_len = sizeof(set_ssp_on_write_ssp_mode_param), |
| }; |
| |
| static const struct generic_data set_ssp_on_success_test_3 = { |
| .setup_settings = settings_ssp, |
| .send_opcode = MGMT_OP_SET_POWERED, |
| .send_param = set_powered_on_param, |
| .send_len = sizeof(set_powered_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_ssp_settings_param_2, |
| .expect_len = sizeof(set_ssp_settings_param_2), |
| .expect_settings_set = MGMT_SETTING_SSP, |
| .expect_hci_command = BT_HCI_CMD_WRITE_SIMPLE_PAIRING_MODE, |
| .expect_hci_param = set_ssp_on_write_ssp_mode_param, |
| .expect_hci_len = sizeof(set_ssp_on_write_ssp_mode_param), |
| }; |
| |
| static const struct generic_data set_ssp_on_invalid_param_test_1 = { |
| .send_opcode = MGMT_OP_SET_SSP, |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data set_ssp_on_invalid_param_test_2 = { |
| .send_opcode = MGMT_OP_SET_SSP, |
| .send_param = set_ssp_invalid_param, |
| .send_len = sizeof(set_ssp_invalid_param), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data set_ssp_on_invalid_param_test_3 = { |
| .send_opcode = MGMT_OP_SET_SSP, |
| .send_param = set_ssp_garbage_param, |
| .send_len = sizeof(set_ssp_garbage_param), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data set_ssp_on_invalid_index_test = { |
| .send_index_none = true, |
| .send_opcode = MGMT_OP_SET_SSP, |
| .send_param = set_ssp_on_param, |
| .send_len = sizeof(set_ssp_on_param), |
| .expect_status = MGMT_STATUS_INVALID_INDEX, |
| }; |
| |
| static uint16_t settings_powered_ssp[] = { MGMT_OP_SET_SSP, |
| MGMT_OP_SET_POWERED, 0 }; |
| |
| static uint16_t settings_powered_sc[] = { MGMT_OP_SET_SSP, |
| MGMT_OP_SET_SECURE_CONN, |
| MGMT_OP_SET_POWERED, 0 }; |
| |
| static const char set_sc_on_param[] = { 0x01 }; |
| static const char set_sc_only_on_param[] = { 0x02 }; |
| static const char set_sc_invalid_param[] = { 0x03 }; |
| static const char set_sc_garbage_param[] = { 0x01, 0x00 }; |
| static const char set_sc_settings_param_1[] = { 0xc0, 0x08, 0x00, 0x00 }; |
| static const char set_sc_settings_param_2[] = { 0xc1, 0x08, 0x00, 0x00 }; |
| static const char set_sc_on_write_sc_support_param[] = { 0x01 }; |
| |
| static const struct generic_data set_sc_on_success_test_1 = { |
| .setup_settings = settings_ssp, |
| .send_opcode = MGMT_OP_SET_SECURE_CONN, |
| .send_param = set_sc_on_param, |
| .send_len = sizeof(set_sc_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_sc_settings_param_1, |
| .expect_len = sizeof(set_sc_settings_param_1), |
| .expect_settings_set = MGMT_SETTING_SECURE_CONN, |
| }; |
| |
| static const struct generic_data set_sc_on_success_test_2 = { |
| .setup_settings = settings_powered_ssp, |
| .send_opcode = MGMT_OP_SET_SECURE_CONN, |
| .send_param = set_sc_on_param, |
| .send_len = sizeof(set_sc_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_sc_settings_param_2, |
| .expect_len = sizeof(set_sc_settings_param_2), |
| .expect_settings_set = MGMT_SETTING_SECURE_CONN, |
| .expect_hci_command = BT_HCI_CMD_WRITE_SECURE_CONN_SUPPORT, |
| .expect_hci_param = set_sc_on_write_sc_support_param, |
| .expect_hci_len = sizeof(set_sc_on_write_sc_support_param), |
| }; |
| |
| static const struct generic_data set_sc_on_invalid_param_test_1 = { |
| .setup_settings = settings_ssp, |
| .send_opcode = MGMT_OP_SET_SECURE_CONN, |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data set_sc_on_invalid_param_test_2 = { |
| .setup_settings = settings_ssp, |
| .send_opcode = MGMT_OP_SET_SECURE_CONN, |
| .send_param = set_sc_invalid_param, |
| .send_len = sizeof(set_sc_invalid_param), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data set_sc_on_invalid_param_test_3 = { |
| .setup_settings = settings_ssp, |
| .send_opcode = MGMT_OP_SET_SECURE_CONN, |
| .send_param = set_sc_garbage_param, |
| .send_len = sizeof(set_sc_garbage_param), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data set_sc_on_invalid_index_test = { |
| .setup_settings = settings_ssp, |
| .send_index_none = true, |
| .send_opcode = MGMT_OP_SET_SECURE_CONN, |
| .send_param = set_sc_on_param, |
| .send_len = sizeof(set_sc_on_param), |
| .expect_status = MGMT_STATUS_INVALID_INDEX, |
| }; |
| |
| static const struct generic_data set_sc_on_not_supported_test_1 = { |
| .setup_settings = settings_ssp, |
| .send_opcode = MGMT_OP_SET_SECURE_CONN, |
| .send_param = set_sc_on_param, |
| .send_len = sizeof(set_sc_on_param), |
| .expect_status = MGMT_STATUS_NOT_SUPPORTED, |
| }; |
| |
| static const struct generic_data set_sc_on_not_supported_test_2 = { |
| .setup_settings = settings_powered_ssp, |
| .send_opcode = MGMT_OP_SET_SECURE_CONN, |
| .send_param = set_sc_on_param, |
| .send_len = sizeof(set_sc_on_param), |
| .expect_status = MGMT_STATUS_NOT_SUPPORTED, |
| }; |
| |
| static const struct generic_data set_sc_only_on_success_test_1 = { |
| .setup_settings = settings_ssp, |
| .send_opcode = MGMT_OP_SET_SECURE_CONN, |
| .send_param = set_sc_only_on_param, |
| .send_len = sizeof(set_sc_only_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_sc_settings_param_1, |
| .expect_len = sizeof(set_sc_settings_param_1), |
| .expect_settings_set = MGMT_SETTING_SECURE_CONN, |
| }; |
| |
| static const struct generic_data set_sc_only_on_success_test_2 = { |
| .setup_settings = settings_powered_ssp, |
| .send_opcode = MGMT_OP_SET_SECURE_CONN, |
| .send_param = set_sc_only_on_param, |
| .send_len = sizeof(set_sc_only_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_sc_settings_param_2, |
| .expect_len = sizeof(set_sc_settings_param_2), |
| .expect_settings_set = MGMT_SETTING_SECURE_CONN, |
| .expect_hci_command = BT_HCI_CMD_WRITE_SECURE_CONN_SUPPORT, |
| .expect_hci_param = set_sc_on_write_sc_support_param, |
| .expect_hci_len = sizeof(set_sc_on_write_sc_support_param), |
| }; |
| |
| static const char set_hs_on_param[] = { 0x01 }; |
| static const char set_hs_invalid_param[] = { 0x02 }; |
| static const char set_hs_garbage_param[] = { 0x01, 0x00 }; |
| static const char set_hs_settings_param_1[] = { 0xc0, 0x01, 0x00, 0x00 }; |
| |
| static const struct generic_data set_hs_on_success_test = { |
| .setup_settings = settings_ssp, |
| .send_opcode = MGMT_OP_SET_HS, |
| .send_param = set_hs_on_param, |
| .send_len = sizeof(set_hs_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_hs_settings_param_1, |
| .expect_len = sizeof(set_hs_settings_param_1), |
| .expect_settings_set = MGMT_SETTING_HS, |
| }; |
| |
| static const struct generic_data set_hs_on_invalid_param_test_1 = { |
| .setup_settings = settings_ssp, |
| .send_opcode = MGMT_OP_SET_HS, |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data set_hs_on_invalid_param_test_2 = { |
| .setup_settings = settings_ssp, |
| .send_opcode = MGMT_OP_SET_HS, |
| .send_param = set_hs_invalid_param, |
| .send_len = sizeof(set_hs_invalid_param), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data set_hs_on_invalid_param_test_3 = { |
| .setup_settings = settings_ssp, |
| .send_opcode = MGMT_OP_SET_HS, |
| .send_param = set_hs_garbage_param, |
| .send_len = sizeof(set_hs_garbage_param), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data set_hs_on_invalid_index_test = { |
| .setup_settings = settings_ssp, |
| .send_index_none = true, |
| .send_opcode = MGMT_OP_SET_HS, |
| .send_param = set_hs_on_param, |
| .send_len = sizeof(set_hs_on_param), |
| .expect_status = MGMT_STATUS_INVALID_INDEX, |
| }; |
| |
| static uint16_t settings_le[] = { MGMT_OP_SET_LE, 0 }; |
| |
| static const char set_le_on_param[] = { 0x01 }; |
| static const char set_le_off_param[] = { 0x00 }; |
| static const char set_le_invalid_param[] = { 0x02 }; |
| static const char set_le_garbage_param[] = { 0x01, 0x00 }; |
| static const char set_le_settings_param_1[] = { 0x80, 0x02, 0x00, 0x00 }; |
| static const char set_le_settings_param_2[] = { 0x81, 0x02, 0x00, 0x00 }; |
| static const char set_le_on_write_le_host_param[] = { 0x01, 0x00 }; |
| |
| static const struct generic_data set_le_on_success_test_1 = { |
| .send_opcode = MGMT_OP_SET_LE, |
| .send_param = set_le_on_param, |
| .send_len = sizeof(set_le_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_le_settings_param_1, |
| .expect_len = sizeof(set_le_settings_param_1), |
| .expect_settings_set = MGMT_SETTING_LE, |
| }; |
| |
| static const struct generic_data set_le_on_success_test_2 = { |
| .setup_settings = settings_powered, |
| .send_opcode = MGMT_OP_SET_LE, |
| .send_param = set_le_on_param, |
| .send_len = sizeof(set_le_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_le_settings_param_2, |
| .expect_len = sizeof(set_le_settings_param_2), |
| .expect_settings_set = MGMT_SETTING_LE, |
| .expect_hci_command = BT_HCI_CMD_WRITE_LE_HOST_SUPPORTED, |
| .expect_hci_param = set_le_on_write_le_host_param, |
| .expect_hci_len = sizeof(set_le_on_write_le_host_param), |
| }; |
| |
| static const struct generic_data set_le_on_success_test_3 = { |
| .setup_settings = settings_le, |
| .send_opcode = MGMT_OP_SET_POWERED, |
| .send_param = set_powered_on_param, |
| .send_len = sizeof(set_powered_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_le_settings_param_2, |
| .expect_len = sizeof(set_le_settings_param_2), |
| .expect_settings_set = MGMT_SETTING_LE, |
| .expect_hci_command = BT_HCI_CMD_WRITE_LE_HOST_SUPPORTED, |
| .expect_hci_param = set_le_on_write_le_host_param, |
| .expect_hci_len = sizeof(set_le_on_write_le_host_param), |
| }; |
| |
| static const struct generic_data set_le_on_invalid_param_test_1 = { |
| .send_opcode = MGMT_OP_SET_LE, |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data set_le_on_invalid_param_test_2 = { |
| .send_opcode = MGMT_OP_SET_LE, |
| .send_param = set_le_invalid_param, |
| .send_len = sizeof(set_le_invalid_param), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data set_le_on_invalid_param_test_3 = { |
| .send_opcode = MGMT_OP_SET_LE, |
| .send_param = set_le_garbage_param, |
| .send_len = sizeof(set_le_garbage_param), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data set_le_on_invalid_index_test = { |
| .send_index_none = true, |
| .send_opcode = MGMT_OP_SET_LE, |
| .send_param = set_le_on_param, |
| .send_len = sizeof(set_le_on_param), |
| .expect_status = MGMT_STATUS_INVALID_INDEX, |
| }; |
| |
| static uint16_t settings_powered_le[] = { MGMT_OP_SET_LE, |
| MGMT_OP_SET_POWERED, 0 }; |
| |
| static const char set_adv_on_param[] = { 0x01 }; |
| static const char set_adv_settings_param_1[] = { 0x80, 0x06, 0x00, 0x00 }; |
| static const char set_adv_settings_param_2[] = { 0x81, 0x06, 0x00, 0x00 }; |
| static const char set_adv_on_set_adv_enable_param[] = { 0x01 }; |
| static const char set_adv_on_set_adv_disable_param[] = { 0x00 }; |
| |
| static const struct generic_data set_adv_on_success_test_1 = { |
| .setup_settings = settings_le, |
| .send_opcode = MGMT_OP_SET_ADVERTISING, |
| .send_param = set_adv_on_param, |
| .send_len = sizeof(set_adv_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_adv_settings_param_1, |
| .expect_len = sizeof(set_adv_settings_param_1), |
| .expect_settings_set = MGMT_SETTING_ADVERTISING, |
| }; |
| |
| static const struct generic_data set_adv_on_success_test_2 = { |
| .setup_settings = settings_powered_le, |
| .send_opcode = MGMT_OP_SET_ADVERTISING, |
| .send_param = set_adv_on_param, |
| .send_len = sizeof(set_adv_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_adv_settings_param_2, |
| .expect_len = sizeof(set_adv_settings_param_2), |
| .expect_settings_set = MGMT_SETTING_ADVERTISING, |
| .expect_hci_command = BT_HCI_CMD_LE_SET_ADV_ENABLE, |
| .expect_hci_param = set_adv_on_set_adv_enable_param, |
| .expect_hci_len = sizeof(set_adv_on_set_adv_enable_param), |
| }; |
| |
| static const struct generic_data set_adv_on_rejected_test_1 = { |
| .setup_settings = settings_powered, |
| .send_opcode = MGMT_OP_SET_ADVERTISING, |
| .send_param = set_adv_on_param, |
| .send_len = sizeof(set_adv_on_param), |
| .expect_status = MGMT_STATUS_REJECTED, |
| }; |
| |
| static const char set_bredr_off_param[] = { 0x00 }; |
| static const char set_bredr_on_param[] = { 0x01 }; |
| static const char set_bredr_invalid_param[] = { 0x02 }; |
| static const char set_bredr_settings_param_1[] = { 0x00, 0x02, 0x00, 0x00 }; |
| static const char set_bredr_settings_param_2[] = { 0x80, 0x02, 0x00, 0x00 }; |
| static const char set_bredr_settings_param_3[] = { 0x81, 0x02, 0x00, 0x00 }; |
| |
| static const struct generic_data set_bredr_off_success_test_1 = { |
| .setup_settings = settings_le, |
| .send_opcode = MGMT_OP_SET_BREDR, |
| .send_param = set_bredr_off_param, |
| .send_len = sizeof(set_bredr_off_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_bredr_settings_param_1, |
| .expect_len = sizeof(set_bredr_settings_param_1), |
| .expect_settings_unset = MGMT_SETTING_BREDR, |
| }; |
| |
| static const struct generic_data set_bredr_on_success_test_1 = { |
| .setup_settings = settings_le, |
| .setup_nobredr = true, |
| .send_opcode = MGMT_OP_SET_BREDR, |
| .send_param = set_bredr_on_param, |
| .send_len = sizeof(set_bredr_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_bredr_settings_param_2, |
| .expect_len = sizeof(set_bredr_settings_param_2), |
| .expect_settings_set = MGMT_SETTING_BREDR, |
| }; |
| |
| static const struct generic_data set_bredr_on_success_test_2 = { |
| .setup_settings = settings_powered_le, |
| .setup_nobredr = true, |
| .send_opcode = MGMT_OP_SET_BREDR, |
| .send_param = set_bredr_on_param, |
| .send_len = sizeof(set_bredr_on_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_bredr_settings_param_3, |
| .expect_len = sizeof(set_bredr_settings_param_3), |
| .expect_settings_set = MGMT_SETTING_BREDR, |
| }; |
| |
| static const struct generic_data set_bredr_off_notsupp_test = { |
| .send_opcode = MGMT_OP_SET_BREDR, |
| .send_param = set_bredr_off_param, |
| .send_len = sizeof(set_bredr_off_param), |
| .expect_status = MGMT_STATUS_NOT_SUPPORTED, |
| }; |
| |
| static const struct generic_data set_bredr_off_failure_test_1 = { |
| .setup_settings = settings_powered_le, |
| .send_opcode = MGMT_OP_SET_BREDR, |
| .send_param = set_bredr_off_param, |
| .send_len = sizeof(set_bredr_off_param), |
| .expect_status = MGMT_STATUS_REJECTED, |
| }; |
| |
| static const struct generic_data set_bredr_off_failure_test_2 = { |
| .setup_settings = settings_powered, |
| .send_opcode = MGMT_OP_SET_BREDR, |
| .send_param = set_bredr_off_param, |
| .send_len = sizeof(set_bredr_off_param), |
| .expect_status = MGMT_STATUS_REJECTED, |
| }; |
| |
| static const struct generic_data set_bredr_off_failure_test_3 = { |
| .setup_settings = settings_le, |
| .send_opcode = MGMT_OP_SET_BREDR, |
| .send_param = set_bredr_invalid_param, |
| .send_len = sizeof(set_bredr_invalid_param), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const char set_local_name_param[260] = { 'T', 'e', 's', 't', ' ', |
| 'n', 'a', 'm', 'e' }; |
| static const char write_local_name_hci[248] = { 'T', 'e', 's', 't', ' ', |
| 'n', 'a', 'm', 'e' }; |
| static const char write_eir_local_name_hci_1[241] = { 0x00, |
| 0x0a, 0x09, 'T', 'e', 's', 't', ' ', 'n', 'a', 'm', 'e', |
| 0x02, 0x0a, 0x00, }; |
| |
| static const struct generic_data set_local_name_test_1 = { |
| .send_opcode = MGMT_OP_SET_LOCAL_NAME, |
| .send_param = set_local_name_param, |
| .send_len = sizeof(set_local_name_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_local_name_param, |
| .expect_len = sizeof(set_local_name_param), |
| .expect_alt_ev = MGMT_EV_LOCAL_NAME_CHANGED, |
| .expect_alt_ev_param = set_local_name_param, |
| .expect_alt_ev_len = sizeof(set_local_name_param), |
| }; |
| |
| static const struct generic_data set_local_name_test_2 = { |
| .setup_settings = settings_powered, |
| .send_opcode = MGMT_OP_SET_LOCAL_NAME, |
| .send_param = set_local_name_param, |
| .send_len = sizeof(set_local_name_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_local_name_param, |
| .expect_len = sizeof(set_local_name_param), |
| .expect_hci_command = BT_HCI_CMD_WRITE_LOCAL_NAME, |
| .expect_hci_param = write_local_name_hci, |
| .expect_hci_len = sizeof(write_local_name_hci), |
| .expect_alt_ev = MGMT_EV_LOCAL_NAME_CHANGED, |
| .expect_alt_ev_param = set_local_name_param, |
| .expect_alt_ev_len = sizeof(set_local_name_param), |
| }; |
| |
| static const struct generic_data set_local_name_test_3 = { |
| .setup_settings = settings_powered_ssp, |
| .send_opcode = MGMT_OP_SET_LOCAL_NAME, |
| .send_param = set_local_name_param, |
| .send_len = sizeof(set_local_name_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_local_name_param, |
| .expect_len = sizeof(set_local_name_param), |
| .expect_hci_command = BT_HCI_CMD_WRITE_EXT_INQUIRY_RESPONSE, |
| .expect_hci_param = write_eir_local_name_hci_1, |
| .expect_hci_len = sizeof(write_eir_local_name_hci_1), |
| .expect_alt_ev = MGMT_EV_LOCAL_NAME_CHANGED, |
| .expect_alt_ev_param = set_local_name_param, |
| .expect_alt_ev_len = sizeof(set_local_name_param), |
| }; |
| |
| static const char start_discovery_invalid_param[] = { 0x00 }; |
| static const char start_discovery_bredr_param[] = { 0x01 }; |
| static const char start_discovery_le_param[] = { 0x06 }; |
| static const char start_discovery_bredrle_param[] = { 0x07 }; |
| static const char start_discovery_valid_hci[] = { 0x01, 0x01 }; |
| static const char start_discovery_evt[] = { 0x07, 0x01 }; |
| static const char start_discovery_le_evt[] = { 0x06, 0x01 }; |
| |
| static const struct generic_data start_discovery_not_powered_test_1 = { |
| .send_opcode = MGMT_OP_START_DISCOVERY, |
| .send_param = start_discovery_bredr_param, |
| .send_len = sizeof(start_discovery_bredr_param), |
| .expect_status = MGMT_STATUS_NOT_POWERED, |
| .expect_param = start_discovery_bredr_param, |
| .expect_len = sizeof(start_discovery_bredr_param), |
| }; |
| |
| static const struct generic_data start_discovery_invalid_param_test_1 = { |
| .setup_settings = settings_powered, |
| .send_opcode = MGMT_OP_START_DISCOVERY, |
| .send_param = start_discovery_invalid_param, |
| .send_len = sizeof(start_discovery_invalid_param), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| .expect_param = start_discovery_invalid_param, |
| .expect_len = sizeof(start_discovery_invalid_param), |
| }; |
| |
| static const struct generic_data start_discovery_not_supported_test_1 = { |
| .setup_settings = settings_powered, |
| .send_opcode = MGMT_OP_START_DISCOVERY, |
| .send_param = start_discovery_le_param, |
| .send_len = sizeof(start_discovery_le_param), |
| .expect_status = MGMT_STATUS_REJECTED, |
| .expect_param = start_discovery_le_param, |
| .expect_len = sizeof(start_discovery_le_param), |
| }; |
| |
| static const struct generic_data start_discovery_valid_param_test_1 = { |
| .setup_settings = settings_powered_le, |
| .send_opcode = MGMT_OP_START_DISCOVERY, |
| .send_param = start_discovery_bredrle_param, |
| .send_len = sizeof(start_discovery_bredrle_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = start_discovery_bredrle_param, |
| .expect_len = sizeof(start_discovery_bredrle_param), |
| .expect_hci_command = BT_HCI_CMD_LE_SET_SCAN_ENABLE, |
| .expect_hci_param = start_discovery_valid_hci, |
| .expect_hci_len = sizeof(start_discovery_valid_hci), |
| .expect_alt_ev = MGMT_EV_DISCOVERING, |
| .expect_alt_ev_param = start_discovery_evt, |
| .expect_alt_ev_len = sizeof(start_discovery_evt), |
| }; |
| |
| static const struct generic_data start_discovery_valid_param_test_2 = { |
| .setup_settings = settings_powered, |
| .send_opcode = MGMT_OP_START_DISCOVERY, |
| .send_param = start_discovery_le_param, |
| .send_len = sizeof(start_discovery_le_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = start_discovery_le_param, |
| .expect_len = sizeof(start_discovery_le_param), |
| .expect_hci_command = BT_HCI_CMD_LE_SET_SCAN_ENABLE, |
| .expect_hci_param = start_discovery_valid_hci, |
| .expect_hci_len = sizeof(start_discovery_valid_hci), |
| .expect_alt_ev = MGMT_EV_DISCOVERING, |
| .expect_alt_ev_param = start_discovery_le_evt, |
| .expect_alt_ev_len = sizeof(start_discovery_le_evt), |
| }; |
| |
| static const struct generic_data start_discovery_valid_param_power_off_1 = { |
| .setup_settings = settings_le, |
| .send_opcode = MGMT_OP_START_DISCOVERY, |
| .send_param = start_discovery_bredrle_param, |
| .send_len = sizeof(start_discovery_bredrle_param), |
| .expect_status = MGMT_STATUS_NOT_POWERED, |
| .force_power_off = true, |
| .expect_param = start_discovery_bredrle_param, |
| .expect_len = sizeof(start_discovery_bredrle_param), |
| }; |
| |
| static const char stop_discovery_bredrle_param[] = { 0x07 }; |
| static const char stop_discovery_bredrle_invalid_param[] = { 0x06 }; |
| static const char stop_discovery_valid_hci[] = { 0x00, 0x00 }; |
| static const char stop_discovery_evt[] = { 0x07, 0x00 }; |
| static const char stop_discovery_bredr_param[] = { 0x01 }; |
| static const char stop_discovery_bredr_discovering[] = { 0x01, 0x00 }; |
| |
| static const struct generic_data stop_discovery_success_test_1 = { |
| .setup_settings = settings_powered_le, |
| .setup_send_opcode = MGMT_OP_START_DISCOVERY, |
| .setup_send_param = start_discovery_bredrle_param, |
| .setup_send_len = sizeof(start_discovery_bredrle_param), |
| .send_opcode = MGMT_OP_STOP_DISCOVERY, |
| .send_param = stop_discovery_bredrle_param, |
| .send_len = sizeof(stop_discovery_bredrle_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = stop_discovery_bredrle_param, |
| .expect_len = sizeof(stop_discovery_bredrle_param), |
| .expect_hci_command = BT_HCI_CMD_LE_SET_SCAN_ENABLE, |
| .expect_hci_param = stop_discovery_valid_hci, |
| .expect_hci_len = sizeof(stop_discovery_valid_hci), |
| .expect_alt_ev = MGMT_EV_DISCOVERING, |
| .expect_alt_ev_param = stop_discovery_evt, |
| .expect_alt_ev_len = sizeof(stop_discovery_evt), |
| }; |
| |
| static const struct generic_data stop_discovery_bredr_success_test_1 = { |
| .setup_settings = settings_powered, |
| .setup_send_opcode = MGMT_OP_START_DISCOVERY, |
| .setup_send_param = start_discovery_bredr_param, |
| .setup_send_len = sizeof(start_discovery_bredr_param), |
| .send_opcode = MGMT_OP_STOP_DISCOVERY, |
| .send_param = stop_discovery_bredr_param, |
| .send_len = sizeof(stop_discovery_bredr_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = stop_discovery_bredr_param, |
| .expect_len = sizeof(stop_discovery_bredr_param), |
| .expect_hci_command = BT_HCI_CMD_INQUIRY_CANCEL, |
| .expect_alt_ev = MGMT_EV_DISCOVERING, |
| .expect_alt_ev_param = stop_discovery_bredr_discovering, |
| .expect_alt_ev_len = sizeof(stop_discovery_bredr_discovering), |
| }; |
| |
| static const struct generic_data stop_discovery_rejected_test_1 = { |
| .setup_settings = settings_powered_le, |
| .send_opcode = MGMT_OP_STOP_DISCOVERY, |
| .send_param = stop_discovery_bredrle_param, |
| .send_len = sizeof(stop_discovery_bredrle_param), |
| .expect_status = MGMT_STATUS_REJECTED, |
| .expect_param = stop_discovery_bredrle_param, |
| .expect_len = sizeof(stop_discovery_bredrle_param), |
| }; |
| |
| static const struct generic_data stop_discovery_invalid_param_test_1 = { |
| .setup_settings = settings_powered_le, |
| .setup_send_opcode = MGMT_OP_START_DISCOVERY, |
| .setup_send_param = start_discovery_bredrle_param, |
| .setup_send_len = sizeof(start_discovery_bredrle_param), |
| .send_opcode = MGMT_OP_STOP_DISCOVERY, |
| .send_param = stop_discovery_bredrle_invalid_param, |
| .send_len = sizeof(stop_discovery_bredrle_invalid_param), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| .expect_param = stop_discovery_bredrle_invalid_param, |
| .expect_len = sizeof(stop_discovery_bredrle_invalid_param), |
| }; |
| |
| static const char start_service_discovery_invalid_param[] = { 0x00, 0x00, 0x00, 0x00 }; |
| static const char start_service_discovery_invalid_resp[] = { 0x00 }; |
| static const char start_service_discovery_bredr_param[] = { 0x01, 0x00, 0x00, 0x00}; |
| static const char start_service_discovery_bredr_resp[] = { 0x01 }; |
| static const char start_service_discovery_le_param[] = { 0x06, 0x00, 0x01, 0x00, |
| 0xfa, 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, |
| 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00 }; |
| static const char start_service_discovery_le_resp[] = { 0x06 }; |
| static const char start_service_discovery_bredrle_param[] = { 0x07, 0x00, 0x01, 0x00, |
| 0xfa, 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, |
| 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00 }; |
| static const char start_service_discovery_bredrle_resp[] = { 0x07 }; |
| static const char start_service_discovery_valid_hci[] = { 0x01, 0x01 }; |
| static const char start_service_discovery_evt[] = { 0x07, 0x01 }; |
| static const char start_service_discovery_le_evt[] = { 0x06, 0x01 }; |
| |
| static const struct generic_data start_service_discovery_not_powered_test_1 = { |
| .send_opcode = MGMT_OP_START_SERVICE_DISCOVERY, |
| .send_param = start_service_discovery_bredr_param, |
| .send_len = sizeof(start_service_discovery_bredr_param), |
| .expect_status = MGMT_STATUS_NOT_POWERED, |
| .expect_param = start_service_discovery_bredr_resp, |
| .expect_len = sizeof(start_service_discovery_bredr_resp), |
| }; |
| |
| static const struct generic_data start_service_discovery_invalid_param_test_1 = { |
| .setup_settings = settings_powered, |
| .send_opcode = MGMT_OP_START_SERVICE_DISCOVERY, |
| .send_param = start_service_discovery_invalid_param, |
| .send_len = sizeof(start_service_discovery_invalid_param), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| .expect_param = start_service_discovery_invalid_resp, |
| .expect_len = sizeof(start_service_discovery_invalid_resp), |
| }; |
| |
| static const struct generic_data start_service_discovery_not_supported_test_1 = { |
| .setup_settings = settings_powered, |
| .send_opcode = MGMT_OP_START_SERVICE_DISCOVERY, |
| .send_param = start_service_discovery_le_param, |
| .send_len = sizeof(start_service_discovery_le_param), |
| .expect_status = MGMT_STATUS_REJECTED, |
| .expect_param = start_service_discovery_le_resp, |
| .expect_len = sizeof(start_service_discovery_le_resp), |
| }; |
| |
| static const struct generic_data start_service_discovery_valid_param_test_1 = { |
| .setup_settings = settings_powered_le, |
| .send_opcode = MGMT_OP_START_SERVICE_DISCOVERY, |
| .send_param = start_service_discovery_bredrle_param, |
| .send_len = sizeof(start_service_discovery_bredrle_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = start_service_discovery_bredrle_resp, |
| .expect_len = sizeof(start_service_discovery_bredrle_resp), |
| .expect_hci_command = BT_HCI_CMD_LE_SET_SCAN_ENABLE, |
| .expect_hci_param = start_service_discovery_valid_hci, |
| .expect_hci_len = sizeof(start_service_discovery_valid_hci), |
| .expect_alt_ev = MGMT_EV_DISCOVERING, |
| .expect_alt_ev_param = start_service_discovery_evt, |
| .expect_alt_ev_len = sizeof(start_service_discovery_evt), |
| }; |
| |
| static const struct generic_data start_service_discovery_valid_param_test_2 = { |
| .setup_settings = settings_powered, |
| .send_opcode = MGMT_OP_START_SERVICE_DISCOVERY, |
| .send_param = start_service_discovery_le_param, |
| .send_len = sizeof(start_service_discovery_le_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = start_service_discovery_le_resp, |
| .expect_len = sizeof(start_service_discovery_le_resp), |
| .expect_hci_command = BT_HCI_CMD_LE_SET_SCAN_ENABLE, |
| .expect_hci_param = start_service_discovery_valid_hci, |
| .expect_hci_len = sizeof(start_service_discovery_valid_hci), |
| .expect_alt_ev = MGMT_EV_DISCOVERING, |
| .expect_alt_ev_param = start_service_discovery_le_evt, |
| .expect_alt_ev_len = sizeof(start_service_discovery_le_evt), |
| }; |
| |
| static const char set_dev_class_valid_param[] = { 0x01, 0x0c }; |
| static const char set_dev_class_zero_rsp[] = { 0x00, 0x00, 0x00 }; |
| static const char set_dev_class_valid_rsp[] = { 0x0c, 0x01, 0x00 }; |
| static const char set_dev_class_valid_hci[] = { 0x0c, 0x01, 0x00 }; |
| static const char set_dev_class_invalid_param[] = { 0x01, 0x01 }; |
| |
| static const struct generic_data set_dev_class_valid_param_test_1 = { |
| .send_opcode = MGMT_OP_SET_DEV_CLASS, |
| .send_param = set_dev_class_valid_param, |
| .send_len = sizeof(set_dev_class_valid_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_dev_class_zero_rsp, |
| .expect_len = sizeof(set_dev_class_zero_rsp), |
| }; |
| |
| static const struct generic_data set_dev_class_valid_param_test_2 = { |
| .setup_settings = settings_powered, |
| .send_opcode = MGMT_OP_SET_DEV_CLASS, |
| .send_param = set_dev_class_valid_param, |
| .send_len = sizeof(set_dev_class_valid_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_dev_class_valid_rsp, |
| .expect_len = sizeof(set_dev_class_valid_rsp), |
| .expect_alt_ev = MGMT_EV_CLASS_OF_DEV_CHANGED, |
| .expect_alt_ev_param = set_dev_class_valid_rsp, |
| .expect_alt_ev_len = sizeof(set_dev_class_valid_rsp), |
| .expect_hci_command = BT_HCI_CMD_WRITE_CLASS_OF_DEV, |
| .expect_hci_param = set_dev_class_valid_hci, |
| .expect_hci_len = sizeof(set_dev_class_valid_hci), |
| }; |
| |
| static const struct generic_data set_dev_class_invalid_param_test_1 = { |
| .send_opcode = MGMT_OP_SET_DEV_CLASS, |
| .send_param = set_dev_class_invalid_param, |
| .send_len = sizeof(set_dev_class_invalid_param), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const char add_spp_uuid_param[] = { |
| 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, |
| 0x00, 0x10, 0x00, 0x00, 0x01, 0x11, 0x00, 0x00, |
| 0x00 }; |
| static const char add_dun_uuid_param[] = { |
| 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, |
| 0x00, 0x10, 0x00, 0x00, 0x03, 0x11, 0x00, 0x00, |
| 0x00 }; |
| static const char add_sync_uuid_param[] = { |
| 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, |
| 0x00, 0x10, 0x00, 0x00, 0x04, 0x11, 0x00, 0x00, |
| 0x00 }; |
| static const char add_opp_uuid_param[] = { |
| 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, |
| 0x00, 0x10, 0x00, 0x00, 0x05, 0x11, 0x00, 0x00, |
| 0x00 }; |
| static const char write_eir_uuid16_hci[241] = { 0x00, |
| 0x02, 0x0a, 0x00, 0x03, 0x03, 0x01, 0x11 }; |
| static const char write_eir_multi_uuid16_hci_1[241] = { 0x00, |
| 0x02, 0x0a, 0x00, 0x09, 0x03, 0x01, 0x11, 0x03, |
| 0x11, 0x04, 0x11, 0x05, 0x11 }; |
| static const char write_eir_multi_uuid16_hci_2[241] = { 0x00, |
| 0x02, 0x0a, 0x00, 0xeb, 0x02, 0x00, 0x20, 0x01, |
| 0x20, 0x02, 0x20, 0x03, 0x20, 0x04, 0x20, 0x05, |
| 0x20, 0x06, 0x20, 0x07, 0x20, 0x08, 0x20, 0x09, |
| 0x20, 0x0a, 0x20, 0x0b, 0x20, 0x0c, 0x20, 0x0d, |
| 0x20, 0x0e, 0x20, 0x0f, 0x20, 0x10, 0x20, 0x11, |
| 0x20, 0x12, 0x20, 0x13, 0x20, 0x14, 0x20, 0x15, |
| 0x20, 0x16, 0x20, 0x17, 0x20, 0x18, 0x20, 0x19, |
| 0x20, 0x1a, 0x20, 0x1b, 0x20, 0x1c, 0x20, 0x1d, |
| 0x20, 0x1e, 0x20, 0x1f, 0x20, 0x20, 0x20, 0x21, |
| 0x20, 0x22, 0x20, 0x23, 0x20, 0x24, 0x20, 0x25, |
| 0x20, 0x26, 0x20, 0x27, 0x20, 0x28, 0x20, 0x29, |
| 0x20, 0x2a, 0x20, 0x2b, 0x20, 0x2c, 0x20, 0x2d, |
| 0x20, 0x2e, 0x20, 0x2f, 0x20, 0x30, 0x20, 0x31, |
| 0x20, 0x32, 0x20, 0x33, 0x20, 0x34, 0x20, 0x35, |
| 0x20, 0x36, 0x20, 0x37, 0x20, 0x38, 0x20, 0x39, |
| 0x20, 0x3a, 0x20, 0x3b, 0x20, 0x3c, 0x20, 0x3d, |
| 0x20, 0x3e, 0x20, 0x3f, 0x20, 0x40, 0x20, 0x41, |
| 0x20, 0x42, 0x20, 0x43, 0x20, 0x44, 0x20, 0x45, |
| 0x20, 0x46, 0x20, 0x47, 0x20, 0x48, 0x20, 0x49, |
| 0x20, 0x4a, 0x20, 0x4b, 0x20, 0x4c, 0x20, 0x4d, |
| 0x20, 0x4e, 0x20, 0x4f, 0x20, 0x50, 0x20, 0x51, |
| 0x20, 0x52, 0x20, 0x53, 0x20, 0x54, 0x20, 0x55, |
| 0x20, 0x56, 0x20, 0x57, 0x20, 0x58, 0x20, 0x59, |
| 0x20, 0x5a, 0x20, 0x5b, 0x20, 0x5c, 0x20, 0x5d, |
| 0x20, 0x5e, 0x20, 0x5f, 0x20, 0x60, 0x20, 0x61, |
| 0x20, 0x62, 0x20, 0x63, 0x20, 0x64, 0x20, 0x65, |
| 0x20, 0x66, 0x20, 0x67, 0x20, 0x68, 0x20, 0x69, |
| 0x20, 0x6a, 0x20, 0x6b, 0x20, 0x6c, 0x20, 0x6d, |
| 0x20, 0x6e, 0x20, 0x6f, 0x20, 0x70, 0x20, 0x71, |
| 0x20, 0x72, 0x20, 0x73, 0x20, 0x74, 0x20, 0x00 }; |
| static const char add_uuid32_param_1[] = { |
| 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, |
| 0x00, 0x10, 0x00, 0x00, 0x78, 0x56, 0x34, 0x12, |
| 0x00 }; |
| static const char add_uuid32_param_2[] = { |
| 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, |
| 0x00, 0x10, 0x00, 0x00, 0xef, 0xcd, 0xbc, 0x9a, |
| 0x00 }; |
| static const char add_uuid32_param_3[] = { |
| 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, |
| 0x00, 0x10, 0x00, 0x00, 0xff, 0xee, 0xdd, 0xcc, |
| 0x00 }; |
| static const char add_uuid32_param_4[] = { |
| 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, |
| 0x00, 0x10, 0x00, 0x00, 0x11, 0x22, 0x33, 0x44, |
| 0x00 }; |
| static const char write_eir_uuid32_hci[241] = { 0x00, |
| 0x02, 0x0a, 0x00, 0x05, 0x05, 0x78, 0x56, 0x34, |
| 0x12 }; |
| static const char write_eir_uuid32_multi_hci[241] = { 0x00, |
| 0x02, 0x0a, 0x00, 0x11, 0x05, 0x78, 0x56, 0x34, |
| 0x12, 0xef, 0xcd, 0xbc, 0x9a, 0xff, 0xee, 0xdd, |
| 0xcc, 0x11, 0x22, 0x33, 0x44 }; |
| static const char write_eir_uuid32_multi_hci_2[] = { 0x00, |
| 0x02, 0x0a, 0x00, 0xe9, 0x04, 0xff, 0xff, 0xff, |
| 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, |
| 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, |
| 0xff, 0xfa, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, |
| 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, |
| 0xff, 0xf6, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, |
| 0xff, 0xf4, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, |
| 0xff, 0xf2, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, |
| 0xff, 0xf0, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, |
| 0xff, 0xee, 0xff, 0xff, 0xff, 0xed, 0xff, 0xff, |
| 0xff, 0xec, 0xff, 0xff, 0xff, 0xeb, 0xff, 0xff, |
| 0xff, 0xea, 0xff, 0xff, 0xff, 0xe9, 0xff, 0xff, |
| 0xff, 0xe8, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, |
| 0xff, 0xe6, 0xff, 0xff, 0xff, 0xe5, 0xff, 0xff, |
| 0xff, 0xe4, 0xff, 0xff, 0xff, 0xe3, 0xff, 0xff, |
| 0xff, 0xe2, 0xff, 0xff, 0xff, 0xe1, 0xff, 0xff, |
| 0xff, 0xe0, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, |
| 0xff, 0xde, 0xff, 0xff, 0xff, 0xdd, 0xff, 0xff, |
| 0xff, 0xdc, 0xff, 0xff, 0xff, 0xdb, 0xff, 0xff, |
| 0xff, 0xda, 0xff, 0xff, 0xff, 0xd9, 0xff, 0xff, |
| 0xff, 0xd8, 0xff, 0xff, 0xff, 0xd7, 0xff, 0xff, |
| 0xff, 0xd6, 0xff, 0xff, 0xff, 0xd5, 0xff, 0xff, |
| 0xff, 0xd4, 0xff, 0xff, 0xff, 0xd3, 0xff, 0xff, |
| 0xff, 0xd2, 0xff, 0xff, 0xff, 0xd1, 0xff, 0xff, |
| 0xff, 0xd0, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, |
| 0xff, 0xce, 0xff, 0xff, 0xff, 0xcd, 0xff, 0xff, |
| 0xff, 0xcc, 0xff, 0xff, 0xff, 0xcb, 0xff, 0xff, |
| 0xff, 0xca, 0xff, 0xff, 0xff, 0xc9, 0xff, 0xff, |
| 0xff, 0xc8, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xff, |
| 0xff, 0xc6, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00 }; |
| static const char add_uuid128_param_1[] = { |
| 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, |
| 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, |
| 0x00 }; |
| static const char add_uuid128_param_2[] = { |
| 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99, 0x88, |
| 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00, |
| 0x00 }; |
| static const char write_eir_uuid128_hci[241] = { 0x00, |
| 0x02, 0x0a, 0x00, 0x11, 0x07, 0x00, 0x11, 0x22, |
| 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, |
| 0xbb, 0xcc, 0xdd, 0xee, 0xff }; |
| static const char write_eir_uuid128_multi_hci[241] = { 0x00, |
| 0x02, 0x0a, 0x00, 0x21, 0x07, 0x00, 0x11, 0x22, |
| 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, |
| 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0xff, 0xee, 0xdd, |
| 0xcc, 0xbb, 0xaa, 0x99, 0x88, 0x77, 0x66, 0x55, |
| 0x44, 0x33, 0x22, 0x11 }; |
| static const char write_eir_uuid128_multi_hci_2[] = { 0x00, |
| 0x02, 0x0a, 0x00, 0xe1, 0x07, 0x11, 0x22, 0x33, |
| 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, |
| 0xcc, 0xdd, 0xee, 0xff, 0x00, 0x11, 0x22, 0x33, |
| 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, |
| 0xcc, 0xdd, 0xee, 0xff, 0x01, 0x11, 0x22, 0x33, |
| 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, |
| 0xcc, 0xdd, 0xee, 0xff, 0x02, 0x11, 0x22, 0x33, |
| 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, |
| 0xcc, 0xdd, 0xee, 0xff, 0x03, 0x11, 0x22, 0x33, |
| 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, |
| 0xcc, 0xdd, 0xee, 0xff, 0x04, 0x11, 0x22, 0x33, |
| 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, |
| 0xcc, 0xdd, 0xee, 0xff, 0x05, 0x11, 0x22, 0x33, |
| 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, |
| 0xcc, 0xdd, 0xee, 0xff, 0x06, 0x11, 0x22, 0x33, |
| 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, |
| 0xcc, 0xdd, 0xee, 0xff, 0x07, 0x11, 0x22, 0x33, |
| 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, |
| 0xcc, 0xdd, 0xee, 0xff, 0x08, 0x11, 0x22, 0x33, |
| 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, |
| 0xcc, 0xdd, 0xee, 0xff, 0x09, 0x11, 0x22, 0x33, |
| 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, |
| 0xcc, 0xdd, 0xee, 0xff, 0x0a, 0x11, 0x22, 0x33, |
| 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, |
| 0xcc, 0xdd, 0xee, 0xff, 0x0b, 0x11, 0x22, 0x33, |
| 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, |
| 0xcc, 0xdd, 0xee, 0xff, 0x0c, 0xff, 0xee, 0xdd, |
| 0xcc, 0xbb, 0xaa, 0x99, 0x88, 0x77, 0x66, 0x55, |
| 0x44, 0x33, 0x22, 0x11, 0x00, 0x00, 0x00, 0x00, |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; |
| static const char write_eir_uuid_mix_hci[241] = { 0x00, |
| 0x02, 0x0a, 0x00, 0x05, 0x03, 0x01, 0x11, 0x03, |
| 0x11, 0x09, 0x05, 0x78, 0x56, 0x34, 0x12, 0xef, |
| 0xcd, 0xbc, 0x9a, 0x21, 0x07, 0x00, 0x11, 0x22, |
| 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, |
| 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0xff, 0xee, 0xdd, |
| 0xcc, 0xbb, 0xaa, 0x99, 0x88, 0x77, 0x66, 0x55, |
| 0x44, 0x33, 0x22, 0x11 }; |
| |
| static const struct generic_data add_uuid16_test_1 = { |
| .setup_settings = settings_powered_ssp, |
| .send_opcode = MGMT_OP_ADD_UUID, |
| .send_param = add_spp_uuid_param, |
| .send_len = sizeof(add_spp_uuid_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_dev_class_zero_rsp, |
| .expect_len = sizeof(set_dev_class_zero_rsp), |
| .expect_hci_command = BT_HCI_CMD_WRITE_EXT_INQUIRY_RESPONSE, |
| .expect_hci_param = write_eir_uuid16_hci, |
| .expect_hci_len = sizeof(write_eir_uuid16_hci), |
| }; |
| |
| static const struct generic_data add_multi_uuid16_test_1 = { |
| .send_opcode = MGMT_OP_ADD_UUID, |
| .send_param = add_opp_uuid_param, |
| .send_len = sizeof(add_opp_uuid_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_dev_class_zero_rsp, |
| .expect_len = sizeof(set_dev_class_zero_rsp), |
| .expect_hci_command = BT_HCI_CMD_WRITE_EXT_INQUIRY_RESPONSE, |
| .expect_hci_param = write_eir_multi_uuid16_hci_1, |
| .expect_hci_len = sizeof(write_eir_multi_uuid16_hci_1), |
| }; |
| |
| static const struct generic_data add_multi_uuid16_test_2 = { |
| .send_opcode = MGMT_OP_ADD_UUID, |
| .send_param = add_opp_uuid_param, |
| .send_len = sizeof(add_opp_uuid_param), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_dev_class_zero_rsp, |
| .expect_len = sizeof(set_dev_class_zero_rsp), |
| .expect_hci_command = BT_HCI_CMD_WRITE_EXT_INQUIRY_RESPONSE, |
| .expect_hci_param = write_eir_multi_uuid16_hci_2, |
| .expect_hci_len = sizeof(write_eir_multi_uuid16_hci_2), |
| }; |
| |
| static const struct generic_data add_uuid32_test_1 = { |
| .setup_settings = settings_powered_ssp, |
| .send_opcode = MGMT_OP_ADD_UUID, |
| .send_param = add_uuid32_param_1, |
| .send_len = sizeof(add_uuid32_param_1), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_dev_class_zero_rsp, |
| .expect_len = sizeof(set_dev_class_zero_rsp), |
| .expect_hci_command = BT_HCI_CMD_WRITE_EXT_INQUIRY_RESPONSE, |
| .expect_hci_param = write_eir_uuid32_hci, |
| .expect_hci_len = sizeof(write_eir_uuid32_hci), |
| }; |
| |
| static const struct generic_data add_uuid32_multi_test_1 = { |
| .send_opcode = MGMT_OP_ADD_UUID, |
| .send_param = add_uuid32_param_4, |
| .send_len = sizeof(add_uuid32_param_4), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_dev_class_zero_rsp, |
| .expect_len = sizeof(set_dev_class_zero_rsp), |
| .expect_hci_command = BT_HCI_CMD_WRITE_EXT_INQUIRY_RESPONSE, |
| .expect_hci_param = write_eir_uuid32_multi_hci, |
| .expect_hci_len = sizeof(write_eir_uuid32_multi_hci), |
| }; |
| |
| static const struct generic_data add_uuid32_multi_test_2 = { |
| .send_opcode = MGMT_OP_ADD_UUID, |
| .send_param = add_uuid32_param_4, |
| .send_len = sizeof(add_uuid32_param_4), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_dev_class_zero_rsp, |
| .expect_len = sizeof(set_dev_class_zero_rsp), |
| .expect_hci_command = BT_HCI_CMD_WRITE_EXT_INQUIRY_RESPONSE, |
| .expect_hci_param = write_eir_uuid32_multi_hci_2, |
| .expect_hci_len = sizeof(write_eir_uuid32_multi_hci_2), |
| }; |
| |
| static const struct generic_data add_uuid128_test_1 = { |
| .setup_settings = settings_powered_ssp, |
| .send_opcode = MGMT_OP_ADD_UUID, |
| .send_param = add_uuid128_param_1, |
| .send_len = sizeof(add_uuid128_param_1), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_dev_class_zero_rsp, |
| .expect_len = sizeof(set_dev_class_zero_rsp), |
| .expect_hci_command = BT_HCI_CMD_WRITE_EXT_INQUIRY_RESPONSE, |
| .expect_hci_param = write_eir_uuid128_hci, |
| .expect_hci_len = sizeof(write_eir_uuid128_hci), |
| }; |
| |
| static const struct generic_data add_uuid128_multi_test_1 = { |
| .send_opcode = MGMT_OP_ADD_UUID, |
| .send_param = add_uuid128_param_2, |
| .send_len = sizeof(add_uuid32_param_2), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_dev_class_zero_rsp, |
| .expect_len = sizeof(set_dev_class_zero_rsp), |
| .expect_hci_command = BT_HCI_CMD_WRITE_EXT_INQUIRY_RESPONSE, |
| .expect_hci_param = write_eir_uuid128_multi_hci, |
| .expect_hci_len = sizeof(write_eir_uuid128_multi_hci), |
| }; |
| |
| static const struct generic_data add_uuid128_multi_test_2 = { |
| .send_opcode = MGMT_OP_ADD_UUID, |
| .send_param = add_uuid128_param_2, |
| .send_len = sizeof(add_uuid128_param_2), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_dev_class_zero_rsp, |
| .expect_len = sizeof(set_dev_class_zero_rsp), |
| .expect_hci_command = BT_HCI_CMD_WRITE_EXT_INQUIRY_RESPONSE, |
| .expect_hci_param = write_eir_uuid128_multi_hci_2, |
| .expect_hci_len = sizeof(write_eir_uuid128_multi_hci_2), |
| }; |
| |
| static const struct generic_data add_uuid_mix_test_1 = { |
| .send_opcode = MGMT_OP_ADD_UUID, |
| .send_param = add_uuid128_param_2, |
| .send_len = sizeof(add_uuid128_param_2), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| .expect_param = set_dev_class_zero_rsp, |
| .expect_len = sizeof(set_dev_class_zero_rsp), |
| .expect_hci_command = BT_HCI_CMD_WRITE_EXT_INQUIRY_RESPONSE, |
| .expect_hci_param = write_eir_uuid_mix_hci, |
| .expect_hci_len = sizeof(write_eir_uuid_mix_hci), |
| }; |
| |
| static const char load_link_keys_valid_param_1[] = { 0x00, 0x00, 0x00 }; |
| static const char load_link_keys_valid_param_2[] = { 0x01, 0x00, 0x00 }; |
| static const char load_link_keys_invalid_param_1[] = { 0x02, 0x00, 0x00 }; |
| static const char load_link_keys_invalid_param_2[] = { 0x00, 0x01, 0x00 }; |
| /* Invalid bdaddr type */ |
| static const char load_link_keys_invalid_param_3[] = { 0x00, 0x01, 0x00, |
| 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* addr */ |
| 0x01, /* addr type */ |
| 0x00, /* key type */ |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (1/2) */ |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (2/2) */ |
| 0x04, /* PIN length */ |
| }; |
| |
| static const struct generic_data load_link_keys_success_test_1 = { |
| .send_opcode = MGMT_OP_LOAD_LINK_KEYS, |
| .send_param = load_link_keys_valid_param_1, |
| .send_len = sizeof(load_link_keys_valid_param_1), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| }; |
| |
| static const struct generic_data load_link_keys_success_test_2 = { |
| .send_opcode = MGMT_OP_LOAD_LINK_KEYS, |
| .send_param = load_link_keys_valid_param_2, |
| .send_len = sizeof(load_link_keys_valid_param_2), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| }; |
| |
| static const struct generic_data load_link_keys_invalid_params_test_1 = { |
| .send_opcode = MGMT_OP_LOAD_LINK_KEYS, |
| .send_param = load_link_keys_invalid_param_1, |
| .send_len = sizeof(load_link_keys_invalid_param_1), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data load_link_keys_invalid_params_test_2 = { |
| .send_opcode = MGMT_OP_LOAD_LINK_KEYS, |
| .send_param = load_link_keys_invalid_param_2, |
| .send_len = sizeof(load_link_keys_invalid_param_2), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data load_link_keys_invalid_params_test_3 = { |
| .send_opcode = MGMT_OP_LOAD_LINK_KEYS, |
| .send_param = load_link_keys_invalid_param_3, |
| .send_len = sizeof(load_link_keys_invalid_param_3), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const char load_ltks_valid_param_1[] = { 0x00, 0x00 }; |
| /* Invalid key count */ |
| static const char load_ltks_invalid_param_1[] = { 0x01, 0x00 }; |
| /* Invalid addr type */ |
| static const char load_ltks_invalid_param_2[] = { |
| 0x01, 0x00, /* count */ |
| 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* bdaddr */ |
| 0x00, /* addr type */ |
| 0x00, /* authenticated */ |
| 0x00, /* master */ |
| 0x00, /* encryption size */ |
| 0x00, 0x00, /* diversifier */ |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* rand */ |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (1/2) */ |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (2/2) */ |
| }; |
| /* Invalid master value */ |
| static const char load_ltks_invalid_param_3[] = { |
| 0x01, 0x00, /* count */ |
| 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, /* bdaddr */ |
| 0x01, /* addr type */ |
| 0x00, /* authenticated */ |
| 0x02, /* master */ |
| 0x00, /* encryption size */ |
| 0x00, 0x00, /* diversifier */ |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* rand */ |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (1/2) */ |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* value (2/2) */ |
| }; |
| |
| static const struct generic_data load_ltks_success_test_1 = { |
| .send_opcode = MGMT_OP_LOAD_LONG_TERM_KEYS, |
| .send_param = load_ltks_valid_param_1, |
| .send_len = sizeof(load_ltks_valid_param_1), |
| .expect_status = MGMT_STATUS_SUCCESS, |
| }; |
| |
| static const struct generic_data load_ltks_invalid_params_test_1 = { |
| .send_opcode = MGMT_OP_LOAD_LONG_TERM_KEYS, |
| .send_param = load_ltks_invalid_param_1, |
| .send_len = sizeof(load_ltks_invalid_param_1), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data load_ltks_invalid_params_test_2 = { |
| .send_opcode = MGMT_OP_LOAD_LONG_TERM_KEYS, |
| .send_param = load_ltks_invalid_param_2, |
| .send_len = sizeof(load_ltks_invalid_param_2), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const struct generic_data load_ltks_invalid_params_test_3 = { |
| .send_opcode = MGMT_OP_LOAD_LONG_TERM_KEYS, |
| .send_param = load_ltks_invalid_param_3, |
| .send_len = sizeof(load_ltks_invalid_param_3), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const char load_ltks_invalid_param_4[22] = { 0x1d, 0x07 }; |
| static const struct generic_data load_ltks_invalid_params_test_4 = { |
| .send_opcode = MGMT_OP_LOAD_LONG_TERM_KEYS, |
| .send_param = load_ltks_invalid_param_4, |
| .send_len = sizeof(load_ltks_invalid_param_4), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const char set_io_cap_invalid_param_1[] = { 0xff }; |
| |
| static const struct generic_data set_io_cap_invalid_param_test_1 = { |
| .send_opcode = MGMT_OP_SET_IO_CAPABILITY, |
| .send_param = set_io_cap_invalid_param_1, |
| .send_len = sizeof(set_io_cap_invalid_param_1), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| }; |
| |
| static const char pair_device_param[] = { |
| 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x00, 0x00 }; |
| static const char pair_device_rsp[] = { |
| 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x00 }; |
| static const char pair_device_invalid_param_1[] = { |
| 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0xff, 0x00 }; |
| static const char pair_device_invalid_param_rsp_1[] = { |
| 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0xff }; |
| static const char pair_device_invalid_param_2[] = { |
| 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x00, 0x05 }; |
| static const char pair_device_invalid_param_rsp_2[] = { |
| 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x00 }; |
| |
| static const struct generic_data pair_device_not_powered_test_1 = { |
| .send_opcode = MGMT_OP_PAIR_DEVICE, |
| .send_param = pair_device_param, |
| .send_len = sizeof(pair_device_param), |
| .expect_status = MGMT_STATUS_NOT_POWERED, |
| .expect_param = pair_device_rsp, |
| .expect_len = sizeof(pair_device_rsp), |
| }; |
| |
| static const struct generic_data pair_device_invalid_param_test_1 = { |
| .send_opcode = MGMT_OP_PAIR_DEVICE, |
| .send_param = pair_device_invalid_param_1, |
| .send_len = sizeof(pair_device_invalid_param_1), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| .expect_param = pair_device_invalid_param_rsp_1, |
| .expect_len = sizeof(pair_device_invalid_param_rsp_1), |
| }; |
| |
| static const struct generic_data pair_device_invalid_param_test_2 = { |
| .send_opcode = MGMT_OP_PAIR_DEVICE, |
| .send_param = pair_device_invalid_param_2, |
| .send_len = sizeof(pair_device_invalid_param_2), |
| .expect_status = MGMT_STATUS_INVALID_PARAMS, |
| .expect_param = pair_device_invalid_param_rsp_2, |
| .expect_len = sizeof(pair_device_invalid_param_rsp_2), |
| }; |
| |
| static const void *pair_device_send_param_func(uint16_t *len) |
| { |
| struct test_data *data = tester_get_data(); |
| const struct generic_data *test = data->test_data; |
| static uint8_t param[8]; |
| |
| memcpy(param, hciemu_get_client_bdaddr(data->hciemu), 6); |
| |
| if (test->addr_type_avail) |
| param[6] = test->addr_type; |
| else if (data->hciemu_type == HCIEMU_TYPE_LE) |
| param[6] = 0x01; /* Address type */ |
| else |
| param[6] = 0x00; /* Address type */ |
| param[7] = test->io_cap; |
| |
| *len = sizeof(param); |
| |
| return param; |
| } |
| |
| static const void *pair_device_expect_param_func(uint16_t *len) |
| { |
| struct test_data *data = tester_get_data(); |
| const struct generic_data *test = data->test_data; |
| static uint8_t param[7]; |
| |
| memcpy(param, hciemu_get_client_bdaddr(data->hciemu), 6); |
| |
| if (test->addr_type_avail) |
|