static int
ble_att_clt_build_read_req(struct ble_att_read_req *req,
                           struct os_mbuf **out_txom)
{
    struct os_mbuf *txom;
    int rc;

    txom = NULL;

    rc = ble_att_clt_init_req(BLE_ATT_READ_REQ_SZ, &txom);
    if (rc != 0) {
        goto done;
    }

    ble_att_read_req_write(txom->om_data, txom->om_len, req);

done:
    if (rc != 0) {
        os_mbuf_free_chain(txom);
        txom = NULL;
    }

    *out_txom = txom;
    return rc;
}
static void
ble_gatts_read_test_once(uint16_t conn_handle, uint16_t attr_id,
                         void *expected_value, uint16_t expected_len)
{
    struct ble_att_read_req read_req;
    uint8_t buf[BLE_ATT_READ_REQ_SZ];
    int rc;

    read_req.barq_handle = attr_id;
    ble_att_read_req_write(buf, sizeof buf, &read_req);

    rc = ble_hs_test_util_l2cap_rx_payload_flat(conn_handle, BLE_L2CAP_CID_ATT,
                                                buf, sizeof buf);
    TEST_ASSERT(rc == 0);

    ble_hs_test_util_verify_tx_read_rsp(expected_value, expected_len);
}