1262 lines
37 KiB
C
1262 lines
37 KiB
C
/*
|
|
*
|
|
* BlueZ - Bluetooth protocol stack for Linux
|
|
*
|
|
* Copyright (C) 2013-2014 Intel Corporation. All rights reserved.
|
|
*
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; 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 <unistd.h>
|
|
#include <errno.h>
|
|
#include <poll.h>
|
|
|
|
#include <sys/socket.h>
|
|
#include <sys/types.h>
|
|
#include <sys/wait.h>
|
|
#include <sys/un.h>
|
|
#include <libgen.h>
|
|
#include <glib.h>
|
|
|
|
#include "lib/bluetooth.h"
|
|
#include "lib/mgmt.h"
|
|
|
|
#include "src/shared/tester.h"
|
|
#include "src/shared/mgmt.h"
|
|
#include "src/shared/hciemu.h"
|
|
|
|
#include "hal-msg.h"
|
|
#include "ipc-common.h"
|
|
|
|
#include <cutils/properties.h>
|
|
|
|
#define WAIT_FOR_SIGNAL_TIME 2 /* in seconds */
|
|
#define EMULATOR_SIGNAL "emulator_started"
|
|
|
|
struct test_data {
|
|
struct mgmt *mgmt;
|
|
uint16_t mgmt_index;
|
|
struct hciemu *hciemu;
|
|
enum hciemu_type hciemu_type;
|
|
pid_t bluetoothd_pid;
|
|
bool setup_done;
|
|
};
|
|
|
|
struct ipc_data {
|
|
void *buffer;
|
|
size_t len;
|
|
};
|
|
|
|
struct generic_data {
|
|
struct ipc_data ipc_data;
|
|
|
|
unsigned int num_services;
|
|
int init_services[];
|
|
};
|
|
|
|
struct regmod_msg {
|
|
struct ipc_hdr header;
|
|
struct hal_cmd_register_module cmd;
|
|
} __attribute__((packed));
|
|
|
|
#define CONNECT_TIMEOUT (5 * 1000)
|
|
#define SERVICE_NAME "bluetoothd"
|
|
|
|
static char exec_dir[PATH_MAX + 1];
|
|
|
|
static int cmd_sk = -1;
|
|
static int notif_sk = -1;
|
|
|
|
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;
|
|
|
|
tester_print("Read Info callback");
|
|
tester_print(" Status: 0x%02x", 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;
|
|
}
|
|
|
|
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_unref(data->mgmt);
|
|
data->mgmt = 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: 0x%02x", 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();
|
|
return;
|
|
}
|
|
|
|
tester_print("New hciemu instance created");
|
|
}
|
|
|
|
static void test_pre_setup(const void *data)
|
|
{
|
|
struct test_data *test_data = tester_get_data();
|
|
|
|
if (!tester_use_debug())
|
|
fclose(stderr);
|
|
|
|
test_data->mgmt = mgmt_new_default();
|
|
if (!test_data->mgmt) {
|
|
tester_warn("Failed to setup management interface");
|
|
tester_pre_setup_failed();
|
|
return;
|
|
}
|
|
|
|
mgmt_send(test_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 *data)
|
|
{
|
|
struct test_data *test_data = tester_get_data();
|
|
|
|
if (test_data->hciemu) {
|
|
hciemu_unref(test_data->hciemu);
|
|
test_data->hciemu = NULL;
|
|
}
|
|
}
|
|
|
|
static void bluetoothd_start(int hci_index)
|
|
{
|
|
char prg_name[PATH_MAX + 1];
|
|
char index[8];
|
|
char *prg_argv[4];
|
|
|
|
snprintf(prg_name, sizeof(prg_name), "%s/%s", exec_dir, "bluetoothd");
|
|
snprintf(index, sizeof(index), "%d", hci_index);
|
|
|
|
prg_argv[0] = prg_name;
|
|
prg_argv[1] = "-i";
|
|
prg_argv[2] = index;
|
|
prg_argv[3] = NULL;
|
|
|
|
if (!tester_use_debug())
|
|
fclose(stderr);
|
|
|
|
execve(prg_argv[0], prg_argv, NULL);
|
|
}
|
|
|
|
static void emulator(int pipe, int hci_index)
|
|
{
|
|
static const char SYSTEM_SOCKET_PATH[] = "\0android_system";
|
|
char buf[1024];
|
|
struct sockaddr_un addr;
|
|
struct timeval tv;
|
|
int fd;
|
|
ssize_t len;
|
|
|
|
fd = socket(PF_LOCAL, SOCK_DGRAM | SOCK_CLOEXEC, 0);
|
|
if (fd < 0)
|
|
goto failed;
|
|
|
|
tv.tv_sec = WAIT_FOR_SIGNAL_TIME;
|
|
tv.tv_usec = 0;
|
|
setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv));
|
|
|
|
memset(&addr, 0, sizeof(addr));
|
|
addr.sun_family = AF_UNIX;
|
|
memcpy(addr.sun_path, SYSTEM_SOCKET_PATH, sizeof(SYSTEM_SOCKET_PATH));
|
|
|
|
if (bind(fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
|
|
perror("Failed to bind system socket");
|
|
goto failed;
|
|
}
|
|
|
|
len = write(pipe, EMULATOR_SIGNAL, sizeof(EMULATOR_SIGNAL));
|
|
|
|
if (len != sizeof(EMULATOR_SIGNAL))
|
|
goto failed;
|
|
|
|
memset(buf, 0, sizeof(buf));
|
|
|
|
len = read(fd, buf, sizeof(buf));
|
|
if (len <= 0 || strcmp(buf, "ctl.start=bluetoothd"))
|
|
goto failed;
|
|
|
|
close(pipe);
|
|
close(fd);
|
|
bluetoothd_start(hci_index);
|
|
|
|
failed:
|
|
close(pipe);
|
|
close(fd);
|
|
}
|
|
|
|
static int accept_connection(int sk)
|
|
{
|
|
int err;
|
|
struct pollfd pfd;
|
|
int new_sk;
|
|
|
|
memset(&pfd, 0 , sizeof(pfd));
|
|
pfd.fd = sk;
|
|
pfd.events = POLLIN;
|
|
|
|
err = poll(&pfd, 1, CONNECT_TIMEOUT);
|
|
if (err < 0) {
|
|
err = errno;
|
|
tester_warn("Failed to poll: %d (%s)", err, strerror(err));
|
|
return -errno;
|
|
}
|
|
|
|
if (err == 0) {
|
|
tester_warn("bluetoothd connect timeout");
|
|
return -errno;
|
|
}
|
|
|
|
new_sk = accept(sk, NULL, NULL);
|
|
if (new_sk < 0) {
|
|
err = errno;
|
|
tester_warn("Failed to accept socket: %d (%s)",
|
|
err, strerror(err));
|
|
return -errno;
|
|
}
|
|
|
|
return new_sk;
|
|
}
|
|
|
|
static bool init_ipc(void)
|
|
{
|
|
struct sockaddr_un addr;
|
|
|
|
int sk;
|
|
int err;
|
|
|
|
sk = socket(AF_LOCAL, SOCK_SEQPACKET, 0);
|
|
if (sk < 0) {
|
|
err = errno;
|
|
tester_warn("Failed to create socket: %d (%s)", err,
|
|
strerror(err));
|
|
return false;
|
|
}
|
|
|
|
memset(&addr, 0, sizeof(addr));
|
|
addr.sun_family = AF_UNIX;
|
|
|
|
memcpy(addr.sun_path, BLUEZ_HAL_SK_PATH, sizeof(BLUEZ_HAL_SK_PATH));
|
|
|
|
if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
|
|
err = errno;
|
|
tester_warn("Failed to bind socket: %d (%s)", err,
|
|
strerror(err));
|
|
close(sk);
|
|
return false;
|
|
}
|
|
|
|
if (listen(sk, 2) < 0) {
|
|
err = errno;
|
|
tester_warn("Failed to listen on socket: %d (%s)", err,
|
|
strerror(err));
|
|
close(sk);
|
|
return false;
|
|
}
|
|
|
|
/* Start Android Bluetooth daemon service */
|
|
if (property_set("ctl.start", SERVICE_NAME) < 0) {
|
|
tester_warn("Failed to start service %s", SERVICE_NAME);
|
|
close(sk);
|
|
return false;
|
|
}
|
|
|
|
cmd_sk = accept_connection(sk);
|
|
if (cmd_sk < 0) {
|
|
close(sk);
|
|
return false;
|
|
}
|
|
|
|
notif_sk = accept_connection(sk);
|
|
if (notif_sk < 0) {
|
|
close(sk);
|
|
close(cmd_sk);
|
|
cmd_sk = -1;
|
|
return false;
|
|
}
|
|
|
|
tester_print("bluetoothd connected");
|
|
|
|
close(sk);
|
|
|
|
return true;
|
|
}
|
|
|
|
static void cleanup_ipc(void)
|
|
{
|
|
if (cmd_sk < 0)
|
|
return;
|
|
|
|
close(cmd_sk);
|
|
cmd_sk = -1;
|
|
}
|
|
|
|
static gboolean check_for_daemon(gpointer user_data)
|
|
{
|
|
int status;
|
|
struct test_data *data = user_data;
|
|
|
|
if ((waitpid(data->bluetoothd_pid, &status, WNOHANG))
|
|
!= data->bluetoothd_pid)
|
|
return true;
|
|
|
|
if (data->setup_done) {
|
|
if (WIFEXITED(status) &&
|
|
(WEXITSTATUS(status) == EXIT_SUCCESS)) {
|
|
tester_test_passed();
|
|
return false;
|
|
}
|
|
tester_test_failed();
|
|
} else {
|
|
tester_setup_failed();
|
|
test_post_teardown(data);
|
|
}
|
|
|
|
tester_warn("Unexpected Daemon shutdown with status %d", status);
|
|
return false;
|
|
}
|
|
|
|
static bool setup_module(int service_id)
|
|
{
|
|
struct ipc_hdr response;
|
|
struct ipc_hdr expected_response;
|
|
|
|
struct regmod_msg btmodule_msg = {
|
|
.header = {
|
|
.service_id = HAL_SERVICE_ID_CORE,
|
|
.opcode = HAL_OP_REGISTER_MODULE,
|
|
.len = sizeof(struct hal_cmd_register_module),
|
|
},
|
|
.cmd = {
|
|
.service_id = service_id,
|
|
},
|
|
};
|
|
|
|
if (write(cmd_sk, &btmodule_msg, sizeof(btmodule_msg)) < 0)
|
|
goto fail;
|
|
|
|
if (read(cmd_sk, &response, sizeof(response)) < 0)
|
|
goto fail;
|
|
|
|
expected_response = btmodule_msg.header;
|
|
expected_response.len = 0;
|
|
|
|
if (memcmp(&response, &expected_response, sizeof(response)) == 0)
|
|
return true;
|
|
|
|
fail:
|
|
tester_warn("Module registration failed.");
|
|
return false;
|
|
}
|
|
|
|
static void setup(const void *data)
|
|
{
|
|
const struct generic_data *generic_data = data;
|
|
struct test_data *test_data = tester_get_data();
|
|
int signal_fd[2];
|
|
char buf[1024];
|
|
pid_t pid;
|
|
int len;
|
|
unsigned int i;
|
|
|
|
if (pipe(signal_fd))
|
|
goto failed;
|
|
|
|
pid = fork();
|
|
|
|
if (pid < 0) {
|
|
close(signal_fd[0]);
|
|
close(signal_fd[1]);
|
|
goto failed;
|
|
}
|
|
|
|
if (pid == 0) {
|
|
if (!tester_use_debug())
|
|
fclose(stderr);
|
|
|
|
close(signal_fd[0]);
|
|
emulator(signal_fd[1], test_data->mgmt_index);
|
|
exit(0);
|
|
}
|
|
|
|
close(signal_fd[1]);
|
|
test_data->bluetoothd_pid = pid;
|
|
|
|
len = read(signal_fd[0], buf, sizeof(buf));
|
|
if (len <= 0 || (strcmp(buf, EMULATOR_SIGNAL))) {
|
|
close(signal_fd[0]);
|
|
goto failed;
|
|
}
|
|
|
|
g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, check_for_daemon, test_data,
|
|
NULL);
|
|
|
|
if (!init_ipc()) {
|
|
tester_warn("Cannot initialize IPC mechanism!");
|
|
goto failed;
|
|
}
|
|
tester_print("Will init %d services.", generic_data->num_services);
|
|
|
|
for (i = 0; i < generic_data->num_services; i++)
|
|
if (!setup_module(generic_data->init_services[i])) {
|
|
cleanup_ipc();
|
|
goto failed;
|
|
}
|
|
|
|
test_data->setup_done = true;
|
|
|
|
tester_setup_complete();
|
|
return;
|
|
|
|
failed:
|
|
g_idle_remove_by_data(test_data);
|
|
tester_setup_failed();
|
|
test_post_teardown(data);
|
|
}
|
|
|
|
static void teardown(const void *data)
|
|
{
|
|
struct test_data *test_data = tester_get_data();
|
|
|
|
g_idle_remove_by_data(test_data);
|
|
cleanup_ipc();
|
|
|
|
if (test_data->bluetoothd_pid)
|
|
waitpid(test_data->bluetoothd_pid, NULL, 0);
|
|
|
|
tester_teardown_complete();
|
|
}
|
|
|
|
static void ipc_send_tc(const void *data)
|
|
{
|
|
const struct generic_data *generic_data = data;
|
|
const struct ipc_data *ipc_data = &generic_data->ipc_data;
|
|
|
|
if (ipc_data->len) {
|
|
if (write(cmd_sk, ipc_data->buffer, ipc_data->len) < 0)
|
|
tester_test_failed();
|
|
}
|
|
}
|
|
|
|
#define service_data(args...) { args }
|
|
|
|
#define gen_data(writelen, writebuf, servicelist...) \
|
|
{ \
|
|
.ipc_data = { \
|
|
.buffer = writebuf, \
|
|
.len = writelen, \
|
|
}, \
|
|
.init_services = service_data(servicelist), \
|
|
.num_services = sizeof((const int[]) \
|
|
service_data(servicelist)) / \
|
|
sizeof(int), \
|
|
}
|
|
|
|
#define test_generic(name, test, setup, teardown, buffer, writelen, \
|
|
services...) \
|
|
do { \
|
|
struct test_data *user; \
|
|
static const struct generic_data data = \
|
|
gen_data(writelen, buffer, services); \
|
|
user = g_malloc0(sizeof(struct test_data)); \
|
|
if (!user) \
|
|
break; \
|
|
user->hciemu_type = HCIEMU_TYPE_BREDRLE; \
|
|
tester_add_full(name, &data, test_pre_setup, setup, \
|
|
test, teardown, test_post_teardown, \
|
|
3, user, g_free); \
|
|
} while (0)
|
|
|
|
#define test_opcode_valid(_name, _service, _opcode, _len, _servicelist...) \
|
|
do { \
|
|
static struct ipc_hdr hdr = { \
|
|
.service_id = _service, \
|
|
.opcode = _opcode, \
|
|
.len = _len, \
|
|
}; \
|
|
\
|
|
test_generic("Opcode out of range: "_name, \
|
|
ipc_send_tc, setup, teardown, \
|
|
&hdr, \
|
|
sizeof(hdr), \
|
|
_servicelist); \
|
|
} while (0)
|
|
|
|
struct vardata {
|
|
struct ipc_hdr hdr;
|
|
uint8_t buf[IPC_MTU];
|
|
} __attribute__((packed));
|
|
|
|
#define test_datasize_valid(_name, _service, _opcode, _hlen, _addatasize, \
|
|
_servicelist...) \
|
|
do { \
|
|
static struct vardata vdata = { \
|
|
.hdr.service_id = _service, \
|
|
.hdr.opcode = _opcode, \
|
|
.hdr.len = (_hlen) + (_addatasize), \
|
|
.buf = {}, \
|
|
}; \
|
|
test_generic("Data size "_name, \
|
|
ipc_send_tc, setup, teardown, \
|
|
&vdata, \
|
|
sizeof(vdata.hdr) + (_hlen) + (_addatasize),\
|
|
_servicelist); \
|
|
} while (0)
|
|
|
|
struct regmod_msg register_bt_msg = {
|
|
.header = {
|
|
.service_id = HAL_SERVICE_ID_CORE,
|
|
.opcode = HAL_OP_REGISTER_MODULE,
|
|
.len = sizeof(struct hal_cmd_register_module),
|
|
},
|
|
.cmd = {
|
|
.service_id = HAL_SERVICE_ID_BLUETOOTH,
|
|
},
|
|
};
|
|
|
|
struct regmod_msg register_bt_malformed_size_msg = {
|
|
.header = {
|
|
.service_id = HAL_SERVICE_ID_CORE,
|
|
.opcode = HAL_OP_REGISTER_MODULE,
|
|
/* wrong payload size declared */
|
|
.len = sizeof(struct hal_cmd_register_module) - 1,
|
|
},
|
|
.cmd = {
|
|
.service_id = HAL_SERVICE_ID_CORE,
|
|
},
|
|
};
|
|
|
|
struct malformed_data3_struct {
|
|
struct regmod_msg valid_msg;
|
|
int redundant_data;
|
|
} __attribute__((packed));
|
|
|
|
static struct malformed_data3_struct malformed_data3_msg = {
|
|
/* valid register service message */
|
|
.valid_msg = {
|
|
.header = {
|
|
.service_id = HAL_SERVICE_ID_CORE,
|
|
.opcode = HAL_OP_REGISTER_MODULE,
|
|
.len = sizeof(struct hal_cmd_register_module),
|
|
},
|
|
.cmd = {
|
|
.service_id = HAL_SERVICE_ID_CORE,
|
|
},
|
|
},
|
|
/* plus redundant data */
|
|
. redundant_data = 666,
|
|
};
|
|
|
|
struct ipc_hdr enable_unknown_service_hdr = {
|
|
.service_id = HAL_SERVICE_ID_MAX + 1,
|
|
.opcode = HAL_OP_REGISTER_MODULE,
|
|
.len = 0,
|
|
};
|
|
|
|
struct ipc_hdr enable_bt_service_hdr = {
|
|
.service_id = HAL_SERVICE_ID_BLUETOOTH,
|
|
.opcode = HAL_OP_ENABLE,
|
|
.len = 0,
|
|
};
|
|
|
|
struct bt_set_adapter_prop_data {
|
|
struct ipc_hdr hdr;
|
|
struct hal_cmd_set_adapter_prop prop;
|
|
|
|
/* data placeholder for hal_cmd_set_adapter_prop.val[0] */
|
|
uint8_t buf[IPC_MTU - sizeof(struct ipc_hdr) -
|
|
sizeof(struct hal_cmd_set_adapter_prop)];
|
|
} __attribute__((packed));
|
|
|
|
#define set_name "new name"
|
|
|
|
static struct bt_set_adapter_prop_data bt_set_adapter_prop_data_overs = {
|
|
.hdr.service_id = HAL_SERVICE_ID_BLUETOOTH,
|
|
.hdr.opcode = HAL_OP_SET_ADAPTER_PROP,
|
|
.hdr.len = sizeof(struct hal_cmd_set_adapter_prop) +
|
|
sizeof(set_name),
|
|
|
|
.prop.type = HAL_PROP_ADAPTER_NAME,
|
|
/* declare wrong descriptor length */
|
|
.prop.len = sizeof(set_name) + 1,
|
|
/* init prop.val[0] */
|
|
.buf = set_name,
|
|
};
|
|
|
|
static struct bt_set_adapter_prop_data bt_set_adapter_prop_data_unders = {
|
|
.hdr.service_id = HAL_SERVICE_ID_BLUETOOTH,
|
|
.hdr.opcode = HAL_OP_SET_ADAPTER_PROP,
|
|
.hdr.len = sizeof(struct hal_cmd_set_adapter_prop) +
|
|
sizeof(set_name),
|
|
|
|
.prop.type = HAL_PROP_ADAPTER_NAME,
|
|
/* declare wrong descriptor length */
|
|
.prop.len = sizeof(set_name) - 1,
|
|
/* init prop.val[0] */
|
|
.buf = set_name,
|
|
};
|
|
|
|
struct bt_set_remote_prop_data {
|
|
struct ipc_hdr hdr;
|
|
struct hal_cmd_set_remote_device_prop prop;
|
|
|
|
/* data placeholder for hal_cmd_set_remote_device_prop.val[0] */
|
|
uint8_t buf[IPC_MTU - sizeof(struct ipc_hdr) -
|
|
sizeof(struct hal_cmd_set_remote_device_prop)];
|
|
} __attribute__((packed));
|
|
|
|
static struct bt_set_remote_prop_data bt_set_remote_prop_data_overs = {
|
|
.hdr.service_id = HAL_SERVICE_ID_BLUETOOTH,
|
|
.hdr.opcode = HAL_OP_SET_REMOTE_DEVICE_PROP,
|
|
.hdr.len = sizeof(struct hal_cmd_set_remote_device_prop) +
|
|
sizeof(set_name),
|
|
|
|
.prop.bdaddr = {},
|
|
.prop.type = HAL_PROP_DEVICE_NAME,
|
|
/* declare wrong descriptor length */
|
|
.prop.len = sizeof(set_name) + 1,
|
|
.buf = set_name,
|
|
};
|
|
|
|
static struct bt_set_remote_prop_data bt_set_remote_prop_data_unders = {
|
|
.hdr.service_id = HAL_SERVICE_ID_BLUETOOTH,
|
|
.hdr.opcode = HAL_OP_SET_REMOTE_DEVICE_PROP,
|
|
.hdr.len = sizeof(struct hal_cmd_set_remote_device_prop) +
|
|
sizeof(set_name),
|
|
|
|
.prop.bdaddr = {},
|
|
.prop.type = HAL_PROP_DEVICE_NAME,
|
|
/* declare wrong descriptor length */
|
|
.prop.len = sizeof(set_name) - 1,
|
|
.buf = set_name,
|
|
};
|
|
|
|
struct hidhost_set_info_data {
|
|
struct ipc_hdr hdr;
|
|
struct hal_cmd_hidhost_set_info info;
|
|
|
|
/* data placeholder for hal_cmd_hidhost_set_info.descr[0] field */
|
|
uint8_t buf[IPC_MTU - sizeof(struct ipc_hdr) -
|
|
sizeof(struct hal_cmd_hidhost_set_info)];
|
|
} __attribute__((packed));
|
|
|
|
#define set_info_data "some descriptor"
|
|
|
|
static struct hidhost_set_info_data hidhost_set_info_data_overs = {
|
|
.hdr.service_id = HAL_SERVICE_ID_HIDHOST,
|
|
.hdr.opcode = HAL_OP_HIDHOST_SET_INFO,
|
|
.hdr.len = sizeof(struct hal_cmd_hidhost_set_info) +
|
|
sizeof(set_info_data),
|
|
|
|
/* declare wrong descriptor length */
|
|
.info.descr_len = sizeof(set_info_data) + 1,
|
|
/* init .info.descr[0] */
|
|
.buf = set_info_data,
|
|
};
|
|
|
|
static struct hidhost_set_info_data hidhost_set_info_data_unders = {
|
|
.hdr.service_id = HAL_SERVICE_ID_HIDHOST,
|
|
.hdr.opcode = HAL_OP_HIDHOST_SET_INFO,
|
|
.hdr.len = sizeof(struct hal_cmd_hidhost_set_info) +
|
|
sizeof(set_info_data),
|
|
|
|
/* declare wrong descriptor length */
|
|
.info.descr_len = sizeof(set_info_data) - 1,
|
|
/* init .info.descr[0] */
|
|
.buf = set_info_data,
|
|
};
|
|
|
|
struct hidhost_set_report_data {
|
|
struct ipc_hdr hdr;
|
|
struct hal_cmd_hidhost_set_report report;
|
|
|
|
/* data placeholder for hal_cmd_hidhost_set_report.data[0] field */
|
|
uint8_t buf[IPC_MTU - sizeof(struct ipc_hdr) -
|
|
sizeof(struct hal_cmd_hidhost_set_report)];
|
|
} __attribute__((packed));
|
|
|
|
#define set_rep_data "1234567890"
|
|
|
|
static struct hidhost_set_report_data hidhost_set_report_data_overs = {
|
|
.hdr.service_id = HAL_SERVICE_ID_HIDHOST,
|
|
.hdr.opcode = HAL_OP_HIDHOST_SET_REPORT,
|
|
.hdr.len = sizeof(struct hal_cmd_hidhost_set_report) +
|
|
sizeof(set_rep_data),
|
|
|
|
/* declare wrong descriptor length */
|
|
.report.len = sizeof(set_rep_data) + 1,
|
|
/* init report.data[0] */
|
|
.buf = set_rep_data,
|
|
};
|
|
|
|
static struct hidhost_set_report_data hidhost_set_report_data_unders = {
|
|
.hdr.service_id = HAL_SERVICE_ID_HIDHOST,
|
|
.hdr.opcode = HAL_OP_HIDHOST_SET_REPORT,
|
|
.hdr.len = sizeof(struct hal_cmd_hidhost_set_report) +
|
|
sizeof(set_rep_data),
|
|
|
|
/* declare wrong descriptor length */
|
|
.report.len = sizeof(set_rep_data) - 1,
|
|
/* init report.data[0] */
|
|
.buf = set_rep_data,
|
|
};
|
|
|
|
struct hidhost_send_data_data {
|
|
struct ipc_hdr hdr;
|
|
struct hal_cmd_hidhost_send_data hiddata;
|
|
|
|
/* data placeholder for hal_cmd_hidhost_send_data.data[0] field */
|
|
uint8_t buf[IPC_MTU - sizeof(struct ipc_hdr) -
|
|
sizeof(struct hal_cmd_hidhost_send_data)];
|
|
} __attribute__((packed));
|
|
|
|
#define send_data_data "1234567890"
|
|
|
|
static struct hidhost_send_data_data hidhost_send_data_overs = {
|
|
.hdr.service_id = HAL_SERVICE_ID_HIDHOST,
|
|
.hdr.opcode = HAL_OP_HIDHOST_SEND_DATA,
|
|
.hdr.len = sizeof(struct hal_cmd_hidhost_send_data) +
|
|
sizeof(send_data_data),
|
|
|
|
/* declare wrong descriptor length */
|
|
.hiddata.len = sizeof(send_data_data) + 1,
|
|
/* init .hiddata.data[0] */
|
|
.buf = send_data_data,
|
|
};
|
|
|
|
static struct hidhost_send_data_data hidhost_send_data_unders = {
|
|
.hdr.service_id = HAL_SERVICE_ID_HIDHOST,
|
|
.hdr.opcode = HAL_OP_HIDHOST_SEND_DATA,
|
|
.hdr.len = sizeof(struct hal_cmd_hidhost_send_data) +
|
|
sizeof(send_data_data),
|
|
|
|
/* declare wrong descriptor length */
|
|
.hiddata.len = sizeof(send_data_data) - 1,
|
|
/* init .hiddata.data[0] */
|
|
.buf = send_data_data,
|
|
};
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
snprintf(exec_dir, sizeof(exec_dir), "%s", dirname(argv[0]));
|
|
|
|
tester_init(&argc, &argv);
|
|
|
|
/* check general IPC errors */
|
|
test_generic("Too small data",
|
|
ipc_send_tc, setup, teardown,
|
|
®ister_bt_msg, 1);
|
|
|
|
test_generic("Malformed data (wrong payload declared)",
|
|
ipc_send_tc, setup, teardown,
|
|
®ister_bt_malformed_size_msg,
|
|
sizeof(register_bt_malformed_size_msg),
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
|
|
test_generic("Malformed data2 (undersized msg)",
|
|
ipc_send_tc, setup, teardown,
|
|
®ister_bt_msg,
|
|
sizeof(register_bt_msg) - 1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
|
|
test_generic("Malformed data3 (oversized msg)",
|
|
ipc_send_tc, setup, teardown,
|
|
&malformed_data3_msg,
|
|
sizeof(malformed_data3_msg),
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
|
|
test_generic("Invalid service",
|
|
ipc_send_tc, setup, teardown,
|
|
&enable_unknown_service_hdr,
|
|
sizeof(enable_unknown_service_hdr),
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
|
|
test_generic("Enable unregistered service",
|
|
ipc_send_tc, setup, teardown,
|
|
&enable_bt_service_hdr,
|
|
sizeof(enable_bt_service_hdr));
|
|
|
|
/* check service handler's max opcode value */
|
|
test_opcode_valid("CORE", HAL_SERVICE_ID_CORE, 0x03, 0);
|
|
|
|
test_opcode_valid("BLUETOOTH", HAL_SERVICE_ID_BLUETOOTH, 0x15, 0,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
|
|
test_opcode_valid("SOCK", HAL_SERVICE_ID_SOCKET, 0x03, 0,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_SOCKET);
|
|
|
|
test_opcode_valid("HIDHOST", HAL_SERVICE_ID_HIDHOST, 0x10, 0,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_HIDHOST);
|
|
|
|
test_opcode_valid("PAN", HAL_SERVICE_ID_PAN, 0x05, 0,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_PAN);
|
|
|
|
test_opcode_valid("A2DP", HAL_SERVICE_ID_A2DP, 0x03, 0,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_A2DP);
|
|
|
|
/* check for valid data size */
|
|
test_datasize_valid("CORE Register+", HAL_SERVICE_ID_CORE,
|
|
HAL_OP_REGISTER_MODULE,
|
|
sizeof(struct hal_cmd_register_module), 1);
|
|
test_datasize_valid("CORE Register-", HAL_SERVICE_ID_CORE,
|
|
HAL_OP_REGISTER_MODULE,
|
|
sizeof(struct hal_cmd_register_module), -1);
|
|
test_datasize_valid("CORE Unregister+", HAL_SERVICE_ID_CORE,
|
|
HAL_OP_UNREGISTER_MODULE,
|
|
sizeof(struct hal_cmd_unregister_module), 1);
|
|
test_datasize_valid("CORE Unregister-", HAL_SERVICE_ID_CORE,
|
|
HAL_OP_UNREGISTER_MODULE,
|
|
sizeof(struct hal_cmd_unregister_module), -1);
|
|
|
|
/* check for valid data size for BLUETOOTH */
|
|
test_datasize_valid("BT Enable+", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_ENABLE,
|
|
0, 1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_datasize_valid("BT Disable+", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_DISABLE,
|
|
0, 1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_datasize_valid("BT Get Adapter Props+", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_GET_ADAPTER_PROPS,
|
|
0, 1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_datasize_valid("BT Get Adapter Prop+", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_GET_ADAPTER_PROP,
|
|
sizeof(struct hal_cmd_get_adapter_prop), 1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_datasize_valid("BT Get Adapter Prop-", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_GET_ADAPTER_PROP,
|
|
sizeof(struct hal_cmd_get_adapter_prop), -1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_datasize_valid("BT Set Adapter Prop+", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_SET_ADAPTER_PROP,
|
|
sizeof(struct hal_cmd_set_adapter_prop), 1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_datasize_valid("BT Set Adapter Prop-", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_SET_ADAPTER_PROP,
|
|
sizeof(struct hal_cmd_set_adapter_prop), -1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_generic("Data size BT Set Adapter Prop Vardata+",
|
|
ipc_send_tc, setup, teardown,
|
|
&bt_set_adapter_prop_data_overs,
|
|
(sizeof(struct ipc_hdr) +
|
|
sizeof(struct hal_cmd_set_adapter_prop) +
|
|
sizeof(set_name)),
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_generic("Data size BT Set Adapter Prop Vardata+",
|
|
ipc_send_tc, setup, teardown,
|
|
&bt_set_adapter_prop_data_unders,
|
|
(sizeof(struct ipc_hdr) +
|
|
sizeof(struct hal_cmd_set_adapter_prop) +
|
|
sizeof(set_name)),
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_datasize_valid("BT Get Remote Props+", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_GET_REMOTE_DEVICE_PROPS,
|
|
sizeof(struct hal_cmd_get_remote_device_props), 1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_datasize_valid("BT Get Remote Props-", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_GET_REMOTE_DEVICE_PROPS,
|
|
sizeof(struct hal_cmd_get_remote_device_props), -1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_datasize_valid("BT Get Remote Prop+", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_GET_REMOTE_DEVICE_PROP,
|
|
sizeof(struct hal_cmd_get_remote_device_prop), 1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_datasize_valid("BT Get Remote Prop-", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_GET_REMOTE_DEVICE_PROP,
|
|
sizeof(struct hal_cmd_get_remote_device_prop), -1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_datasize_valid("BT Set Remote Prop+", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_SET_REMOTE_DEVICE_PROP,
|
|
sizeof(struct hal_cmd_set_remote_device_prop), 1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_datasize_valid("BT Set Remote Prop-", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_SET_REMOTE_DEVICE_PROP,
|
|
sizeof(struct hal_cmd_set_remote_device_prop), -1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_generic("Data size BT Set Remote Prop Vardata+",
|
|
ipc_send_tc, setup, teardown,
|
|
&bt_set_remote_prop_data_overs,
|
|
(sizeof(struct ipc_hdr) +
|
|
sizeof(struct hal_cmd_set_remote_device_prop) +
|
|
sizeof(set_name)),
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_generic("Data size BT Set Remote Prop Vardata-",
|
|
ipc_send_tc, setup, teardown,
|
|
&bt_set_remote_prop_data_unders,
|
|
(sizeof(struct ipc_hdr) +
|
|
sizeof(struct hal_cmd_set_remote_device_prop) +
|
|
sizeof(set_name)),
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_datasize_valid("BT Get Remote SV Rec+", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_GET_REMOTE_SERVICE_REC,
|
|
sizeof(struct hal_cmd_get_remote_service_rec), 1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_datasize_valid("BT Get Remote SV Rec-", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_GET_REMOTE_SERVICE_REC,
|
|
sizeof(struct hal_cmd_get_remote_service_rec), -1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_datasize_valid("BT Get Remote Services+", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_GET_REMOTE_SERVICES,
|
|
sizeof(struct hal_cmd_get_remote_services), 1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_datasize_valid("BT Get Remote Services-", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_GET_REMOTE_SERVICES,
|
|
sizeof(struct hal_cmd_get_remote_services), -1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_datasize_valid("BT Start Discovery+", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_START_DISCOVERY,
|
|
0, 1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_datasize_valid("BT Cancel Discovery+", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_CANCEL_DISCOVERY,
|
|
0, 1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_datasize_valid("BT Create Bond+", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_CREATE_BOND,
|
|
sizeof(struct hal_cmd_create_bond), 1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_datasize_valid("BT Create Bond-", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_CREATE_BOND,
|
|
sizeof(struct hal_cmd_create_bond), -1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_datasize_valid("BT Remove Bond+", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_REMOVE_BOND,
|
|
sizeof(struct hal_cmd_remove_bond), 1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_datasize_valid("BT Remove Bond-", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_REMOVE_BOND,
|
|
sizeof(struct hal_cmd_remove_bond), -1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_datasize_valid("BT Cancel Bond+", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_CANCEL_BOND,
|
|
sizeof(struct hal_cmd_cancel_bond), 1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_datasize_valid("BT Cancel Bond-", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_CANCEL_BOND,
|
|
sizeof(struct hal_cmd_cancel_bond), -1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_datasize_valid("BT Pin Reply+", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_PIN_REPLY,
|
|
sizeof(struct hal_cmd_pin_reply), 1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_datasize_valid("BT Pin Reply-", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_PIN_REPLY,
|
|
sizeof(struct hal_cmd_pin_reply), -1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_datasize_valid("BT SSP Reply+", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_SSP_REPLY,
|
|
sizeof(struct hal_cmd_ssp_reply), 1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_datasize_valid("BT SSP Reply-", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_SSP_REPLY,
|
|
sizeof(struct hal_cmd_ssp_reply), -1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_datasize_valid("BT DUT Mode Conf+", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_DUT_MODE_CONF,
|
|
sizeof(struct hal_cmd_dut_mode_conf), 1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_datasize_valid("BT DUT Mode Conf-", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_DUT_MODE_CONF,
|
|
sizeof(struct hal_cmd_dut_mode_conf), -1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_datasize_valid("BT DUT Mode Send+", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_DUT_MODE_SEND,
|
|
sizeof(struct hal_cmd_dut_mode_send), 1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_datasize_valid("BT DUT Mode Send-", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_DUT_MODE_SEND,
|
|
sizeof(struct hal_cmd_dut_mode_send), -1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_datasize_valid("BT LE Test+", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_LE_TEST_MODE,
|
|
sizeof(struct hal_cmd_le_test_mode), 1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
test_datasize_valid("BT LE Test-", HAL_SERVICE_ID_BLUETOOTH,
|
|
HAL_OP_LE_TEST_MODE,
|
|
sizeof(struct hal_cmd_le_test_mode), -1,
|
|
HAL_SERVICE_ID_BLUETOOTH);
|
|
|
|
/* check for valid data size for SOCK */
|
|
test_datasize_valid("SOCKET Listen+", HAL_SERVICE_ID_SOCKET,
|
|
HAL_OP_SOCKET_LISTEN,
|
|
sizeof(struct hal_cmd_socket_listen), 1,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_SOCKET);
|
|
test_datasize_valid("SOCKET Listen-", HAL_SERVICE_ID_SOCKET,
|
|
HAL_OP_SOCKET_LISTEN,
|
|
sizeof(struct hal_cmd_socket_listen), -1,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_SOCKET);
|
|
test_datasize_valid("SOCKET Connect+", HAL_SERVICE_ID_SOCKET,
|
|
HAL_OP_SOCKET_CONNECT,
|
|
sizeof(struct hal_cmd_socket_connect), 1,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_SOCKET);
|
|
test_datasize_valid("SOCKET Connect-", HAL_SERVICE_ID_SOCKET,
|
|
HAL_OP_SOCKET_CONNECT,
|
|
sizeof(struct hal_cmd_socket_connect), -1,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_SOCKET);
|
|
|
|
/* check for valid data size for HID Host */
|
|
test_datasize_valid("HIDHOST Connect+", HAL_SERVICE_ID_HIDHOST,
|
|
HAL_OP_HIDHOST_CONNECT,
|
|
sizeof(struct hal_cmd_hidhost_connect), 1,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_HIDHOST);
|
|
test_datasize_valid("HIDHOST Connect-", HAL_SERVICE_ID_HIDHOST,
|
|
HAL_OP_HIDHOST_CONNECT,
|
|
sizeof(struct hal_cmd_hidhost_connect), -1,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_HIDHOST);
|
|
test_datasize_valid("HIDHOST Disconnect+", HAL_SERVICE_ID_HIDHOST,
|
|
HAL_OP_HIDHOST_DISCONNECT,
|
|
sizeof(struct hal_cmd_hidhost_disconnect), 1,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_HIDHOST);
|
|
test_datasize_valid("HIDHOST Disconnect-", HAL_SERVICE_ID_HIDHOST,
|
|
HAL_OP_HIDHOST_DISCONNECT,
|
|
sizeof(struct hal_cmd_hidhost_disconnect), -1,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_HIDHOST);
|
|
test_datasize_valid("HIDHOST Virt. Unplug+", HAL_SERVICE_ID_HIDHOST,
|
|
HAL_OP_HIDHOST_VIRTUAL_UNPLUG,
|
|
sizeof(struct hal_cmd_hidhost_virtual_unplug), 1,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_HIDHOST);
|
|
test_datasize_valid("HIDHOST Virt. Unplug-", HAL_SERVICE_ID_HIDHOST,
|
|
HAL_OP_HIDHOST_VIRTUAL_UNPLUG,
|
|
sizeof(struct hal_cmd_hidhost_virtual_unplug), -1,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_HIDHOST);
|
|
test_datasize_valid("HIDHOST Set Info+", HAL_SERVICE_ID_HIDHOST,
|
|
HAL_OP_HIDHOST_SET_INFO,
|
|
sizeof(struct hal_cmd_hidhost_set_info), 1,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_HIDHOST);
|
|
test_datasize_valid("HIDHOST Set Info-", HAL_SERVICE_ID_HIDHOST,
|
|
HAL_OP_HIDHOST_SET_INFO,
|
|
sizeof(struct hal_cmd_hidhost_set_info), -1,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_HIDHOST);
|
|
test_generic("Data size HIDHOST Set Info Vardata+",
|
|
ipc_send_tc, setup, teardown,
|
|
&hidhost_set_info_data_overs,
|
|
(sizeof(struct ipc_hdr) +
|
|
sizeof(struct hal_cmd_hidhost_set_info) +
|
|
sizeof(set_info_data)),
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_HIDHOST);
|
|
test_generic("Data size HIDHOST Set Info Vardata-",
|
|
ipc_send_tc, setup, teardown,
|
|
&hidhost_set_info_data_unders,
|
|
(sizeof(struct ipc_hdr) +
|
|
sizeof(struct hal_cmd_hidhost_set_info) +
|
|
sizeof(set_info_data)),
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_HIDHOST);
|
|
test_datasize_valid("HIDHOST Get Protocol+", HAL_SERVICE_ID_HIDHOST,
|
|
HAL_OP_HIDHOST_GET_PROTOCOL,
|
|
sizeof(struct hal_cmd_hidhost_get_protocol), 1,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_HIDHOST);
|
|
test_datasize_valid("HIDHOST Get Protocol-", HAL_SERVICE_ID_HIDHOST,
|
|
HAL_OP_HIDHOST_GET_PROTOCOL,
|
|
sizeof(struct hal_cmd_hidhost_get_protocol), -1,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_HIDHOST);
|
|
test_datasize_valid("HIDHOST Set Protocol+", HAL_SERVICE_ID_HIDHOST,
|
|
HAL_OP_HIDHOST_SET_PROTOCOL,
|
|
sizeof(struct hal_cmd_hidhost_set_protocol), 1,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_HIDHOST);
|
|
test_datasize_valid("HIDHOST Set Protocol-", HAL_SERVICE_ID_HIDHOST,
|
|
HAL_OP_HIDHOST_SET_PROTOCOL,
|
|
sizeof(struct hal_cmd_hidhost_set_protocol), -1,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_HIDHOST);
|
|
test_datasize_valid("HIDHOST Get Report+", HAL_SERVICE_ID_HIDHOST,
|
|
HAL_OP_HIDHOST_GET_REPORT,
|
|
sizeof(struct hal_cmd_hidhost_get_report), 1,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_HIDHOST);
|
|
test_datasize_valid("HIDHOST Get Report-", HAL_SERVICE_ID_HIDHOST,
|
|
HAL_OP_HIDHOST_GET_REPORT,
|
|
sizeof(struct hal_cmd_hidhost_get_report), -1,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_HIDHOST);
|
|
test_datasize_valid("HIDHOST Set Report+", HAL_SERVICE_ID_HIDHOST,
|
|
HAL_OP_HIDHOST_SET_REPORT,
|
|
sizeof(struct hal_cmd_hidhost_set_report), 1,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_HIDHOST);
|
|
test_datasize_valid("HIDHOST Set Report-", HAL_SERVICE_ID_HIDHOST,
|
|
HAL_OP_HIDHOST_SET_REPORT,
|
|
sizeof(struct hal_cmd_hidhost_set_report), -1,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_HIDHOST);
|
|
test_generic("Data size HIDHOST Set Report Vardata+",
|
|
ipc_send_tc, setup, teardown,
|
|
&hidhost_set_report_data_overs,
|
|
(sizeof(struct ipc_hdr) +
|
|
sizeof(struct hal_cmd_hidhost_set_report) +
|
|
sizeof(set_rep_data)),
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_HIDHOST);
|
|
test_generic("Data size HIDHOST Set Report Vardata-",
|
|
ipc_send_tc, setup, teardown,
|
|
&hidhost_set_report_data_unders,
|
|
(sizeof(struct ipc_hdr) +
|
|
sizeof(struct hal_cmd_hidhost_set_report) +
|
|
sizeof(set_rep_data)),
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_HIDHOST);
|
|
test_datasize_valid("HIDHOST Send Data+", HAL_SERVICE_ID_HIDHOST,
|
|
HAL_OP_HIDHOST_SEND_DATA,
|
|
sizeof(struct hal_cmd_hidhost_send_data), 1,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_HIDHOST);
|
|
test_datasize_valid("HIDHOST Send Data-", HAL_SERVICE_ID_HIDHOST,
|
|
HAL_OP_HIDHOST_SEND_DATA,
|
|
sizeof(struct hal_cmd_hidhost_send_data), -1,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_HIDHOST);
|
|
test_generic("Data size HIDHOST Send Vardata+",
|
|
ipc_send_tc, setup, teardown,
|
|
&hidhost_send_data_overs,
|
|
(sizeof(struct ipc_hdr) +
|
|
sizeof(struct hal_cmd_hidhost_send_data) +
|
|
sizeof(send_data_data)),
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_HIDHOST);
|
|
test_generic("Data size HIDHOST Send Vardata-",
|
|
ipc_send_tc, setup, teardown,
|
|
&hidhost_send_data_unders,
|
|
(sizeof(struct ipc_hdr) +
|
|
sizeof(struct hal_cmd_hidhost_send_data) +
|
|
sizeof(send_data_data)),
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_HIDHOST);
|
|
|
|
/* check for valid data size for PAN */
|
|
test_datasize_valid("PAN Enable+", HAL_SERVICE_ID_PAN,
|
|
HAL_OP_PAN_ENABLE,
|
|
sizeof(struct hal_cmd_pan_enable), 1,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_PAN);
|
|
test_datasize_valid("PAN Enable-", HAL_SERVICE_ID_PAN,
|
|
HAL_OP_PAN_ENABLE,
|
|
sizeof(struct hal_cmd_pan_enable), -1,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_PAN);
|
|
test_datasize_valid("PAN Get Role+", HAL_SERVICE_ID_PAN,
|
|
HAL_OP_PAN_GET_ROLE,
|
|
0, 1,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_PAN);
|
|
test_datasize_valid("PAN Connect+", HAL_SERVICE_ID_PAN,
|
|
HAL_OP_PAN_CONNECT,
|
|
sizeof(struct hal_cmd_pan_connect), 1,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_PAN);
|
|
test_datasize_valid("PAN Connect-", HAL_SERVICE_ID_PAN,
|
|
HAL_OP_PAN_CONNECT,
|
|
sizeof(struct hal_cmd_pan_connect), -1,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_PAN);
|
|
test_datasize_valid("PAN Disconnect+", HAL_SERVICE_ID_PAN,
|
|
HAL_OP_PAN_DISCONNECT,
|
|
sizeof(struct hal_cmd_pan_disconnect), 1,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_PAN);
|
|
test_datasize_valid("PAN Disconnect-", HAL_SERVICE_ID_PAN,
|
|
HAL_OP_PAN_DISCONNECT,
|
|
sizeof(struct hal_cmd_pan_disconnect), -1,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_PAN);
|
|
|
|
/* check for valid data size for A2DP */
|
|
test_datasize_valid("A2DP Connect+", HAL_SERVICE_ID_A2DP,
|
|
HAL_OP_A2DP_CONNECT,
|
|
sizeof(struct hal_cmd_a2dp_connect), 1,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_A2DP);
|
|
test_datasize_valid("A2DP Connect-", HAL_SERVICE_ID_A2DP,
|
|
HAL_OP_A2DP_CONNECT,
|
|
sizeof(struct hal_cmd_a2dp_connect), -1,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_A2DP);
|
|
test_datasize_valid("A2DP Disconnect+", HAL_SERVICE_ID_A2DP,
|
|
HAL_OP_A2DP_DISCONNECT,
|
|
sizeof(struct hal_cmd_a2dp_disconnect), 1,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_A2DP);
|
|
test_datasize_valid("A2DP Disconnect-", HAL_SERVICE_ID_A2DP,
|
|
HAL_OP_A2DP_DISCONNECT,
|
|
sizeof(struct hal_cmd_a2dp_disconnect), -1,
|
|
HAL_SERVICE_ID_BLUETOOTH, HAL_SERVICE_ID_A2DP);
|
|
|
|
return tester_run();
|
|
}
|