mptcp: add sysctl allow_join_initial_addr_port
authorGeliang Tang <geliangtang@gmail.com>
Tue, 22 Jun 2021 19:25:18 +0000 (12:25 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 22 Jun 2021 21:36:01 +0000 (14:36 -0700)
This patch added a new sysctl, named allow_join_initial_addr_port, to
control whether allow peers to send join requests to the IP address and
port number used by the initial subflow.

Suggested-by: Florian Westphal <fw@strlen.de>
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>
Documentation/networking/mptcp-sysctl.rst
net/mptcp/ctrl.c
net/mptcp/protocol.h

index ee06fd782465a99e7ed0cec970ba331cb0cb49bd..76d939e688b8485a2eacb33d19f44ee89eaba3b0 100644 (file)
@@ -32,3 +32,16 @@ checksum_enabled - BOOLEAN
        per-namespace sysctl.
 
        Default: 0
+
+allow_join_initial_addr_port - BOOLEAN
+       Allow peers to send join requests to the IP address and port number used
+       by the initial subflow if the value is 1. This controls a flag that is
+       sent to the peer at connection time, and whether such join requests are
+       accepted or denied.
+
+       Joins to addresses advertised with ADD_ADDR are not affected by this
+       value.
+
+       This is a per-namespace sysctl.
+
+       Default: 1
index 6c2639bb9c19f0bc7374cdd3da41872b2f2c19dc..7d738bd06f2c9d926f0d87ad45be29ca82b23232 100644 (file)
@@ -24,6 +24,7 @@ struct mptcp_pernet {
        u8 mptcp_enabled;
        unsigned int add_addr_timeout;
        u8 checksum_enabled;
+       u8 allow_join_initial_addr_port;
 };
 
 static struct mptcp_pernet *mptcp_get_pernet(struct net *net)
@@ -46,11 +47,17 @@ int mptcp_is_checksum_enabled(struct net *net)
        return mptcp_get_pernet(net)->checksum_enabled;
 }
 
+int mptcp_allow_join_id0(struct net *net)
+{
+       return mptcp_get_pernet(net)->allow_join_initial_addr_port;
+}
+
 static void mptcp_pernet_set_defaults(struct mptcp_pernet *pernet)
 {
        pernet->mptcp_enabled = 1;
        pernet->add_addr_timeout = TCP_RTO_MAX;
        pernet->checksum_enabled = 0;
+       pernet->allow_join_initial_addr_port = 1;
 }
 
 #ifdef CONFIG_SYSCTL
@@ -80,6 +87,14 @@ static struct ctl_table mptcp_sysctl_table[] = {
                .extra1       = SYSCTL_ZERO,
                .extra2       = SYSCTL_ONE
        },
+       {
+               .procname = "allow_join_initial_addr_port",
+               .maxlen = sizeof(u8),
+               .mode = 0644,
+               .proc_handler = proc_dou8vec_minmax,
+               .extra1       = SYSCTL_ZERO,
+               .extra2       = SYSCTL_ONE
+       },
        {}
 };
 
@@ -98,6 +113,7 @@ static int mptcp_pernet_new_table(struct net *net, struct mptcp_pernet *pernet)
        table[0].data = &pernet->mptcp_enabled;
        table[1].data = &pernet->add_addr_timeout;
        table[2].data = &pernet->checksum_enabled;
+       table[3].data = &pernet->allow_join_initial_addr_port;
 
        hdr = register_net_sysctl(net, MPTCP_SYSCTL_PATH, table);
        if (!hdr)
index 160c2ab09f19439c5b6c2b460359fbb4a33d3971..9aab5fb547164638d481a4c812c48438c6293cf0 100644 (file)
@@ -540,6 +540,7 @@ static inline void mptcp_subflow_delegated_done(struct mptcp_subflow_context *su
 int mptcp_is_enabled(struct net *net);
 unsigned int mptcp_get_add_addr_timeout(struct net *net);
 int mptcp_is_checksum_enabled(struct net *net);
+int mptcp_allow_join_id0(struct net *net);
 void mptcp_subflow_fully_established(struct mptcp_subflow_context *subflow,
                                     struct mptcp_options_received *mp_opt);
 bool mptcp_subflow_data_available(struct sock *sk);