diff --git a/apps/bttester/src/bttester.h b/apps/bttester/src/bttester.h index a17118f92..95c0c8c0e 100644 --- a/apps/bttester/src/bttester.h +++ b/apps/bttester/src/bttester.h @@ -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; diff --git a/apps/bttester/src/gatt.c b/apps/bttester/src/gatt.c index 6da27282d..b3c3c8355 100644 --- a/apps/bttester/src/gatt.c +++ b/apps/bttester/src/gatt.c @@ -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;