struct ble_hs_conn *
ble_hs_test_util_create_conn(uint16_t handle, uint8_t *addr,
                             ble_gap_conn_fn *cb, void *cb_arg)
{
    struct hci_le_conn_complete evt;
    struct ble_hs_conn *conn;
    int rc;

    rc = ble_gap_conn_initiate(0, addr, NULL, cb, cb_arg);
    TEST_ASSERT(rc == 0);

    ble_hci_sched_wakeup();

    ble_hs_test_util_rx_le_ack(BLE_HCI_OCF_LE_CREATE_CONN, BLE_ERR_SUCCESS);

    memset(&evt, 0, sizeof evt);
    evt.subevent_code = BLE_HCI_LE_SUBEV_CONN_COMPLETE;
    evt.status = BLE_ERR_SUCCESS;
    evt.connection_handle = handle;
    evt.role = BLE_HCI_LE_CONN_COMPLETE_ROLE_MASTER;
    evt.peer_addr_type = BLE_ADDR_TYPE_PUBLIC;
    memcpy(evt.peer_addr, addr, 6);
    evt.conn_itvl = BLE_GAP_INITIAL_CONN_ITVL_MAX;
    evt.conn_latency = BLE_GAP_INITIAL_CONN_LATENCY;
    evt.supervision_timeout = BLE_GAP_INITIAL_SUPERVISION_TIMEOUT;
    rc = ble_gap_rx_conn_complete(&evt);
    TEST_ASSERT(rc == 0);

    conn = ble_hs_conn_find(handle);
    TEST_ASSERT_FATAL(conn != NULL);

    return conn;
}
void
ble_hs_test_util_rx_und_adv_acks_count(int start, int count)
{
    int end;
    int i;

    i = 0;
    end = start + count;

    if (i >= start && i < end) {
        /* Receive set-adv-params ack. */
        ble_hci_sched_wakeup();
        ble_hs_test_util_rx_le_ack(BLE_HCI_OCF_LE_SET_ADV_PARAMS,
                                   BLE_ERR_SUCCESS);
        TEST_ASSERT(ble_gap_slave_in_progress());
    }
    i++;

    if (i >= start && i < end) {
        /* Receive read-power-level ack. */
        ble_hci_sched_wakeup();
        ble_hs_test_util_rx_le_ack_param(BLE_HCI_OCF_LE_RD_ADV_CHAN_TXPWR,
                                         BLE_ERR_SUCCESS, (uint8_t[]){0}, 1);
        TEST_ASSERT(ble_gap_slave_in_progress());
    }
void
ble_hs_test_util_rx_startup_acks(void)
{
    uint8_t supp_feat[8];

    memset(supp_feat, 0, sizeof supp_feat);

    /* Receive acknowledgements for the startup sequence.  We sent the
     * corresponding requests when the host task was started.
     */
    ble_hs_test_util_rx_ack(
        (BLE_HCI_OGF_CTLR_BASEBAND << 10) | BLE_HCI_OCF_CB_RESET, 0);
    ble_hs_test_util_rx_ack(
        (BLE_HCI_OGF_CTLR_BASEBAND << 10) | BLE_HCI_OCF_CB_SET_EVENT_MASK,
        0);
    ble_hs_test_util_rx_le_ack(BLE_HCI_OCF_LE_SET_EVENT_MASK, 0);
    ble_hs_test_util_rx_hci_buf_size_ack(0xffff);
    ble_hs_test_util_rx_le_ack_param(BLE_HCI_OCF_LE_RD_LOC_SUPP_FEAT, 0,
                                     supp_feat, sizeof supp_feat);
}
void
ble_hs_test_util_rx_und_adv_acks_count(int count)
{
    if (count > 0) {
        /* Receive set-adv-params ack. */
        ble_hci_sched_wakeup();
        ble_hs_test_util_rx_le_ack(BLE_HCI_OCF_LE_SET_ADV_PARAMS,
                                   BLE_ERR_SUCCESS);
        TEST_ASSERT(ble_gap_slave_in_progress());

        count--;
    }

    if (count > 0) {
        /* Receive read-power-level ack. */
        ble_hci_sched_wakeup();
        ble_hs_test_util_rx_le_ack_param(BLE_HCI_OCF_LE_RD_ADV_CHAN_TXPWR,
                                         BLE_ERR_SUCCESS, (uint8_t[]){0}, 1);
        TEST_ASSERT(ble_gap_slave_in_progress());

        count--;
    }