|
@@ -853,18 +853,24 @@ static int macvlan_changelink(struct net_device *dev,
|
|
|
struct nlattr *tb[], struct nlattr *data[])
|
|
|
{
|
|
|
struct macvlan_dev *vlan = netdev_priv(dev);
|
|
|
- if (data && data[IFLA_MACVLAN_MODE])
|
|
|
- vlan->mode = nla_get_u32(data[IFLA_MACVLAN_MODE]);
|
|
|
+
|
|
|
if (data && data[IFLA_MACVLAN_FLAGS]) {
|
|
|
__u16 flags = nla_get_u16(data[IFLA_MACVLAN_FLAGS]);
|
|
|
bool promisc = (flags ^ vlan->flags) & MACVLAN_FLAG_NOPROMISC;
|
|
|
-
|
|
|
- if (promisc && (flags & MACVLAN_FLAG_NOPROMISC))
|
|
|
- dev_set_promiscuity(vlan->lowerdev, -1);
|
|
|
- else if (promisc && !(flags & MACVLAN_FLAG_NOPROMISC))
|
|
|
- dev_set_promiscuity(vlan->lowerdev, 1);
|
|
|
+ if (vlan->port->passthru && promisc) {
|
|
|
+ int err;
|
|
|
+
|
|
|
+ if (flags & MACVLAN_FLAG_NOPROMISC)
|
|
|
+ err = dev_set_promiscuity(vlan->lowerdev, -1);
|
|
|
+ else
|
|
|
+ err = dev_set_promiscuity(vlan->lowerdev, 1);
|
|
|
+ if (err < 0)
|
|
|
+ return err;
|
|
|
+ }
|
|
|
vlan->flags = flags;
|
|
|
}
|
|
|
+ if (data && data[IFLA_MACVLAN_MODE])
|
|
|
+ vlan->mode = nla_get_u32(data[IFLA_MACVLAN_MODE]);
|
|
|
return 0;
|
|
|
}
|
|
|
|