• Alexey Kodanev's avatar
    ipv6: udp: set dst cache for a connected sk if current not valid · 4f858c56
    Alexey Kodanev authored
    A new RTF_CACHE route can be created between ip6_sk_dst_lookup_flow()
    and ip6_dst_store() calls in udpv6_sendmsg(), when datagram sending
    results to ICMPV6_PKT_TOOBIG error:
    
        udp_v6_send_skb(), for example with vti6 tunnel:
            vti6_xmit(), get ICMPV6_PKT_TOOBIG error
                skb_dst_update_pmtu(), can create a RTF_CACHE clone
                icmpv6_send()
        ...
        udpv6_err()
            ip6_sk_update_pmtu()
               ip6_update_pmtu(), can create a RTF_CACHE clone
               ...
               ip6_datagram_dst_update()
                    ip6_dst_store()
    
    And after commit 33c162a9 ("ipv6: datagram: Update dst cache of
    a connected datagram sk during pmtu update"), the UDPv6 error handler
    can update socket's dst cache, but it can happen before the update in
    the end of udpv6_sendmsg(), preventing getting the new dst cache on
    the next udpv6_sendmsg() calls.
    
    In order to fix it, save dst in a connected socket only if the current
    socket's dst cache is invalid.
    
    The previous patch prepared ip6_sk_dst_lookup_flow() to do that with
    the new argument, and this patch enables it in udpv6_sendmsg().
    
    Fixes: 33c162a9 ("ipv6: datagram: Update dst cache of a connected datagram sk during pmtu update")
    Fixes: 45e4fd26
    
     ("ipv6: Only create RTF_CACHE routes after encountering pmtu exception")
    Signed-off-by: default avatarAlexey Kodanev <alexey.kodanev@oracle.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    4f858c56