Simplifies the code a lot. Signed-off-by: Sasha Levin <sasha.levin@xxxxxxxxxx> --- tools/kvm/include/kvm/uip.h | 4 ++-- tools/kvm/net/uip/core.c | 47 +++------------------------------------------ 2 files changed, 5 insertions(+), 46 deletions(-) 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; } -- 1.8.2.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