]> git.proxmox.com Git - qemu.git/commitdiff
net: implement tap support for receive_raw()
authorMark McLoughlin <markmc@redhat.com>
Thu, 22 Oct 2009 16:43:44 +0000 (17:43 +0100)
committerAnthony Liguori <aliguori@us.ibm.com>
Tue, 27 Oct 2009 17:29:01 +0000 (12:29 -0500)
tap_receive_raw() always prepends a vnet header if IFF_VNET_HDR is
enabled.

tap_receive() only prepends when the a header is required but the NIC
doesn't supply one.

Signed-off-by: Mark McLoughlin <markmc@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
net.c

diff --git a/net.c b/net.c
index 31288352ed096b98f383c5496b22ee9a2b7a2128..6f14e22d8159e3d6d05a54a92b6a0f5244501858 100644 (file)
--- a/net.c
+++ b/net.c
@@ -1392,14 +1392,14 @@ static ssize_t tap_receive_iov(VLANClientState *vc, const struct iovec *iov,
     return tap_write_packet(s, iovp, iovcnt);
 }
 
-static ssize_t tap_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
+static ssize_t tap_receive_raw(VLANClientState *vc, const uint8_t *buf, size_t size)
 {
     TAPState *s = vc->opaque;
     struct iovec iov[2];
     int iovcnt = 0;
     struct virtio_net_hdr hdr = { 0, };
 
-    if (s->has_vnet_hdr && !s->using_vnet_hdr) {
+    if (s->has_vnet_hdr) {
         iov[iovcnt].iov_base = &hdr;
         iov[iovcnt].iov_len  = sizeof(hdr);
         iovcnt++;
@@ -1412,6 +1412,21 @@ static ssize_t tap_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
     return tap_write_packet(s, iov, iovcnt);
 }
 
+static ssize_t tap_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
+{
+    TAPState *s = vc->opaque;
+    struct iovec iov[1];
+
+    if (s->has_vnet_hdr && !s->using_vnet_hdr) {
+        return tap_receive_raw(vc, buf, size);
+    }
+
+    iov[0].iov_base = (char *)buf;
+    iov[0].iov_len  = size;
+
+    return tap_write_packet(s, iov, 1);
+}
+
 static int tap_can_send(void *opaque)
 {
     TAPState *s = opaque;
@@ -1555,8 +1570,8 @@ static TAPState *net_tap_fd_init(VLANState *vlan,
     s->using_vnet_hdr = 0;
     s->vc = qemu_new_vlan_client(NET_CLIENT_TYPE_TAP,
                                  vlan, NULL, model, name, NULL,
-                                 tap_receive, NULL, tap_receive_iov,
-                                 tap_cleanup, s);
+                                 tap_receive, tap_receive_raw,
+                                 tap_receive_iov, tap_cleanup, s);
     tap_read_poll(s, 1);
     return s;
 }