macvtap: add ioctl to modify vnet header size
Subsystems (2)
PATCH 1/1 macvtap: add ioctl to modify vnet header size
This adds TUNSETVNETHDRSZ/TUNGETVNETHDRSZ support
to macvtap.
---
This just mirrors the support in tun,
http://lkml.org/lkml/2010/3/17/221
so that we can make vhost mergeable buffers work with macvtap as well.
I plan to merge both patches through vhost tree together with mergeable buffer support. Comments?
drivers/net/macvtap.c | 31 +++++++++++++++++++++++++++---- 1 files changed, 27 insertions(+), 4 deletions(-)
drivers/net/macvtap.c +27 -4
@@ -37,6 +37,7 @@struct macvtap_queue {struct sock sk;struct socket sock; +int vnet_hdr_sz;struct macvlan_dev *vlan;struct file *file;unsigned int flags;
@@ -280,6 +281,7 @@ static int macvtap_open(struct inode *inode, struct file *file)sock_init_data (&q->sock, &q->sk); q->sk.sk_write_space = macvtap_sock_write_space; q->flags =IFF_VNET_HDR |IFF_NO_PI |IFF_TAP ; + q->vnet_hdr_sz =sizeof (struct virtio_net_hdr ); err =macvtap_set_queue (dev, file, q);if (err)
@@ -440,14 +442,14 @@ static ssize_t macvtap_get_user(struct macvtap_queue *q,int vnet_hdr_len =0 ;if (q->flags &IFF_VNET_HDR ) { - vnet_hdr_len =sizeof (vnet_hdr); + vnet_hdr_len = q->vnet_hdr_sz; err = -EINVAL ;if ((len -= vnet_hdr_len) <0 ) goto err; err =memcpy_fromiovecend ((void *)&vnet_hdr, iv,0 , - vnet_hdr_len); +sizeof (vnet_hdr));if (err <0 ) goto err; if ((vnet_hdr.flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) &&
@@ -529,7 +531,7 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q,if (q->flags &IFF_VNET_HDR ) {struct virtio_net_hdr vnet_hdr; - vnet_hdr_len =sizeof (vnet_hdr); + vnet_hdr_len = q->vnet_hdr_sz;if ((len -= vnet_hdr_len) <0 )return -EINVAL ;
@@ -537,7 +539,7 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q,if (ret)return ret; -if (memcpy_toiovecend (iv, (void *)&vnet_hdr,0 , vnet_hdr_len)) +if (memcpy_toiovecend (iv, (void *)&vnet_hdr,0 ,sizeof (vnet_hdr)))return -EFAULT ; }
@@ -622,6 +624,8 @@ static long macvtap_ioctl(struct file *file, unsigned int cmd,struct ifreq __user *ifr = argp;unsigned int __user *up = argp;unsigned int u; +int __user *sp = argp; +int s;int ret;switch (cmd) {
@@ -667,6 +671,25 @@ static long macvtap_ioctl(struct file *file, unsigned int cmd, q->sk.sk_sndbuf = u;return 0 ; +case TUNGETVNETHDRSZ : + s = q->vnet_hdr_sz; +if (put_user (s, sp)) + ret = -EFAULT ; +break ; + +case TUNSETVNETHDRSZ : +if (get_user (s, sp)) { + ret = -EFAULT ; +break ; + } +if (s < (int )sizeof (struct virtio_net_hdr )) { + ret = -EINVAL ; +break ; + } + + q->vnet_hdr_sz = s; +break ; +case TUNSETOFFLOAD :/* let the user check for future flags */ if (arg & ~(TUN_F_CSUM | TUN_F_TSO4 | TUN_F_TSO6 |
Signature · 1 line
1.7.1.rc1.22.g3163
Quoted 2 lines · Michael S. Tsirkin
This adds TUNSETVNETHDRSZ/TUNGETVNETHDRSZ support
to macvtap.
Looks good, thanks Michael!
Quoted 1 line
Signed-off-by Michael S. Tsirkin <[email protected]>
From: Arnd Bergmann <[email protected]>
Date: Thu, 29 Apr 2010 16:40:57 +0200
Quoted 9 lines · Michael S. Tsirkin
Quoted 2 lines
This adds TUNSETVNETHDRSZ/TUNGETVNETHDRSZ support
to macvtap.Looks good, thanks Michael!
Quoted 1 line
Signed-off-by Michael S. Tsirkin <[email protected]>Acked-by Arnd Bergmann <[email protected]>
Applied to net-next-2.6, thanks.
David Miller
maintainerFrom: David Miller <[email protected]>
Date: Sun, 02 May 2010 23:32:32 -0700 (PDT)
Quoted 7 lines
From: Arnd Bergmann <[email protected]>
Date: Thu, 29 Apr 2010 16:40:57 +0200Quoted 4 lines · Michael S. Tsirkin
Quoted 2 lines
This adds TUNSETVNETHDRSZ/TUNGETVNETHDRSZ support
to macvtap.
Quoted 7 lines
Quoted 5 lines
Looks good, thanks Michael!
Quoted 1 line
Signed-off-by Michael S. Tsirkin <[email protected]>Acked-by Arnd Bergmann <[email protected]>Applied to net-next-2.6, thanks.
Nevermind, reverted:
drivers/net/macvtap.c: In function 'macvtap_ioctl':drivers/net/macvtap.c:679:7: error: 'TUNGETVNETHDRSZ' undeclared (first use in this function) drivers/net/macvtap.c:679:7: note: each undeclared identifier is reported only once for each function it appears in drivers/net/macvtap.c:685:7: error: 'TUNSETVNETHDRSZ' undeclared (first use in this function)
What tree is this supposed to build under? Certinaly not net-2.6 or net-next-2.6
Quoted 20 lines · David Miller
From: David Miller <[email protected]>
Date: Sun, 02 May 2010 23:32:32 -0700 (PDT)Quoted 7 lines
From: Arnd Bergmann <[email protected]>
Date: Thu, 29 Apr 2010 16:40:57 +0200Quoted 4 lines · Michael S. Tsirkin
Quoted 2 lines
This adds TUNSETVNETHDRSZ/TUNGETVNETHDRSZ support
to macvtap.Quoted 7 lines
Quoted 5 lines
Looks good, thanks Michael!
Quoted 1 line
Signed-off-by Michael S. Tsirkin <[email protected]>Acked-by Arnd Bergmann <[email protected]>Applied to net-next-2.6, thanks.
Nevermind, reverted:
Quoted 7 lines
drivers/net/macvtap.c: In function 'macvtap_ioctl':drivers/net/macvtap.c:679:7: error: 'TUNGETVNETHDRSZ' undeclared (first use in this function)drivers/net/macvtap.c:679:7: note: each undeclared identifier is reported only once for each function it appears indrivers/net/macvtap.c:685:7: error: 'TUNSETVNETHDRSZ' undeclared (first use in this function)What tree is this supposed to build under? Certinaly not net-2.6 or net-next-2.6
The reason is it needs to be applied on top of the patch that adds the same header to tun that you acked. I put this in patch description:
Quoted 2 lines
I plan to merge both patches through vhost tree together with mergeable buffer support. Comments?
In other words, this will be included in a pull request that I intend to send out shortly.
Signature · 1 line
MST
From: "Michael S. Tsirkin" <[email protected]>
Date: Mon, 3 May 2010 10:55:11 +0300
Quoted 10 lines · David Miller
Quoted 2 lines
What tree is this supposed to build under? Certinaly not net-2.6 or net-next-2.6
The reason is it needs to be applied on top of the patch that adds the same header to tun that you acked. I put this in patch description:
Quoted 2 lines
I plan to merge both patches through vhost tree together with mergeable buffer support. Comments?
In other words, this will be included in a pull request that I intend to send out shortly.
works for me: