Commit 97499e28 authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

Merge branch 'mptcp-pm-nl-announce-deny-join-id0-flag'

Matthieu Baerts says:

====================
mptcp: pm: nl: announce deny-join-id0 flag

During the connection establishment, a peer can tell the other one that
it cannot establish new subflows to the initial IP address and port by
setting the 'C' flag [1]. Doing so makes sense when the sender is behind
a strict NAT, operating behind a legacy Layer 4 load balancer, or using
anycast IP address for example.

When this 'C' flag is set, the path-managers must then not try to
establish new subflows to the other peer's initial IP address and port.
The in-kernel PM has access to this info, but the userspace PM didn't,
not letting the userspace daemon able to respect the RFC8684.

Here are a few fixes related to this 'C' flag (aka 'deny-join-id0'):

- Patch 1: add remote_deny_join_id0 info on passive connections. A fix
  for v5.14.

- Patch 2: let the userspace PM daemon know about the deny_join_id0
  attribute, so when set, it can avoid creating new subflows to the
  initial IP address and port. A fix for v5.19.

- Patch 3: a validation for the previous commit.

- Patch 4: record the deny_join_id0 info when TFO is used. A fix for
  v6.2.

- Patch 5: not related to deny-join-id0, but it fixes errors messages in
  the sockopt selftests, not to create confusions. A fix for v6.5.
====================

Link: https://patch.msgid.link/20250912-net-mptcp-pm-uspace-deny_join_id0-v1-0-40171884ade8@kernel.org


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 33a09c64 b86418be
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -28,13 +28,13 @@ definitions:
          traffic-patterns it can take a long time until the
          MPTCP_EVENT_ESTABLISHED is sent.
          Attributes: token, family, saddr4 | saddr6, daddr4 | daddr6, sport,
          dport, server-side.
          dport, server-side, [flags].
      -
        name: established
        doc: >-
          A MPTCP connection is established (can start new subflows).
          Attributes: token, family, saddr4 | saddr6, daddr4 | daddr6, sport,
          dport, server-side.
          dport, server-side, [flags].
      -
        name: closed
        doc: >-
+2 −0
Original line number Diff line number Diff line
@@ -31,6 +31,8 @@
#define MPTCP_INFO_FLAG_FALLBACK		_BITUL(0)
#define MPTCP_INFO_FLAG_REMOTE_KEY_RECEIVED	_BITUL(1)

#define MPTCP_PM_EV_FLAG_DENY_JOIN_ID0		_BITUL(0)

#define MPTCP_PM_ADDR_FLAG_SIGNAL                      (1 << 0)
#define MPTCP_PM_ADDR_FLAG_SUBFLOW                     (1 << 1)
#define MPTCP_PM_ADDR_FLAG_BACKUP                      (1 << 2)
+2 −2
Original line number Diff line number Diff line
@@ -16,10 +16,10 @@
 *   good time to allocate memory and send ADD_ADDR if needed. Depending on the
 *   traffic-patterns it can take a long time until the MPTCP_EVENT_ESTABLISHED
 *   is sent. Attributes: token, family, saddr4 | saddr6, daddr4 | daddr6,
 *   sport, dport, server-side.
 *   sport, dport, server-side, [flags].
 * @MPTCP_EVENT_ESTABLISHED: A MPTCP connection is established (can start new
 *   subflows). Attributes: token, family, saddr4 | saddr6, daddr4 | daddr6,
 *   sport, dport, server-side.
 *   sport, dport, server-side, [flags].
 * @MPTCP_EVENT_CLOSED: A MPTCP connection has stopped. Attribute: token.
 * @MPTCP_EVENT_ANNOUNCED: A new address has been announced by the peer.
 *   Attributes: token, rem_id, family, daddr4 | daddr6 [, dport].
+3 −3
Original line number Diff line number Diff line
@@ -985,13 +985,13 @@ static bool check_fully_established(struct mptcp_sock *msk, struct sock *ssk,
		return false;
	}

	if (mp_opt->deny_join_id0)
		WRITE_ONCE(msk->pm.remote_deny_join_id0, true);

	if (unlikely(!READ_ONCE(msk->pm.server_side)))
		pr_warn_once("bogus mpc option on established client sk");

set_fully_established:
	if (mp_opt->deny_join_id0)
		WRITE_ONCE(msk->pm.remote_deny_join_id0, true);

	mptcp_data_lock((struct sock *)msk);
	__mptcp_subflow_fully_established(msk, subflow, mp_opt);
	mptcp_data_unlock((struct sock *)msk);
+7 −0
Original line number Diff line number Diff line
@@ -408,6 +408,7 @@ static int mptcp_event_created(struct sk_buff *skb,
			       const struct sock *ssk)
{
	int err = nla_put_u32(skb, MPTCP_ATTR_TOKEN, READ_ONCE(msk->token));
	u16 flags = 0;

	if (err)
		return err;
@@ -415,6 +416,12 @@ static int mptcp_event_created(struct sk_buff *skb,
	if (nla_put_u8(skb, MPTCP_ATTR_SERVER_SIDE, READ_ONCE(msk->pm.server_side)))
		return -EMSGSIZE;

	if (READ_ONCE(msk->pm.remote_deny_join_id0))
		flags |= MPTCP_PM_EV_FLAG_DENY_JOIN_ID0;

	if (flags && nla_put_u16(skb, MPTCP_ATTR_FLAGS, flags))
		return -EMSGSIZE;

	return mptcp_event_add_subflow(skb, ssk);
}

Loading