diff options
Diffstat (limited to 'drivers/net/team/team.c')
-rw-r--r-- | drivers/net/team/team.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c index 6ed96fdfd96d..9ce61b019aad 100644 --- a/drivers/net/team/team.c +++ b/drivers/net/team/team.c | |||
@@ -1246,6 +1246,23 @@ static int team_port_add(struct team *team, struct net_device *port_dev, | |||
1246 | goto err_option_port_add; | 1246 | goto err_option_port_add; |
1247 | } | 1247 | } |
1248 | 1248 | ||
1249 | /* set promiscuity level to new slave */ | ||
1250 | if (dev->flags & IFF_PROMISC) { | ||
1251 | err = dev_set_promiscuity(port_dev, 1); | ||
1252 | if (err) | ||
1253 | goto err_set_slave_promisc; | ||
1254 | } | ||
1255 | |||
1256 | /* set allmulti level to new slave */ | ||
1257 | if (dev->flags & IFF_ALLMULTI) { | ||
1258 | err = dev_set_allmulti(port_dev, 1); | ||
1259 | if (err) { | ||
1260 | if (dev->flags & IFF_PROMISC) | ||
1261 | dev_set_promiscuity(port_dev, -1); | ||
1262 | goto err_set_slave_promisc; | ||
1263 | } | ||
1264 | } | ||
1265 | |||
1249 | netif_addr_lock_bh(dev); | 1266 | netif_addr_lock_bh(dev); |
1250 | dev_uc_sync_multiple(port_dev, dev); | 1267 | dev_uc_sync_multiple(port_dev, dev); |
1251 | dev_mc_sync_multiple(port_dev, dev); | 1268 | dev_mc_sync_multiple(port_dev, dev); |
@@ -1262,6 +1279,9 @@ static int team_port_add(struct team *team, struct net_device *port_dev, | |||
1262 | 1279 | ||
1263 | return 0; | 1280 | return 0; |
1264 | 1281 | ||
1282 | err_set_slave_promisc: | ||
1283 | __team_option_inst_del_port(team, port); | ||
1284 | |||
1265 | err_option_port_add: | 1285 | err_option_port_add: |
1266 | team_upper_dev_unlink(team, port); | 1286 | team_upper_dev_unlink(team, port); |
1267 | 1287 | ||
@@ -1307,6 +1327,12 @@ static int team_port_del(struct team *team, struct net_device *port_dev) | |||
1307 | 1327 | ||
1308 | team_port_disable(team, port); | 1328 | team_port_disable(team, port); |
1309 | list_del_rcu(&port->list); | 1329 | list_del_rcu(&port->list); |
1330 | |||
1331 | if (dev->flags & IFF_PROMISC) | ||
1332 | dev_set_promiscuity(port_dev, -1); | ||
1333 | if (dev->flags & IFF_ALLMULTI) | ||
1334 | dev_set_allmulti(port_dev, -1); | ||
1335 | |||
1310 | team_upper_dev_unlink(team, port); | 1336 | team_upper_dev_unlink(team, port); |
1311 | netdev_rx_handler_unregister(port_dev); | 1337 | netdev_rx_handler_unregister(port_dev); |
1312 | team_port_disable_netpoll(port); | 1338 | team_port_disable_netpoll(port); |