mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
ip6_gre: let collect_md ip6gretap send from the unspecified address
ip6gre_xmit_ipv6() drops an IPv6 packet whose source address equals the tunnel remote, to avoid a trivial tunneling loop. On a collect_md ip6gretap device t->parms.raddr is not the exit point: the outer destination comes from the per-packet tunnel metadata. Such devices are normally created without a remote, so raddr is ::, and the check never matches a real tunnel endpoint. It matches every frame sent from the unspecified address instead. On an L2 tunnel those frames are regular link traffic. Duplicate Address Detection sends its Neighbor Solicitations from :: (RFC 4862, section 5.4.2), and MLD reports are sent from :: while an interface has no link-local address yet (RFC 3590, section 4). Frames bridged into a collect_md ip6gretap device, e.g. with tc tunnel_key and mirred, are dropped even though they carry valid metadata, so DAD cannot detect a duplicate address on the other side of the tunnel. Skip the check for collect_md devices of type ARPHRD_ETHER. It stays for L3 ip6gre, where sending a packet with an unspecified source means forwarding it (RFC 4291, section 2.5.2), and for ip6gretap without collect_md. ip6erspan does not run this check in collect_md mode either. Signed-off-by: Anton Danilov <littlesmilingcloud@gmail.com> Reviewed-by: Ido Schimmel <idosch@nvidia.com> Link: https://patch.msgid.link/20261005191227.894665-1-littlesmilingcloud@gmail.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
3fa7e831b8
commit
f3f5d7ab19
|
|
@ -828,7 +828,12 @@ static inline int ip6gre_xmit_ipv6(struct sk_buff *skb, struct net_device *dev)
|
|||
__u32 mtu;
|
||||
int err;
|
||||
|
||||
if (ipv6_addr_equal(&t->parms.raddr, &ipv6h->saddr))
|
||||
/* The outer destination of a collect_md tunnel comes from the
|
||||
* metadata, so raddr is not its exit point, and hosts on the link
|
||||
* bridged into an L2 one do send from :: (DAD, early MLD).
|
||||
*/
|
||||
if (!(t->parms.collect_md && dev->type == ARPHRD_ETHER) &&
|
||||
ipv6_addr_equal(&t->parms.raddr, &ipv6h->saddr))
|
||||
return -1;
|
||||
|
||||
if (!t->parms.collect_md &&
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user