[PATCH qemu-kvm] Add generic peer_* routines for the remaining tap specific routines

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This patch adds generic peer routines for the remaining tap specific
routines(using_vnet_hdr & set_offload). This makes it easier to add
new backends like raw(packet sockets) that support gso/checksum-offload.

Signed-off-by: Sridhar Samudrala <sri@xxxxxxxxxx>

diff --git a/hw/virtio-net.c b/hw/virtio-net.c
index 6e48997..eba578a 100644
--- a/hw/virtio-net.c
+++ b/hw/virtio-net.c
@@ -129,10 +129,13 @@ static int peer_has_vnet_hdr(VirtIONet *n)
     if (!n->nic->nc.peer)
         return 0;
 
-    if (n->nic->nc.peer->info->type != NET_CLIENT_TYPE_TAP)
-        return 0;
-
-    n->has_vnet_hdr = tap_has_vnet_hdr(n->nic->nc.peer);
+    switch (n->nic->nc.peer->info->type) {
+    case NET_CLIENT_TYPE_TAP:
+        n->has_vnet_hdr = tap_has_vnet_hdr(n->nic->nc.peer);
+        break;
+    default:
+        return 0;            
+    }
 
     return n->has_vnet_hdr;
 }
@@ -142,11 +145,46 @@ static int peer_has_ufo(VirtIONet *n)
     if (!peer_has_vnet_hdr(n))
         return 0;
 
-    n->has_ufo = tap_has_ufo(n->nic->nc.peer);
+    switch (n->nic->nc.peer->info->type) {
+    case NET_CLIENT_TYPE_TAP:
+        n->has_ufo = tap_has_ufo(n->nic->nc.peer);
+        break;
+    default:
+        return 0;            
+    }
 
     return n->has_ufo;
 }
 
+static void peer_using_vnet_hdr(VirtIONet *n, int using_vnet_hdr)
+{
+    if (!n->nic->nc.peer)
+        return;
+
+    switch (n->nic->nc.peer->info->type) {
+    case NET_CLIENT_TYPE_TAP:
+        tap_using_vnet_hdr(n->nic->nc.peer, using_vnet_hdr);
+        break;
+    default:
+        break; 
+    }
+}
+
+static void peer_set_offload(VirtIONet *n, int csum, int tso4, int tso6,
+                             int ecn, int ufo)
+{
+    if (!n->nic->nc.peer)
+        return;
+
+    switch (n->nic->nc.peer->info->type) {
+    case NET_CLIENT_TYPE_TAP:
+        tap_set_offload(n->nic->nc.peer, csum, tso4, tso6, ecn, ufo);
+        break;
+    default:
+        break; 
+    }
+}
+
 static uint32_t virtio_net_get_features(VirtIODevice *vdev, uint32_t features)
 {
     VirtIONet *n = to_virtio_net(vdev);
@@ -154,7 +192,7 @@ static uint32_t virtio_net_get_features(VirtIODevice *vdev, uint32_t features)
     features |= (1 << VIRTIO_NET_F_MAC);
 
     if (peer_has_vnet_hdr(n)) {
-        tap_using_vnet_hdr(n->nic->nc.peer, 1);
+        peer_using_vnet_hdr(n, 1);
     } else {
         features &= ~(0x1 << VIRTIO_NET_F_CSUM);
         features &= ~(0x1 << VIRTIO_NET_F_HOST_TSO4);
@@ -197,7 +235,7 @@ static void virtio_net_set_features(VirtIODevice *vdev, uint32_t features)
     n->mergeable_rx_bufs = !!(features & (1 << VIRTIO_NET_F_MRG_RXBUF));
 
     if (n->has_vnet_hdr) {
-        tap_set_offload(n->nic->nc.peer,
+        peer_set_offload(n,
                         (features >> VIRTIO_NET_F_GUEST_CSUM) & 1,
                         (features >> VIRTIO_NET_F_GUEST_TSO4) & 1,
                         (features >> VIRTIO_NET_F_GUEST_TSO6) & 1,
@@ -761,8 +799,8 @@ static int virtio_net_load(QEMUFile *f, void *opaque, int version_id)
         }
 
         if (n->has_vnet_hdr) {
-            tap_using_vnet_hdr(n->nic->nc.peer, 1);
-            tap_set_offload(n->nic->nc.peer,
+            peer_using_vnet_hdr(n, 1);
+            peer_set_offload(n,
                     (n->vdev.guest_features >> VIRTIO_NET_F_GUEST_CSUM) & 1,
                     (n->vdev.guest_features >> VIRTIO_NET_F_GUEST_TSO4) & 1,
                     (n->vdev.guest_features >> VIRTIO_NET_F_GUEST_TSO6) & 1,


--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux