| From foo@baz Tue Jan 26 21:35:03 PST 2016 |
| From: Karl Heiss <kheiss@gmail.com> |
| Date: Mon, 11 Jan 2016 08:28:43 -0500 |
| Subject: bonding: Prevent IPv6 link local address on enslaved devices |
| |
| From: Karl Heiss <kheiss@gmail.com> |
| |
| [ Upstream commit 03d84a5f83a67e692af00a3d3901e7820e3e84d5 ] |
| |
| Commit 1f718f0f4f97 ("bonding: populate neighbour's private on enslave") |
| undoes the fix provided by commit c2edacf80e15 ("bonding / ipv6: no addrconf |
| for slaves separately from master") by effectively setting the slave flag |
| after the slave has been opened. If the slave comes up quickly enough, it |
| will go through the IPv6 addrconf before the slave flag has been set and |
| will get a link local IPv6 address. |
| |
| In order to ensure that addrconf knows to ignore the slave devices on state |
| change, set IFF_SLAVE before dev_open() during bonding enslavement. |
| |
| Fixes: 1f718f0f4f97 ("bonding: populate neighbour's private on enslave") |
| Signed-off-by: Karl Heiss <kheiss@gmail.com> |
| Signed-off-by: Jay Vosburgh <jay.vosburgh@canonical.com> |
| Reviewed-by: Jarod Wilson <jarod@redhat.com> |
| Signed-off-by: Andy Gospodarek <gospo@cumulusnetworks.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/bonding/bond_main.c | 5 ++++- |
| 1 file changed, 4 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/net/bonding/bond_main.c |
| +++ b/drivers/net/bonding/bond_main.c |
| @@ -1207,7 +1207,6 @@ static int bond_master_upper_dev_link(st |
| err = netdev_master_upper_dev_link_private(slave_dev, bond_dev, slave); |
| if (err) |
| return err; |
| - slave_dev->flags |= IFF_SLAVE; |
| rtmsg_ifinfo(RTM_NEWLINK, slave_dev, IFF_SLAVE, GFP_KERNEL); |
| return 0; |
| } |
| @@ -1465,6 +1464,9 @@ int bond_enslave(struct net_device *bond |
| } |
| } |
| |
| + /* set slave flag before open to prevent IPv6 addrconf */ |
| + slave_dev->flags |= IFF_SLAVE; |
| + |
| /* open the slave since the application closed it */ |
| res = dev_open(slave_dev); |
| if (res) { |
| @@ -1725,6 +1727,7 @@ err_close: |
| dev_close(slave_dev); |
| |
| err_restore_mac: |
| + slave_dev->flags &= ~IFF_SLAVE; |
| if (!bond->params.fail_over_mac || |
| BOND_MODE(bond) != BOND_MODE_ACTIVEBACKUP) { |
| /* XXX TODO - fom follow mode needs to change master's |