1. 22 Sep, 2021 5 commits
  2. 21 Sep, 2021 9 commits
  3. 20 Sep, 2021 15 commits
  4. 19 Sep, 2021 8 commits
  5. 18 Sep, 2021 3 commits
    • David S. Miller's avatar
      Merge branch 'mptcp-next' · 983e59a2
      David S. Miller authored
      Mat Martineau says:
      
      ====================
      mptcp: Add SOL_MPTCP getsockopt support
      
      Here's the first new MPTCP feature for the v5.16 cycle, and I'll defer
      to Florian's helpful description of the series implementing some new
      MPTCP socket options:
      
      ========
      
      This adds the MPTCP_INFO, MPTCP_TCPINFO and MPTCP_SUBFLOW_ADDRS
      mptcp getsockopt optnames.
      
      MPTCP_INFO exposes the mptcp_info struct as an alternative to the
      existing netlink diag interface.
      
      MPTCP_TCPINFO exposes the tcp_info struct.
      Unlike SOL_TCP/TCP_INFO, this returns one struct for each active
      subflow.
      
      MPTCP_SUBFLOW_ADDRS allows userspace to discover the ip addresses/ports
      used by the local and remote endpoints, one for each active tcp subflow.
      
      MPTCP_TCPINFO and MPTCP_SUBFLOW_ADDRS share the same meta-header that
      needs to be pre-filled by userspace with the size of the data structures
      it expects.  This is done to allow extension of the involved structs
      later on, without breaking backwards compatibility.
      
      The meta-structure can also be used to discover the required space
      to obtain all information, as kernel will fill in the number of
      active subflows even if there is not enough room for the requested info
      itself.
      
      More information is available in the individual patches.
      Last patch adds test cases for the three optnames.
      
      ========
      ====================
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      983e59a2
    • Florian Westphal's avatar
      selftests: mptcp: add mptcp getsockopt test cases · ce997912
      Florian Westphal authored
      Add a test program that retrieves the three info types:
      1. mptcp meta information
      2. tcp info for subflow
      3. subflow endpoint addresses
      
      For all three rudimentary checks are added.
      
      1. Meta information checks that the logical mptcp
         sequence numbers advance as expected, based on the bytes read
         (init seq + bytes_received/sent) and the connection state
         (after close, we should exect 1 extra byte due to FIN).
      
      2. TCP info checks the number of bytes sent/received vs.
         sums of read/write syscall return values.
      
      3. Subflow endpoint addresses are checked vs. getsockname/getpeername
         result.
      
      Tests for forward compatibility (0-initialisation of output-only
      fields in mptcp_subflow_data structure) are added as well.
      Co-developed-by: default avatarMatthieu Baerts <matthieu.baerts@tessares.net>
      Signed-off-by: default avatarMatthieu Baerts <matthieu.baerts@tessares.net>
      Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
      Signed-off-by: default avatarMat Martineau <mathew.j.martineau@linux.intel.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      ce997912
    • Florian Westphal's avatar
      mptcp: add MPTCP_SUBFLOW_ADDRS getsockopt support · c11c5906
      Florian Westphal authored
      This retrieves the address pairs of all subflows currently
      active for a given mptcp connection.
      
      It re-uses the same meta-header as for MPTCP_TCPINFO.
      
      A new structure is provided to hold the subflow
      address data:
      
      struct mptcp_subflow_addrs {
      	union {
      		__kernel_sa_family_t sa_family;
      		struct sockaddr sa_local;
      		struct sockaddr_in sin_local;
      		struct sockaddr_in6 sin6_local;
      		struct sockaddr_storage ss_local;
      	};
      	union {
      		struct sockaddr sa_remote;
      		struct sockaddr_in sin_remote;
      		struct sockaddr_in6 sin6_remote;
      		struct sockaddr_storage ss_remote;
      	};
      };
      
      Usage of the new getsockopt is very similar to
      MPTCP_TCPINFO one.
      
      Userspace allocates a
      'struct mptcp_subflow_data', followed by one or
      more 'struct mptcp_subflow_addrs', then inits the
      mptcp_subflow_data structure as follows:
      
      struct mptcp_subflow_addrs *sf_addr;
      struct mptcp_subflow_data *addr;
      socklen_t olen = sizeof(*addr) + (8 * sizeof(*sf_addr));
      
      addr = malloc(olen);
      addr->size_subflow_data = sizeof(*addr);
      addr->num_subflows = 0;
      addr->size_kernel = 0;
      addr->size_user = sizeof(struct mptcp_subflow_addrs);
      
      sf_addr = (struct mptcp_subflow_addrs *)(addr + 1);
      
      and then retrieves the endpoint addresses via:
      ret = getsockopt(fd, SOL_MPTCP, MPTCP_SUBFLOW_ADDRS,
      		 addr, &olen);
      
      If the call succeeds, kernel will have added up to 8
      endpoint addresses after the 'mptcp_subflow_data' header.
      
      Userspace needs to re-check 'olen' value to detect how
      many bytes have been filled in by the kernel.
      
      Userspace can check addr->num_subflows to discover when
      there were more subflows that available data space.
      Co-developed-by: default avatarMatthieu Baerts <matthieu.baerts@tessares.net>
      Signed-off-by: default avatarMatthieu Baerts <matthieu.baerts@tessares.net>
      Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
      Signed-off-by: default avatarMat Martineau <mathew.j.martineau@linux.intel.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      c11c5906