mptcp: add TCP_FASTOPEN_CONNECT socket option
authorBenjamin Hesmans <benjamin.hesmans@tessares.net>
Mon, 26 Sep 2022 23:27:36 +0000 (16:27 -0700)
committerJakub Kicinski <kuba@kernel.org>
Thu, 29 Sep 2022 01:52:03 +0000 (18:52 -0700)
Set the option for the first subflow only. For the other subflows TFO
can't be used because a mapping would be needed to cover the data in the
SYN.

Acked-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Matthieu Baerts <matthieu.baerts@tessares.net>
Signed-off-by: Benjamin Hesmans <benjamin.hesmans@tessares.net>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/mptcp/sockopt.c

index 423d3826ca1ee72e7250e6de8c616188dfa60579..c7cb68c725b2922269ff8963250db9e6a47bd340 100644 (file)
@@ -559,6 +559,7 @@ static bool mptcp_supported_sockopt(int level, int optname)
                case TCP_NOTSENT_LOWAT:
                case TCP_TX_DELAY:
                case TCP_INQ:
+               case TCP_FASTOPEN_CONNECT:
                        return true;
                }
 
@@ -567,7 +568,7 @@ static bool mptcp_supported_sockopt(int level, int optname)
                /* TCP_REPAIR, TCP_REPAIR_QUEUE, TCP_QUEUE_SEQ, TCP_REPAIR_OPTIONS,
                 * TCP_REPAIR_WINDOW are not supported, better avoid this mess
                 */
-               /* TCP_FASTOPEN_KEY, TCP_FASTOPEN TCP_FASTOPEN_CONNECT, TCP_FASTOPEN_NO_COOKIE,
+               /* TCP_FASTOPEN_KEY, TCP_FASTOPEN, TCP_FASTOPEN_NO_COOKIE,
                 * are not supported fastopen is currently unsupported
                 */
        }
@@ -768,6 +769,19 @@ static int mptcp_setsockopt_sol_tcp_defer(struct mptcp_sock *msk, sockptr_t optv
        return tcp_setsockopt(listener->sk, SOL_TCP, TCP_DEFER_ACCEPT, optval, optlen);
 }
 
+static int mptcp_setsockopt_sol_tcp_fastopen_connect(struct mptcp_sock *msk, sockptr_t optval,
+                                                    unsigned int optlen)
+{
+       struct socket *sock;
+
+       /* Limit to first subflow */
+       sock = __mptcp_nmpc_socket(msk);
+       if (!sock)
+               return -EINVAL;
+
+       return tcp_setsockopt(sock->sk, SOL_TCP, TCP_FASTOPEN_CONNECT, optval, optlen);
+}
+
 static int mptcp_setsockopt_sol_tcp(struct mptcp_sock *msk, int optname,
                                    sockptr_t optval, unsigned int optlen)
 {
@@ -796,6 +810,8 @@ static int mptcp_setsockopt_sol_tcp(struct mptcp_sock *msk, int optname,
                return mptcp_setsockopt_sol_tcp_nodelay(msk, optval, optlen);
        case TCP_DEFER_ACCEPT:
                return mptcp_setsockopt_sol_tcp_defer(msk, optval, optlen);
+       case TCP_FASTOPEN_CONNECT:
+               return mptcp_setsockopt_sol_tcp_fastopen_connect(msk, optval, optlen);
        }
 
        return -EOPNOTSUPP;
@@ -1157,6 +1173,7 @@ static int mptcp_getsockopt_sol_tcp(struct mptcp_sock *msk, int optname,
        case TCP_INFO:
        case TCP_CC_INFO:
        case TCP_DEFER_ACCEPT:
+       case TCP_FASTOPEN_CONNECT:
                return mptcp_getsockopt_first_sf_only(msk, SOL_TCP, optname,
                                                      optval, optlen);
        case TCP_INQ: