• Tom Parkin's avatar
    l2tp: fix ICMP error handling for UDP-encap sockets · 6e828dc6
    Tom Parkin authored
    Since commit a36e185e
    ("udp: Handle ICMP errors for tunnels with same destination port on both endpoints")
    UDP's handling of ICMP errors has allowed for UDP-encap tunnels to
    determine socket associations in scenarios where the UDP hash lookup
    could not.
    
    Subsequently, commit d26796ae
    ("udp: check udp sock encap_type in __udp_lib_err")
    subtly tweaked the approach such that UDP ICMP error handling would be
    skipped for any UDP socket which has encapsulation enabled.
    
    In the case of L2TP tunnel sockets using UDP-encap, this latter
    modification effectively broke ICMP error reporting for the L2TP
    control plane.
    
    To a degree this isn't catastrophic inasmuch as the L2TP control
    protocol defines a reliable transport on top of the underlying packet
    switching network which will eventually detect errors and time out.
    
    However, paying attention to the ICMP error reporting allows for more
    timely detection of errors in L2TP userspace, and aids in debugging
    connectivity issues.
    
    Reinstate ICMP error handling for UDP encap L2TP tunnels:
    
     * implement struct udp_tunnel_sock_cfg .encap_err_rcv in order to allow
       the L2TP code to handle ICMP errors;
    
     * only implement error-handling for tunnels which have a managed
       socket: unmanaged tunnels using a kernel socket have no userspace to
       report errors back to;
    
     * flag the error on the socket, which allows for userspace to get an
       error such as -ECONNREFUSED back from sendmsg/recvmsg;
    
     * pass the error into ip[v6]_icmp_error() which allows for userspace to
       get extended error information via. MSG_ERRQUEUE.
    
    Fixes: d26796ae ("udp: check udp sock encap_type in __udp_lib_err")
    Signed-off-by: default avatarTom Parkin <tparkin@katalix.com>
    Link: https://lore.kernel.org/r/20240513172248.623261-1-tparkin@katalix.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    6e828dc6
l2tp_core.c 46.1 KB