blob: b6f48739f80398ddc9e545d4c4a02b69349cfbac [file] [log] [blame]
/*
*
* 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)