Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'mptcp-pm-netlink-announce-server-side-flag'

Matthieu Baerts says:

====================
mptcp: pm: netlink: announce server-side flag

Now that the 'flags' attribute is used, it seems interesting to add one
flag for 'server-side', a boolean value.

Here are a few patches related to the 'server-side' attribute:

- Patch 1: only announce this attribute on the server side.

- Patch 2: announce the 'server-side' flag when this is the case.

- Patch 3: deprecate the 'server-side' attribute.

- Patch 4: use the 'server-side' flag in the selftests.

- Patches 5, 6: small cleanups when working on code around.
====================

Link: https://patch.msgid.link/20250919-net-next-mptcp-server-side-flag-v1-0-a97a5d561a8b@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+28 -17
+3 -2
Documentation/netlink/specs/mptcp_pm.yaml
··· 28 28 traffic-patterns it can take a long time until the 29 29 MPTCP_EVENT_ESTABLISHED is sent. 30 30 Attributes: token, family, saddr4 | saddr6, daddr4 | daddr6, sport, 31 - dport, server-side, [flags]. 31 + dport, [server-side], [flags]. 32 32 - 33 33 name: established 34 34 doc: >- 35 35 A MPTCP connection is established (can start new subflows). 36 36 Attributes: token, family, saddr4 | saddr6, daddr4 | daddr6, sport, 37 - dport, server-side, [flags]. 37 + dport, [server-side], [flags]. 38 38 - 39 39 name: closed 40 40 doc: >- ··· 266 266 - 267 267 name: server-side 268 268 type: u8 269 + doc: "Deprecated: use 'flags'" 269 270 270 271 operations: 271 272 list:
+6 -5
include/uapi/linux/mptcp.h
··· 32 32 #define MPTCP_INFO_FLAG_REMOTE_KEY_RECEIVED _BITUL(1) 33 33 34 34 #define MPTCP_PM_EV_FLAG_DENY_JOIN_ID0 _BITUL(0) 35 + #define MPTCP_PM_EV_FLAG_SERVER_SIDE _BITUL(1) 35 36 36 - #define MPTCP_PM_ADDR_FLAG_SIGNAL (1 << 0) 37 - #define MPTCP_PM_ADDR_FLAG_SUBFLOW (1 << 1) 38 - #define MPTCP_PM_ADDR_FLAG_BACKUP (1 << 2) 39 - #define MPTCP_PM_ADDR_FLAG_FULLMESH (1 << 3) 40 - #define MPTCP_PM_ADDR_FLAG_IMPLICIT (1 << 4) 37 + #define MPTCP_PM_ADDR_FLAG_SIGNAL _BITUL(0) 38 + #define MPTCP_PM_ADDR_FLAG_SUBFLOW _BITUL(1) 39 + #define MPTCP_PM_ADDR_FLAG_BACKUP _BITUL(2) 40 + #define MPTCP_PM_ADDR_FLAG_FULLMESH _BITUL(3) 41 + #define MPTCP_PM_ADDR_FLAG_IMPLICIT _BITUL(4) 41 42 42 43 struct mptcp_info { 43 44 __u8 mptcpi_subflows;
+2 -2
include/uapi/linux/mptcp_pm.h
··· 16 16 * good time to allocate memory and send ADD_ADDR if needed. Depending on the 17 17 * traffic-patterns it can take a long time until the MPTCP_EVENT_ESTABLISHED 18 18 * is sent. Attributes: token, family, saddr4 | saddr6, daddr4 | daddr6, 19 - * sport, dport, server-side, [flags]. 19 + * sport, dport, [server-side], [flags]. 20 20 * @MPTCP_EVENT_ESTABLISHED: A MPTCP connection is established (can start new 21 21 * subflows). Attributes: token, family, saddr4 | saddr6, daddr4 | daddr6, 22 - * sport, dport, server-side, [flags]. 22 + * sport, dport, [server-side], [flags]. 23 23 * @MPTCP_EVENT_CLOSED: A MPTCP connection has stopped. Attribute: token. 24 24 * @MPTCP_EVENT_ANNOUNCED: A new address has been announced by the peer. 25 25 * Attributes: token, rem_id, family, daddr4 | daddr6 [, dport].
+7 -2
net/mptcp/pm_netlink.c
··· 413 413 if (err) 414 414 return err; 415 415 416 - if (nla_put_u8(skb, MPTCP_ATTR_SERVER_SIDE, READ_ONCE(msk->pm.server_side))) 417 - return -EMSGSIZE; 416 + if (READ_ONCE(msk->pm.server_side)) { 417 + flags |= MPTCP_PM_EV_FLAG_SERVER_SIDE; 418 + 419 + /* Deprecated, and only set when it is the server side */ 420 + if (nla_put_u8(skb, MPTCP_ATTR_SERVER_SIDE, 1)) 421 + return -EMSGSIZE; 422 + } 418 423 419 424 if (READ_ONCE(msk->pm.remote_deny_join_id0)) 420 425 flags |= MPTCP_PM_EV_FLAG_DENY_JOIN_ID0;
+1 -4
net/mptcp/protocol.c
··· 545 545 } 546 546 } 547 547 548 - static bool mptcp_check_data_fin(struct sock *sk) 548 + static void mptcp_check_data_fin(struct sock *sk) 549 549 { 550 550 struct mptcp_sock *msk = mptcp_sk(sk); 551 551 u64 rcv_data_fin_seq; 552 - bool ret = false; 553 552 554 553 /* Need to ack a DATA_FIN received from a peer while this side 555 554 * of the connection is in ESTABLISHED, FIN_WAIT1, or FIN_WAIT2. ··· 587 588 break; 588 589 } 589 590 590 - ret = true; 591 591 if (!__mptcp_check_fallback(msk)) 592 592 mptcp_send_ack(msk); 593 593 mptcp_close_wake_up(sk); 594 594 } 595 - return ret; 596 595 } 597 596 598 597 static void mptcp_dss_corruption(struct mptcp_sock *msk, struct sock *ssk)
+8 -1
tools/testing/selftests/net/mptcp/pm_nl_ctl.c
··· 2 2 3 3 #include <errno.h> 4 4 #include <error.h> 5 + #include <stdbool.h> 5 6 #include <stdio.h> 6 7 #include <stdlib.h> 7 8 #include <string.h> ··· 114 113 error(1, errno, "could not join the " MPTCP_PM_EV_GRP_NAME " mcast group"); 115 114 116 115 do { 116 + bool server_side = false; 117 + 117 118 FD_ZERO(&rfds); 118 119 FD_SET(fd, &rfds); 119 120 res_len = NLMSG_ALIGN(sizeof(struct nlmsghdr)) + ··· 190 187 else if (attrs->rta_type == MPTCP_ATTR_ERROR) 191 188 fprintf(stderr, ",error:%u", *(__u8 *)RTA_DATA(attrs)); 192 189 else if (attrs->rta_type == MPTCP_ATTR_SERVER_SIDE) 193 - fprintf(stderr, ",server_side:%u", *(__u8 *)RTA_DATA(attrs)); 190 + server_side = !!*(__u8 *)RTA_DATA(attrs); 194 191 else if (attrs->rta_type == MPTCP_ATTR_FLAGS) { 195 192 __u16 flags = *(__u16 *)RTA_DATA(attrs); 196 193 197 194 /* only print when present, easier */ 198 195 if (flags & MPTCP_PM_EV_FLAG_DENY_JOIN_ID0) 199 196 fprintf(stderr, ",deny_join_id0:1"); 197 + if (flags & MPTCP_PM_EV_FLAG_SERVER_SIDE) 198 + server_side = true; 200 199 } 201 200 202 201 attrs = RTA_NEXT(attrs, msg_len); 203 202 } 204 203 } 204 + if (server_side) 205 + fprintf(stderr, ",server_side:1"); 205 206 fprintf(stderr, "\n"); 206 207 } while (1); 207 208
+1 -1
tools/testing/selftests/net/mptcp/userspace_pm.sh
··· 241 241 242 242 print_test "Established IP${is_v6} MPTCP Connection ns2 => ns1" 243 243 if [ "${client_token}" != "" ] && [ "${server_token}" != "" ] && 244 - [ "${client_serverside}" = 0 ] && [ "${server_serverside}" = 1 ] && 244 + [ "${client_serverside:-0}" = 0 ] && [ "${server_serverside:-0}" = 1 ] && 245 245 [ "${client_nojoin:-0}" = 0 ] && [ "${server_nojoin:-0}" = 1 ] 246 246 then 247 247 test_pass