mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-01 22:54:01 +00:00
ipv6: Fix handling of LLA with VRF and sockets bound to VRF
[ Upstream commitc2027d1e17
] A recent commit allows sockets bound to a VRF to receive ipv6 link local packets. However, it only works for UDP and worse TCP connection attempts to the LLA with the only listener bound to the VRF just hang where as before the client gets a reset and connection refused. Fix by adjusting ir_iif for LL addresses and packets received through a device enslaved to a VRF. Fixes:6f12fa7755
("vrf: mark skb for multicast or link-local as enslaved to VRF") Reported-by: Donald Sharp <sharpd@cumulusnetworks.com> Cc: Mike Manning <mmanning@vyatta.att-mail.com> Signed-off-by: David Ahern <dsahern@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
091ed093c9
commit
2b3541ffdd
1 changed files with 2 additions and 1 deletions
|
@ -734,6 +734,7 @@ static void tcp_v6_init_req(struct request_sock *req,
|
|||
const struct sock *sk_listener,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
bool l3_slave = ipv6_l3mdev_skb(TCP_SKB_CB(skb)->header.h6.flags);
|
||||
struct inet_request_sock *ireq = inet_rsk(req);
|
||||
const struct ipv6_pinfo *np = inet6_sk(sk_listener);
|
||||
|
||||
|
@ -741,7 +742,7 @@ static void tcp_v6_init_req(struct request_sock *req,
|
|||
ireq->ir_v6_loc_addr = ipv6_hdr(skb)->daddr;
|
||||
|
||||
/* So that link locals have meaning */
|
||||
if (!sk_listener->sk_bound_dev_if &&
|
||||
if ((!sk_listener->sk_bound_dev_if || l3_slave) &&
|
||||
ipv6_addr_type(&ireq->ir_v6_rmt_addr) & IPV6_ADDR_LINKLOCAL)
|
||||
ireq->ir_iif = tcp_v6_iif(skb);
|
||||
|
||||
|
|
Loading…
Reference in a new issue