|
@@ -46,16 +46,18 @@ struct macvtap_queue {
|
|
|
struct list_head next;
|
|
|
};
|
|
|
|
|
|
-#define MACVTAP_FEATURES (IFF_VNET_HDR | IFF_VNET_LE | IFF_MULTI_QUEUE)
|
|
|
+#define MACVTAP_FEATURES (IFF_VNET_HDR | IFF_MULTI_QUEUE)
|
|
|
+
|
|
|
+#define MACVTAP_VNET_LE 0x80000000
|
|
|
|
|
|
static inline u16 macvtap16_to_cpu(struct macvtap_queue *q, __virtio16 val)
|
|
|
{
|
|
|
- return __virtio16_to_cpu(q->flags & IFF_VNET_LE, val);
|
|
|
+ return __virtio16_to_cpu(q->flags & MACVTAP_VNET_LE, val);
|
|
|
}
|
|
|
|
|
|
static inline __virtio16 cpu_to_macvtap16(struct macvtap_queue *q, u16 val)
|
|
|
{
|
|
|
- return __cpu_to_virtio16(q->flags & IFF_VNET_LE, val);
|
|
|
+ return __cpu_to_virtio16(q->flags & MACVTAP_VNET_LE, val);
|
|
|
}
|
|
|
|
|
|
static struct proto macvtap_proto = {
|
|
@@ -999,7 +1001,7 @@ static long macvtap_ioctl(struct file *file, unsigned int cmd,
|
|
|
void __user *argp = (void __user *)arg;
|
|
|
struct ifreq __user *ifr = argp;
|
|
|
unsigned int __user *up = argp;
|
|
|
- unsigned int u;
|
|
|
+ unsigned short u;
|
|
|
int __user *sp = argp;
|
|
|
int s;
|
|
|
int ret;
|
|
@@ -1014,7 +1016,7 @@ static long macvtap_ioctl(struct file *file, unsigned int cmd,
|
|
|
if ((u & ~MACVTAP_FEATURES) != (IFF_NO_PI | IFF_TAP))
|
|
|
ret = -EINVAL;
|
|
|
else
|
|
|
- q->flags = u;
|
|
|
+ q->flags = (q->flags & ~MACVTAP_FEATURES) | u;
|
|
|
|
|
|
return ret;
|
|
|
|
|
@@ -1027,8 +1029,9 @@ static long macvtap_ioctl(struct file *file, unsigned int cmd,
|
|
|
}
|
|
|
|
|
|
ret = 0;
|
|
|
+ u = q->flags;
|
|
|
if (copy_to_user(&ifr->ifr_name, vlan->dev->name, IFNAMSIZ) ||
|
|
|
- put_user(q->flags, &ifr->ifr_flags))
|
|
|
+ put_user(u, &ifr->ifr_flags))
|
|
|
ret = -EFAULT;
|
|
|
macvtap_put_vlan(vlan);
|
|
|
rtnl_unlock();
|
|
@@ -1069,6 +1072,21 @@ static long macvtap_ioctl(struct file *file, unsigned int cmd,
|
|
|
q->vnet_hdr_sz = s;
|
|
|
return 0;
|
|
|
|
|
|
+ case TUNGETVNETLE:
|
|
|
+ s = !!(q->flags & MACVTAP_VNET_LE);
|
|
|
+ if (put_user(s, sp))
|
|
|
+ return -EFAULT;
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ case TUNSETVNETLE:
|
|
|
+ if (get_user(s, sp))
|
|
|
+ return -EFAULT;
|
|
|
+ if (s)
|
|
|
+ q->flags |= MACVTAP_VNET_LE;
|
|
|
+ else
|
|
|
+ q->flags &= ~MACVTAP_VNET_LE;
|
|
|
+ return 0;
|
|
|
+
|
|
|
case TUNSETOFFLOAD:
|
|
|
/* let the user check for future flags */
|
|
|
if (arg & ~(TUN_F_CSUM | TUN_F_TSO4 | TUN_F_TSO6 |
|