Hangbin Liu <liuhang...@gmail.com> wrote:

>When validation on the backup slave is enabled, we need to validate the
>Neighbor Solicitation (NS) messages received on the backup slave. To
>receive these messages, the correct destination MAC address must be added
>to the slave. However, the target in bonding is a unicast address, which
>we cannot use directly. Instead, we should first convert it to a
>Solicited-Node Multicast Address and then derive the corresponding MAC
>address.
>
>Fixes: 8eb36164d1a6 ("bonding: add ns target multicast address to slave 
>device")
>Signed-off-by: Hangbin Liu <liuhang...@gmail.com>

        I think this now deserves some commentary in the code.  Not
because this function itself is unclear, but because there's the
similarly-named slave_set_ns_maddr() (singular, not plural as in this
patch) that will behave in a subtly different manner after this patch is
applied.

        The "maddrs" version here will convert the provided IPv6 address
to the IPv6 solicited-nodes multicast address (RFC 4291 section 2.7.1)
and thence to the MAC address, via ndisc_mc_map(), whereas the "maddr"
version uses the supplied IPv6 address directly for multicast MAC
address conversion.

        Assuming that I'm following that correctly, I think this
distinction deserves explanation.  And if I'm getting it wrong, then it
definitely deserves some explanation.

        FWIW, functionally, I think it's doing the correct thing.

        -J

>---
> drivers/net/bonding/bond_options.c | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)
>
>diff --git a/drivers/net/bonding/bond_options.c 
>b/drivers/net/bonding/bond_options.c
>index 327b6ecdc77e..63cf209dcdc9 100644
>--- a/drivers/net/bonding/bond_options.c
>+++ b/drivers/net/bonding/bond_options.c
>@@ -1246,6 +1246,7 @@ static void slave_set_ns_maddrs(struct bonding *bond, 
>struct slave *slave, bool
> {
>       struct in6_addr *targets = bond->params.ns_targets;
>       char slot_maddr[MAX_ADDR_LEN];
>+      struct in6_addr mcaddr;
>       int i;
> 
>       if (!slave_can_set_ns_maddr(bond, slave))
>@@ -1255,7 +1256,8 @@ static void slave_set_ns_maddrs(struct bonding *bond, 
>struct slave *slave, bool
>               if (ipv6_addr_any(&targets[i]))
>                       break;
> 
>-              if (!ndisc_mc_map(&targets[i], slot_maddr, slave->dev, 0)) {
>+              addrconf_addr_solict_mult(&targets[i], &mcaddr);
>+              if (!ndisc_mc_map(&mcaddr, slot_maddr, slave->dev, 0)) {
>                       if (add)
>                               dev_mc_add(slave->dev, slot_maddr);
>                       else
>-- 
>2.46.0
>

---
        -Jay Vosburgh, j...@jvosburgh.net

Reply via email to