Skip to content

Commit 060ad60

Browse files
committed
Merge branch 'bonding-fixes'
Hangbin Liu says: ==================== bonding: fix lladdr finding and confirmation This patch set fixed 3 issues when setting lladdr as bonding IPv6 target. Please see each patch for the details. v2: separate the patch to 3 parts ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents c907140 + 592335a commit 060ad60

File tree

2 files changed

+21
-7
lines changed

2 files changed

+21
-7
lines changed

drivers/net/bonding/bond_main.c

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3167,6 +3167,9 @@ static void bond_ns_send_all(struct bonding *bond, struct slave *slave)
31673167
found:
31683168
if (!ipv6_dev_get_saddr(dev_net(dst->dev), dst->dev, &targets[i], 0, &saddr))
31693169
bond_ns_send(slave, &targets[i], &saddr, tags);
3170+
else
3171+
bond_ns_send(slave, &targets[i], &in6addr_any, tags);
3172+
31703173
dst_release(dst);
31713174
kfree(tags);
31723175
}
@@ -3198,12 +3201,19 @@ static bool bond_has_this_ip6(struct bonding *bond, struct in6_addr *addr)
31983201
return ret;
31993202
}
32003203

3201-
static void bond_validate_ns(struct bonding *bond, struct slave *slave,
3204+
static void bond_validate_na(struct bonding *bond, struct slave *slave,
32023205
struct in6_addr *saddr, struct in6_addr *daddr)
32033206
{
32043207
int i;
32053208

3206-
if (ipv6_addr_any(saddr) || !bond_has_this_ip6(bond, daddr)) {
3209+
/* Ignore NAs that:
3210+
* 1. Source address is unspecified address.
3211+
* 2. Dest address is neither all-nodes multicast address nor
3212+
* exist on bond interface.
3213+
*/
3214+
if (ipv6_addr_any(saddr) ||
3215+
(!ipv6_addr_equal(daddr, &in6addr_linklocal_allnodes) &&
3216+
!bond_has_this_ip6(bond, daddr))) {
32073217
slave_dbg(bond->dev, slave->dev, "%s: sip %pI6c tip %pI6c not found\n",
32083218
__func__, saddr, daddr);
32093219
return;
@@ -3246,14 +3256,14 @@ static int bond_na_rcv(const struct sk_buff *skb, struct bonding *bond,
32463256
* see bond_arp_rcv().
32473257
*/
32483258
if (bond_is_active_slave(slave))
3249-
bond_validate_ns(bond, slave, saddr, daddr);
3259+
bond_validate_na(bond, slave, saddr, daddr);
32503260
else if (curr_active_slave &&
32513261
time_after(slave_last_rx(bond, curr_active_slave),
32523262
curr_active_slave->last_link_up))
3253-
bond_validate_ns(bond, slave, saddr, daddr);
3263+
bond_validate_na(bond, slave, saddr, daddr);
32543264
else if (curr_arp_slave &&
32553265
bond_time_in_interval(bond, slave_last_tx(curr_arp_slave), 1))
3256-
bond_validate_ns(bond, slave, saddr, daddr);
3266+
bond_validate_na(bond, slave, saddr, daddr);
32573267

32583268
out:
32593269
return RX_HANDLER_ANOTHER;

net/ipv6/addrconf.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3557,11 +3557,15 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
35573557
fallthrough;
35583558
case NETDEV_UP:
35593559
case NETDEV_CHANGE:
3560-
if (dev->flags & IFF_SLAVE)
3560+
if (idev && idev->cnf.disable_ipv6)
35613561
break;
35623562

3563-
if (idev && idev->cnf.disable_ipv6)
3563+
if (dev->flags & IFF_SLAVE) {
3564+
if (event == NETDEV_UP && !IS_ERR_OR_NULL(idev) &&
3565+
dev->flags & IFF_UP && dev->flags & IFF_MULTICAST)
3566+
ipv6_mc_up(idev);
35643567
break;
3568+
}
35653569

35663570
if (event == NETDEV_UP) {
35673571
/* restore routes for permanent addresses */

0 commit comments

Comments
 (0)