diff options
Diffstat (limited to 'drivers/net/tap.c')
| -rw-r--r-- | drivers/net/tap.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/net/tap.c b/drivers/net/tap.c index ff67d99deb39..2f19fb07bb2d 100644 --- a/drivers/net/tap.c +++ b/drivers/net/tap.c @@ -278,9 +278,10 @@ rx_handler_result_t tap_handle_frame(struct sk_buff **pskb) if (q->flags & IFF_VNET_HDR) features |= tap->tap_features; if (netif_needs_gso(skb, features)) { - struct sk_buff *segs = __skb_gso_segment(skb, features, false); + struct sk_buff *segs; struct sk_buff *next; + segs = __skb_gso_segment(skb, features, false, 0); if (IS_ERR(segs)) { drop_reason = SKB_DROP_REASON_SKB_GSO_SEG; goto drop; @@ -932,6 +933,9 @@ static long tap_ioctl(struct file *file, unsigned int cmd, if (get_user(u, &ifr->ifr_flags)) return -EFAULT; + /* TUNGETIFF may report IFF_DETACH_QUEUE, ignore it here */ + u &= ~IFF_DETACH_QUEUE; + ret = 0; if ((u & ~TAP_IFFEATURES) != (IFF_NO_PI | IFF_TAP)) ret = -EINVAL; @@ -950,6 +954,8 @@ static long tap_ioctl(struct file *file, unsigned int cmd, ret = 0; u = q->flags; + if (!q->enabled) + u |= IFF_DETACH_QUEUE; if (copy_to_user(&ifr->ifr_name, tap->dev->name, IFNAMSIZ) || put_user(u, &ifr->ifr_flags)) ret = -EFAULT; |
