static int
ble_hs_test_util_phony_ack_cb(uint8_t *ack, int ack_buf_len)
{
    struct ble_hs_test_util_phony_ack *entry;

    if (ble_hs_test_util_num_phony_acks == 0) {
        return BLE_HS_ETIMEOUT;
    }

    entry = ble_hs_test_util_phony_acks;

    ble_hs_test_util_build_cmd_complete(ack, 256,
                                        entry->evt_params_len + 1, 1,
                                        entry->opcode);
    ack[BLE_HCI_EVENT_CMD_COMPLETE_HDR_LEN] = entry->status;
    memcpy(ack + BLE_HCI_EVENT_CMD_COMPLETE_HDR_LEN + 1, entry->evt_params,
           entry->evt_params_len);

    ble_hs_test_util_num_phony_acks--;
    if (ble_hs_test_util_num_phony_acks > 0) {
        memmove(ble_hs_test_util_phony_acks, ble_hs_test_util_phony_acks + 1,
                sizeof *entry * ble_hs_test_util_num_phony_acks);
    }

    return 0;
}
void
ble_hs_test_util_rx_ack_param(uint16_t opcode, uint8_t status, void *param,
                              int param_len)
{
    uint8_t buf[256];
    int rc;

    ble_hs_test_util_build_cmd_complete(buf, sizeof buf, param_len + 1, 1,
                                        opcode);
    buf[BLE_HCI_EVENT_CMD_COMPLETE_HDR_LEN] = status;
    memcpy(buf + BLE_HCI_EVENT_CMD_COMPLETE_HDR_LEN + 1, param, param_len);

    rc = host_hci_event_rx(buf);
    TEST_ASSERT(rc == 0);
}
void
ble_hs_test_util_rx_hci_buf_size_ack(uint16_t buf_size)
{
    uint8_t buf[BLE_HCI_EVENT_CMD_COMPLETE_HDR_LEN +
                BLE_HCI_RD_BUF_SIZE_RSPLEN + 1];
    int rc;

    ble_hs_test_util_build_cmd_complete(buf, sizeof buf,
                                        BLE_HCI_RD_BUF_SIZE_RSPLEN + 1, 1,
                                        (BLE_HCI_OGF_LE << 10) |
                                            BLE_HCI_OCF_LE_RD_BUF_SIZE);

    buf[BLE_HCI_EVENT_CMD_COMPLETE_HDR_LEN + 0] = 0;
    htole16(buf + BLE_HCI_EVENT_CMD_COMPLETE_HDR_LEN + 1, buf_size);
    buf[BLE_HCI_EVENT_CMD_COMPLETE_HDR_LEN + 3] = 1;

    rc = host_hci_event_rx(buf);
    TEST_ASSERT(rc == 0);
}