diff options
Diffstat (limited to 'drivers/net/bonding/bond_main.c')
-rw-r--r-- | drivers/net/bonding/bond_main.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 435984ad8b2f..0730203a19f2 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -766,18 +766,30 @@ static void __bond_resend_igmp_join_requests(struct net_device *dev) */ static void bond_resend_igmp_join_requests(struct bonding *bond) { - struct net_device *vlan_dev; + struct net_device *bond_dev, *vlan_dev, *master_dev; struct vlan_entry *vlan; read_lock(&bond->lock); + bond_dev = bond->dev; + /* rejoin all groups on bond device */ - __bond_resend_igmp_join_requests(bond->dev); + __bond_resend_igmp_join_requests(bond_dev); + + /* + * if bond is enslaved to a bridge, + * then rejoin all groups on its master + */ + master_dev = bond_dev->master; + if (master_dev) + if ((master_dev->priv_flags & IFF_EBRIDGE) + && (bond_dev->priv_flags & IFF_BRIDGE_PORT)) + __bond_resend_igmp_join_requests(master_dev); /* rejoin all groups on vlan devices */ list_for_each_entry(vlan, &bond->vlan_list, vlan_list) { rcu_read_lock(); - vlan_dev = __vlan_find_dev_deep(bond->dev, + vlan_dev = __vlan_find_dev_deep(bond_dev, vlan->vlan_id); rcu_read_unlock(); if (vlan_dev) |