mptcp: add allow_join_id0 in mptcp_out_options
authorGeliang Tang <geliangtang@gmail.com>
Tue, 22 Jun 2021 19:25:19 +0000 (12:25 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 22 Jun 2021 21:36:01 +0000 (14:36 -0700)
This patch defined a new flag MPTCP_CAP_DENY_JOIN_ID0 for the third bit,
labeled "C" of the MP_CAPABLE option.

Add a new flag allow_join_id0 in struct mptcp_out_options. If this flag is
set, send out the MP_CAPABLE option with the flag MPTCP_CAP_DENY_JOIN_ID0.

Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Geliang Tang <geliangtang@gmail.com>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/mptcp.h
net/mptcp/options.c
net/mptcp/protocol.h
net/mptcp/subflow.c

index d61bbbf11979217298ef47190f3202bce99d511d..cb580b06152f88a5bd3b98f61e7ec8994126aedb 100644 (file)
@@ -67,7 +67,8 @@ struct mptcp_out_options {
        u8 backup;
        u8 reset_reason:4,
           reset_transient:1,
-          csum_reqd:1;
+          csum_reqd:1,
+          allow_join_id0:1;
        u32 nonce;
        u64 thmac;
        u32 token;
index 25189595ed1d7fdb86d5821a66cf5f608b6de91e..7a4b6d0bf3f60b7f2dd1cce1616daa1338b9089b 100644 (file)
@@ -402,6 +402,7 @@ bool mptcp_syn_options(struct sock *sk, const struct sk_buff *skb,
        if (subflow->request_mptcp) {
                opts->suboptions = OPTION_MPTCP_MPC_SYN;
                opts->csum_reqd = mptcp_is_checksum_enabled(sock_net(sk));
+               opts->allow_join_id0 = mptcp_allow_join_id0(sock_net(sk));
                *size = TCPOLEN_MPTCP_MPC_SYN;
                return true;
        } else if (subflow->request_join) {
@@ -490,6 +491,7 @@ static bool mptcp_established_options_mp(struct sock *sk, struct sk_buff *skb,
                opts->sndr_key = subflow->local_key;
                opts->rcvr_key = subflow->remote_key;
                opts->csum_reqd = READ_ONCE(msk->csum_enabled);
+               opts->allow_join_id0 = mptcp_allow_join_id0(sock_net(sk));
 
                /* Section 3.1.
                 * The MP_CAPABLE option is carried on the SYN, SYN/ACK, and ACK
@@ -827,6 +829,7 @@ bool mptcp_synack_options(const struct request_sock *req, unsigned int *size,
                opts->suboptions = OPTION_MPTCP_MPC_SYNACK;
                opts->sndr_key = subflow_req->local_key;
                opts->csum_reqd = subflow_req->csum_reqd;
+               opts->allow_join_id0 = subflow_req->allow_join_id0;
                *size = TCPOLEN_MPTCP_MPC_SYNACK;
                pr_debug("subflow_req=%p, local_key=%llu",
                         subflow_req, subflow_req->local_key);
@@ -1201,6 +1204,9 @@ void mptcp_write_options(__be32 *ptr, const struct tcp_sock *tp,
                if (opts->csum_reqd)
                        flag |= MPTCP_CAP_CHECKSUM_REQD;
 
+               if (!opts->allow_join_id0)
+                       flag |= MPTCP_CAP_DENY_JOIN_ID0;
+
                *ptr++ = mptcp_option(MPTCPOPT_MP_CAPABLE, len,
                                      MPTCP_SUPPORTED_VERSION,
                                      flag);
index 9aab5fb547164638d481a4c812c48438c6293cf0..f2326f6074b940a874ca367db93cfa1005438d68 100644 (file)
@@ -79,8 +79,9 @@
 #define MPTCP_VERSION_MASK     (0x0F)
 #define MPTCP_CAP_CHECKSUM_REQD        BIT(7)
 #define MPTCP_CAP_EXTENSIBILITY        BIT(6)
+#define MPTCP_CAP_DENY_JOIN_ID0        BIT(5)
 #define MPTCP_CAP_HMAC_SHA256  BIT(0)
-#define MPTCP_CAP_FLAG_MASK    (0x3F)
+#define MPTCP_CAP_FLAG_MASK    (0x1F)
 
 /* MPTCP DSS flags */
 #define MPTCP_DSS_DATA_FIN     BIT(4)
@@ -350,7 +351,8 @@ struct mptcp_subflow_request_sock {
        u16     mp_capable : 1,
                mp_join : 1,
                backup : 1,
-               csum_reqd : 1;
+               csum_reqd : 1,
+               allow_join_id0 : 1;
        u8      local_id;
        u8      remote_id;
        u64     local_key;
index 585951e7e52fd2e5830385b83ab076b185f152b4..e9e8ce862218fbf738788e834f10528a56e96218 100644 (file)
@@ -109,6 +109,7 @@ static void subflow_init_req(struct request_sock *req, const struct sock *sk_lis
        subflow_req->mp_capable = 0;
        subflow_req->mp_join = 0;
        subflow_req->csum_reqd = mptcp_is_checksum_enabled(sock_net(sk_listener));
+       subflow_req->allow_join_id0 = mptcp_allow_join_id0(sock_net(sk_listener));
        subflow_req->msk = NULL;
        mptcp_token_init_request(req);
 }