int
vhost_client_poll_client_rx(void *context, void *dst_buf, size_t *dst_buf_len) {

    Vhost_Client *vhost_client = NULL;
    VHOST_CLIENT_VRING vq_id = VHOST_CLIENT_VRING_IDX_RX;
    VIRT_QUEUE_H_RET_VAL virt_queue_ret_val = E_VIRT_QUEUE_OK;


    if (!context || !dst_buf ) {
        return map_ret_val_virt_queue_2_vhost_net(E_VIRT_QUEUE_ERR_FARG);
    }

    vhost_client = (Vhost_Client *) context;

    virt_queue_ret_val = recv_packet((vhost_client->virtq_control[vq_id]),
            (uint64_t *)dst_buf, dst_buf_len);
    if (virt_queue_ret_val == E_VIRT_QUEUE_OK) {
        virt_queue_process_used_rx_virt_queue(vhost_client->virtq_control, vq_id);
    }

    //TODO: Burst
    virt_queue_put_rx_virt_queue(vhost_client->virtq_control,
            vq_id, ETH_MAX_MTU);

    return map_ret_val_virt_queue_2_vhost_net(virt_queue_ret_val);
}
Example #2
0
int
vhost_client_poll_client_tx(void *context, void *src_buf , size_t *src_buf_len) {

    Vhost_Client *vhost_client = NULL;
    VHOST_CLIENT_VRING vq_id = VHOST_CLIENT_VRING_IDX_TX;
    VIRT_QUEUE_H_RET_VAL virt_queue_ret_val = E_VIRT_QUEUE_OK;

    if (!context || !src_buf || src_buf_len == 0) {
        return map_ret_val_virt_queue_2_vhost_net(E_VIRT_QUEUE_ERR_FARG);
    }

    vhost_client = (Vhost_Client *) context;
    virt_queue_ret_val = virt_queue_process_used_tx_virt_queue(vhost_client->virtq_control, vq_id);

    virt_queue_ret_val = send_packet(vhost_client, src_buf, *src_buf_len);
    return map_ret_val_virt_queue_2_vhost_net(virt_queue_ret_val);

}