blob: ac921a9a05538cb132d8b9f715d935f42cdf2b6e [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 <unistd.h>
#include <stdlib.h>
#include <stdbool.h>
#include <sys/socket.h>
#include <glib.h>
#include "lib/bluetooth.h"
#include "lib/sdp.h"
#include "lib/sdp_lib.h"
#include "src/shared/util.h"
#include "src/shared/tester.h"
#include "src/log.h"
#include "src/sdpd.h"
struct sdp_pdu {
bool valid;
const void *raw_data;
size_t raw_size;
uint8_t cont_len;
};
struct test_data {
int mtu;
struct sdp_pdu *pdu_list;
};
#define raw_data(args...) ((const unsigned char[]) { args })
#define build_u128(args...) ((const uint128_t) { .data = { args } })
#define raw_pdu(args...) \
{ \
.valid = true, \
.raw_data = raw_data(args), \
.raw_size = sizeof(raw_data(args)), \
}
#define raw_pdu_cont(cont, args...) \
{ \
.valid = true, \
.raw_data = raw_data(args), \
.raw_size = sizeof(raw_data(args)), \
.cont_len = cont, \
}
#define define_test(name, _mtu, args...) \
do { \
const struct sdp_pdu pdus[] = { \
args, { } \
}; \
static struct test_data data; \
data.mtu = _mtu; \
data.pdu_list = g_memdup(pdus, sizeof(pdus)); \
tester_add(name, &data, NULL, test_sdp, NULL); \
} while (0)
#define define_ss(name, args...) define_test("/TP/SERVER/SS/" name, 48, args)
#define define_sa(name, args...) define_test("/TP/SERVER/SA/" name, 48, args)
#define define_ssa(name, args...) define_test("/TP/SERVER/SSA/" name, 48, args)
#define define_brw(name, args...) define_test("/TP/SERVER/BRW/" name, 672, args)
/* SDP Data Element (DE) tests */
struct test_data_de {
const void *input_data;
size_t input_size;
sdp_data_t expected;
};
#define exp_data(_dtd, val_type, val_data) \
((const sdp_data_t) { \
.dtd = _dtd, \
.val.val_type = val_data, \
})
#define define_test_de_attr(name, input, exp) \
do { \
static struct test_data_de data; \
data.input_data = input; \
data.input_size = sizeof(input); \
data.expected = exp; \
tester_add("/sdp/DE/ATTR/" name, &data, NULL, \
test_sdp_de_attr, NULL); \
} while (0)
struct context {
guint server_source;
guint client_source;
int fd;
uint8_t cont_data[16];
uint8_t cont_size;
unsigned int pdu_offset;
const struct test_data *data;
};
static void sdp_debug(const char *str, void *user_data)
{
const char *prefix = user_data;
tester_debug("%s%s\n", prefix, str);
}
static void destroy_context(struct context *context)
{
sdp_svcdb_collect_all(context->fd);
sdp_svcdb_reset();
g_source_remove(context->server_source);
g_source_remove(context->client_source);
g_free(context);
}
static gboolean context_quit(gpointer user_data)
{
struct context *context = user_data;
if (context == NULL)
return FALSE;
destroy_context(context);
tester_test_passed();
return FALSE;
}
static gboolean server_handler(GIOChannel *channel, GIOCondition cond,
gpointer user_data)
{
struct context *context = user_data;
sdp_pdu_hdr_t hdr;
void *buf;
size_t size;
ssize_t len;
int fd;
fd = g_io_channel_unix_get_fd(channel);
if (cond & (G_IO_NVAL | G_IO_ERR | G_IO_HUP)) {
sdp_svcdb_collect_all(fd);
return FALSE;
}
len = recv(fd, &hdr, sizeof(sdp_pdu_hdr_t), MSG_PEEK);
if (len != sizeof(sdp_pdu_hdr_t)) {
sdp_svcdb_collect_all(fd);
return FALSE;
}
size = sizeof(sdp_pdu_hdr_t) + ntohs(hdr.plen);
buf = malloc(size);
if (!buf)
return TRUE;
len = recv(fd, buf, size, 0);
if (len <= 0) {
sdp_svcdb_collect_all(fd);
free(buf);
return FALSE;
}
util_hexdump('<', buf, len, sdp_debug, "SDP: ");
handle_internal_request(fd, context->data->mtu, buf, len);
return TRUE;
}
static gboolean send_pdu(gpointer user_data)
{
struct context *context = user_data;
const struct sdp_pdu *req_pdu;
uint16_t pdu_len;
unsigned char *buf;
ssize_t len;
req_pdu = &context->data->pdu_list[context->pdu_offset];
pdu_len = req_pdu->raw_size + context->cont_size;
buf = g_malloc0(pdu_len);
memcpy(buf, req_pdu->raw_data, req_pdu->raw_size);
if (context->cont_size > 0)
memcpy(buf + req_pdu->raw_size, context->cont_data,
context->cont_size);
len = write(context->fd, buf, pdu_len);
g_free(buf);
g_assert(len == pdu_len);
return FALSE;
}
static void context_increment(struct context *context)
{
context->pdu_offset += 2;
if (!context->data->pdu_list[context->pdu_offset].valid) {
context_quit(context);
return;
}
g_idle_add(send_pdu, context);
}
static gboolean client_handler(GIOChannel *channel, GIOCondition cond,
gpointer user_data)
{
struct context *context = user_data;
const struct sdp_pdu *rsp_pdu;
unsigned char buf[512];
ssize_t len;
int fd;
rsp_pdu = &context->data->pdu_list[context->pdu_offset + 1];
if (cond & (G_IO_NVAL | G_IO_ERR | G_IO_HUP))
return FALSE;
fd = g_io_channel_unix_get_fd(channel);
len = read(fd, buf, sizeof(buf));
if (len < 0)
return FALSE;
util_hexdump('>', buf, len, sdp_debug, "SDP: ");
g_assert(len > 0);
g_assert((size_t) len == rsp_pdu->raw_size + rsp_pdu->cont_len);
g_assert(memcmp(buf, rsp_pdu->raw_data, rsp_pdu->raw_size) == 0);
if (rsp_pdu->cont_len > 0)
memcpy(context->cont_data, buf + rsp_pdu->raw_size,
rsp_pdu->cont_len);
context->cont_size = rsp_pdu->cont_len;
context_increment(context);
return TRUE;
}
static void update_db_timestamp(void)
{
}
static void register_serial_port(void)
{
sdp_list_t *svclass_id, *apseq, *proto[2], *profiles, *root, *aproto;
uuid_t root_uuid, sp_uuid, l2cap, rfcomm;
sdp_profile_desc_t profile;
uint8_t u8 = 1;
sdp_data_t *sdp_data, *channel;
sdp_record_t *record = sdp_record_alloc();
record->handle = sdp_next_handle();
sdp_record_add(BDADDR_ANY, record);
sdp_data = sdp_data_alloc(SDP_UINT32, &record->handle);
sdp_attr_add(record, SDP_ATTR_RECORD_HANDLE, sdp_data);
sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP);
root = sdp_list_append(0, &root_uuid);
sdp_set_browse_groups(record, root);
sdp_list_free(root, 0);
sdp_uuid16_create(&sp_uuid, SERIAL_PORT_SVCLASS_ID);
svclass_id = sdp_list_append(0, &sp_uuid);
sdp_set_service_classes(record, svclass_id);
sdp_list_free(svclass_id, 0);
sdp_uuid16_create(&profile.uuid, SERIAL_PORT_PROFILE_ID);
profile.version = 0x0100;
profiles = sdp_list_append(0, &profile);
sdp_set_profile_descs(record, profiles);
sdp_list_free(profiles, 0);
sdp_uuid16_create(&l2cap, L2CAP_UUID);
proto[0] = sdp_list_append(0, &l2cap);
apseq = sdp_list_append(0, proto[0]);
sdp_uuid16_create(&rfcomm, RFCOMM_UUID);
proto[1] = sdp_list_append(0, &rfcomm);
channel = sdp_data_alloc(SDP_UINT8, &u8);
proto[1] = sdp_list_append(proto[1], channel);
apseq = sdp_list_append(apseq, proto[1]);
aproto = sdp_list_append(0, apseq);
sdp_set_access_protos(record, aproto);
sdp_add_lang_attr(record);
sdp_set_info_attr(record, "Serial Port", "BlueZ", "COM Port");
sdp_set_url_attr(record, "http://www.bluez.org/",
"http://www.bluez.org/", "http://www.bluez.org/");
sdp_set_service_id(record, sp_uuid);
sdp_set_service_ttl(record, 0xffff);
sdp_set_service_avail(record, 0xff);
sdp_set_record_state(record, 0x00001234);
sdp_data_free(channel);
sdp_list_free(proto[0], 0);
sdp_list_free(proto[1], 0);
sdp_list_free(apseq, 0);
sdp_list_free(aproto, 0);
update_db_timestamp();
}
static void register_object_push(void)
{
sdp_list_t *svclass_id, *pfseq, *apseq, *root;
uuid_t root_uuid, opush_uuid, l2cap_uuid, rfcomm_uuid, obex_uuid;
sdp_profile_desc_t profile[1];
sdp_list_t *aproto, *proto[3];
uint8_t chan = 9;
sdp_data_t *channel;
uint8_t formats[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0xff };
void *dtds[sizeof(formats)], *values[sizeof(formats)];
unsigned int i;
uint8_t dtd = SDP_UINT8;
sdp_data_t *sdp_data, *sflist;
sdp_record_t *record = sdp_record_alloc();
record->handle = sdp_next_handle();
sdp_record_add(BDADDR_ANY, record);
sdp_data = sdp_data_alloc(SDP_UINT32, &record->handle);
sdp_attr_add(record, SDP_ATTR_RECORD_HANDLE, sdp_data);
sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP);
root = sdp_list_append(0, &root_uuid);
sdp_set_browse_groups(record, root);
sdp_uuid16_create(&opush_uuid, OBEX_OBJPUSH_SVCLASS_ID);
svclass_id = sdp_list_append(0, &opush_uuid);
sdp_set_service_classes(record, svclass_id);
sdp_uuid16_create(&profile[0].uuid, OBEX_OBJPUSH_PROFILE_ID);
profile[0].version = 0x0100;
pfseq = sdp_list_append(0, profile);
sdp_set_profile_descs(record, pfseq);
sdp_uuid16_create(&l2cap_uuid, L2CAP_UUID);
proto[0] = sdp_list_append(0, &l2cap_uuid);
apseq = sdp_list_append(0, proto[0]);
sdp_uuid16_create(&rfcomm_uuid, RFCOMM_UUID);
proto[1] = sdp_list_append(0, &rfcomm_uuid);
channel = sdp_data_alloc(SDP_UINT8, &chan);
proto[1] = sdp_list_append(proto[1], channel);
apseq = sdp_list_append(apseq, proto[1]);
sdp_uuid16_create(&obex_uuid, OBEX_UUID);
proto[2] = sdp_list_append(0, &obex_uuid);
apseq = sdp_list_append(apseq, proto[2]);
aproto = sdp_list_append(0, apseq);
sdp_set_access_protos(record, aproto);
for (i = 0; i < sizeof(formats); i++) {
dtds[i] = &dtd;
values[i] = &formats[i];
}
sflist = sdp_seq_alloc(dtds, values, sizeof(formats));
sdp_attr_add(record, SDP_ATTR_SUPPORTED_FORMATS_LIST, sflist);
sdp_set_info_attr(record, "OBEX Object Push", 0, 0);
sdp_data_free(channel);
sdp_list_free(root, 0);
sdp_list_free(svclass_id, 0);
sdp_list_free(pfseq, 0);
sdp_list_free(proto[0], 0);
sdp_list_free(proto[1], 0);
sdp_list_free(proto[2], 0);
sdp_list_free(apseq, 0);
sdp_list_free(aproto, 0);
update_db_timestamp();
}
static void register_hid_keyboard(void)
{
sdp_list_t *svclass_id, *pfseq, *apseq, *root;
uuid_t root_uuid, hidkb_uuid, l2cap_uuid, hidp_uuid;
sdp_profile_desc_t profile[1];
sdp_list_t *aproto, *proto[3];
sdp_data_t *psm, *lang_lst, *lang_lst2, *hid_spec_lst, *hid_spec_lst2;
unsigned int i;
uint8_t dtd = SDP_UINT16;
uint8_t dtd2 = SDP_UINT8;
uint8_t dtd_data = SDP_TEXT_STR8;
void *dtds[2];
void *values[2];
void *dtds2[2];
void *values2[2];
int leng[2];
uint8_t hid_spec_type = 0x22;
uint16_t hid_attr_lang[] = { 0x409, 0x100 };
static const uint16_t ctrl = 0x11;
static const uint16_t intr = 0x13;
static const uint16_t hid_attr[] = { 0x100, 0x111, 0x40, 0x0d,
0x01, 0x01 };
static const uint16_t hid_attr2[] = { 0x0, 0x01, 0x100, 0x1f40,
0x01, 0x01 };
const uint8_t hid_spec[] = {
0x05, 0x01, // usage page
0x09, 0x06, // keyboard
0xa1, 0x01, // key codes
0x85, 0x01, // minimum
0x05, 0x07, // max
0x19, 0xe0, // logical min
0x29, 0xe7, // logical max
0x15, 0x00, // report size
0x25, 0x01, // report count
0x75, 0x01, // input data variable absolute
0x95, 0x08, // report count
0x81, 0x02, // report size
0x75, 0x08,
0x95, 0x01,
0x81, 0x01,
0x75, 0x01,
0x95, 0x05,
0x05, 0x08,
0x19, 0x01,
0x29, 0x05,
0x91, 0x02,
0x75, 0x03,
0x95, 0x01,
0x91, 0x01,
0x75, 0x08,
0x95, 0x06,
0x15, 0x00,
0x26, 0xff,
0x00, 0x05,
0x07, 0x19,
0x00, 0x2a,
0xff, 0x00,
0x81, 0x00,
0x75, 0x01,
0x95, 0x01,
0x15, 0x00,
0x25, 0x01,
0x05, 0x0c,
0x09, 0xb8,
0x81, 0x06,
0x09, 0xe2,
0x81, 0x06,
0x09, 0xe9,
0x81, 0x02,
0x09, 0xea,
0x81, 0x02,
0x75, 0x01,
0x95, 0x04,
0x81, 0x01,
0xc0 // end tag
};
sdp_data_t *sdp_data;
sdp_record_t *record = sdp_record_alloc();
record->handle = sdp_next_handle();
sdp_record_add(BDADDR_ANY, record);
sdp_data = sdp_data_alloc(SDP_UINT32, &record->handle);
sdp_attr_add(record, SDP_ATTR_RECORD_HANDLE, sdp_data);
sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP);
root = sdp_list_append(0, &root_uuid);
sdp_set_browse_groups(record, root);
sdp_list_free(root, 0);
sdp_add_lang_attr(record);
sdp_uuid16_create(&hidkb_uuid, HID_SVCLASS_ID);
svclass_id = sdp_list_append(0, &hidkb_uuid);
sdp_set_service_classes(record, svclass_id);
sdp_list_free(svclass_id, 0);
sdp_uuid16_create(&profile[0].uuid, HID_PROFILE_ID);
profile[0].version = 0x0100;
pfseq = sdp_list_append(0, profile);
sdp_set_profile_descs(record, pfseq);
sdp_list_free(pfseq, 0);
/* protocols */
sdp_uuid16_create(&l2cap_uuid, L2CAP_UUID);
proto[1] = sdp_list_append(0, &l2cap_uuid);
psm = sdp_data_alloc(SDP_UINT16, &ctrl);
proto[1] = sdp_list_append(proto[1], psm);
apseq = sdp_list_append(0, proto[1]);
sdp_uuid16_create(&hidp_uuid, HIDP_UUID);
proto[2] = sdp_list_append(0, &hidp_uuid);
apseq = sdp_list_append(apseq, proto[2]);
aproto = sdp_list_append(0, apseq);
sdp_set_access_protos(record, aproto);
sdp_data_free(psm);
sdp_list_free(proto[1], 0);
sdp_list_free(proto[2], 0);
sdp_list_free(apseq, 0);
sdp_list_free(aproto, 0);
/* additional protocols */
proto[1] = sdp_list_append(0, &l2cap_uuid);
psm = sdp_data_alloc(SDP_UINT16, &intr);
proto[1] = sdp_list_append(proto[1], psm);
apseq = sdp_list_append(0, proto[1]);
sdp_uuid16_create(&hidp_uuid, HIDP_UUID);
proto[2] = sdp_list_append(0, &hidp_uuid);
apseq = sdp_list_append(apseq, proto[2]);
aproto = sdp_list_append(0, apseq);
sdp_set_add_access_protos(record, aproto);
sdp_data_free(psm);
sdp_list_free(proto[1], 0);
sdp_list_free(proto[2], 0);
sdp_list_free(apseq, 0);
sdp_list_free(aproto, 0);
sdp_set_info_attr(record, "HID Keyboard", NULL, NULL);
for (i = 0; i < sizeof(hid_attr) / 2; i++)
sdp_attr_add_new(record,
SDP_ATTR_HID_DEVICE_RELEASE_NUMBER + i,
SDP_UINT16, &hid_attr[i]);
dtds[0] = &dtd2;
values[0] = &hid_spec_type;
dtds[1] = &dtd_data;
values[1] = (uint8_t *) hid_spec;
leng[0] = 0;
leng[1] = sizeof(hid_spec);
hid_spec_lst = sdp_seq_alloc_with_length(dtds, values, leng, 2);
hid_spec_lst2 = sdp_data_alloc(SDP_SEQ8, hid_spec_lst);
sdp_attr_add(record, SDP_ATTR_HID_DESCRIPTOR_LIST, hid_spec_lst2);
for (i = 0; i < sizeof(hid_attr_lang) / 2; i++) {
dtds2[i] = &dtd;
values2[i] = &hid_attr_lang[i];
}
lang_lst = sdp_seq_alloc(dtds2, values2, sizeof(hid_attr_lang) / 2);
lang_lst2 = sdp_data_alloc(SDP_SEQ8, lang_lst);
sdp_attr_add(record, SDP_ATTR_HID_LANG_ID_BASE_LIST, lang_lst2);
sdp_attr_add_new(record, SDP_ATTR_HID_SDP_DISABLE,
SDP_UINT16, &hid_attr2[0]);
for (i = 0; i < sizeof(hid_attr2) / 2 - 1; i++)
sdp_attr_add_new(record, SDP_ATTR_HID_REMOTE_WAKEUP + i,
SDP_UINT16, &hid_attr2[i + 1]);
update_db_timestamp();
}
static void register_file_transfer(void)
{
sdp_list_t *svclass_id, *pfseq, *apseq, *root;
uuid_t root_uuid, ftrn_uuid, l2cap_uuid, rfcomm_uuid, obex_uuid;
sdp_profile_desc_t profile[1];
sdp_list_t *aproto, *proto[3];
uint8_t u8 = 10;
sdp_data_t *sdp_data, *channel;
sdp_record_t *record = sdp_record_alloc();
record->handle = sdp_next_handle();
sdp_record_add(BDADDR_ANY, record);
sdp_data = sdp_data_alloc(SDP_UINT32, &record->handle);
sdp_attr_add(record, SDP_ATTR_RECORD_HANDLE, sdp_data);
sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP);
root = sdp_list_append(0, &root_uuid);
sdp_set_browse_groups(record, root);
sdp_uuid16_create(&ftrn_uuid, OBEX_FILETRANS_SVCLASS_ID);
svclass_id = sdp_list_append(0, &ftrn_uuid);
sdp_set_service_classes(record, svclass_id);
sdp_uuid16_create(&profile[0].uuid, OBEX_FILETRANS_PROFILE_ID);
profile[0].version = 0x0100;
pfseq = sdp_list_append(0, &profile[0]);
sdp_set_profile_descs(record, pfseq);
sdp_uuid16_create(&l2cap_uuid, L2CAP_UUID);
proto[0] = sdp_list_append(0, &l2cap_uuid);
apseq = sdp_list_append(0, proto[0]);
sdp_uuid16_create(&rfcomm_uuid, RFCOMM_UUID);
proto[1] = sdp_list_append(0, &rfcomm_uuid);
channel = sdp_data_alloc(SDP_UINT8, &u8);
proto[1] = sdp_list_append(proto[1], channel);
apseq = sdp_list_append(apseq, proto[1]);
sdp_uuid16_create(&obex_uuid, OBEX_UUID);
proto[2] = sdp_list_append(0, &obex_uuid);
apseq = sdp_list_append(apseq, proto[2]);
aproto = sdp_list_append(0, apseq);
sdp_set_access_protos(record, aproto);
sdp_set_info_attr(record, "OBEX File Transfer", 0, 0);
sdp_data_free(channel);
sdp_list_free(root, 0);
sdp_list_free(svclass_id, 0);
sdp_list_free(pfseq, 0);
sdp_list_free(proto[0], 0);
sdp_list_free(proto[1], 0);
sdp_list_free(proto[2], 0);
sdp_list_free(apseq, 0);
sdp_list_free(aproto, 0);
update_db_timestamp();
}
static struct context *create_context(gconstpointer data)
{
struct context *context = g_new0(struct context, 1);
GIOChannel *channel;
int err, sv[2];
err = socketpair(AF_UNIX, SOCK_SEQPACKET | SOCK_CLOEXEC, 0, sv);
g_assert(err == 0);
channel = g_io_channel_unix_new(sv[0]);
g_io_channel_set_close_on_unref(channel, TRUE);
g_io_channel_set_encoding(channel, NULL, NULL);
g_io_channel_set_buffered(channel, FALSE);
context->server_source = g_io_add_watch(channel,
G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL,
server_handler, context);
g_assert(context->server_source > 0);
g_io_channel_unref(channel);
channel = g_io_channel_unix_new(sv[1]);
g_io_channel_set_close_on_unref(channel, TRUE);
g_io_channel_set_encoding(channel, NULL, NULL);
g_io_channel_set_buffered(channel, FALSE);
context->client_source = g_io_add_watch(channel,
G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL,
client_handler, context);
g_assert(context->client_source > 0);
g_io_channel_unref(channel);
context->fd = sv[1];
context->data = data;
set_fixed_db_timestamp(0x496f0654);
register_public_browse_group();
register_server_service();
register_serial_port();
register_object_push();
register_hid_keyboard();
register_file_transfer();
register_file_transfer();
register_file_transfer();
register_file_transfer();
register_file_transfer();
return context;
}
static void test_sdp(gconstpointer data)
{
struct context *context = create_context(data);
g_idle_add(send_pdu, context);
}
static void test_sdp_de_attr(gconstpointer data)
{
const struct test_data_de *test = data;
uint128_t u128;
sdp_data_t *d;
int size = 0;
d = sdp_extract_attr(test->input_data, test->input_size, &size, NULL);
g_assert(d != NULL);
g_assert_cmpuint(test->input_size, ==, size);
g_assert_cmpuint(test->expected.dtd, ==, d->dtd);
tester_debug("DTD=0x%02x\n", d->dtd);
switch (d->dtd) {
case SDP_TEXT_STR8:
case SDP_TEXT_STR16:
case SDP_URL_STR8:
case SDP_URL_STR16:
g_assert_cmpstr(test->expected.val.str, ==, d->val.str);
break;
case SDP_DATA_NIL:
case SDP_UINT8:
g_assert_cmpuint(test->expected.val.uint8, ==, d->val.uint8);
break;
case SDP_UINT16:
g_assert_cmpuint(test->expected.val.uint16, ==, d->val.uint16);
break;
case SDP_UINT32:
g_assert_cmpuint(test->expected.val.uint32, ==, d->val.uint32);
break;
case SDP_UINT64:
g_assert_cmpuint(test->expected.val.uint64, ==, d->val.uint64);
break;
case SDP_BOOL:
case SDP_INT8:
g_assert_cmpuint(test->expected.val.int8, ==, d->val.int8);
break;
case SDP_INT16:
g_assert_cmpuint(test->expected.val.int16, ==, d->val.int16);
break;
case SDP_INT32:
g_assert_cmpuint(test->expected.val.int32, ==, d->val.int32);
break;
case SDP_INT64:
g_assert_cmpuint(test->expected.val.int64, ==, d->val.int64);
break;
case SDP_UINT128:
case SDP_INT128:
/* Expected bytes are in network order */
hton128(&d->val.uint128, &u128);
g_assert(memcmp(&test->expected.val.uint128, &u128,
sizeof(uint128_t)) == 0);
break;
default:
g_assert_not_reached();
}
sdp_data_free(d);
tester_test_passed();
}
int main(int argc, char *argv[])
{
tester_init(&argc, &argv);
__btd_log_init("*", 0);
/*
* Service Search Request
*
* Verify the correct behaviour of the IUT when searching for
* existing service(s).
*/
define_ss("BV-01-C/UUID-16",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x08, 0x35, 0x03, 0x19,
0x11, 0x05, 0x00, 0x01, 0x00),
raw_pdu(0x03, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x00, 0x01, 0x00));
define_ss("BV-01-C/UUID-32",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x0a, 0x35, 0x05, 0x1a,
0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00),
raw_pdu(0x03, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x00, 0x00, 0x00));
define_ss("BV-01-C/UUID-128",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x16, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x05, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x01, 0x00),
raw_pdu(0x03, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x00, 0x01, 0x00));
/*
* Service Search Request
*
* Verify the correct behaviour of the IUT when searching for
* existing service(s), using continuation state.
*/
define_ss("BV-03-C/UUID-16",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x08, 0x35, 0x03, 0x19,
0x01, 0x00, 0xff, 0xff, 0x00),
raw_pdu_cont(8, 0x03, 0x00, 0x01, 0x00, 0x29, 0x00, 0x08, 0x00,
0x07, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00,
0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00,
0x05, 0x00, 0x01, 0x00, 0x06, 0x08),
raw_pdu_cont(8, 0x02, 0x00, 0x02, 0x00, 0x10, 0x35, 0x03, 0x19,
0x01, 0x00, 0xff, 0xff, 0x08),
raw_pdu(0x03, 0x00, 0x02, 0x00, 0x09, 0x00, 0x08, 0x00,
0x01, 0x00, 0x01, 0x00, 0x07, 0x00));
define_ss("BV-03-C/UUID-32",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x0a, 0x35, 0x05, 0x1a,
0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x00),
raw_pdu_cont(8, 0x03, 0x00, 0x01, 0x00, 0x29, 0x00, 0x08, 0x00,
0x07, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00,
0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00,
0x05, 0x00, 0x01, 0x00, 0x06, 0x08),
raw_pdu_cont(8, 0x02, 0x00, 0x02, 0x00, 0x12, 0x35, 0x05, 0x1a,
0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0x08),
raw_pdu(0x03, 0x00, 0x02, 0x00, 0x09, 0x00, 0x08, 0x00,
0x01, 0x00, 0x01, 0x00, 0x07, 0x00));
define_ss("BV-03-C/UUID-128",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x16, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0xff, 0xff, 0x00),
raw_pdu_cont(8, 0x03, 0x00, 0x01, 0x00, 0x29, 0x00, 0x08, 0x00,
0x07, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00,
0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00,
0x05, 0x00, 0x01, 0x00, 0x06, 0x08),
raw_pdu_cont(8, 0x02, 0x00, 0x02, 0x00, 0x1e, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0xff, 0xff, 0x08),
raw_pdu(0x03, 0x00, 0x02, 0x00, 0x09, 0x00, 0x08, 0x00,
0x01, 0x00, 0x01, 0x00, 0x07, 0x00));
/*
* Service Search Request
*
* Verify the correct behaviour of the IUT when searching for
* no existing service(s).
*/
define_ss("BV-04-C/UUID-16",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x08, 0x35, 0x03, 0x19,
0xff, 0xff, 0x00, 0x01, 0x00),
raw_pdu(0x03, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00,
0x00, 0x00));
define_ss("BV-04-C/UUID-128",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x16, 0x35, 0x11, 0x1c,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x00, 0x01, 0x00),
raw_pdu(0x03, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00,
0x00, 0x00));
define_ss("BV-04-C/UUID-32",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x0a, 0x35, 0x05, 0x1a,
0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0x00),
raw_pdu(0x03, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00,
0x00, 0x00));
/*
* Service Search Request
*
* Verify the correct behaviour of the IUT when searching for
* existing service(s), using invalid PDU size.
*/
define_ss("BI-01-C/UUID-16",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x0d, 0x35, 0x03, 0x19,
0x01, 0x00, 0x00, 0x05, 0x00),
raw_pdu(0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04));
define_ss("BI-01-C/UUID-32",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x0f, 0x35, 0x05, 0x1a,
0x00, 0x00, 0x01, 0x00, 0x00, 0x05, 0x00),
raw_pdu(0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04));
define_ss("BI-01-C/UUID-128",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x1b, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x05, 0x00),
raw_pdu(0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04));
/*
* Service Search Request
*
* Verify the correct behaviour of the IUT when searching for
* existing service(s), using invalid request syntax.
*/
define_ss("BI-02-C/UUID-16",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x06, 0x35, 0x03, 0x19,
0x01, 0x00, 0x00),
raw_pdu(0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03));
define_ss("BI-02-C/UUID-32",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x08, 0x35, 0x05, 0x1a,
0x00, 0x00, 0x01, 0x00, 0x00),
raw_pdu(0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03));
define_ss("BI-02-C/UUID-128",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x14, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00),
raw_pdu(0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03));
/*
* Service Attribute Request
*
* Verify that the IUT is able to respond with attribute(s).
*/
define_sa("BV-01-C",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x16, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x05, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x01, 0x00),
raw_pdu(0x03, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x00, 0x01, 0x00),
raw_pdu(0x04, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x01, 0x00,
0x01, 0x00, 0x0a, 0x35, 0x03, 0x09, 0x00, 0x01,
0x00),
raw_pdu(0x05, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x0a, 0x35,
0x08, 0x09, 0x00, 0x01, 0x35, 0x03, 0x19, 0x11,
0x05, 0x00));
/*
* Service Attribute Request
*
* Verify that the IUT is able to respond with the existing
* Attribute(s) using ContinuationState.
*/
define_sa("BV-03-C",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x16, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x01, 0x00),
raw_pdu(0x03, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x00, 0x00, 0x00),
raw_pdu(0x04, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x01, 0x00,
0x00, 0x00, 0x07, 0x35, 0x06, 0x09, 0x00, 0x00,
0x09, 0x00, 0x01, 0x00),
raw_pdu_cont(8, 0x05, 0x00, 0x01, 0x00, 0x12, 0x00, 0x07, 0x35,
0x10, 0x09, 0x00, 0x00, 0x0a, 0x00, 0x08),
raw_pdu_cont(8, 0x04, 0x00, 0x02, 0x00, 0x17, 0x00, 0x01, 0x00,
0x00, 0x00, 0x07, 0x35, 0x06, 0x09, 0x00, 0x00,
0x09, 0x00, 0x01, 0x08),
raw_pdu_cont(8, 0x05, 0x00, 0x02, 0x00, 0x12, 0x00, 0x07, 0x01,
0x00, 0x00, 0x09, 0x00, 0x01, 0x35, 0x08),
raw_pdu_cont(8, 0x04, 0x00, 0x03, 0x00, 0x17, 0x00, 0x01, 0x00,
0x00, 0x00, 0x07, 0x35, 0x06, 0x09, 0x00, 0x00,
0x09, 0x00, 0x01, 0x08),
raw_pdu(0x05, 0x00, 0x03, 0x00, 0x07, 0x00, 0x04, 0x03,
0x19, 0x11, 0x01, 0x00));
/*
* Service Attribute Request
*
* Verify that the IUT is able to respond with an
* ServiceID attribute.
*/
define_sa("BV-04-C",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x16, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x01, 0x00),
raw_pdu(0x03, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x00, 0x00, 0x00),
raw_pdu(0x04, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x01, 0x00,
0x00, 0x00, 0x19, 0x35, 0x03, 0x09, 0x00, 0x03,
0x00),
raw_pdu(0x05, 0x00, 0x02, 0x00, 0x0b, 0x00, 0x08, 0x35,
0x06, 0x09, 0x00, 0x03, 0x19, 0x11, 0x01, 0x00));
/*
* Service Attribute Request
*
* Verify that the IUT is able to respond with an
* ProtocolDescriptorList attribute.
*/
define_sa("BV-05-C",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x16, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x05, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x01, 0x00),
raw_pdu(0x03, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x00, 0x01, 0x00),
raw_pdu(0x04, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x01, 0x00,
0x01, 0xff, 0xff, 0x35, 0x03, 0x09, 0x00, 0x04,
0x00),
raw_pdu(0x05, 0x00, 0x02, 0x00, 0x1b, 0x00, 0x18, 0x35,
0x16, 0x09, 0x00, 0x04, 0x35, 0x11, 0x35, 0x03,
0x19, 0x01, 0x00, 0x35, 0x05, 0x19, 0x00, 0x03,
0x08, 0x09, 0x35, 0x03, 0x19, 0x00, 0x08, 0x00));
/*
* Service Attribute Request
*
* Verify that the IUT is able to respond with the
* ServiceRecordState attribute.
*/
define_sa("BV-06-C",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x16, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x01, 0x00),
raw_pdu(0x03, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x00, 0x00, 0x00),
raw_pdu(0x04, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x01, 0x00,
0x00, 0x00, 0x0d, 0x35, 0x03, 0x09, 0x00, 0x02,
0x00),
raw_pdu(0x05, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x0a, 0x35,
0x08, 0x09, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x12,
0x34, 0x00));
/*
* Service Attribute Request
*
* Verify that the IUT is able to respond with the
* ServiceInfoTime attribute.
*/
define_sa("BV-07-C",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x16, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x01, 0x00),
raw_pdu(0x03, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x00, 0x00, 0x00),
raw_pdu(0x04, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x01, 0x00,
0x00, 0x00, 0x0d, 0x35, 0x03, 0x09, 0x00, 0x07,
0x00),
raw_pdu(0x05, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x0a, 0x35,
0x08, 0x09, 0x00, 0x07, 0x0a, 0x00, 0x00, 0xff,
0xff, 0x00));
/*
* Service Attribute Request
*
* Verify that the IUT is able to respond with an
* BrowseGroupList attribute.
*/
define_sa("BV-08-C",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x16, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x05, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x01, 0x00),
raw_pdu(0x03, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x00, 0x01, 0x00),
raw_pdu(0x04, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x01, 0x00,
0x01, 0x00, 0x0a, 0x35, 0x03, 0x09, 0x00, 0x05,
0x00),
raw_pdu(0x05, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x0a, 0x35,
0x08, 0x09, 0x00, 0x05, 0x35, 0x03, 0x19, 0x10,
0x02, 0x00));
/*
* Service Attribute Request
*
* Verify that the IUT is able to respond with an
* LanguageBaseAttributeIdList attribute.
*/
define_sa("BV-09-C",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x16, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x01, 0x00),
raw_pdu(0x03, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x00, 0x00, 0x00),
raw_pdu(0x04, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x01, 0x00,
0x00, 0x00, 0x13, 0x35, 0x03, 0x09, 0x00, 0x06,
0x00),
raw_pdu(0x05, 0x00, 0x02, 0x00, 0x13, 0x00, 0x10, 0x35,
0x0e, 0x09, 0x00, 0x06, 0x35, 0x09, 0x09, 0x65,
0x6e, 0x09, 0x00, 0x6a, 0x09, 0x01, 0x00, 0x00));
/*
* Service Attribute Request
*
* Verify that the IUT is able to respond with an
* ServiceAvailability attribute.
*/
define_sa("BV-10-C",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x16, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x01, 0x00),
raw_pdu(0x03, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x00, 0x00, 0x00),
raw_pdu(0x04, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x01, 0x00,
0x00, 0x00, 0x0a, 0x35, 0x03, 0x09, 0x00, 0x08,
0x00),
raw_pdu(0x05, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x07, 0x35,
0x05, 0x09, 0x00, 0x08, 0x08, 0xff, 0x00));
/*
* Service Attribute Request
*
* Verify that the IUT is able to respond with an
* IconURL attribute.
*/
define_sa("BV-11-C",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x16, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x01, 0x00),
raw_pdu(0x03, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x00, 0x00, 0x00),
raw_pdu(0x04, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x01, 0x00,
0x00, 0x00, 0x1f, 0x35, 0x03, 0x09, 0x00, 0x0c,
0x00),
raw_pdu(0x05, 0x00, 0x02, 0x00, 0x1f, 0x00, 0x1c, 0x35,
0x1a, 0x09, 0x00, 0x0c, 0x45, 0x15, 0x68, 0x74,
0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77,
0x2e, 0x62, 0x6c, 0x75, 0x65, 0x7a, 0x2e, 0x6f,
0x72, 0x67, 0x2f, 0x00));
/*
* Service Attribute Request
*
* Verify that the IUT is able to respond with an
* ServiceName attribute.
*/
define_sa("BV-12-C",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x16, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x01, 0x00),
raw_pdu(0x03, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x00, 0x00, 0x00),
raw_pdu(0x04, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x01, 0x00,
0x00, 0x00, 0x16, 0x35, 0x03, 0x09, 0x00, 0x06,
0x00),
raw_pdu(0x05, 0x00, 0x02, 0x00, 0x13, 0x00, 0x10, 0x35,
0x0e, 0x09, 0x00, 0x06, 0x35, 0x09, 0x09, 0x65,
0x6e, 0x09, 0x00, 0x6a, 0x09, 0x01, 0x00, 0x00),
raw_pdu(0x04, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x01, 0x00,
0x00, 0x00, 0x15, 0x35, 0x03, 0x09, 0x01, 0x00,
0x00),
raw_pdu(0x05, 0x00, 0x01, 0x00, 0x15, 0x00, 0x12, 0x35,
0x10, 0x09, 0x01, 0x00, 0x25, 0x0b, 0x53, 0x65,
0x72, 0x69, 0x61, 0x6c, 0x20, 0x50, 0x6f, 0x72,
0x74, 0x00));
/*
* Service Attribute Request
*
* Verify that the IUT is able to respond with an
* ServiceDescription attribute.
*/
define_sa("BV-13-C",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x16, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x01, 0x00),
raw_pdu(0x03, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x00, 0x00, 0x00),
raw_pdu(0x04, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x01, 0x00,
0x00, 0x00, 0x16, 0x35, 0x03, 0x09, 0x00, 0x06,
0x00),
raw_pdu(0x05, 0x00, 0x02, 0x00, 0x13, 0x00, 0x10, 0x35,
0x0e, 0x09, 0x00, 0x06, 0x35, 0x09, 0x09, 0x65,
0x6e, 0x09, 0x00, 0x6a, 0x09, 0x01, 0x00, 0x00),
raw_pdu(0x04, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x01, 0x00,
0x00, 0x00, 0x12, 0x35, 0x03, 0x09, 0x01, 0x01,
0x00),
raw_pdu(0x05, 0x00, 0x02, 0x00, 0x12, 0x00, 0x0f, 0x35,
0x0d, 0x09, 0x01, 0x01, 0x25, 0x08, 0x43, 0x4f,
0x4d, 0x20, 0x50, 0x6f, 0x72, 0x74, 0x00));
/*
* Service Attribute Request
*
* Verify that the IUT is able to respond with an
* ProviderName attribute.
*/
define_sa("BV-14-C",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x16, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x01, 0x00),
raw_pdu(0x03, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x00, 0x00, 0x00),
raw_pdu(0x04, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x01, 0x00,
0x00, 0x00, 0x16, 0x35, 0x03, 0x09, 0x00, 0x06,
0x00),
raw_pdu(0x05, 0x00, 0x02, 0x00, 0x13, 0x00, 0x10, 0x35,
0x0e, 0x09, 0x00, 0x06, 0x35, 0x09, 0x09, 0x65,
0x6e, 0x09, 0x00, 0x6a, 0x09, 0x01, 0x00, 0x00),
raw_pdu(0x04, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x01, 0x00,
0x00, 0x00, 0x0f, 0x35, 0x03, 0x09, 0x01, 0x02,
0x00),
raw_pdu(0x05, 0x00, 0x02, 0x00, 0x0f, 0x00, 0x0c, 0x35,
0x0a, 0x09, 0x01, 0x02, 0x25, 0x05, 0x42, 0x6c,
0x75, 0x65, 0x5a, 0x00));
/*
* Service Attribute Request
*
* Verify that the IUT is able to respond with an
* VersionNumberList attribute.
*/
define_sa("BV-15-C",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x16, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x01, 0x00),
raw_pdu(0x03, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00),
raw_pdu(0x04, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x0d, 0x35, 0x03, 0x09, 0x02, 0x00,
0x00),
raw_pdu(0x05, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x0a, 0x35,
0x08, 0x09, 0x02, 0x00, 0x35, 0x03, 0x09, 0x01,
0x00, 0x00));
/*
* Service Attribute Request
*
* Verify that the IUT is able to respond with the
* ServiceDatabaseState attribute.
*/
define_sa("BV-16-C",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x16, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x01, 0x00),
raw_pdu(0x03, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00),
raw_pdu(0x04, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x0d, 0x35, 0x03, 0x09, 0x02, 0x01,
0x00),
raw_pdu(0x05, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x0a, 0x35,
0x08, 0x09, 0x02, 0x01, 0x0a, 0x49, 0x6f, 0x06,
0x54, 0x00));
/*
* Service Attribute Request
*
* Verify that the IUT is able to respond with the
* BluetoothProfileDescriptorList attribute.
*/
define_sa("BV-17-C",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x16, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x05, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x01, 0x00),
raw_pdu(0x03, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x00, 0x01, 0x00),
raw_pdu(0x04, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x01, 0x00,
0x01, 0x00, 0x0f, 0x35, 0x03, 0x09, 0x00, 0x09,
0x00),
raw_pdu(0x05, 0x00, 0x02, 0x00, 0x12, 0x00, 0x0f, 0x35,
0x0d, 0x09, 0x00, 0x09, 0x35, 0x08, 0x35, 0x06,
0x19, 0x11, 0x05, 0x09, 0x01, 0x00, 0x00));
/*
* Service Attribute Request
*
* Verify that the IUT is able to respond with the
* DocumentationURL attribute.
*/
define_sa("BV-18-C",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x16, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x01, 0x00),
raw_pdu(0x03, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x00, 0x00, 0x00),
raw_pdu(0x04, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x01, 0x00,
0x00, 0x00, 0x1f, 0x35, 0x03, 0x09, 0x00, 0x0a,
0x00),
raw_pdu(0x05, 0x00, 0x02, 0x00, 0x1f, 0x00, 0x1c, 0x35,
0x1a, 0x09, 0x00, 0x0a, 0x45, 0x15, 0x68, 0x74,
0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77,
0x2e, 0x62, 0x6c, 0x75, 0x65, 0x7a, 0x2e, 0x6f,
0x72, 0x67, 0x2f, 0x00));
/*
* Service Attribute Request
*
* Verify that the IUT is able to respond with the
* ClientExecutableURL attribute.
*/
define_sa("BV-19-C",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x16, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x01, 0x00),
raw_pdu(0x03, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x00, 0x00, 0x00),
raw_pdu(0x04, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x01, 0x00,
0x00, 0x00, 0x1f, 0x35, 0x03, 0x09, 0x00, 0x0b,
0x00),
raw_pdu(0x05, 0x00, 0x02, 0x00, 0x1f, 0x00, 0x1c, 0x35,
0x1a, 0x09, 0x00, 0x0b, 0x45, 0x15, 0x68, 0x74,
0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77,
0x2e, 0x62, 0x6c, 0x75, 0x65, 0x7a, 0x2e, 0x6f,
0x72, 0x67, 0x2f, 0x00));
/*
* Service Attribute Request
*
* Verify the correct behaviour of the IUT when searching
* for non-existing Attribute.
*/
define_sa("BV-20-C",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x16, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x01, 0x00),
raw_pdu(0x03, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x00, 0x00, 0x00),
raw_pdu(0x04, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x01, 0x00,
0x00, 0x00, 0x07, 0x35, 0x03, 0x09, 0xff, 0xff,
0x00),
raw_pdu(0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x02, 0x35,
0x00, 0x00));
/*
* Service Attribute Request
*
* Verify that the IUT is able to respond with an
* AdditionalProtocolDescriptorList attribute.
*/
define_sa("BV-21-C",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x16, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x24, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x01, 0x00),
raw_pdu(0x03, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x00, 0x02, 0x00),
raw_pdu(0x04, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x01, 0x00,
0x02, 0xff, 0xff, 0x35, 0x03, 0x09, 0x00, 0x0d,
0x00),
raw_pdu(0x05, 0x00, 0x02, 0x00, 0x19, 0x00, 0x16, 0x35,
0x14, 0x09, 0x00, 0x0d, 0x35, 0x0f, 0x35, 0x0d,
0x35, 0x06, 0x19, 0x01, 0x00, 0x09, 0x00, 0x13,
0x35, 0x03, 0x19, 0x00, 0x11, 0x00));
/*
* Service Attribute Request
*
* Verify the correct behaviour of the IUT when searching
* for existing Attribute, using invalid ServiceRecordHandle.
*/
define_sa("BI-01-C",
raw_pdu(0x04, 0x00, 0x01, 0x00, 0x0c, 0xff, 0xff, 0xff,
0xff, 0x00, 0x07, 0x35, 0x03, 0x09, 0x00, 0x01,
0x00),
raw_pdu(0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02));
/*
* Service Attribute Request
*
* Verify the correct behaviour of the IUT when searching
* for existing Attribute, using invalid request syntax.
*/
define_sa("BI-02-C",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x16, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x01, 0x00),
raw_pdu(0x03, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x00, 0x00, 0x00),
raw_pdu(0x04, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x01, 0x00,
0x00, 0x35, 0x03, 0x09, 0x00, 0x01, 0x00),
raw_pdu(0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03));
/*
* Service Attribute Request
*
* Verify the correct behaviour of the IUT when searching
* for existing Attribute, using invalid PDU-Size.
*/
define_sa("BI-03-C",
raw_pdu(0x02, 0x00, 0x01, 0x00, 0x16, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x01, 0x00),
raw_pdu(0x03, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x00, 0x00, 0x00),
raw_pdu(0x04, 0x00, 0x01, 0x00, 0x11, 0x00, 0x01, 0x00,
0x00, 0x00, 0x07, 0x35, 0x03, 0x09, 0x00, 0x01,
0x00),
raw_pdu(0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04));
/*
* Service Search Attribute Request
*
* Verify the correct behaviour of the IUT when searching
* for non-existing Service, existing Attribute using
* ServiceSearchAttributeRequest.
*/
define_ssa("BV-01-C/UUID-16",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0d, 0x35, 0x03, 0x19,
0xff, 0xff, 0x00, 0x0a, 0x35, 0x03, 0x09, 0x00,
0x01, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x05, 0x00, 0x02, 0x35,
0x00, 0x00));
define_ssa("BV-01-C/UUID-32",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0f, 0x35, 0x05, 0x1a,
0xff, 0xff, 0xff, 0xff, 0x00, 0x0a, 0x35, 0x03,
0x09, 0x00, 0x01, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x05, 0x00, 0x02, 0x35,
0x00, 0x00));
define_ssa("BV-01-C/UUID-128",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x1b, 0x35, 0x11, 0x1c,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x00, 0x0a, 0x35, 0x03, 0x09, 0x00, 0x01, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x05, 0x00, 0x02, 0x35,
0x00, 0x00));
/*
* Service Search Attribute Request
*
* Verify the correct behaviour of the IUT when searching
* for existing Service, non-existing Attribute using
* ServiceSearchAttributeRequest.
*/
define_ssa("BV-02-C/UUID-16",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0d, 0x35, 0x03, 0x19,
0x11, 0x05, 0x00, 0x0a, 0x35, 0x03, 0x09, 0xff,
0xff, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x05, 0x00, 0x02, 0x35,
0x00, 0x00));
define_ssa("BV-02-C/UUID-32",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0f, 0x35, 0x05, 0x1a,
0x00, 0x00, 0x11, 0x05, 0x00, 0x0a, 0x35, 0x03,
0x09, 0xff, 0xff, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x05, 0x00, 0x02, 0x35,
0x00, 0x00));
define_ssa("BV-02-C/UUID-128",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x1b, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x05, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x0a, 0x35, 0x03, 0x09, 0xff, 0xff, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x05, 0x00, 0x02, 0x35,
0x00, 0x00));
/*
* Service Search Attribute Request
*
* Verify the correct behaviour of the IUT when searching
* for non-existing Service, non-existing Attribute using
* ServiceSearchAttributeRequest.
*/
define_ssa("BV-03-C/UUID-16",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0d, 0x35, 0x03, 0x19,
0xff, 0xff, 0x00, 0x0a, 0x35, 0x03, 0x09, 0xff,
0xff, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x05, 0x00, 0x02, 0x35,
0x00, 0x00));
define_ssa("BV-03-C/UUID-32",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0f, 0x35, 0x05, 0x1a,
0xff, 0xff, 0xff, 0xff, 0x00, 0x0a, 0x35, 0x03,
0x09, 0xff, 0xff, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x05, 0x00, 0x02, 0x35,
0x00, 0x00));
define_ssa("BV-03-C/UUID-128",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x1b, 0x35, 0x11, 0x1c,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x00, 0x0a, 0x35, 0x03, 0x09, 0xff, 0xff, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x05, 0x00, 0x02, 0x35,
0x00, 0x00));
/*
* Service Search Attribute Request
*
* Verify the correct behaviour of the IUT when searching
* for existing Service(s) and Attribute(s) using
* ServiceSearchAttributeRequest.
*/
define_ssa("BV-04-C/UUID-16",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0d, 0x35, 0x03, 0x19,
0x11, 0x05, 0x00, 0x11, 0x35, 0x03, 0x09, 0x00,
0x01, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x0c, 0x35,
0x0a, 0x35, 0x08, 0x09, 0x00, 0x01, 0x35, 0x03,
0x19, 0x11, 0x05, 0x00));
define_ssa("BV-04-C/UUID-32",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0f, 0x35, 0x05, 0x1a,
0x00, 0x00, 0x11, 0x05, 0x00, 0x11, 0x35, 0x03,
0x09, 0x00, 0x01, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x0c, 0x35,
0x0a, 0x35, 0x08, 0x09, 0x00, 0x01, 0x35, 0x03,
0x19, 0x11, 0x05, 0x00));
define_ssa("BV-04-C/UUID-128",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x1b, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x05, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x11, 0x35, 0x03, 0x09, 0x00, 0x01, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x0c, 0x35,
0x0a, 0x35, 0x08, 0x09, 0x00, 0x01, 0x35, 0x03,
0x19, 0x11, 0x05, 0x00));
/*
* Service Search Attribute Request
*
* Verify the correct behaviour of the IUT when searching
* for existing Attributes, using Continuation State and
* ServiceSearchAttributeRequest.
*/
define_ssa("BV-06-C/UUID-16",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x10, 0x35, 0x03, 0x19,
0x11, 0x05, 0x00, 0x07, 0x35, 0x06, 0x09, 0x00,
0x00, 0x09, 0x00, 0x01, 0x00),
raw_pdu_cont(8, 0x07, 0x00, 0x01, 0x00, 0x12, 0x00, 0x07, 0x35,
0x12, 0x35, 0x10, 0x09, 0x00, 0x00, 0x08),
raw_pdu_cont(8, 0x06, 0x00, 0x02, 0x00, 0x18, 0x35, 0x03, 0x19,
0x11, 0x05, 0x00, 0x07, 0x35, 0x06, 0x09, 0x00,
0x00, 0x09, 0x00, 0x01, 0x08),
raw_pdu_cont(8, 0x07, 0x00, 0x02, 0x00, 0x12, 0x00, 0x07, 0x0a,
0x00, 0x01, 0x00, 0x01, 0x09, 0x00, 0x08),
raw_pdu_cont(8, 0x06, 0x00, 0x03, 0x00, 0x18, 0x35, 0x03, 0x19,
0x11, 0x05, 0x00, 0x07, 0x35, 0x06, 0x09, 0x00,
0x00, 0x09, 0x00, 0x01, 0x08),
raw_pdu(0x07, 0x00, 0x03, 0x00, 0x09, 0x00, 0x06, 0x01,
0x35, 0x03, 0x19, 0x11, 0x05, 0x00));
define_ssa("BV-06-C/UUID-32",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x12, 0x35, 0x05, 0x1a,
0x00, 0x00, 0x11, 0x05, 0x00, 0x07, 0x35, 0x06,
0x09, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00),
raw_pdu_cont(8, 0x07, 0x00, 0x01, 0x00, 0x12, 0x00, 0x07, 0x35,
0x12, 0x35, 0x10, 0x09, 0x00, 0x00, 0x08),
raw_pdu_cont(8, 0x06, 0x00, 0x02, 0x00, 0x1a, 0x35, 0x05, 0x1a,
0x00, 0x00, 0x11, 0x05, 0x00, 0x07, 0x35, 0x06,
0x09, 0x00, 0x00, 0x09, 0x00, 0x01, 0x08),
raw_pdu_cont(8, 0x07, 0x00, 0x02, 0x00, 0x12, 0x00, 0x07, 0x0a,
0x00, 0x01, 0x00, 0x01, 0x09, 0x00, 0x08),
raw_pdu_cont(8, 0x06, 0x00, 0x03, 0x00, 0x1a, 0x35, 0x05, 0x1a,
0x00, 0x00, 0x11, 0x05, 0x00, 0x07, 0x35, 0x06,
0x09, 0x00, 0x00, 0x09, 0x00, 0x01, 0x08),
raw_pdu(0x07, 0x00, 0x03, 0x00, 0x09, 0x00, 0x06, 0x01,
0x35, 0x03, 0x19, 0x11, 0x05, 0x00));
define_ssa("BV-06-C/UUID-128",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x1e, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x05, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x07, 0x35, 0x06, 0x09, 0x00, 0x00, 0x09,
0x00, 0x01, 0x00),
raw_pdu_cont(8, 0x07, 0x00, 0x01, 0x00, 0x12, 0x00, 0x07, 0x35,
0x12, 0x35, 0x10, 0x09, 0x00, 0x00, 0x08),
raw_pdu_cont(8, 0x06, 0x00, 0x02, 0x00, 0x26, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x05, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x07, 0x35, 0x06, 0x09, 0x00, 0x00, 0x09,
0x00, 0x01, 0x08),
raw_pdu_cont(8, 0x07, 0x00, 0x02, 0x00, 0x12, 0x00, 0x07, 0x0a,
0x00, 0x01, 0x00, 0x01, 0x09, 0x00, 0x08),
raw_pdu_cont(8, 0x06, 0x00, 0x03, 0x00, 0x26, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x05, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x07, 0x35, 0x06, 0x09, 0x00, 0x00, 0x09,
0x00, 0x01, 0x08),
raw_pdu(0x07, 0x00, 0x03, 0x00, 0x09, 0x00, 0x06, 0x01,
0x35, 0x03, 0x19, 0x11, 0x05, 0x00));
/*
* Service Search Attribute Request
*
* Verify the correct behaviour of the IUT when searching
* for existing Service(s) and Attribute ServiceRecordState
* using ServiceSearchAttributeRequest.
*/
define_ssa("BV-07-C/UUID-16",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0d, 0x35, 0x03, 0x19,
0x11, 0x01, 0x00, 0x13, 0x35, 0x03, 0x09, 0x00,
0x02, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x0c, 0x35,
0x0a, 0x35, 0x08, 0x09, 0x00, 0x02, 0x0a, 0x00,
0x00, 0x12, 0x34, 0x00));
define_ssa("BV-07-C/UUID-32",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0f, 0x35, 0x05, 0x1a,
0x00, 0x00, 0x11, 0x01, 0x00, 0x13, 0x35, 0x03,
0x09, 0x00, 0x02, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x0c, 0x35,
0x0a, 0x35, 0x08, 0x09, 0x00, 0x02, 0x0a, 0x00,
0x00, 0x12, 0x34, 0x00));
define_ssa("BV-07-C/UUID-128",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x1b, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x13, 0x35, 0x03, 0x09, 0x00, 0x02, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x0c, 0x35,
0x0a, 0x35, 0x08, 0x09, 0x00, 0x02, 0x0a, 0x00,
0x00, 0x12, 0x34, 0x00));
/*
* Service Search Attribute Request
*
* Verify the correct behaviour of the IUT when searching
* for existing Service(s) and Attribute ServiceDataBaseState
* using ServiceSearchAttributeRequest.
*/
define_ssa("BV-08-C/UUID-16",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0d, 0x35, 0x03, 0x19,
0x10, 0x00, 0x00, 0x13, 0x35, 0x03, 0x09, 0x02,
0x01, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x0c, 0x35,
0x0a, 0x35, 0x08, 0x09, 0x02, 0x01, 0x0a, 0x49,
0x6f, 0x06, 0x54, 0x00));
define_ssa("BV-08-C/UUID-32",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0f, 0x35, 0x05, 0x1a,
0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0x35, 0x03,
0x09, 0x02, 0x01, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x0c, 0x35,
0x0a, 0x35, 0x08, 0x09, 0x02, 0x01, 0x0a, 0x49,
0x6f, 0x06, 0x54, 0x00));
define_ssa("BV-08-C/UUID-128",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x1b, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x13, 0x35, 0x03, 0x09, 0x02, 0x01, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x0c, 0x35,
0x0a, 0x35, 0x08, 0x09, 0x02, 0x01, 0x0a, 0x49,
0x6f, 0x06, 0x54, 0x00));
/*
* Service Search Attribute Request
*
* Verify the correct behaviour of the IUT when searching
* for existing Service(s) and Attribute ServiceInfoTimeToLive
* using ServiceSearchAttributeRequest.
*/
define_ssa("BV-09-C/UUID-16",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0d, 0x35, 0x03, 0x19,
0x11, 0x01, 0x00, 0x13, 0x35, 0x03, 0x09, 0x00,
0x07, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x0c, 0x35,
0x0a, 0x35, 0x08, 0x09, 0x00, 0x07, 0x0a, 0x00,
0x00, 0xff, 0xff, 0x00));
define_ssa("BV-09-C/UUID-32",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0f, 0x35, 0x05, 0x1a,
0x00, 0x00, 0x11, 0x01, 0x00, 0x13, 0x35, 0x03,
0x09, 0x00, 0x07, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x0c, 0x35,
0x0a, 0x35, 0x08, 0x09, 0x00, 0x07, 0x0a, 0x00,
0x00, 0xff, 0xff, 0x00));
define_ssa("BV-09-C/UUID-128",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x1b, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x13, 0x35, 0x03, 0x09, 0x00, 0x07, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x0c, 0x35,
0x0a, 0x35, 0x08, 0x09, 0x00, 0x07, 0x0a, 0x00,
0x00, 0xff, 0xff, 0x00));
/*
* Service Search Attribute Request
*
* Verify the correct behaviour of the IUT when searching
* for existing Service(s) and Attribute ServiceID using
* ServiceSearchAttributeRequest.
*/
define_ssa("BV-10-C/UUID-16",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0d, 0x35, 0x03, 0x19,
0x11, 0x01, 0x00, 0x1e, 0x35, 0x03, 0x09, 0x00,
0x03, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x0a, 0x35,
0x08, 0x35, 0x06, 0x09, 0x00, 0x03, 0x19, 0x11,
0x01, 0x00));
define_ssa("BV-10-C/UUID-32",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0f, 0x35, 0x05, 0x1a,
0x00, 0x00, 0x11, 0x01, 0x00, 0x1e, 0x35, 0x03,
0x09, 0x00, 0x03, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x0a, 0x35,
0x08, 0x35, 0x06, 0x09, 0x00, 0x03, 0x19, 0x11,
0x01, 0x00));
define_ssa("BV-10-C/UUID-128",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x1b, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x1e, 0x35, 0x03, 0x09, 0x00, 0x03, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x0a, 0x35,
0x08, 0x35, 0x06, 0x09, 0x00, 0x03, 0x19, 0x11,
0x01, 0x00));
/*
* Service Search Attribute Request
*
* Verify the correct behaviour of the IUT when searching
* for existing Service(s) and Attribute ProtocolDescriptorList
* using ServiceSearchAttributeRequest.
*/
define_ssa("BV-11-C/UUID-16",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0d, 0x35, 0x03, 0x19,
0x11, 0x05, 0xff, 0xff, 0x35, 0x03, 0x09, 0x00,
0x04, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x1d, 0x00, 0x1a, 0x35,
0x18, 0x35, 0x16, 0x09, 0x00, 0x04, 0x35, 0x11,
0x35, 0x03, 0x19, 0x01, 0x00, 0x35, 0x05, 0x19,
0x00, 0x03, 0x08, 0x09, 0x35, 0x03, 0x19, 0x00,
0x08, 0x00));
define_ssa("BV-11-C/UUID-32",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0f, 0x35, 0x05, 0x1a,
0x00, 0x00, 0x11, 0x05, 0xff, 0xff, 0x35, 0x03,
0x09, 0x00, 0x04, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x1d, 0x00, 0x1a, 0x35,
0x18, 0x35, 0x16, 0x09, 0x00, 0x04, 0x35, 0x11,
0x35, 0x03, 0x19, 0x01, 0x00, 0x35, 0x05, 0x19,
0x00, 0x03, 0x08, 0x09, 0x35, 0x03, 0x19, 0x00,
0x08, 0x00));
define_ssa("BV-11-C/UUID-128",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x1b, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x05, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0xff, 0xff, 0x35, 0x03, 0x09, 0x00, 0x04, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x1d, 0x00, 0x1a, 0x35,
0x18, 0x35, 0x16, 0x09, 0x00, 0x04, 0x35, 0x11,
0x35, 0x03, 0x19, 0x01, 0x00, 0x35, 0x05, 0x19,
0x00, 0x03, 0x08, 0x09, 0x35, 0x03, 0x19, 0x00,
0x08, 0x00));
/*
* Service Search Attribute Request
*
* Verify the correct behaviour of the IUT when searching
* for existing Service(s) and Attribute BrowseGroupList
* using ServiceSearchAttributeRequest.
*/
define_ssa("BV-12-C/UUID-16",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0d, 0x35, 0x03, 0x19,
0x11, 0x05, 0xff, 0xff, 0x35, 0x03, 0x09, 0x00,
0x05, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x0c, 0x35,
0x0a, 0x35, 0x08, 0x09, 0x00, 0x05, 0x35, 0x03,
0x19, 0x10, 0x02, 0x00));
define_ssa("BV-12-C/UUID-32",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0f, 0x35, 0x05, 0x1a,
0x00, 0x00, 0x11, 0x05, 0xff, 0xff, 0x35, 0x03,
0x09, 0x00, 0x05, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x0c, 0x35,
0x0a, 0x35, 0x08, 0x09, 0x00, 0x05, 0x35, 0x03,
0x19, 0x10, 0x02, 0x00));
define_ssa("BV-12-C/UUID-128",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x1b, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x05, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0xff, 0xff, 0x35, 0x03, 0x09, 0x00, 0x05, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x0c, 0x35,
0x0a, 0x35, 0x08, 0x09, 0x00, 0x05, 0x35, 0x03,
0x19, 0x10, 0x02, 0x00));
/*
* Service Search Attribute Request
*
* Verify the correct behaviour of the IUT when searching
* for existing Service(s) and Attribute LanguageBaseAttributeIdList
* using ServiceSearchAttributeRequest.
*/
define_ssa("BV-13-C/UUID-16",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0d, 0x35, 0x03, 0x19,
0x11, 0x01, 0x00, 0x18, 0x35, 0x03, 0x09, 0x00,
0x06, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x15, 0x00, 0x12, 0x35,
0x10, 0x35, 0x0e, 0x09, 0x00, 0x06, 0x35, 0x09,
0x09, 0x65, 0x6e, 0x09, 0x00, 0x6a, 0x09, 0x01,
0x00, 0x00));
define_ssa("BV-13-C/UUID-32",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0f, 0x35, 0x05, 0x1a,
0x00, 0x00, 0x11, 0x01, 0x00, 0x18, 0x35, 0x03,
0x09, 0x00, 0x06, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x15, 0x00, 0x12, 0x35,
0x10, 0x35, 0x0e, 0x09, 0x00, 0x06, 0x35, 0x09,
0x09, 0x65, 0x6e, 0x09, 0x00, 0x6a, 0x09, 0x01,
0x00, 0x00));
define_ssa("BV-13-C/UUID-128",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x1b, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x18, 0x35, 0x03, 0x09, 0x00, 0x06, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x15, 0x00, 0x12, 0x35,
0x10, 0x35, 0x0e, 0x09, 0x00, 0x06, 0x35, 0x09,
0x09, 0x65, 0x6e, 0x09, 0x00, 0x6a, 0x09, 0x01,
0x00, 0x00));
/*
* Service Search Attribute Request
*
* Verify the correct behaviour of the IUT when searching
* for existing Service(s) and Attribute ServiceAvailability
* using ServiceSearchAttributeRequest.
*/
define_ssa("BV-14-C/UUID-16",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0d, 0x35, 0x03, 0x19,
0x11, 0x01, 0x00, 0x0f, 0x35, 0x03, 0x09, 0x00,
0x08, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x09, 0x35,
0x07, 0x35, 0x05, 0x09, 0x00, 0x08, 0x08, 0xff,
0x00));
define_ssa("BV-14-C/UUID-32",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0f, 0x35, 0x05, 0x1a,
0x00, 0x00, 0x11, 0x01, 0x00, 0x0f, 0x35, 0x03,
0x09, 0x00, 0x08, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x09, 0x35,
0x07, 0x35, 0x05, 0x09, 0x00, 0x08, 0x08, 0xff,
0x00));
define_ssa("BV-14-C/UUID-128",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x1b, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x0f, 0x35, 0x03, 0x09, 0x00, 0x08, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x09, 0x35,
0x07, 0x35, 0x05, 0x09, 0x00, 0x08, 0x08, 0xff,
0x00));
/*
* Service Search Attribute Request
*
* Verify the correct behaviour of the IUT when searching
* for existing Service(s) and Attribute IconURL using
* ServiceSearchAttributeRequest.
*/
define_ssa("BV-15-C/UUID-16",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0d, 0x35, 0x03, 0x19,
0x11, 0x01, 0x00, 0x24, 0x35, 0x03, 0x09, 0x00,
0x0c, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x21, 0x00, 0x1e, 0x35,
0x1c, 0x35, 0x1a, 0x09, 0x00, 0x0c, 0x45, 0x15,
0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77,
0x77, 0x77, 0x2e, 0x62, 0x6c, 0x75, 0x65, 0x7a,
0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x00));
define_ssa("BV-15-C/UUID-32",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0f, 0x35, 0x05, 0x1a,
0x00, 0x00, 0x11, 0x01, 0x00, 0x24, 0x35, 0x03,
0x09, 0x00, 0x0c, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x21, 0x00, 0x1e, 0x35,
0x1c, 0x35, 0x1a, 0x09, 0x00, 0x0c, 0x45, 0x15,
0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77,
0x77, 0x77, 0x2e, 0x62, 0x6c, 0x75, 0x65, 0x7a,
0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x00));
define_ssa("BV-15-C/UUID-128",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x1b, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x24, 0x35, 0x03, 0x09, 0x00, 0x0c, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x21, 0x00, 0x1e, 0x35,
0x1c, 0x35, 0x1a, 0x09, 0x00, 0x0c, 0x45, 0x15,
0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77,
0x77, 0x77, 0x2e, 0x62, 0x6c, 0x75, 0x65, 0x7a,
0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x00));
/*
* Service Search Attribute Request
*
* Verify the correct behaviour of the IUT when searching
* for existing Service(s) and Attribute ServiceName using
* ServiceSearchAttributeRequest.
*/
define_ssa("BV-16-C/UUID-16",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0d, 0x35, 0x03, 0x19,
0x11, 0x01, 0x00, 0x1b, 0x35, 0x03, 0x09, 0x00,
0x06, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x15, 0x00, 0x12, 0x35,
0x10, 0x35, 0x0e, 0x09, 0x00, 0x06, 0x35, 0x09,
0x09, 0x65, 0x6e, 0x09, 0x00, 0x6a, 0x09, 0x01,
0x00, 0x00),
raw_pdu(0x06, 0x00, 0x02, 0x00, 0x0d, 0x35, 0x03, 0x19,
0x11, 0x01, 0x00, 0x1d, 0x35, 0x03, 0x09, 0x01,
0x00, 0x00),
raw_pdu(0x07, 0x00, 0x02, 0x00, 0x17, 0x00, 0x14, 0x35,
0x12, 0x35, 0x10, 0x09, 0x01, 0x00, 0x25, 0x0b,
0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x20, 0x50,
0x6f, 0x72, 0x74, 0x00));
define_ssa("BV-16-C/UUID-32",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0f, 0x35, 0x05, 0x1a,
0x00, 0x00, 0x11, 0x01, 0x00, 0x1b, 0x35, 0x03,
0x09, 0x00, 0x06, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x15, 0x00, 0x12, 0x35,
0x10, 0x35, 0x0e, 0x09, 0x00, 0x06, 0x35, 0x09,
0x09, 0x65, 0x6e, 0x09, 0x00, 0x6a, 0x09, 0x01,
0x00, 0x00),
raw_pdu(0x06, 0x00, 0x02, 0x00, 0x0f, 0x35, 0x05, 0x1a,
0x00, 0x00, 0x11, 0x01, 0x00, 0x1d, 0x35, 0x03,
0x09, 0x01, 0x00, 0x00),
raw_pdu(0x07, 0x00, 0x02, 0x00, 0x17, 0x00, 0x14, 0x35,
0x12, 0x35, 0x10, 0x09, 0x01, 0x00, 0x25, 0x0b,
0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x20, 0x50,
0x6f, 0x72, 0x74, 0x00));
define_ssa("BV-16-C/UUID-128",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x1b, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x1b, 0x35, 0x03, 0x09, 0x00, 0x06, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x15, 0x00, 0x12, 0x35,
0x10, 0x35, 0x0e, 0x09, 0x00, 0x06, 0x35, 0x09,
0x09, 0x65, 0x6e, 0x09, 0x00, 0x6a, 0x09, 0x01,
0x00, 0x00),
raw_pdu(0x06, 0x00, 0x02, 0x00, 0x1b, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x1d, 0x35, 0x03, 0x09, 0x01, 0x00, 0x00),
raw_pdu(0x07, 0x00, 0x02, 0x00, 0x17, 0x00, 0x14, 0x35,
0x12, 0x35, 0x10, 0x09, 0x01, 0x00, 0x25, 0x0b,
0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x20, 0x50,
0x6f, 0x72, 0x74, 0x00));
/*
* Service Search Attribute Request
*
* Verify the correct behaviour of the IUT when searching
* for existing Service(s) and Attribute ServiceDescription
* using ServiceSearchAttributeRequest.
*/
define_ssa("BV-17-C/UUID-16",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0d, 0x35, 0x03, 0x19,
0x11, 0x01, 0x00, 0x1b, 0x35, 0x03, 0x09, 0x00,
0x06, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x15, 0x00, 0x12, 0x35,
0x10, 0x35, 0x0e, 0x09, 0x00, 0x06, 0x35, 0x09,
0x09, 0x65, 0x6e, 0x09, 0x00, 0x6a, 0x09, 0x01,
0x00, 0x00),
raw_pdu(0x06, 0x00, 0x02, 0x00, 0x0d, 0x35, 0x03, 0x19,
0x11, 0x01, 0x00, 0x1a, 0x35, 0x03, 0x09, 0x01,
0x01, 0x00),
raw_pdu(0x07, 0x00, 0x02, 0x00, 0x14, 0x00, 0x11, 0x35,
0x0f, 0x35, 0x0d, 0x09, 0x01, 0x01, 0x25, 0x08,
0x43, 0x4f, 0x4d, 0x20, 0x50, 0x6f, 0x72, 0x74,
0x00));
define_ssa("BV-17-C/UUID-32",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0f, 0x35, 0x05, 0x1a,
0x00, 0x00, 0x11, 0x01, 0x00, 0x1b, 0x35, 0x03,
0x09, 0x00, 0x06, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x15, 0x00, 0x12, 0x35,
0x10, 0x35, 0x0e, 0x09, 0x00, 0x06, 0x35, 0x09,
0x09, 0x65, 0x6e, 0x09, 0x00, 0x6a, 0x09, 0x01,
0x00, 0x00),
raw_pdu(0x06, 0x00, 0x02, 0x00, 0x0f, 0x35, 0x05, 0x1a,
0x00, 0x00, 0x11, 0x01, 0x00, 0x1a, 0x35, 0x03,
0x09, 0x01, 0x01, 0x00),
raw_pdu(0x07, 0x00, 0x02, 0x00, 0x14, 0x00, 0x11, 0x35,
0x0f, 0x35, 0x0d, 0x09, 0x01, 0x01, 0x25, 0x08,
0x43, 0x4f, 0x4d, 0x20, 0x50, 0x6f, 0x72, 0x74,
0x00));
define_ssa("BV-17-C/UUID-128",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x1b, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x1b, 0x35, 0x03, 0x09, 0x00, 0x06, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x15, 0x00, 0x12, 0x35,
0x10, 0x35, 0x0e, 0x09, 0x00, 0x06, 0x35, 0x09,
0x09, 0x65, 0x6e, 0x09, 0x00, 0x6a, 0x09, 0x01,
0x00, 0x00),
raw_pdu(0x06, 0x00, 0x02, 0x00, 0x1b, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x1a, 0x35, 0x03, 0x09, 0x01, 0x01, 0x00),
raw_pdu(0x07, 0x00, 0x02, 0x00, 0x14, 0x00, 0x11, 0x35,
0x0f, 0x35, 0x0d, 0x09, 0x01, 0x01, 0x25, 0x08,
0x43, 0x4f, 0x4d, 0x20, 0x50, 0x6f, 0x72, 0x74,
0x00));
/*
* Service Search Attribute Request
*
* Verify the correct behaviour of the IUT when searching
* for existing Service(s) and Attribute ProviderName using
* ServiceSearchAttributeRequest.
*/
define_ssa("BV-18-C/UUID-16",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0d, 0x35, 0x03, 0x19,
0x11, 0x01, 0x00, 0x1b, 0x35, 0x03, 0x09, 0x00,
0x06, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x15, 0x00, 0x12, 0x35,
0x10, 0x35, 0x0e, 0x09, 0x00, 0x06, 0x35, 0x09,
0x09, 0x65, 0x6e, 0x09, 0x00, 0x6a, 0x09, 0x01,
0x00, 0x00),
raw_pdu(0x06, 0x00, 0x02, 0x00, 0x0d, 0x35, 0x03, 0x19,
0x11, 0x01, 0x00, 0x17, 0x35, 0x03, 0x09, 0x01,
0x02, 0x00),
raw_pdu(0x07, 0x00, 0x02, 0x00, 0x11, 0x00, 0x0e, 0x35,
0x0c, 0x35, 0x0a, 0x09, 0x01, 0x02, 0x25, 0x05,
0x42, 0x6c, 0x75, 0x65, 0x5a, 0x00));
define_ssa("BV-18-C/UUID-32",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0f, 0x35, 0x05, 0x1a,
0x00, 0x00, 0x11, 0x01, 0x00, 0x1b, 0x35, 0x03,
0x09, 0x00, 0x06, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x15, 0x00, 0x12, 0x35,
0x10, 0x35, 0x0e, 0x09, 0x00, 0x06, 0x35, 0x09,
0x09, 0x65, 0x6e, 0x09, 0x00, 0x6a, 0x09, 0x01,
0x00, 0x00),
raw_pdu(0x06, 0x00, 0x02, 0x00, 0x0f, 0x35, 0x05, 0x1a,
0x00, 0x00, 0x11, 0x01, 0x00, 0x17, 0x35, 0x03,
0x09, 0x01, 0x02, 0x00),
raw_pdu(0x07, 0x00, 0x02, 0x00, 0x11, 0x00, 0x0e, 0x35,
0x0c, 0x35, 0x0a, 0x09, 0x01, 0x02, 0x25, 0x05,
0x42, 0x6c, 0x75, 0x65, 0x5a, 0x00));
define_ssa("BV-18-C/UUID-128",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x1b, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x1b, 0x35, 0x03, 0x09, 0x00, 0x06, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x15, 0x00, 0x12, 0x35,
0x10, 0x35, 0x0e, 0x09, 0x00, 0x06, 0x35, 0x09,
0x09, 0x65, 0x6e, 0x09, 0x00, 0x6a, 0x09, 0x01,
0x00, 0x00),
raw_pdu(0x06, 0x00, 0x02, 0x00, 0x1b, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x17, 0x35, 0x03, 0x09, 0x01, 0x02, 0x00),
raw_pdu(0x07, 0x00, 0x02, 0x00, 0x11, 0x00, 0x0e, 0x35,
0x0c, 0x35, 0x0a, 0x09, 0x01, 0x02, 0x25, 0x05,
0x42, 0x6c, 0x75, 0x65, 0x5a, 0x00));
/*
* Service Search Attribute Request
*
* Verify the correct behaviour of the IUT when searching
* for existing Service(s) and Attribute VersionNumberList
* using ServiceSearchAttributeRequest.
*/
define_ssa("BV-19-C/UUID-16",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0d, 0x35, 0x03, 0x19,
0x10, 0x00, 0x00, 0x12, 0x35, 0x03, 0x09, 0x02,
0x00, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x0c, 0x35,
0x0a, 0x35, 0x08, 0x09, 0x02, 0x00, 0x35, 0x03,
0x09, 0x01, 0x00, 0x00));
define_ssa("BV-19-C/UUID-32",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0f, 0x35, 0x05, 0x1a,
0x00, 0x00, 0x10, 0x00, 0x00, 0x12, 0x35, 0x03,
0x09, 0x02, 0x00, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x0c, 0x35,
0x0a, 0x35, 0x08, 0x09, 0x02, 0x00, 0x35, 0x03,
0x09, 0x01, 0x00, 0x00));
define_ssa("BV-19-C/UUID-128",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x1b, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0x00, 0x12, 0x35, 0x03, 0x09, 0x02, 0x00, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x0c, 0x35,
0x0a, 0x35, 0x08, 0x09, 0x02, 0x00, 0x35, 0x03,
0x09, 0x01, 0x00, 0x00));
/*
* Service Search Attribute Request
*
* Verify the correct behaviour of the IUT when searching for
* existing Service(s) and Attribute BluetoothProfileDescriptorList
* using ServiceSearchAttributeRequest.
*/
define_ssa("BV-20-C/UUID-16",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0d, 0x35, 0x03, 0x19,
0x11, 0x05, 0xff, 0xff, 0x35, 0x03, 0x09, 0x00,
0x09, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x14, 0x00, 0x11, 0x35,
0x0f, 0x35, 0x0d, 0x09, 0x00, 0x09, 0x35, 0x08,
0x35, 0x06, 0x19, 0x11, 0x05, 0x09, 0x01, 0x00,
0x00));
define_ssa("BV-20-C/UUID-32",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0f, 0x35, 0x05, 0x1a,
0x00, 0x00, 0x11, 0x05, 0xff, 0xff, 0x35, 0x03,
0x09, 0x00, 0x09, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x14, 0x00, 0x11, 0x35,
0x0f, 0x35, 0x0d, 0x09, 0x00, 0x09, 0x35, 0x08,
0x35, 0x06, 0x19, 0x11, 0x05, 0x09, 0x01, 0x00,
0x00));
define_ssa("BV-20-C/UUID-128",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x1b, 0x35, 0x11, 0x1c,
0x00, 0x00, 0x11, 0x05, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb,
0xff, 0xff, 0x35, 0x03, 0x09, 0x00, 0x09, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x14, 0x00, 0x11, 0x35,
0x0f, 0x35, 0x0d, 0x09, 0x00, 0x09, 0x35, 0x08,
0x35, 0x06, 0x19, 0x11, 0x05, 0x09, 0x01, 0x00,
0x00));
/*
* Service Search Attribute Request
*
* Verify the correct behaviour of the IUT when searching
* for existing Service(s) and Attribute DocumentationURL
* using ServiceSearchAttributeRequest.
*/
define_ssa("BV-21-C/UUID-16",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0d, 0x35, 0x03, 0x19,
0x11, 0x01, 0x00, 0x24, 0x35, 0x03, 0x09, 0x00,
0x0a, 0x00),
raw_pdu(0x07, 0x00, 0x01, 0x00, 0x21, 0x00, 0x1e, 0x35,
0x1c, 0x35, 0x1a, 0x09, 0x00, 0x0a, 0x45, 0x15,
0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77,
0x77, 0x77, 0x2e, 0x62, 0x6c, 0x75, 0x65, 0x7a,
0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x00));
define_ssa("BV-21-C/UUID-32",
raw_pdu(0x06, 0x00, 0x01, 0x00, 0x0f, 0x35, 0x05, 0x1a,
0x00, 0x00, 0x11, 0x01, 0x00, 0x24,