Commit d2f77960 authored by Geliang Tang's avatar Geliang Tang Committed by David S. Miller

mptcp: add sysctl allow_join_initial_addr_port

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: default avatarFlorian Westphal <fw@strlen.de>
Acked-by: default avatarPaolo Abeni <pabeni@redhat.com>
Signed-off-by: default avatarGeliang Tang <geliangtang@gmail.com>
Signed-off-by: default avatarMat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a432c771
...@@ -32,3 +32,16 @@ checksum_enabled - BOOLEAN ...@@ -32,3 +32,16 @@ checksum_enabled - BOOLEAN
per-namespace sysctl. per-namespace sysctl.
Default: 0 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
...@@ -24,6 +24,7 @@ struct mptcp_pernet { ...@@ -24,6 +24,7 @@ struct mptcp_pernet {
u8 mptcp_enabled; u8 mptcp_enabled;
unsigned int add_addr_timeout; unsigned int add_addr_timeout;
u8 checksum_enabled; u8 checksum_enabled;
u8 allow_join_initial_addr_port;
}; };
static struct mptcp_pernet *mptcp_get_pernet(struct net *net) static struct mptcp_pernet *mptcp_get_pernet(struct net *net)
...@@ -46,11 +47,17 @@ int mptcp_is_checksum_enabled(struct net *net) ...@@ -46,11 +47,17 @@ int mptcp_is_checksum_enabled(struct net *net)
return mptcp_get_pernet(net)->checksum_enabled; 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) static void mptcp_pernet_set_defaults(struct mptcp_pernet *pernet)
{ {
pernet->mptcp_enabled = 1; pernet->mptcp_enabled = 1;
pernet->add_addr_timeout = TCP_RTO_MAX; pernet->add_addr_timeout = TCP_RTO_MAX;
pernet->checksum_enabled = 0; pernet->checksum_enabled = 0;
pernet->allow_join_initial_addr_port = 1;
} }
#ifdef CONFIG_SYSCTL #ifdef CONFIG_SYSCTL
...@@ -80,6 +87,14 @@ static struct ctl_table mptcp_sysctl_table[] = { ...@@ -80,6 +87,14 @@ static struct ctl_table mptcp_sysctl_table[] = {
.extra1 = SYSCTL_ZERO, .extra1 = SYSCTL_ZERO,
.extra2 = SYSCTL_ONE .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) ...@@ -98,6 +113,7 @@ static int mptcp_pernet_new_table(struct net *net, struct mptcp_pernet *pernet)
table[0].data = &pernet->mptcp_enabled; table[0].data = &pernet->mptcp_enabled;
table[1].data = &pernet->add_addr_timeout; table[1].data = &pernet->add_addr_timeout;
table[2].data = &pernet->checksum_enabled; table[2].data = &pernet->checksum_enabled;
table[3].data = &pernet->allow_join_initial_addr_port;
hdr = register_net_sysctl(net, MPTCP_SYSCTL_PATH, table); hdr = register_net_sysctl(net, MPTCP_SYSCTL_PATH, table);
if (!hdr) if (!hdr)
......
...@@ -540,6 +540,7 @@ static inline void mptcp_subflow_delegated_done(struct mptcp_subflow_context *su ...@@ -540,6 +540,7 @@ static inline void mptcp_subflow_delegated_done(struct mptcp_subflow_context *su
int mptcp_is_enabled(struct net *net); int mptcp_is_enabled(struct net *net);
unsigned int mptcp_get_add_addr_timeout(struct net *net); unsigned int mptcp_get_add_addr_timeout(struct net *net);
int mptcp_is_checksum_enabled(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, void mptcp_subflow_fully_established(struct mptcp_subflow_context *subflow,
struct mptcp_options_received *mp_opt); struct mptcp_options_received *mp_opt);
bool mptcp_subflow_data_available(struct sock *sk); bool mptcp_subflow_data_available(struct sock *sk);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment