diff options
Diffstat (limited to 'net/8021q/vlan_dev.c')
-rw-r--r-- | net/8021q/vlan_dev.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c index 4a6d31a082b9..19cf81bf9f69 100644 --- a/net/8021q/vlan_dev.c +++ b/net/8021q/vlan_dev.c | |||
@@ -261,7 +261,7 @@ int vlan_dev_change_flags(const struct net_device *dev, u32 flags, u32 mask) | |||
261 | u32 old_flags = vlan->flags; | 261 | u32 old_flags = vlan->flags; |
262 | 262 | ||
263 | if (mask & ~(VLAN_FLAG_REORDER_HDR | VLAN_FLAG_GVRP | | 263 | if (mask & ~(VLAN_FLAG_REORDER_HDR | VLAN_FLAG_GVRP | |
264 | VLAN_FLAG_LOOSE_BINDING)) | 264 | VLAN_FLAG_LOOSE_BINDING | VLAN_FLAG_MVRP)) |
265 | return -EINVAL; | 265 | return -EINVAL; |
266 | 266 | ||
267 | vlan->flags = (old_flags & ~mask) | (flags & mask); | 267 | vlan->flags = (old_flags & ~mask) | (flags & mask); |
@@ -272,6 +272,13 @@ int vlan_dev_change_flags(const struct net_device *dev, u32 flags, u32 mask) | |||
272 | else | 272 | else |
273 | vlan_gvrp_request_leave(dev); | 273 | vlan_gvrp_request_leave(dev); |
274 | } | 274 | } |
275 | |||
276 | if (netif_running(dev) && (vlan->flags ^ old_flags) & VLAN_FLAG_MVRP) { | ||
277 | if (vlan->flags & VLAN_FLAG_MVRP) | ||
278 | vlan_mvrp_request_join(dev); | ||
279 | else | ||
280 | vlan_mvrp_request_leave(dev); | ||
281 | } | ||
275 | return 0; | 282 | return 0; |
276 | } | 283 | } |
277 | 284 | ||
@@ -312,6 +319,9 @@ static int vlan_dev_open(struct net_device *dev) | |||
312 | if (vlan->flags & VLAN_FLAG_GVRP) | 319 | if (vlan->flags & VLAN_FLAG_GVRP) |
313 | vlan_gvrp_request_join(dev); | 320 | vlan_gvrp_request_join(dev); |
314 | 321 | ||
322 | if (vlan->flags & VLAN_FLAG_MVRP) | ||
323 | vlan_mvrp_request_join(dev); | ||
324 | |||
315 | if (netif_carrier_ok(real_dev)) | 325 | if (netif_carrier_ok(real_dev)) |
316 | netif_carrier_on(dev); | 326 | netif_carrier_on(dev); |
317 | return 0; | 327 | return 0; |
@@ -640,9 +650,9 @@ static int vlan_ethtool_get_settings(struct net_device *dev, | |||
640 | static void vlan_ethtool_get_drvinfo(struct net_device *dev, | 650 | static void vlan_ethtool_get_drvinfo(struct net_device *dev, |
641 | struct ethtool_drvinfo *info) | 651 | struct ethtool_drvinfo *info) |
642 | { | 652 | { |
643 | strcpy(info->driver, vlan_fullname); | 653 | strlcpy(info->driver, vlan_fullname, sizeof(info->driver)); |
644 | strcpy(info->version, vlan_version); | 654 | strlcpy(info->version, vlan_version, sizeof(info->version)); |
645 | strcpy(info->fw_version, "N/A"); | 655 | strlcpy(info->fw_version, "N/A", sizeof(info->fw_version)); |
646 | } | 656 | } |
647 | 657 | ||
648 | static struct rtnl_link_stats64 *vlan_dev_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats) | 658 | static struct rtnl_link_stats64 *vlan_dev_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats) |
@@ -723,7 +733,7 @@ static void vlan_dev_netpoll_cleanup(struct net_device *dev) | |||
723 | 733 | ||
724 | vlan->netpoll = NULL; | 734 | vlan->netpoll = NULL; |
725 | 735 | ||
726 | __netpoll_free_rcu(netpoll); | 736 | __netpoll_free_async(netpoll); |
727 | } | 737 | } |
728 | #endif /* CONFIG_NET_POLL_CONTROLLER */ | 738 | #endif /* CONFIG_NET_POLL_CONTROLLER */ |
729 | 739 | ||