• Matthieu Baerts (NGI0)'s avatar
    tcp: socket option to check for MPTCP fallback to TCP · c084ebd7
    Matthieu Baerts (NGI0) authored
    A way for an application to know if an MPTCP connection fell back to TCP
    is to use getsockopt(MPTCP_INFO) and look for errors. The issue with
    this technique is that the same errors -- EOPNOTSUPP (IPv4) and
    ENOPROTOOPT (IPv6) -- are returned if there was a fallback, *or* if the
    kernel doesn't support this socket option. The userspace then has to
    look at the kernel version to understand what the errors mean.
    
    It is not clean, and it doesn't take into account older kernels where
    the socket option has been backported. A cleaner way would be to expose
    this info to the TCP socket level. In case of MPTCP socket where no
    fallback happened, the socket options for the TCP level will be handled
    in MPTCP code, in mptcp_getsockopt_sol_tcp(). If not, that will be in
    TCP code, in do_tcp_getsockopt(). So MPTCP simply has to set the value
    1, while TCP has to set 0.
    
    If the socket option is not supported, one of these two errors will be
    reported:
    - EOPNOTSUPP (95 - Operation not supported) for MPTCP sockets
    - ENOPROTOOPT (92 - Protocol not available) for TCP sockets, e.g. on the
      socket received after an 'accept()', when the client didn't request to
      use MPTCP: this socket will be a TCP one, even if the listen socket
      was an MPTCP one.
    
    With this new option, the kernel can return a clear answer to both "Is
    this kernel new enough to tell me the fallback status?" and "If it is
    new enough, is it currently a TCP or MPTCP socket?" questions, while not
    breaking the previous method.
    Acked-by: default avatarMat Martineau <martineau@kernel.org>
    Signed-off-by: default avatarMatthieu Baerts (NGI0) <matttbe@kernel.org>
    Link: https://lore.kernel.org/r/20240509-upstream-net-next-20240509-mptcp-tcp_is_mptcp-v1-1-f846df999202@kernel.orgSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    c084ebd7
tcp.c 132 KB