* [PATCH net 0/2] mptcp: Bug fixes
@ 2021-09-24 0:04 Mat Martineau
2021-09-24 0:04 ` [PATCH net 1/2] mptcp: don't return sockets in foreign netns Mat Martineau
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Mat Martineau @ 2021-09-24 0:04 UTC (permalink / raw)
To: netdev
Cc: Mat Martineau, davem, kuba, matthieu.baerts, mptcp, fw, dcaratti,
pabeni, geliangtang
This patch set includes two separate fixes for the net tree:
Patch 1 makes sure that MPTCP token searches are always limited to the
appropriate net namespace.
Patch 2 allows userspace to always change the backup settings for
configured endpoints even if those endpoints are not currently in use.
Davide Caratti (1):
mptcp: allow changing the 'backup' bit when no sockets are open
Florian Westphal (1):
mptcp: don't return sockets in foreign netns
net/mptcp/mptcp_diag.c | 2 +-
net/mptcp/pm_netlink.c | 4 +---
net/mptcp/protocol.h | 2 +-
net/mptcp/subflow.c | 2 +-
net/mptcp/syncookies.c | 13 +------------
net/mptcp/token.c | 11 ++++++++---
net/mptcp/token_test.c | 14 ++++++++------
7 files changed, 21 insertions(+), 27 deletions(-)
base-commit: 9bc62afe03afdf33904f5e784e1ad68c50ff00bb
--
2.33.0
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH net 1/2] mptcp: don't return sockets in foreign netns
2021-09-24 0:04 [PATCH net 0/2] mptcp: Bug fixes Mat Martineau
@ 2021-09-24 0:04 ` Mat Martineau
2021-09-24 0:04 ` [PATCH net 2/2] mptcp: allow changing the 'backup' bit when no sockets are open Mat Martineau
2021-09-24 10:00 ` [PATCH net 0/2] mptcp: Bug fixes patchwork-bot+netdevbpf
2 siblings, 0 replies; 6+ messages in thread
From: Mat Martineau @ 2021-09-24 0:04 UTC (permalink / raw)
To: netdev
Cc: Florian Westphal, davem, kuba, matthieu.baerts, mptcp, dcaratti,
pabeni, geliangtang, Mat Martineau
From: Florian Westphal <fw@strlen.de>
mptcp_token_get_sock() may return a mptcp socket that is in
a different net namespace than the socket that received the token value.
The mptcp syncookie code path had an explicit check for this,
this moves the test into mptcp_token_get_sock() function.
Eventually token.c should be converted to pernet storage, but
such change is not suitable for net tree.
Fixes: 2c5ebd001d4f0 ("mptcp: refactor token container")
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
---
net/mptcp/mptcp_diag.c | 2 +-
net/mptcp/protocol.h | 2 +-
net/mptcp/subflow.c | 2 +-
net/mptcp/syncookies.c | 13 +------------
net/mptcp/token.c | 11 ++++++++---
net/mptcp/token_test.c | 14 ++++++++------
6 files changed, 20 insertions(+), 24 deletions(-)
diff --git a/net/mptcp/mptcp_diag.c b/net/mptcp/mptcp_diag.c
index f48eb6315bbb..292374fb0779 100644
--- a/net/mptcp/mptcp_diag.c
+++ b/net/mptcp/mptcp_diag.c
@@ -36,7 +36,7 @@ static int mptcp_diag_dump_one(struct netlink_callback *cb,
struct sock *sk;
net = sock_net(in_skb->sk);
- msk = mptcp_token_get_sock(req->id.idiag_cookie[0]);
+ msk = mptcp_token_get_sock(net, req->id.idiag_cookie[0]);
if (!msk)
goto out_nosk;
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index d3e6fd1615f1..dc984676c5eb 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -709,7 +709,7 @@ int mptcp_token_new_connect(struct sock *sk);
void mptcp_token_accept(struct mptcp_subflow_request_sock *r,
struct mptcp_sock *msk);
bool mptcp_token_exists(u32 token);
-struct mptcp_sock *mptcp_token_get_sock(u32 token);
+struct mptcp_sock *mptcp_token_get_sock(struct net *net, u32 token);
struct mptcp_sock *mptcp_token_iter_next(const struct net *net, long *s_slot,
long *s_num);
void mptcp_token_destroy(struct mptcp_sock *msk);
diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c
index 1de7ce883c37..6172f380dfb7 100644
--- a/net/mptcp/subflow.c
+++ b/net/mptcp/subflow.c
@@ -86,7 +86,7 @@ static struct mptcp_sock *subflow_token_join_request(struct request_sock *req)
struct mptcp_sock *msk;
int local_id;
- msk = mptcp_token_get_sock(subflow_req->token);
+ msk = mptcp_token_get_sock(sock_net(req_to_sk(req)), subflow_req->token);
if (!msk) {
SUBFLOW_REQ_INC_STATS(req, MPTCP_MIB_JOINNOTOKEN);
return NULL;
diff --git a/net/mptcp/syncookies.c b/net/mptcp/syncookies.c
index 37127781aee9..7f22526346a7 100644
--- a/net/mptcp/syncookies.c
+++ b/net/mptcp/syncookies.c
@@ -108,18 +108,12 @@ bool mptcp_token_join_cookie_init_state(struct mptcp_subflow_request_sock *subfl
e->valid = 0;
- msk = mptcp_token_get_sock(e->token);
+ msk = mptcp_token_get_sock(net, e->token);
if (!msk) {
spin_unlock_bh(&join_entry_locks[i]);
return false;
}
- /* If this fails, the token got re-used in the mean time by another
- * mptcp socket in a different netns, i.e. entry is outdated.
- */
- if (!net_eq(sock_net((struct sock *)msk), net))
- goto err_put;
-
subflow_req->remote_nonce = e->remote_nonce;
subflow_req->local_nonce = e->local_nonce;
subflow_req->backup = e->backup;
@@ -128,11 +122,6 @@ bool mptcp_token_join_cookie_init_state(struct mptcp_subflow_request_sock *subfl
subflow_req->msk = msk;
spin_unlock_bh(&join_entry_locks[i]);
return true;
-
-err_put:
- spin_unlock_bh(&join_entry_locks[i]);
- sock_put((struct sock *)msk);
- return false;
}
void __init mptcp_join_cookie_init(void)
diff --git a/net/mptcp/token.c b/net/mptcp/token.c
index a98e554b034f..e581b341c5be 100644
--- a/net/mptcp/token.c
+++ b/net/mptcp/token.c
@@ -231,6 +231,7 @@ bool mptcp_token_exists(u32 token)
/**
* mptcp_token_get_sock - retrieve mptcp connection sock using its token
+ * @net: restrict to this namespace
* @token: token of the mptcp connection to retrieve
*
* This function returns the mptcp connection structure with the given token.
@@ -238,7 +239,7 @@ bool mptcp_token_exists(u32 token)
*
* returns NULL if no connection with the given token value exists.
*/
-struct mptcp_sock *mptcp_token_get_sock(u32 token)
+struct mptcp_sock *mptcp_token_get_sock(struct net *net, u32 token)
{
struct hlist_nulls_node *pos;
struct token_bucket *bucket;
@@ -251,11 +252,15 @@ struct mptcp_sock *mptcp_token_get_sock(u32 token)
again:
sk_nulls_for_each_rcu(sk, pos, &bucket->msk_chain) {
msk = mptcp_sk(sk);
- if (READ_ONCE(msk->token) != token)
+ if (READ_ONCE(msk->token) != token ||
+ !net_eq(sock_net(sk), net))
continue;
+
if (!refcount_inc_not_zero(&sk->sk_refcnt))
goto not_found;
- if (READ_ONCE(msk->token) != token) {
+
+ if (READ_ONCE(msk->token) != token ||
+ !net_eq(sock_net(sk), net)) {
sock_put(sk);
goto again;
}
diff --git a/net/mptcp/token_test.c b/net/mptcp/token_test.c
index e1bd6f0a0676..5d984bec1cd8 100644
--- a/net/mptcp/token_test.c
+++ b/net/mptcp/token_test.c
@@ -11,6 +11,7 @@ static struct mptcp_subflow_request_sock *build_req_sock(struct kunit *test)
GFP_USER);
KUNIT_EXPECT_NOT_ERR_OR_NULL(test, req);
mptcp_token_init_request((struct request_sock *)req);
+ sock_net_set((struct sock *)req, &init_net);
return req;
}
@@ -22,7 +23,7 @@ static void mptcp_token_test_req_basic(struct kunit *test)
KUNIT_ASSERT_EQ(test, 0,
mptcp_token_new_request((struct request_sock *)req));
KUNIT_EXPECT_NE(test, 0, (int)req->token);
- KUNIT_EXPECT_PTR_EQ(test, null_msk, mptcp_token_get_sock(req->token));
+ KUNIT_EXPECT_PTR_EQ(test, null_msk, mptcp_token_get_sock(&init_net, req->token));
/* cleanup */
mptcp_token_destroy_request((struct request_sock *)req);
@@ -55,6 +56,7 @@ static struct mptcp_sock *build_msk(struct kunit *test)
msk = kunit_kzalloc(test, sizeof(struct mptcp_sock), GFP_USER);
KUNIT_EXPECT_NOT_ERR_OR_NULL(test, msk);
refcount_set(&((struct sock *)msk)->sk_refcnt, 1);
+ sock_net_set((struct sock *)msk, &init_net);
return msk;
}
@@ -74,11 +76,11 @@ static void mptcp_token_test_msk_basic(struct kunit *test)
mptcp_token_new_connect((struct sock *)icsk));
KUNIT_EXPECT_NE(test, 0, (int)ctx->token);
KUNIT_EXPECT_EQ(test, ctx->token, msk->token);
- KUNIT_EXPECT_PTR_EQ(test, msk, mptcp_token_get_sock(ctx->token));
+ KUNIT_EXPECT_PTR_EQ(test, msk, mptcp_token_get_sock(&init_net, ctx->token));
KUNIT_EXPECT_EQ(test, 2, (int)refcount_read(&sk->sk_refcnt));
mptcp_token_destroy(msk);
- KUNIT_EXPECT_PTR_EQ(test, null_msk, mptcp_token_get_sock(ctx->token));
+ KUNIT_EXPECT_PTR_EQ(test, null_msk, mptcp_token_get_sock(&init_net, ctx->token));
}
static void mptcp_token_test_accept(struct kunit *test)
@@ -90,11 +92,11 @@ static void mptcp_token_test_accept(struct kunit *test)
mptcp_token_new_request((struct request_sock *)req));
msk->token = req->token;
mptcp_token_accept(req, msk);
- KUNIT_EXPECT_PTR_EQ(test, msk, mptcp_token_get_sock(msk->token));
+ KUNIT_EXPECT_PTR_EQ(test, msk, mptcp_token_get_sock(&init_net, msk->token));
/* this is now a no-op */
mptcp_token_destroy_request((struct request_sock *)req);
- KUNIT_EXPECT_PTR_EQ(test, msk, mptcp_token_get_sock(msk->token));
+ KUNIT_EXPECT_PTR_EQ(test, msk, mptcp_token_get_sock(&init_net, msk->token));
/* cleanup */
mptcp_token_destroy(msk);
@@ -116,7 +118,7 @@ static void mptcp_token_test_destroyed(struct kunit *test)
/* simulate race on removal */
refcount_set(&sk->sk_refcnt, 0);
- KUNIT_EXPECT_PTR_EQ(test, null_msk, mptcp_token_get_sock(msk->token));
+ KUNIT_EXPECT_PTR_EQ(test, null_msk, mptcp_token_get_sock(&init_net, msk->token));
/* cleanup */
mptcp_token_destroy(msk);
--
2.33.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH net 2/2] mptcp: allow changing the 'backup' bit when no sockets are open
2021-09-24 0:04 [PATCH net 0/2] mptcp: Bug fixes Mat Martineau
2021-09-24 0:04 ` [PATCH net 1/2] mptcp: don't return sockets in foreign netns Mat Martineau
@ 2021-09-24 0:04 ` Mat Martineau
2021-09-24 10:00 ` [PATCH net 0/2] mptcp: Bug fixes patchwork-bot+netdevbpf
2 siblings, 0 replies; 6+ messages in thread
From: Mat Martineau @ 2021-09-24 0:04 UTC (permalink / raw)
To: netdev
Cc: Davide Caratti, davem, kuba, matthieu.baerts, mptcp, fw, pabeni,
geliangtang, Mat Martineau
From: Davide Caratti <dcaratti@redhat.com>
current Linux refuses to change the 'backup' bit of MPTCP endpoints, i.e.
using MPTCP_PM_CMD_SET_FLAGS, unless it finds (at least) one subflow that
matches the endpoint address. There is no reason for that, so we can just
ignore the return value of mptcp_nl_addr_backup(). In this way, endpoints
can reconfigure their 'backup' flag even if no MPTCP sockets are open (or
more generally, in case the MP_PRIO message is not sent out).
Fixes: 0f9f696a502e ("mptcp: add set_flags command in PM netlink")
Signed-off-by: Davide Caratti <dcaratti@redhat.com>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
---
net/mptcp/pm_netlink.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index c4f9a5ce3815..050eea231528 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -1718,9 +1718,7 @@ static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *info)
list_for_each_entry(entry, &pernet->local_addr_list, list) {
if (addresses_equal(&entry->addr, &addr.addr, true)) {
- ret = mptcp_nl_addr_backup(net, &entry->addr, bkup);
- if (ret)
- return ret;
+ mptcp_nl_addr_backup(net, &entry->addr, bkup);
if (bkup)
entry->flags |= MPTCP_PM_ADDR_FLAG_BACKUP;
--
2.33.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH net 0/2] mptcp: Bug fixes
2021-09-24 0:04 [PATCH net 0/2] mptcp: Bug fixes Mat Martineau
2021-09-24 0:04 ` [PATCH net 1/2] mptcp: don't return sockets in foreign netns Mat Martineau
2021-09-24 0:04 ` [PATCH net 2/2] mptcp: allow changing the 'backup' bit when no sockets are open Mat Martineau
@ 2021-09-24 10:00 ` patchwork-bot+netdevbpf
2 siblings, 0 replies; 6+ messages in thread
From: patchwork-bot+netdevbpf @ 2021-09-24 10:00 UTC (permalink / raw)
To: Mat Martineau
Cc: netdev, davem, kuba, matthieu.baerts, mptcp, fw, dcaratti,
pabeni, geliangtang
Hello:
This series was applied to netdev/net.git (refs/heads/master):
On Thu, 23 Sep 2021 17:04:10 -0700 you wrote:
> This patch set includes two separate fixes for the net tree:
>
> Patch 1 makes sure that MPTCP token searches are always limited to the
> appropriate net namespace.
>
> Patch 2 allows userspace to always change the backup settings for
> configured endpoints even if those endpoints are not currently in use.
>
> [...]
Here is the summary with links:
- [net,1/2] mptcp: don't return sockets in foreign netns
https://git.kernel.org/netdev/net/c/ea1300b9df7c
- [net,2/2] mptcp: allow changing the 'backup' bit when no sockets are open
https://git.kernel.org/netdev/net/c/3f4a08909e2c
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH net 0/2] mptcp: Bug fixes
2021-08-18 23:42 Mat Martineau
@ 2021-08-19 11:30 ` patchwork-bot+netdevbpf
0 siblings, 0 replies; 6+ messages in thread
From: patchwork-bot+netdevbpf @ 2021-08-19 11:30 UTC (permalink / raw)
To: Mat Martineau; +Cc: netdev, davem, kuba, matthieu.baerts, mptcp, geliangtang
Hello:
This series was applied to netdev/net.git (refs/heads/master):
On Wed, 18 Aug 2021 16:42:35 -0700 you wrote:
> Here are two bug fixes for the net tree:
>
> Patch 1 fixes a memory leak that could be encountered when clearing the
> list of advertised MPTCP addresses.
>
> Patch 2 fixes a protocol issue early in an MPTCP connection, to ensure
> both peers correctly understand that the full MPTCP connection handshake
> has completed even when the server side quickly sends an ADD_ADDR
> option.
>
> [...]
Here is the summary with links:
- [net,1/2] mptcp: fix memory leak on address flush
https://git.kernel.org/netdev/net/c/a0eea5f10eeb
- [net,2/2] mptcp: full fully established support after ADD_ADDR
https://git.kernel.org/netdev/net/c/67b12f792d5e
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH net 0/2] mptcp: Bug fixes
@ 2021-08-18 23:42 Mat Martineau
2021-08-19 11:30 ` patchwork-bot+netdevbpf
0 siblings, 1 reply; 6+ messages in thread
From: Mat Martineau @ 2021-08-18 23:42 UTC (permalink / raw)
To: netdev; +Cc: Mat Martineau, davem, kuba, matthieu.baerts, mptcp, geliangtang
Here are two bug fixes for the net tree:
Patch 1 fixes a memory leak that could be encountered when clearing the
list of advertised MPTCP addresses.
Patch 2 fixes a protocol issue early in an MPTCP connection, to ensure
both peers correctly understand that the full MPTCP connection handshake
has completed even when the server side quickly sends an ADD_ADDR
option.
Matthieu Baerts (1):
mptcp: full fully established support after ADD_ADDR
Paolo Abeni (1):
mptcp: fix memory leak on address flush
net/mptcp/options.c | 10 +++-------
net/mptcp/pm_netlink.c | 44 ++++++++++++------------------------------
2 files changed, 15 insertions(+), 39 deletions(-)
base-commit: fb4b1373dcab086d0619c29310f0466a0b2ceb8a
--
2.33.0
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2021-09-24 10:00 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-24 0:04 [PATCH net 0/2] mptcp: Bug fixes Mat Martineau
2021-09-24 0:04 ` [PATCH net 1/2] mptcp: don't return sockets in foreign netns Mat Martineau
2021-09-24 0:04 ` [PATCH net 2/2] mptcp: allow changing the 'backup' bit when no sockets are open Mat Martineau
2021-09-24 10:00 ` [PATCH net 0/2] mptcp: Bug fixes patchwork-bot+netdevbpf
-- strict thread matches above, loose matches on Subject: below --
2021-08-18 23:42 Mat Martineau
2021-08-19 11:30 ` patchwork-bot+netdevbpf
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.