lkml.org 
[lkml]   [2019]   [Nov]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 253/306] ipv6: Fix handling of LLA with VRF and sockets bound to VRF
    Date
    From: David Ahern <dsahern@gmail.com>

    [ Upstream commit c2027d1e17582903e368abf5d4838b22a98f2b7b ]

    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: 6f12fa775530 ("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>
    ---
    net/ipv6/tcp_ipv6.c | 3 ++-
    1 file changed, 2 insertions(+), 1 deletion(-)

    diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
    index e7cdfa92c3820..9a117a79af659 100644
    --- a/net/ipv6/tcp_ipv6.c
    +++ b/net/ipv6/tcp_ipv6.c
    @@ -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);

    --
    2.20.1


    \
     
     \ /
      Last update: 2019-11-27 22:06    [W:4.155 / U:0.200 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site