]> git.baikalelectronics.ru Git - kernel.git/commitdiff
add support of IFF_XMIT_DST_RELEASE bit in vlan
authorVadim Fedorenko <vfedorenko@yandex-team.ru>
Thu, 2 Nov 2017 12:49:08 +0000 (15:49 +0300)
committerDavid S. Miller <davem@davemloft.net>
Sat, 4 Nov 2017 13:33:06 +0000 (22:33 +0900)
Some time ago Eric Dumazet suggested a "hack the IFF_XMIT_DST_RELEASE
flag on the vlan netdev". But the last comment was "does not support
properly bonding/team.(If the real_dev->privflags IFF_XMIT_DST_RELEASE
bit changes, we want to update all the vlans at the same time )"

I've extended that patch to support changes of IFF_XMIT_DST_RELEASE in
bonding/team.
Both bonding and team call netdev_change_features() after recalculation
of features including priv_flags IFF_XMIT_DST_RELEASE bit. So the only
thing needed to support is to recheck this bit in
vlan_transfer_features().

Suggested-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: Vadim Fedorenko <vfedorenko@yandex-team.ru>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/8021q/vlan.c
net/8021q/vlan_netlink.c

index 71c3e045505bef2099ecdab35cc13b6fedff2f56..a0103500cc6d3275c4bc38a7447532ecc209e810 100644 (file)
@@ -328,6 +328,9 @@ static void vlan_transfer_features(struct net_device *dev,
        vlandev->fcoe_ddp_xid = dev->fcoe_ddp_xid;
 #endif
 
+       vlandev->priv_flags &= ~IFF_XMIT_DST_RELEASE;
+       vlandev->priv_flags |= (vlan->real_dev->priv_flags & IFF_XMIT_DST_RELEASE);
+
        netdev_update_features(vlandev);
 }
 
index 6e7c5a6a7930a17b95a7e067cc5a77762284b336..6689c0b272a7dbbb7685e8ae2024d3d7003643da 100644 (file)
@@ -143,6 +143,7 @@ static int vlan_newlink(struct net *src_net, struct net_device *dev,
        vlan->vlan_proto = proto;
        vlan->vlan_id    = nla_get_u16(data[IFLA_VLAN_ID]);
        vlan->real_dev   = real_dev;
+       dev->priv_flags |= (real_dev->priv_flags & IFF_XMIT_DST_RELEASE);
        vlan->flags      = VLAN_FLAG_REORDER_HDR;
 
        err = vlan_check_real_dev(real_dev, vlan->vlan_proto, vlan->vlan_id);