Skip to content

Commit 9c07525

Browse files
author
Jonathan Toppins
committed
bonding: fix ICMPv6 header handling when receiving IPv6 messages
Currently, we get icmp6hdr via function icmp6_hdr(), which needs the skb transport header to be set first. But there is no rule to ask driver set transport header before netif_receive_skb() and bond_handle_frame(). So we will not able to get correct icmp6hdr on some drivers. Fix this by using skb_header_pointer to get the IPv6 and ICMPV6 headers. Reported-by: Liang Li <liali@redhat.com> Fixes: 4e24be0 ("bonding: add new parameter ns_targets") Suggested-by: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: Hangbin Liu <liuhangbin@gmail.com> Reviewed-by: Eric Dumazet <edumazet@google.com> Acked-by: Jay Vosburgh <jay.vosburgh@canonical.com> Link: https://lore.kernel.org/r/20221118034353.1736727-1-liuhangbin@gmail.com Signed-off-by: Jakub Kicinski <kuba@kernel.org> (cherry picked from commit 4d633d1) Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2112748 Signed-off-by: Jonathan Toppins <jtoppins@redhat.com>
1 parent 65a9e3c commit 9c07525

File tree

1 file changed

+12
-5
lines changed

1 file changed

+12
-5
lines changed

drivers/net/bonding/bond_main.c

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3206,16 +3206,23 @@ static int bond_na_rcv(const struct sk_buff *skb, struct bonding *bond,
32063206
struct slave *slave)
32073207
{
32083208
struct slave *curr_active_slave, *curr_arp_slave;
3209-
struct icmp6hdr *hdr = icmp6_hdr(skb);
32103209
struct in6_addr *saddr, *daddr;
3210+
struct {
3211+
struct ipv6hdr ip6;
3212+
struct icmp6hdr icmp6;
3213+
} *combined, _combined;
32113214

32123215
if (skb->pkt_type == PACKET_OTHERHOST ||
3213-
skb->pkt_type == PACKET_LOOPBACK ||
3214-
hdr->icmp6_type != NDISC_NEIGHBOUR_ADVERTISEMENT)
3216+
skb->pkt_type == PACKET_LOOPBACK)
3217+
goto out;
3218+
3219+
combined = skb_header_pointer(skb, 0, sizeof(_combined), &_combined);
3220+
if (!combined || combined->ip6.nexthdr != NEXTHDR_ICMP ||
3221+
combined->icmp6.icmp6_type != NDISC_NEIGHBOUR_ADVERTISEMENT)
32153222
goto out;
32163223

3217-
saddr = &ipv6_hdr(skb)->saddr;
3218-
daddr = &ipv6_hdr(skb)->daddr;
3224+
saddr = &combined->ip6.saddr;
3225+
daddr = &combined->ip6.saddr;
32193226

32203227
slave_dbg(bond->dev, slave->dev, "%s: %s/%d av %d sv %d sip %pI6c tip %pI6c\n",
32213228
__func__, slave->dev->name, bond_slave_state(slave),

0 commit comments

Comments
 (0)