aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/team/team.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/team/team.c')
-rw-r--r--drivers/net/team/team.c26
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
1282err_set_slave_promisc:
1283 __team_option_inst_del_port(team, port);
1284
1265err_option_port_add: 1285err_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);