From 2142bad3bd0406f95b7a717fe163d7d878614946 Mon Sep 17 00:00:00 2001 From: Szymon Czapracki Date: Mon, 7 Jul 2025 12:49:50 +0200 Subject: [PATCH 1/4] nimble/bttester: Enable subrating for bttester Enable subrating features for bttester. This feature is required for following tests: GAP/CSUB/CSR/BV-01-C & GAP/CSUB/CSU/BV-01-C. --- apps/bttester/syscfg.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/bttester/syscfg.yml b/apps/bttester/syscfg.yml index 646c1b66ab..18fa8afb0f 100644 --- a/apps/bttester/syscfg.yml +++ b/apps/bttester/syscfg.yml @@ -189,3 +189,4 @@ syscfg.vals.!BTTESTER_NODEFAULT: BLE_MESH_RX_SEG_MAX: 13 BLE_MESH_TX_SEG_MSG_COUNT: 2 BLE_MAX_CONNECTIONS: 8 + BLE_CONN_SUBRATING: 1 From 4d5eda948a91734de2c24486105b7d75d1230a4d Mon Sep 17 00:00:00 2001 From: Szymon Czapracki Date: Mon, 7 Jul 2025 12:51:43 +0200 Subject: [PATCH 2/4] nimble/btp: Add support for subrating procedures Add proper BTP subrating commands and functions in GAP. Required to satisfy corresponding auto-pts layer. --- apps/bttester/src/btp/btp_gap.h | 11 +++++++++++ apps/bttester/src/btp_gap.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/apps/bttester/src/btp/btp_gap.h b/apps/bttester/src/btp/btp_gap.h index 5485cd66e4..ac6f26d5a4 100644 --- a/apps/bttester/src/btp/btp_gap.h +++ b/apps/bttester/src/btp/btp_gap.h @@ -328,6 +328,17 @@ struct gap_periodic_adv_sync_transfer_recv_cmd { uint16_t sync_timeout; uint8_t flags; } __packed; + +#define GAP_SUBRATE_REQUEST 0x2b +struct gap_subrate_request_cmd { + ble_addr_t address; + uint16_t subrate_min; + uint16_t subrate_max; + uint16_t max_latency; + uint16_t cont_num; + uint16_t supervision_timeout; +} __packed; + /* events */ #define BTP_GAP_EV_NEW_SETTINGS 0x80 struct btp_gap_new_settings_ev { diff --git a/apps/bttester/src/btp_gap.c b/apps/bttester/src/btp_gap.c index 48e9958677..220bbd74ed 100644 --- a/apps/bttester/src/btp_gap.c +++ b/apps/bttester/src/btp_gap.c @@ -2210,6 +2210,29 @@ periodic_adv_sync_transfer_set_info(const void *cmd, uint16_t cmd_len, } #endif +#if MYNEWT_VAL(BLE_CONN_SUBRATING) +static uint8_t +subrate_request(const void *cmd, uint16_t cmd_len, void *rsp, uint16_t *rsp_len) +{ + const struct gap_subrate_request_cmd *cp = cmd; + struct ble_gap_conn_desc desc; + int rc; + + rc = gap_conn_find_by_addr(&cp->address, &desc); + if (rc) { + return BTP_STATUS_FAILED; + } + + rc = ble_gap_subrate_req(desc.conn_handle, cp->subrate_min, cp->subrate_max, + cp->max_latency, cp->cont_num, cp->supervision_timeout); + if (rc) { + return BTP_STATUS_FAILED; + } + + return BTP_STATUS_SUCCESS; +} +#endif + static const struct btp_handler handlers[] = { { .opcode = BTP_GAP_READ_SUPPORTED_COMMANDS, @@ -2380,6 +2403,13 @@ static const struct btp_handler handlers[] = { .func = periodic_adv_sync_transfer_recv, }, #endif +#if MYNEWT_VAL(BLE_CONN_SUBRATING) + { + .opcode = GAP_SUBRATE_REQUEST, + .expect_len = sizeof(struct gap_subrate_request_cmd), + .func = subrate_request, + }, +#endif }; static void From 5fec42d31b6d2b37ab1c80a8d1028cf583876aa8 Mon Sep 17 00:00:00 2001 From: Szymon Czapracki Date: Mon, 7 Jul 2025 17:10:51 +0200 Subject: [PATCH 3/4] nimble/btp: Subrate change event handling Add Subrate change event definition and handling in BTP layer. --- apps/bttester/src/btp/btp_gap.h | 11 ++++++++++ apps/bttester/src/btp_gap.c | 37 +++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/apps/bttester/src/btp/btp_gap.h b/apps/bttester/src/btp/btp_gap.h index ac6f26d5a4..c95a0d219f 100644 --- a/apps/bttester/src/btp/btp_gap.h +++ b/apps/bttester/src/btp/btp_gap.h @@ -455,3 +455,14 @@ struct gap_periodic_transfer_recieved_ev { uint8_t status; ble_addr_t peer_addr; } __packed; + +#define GAP_EV_SUBRATE_CHANGE 0x92 +struct gap_subrate_change_ev { + ble_addr_t addr; + uint8_t status; + uint16_t conn_handle; + uint16_t subrate_factor; + uint16_t periph_latency; + uint16_t cont_num; + uint16_t supervision_tmo; +} __packed; diff --git a/apps/bttester/src/btp_gap.c b/apps/bttester/src/btp_gap.c index 220bbd74ed..29fb50a103 100644 --- a/apps/bttester/src/btp_gap.c +++ b/apps/bttester/src/btp_gap.c @@ -1265,6 +1265,30 @@ periodic_transfer_received(struct ble_gap_event *event) } #endif +#if MYNEWT_VAL(BLE_CONN_SUBRATING) +static void +subrate_change_received(struct ble_gap_event *event) +{ + int rc; + struct ble_gap_conn_desc desc; + struct gap_subrate_change_ev ev; + + rc = ble_gap_conn_find(event->subrate_change.conn_handle, &desc); + assert(rc == 0); + + ev.addr = desc.peer_ota_addr; + ev.status = event->subrate_change.status; + ev.conn_handle = event->subrate_change.conn_handle; + ev.subrate_factor = event->subrate_change.subrate_factor; + ev.periph_latency = event->subrate_change.periph_latency; + ev.cont_num = event->subrate_change.cont_num; + ev.supervision_tmo = event->subrate_change.supervision_tmo; + + tester_event(BTP_SERVICE_ID_GAP, GAP_EV_SUBRATE_CHANGE, (uint8_t *)&ev, + sizeof(ev)); +} +#endif + static void print_bytes(const uint8_t *bytes, int len) { @@ -1563,6 +1587,19 @@ gap_event_cb(struct ble_gap_event *event, void *arg) event->periodic_transfer.adv_clk_accuracy); periodic_transfer_received(event); break; +#endif +#if MYNEWT_VAL(BLE_CONN_SUBRATING) + case BLE_GAP_EVENT_SUBRATE_CHANGE: + console_printf( + "Subrate change received:" + "status=%d, conn_handle=%d, subrate_factor=%d, perpih_latency=%d," + "cont_num=%d supervision_tmo=%d", + event->subrate_change.status, event->subrate_change.conn_handle, + event->subrate_change.subrate_factor, + event->subrate_change.periph_latency, event->subrate_change.cont_num, + event->subrate_change.supervision_tmo); + subrate_change_received(event); + break; #endif default: break; From aeabe01ee2ed15e2a240222e872656ef9718fa27 Mon Sep 17 00:00:00 2001 From: Szymon Czapracki Date: Tue, 8 Jul 2025 10:58:03 +0200 Subject: [PATCH 4/4] nimble/host/gap: Add callback for subrate change event `ble_gap_rx_subrate_change()` handler now invokes `ble_gap_call_conn_event_cb()` to allow applications to react to subrate change events. This addition ensures that registered connection event callbacks are notified when a subrate change occurs, providing better support for LE Subrate procedures. --- nimble/host/src/ble_gap.c | 1 + 1 file changed, 1 insertion(+) diff --git a/nimble/host/src/ble_gap.c b/nimble/host/src/ble_gap.c index baa010e0b4..80ab840c8b 100644 --- a/nimble/host/src/ble_gap.c +++ b/nimble/host/src/ble_gap.c @@ -1993,6 +1993,7 @@ ble_gap_rx_subrate_change(const struct ble_hci_ev_le_subev_subrate_change *ev) event.subrate_change.supervision_tmo = le16toh(ev->supervision_tmo); ble_gap_event_listener_call(&event); + ble_gap_call_conn_event_cb(&event, ev->conn_handle); } #endif