diff options
Diffstat (limited to 'drivers/net/macvlan.c')
-rw-r--r-- | drivers/net/macvlan.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c index 18373b6ae37d..d0f9c2fd1d4f 100644 --- a/drivers/net/macvlan.c +++ b/drivers/net/macvlan.c | |||
@@ -337,8 +337,11 @@ static int macvlan_open(struct net_device *dev) | |||
337 | int err; | 337 | int err; |
338 | 338 | ||
339 | if (vlan->port->passthru) { | 339 | if (vlan->port->passthru) { |
340 | if (!(vlan->flags & MACVLAN_FLAG_NOPROMISC)) | 340 | if (!(vlan->flags & MACVLAN_FLAG_NOPROMISC)) { |
341 | dev_set_promiscuity(lowerdev, 1); | 341 | err = dev_set_promiscuity(lowerdev, 1); |
342 | if (err < 0) | ||
343 | goto out; | ||
344 | } | ||
342 | goto hash_add; | 345 | goto hash_add; |
343 | } | 346 | } |
344 | 347 | ||
@@ -863,6 +866,18 @@ static int macvlan_changelink(struct net_device *dev, | |||
863 | struct nlattr *tb[], struct nlattr *data[]) | 866 | struct nlattr *tb[], struct nlattr *data[]) |
864 | { | 867 | { |
865 | struct macvlan_dev *vlan = netdev_priv(dev); | 868 | struct macvlan_dev *vlan = netdev_priv(dev); |
869 | enum macvlan_mode mode; | ||
870 | bool set_mode = false; | ||
871 | |||
872 | /* Validate mode, but don't set yet: setting flags may fail. */ | ||
873 | if (data && data[IFLA_MACVLAN_MODE]) { | ||
874 | set_mode = true; | ||
875 | mode = nla_get_u32(data[IFLA_MACVLAN_MODE]); | ||
876 | /* Passthrough mode can't be set or cleared dynamically */ | ||
877 | if ((mode == MACVLAN_MODE_PASSTHRU) != | ||
878 | (vlan->mode == MACVLAN_MODE_PASSTHRU)) | ||
879 | return -EINVAL; | ||
880 | } | ||
866 | 881 | ||
867 | if (data && data[IFLA_MACVLAN_FLAGS]) { | 882 | if (data && data[IFLA_MACVLAN_FLAGS]) { |
868 | __u16 flags = nla_get_u16(data[IFLA_MACVLAN_FLAGS]); | 883 | __u16 flags = nla_get_u16(data[IFLA_MACVLAN_FLAGS]); |
@@ -879,8 +894,8 @@ static int macvlan_changelink(struct net_device *dev, | |||
879 | } | 894 | } |
880 | vlan->flags = flags; | 895 | vlan->flags = flags; |
881 | } | 896 | } |
882 | if (data && data[IFLA_MACVLAN_MODE]) | 897 | if (set_mode) |
883 | vlan->mode = nla_get_u32(data[IFLA_MACVLAN_MODE]); | 898 | vlan->mode = mode; |
884 | return 0; | 899 | return 0; |
885 | } | 900 | } |
886 | 901 | ||