/*
 * vr_dpdk_virtio_recover_vring_base - recovers the vring base from the shared
 * memory after vRouter crash.
 *
 * Returns 0 on success, -1 otherwise.
 */
int
vr_dpdk_virtio_recover_vring_base(unsigned int vif_idx, unsigned int vring_idx)
{
    vr_dpdk_virtioq_t *vq;

    if ((vif_idx >= VR_MAX_INTERFACES)
        || (vring_idx >= (2 * VR_DPDK_VIRTIO_MAX_QUEUES))) {
        return -1;
    }

    if (vring_idx & 1) {
        vq = &vr_dpdk_virtio_rxqs[vif_idx][vring_idx/2];
    } else {
        vq = &vr_dpdk_virtio_txqs[vif_idx][vring_idx/2];
    }

    if (vq->vdv_used) {
        /* Reading base index from the shared memory. */
        if (vq->vdv_last_used_idx != vq->vdv_used->idx) {
            RTE_LOG(INFO, UVHOST, "    recovering vring base %d -> %d\n",
                    vq->vdv_last_used_idx, vq->vdv_used->idx);
            vr_dpdk_virtio_set_vring_base(vif_idx, vring_idx, vq->vdv_used->idx);
        }
    }

    return 0;
}
/*
 * vr_uvhm_set_vring_base - handles a VHOST_USER_SET_VRING_BASE messsage
 * from the vhost user client to set the based index of a vring.
 *
 * Returns 0 on success, -1 otherwise.
 */
static int
vr_uvhm_set_vring_base(vr_uvh_client_t *vru_cl)
{
    VhostUserMsg *vum_msg;
    unsigned int vring_idx;

    vum_msg = &vru_cl->vruc_msg;
    vring_idx = vum_msg->state.index;

    if (vring_idx >= VHOST_CLIENT_MAX_VRINGS) {
        vr_uvhost_log("Bad ring index %d received by vhost server\n",
                      vring_idx);
        return -1;
    }

    if (vr_dpdk_virtio_set_vring_base(vru_cl->vruc_idx, vring_idx,
                                      vum_msg->state.num)) {
        vr_uvhost_log("Couldn't set vring base in vhost server %d %d %d\n",
                      vru_cl->vruc_idx, vring_idx, vum_msg->state.num);
        return -1;
    }

    return 0;
}