apps/bttester: Add support for discovering all primary services

This commit is contained in:
Michał Narajowski
2019-02-25 14:40:37 +01:00
parent 4d522e3a8d
commit 058b5aa1ca
2 changed files with 50 additions and 4 deletions
+10
View File
@@ -414,6 +414,16 @@ struct gatt_descriptor {
#define GATT_EXCHANGE_MTU 0x0a
#define GATT_DISC_ALL_PRIM_SVCS 0x0b
struct gatt_disc_all_prim_svcs_cmd {
u8_t address_type;
u8_t address[6];
} __packed;
struct gatt_disc_all_prim_svcs_rp {
u8_t services_count;
struct gatt_service services[0];
} __packed;
#define GATT_DISC_PRIM_UUID 0x0c
struct gatt_disc_prim_uuid_cmd {
u8_t address_type;
+40 -4
View File
@@ -387,6 +387,7 @@ static void supported_commands(u8_t *data, u16_t len)
tester_set_bit(cmds, GATT_START_SERVER);
tester_set_bit(cmds, GATT_SET_ENC_KEY_SIZE);
tester_set_bit(cmds, GATT_EXCHANGE_MTU);
tester_set_bit(cmds, GATT_DISC_ALL_PRIM_SVCS);
tester_set_bit(cmds, GATT_DISC_PRIM_UUID);
tester_set_bit(cmds, GATT_FIND_INCLUDED);
tester_set_bit(cmds, GATT_DISC_ALL_CHRC);
@@ -900,11 +901,12 @@ static int disc_prim_uuid_cb(uint16_t conn_handle,
struct gatt_service *service;
const ble_uuid_any_t *uuid;
u8_t uuid_length;
u8_t opcode = (u8_t) (int) arg;
SYS_LOG_DBG("");
if (error->status != 0) {
tester_send(BTP_SERVICE_ID_GATT, GATT_DISC_PRIM_UUID,
tester_send(BTP_SERVICE_ID_GATT, opcode,
CONTROLLER_INDEX, gatt_buf.buf, gatt_buf.len);
discover_destroy();
return 0;
@@ -915,7 +917,7 @@ static int disc_prim_uuid_cb(uint16_t conn_handle,
service = gatt_buf_reserve(sizeof(*service) + uuid_length);
if (!service) {
tester_rsp(BTP_SERVICE_ID_GATT, GATT_DISC_PRIM_UUID,
tester_rsp(BTP_SERVICE_ID_GATT, opcode,
CONTROLLER_INDEX, BTP_STATUS_FAILED);
discover_destroy();
return BLE_HS_EDONE;
@@ -939,6 +941,36 @@ static int disc_prim_uuid_cb(uint16_t conn_handle,
return 0;
}
static void disc_all_prim_svcs(u8_t *data, u16_t len)
{
struct ble_gap_conn_desc conn;
int rc;
SYS_LOG_DBG("");
rc = ble_gap_conn_find_by_addr((ble_addr_t *)data, &conn);
if (rc) {
goto fail;
}
if (!gatt_buf_reserve(sizeof(struct gatt_disc_all_prim_svcs_rp))) {
goto fail;
}
if (ble_gattc_disc_all_svcs(conn.conn_handle,
disc_prim_uuid_cb,
(void *) GATT_DISC_ALL_PRIM_SVCS)) {
discover_destroy();
goto fail;
}
return;
fail:
tester_rsp(BTP_SERVICE_ID_GATT, GATT_DISC_ALL_PRIM_SVCS,
CONTROLLER_INDEX, BTP_STATUS_FAILED);
}
static void disc_prim_uuid(u8_t *data, u16_t len)
{
const struct gatt_disc_prim_uuid_cmd *cmd = (void *) data;
@@ -961,8 +993,9 @@ static void disc_prim_uuid(u8_t *data, u16_t len)
goto fail;
}
if (ble_gattc_disc_svc_by_uuid(conn.conn_handle, &uuid.u,
disc_prim_uuid_cb, NULL)) {
if (ble_gattc_disc_svc_by_uuid(conn.conn_handle,
&uuid.u, disc_prim_uuid_cb,
(void *) GATT_DISC_PRIM_UUID)) {
discover_destroy();
goto fail;
}
@@ -2096,6 +2129,9 @@ void tester_handle_gatt(u8_t opcode, u8_t index, u8_t *data,
case GATT_EXCHANGE_MTU:
exchange_mtu(data, len);
return;
case GATT_DISC_ALL_PRIM_SVCS:
disc_all_prim_svcs(data, len);
return;
case GATT_DISC_PRIM_UUID:
disc_prim_uuid(data, len);
return;