#define VNET_ADD_LINK 21
#define VNET_DEL_LINK 22
-// structure of the vnet command header
struct vnet_ctrl_hdr {
uint8_t cmd_type;
uint32_t num_cmds;
}
-
-
static int handle_cmd_kick(struct guest_info * core,
struct virtio_vnet_state * vnet_state) {
struct virtio_queue * q = &(vnet_state->queue[0]);
uint8_t * status_ptr = NULL;
uint8_t status = 0;
-
PrintDebug("VNET Bridge: CMD: Descriptor Count=%d, index=%d, desc_idx=%d\n", desc_cnt, q->cur_avail_idx % QUEUE_SIZE, desc_idx);
if (desc_cnt < 3) {
desc_idx = hdr_desc->next;
- if (hdr->cmd_type == VNET_ADD_ROUTE) {
-
+ if (hdr->cmd_type == VNET_ADD_ROUTE) {
for (i = 0; i < hdr->num_cmds; i++) {
uint8_t tmp_status = 0;
struct v3_vnet_route * route = NULL;
return -1;
}
- // add route
- PrintDebug("VNET Bridge: Adding VNET Route\n");
-
tmp_status = v3_vnet_add_route(*route);
-
- PrintDebug("VNET Route Added\n");
-
if (tmp_status != 0) {
PrintError("Error adding VNET ROUTE\n");
+
status = tmp_status;
}
+ PrintDebug("VNET Route Added\n");
+
xfer_len += buf_desc->length;
desc_idx = buf_desc->next;
}
}
-
-
status_desc = &(q->desc[desc_idx]);
if (v3_gpa_to_hva(core, status_desc->addr_gpa, (addr_t *)&status_ptr) == -1) {
if (q->ring_avail_addr == 0) {
PrintError("Queue is not set\n");
+
goto exit;
}
struct vnet_bridge_pkt * virtio_pkt = NULL;
pkt_desc = &(q->desc[pkt_idx]);
- PrintDebug("VNET Bridge RX: buffer desc len: %d\n", pkt_desc->length);
if (v3_gpa_to_hva(&(vm->cores[0]), pkt_desc->addr_gpa, (addr_t *)&(virtio_pkt)) == -1) {
PrintError("Could not translate buffer address\n");
return ret_val;
}
-static int handle_pkt_kick(struct guest_info * core,
+static int do_tx_pkts(struct guest_info * core,
struct virtio_vnet_state * vnet_state)
{
struct virtio_queue * q = &(vnet_state->queue[XMIT_QUEUE]);
struct vnet_bridge_pkt * virtio_pkt = NULL;
pkt_desc = &(q->desc[desc_idx]);
-
- PrintDebug("VNET Bridge: Handle TX desc buf_len: %d\n", pkt_desc->length);
if (v3_gpa_to_hva(core, pkt_desc->addr_gpa, (addr_t *)&(virtio_pkt)) == -1) {
PrintError("Could not translate buffer address\n");
struct virtio_vnet_state * vnet_state = (struct virtio_vnet_state *)private_data;
if(vm == vnet_state->vm){
- handle_pkt_kick(&(vm->cores[0]), vnet_state);
+ do_tx_pkts(&(vm->cores[0]), vnet_state);
}
}
-static int handle_rx_kick(struct guest_info *core,
+static int handle_rx_queue_kick(struct guest_info *core,
struct virtio_vnet_state * vnet_state)
-{
- //v3_vnet_enable_bridge();
-
+{
return 0;
}
return -1;
}
} else if (queue_idx == 1) {
- if (handle_pkt_kick(core, vnet_state) == -1){
+ if (do_tx_pkts(core, vnet_state) == -1){
PrintError("Could not handle Virtio VNET TX\n");
return -1;
}
PrintError("Notify on TX\n");
} else if (queue_idx == 2) {
- if (handle_rx_kick(core, vnet_state) == -1){
+ if (handle_rx_queue_kick(core, vnet_state) == -1){
PrintError("Could not handle Virtio RX buffer refills Kick\n");
return -1;
}
}
+static int virtio_free(struct virtio_vnet_state * vnet_state) {
+
+ // unregister from PCI
+
+ V3_Free(vnet_state);
+ return 0;
+}
+
static struct v3_device_ops dev_ops = {
- .free = NULL,
- .reset = NULL,
- .start = NULL,
- .stop = NULL,
+ .free = (int (*)(void *))virtio_free,
};
static int dev_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) {