Skip to content

Commit fd12b6b

Browse files
nimble/bttester: Add BTP supported events handling
Populate and return per-service event bitmaps so autopts can query supported events after registration, just like supported commands.
1 parent 2f990a9 commit fd12b6b

15 files changed

Lines changed: 344 additions & 0 deletions

File tree

apps/bttester/src/btp/btp.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@
5858
#define BTP_STATUS_UNKNOWN_CMD 0x02
5959
#define BTP_STATUS_NOT_READY 0x03
6060

61+
#define BTP_EVENT_OPCODE_BASE 0x80
62+
#define BTP_EVENT_BIT(ev) ((uint8_t)(ev) - BTP_EVENT_OPCODE_BASE)
63+
#define BTP_EVENT_BITMAP_LEN(last_ev) (BTP_EVENT_BIT(last_ev) / 8 + 1)
64+
6165
/* TODO indicate delay response, should be removed when all commands are
6266
* converted to cmd+status+ev pattern
6367
*/

apps/bttester/src/btp/btp_bap.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,12 @@ struct btp_bap_broadcast_source_setup_v2_rp {
200200
uint32_t gap_settings;
201201
} __packed;
202202

203+
#define BTP_BAP_READ_SUPPORTED_EVENTS 0x1b
204+
struct btp_bap_read_supported_events_rp {
205+
uint8_t data[0];
206+
} __packed;
207+
208+
/* events */
203209
#define BTP_BAP_EV_DISCOVERY_COMPLETED 0x80
204210
struct btp_bap_discovery_completed_ev {
205211
ble_addr_t address;

apps/bttester/src/btp/btp_gap.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,11 @@ struct gap_subrate_request_cmd {
339339
uint16_t supervision_timeout;
340340
} __packed;
341341

342+
#define BTP_GAP_READ_SUPPORTED_EVENTS 0x35
343+
struct btp_gap_read_supported_events_rp {
344+
uint8_t data[0];
345+
} __packed;
346+
342347
/* events */
343348
#define BTP_GAP_EV_NEW_SETTINGS 0x80
344349
struct btp_gap_new_settings_ev {

apps/bttester/src/btp/btp_gatt.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,11 @@ struct btp_gatt_notify_mult_val_cmd {
321321
uint16_t handles[0];
322322
} __packed;
323323

324+
#define BTP_GATT_READ_SUPPORTED_EVENTS 0x24
325+
struct btp_gatt_read_supported_events_rp {
326+
uint8_t data[0];
327+
} __packed;
328+
324329
/* GATT events */
325330
#define BTP_GATT_EV_NOTIFICATION 0x80
326331
struct btp_gatt_notification_ev {

apps/bttester/src/btp/btp_gattc.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,11 @@ struct btp_gattc_read_multiple_var_cmd {
173173
uint16_t handles[0];
174174
} __packed;
175175

176+
#define BTP_GATTC_READ_SUPPORTED_EVENTS 0x15
177+
struct btp_gattc_read_supported_events_rp {
178+
uint8_t data[0];
179+
} __packed;
180+
176181
/* events */
177182
#define BTP_GATTC_EV_MTU_EXCHANGED 0x80
178183
struct btp_gattc_exchange_mtu_ev {

apps/bttester/src/btp/btp_l2cap.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,11 @@ struct btp_l2cap_credits_cmd {
9292
uint8_t chan_id;
9393
} __packed;
9494

95+
#define BTP_L2CAP_READ_SUPPORTED_EVENTS 0x0e
96+
struct btp_l2cap_read_supported_events_rp {
97+
uint8_t data[0];
98+
} __packed;
99+
95100
/* events */
96101
#define BTP_L2CAP_EV_CONNECTION_REQ 0x80
97102
struct btp_l2cap_connection_req_ev {

apps/bttester/src/btp/btp_mesh.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,11 @@ struct btp_mesh_lpn_unsubscribe_cmd {
140140
#define BTP_MESH_PROXY_IDENTITY 0x13
141141
#define BTP_MESH_START 0x78
142142

143+
#define BTP_MESH_READ_SUPPORTED_EVENTS 0x79
144+
struct btp_mesh_read_supported_events_rp {
145+
uint8_t data[0];
146+
} __packed;
147+
143148
/* events */
144149
#define BTP_MESH_EV_OUT_NUMBER_ACTION 0x80
145150
struct btp_mesh_out_number_action_ev {

apps/bttester/src/btp/bttester.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,11 @@ void tester_register_command_handlers(uint8_t service,
9494
const struct btp_handler *handlers,
9595
size_t num);
9696

97+
void tester_register_supported_events(uint8_t service, const uint8_t *events,
98+
uint8_t len);
99+
97100
uint16_t tester_supported_commands(uint8_t service, uint8_t *cmds);
101+
uint16_t tester_supported_events(uint8_t service, uint8_t *events);
98102

99103
void
100104
tester_send_buf(uint8_t service, uint8_t opcode, uint8_t index,

apps/bttester/src/btp_bap.c

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,31 @@ static uint32_t sdu_interval;
5858

5959
static struct ble_audio_base tester_base;
6060

61+
/* Important: Remember to update this if new events are introduced */
62+
#define BTP_BAP_EV_MAX BTP_BAP_EV_PA_SYNC_REQ
63+
64+
#define BAP_SUPPORTED_EVENTS_LEN BTP_EVENT_BITMAP_LEN(BTP_BAP_EV_MAX)
65+
66+
static uint8_t bap_supported_events[BAP_SUPPORTED_EVENTS_LEN];
67+
68+
static void
69+
bap_init_supported_events(void)
70+
{
71+
memset(bap_supported_events, 0, sizeof(bap_supported_events));
72+
73+
tester_set_bit(bap_supported_events, BTP_EVENT_BIT(BTP_BAP_EV_DISCOVERY_COMPLETED));
74+
tester_set_bit(bap_supported_events, BTP_EVENT_BIT(BTP_BAP_EV_CODEC_CAP_FOUND));
75+
tester_set_bit(bap_supported_events, BTP_EVENT_BIT(BTP_BAP_EV_ASE_FOUND));
76+
tester_set_bit(bap_supported_events, BTP_EVENT_BIT(BTP_BAP_EV_STREAM_RECEIVED));
77+
tester_set_bit(bap_supported_events, BTP_EVENT_BIT(BTP_BAP_EV_BAA_FOUND));
78+
tester_set_bit(bap_supported_events, BTP_EVENT_BIT(BTP_BAP_EV_BIS_FOUND));
79+
tester_set_bit(bap_supported_events, BTP_EVENT_BIT(BTP_BAP_EV_BIS_SYNCED));
80+
tester_set_bit(bap_supported_events, BTP_EVENT_BIT(BTP_BAP_EV_BIS_STREAM_RECEIVED));
81+
tester_set_bit(bap_supported_events, BTP_EVENT_BIT(BTP_BAP_EV_SCAN_DELEGATOR_FOUND));
82+
tester_set_bit(bap_supported_events, BTP_EVENT_BIT(BTP_BAP_EV_BROADCAST_RECEIVE_STATE));
83+
tester_set_bit(bap_supported_events, BTP_EVENT_BIT(BTP_BAP_EV_PA_SYNC_REQ));
84+
}
85+
6186
static os_membuf_t bis_mem[
6287
OS_MEMPOOL_SIZE(MYNEWT_VAL(BLE_ISO_MAX_BISES),
6388
sizeof(struct ble_audio_bis))
@@ -145,6 +170,17 @@ supported_commands(const void *cmd, uint16_t cmd_len,
145170
return BTP_STATUS_SUCCESS;
146171
}
147172

173+
static uint8_t
174+
supported_events(const void *cmd, uint16_t cmd_len, void *rsp, uint16_t *rsp_len)
175+
{
176+
struct btp_bap_read_supported_events_rp *rp = rsp;
177+
178+
*rsp_len = tester_supported_events(BTP_SERVICE_ID_BAP, rp->data);
179+
*rsp_len += sizeof(*rp);
180+
181+
return BTP_STATUS_SUCCESS;
182+
}
183+
148184
static int
149185
base_create(const struct bap_broadcast_source_setup_cmd *cmd)
150186
{
@@ -402,6 +438,12 @@ static const struct btp_handler handlers[] = {
402438
.expect_len = 0,
403439
.func = supported_commands,
404440
},
441+
{
442+
.opcode = BTP_BAP_READ_SUPPORTED_EVENTS,
443+
.index = BTP_INDEX_NONE,
444+
.expect_len = 0,
445+
.func = supported_events,
446+
},
405447
{
406448
.opcode = BTP_BAP_BROADCAST_SOURCE_SETUP,
407449
.index = BTP_INDEX,
@@ -653,8 +695,12 @@ tester_init_bap(void)
653695
scan_delegator_audio_event_handler, NULL);
654696
assert(rc == 0);
655697

698+
bap_init_supported_events();
699+
656700
tester_register_command_handlers(BTP_SERVICE_ID_BAP, handlers,
657701
ARRAY_SIZE(handlers));
702+
tester_register_supported_events(BTP_SERVICE_ID_BAP, bap_supported_events,
703+
sizeof(bap_supported_events));
658704

659705
return BTP_STATUS_SUCCESS;
660706
}

apps/bttester/src/btp_gap.c

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include "../../../nimble/host/src/ble_sm_priv.h"
3535

3636
#include "btp/btp.h"
37+
#include "btp/bttester.h"
3738

3839
#include <errno.h>
3940

@@ -89,6 +90,43 @@ static const struct ble_gap_conn_params dflt_conn_params = {
8990
.max_ce_len = 0x0300,
9091
};
9192

93+
/* Important: Remember to update this if new events are introduced */
94+
#define BTP_GAP_EV_MAX GAP_EV_SUBRATE_CHANGE
95+
96+
#define GAP_SUPPORTED_EVENTS_LEN BTP_EVENT_BITMAP_LEN(BTP_GAP_EV_MAX)
97+
98+
static uint8_t gap_supported_events[GAP_SUPPORTED_EVENTS_LEN];
99+
100+
static void
101+
gap_init_supported_events(void)
102+
{
103+
memset(gap_supported_events, 0, sizeof(gap_supported_events));
104+
105+
tester_set_bit(gap_supported_events, BTP_EVENT_BIT(BTP_GAP_EV_NEW_SETTINGS));
106+
tester_set_bit(gap_supported_events, BTP_EVENT_BIT(BTP_GAP_EV_DEVICE_FOUND));
107+
tester_set_bit(gap_supported_events, BTP_EVENT_BIT(BTP_GAP_EV_DEVICE_CONNECTED));
108+
tester_set_bit(gap_supported_events, BTP_EVENT_BIT(BTP_GAP_EV_DEVICE_DISCONNECTED));
109+
tester_set_bit(gap_supported_events, BTP_EVENT_BIT(BTP_GAP_EV_PASSKEY_DISPLAY));
110+
tester_set_bit(gap_supported_events, BTP_EVENT_BIT(BTP_GAP_EV_PASSKEY_ENTRY_REQ));
111+
tester_set_bit(gap_supported_events, BTP_EVENT_BIT(BTP_GAP_EV_PASSKEY_CONFIRM_REQ));
112+
tester_set_bit(gap_supported_events, BTP_EVENT_BIT(BTP_GAP_EV_IDENTITY_RESOLVED));
113+
tester_set_bit(gap_supported_events, BTP_EVENT_BIT(BTP_GAP_EV_CONN_PARAM_UPDATE));
114+
tester_set_bit(gap_supported_events, BTP_EVENT_BIT(BTP_GAP_EV_SEC_LEVEL_CHANGED));
115+
tester_set_bit(gap_supported_events, BTP_EVENT_BIT(BTP_GAP_EV_BOND_LOST));
116+
tester_set_bit(gap_supported_events, BTP_EVENT_BIT(BTP_GAP_EV_SEC_PAIRING_FAILED));
117+
#if MYNEWT_VAL(BLE_PERIODIC_ADV)
118+
tester_set_bit(gap_supported_events, BTP_EVENT_BIT(GAP_EV_PERIODIC_SYNC_ESTABLISHED));
119+
tester_set_bit(gap_supported_events, BTP_EVENT_BIT(GAP_EV_PERIODIC_SYNC_LOST));
120+
tester_set_bit(gap_supported_events, BTP_EVENT_BIT(GAP_EV_PERIODIC_REPORT));
121+
#endif
122+
#if MYNEWT_VAL(BLE_PERIODIC_ADV_SYNC_TRANSFER)
123+
tester_set_bit(gap_supported_events, BTP_EVENT_BIT(GAP_EV_PERIODIC_TRANSFER_RECEIVED));
124+
#endif
125+
#if MYNEWT_VAL(BLE_CONN_SUBRATING)
126+
tester_set_bit(gap_supported_events, BTP_EVENT_BIT(GAP_EV_SUBRATE_CHANGE));
127+
#endif
128+
}
129+
92130
static int
93131
gap_conn_find_by_addr(const ble_addr_t *dev_addr,
94132
struct ble_gap_conn_desc *out_desc)
@@ -134,6 +172,17 @@ supported_commands(const void *cmd, uint16_t cmd_len,
134172
return BTP_STATUS_SUCCESS;
135173
}
136174

175+
static uint8_t
176+
supported_events(const void *cmd, uint16_t cmd_len, void *rsp, uint16_t *rsp_len)
177+
{
178+
struct btp_gap_read_supported_events_rp *rp = rsp;
179+
180+
*rsp_len = tester_supported_events(BTP_SERVICE_ID_GAP, rp->data);
181+
*rsp_len += sizeof(*rp);
182+
183+
return BTP_STATUS_SUCCESS;
184+
}
185+
137186
static uint8_t
138187
controller_index_list(const void *cmd, uint16_t cmd_len,
139188
void *rsp, uint16_t *rsp_len)
@@ -2277,6 +2326,12 @@ static const struct btp_handler handlers[] = {
22772326
.expect_len = 0,
22782327
.func = supported_commands,
22792328
},
2329+
{
2330+
.opcode = BTP_GAP_READ_SUPPORTED_EVENTS,
2331+
.index = BTP_INDEX_NONE,
2332+
.expect_len = 0,
2333+
.func = supported_events,
2334+
},
22802335
{
22812336
.opcode = BTP_GAP_READ_CONTROLLER_INDEX_LIST,
22822337
.index = BTP_INDEX_NONE,
@@ -2483,9 +2538,12 @@ tester_init_gap(void)
24832538
assert(adv_buf);
24842539

24852540
tester_init_gap_cb();
2541+
gap_init_supported_events();
24862542

24872543
tester_register_command_handlers(BTP_SERVICE_ID_GAP, handlers,
24882544
ARRAY_SIZE(handlers));
2545+
tester_register_supported_events(BTP_SERVICE_ID_GAP, gap_supported_events,
2546+
sizeof(gap_supported_events));
24892547

24902548
return BTP_STATUS_SUCCESS;
24912549
}

0 commit comments

Comments
 (0)