Commit 42007019 authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'mptcp-fixes'



Mat Martineau says:

====================
mptcp: Bug fixes

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.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents f7e745f8 3f4a0890
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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;

+1 −3
Original line number Diff line number Diff line
@@ -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;
+1 −1
Original line number Diff line number Diff line
@@ -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);
+1 −1
Original line number Diff line number Diff line
@@ -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;
+1 −12
Original line number Diff line number Diff line
@@ -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)
Loading