Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Merge branch 'devel' of palacios@newskysaw.cs.northwestern.edu:/home/palacios/palacio...
[palacios.git] / palacios / src / devices / lnx_virtio_nic.c
index 3ef9509..ab9a78b 100644 (file)
@@ -150,7 +150,7 @@ static int virtio_init_state(struct virtio_net_state * virtio)
     virtio->virtio_cfg.host_features = 0; // (1 << VIRTIO_NET_F_MAC);
 
     if ((v3_lock_init(&(virtio->rx_lock)) == -1) ||
-         (v3_lock_init(&(virtio->tx_lock)) == -1)){
+       (v3_lock_init(&(virtio->tx_lock)) == -1)){
         PrintError("Virtio NIC: Failure to init locks for net_state\n");
     }
 
@@ -160,7 +160,10 @@ static int virtio_init_state(struct virtio_net_state * virtio)
     return 0;
 }
 
-static int pkt_tx(struct guest_info * core, struct virtio_net_state * virtio, struct vring_desc * buf_desc) 
+static int 
+pkt_tx(struct guest_info * core, 
+       struct virtio_net_state * virtio, 
+       struct vring_desc * buf_desc) 
 {
     uint8_t * buf = NULL;
     uint32_t len = buf_desc->length;
@@ -170,16 +173,17 @@ static int pkt_tx(struct guest_info * core, struct virtio_net_state * virtio, st
        return -ERR_VIRTIO_OTHER;
     }
 
-    return virtio->net_ops->send(buf, len, virtio->backend_data, NULL);
+    return virtio->net_ops->send(buf, len, virtio->backend_data);
 }
 
 
