summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael S. Tsirkin <mst@redhat.com>2012-09-24 13:24:17 +0200
committerMichael S. Tsirkin <mst@redhat.com>2012-10-29 18:25:23 +0200
commit280598b7a5fdf96fb79d87a2129750bad5dbf24b (patch)
treec4cef56971265a46516008d0e1cc6a9bd0d138cf
parent63c5872873de8d7d994a589eed7bfe6a70cc8e06 (diff)
downloadqemu-280598b7a5fdf96fb79d87a2129750bad5dbf24b.tar.gz
virtio-net: refactor receive_hdr
Now that we know host hdr length, we don't need to duplicate the logic in receive_hdr: caller can figure out the offset itself. Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
-rw-r--r--hw/virtio-net.c18
1 files changed, 7 insertions, 11 deletions
diff --git a/hw/virtio-net.c b/hw/virtio-net.c
index d315fdf0a4..5128a2a8ba 100644
--- a/hw/virtio-net.c
+++ b/hw/virtio-net.c
@@ -516,17 +516,15 @@ static void work_around_broken_dhclient(struct virtio_net_hdr *hdr,
}
}
-static int receive_header(VirtIONet *n, const struct iovec *iov, int iov_cnt,
- const void *buf, size_t size)
+static void receive_header(VirtIONet *n, const struct iovec *iov, int iov_cnt,
+ const void *buf, size_t size)
{
- int offset = 0;
-
if (n->has_vnet_hdr) {
/* FIXME this cast is evil */
void *wbuf = (void *)buf;
- work_around_broken_dhclient(wbuf, wbuf + offset, size - offset);
- offset = sizeof(struct virtio_net_hdr);
- iov_from_buf(iov, iov_cnt, 0, buf, offset);
+ work_around_broken_dhclient(wbuf, wbuf + n->host_hdr_len,
+ size - n->host_hdr_len);
+ iov_from_buf(iov, iov_cnt, 0, buf, sizeof(struct virtio_net_hdr));
} else {
struct virtio_net_hdr hdr = {
.flags = 0,
@@ -534,8 +532,6 @@ static int receive_header(VirtIONet *n, const struct iovec *iov, int iov_cnt,
};
iov_from_buf(iov, iov_cnt, 0, &hdr, sizeof hdr);
}
-
- return offset;
}
static int receive_filter(VirtIONet *n, const uint8_t *buf, int size)
@@ -642,8 +638,8 @@ static ssize_t virtio_net_receive(NetClientState *nc, const uint8_t *buf, size_t
sizeof(mhdr.num_buffers));
}
- offset += receive_header(n, sg, elem.in_num,
- buf + offset, size - offset);
+ receive_header(n, sg, elem.in_num, buf + offset, size - offset);
+ offset += n->host_hdr_len;
total += n->guest_hdr_len;
guest_offset = n->guest_hdr_len;
} else {