From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48119) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WvQ1l-0005hf-Jt for qemu-devel@nongnu.org; Fri, 13 Jun 2014 07:52:20 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WvQ1f-0007Cm-Bw for qemu-devel@nongnu.org; Fri, 13 Jun 2014 07:52:13 -0400 Received: from cantor2.suse.de ([195.135.220.15]:54033 helo=mx2.suse.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WvQ1f-0007Cb-1u for qemu-devel@nongnu.org; Fri, 13 Jun 2014 07:52:07 -0400 Message-ID: <539AE5E4.3060708@suse.de> Date: Fri, 13 Jun 2014 13:52:04 +0200 From: Alexander Graf MIME-Version: 1.0 References: <20140613111703.22108.14322.stgit@bahia.local> <20140613112420.22108.4861.stgit@bahia.local> In-Reply-To: <20140613112420.22108.4861.stgit@bahia.local> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH v8 14/20] virtio-net: use virtio wrappers to access headers List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Greg Kurz , qemu-devel@nongnu.org Cc: Kevin Wolf , Peter Maydell , Stefan Hajnoczi , Juan Quintela , Rusty Russell , "Michael S. Tsirkin" , aneesh.kumar@linux.vnet.ibm.com, Anthony Liguori , Amit Shah , Paolo Bonzini , =?UTF-8?B?QW5kcmVhcyBGw6RyYmVy?= On 13.06.14 13:24, Greg Kurz wrote: > From: Rusty Russell > > Signed-off-by: Rusty Russell > Reviewed-by: Anthony Liguori > [ pass VirtIODevice * to memory accessors, > TCP checksums fix by C=C3=A9dric Le Goater, > Greg Kurz ] > Cc: C=C3=A9dric Le Goater > Signed-off-by: Greg Kurz > --- > hw/net/virtio-net.c | 34 +++++++++++++++++++++++++++------- > 1 file changed, 27 insertions(+), 7 deletions(-) > > diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c > index 58e7b73..fb17919 100644 > --- a/hw/net/virtio-net.c > +++ b/hw/net/virtio-net.c > @@ -23,6 +23,7 @@ > #include "hw/virtio/virtio-bus.h" > #include "qapi/qmp/qjson.h" > #include "monitor/monitor.h" > +#include "hw/virtio/virtio-access.h" > =20 > #define VIRTIO_NET_VM_VERSION 11 > =20 > @@ -72,8 +73,8 @@ static void virtio_net_get_config(VirtIODevice *vdev,= uint8_t *config) > VirtIONet *n =3D VIRTIO_NET(vdev); > struct virtio_net_config netcfg; > =20 > - stw_p(&netcfg.status, n->status); > - stw_p(&netcfg.max_virtqueue_pairs, n->max_queues); > + virtio_stw_p(vdev, &netcfg.status, n->status); > + virtio_stw_p(vdev, &netcfg.max_virtqueue_pairs, n->max_queues); > memcpy(netcfg.mac, n->mac, ETH_ALEN); > memcpy(config, &netcfg, n->config_size); > } > @@ -611,6 +612,7 @@ static int virtio_net_handle_offloads(VirtIONet *n,= uint8_t cmd, > static int virtio_net_handle_mac(VirtIONet *n, uint8_t cmd, > struct iovec *iov, unsigned int iov_= cnt) > { > + VirtIODevice *vdev =3D VIRTIO_DEVICE(n); > struct virtio_net_ctrl_mac mac_data; > size_t s; > NetClientState *nc =3D qemu_get_queue(n->nic); > @@ -639,7 +641,7 @@ static int virtio_net_handle_mac(VirtIONet *n, uint= 8_t cmd, > =20 > s =3D iov_to_buf(iov, iov_cnt, 0, &mac_data.entries, > sizeof(mac_data.entries)); > - mac_data.entries =3D ldl_p(&mac_data.entries); > + mac_data.entries =3D virtio_ldl_p(vdev, &mac_data.entries); > if (s !=3D sizeof(mac_data.entries)) { > goto error; > } > @@ -666,7 +668,7 @@ static int virtio_net_handle_mac(VirtIONet *n, uint= 8_t cmd, > =20 > s =3D iov_to_buf(iov, iov_cnt, 0, &mac_data.entries, > sizeof(mac_data.entries)); > - mac_data.entries =3D ldl_p(&mac_data.entries); > + mac_data.entries =3D virtio_ldl_p(vdev, &mac_data.entries); > if (s !=3D sizeof(mac_data.entries)) { > goto error; > } > @@ -706,12 +708,13 @@ error: > static int virtio_net_handle_vlan_table(VirtIONet *n, uint8_t cmd, > struct iovec *iov, unsigned i= nt iov_cnt) > { > + VirtIODevice *vdev =3D VIRTIO_DEVICE(n); > uint16_t vid; > size_t s; > NetClientState *nc =3D qemu_get_queue(n->nic); > =20 > s =3D iov_to_buf(iov, iov_cnt, 0, &vid, sizeof(vid)); > - vid =3D lduw_p(&vid); > + vid =3D virtio_lduw_p(vdev, &vid); > if (s !=3D sizeof(vid)) { > return VIRTIO_NET_ERR; > } > @@ -748,7 +751,7 @@ static int virtio_net_handle_mq(VirtIONet *n, uint8= _t cmd, > return VIRTIO_NET_ERR; > } > =20 > - queues =3D lduw_p(&mq.virtqueue_pairs); > + queues =3D virtio_lduw_p(vdev, &mq.virtqueue_pairs); > =20 > if (queues < VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MIN || > queues > VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MAX || > @@ -863,6 +866,14 @@ static int virtio_net_has_buffers(VirtIONetQueue *= q, int bufsize) > return 1; > } > =20 > +static void virtio_net_hdr_swap(VirtIODevice *vdev, struct virtio_net_= hdr *hdr) > +{ > + virtio_tswap16s(vdev, &hdr->hdr_len); > + virtio_tswap16s(vdev, &hdr->gso_size); > + virtio_tswap16s(vdev, &hdr->csum_start); > + virtio_tswap16s(vdev, &hdr->csum_offset); > +} > + > /* dhclient uses AF_PACKET but doesn't pass auxdata to the kernel so > * it never finds out that the packets don't have valid checksums. T= his > * causes dhclient to get upset. Fedora's carried a patch for ages t= o > @@ -898,6 +909,7 @@ static void receive_header(VirtIONet *n, const stru= ct iovec *iov, int iov_cnt, > void *wbuf =3D (void *)buf; > work_around_broken_dhclient(wbuf, wbuf + n->host_hdr_len, > size - n->host_hdr_len); > + virtio_net_hdr_swap(VIRTIO_DEVICE(n), wbuf); > iov_from_buf(iov, iov_cnt, 0, buf, sizeof(struct virtio_net_h= dr)); > } else { > struct virtio_net_hdr hdr =3D { > @@ -1047,7 +1059,7 @@ static ssize_t virtio_net_receive(NetClientState = *nc, const uint8_t *buf, size_t > } > =20 > if (mhdr_cnt) { > - stw_p(&mhdr.num_buffers, i); > + virtio_stw_p(vdev, &mhdr.num_buffers, i); > iov_from_buf(mhdr_sg, mhdr_cnt, > 0, > &mhdr.num_buffers, sizeof mhdr.num_buffers); > @@ -1106,6 +1118,14 @@ static int32_t virtio_net_flush_tx(VirtIONetQueu= e *q) > exit(1); > } > =20 > + if (n->has_vnet_hdr) { > + if (out_sg[0].iov_len < n->guest_hdr_len) { > + error_report("virtio-net header incorrect"); > + exit(1); > + } > + virtio_net_hdr_swap(vdev, (void *) out_sg[0].iov_base); Where does this come from? If you're doing twap() wouldn't that have=20 been broken before too? Alex