diff --git a/nimble/host/test/src/ble_gap_test.c b/nimble/host/test/src/ble_gap_test.c index d161ad918..2ec3501e1 100644 --- a/nimble/host/test/src/ble_gap_test.c +++ b/nimble/host/test/src/ble_gap_test.c @@ -832,6 +832,10 @@ TEST_CASE(ble_gap_test_case_conn_gen_good) TEST_ASSERT(ble_gap_master_in_progress()); TEST_ASSERT(ble_hs_atomic_conn_flags(2, NULL) == BLE_HS_ENOTCONN); + /* ble_gap_rx_conn_complete() will send extra HCI command, need phony ack */ + ble_hs_test_util_set_ack(ble_hs_hci_util_opcode_join(BLE_HCI_OGF_LE, + BLE_HCI_OCF_LE_RD_REM_FEAT), 0); + /* Receive connection complete event. */ memset(&evt, 0, sizeof evt); evt.subevent_code = BLE_HCI_LE_SUBEV_CONN_COMPLETE; @@ -1055,6 +1059,10 @@ TEST_CASE(ble_gap_test_case_conn_cancel_ctlr_fail) */ TEST_ASSERT(ble_gap_test_event.type == 0xff); + /* ble_gap_rx_conn_complete() will send extra HCI command, need phony ack */ + ble_hs_test_util_set_ack(ble_hs_hci_util_opcode_join(BLE_HCI_OGF_LE, + BLE_HCI_OCF_LE_RD_REM_FEAT), 0); + /* Allow connection complete to succeed. */ memset(&evt, 0, sizeof evt); evt.subevent_code = BLE_HCI_LE_SUBEV_CONN_COMPLETE; @@ -1236,6 +1244,7 @@ TEST_CASE(ble_gap_test_case_conn_find) BLE_ADDR_PUBLIC, ((uint8_t[6]){2,3,4,5,6,7}), ((uint8_t[6]){0,0,0,0,0,0}), + BLE_HS_TEST_CONN_FEAT_ALL, ble_gap_test_util_connect_cb, NULL); @@ -1284,6 +1293,7 @@ TEST_CASE(ble_gap_test_case_conn_find) BLE_ADDR_RANDOM_ID, ((uint8_t[6]){3,4,5,6,7,8}), ((uint8_t[6]){0x50,1,2,3,4,5}), + BLE_HS_TEST_CONN_FEAT_ALL, ble_gap_test_util_connect_cb, NULL); @@ -1402,6 +1412,15 @@ ble_gap_test_util_adv(uint8_t own_addr_type, /* Receive a connection complete event. */ if (conn_mode != BLE_GAP_CONN_MODE_NON) { + if (connect_status == BLE_ERR_SUCCESS) { + /* + * ble_gap_rx_conn_complete() will send extra HCI command, need + * phony ack + */ + ble_hs_test_util_set_ack(ble_hs_hci_util_opcode_join(BLE_HCI_OGF_LE, + BLE_HCI_OCF_LE_RD_REM_FEAT), 0); + } + memset(&evt, 0, sizeof evt); evt.subevent_code = BLE_HCI_LE_SUBEV_CONN_COMPLETE; evt.status = connect_status; @@ -1808,7 +1827,6 @@ ble_gap_test_util_update_no_l2cap(struct ble_gap_upd_params *params, static void ble_gap_test_util_update_l2cap(struct ble_gap_upd_params *params, - uint8_t hci_status, int event_status, uint16_t l2cap_result) { struct ble_l2cap_sig_update_params l2cap_params; @@ -1820,8 +1838,9 @@ ble_gap_test_util_update_l2cap(struct ble_gap_upd_params *params, ble_gap_test_util_init(); - ble_hs_test_util_create_conn(2, peer_addr, ble_gap_test_util_connect_cb, - NULL); + ble_hs_test_util_create_conn_feat(2, peer_addr, + BLE_HS_TEST_CONN_FEAT_NO_CONN_PARAM, + ble_gap_test_util_connect_cb, NULL); ble_hs_lock(); conn = ble_hs_conn_find(2); @@ -1834,35 +1853,11 @@ ble_gap_test_util_update_l2cap(struct ble_gap_upd_params *params, */ ble_gap_test_util_reset_cb_info(); - rc = ble_hs_test_util_conn_update(2, params, hci_status); + rc = ble_hs_test_util_conn_update(2, params, 0xFF); TEST_ASSERT(rc == 0); - /* Verify tx of connection update command. */ - ble_gap_test_util_verify_tx_update_conn(params); - - switch (hci_status) { - case 0: - /* Receive connection update complete event. */ - ble_gap_test_util_rx_update_complete(event_status, params); - break; - case BLE_ERR_UNKNOWN_HCI_CMD: - break; - default: - TEST_ASSERT_FATAL(0); - break; - } - TEST_ASSERT(ble_gap_dbg_update_active(2)); - /* Attempt two duplicate updates; ensure BLE_HS_EALREADY gets returned - * both times. Make sure initial update still completes successfully - * (MYNEWT-702). - */ - rc = ble_hs_test_util_conn_update(2, params, 0); - TEST_ASSERT(rc == BLE_HS_EALREADY); - rc = ble_hs_test_util_conn_update(2, params, 0); - TEST_ASSERT(rc == BLE_HS_EALREADY); - l2cap_params.itvl_min = params->itvl_min; l2cap_params.itvl_max = params->itvl_max; l2cap_params.slave_latency = params->latency; @@ -1974,8 +1969,9 @@ ble_gap_test_util_update_l2cap_tmo(struct ble_gap_upd_params *params, ble_gap_test_util_init(); - ble_hs_test_util_create_conn(2, peer_addr, ble_gap_test_util_connect_cb, - NULL); + ble_hs_test_util_create_conn_feat(2, peer_addr, + BLE_HS_TEST_CONN_FEAT_NO_CONN_PARAM, + ble_gap_test_util_connect_cb, NULL); ble_hs_lock(); conn = ble_hs_conn_find(2); @@ -1988,24 +1984,9 @@ ble_gap_test_util_update_l2cap_tmo(struct ble_gap_upd_params *params, */ ble_gap_test_util_reset_cb_info(); - rc = ble_hs_test_util_conn_update(2, params, hci_status); + rc = ble_hs_test_util_conn_update(2, params, 0xFF); TEST_ASSERT(rc == 0); - /* Verify tx of connection update command. */ - ble_gap_test_util_verify_tx_update_conn(params); - - switch (hci_status) { - case 0: - /* Receive connection update complete event. */ - ble_gap_test_util_rx_update_complete(event_status, params); - break; - case BLE_ERR_UNKNOWN_HCI_CMD: - break; - default: - TEST_ASSERT_FATAL(0); - break; - } - TEST_ASSERT(ble_gap_dbg_update_active(2)); if (rx_l2cap) { @@ -2418,26 +2399,11 @@ TEST_CASE(ble_gap_test_case_update_conn_l2cap) .max_ce_len = 456, }; - /* Accepted L2CAP failover; success. */ - ble_gap_test_util_update_l2cap(¶ms, BLE_ERR_UNKNOWN_HCI_CMD, 0, - BLE_L2CAP_SIG_UPDATE_RSP_RESULT_ACCEPT); - ble_gap_test_util_update_l2cap(¶ms, 0, BLE_ERR_UNSUPP_REM_FEATURE, - BLE_L2CAP_SIG_UPDATE_RSP_RESULT_ACCEPT); + /* Accepted L2CAP. */ + ble_gap_test_util_update_l2cap(¶ms, BLE_L2CAP_SIG_UPDATE_RSP_RESULT_ACCEPT); - /* Accepted L2CAP failover; failure. */ - ble_gap_test_util_update_l2cap(¶ms, BLE_ERR_UNKNOWN_HCI_CMD, 0, - BLE_L2CAP_SIG_UPDATE_RSP_RESULT_ACCEPT); - ble_gap_test_util_update_l2cap(¶ms, 0, BLE_ERR_UNSUPP_REM_FEATURE, - BLE_L2CAP_SIG_UPDATE_RSP_RESULT_ACCEPT); - - /* Rejected L2CAP failovers. */ - ble_gap_test_util_update_l2cap(¶ms, BLE_ERR_UNKNOWN_HCI_CMD, 0, - BLE_L2CAP_SIG_UPDATE_RSP_RESULT_REJECT); - ble_gap_test_util_update_l2cap(¶ms, 0, BLE_ERR_UNSUPP_REM_FEATURE, - BLE_L2CAP_SIG_UPDATE_RSP_RESULT_REJECT); - - /* Don't attempt L2CAP failover on other event status. */ - ble_gap_test_util_update_l2cap(¶ms, BLE_ERR_UNKNOWN_HCI_CMD, 0, 0); + /* Rejected L2CAP. */ + ble_gap_test_util_update_l2cap(¶ms, BLE_L2CAP_SIG_UPDATE_RSP_RESULT_REJECT); } TEST_CASE(ble_gap_test_case_update_peer_good) diff --git a/nimble/host/test/src/ble_hs_conn_test.c b/nimble/host/test/src/ble_hs_conn_test.c index ee64f4b62..76bf4b5e3 100644 --- a/nimble/host/test/src/ble_hs_conn_test.c +++ b/nimble/host/test/src/ble_hs_conn_test.c @@ -59,6 +59,10 @@ TEST_CASE(ble_hs_conn_test_direct_connect_success) TEST_ASSERT(ble_gap_master_in_progress()); + /* ble_gap_rx_conn_complete() will send extra HCI command, need phony ack */ + ble_hs_test_util_set_ack(ble_hs_hci_util_opcode_join(BLE_HCI_OGF_LE, + BLE_HCI_OCF_LE_RD_REM_FEAT), 0); + /* Receive successful connection complete event. */ memset(&evt, 0, sizeof evt); evt.subevent_code = BLE_HCI_LE_SUBEV_CONN_COMPLETE; @@ -112,6 +116,10 @@ TEST_CASE(ble_hs_conn_test_direct_connectable_success) TEST_ASSERT(!ble_gap_master_in_progress()); TEST_ASSERT(ble_gap_adv_active()); + /* ble_gap_rx_conn_complete() will send extra HCI command, need phony ack */ + ble_hs_test_util_set_ack(ble_hs_hci_util_opcode_join(BLE_HCI_OGF_LE, + BLE_HCI_OCF_LE_RD_REM_FEAT), 0); + /* Receive successful connection complete event. */ memset(&evt, 0, sizeof evt); evt.subevent_code = BLE_HCI_LE_SUBEV_CONN_COMPLETE; @@ -173,6 +181,10 @@ TEST_CASE(ble_hs_conn_test_undirect_connectable_success) TEST_ASSERT(!ble_gap_master_in_progress()); TEST_ASSERT(ble_gap_adv_active()); + /* ble_gap_rx_conn_complete() will send extra HCI command, need phony ack */ + ble_hs_test_util_set_ack(ble_hs_hci_util_opcode_join(BLE_HCI_OGF_LE, + BLE_HCI_OCF_LE_RD_REM_FEAT), 0); + /* Receive successful connection complete event. */ memset(&evt, 0, sizeof evt); evt.subevent_code = BLE_HCI_LE_SUBEV_CONN_COMPLETE; diff --git a/nimble/host/test/src/ble_hs_test_util.c b/nimble/host/test/src/ble_hs_test_util.c index fd22c7ec9..48276aa2e 100644 --- a/nimble/host/test/src/ble_hs_test_util.c +++ b/nimble/host/test/src/ble_hs_test_util.c @@ -370,10 +370,12 @@ ble_hs_test_util_create_rpa_conn(uint16_t handle, uint8_t own_addr_type, uint8_t peer_addr_type, const uint8_t *peer_id_addr, const uint8_t *peer_rpa, + uint8_t conn_features, ble_gap_event_fn *cb, void *cb_arg) { ble_addr_t addr; struct hci_le_conn_complete evt; + struct hci_le_rd_rem_supp_feat_complete evt2; int rc; addr.type = peer_addr_type; @@ -382,6 +384,10 @@ ble_hs_test_util_create_rpa_conn(uint16_t handle, uint8_t own_addr_type, ble_hs_test_util_connect(own_addr_type, &addr, 0, NULL, cb, cb_arg, 0); + /* ble_gap_rx_conn_complete() will send extra HCI command, need phony ack */ + ble_hs_test_util_set_ack(ble_hs_hci_util_opcode_join(BLE_HCI_OGF_LE, + BLE_HCI_OCF_LE_RD_REM_FEAT), 0); + memset(&evt, 0, sizeof evt); evt.subevent_code = BLE_HCI_LE_SUBEV_CONN_COMPLETE; evt.status = BLE_ERR_SUCCESS; @@ -398,6 +404,13 @@ ble_hs_test_util_create_rpa_conn(uint16_t handle, uint8_t own_addr_type, rc = ble_gap_rx_conn_complete(&evt); TEST_ASSERT(rc == 0); + evt2.subevent_code = BLE_HCI_LE_SUBEV_RD_REM_USED_FEAT; + evt2.status = BLE_ERR_SUCCESS; + evt2.connection_handle = handle; + memcpy(evt2.features, (uint8_t[]){ conn_features, 0, 0, 0, 0, 0, 0, 0 }, 8); + + ble_gap_rx_rd_rem_sup_feat_complete(&evt2); + ble_hs_test_util_prev_hci_tx_clear(); } @@ -409,7 +422,19 @@ ble_hs_test_util_create_conn(uint16_t handle, const uint8_t *peer_id_addr, ble_hs_test_util_create_rpa_conn(handle, BLE_OWN_ADDR_PUBLIC, null_addr, BLE_ADDR_PUBLIC, peer_id_addr, - null_addr, cb, cb_arg); + null_addr, BLE_HS_TEST_CONN_FEAT_ALL, + cb, cb_arg); +} + +void +ble_hs_test_util_create_conn_feat(uint16_t handle, const uint8_t *peer_id_addr, + uint8_t conn_features, ble_gap_event_fn *cb, void *cb_arg) +{ + static uint8_t null_addr[6]; + + ble_hs_test_util_create_rpa_conn(handle, BLE_OWN_ADDR_PUBLIC, null_addr, + BLE_ADDR_PUBLIC, peer_id_addr, + null_addr, conn_features, cb, cb_arg); } static void @@ -862,8 +887,15 @@ ble_hs_test_util_conn_update(uint16_t conn_handle, { int rc; - ble_hs_test_util_set_ack( - BLE_HS_TEST_UTIL_LE_OPCODE(BLE_HCI_OCF_LE_CONN_UPDATE), hci_status); + /* + * 0xFF is magic value used for cases where we expect update over L2CAP to + * be triggered - in this case we don't need phony ack. + */ + if (hci_status != 0xFF) { + ble_hs_test_util_set_ack( + BLE_HS_TEST_UTIL_LE_OPCODE(BLE_HCI_OCF_LE_CONN_UPDATE), + hci_status); + } rc = ble_gap_update_params(conn_handle, params); return rc; diff --git a/nimble/host/test/src/ble_hs_test_util.h b/nimble/host/test/src/ble_hs_test_util.h index 4f9927a0e..6e11d468d 100644 --- a/nimble/host/test/src/ble_hs_test_util.h +++ b/nimble/host/test/src/ble_hs_test_util.h @@ -71,6 +71,9 @@ struct ble_hs_test_util_att_group_type_entry { .hdh_len = (len) \ }) +#define BLE_HS_TEST_CONN_FEAT_ALL (0xFF) +#define BLE_HS_TEST_CONN_FEAT_NO_CONN_PARAM (0xFD) + void ble_hs_test_util_prev_tx_enqueue(struct os_mbuf *om); struct os_mbuf *ble_hs_test_util_prev_tx_dequeue(void); struct os_mbuf *ble_hs_test_util_prev_tx_dequeue_pullup(void); @@ -95,9 +98,13 @@ void ble_hs_test_util_create_rpa_conn(uint16_t handle, uint8_t own_addr_type, uint8_t peer_addr_type, const uint8_t *peer_id_addr, const uint8_t *peer_rpa, + uint8_t conn_features, ble_gap_event_fn *cb, void *cb_arg); void ble_hs_test_util_create_conn(uint16_t handle, const uint8_t *addr, ble_gap_event_fn *cb, void *cb_arg); +void ble_hs_test_util_create_conn_feat(uint16_t handle, const uint8_t *addr, + uint8_t conn_features, + ble_gap_event_fn *cb, void *cb_arg); int ble_hs_test_util_connect(uint8_t own_addr_type, const ble_addr_t *peer_addr, int32_t duration_ms, diff --git a/nimble/host/test/src/ble_os_test.c b/nimble/host/test/src/ble_os_test.c index 74ad65ddd..1c0a1f00c 100644 --- a/nimble/host/test/src/ble_os_test.c +++ b/nimble/host/test/src/ble_os_test.c @@ -144,6 +144,10 @@ ble_gap_direct_connect_test_task_handler(void *arg) TEST_ASSERT(!ble_os_test_misc_conn_exists(BLE_HS_CONN_HANDLE_NONE)); TEST_ASSERT(!cb_called); + /* ble_gap_rx_conn_complete() will send extra HCI command, need phony ack */ + ble_hs_test_util_set_ack(ble_hs_hci_util_opcode_join(BLE_HCI_OGF_LE, + BLE_HCI_OCF_LE_RD_REM_FEAT), 0); + /* Receive an HCI connection-complete event. */ memset(&evt, 0, sizeof evt); evt.subevent_code = BLE_HCI_LE_SUBEV_CONN_COMPLETE; @@ -305,6 +309,9 @@ ble_gap_terminate_test_task_handler(void *arg) ble_hs_test_util_connect(BLE_OWN_ADDR_PUBLIC, &addr1, 0, NULL, ble_gap_terminate_cb, &disconn_handle, 0); + /* ble_gap_rx_conn_complete() will send extra HCI command, need phony ack */ + ble_hs_test_util_set_ack(ble_hs_hci_util_opcode_join(BLE_HCI_OGF_LE, + BLE_HCI_OCF_LE_RD_REM_FEAT), 0); memset(&conn_evt, 0, sizeof conn_evt); conn_evt.subevent_code = BLE_HCI_LE_SUBEV_CONN_COMPLETE; conn_evt.status = BLE_ERR_SUCCESS; @@ -316,6 +323,9 @@ ble_gap_terminate_test_task_handler(void *arg) ble_hs_test_util_connect(BLE_OWN_ADDR_PUBLIC, &addr2, 0, NULL, ble_gap_terminate_cb, &disconn_handle, 0); + /* ble_gap_rx_conn_complete() will send extra HCI command, need phony ack */ + ble_hs_test_util_set_ack(ble_hs_hci_util_opcode_join(BLE_HCI_OGF_LE, + BLE_HCI_OCF_LE_RD_REM_FEAT), 0); memset(&conn_evt, 0, sizeof conn_evt); conn_evt.subevent_code = BLE_HCI_LE_SUBEV_CONN_COMPLETE; conn_evt.status = BLE_ERR_SUCCESS; diff --git a/nimble/host/test/src/ble_sm_test_util.c b/nimble/host/test/src/ble_sm_test_util.c index 1a23fdc0b..13a406eb3 100644 --- a/nimble/host/test/src/ble_sm_test_util.c +++ b/nimble/host/test/src/ble_sm_test_util.c @@ -537,6 +537,7 @@ ble_sm_test_util_init_good(struct ble_sm_test_params *params, ble_hs_test_util_create_rpa_conn(2, out_us->addr_type, out_us->rpa, out_peer->addr_type, out_peer->id_addr, out_peer->rpa, + BLE_HS_TEST_CONN_FEAT_ALL, ble_sm_test_util_conn_cb, NULL); @@ -1613,6 +1614,7 @@ ble_sm_test_util_peer_bonding_good(int send_enc_req, ble_hs_test_util_create_rpa_conn(2, our_addr_type, our_rpa, peer_addr_type, peer_id_addr, peer_rpa, + BLE_HS_TEST_CONN_FEAT_ALL, ble_sm_test_util_conn_cb, NULL); /* This test inspects and modifies the connection object after unlocking @@ -1743,7 +1745,8 @@ ble_sm_test_util_us_bonding_good(int send_enc_req, uint8_t our_addr_type, ble_hs_test_util_create_rpa_conn(2, our_addr_type, our_rpa, peer_addr_type, peer_id_addr, - peer_rpa, ble_sm_test_util_conn_cb, NULL); + peer_rpa, BLE_HS_TEST_CONN_FEAT_ALL, + ble_sm_test_util_conn_cb, NULL); /* This test inspects and modifies the connection object after unlocking * the host mutex. It is not OK for real code to do this, but this test @@ -2919,6 +2922,7 @@ ble_sm_test_util_repeat_pairing(struct ble_sm_test_params *params, int sc) ble_hs_test_util_create_rpa_conn(2, our_entity.addr_type, our_entity.rpa, peer_entity.addr_type, peer_entity.id_addr, peer_entity.rpa, + BLE_HS_TEST_CONN_FEAT_ALL, ble_sm_test_util_conn_cb, NULL); ble_hs_lock();