-static int copy_data_to_desc(struct guest_info * core, 
-                                       struct virtio_net_state * virtio_state, 
-                                       struct vring_desc * desc, 
-                                       uchar_t * buf, 
-                                       uint_t buf_len,
-                                       uint_t offset)
+static int 
+copy_data_to_desc(struct guest_info * core, 
+                 struct virtio_net_state * virtio_state, 
+                 struct vring_desc * desc, 
+                 uchar_t * buf, 
+                 uint_t buf_len,
+                 uint_t offset)
 {
     uint32_t len;
     uint8_t * desc_buf = NULL;
@@ -225,14 +229,15 @@ static inline void notify_guest(struct virtio_net_state * virtio){
 
 
 /* guest free some pkts from rx queue */
-static int handle_rx_kick(struct guest_info *core, struct virtio_net_state * virtio) 
+static int handle_rx_kick(struct guest_info *core, 
+                         struct virtio_net_state * virtio) 
 {
     unsigned long flags;
 
     flags = v3_lock_irqsave(virtio->rx_lock);
 
     virtio->net_ops->start_rx(virtio->backend_data);
-    disable_cb(&virtio->rx_vq);
+    //disable_cb(&virtio->rx_vq);
 
     v3_unlock_irqrestore(virtio->rx_lock, flags);
        
@@ -240,12 +245,14 @@ static int handle_rx_kick(struct guest_info *core, struct virtio_net_state * vir
 }
 
 
-static int handle_ctrl(struct guest_info *core, struct virtio_net_state * virtio) {
+static int handle_ctrl(struct guest_info *core, 
+                      struct virtio_net_state * virtio) {
        
     return 0;
 }
 
-static int handle_pkt_tx(struct guest_info *core, struct virtio_net_state * virtio_state) 
+static int handle_pkt_tx(struct guest_info *core, 
+                        struct virtio_net_state * virtio_state) 
 {
     struct virtio_queue * q = &(virtio_state->tx_vq);
     struct virtio_net_hdr * hdr = NULL;
@@ -322,10 +329,9 @@ exit_error:
 
 
 static int virtio_setup_queue(struct guest_info *core, 
-                               struct virtio_net_state * virtio_state, 
-                               struct virtio_queue * queue, 
-                                                       addr_t pfn, 
-                                                       addr_t page_addr) {
+                             struct virtio_net_state * virtio_state, 
+                             struct virtio_queue * queue, 
+                             addr_t pfn, addr_t page_addr) {
     queue->pfn = pfn;
                
     queue->ring_desc_addr = page_addr;
@@ -362,12 +368,13 @@ static int virtio_setup_queue(struct guest_info *core,
     return 0;
 }
 
-static int virtio_io_write(struct guest_info *core, uint16_t port, void * src, uint_t length, void * private_data) 
+static int virtio_io_write(struct guest_info *core, 
+                          uint16_t port, void * src, 
+                          uint_t length, void * private_data) 
 {
     struct virtio_net_state * virtio = (struct virtio_net_state *)private_data;
     int port_idx = port % virtio->io_range_size;
 
-
     PrintDebug("VIRTIO NIC %p Write for port %d (index=%d) len=%d, value=%x\n", private_data,
               port, port_idx,  length, *(uint32_t *)src);
 
@@ -391,11 +398,11 @@ static int virtio_io_write(struct guest_info *core, uint16_t port, void * src, u
            switch (queue_idx) {
                case 0:
                    virtio_setup_queue(core, virtio, &virtio->rx_vq, pfn, page_addr);
-                   disable_cb(&virtio->rx_vq);
+                   //disable_cb(&virtio->rx_vq);
                    break;
                case 1:
                    virtio_setup_queue(core, virtio, &virtio->tx_vq, pfn, page_addr);
-                   disable_cb(&virtio->tx_vq);
+                   //disable_cb(&virtio->tx_vq);
                    break;
                case 2:
                    virtio_setup_queue(core, virtio, &virtio->ctrl_vq, pfn, page_addr);
@@ -419,9 +426,7 @@ static int virtio_io_write(struct guest_info *core, uint16_t port, void * src, u
                uint16_t queue_idx = *(uint16_t *)src;                  
                if (queue_idx == 0){
                    handle_rx_kick(core, virtio);
-                   PrintError("rx kick\n");
                } else if (queue_idx == 1){
-                   PrintError("tx kick\n");
                    if (handle_pkt_tx(core, virtio) == -1) {
                        PrintError("Could not handle NIC Notification\n");
                        return -1;
@@ -457,7 +462,9 @@ static int virtio_io_write(struct guest_info *core, uint16_t port, void * src, u
     return length;
 }
 
-static int virtio_io_read(struct guest_info *core, uint16_t port, void * dst, uint_t length, void * private_data) 
+static int virtio_io_read(struct guest_info *core, 
+                         uint16_t port, void * dst, 
+                         uint_t length, void * private_data) 
 {
     struct virtio_net_state * virtio = (struct virtio_net_state *)private_data;
     int port_idx = port % virtio->io_range_size;
@@ -549,6 +556,13 @@ static int virtio_rx(uint8_t * buf, uint32_t size, void * private_data) {
     int ret_val = -ERR_VIRTIO_OTHER;
     int raw = 1;
 
+#ifndef CONFIG_DEBUG_VIRTIO_NET
+   {
+       PrintDebug("Virtio-NIC: virtio_rx: size: %d\n", size);  
+       //v3_hexdump(buf, size, NULL, 0);
+   }
+#endif
+
     flags = v3_lock_irqsave(virtio->rx_lock);
 
     virtio->pkt_recv ++;
@@ -640,9 +654,6 @@ exit:
 
 static struct v3_device_ops dev_ops = {
     .free = virtio_free,
-    .reset = NULL,
-    .start = NULL,
-    .stop = NULL,
 };
 
 
@@ -685,7 +696,8 @@ static void virtio_stop_tx(void * data){
        
 
 
-static int register_dev(struct virtio_dev_state * virtio, struct virtio_net_state * net_state) 
+static int register_dev(struct virtio_dev_state * virtio, 
+                       struct virtio_net_state * net_state) 
 {
     struct pci_device * pci_dev = NULL;
     struct v3_pci_bar bars[6];
@@ -781,9 +793,9 @@ static int connect_fn(struct v3_vm_info * info,
 static int virtio_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) {
     struct vm_device * pci_bus = v3_find_dev(vm, v3_cfg_val(cfg, "bus"));
     struct virtio_dev_state * virtio_state = NULL;
-    char * name = v3_cfg_val(cfg, "name");
+    char * dev_id = v3_cfg_val(cfg, "ID");
 
-    PrintDebug("Virtio NIC: Initializing VIRTIO Network device: %s\n", name);
+    PrintDebug("Virtio NIC: Initializing VIRTIO Network device: %s\n", dev_id);
 
     if (pci_bus == NULL) {
        PrintError("Virtio NIC: VirtIO devices require a PCI Bus");
@@ -797,14 +809,14 @@ static int virtio_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) {
     virtio_state->pci_bus = pci_bus;
     virtio_state->vm = vm;
 
-    struct vm_device * dev = v3_allocate_device(name, &dev_ops, virtio_state);
+    struct vm_device * dev = v3_allocate_device(dev_id, &dev_ops, virtio_state);
     if (v3_attach_device(vm, dev) == -1) {
-       PrintError("Virtio NIC: Could not attach device %s\n", name);
+       PrintError("Virtio NIC: Could not attach device %s\n", dev_id);
        return -1;
     }
 
-    if (v3_dev_add_net_frontend(vm, name, connect_fn, (void *)virtio_state) == -1) {
-       PrintError("Virtio NIC: Could not register %s as net frontend\n", name);
+    if (v3_dev_add_net_frontend(vm, dev_id, connect_fn, (void *)virtio_state) == -1) {
+       PrintError("Virtio NIC: Could not register %s as net frontend\n", dev_id);
        return -1;
     }