diff mbox

[7/8] kvm tools: use iovec functions in uip_rx

Message ID 1367612957-6719-7-git-send-email-sasha.levin@oracle.com (mailing list archive)
State New, archived
Headers show

Commit Message

Sasha Levin May 3, 2013, 8:29 p.m. UTC
Simplifies the code a lot.

Signed-off-by: Sasha Levin <sasha.levin@oracle.com>
---
 tools/kvm/include/kvm/uip.h |  4 ++--
 tools/kvm/net/uip/core.c    | 47 +++------------------------------------------
 2 files changed, 5 insertions(+), 46 deletions(-)
diff mbox

Patch

diff --git a/tools/kvm/include/kvm/uip.h b/tools/kvm/include/kvm/uip.h
index 338582d..cb79e94 100644
--- a/tools/kvm/include/kvm/uip.h
+++ b/tools/kvm/include/kvm/uip.h
@@ -214,8 +214,8 @@  struct uip_buf {
 	int vnet_len;
 	int eth_len;
 	int status;
-	char *vnet;
-	char *eth;
+	unsigned char *vnet;
+	unsigned char *eth;
 	int id;
 };
 
diff --git a/tools/kvm/net/uip/core.c b/tools/kvm/net/uip/core.c
index 7a74261..e31efc2 100644
--- a/tools/kvm/net/uip/core.c
+++ b/tools/kvm/net/uip/core.c
@@ -4,6 +4,7 @@ 
 #include <linux/virtio_net.h>
 #include <linux/kernel.h>
 #include <linux/list.h>
+#include <kvm/iovec.h>
 
 int uip_tx(struct iovec *iov, u16 out, struct uip_info *info)
 {
@@ -76,61 +77,19 @@  int uip_tx(struct iovec *iov, u16 out, struct uip_info *info)
 
 int uip_rx(struct iovec *iov, u16 in, struct uip_info *info)
 {
-	struct virtio_net_hdr *vnet;
-	struct uip_eth *eth;
 	struct uip_buf *buf;
-	int vnet_len;
-	int eth_len;
-	char *p;
 	int len;
-	int cnt;
-	int i;
 
 	/*
 	 * Sleep until there is a buffer for guest
 	 */
 	buf = uip_buf_get_used(info);
 
-	/*
-	 * Fill device to guest buffer, vnet hdr fisrt
-	 */
-	vnet_len = iov[0].iov_len;
-	vnet = iov[0].iov_base;
-	if (buf->vnet_len > vnet_len) {
-		len = -1;
-		goto out;
-	}
-	memcpy(vnet, buf->vnet, buf->vnet_len);
-
-	/*
-	 * Then, the real eth data
-	 * Note: Be sure buf->eth_len is not bigger than the buffer len that guest provides
-	 */
-	cnt = buf->eth_len;
-	p = buf->eth;
-	for (i = 1; i < in; i++) {
-		eth_len = iov[i].iov_len;
-		eth = iov[i].iov_base;
-		if (cnt > eth_len) {
-			memcpy(eth, p, eth_len);
-			cnt -= eth_len;
-			p += eth_len;
-		} else {
-			memcpy(eth, p, cnt);
-			cnt -= cnt;
-			break;
-		}
-	}
-
-	if (cnt) {
-		pr_warning("uip_rx error");
-		len = -1;
-		goto out;
-	}
+	memcpy_toiovecend(iov, buf->vnet, 0, buf->vnet_len);
+	memcpy_toiovecend(iov, buf->eth, buf->vnet_len, buf->eth_len);
 
 	len = buf->vnet_len + buf->eth_len;
 
-out:
 	uip_buf_set_free(info, buf);
 	return len;
 }