Skip to content

Commit 186468c

Browse files
committed
Merge branch 'mptcp-misc-fixes-for-v6-19-rc1'
Matthieu Baerts says: ==================== mptcp: misc fixes for v6.19-rc1 Here are various unrelated fixes: - Patches 1-2: ignore unknown in-kernel PM endpoint flags instead of pretending they are supported. A fix for v5.7. - Patch 3: avoid potential unnecessary rtx timer expiration. A fix for v5.15. - Patch 4: avoid a deadlock on fallback in case of SKB creation failure while re-injecting. ==================== Link: https://patch.msgid.link/20251205-net-mptcp-misc-fixes-6-19-rc1-v1-0-9e4781a6c1b8@kernel.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2 parents db6b35c + ffb8c27 commit 186468c

File tree

5 files changed

+32
-9
lines changed

5 files changed

+32
-9
lines changed

include/uapi/linux/mptcp.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
#define MPTCP_PM_ADDR_FLAG_FULLMESH _BITUL(3)
4141
#define MPTCP_PM_ADDR_FLAG_IMPLICIT _BITUL(4)
4242
#define MPTCP_PM_ADDR_FLAG_LAMINAR _BITUL(5)
43+
#define MPTCP_PM_ADDR_FLAGS_MASK GENMASK(5, 0)
4344

4445
struct mptcp_info {
4546
__u8 mptcpi_subflows;

net/mptcp/pm_netlink.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,8 @@ int mptcp_pm_parse_entry(struct nlattr *attr, struct genl_info *info,
119119
}
120120

121121
if (tb[MPTCP_PM_ADDR_ATTR_FLAGS])
122-
entry->flags = nla_get_u32(tb[MPTCP_PM_ADDR_ATTR_FLAGS]);
122+
entry->flags = nla_get_u32(tb[MPTCP_PM_ADDR_ATTR_FLAGS]) &
123+
MPTCP_PM_ADDR_FLAGS_MASK;
123124

124125
if (tb[MPTCP_PM_ADDR_ATTR_PORT])
125126
entry->addr.port = htons(nla_get_u16(tb[MPTCP_PM_ADDR_ATTR_PORT]));

net/mptcp/protocol.c

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1623,7 +1623,7 @@ void __mptcp_push_pending(struct sock *sk, unsigned int flags)
16231623
struct mptcp_sendmsg_info info = {
16241624
.flags = flags,
16251625
};
1626-
bool do_check_data_fin = false;
1626+
bool copied = false;
16271627
int push_count = 1;
16281628

16291629
while (mptcp_send_head(sk) && (push_count > 0)) {
@@ -1665,7 +1665,7 @@ void __mptcp_push_pending(struct sock *sk, unsigned int flags)
16651665
push_count--;
16661666
continue;
16671667
}
1668-
do_check_data_fin = true;
1668+
copied = true;
16691669
}
16701670
}
16711671
}
@@ -1674,11 +1674,14 @@ void __mptcp_push_pending(struct sock *sk, unsigned int flags)
16741674
if (ssk)
16751675
mptcp_push_release(ssk, &info);
16761676

1677-
/* ensure the rtx timer is running */
1678-
if (!mptcp_rtx_timer_pending(sk))
1679-
mptcp_reset_rtx_timer(sk);
1680-
if (do_check_data_fin)
1677+
/* Avoid scheduling the rtx timer if no data has been pushed; the timer
1678+
* will be updated on positive acks by __mptcp_cleanup_una().
1679+
*/
1680+
if (copied) {
1681+
if (!mptcp_rtx_timer_pending(sk))
1682+
mptcp_reset_rtx_timer(sk);
16811683
mptcp_check_send_data_fin(sk);
1684+
}
16821685
}
16831686

16841687
static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk, bool first)
@@ -2766,10 +2769,13 @@ static void __mptcp_retrans(struct sock *sk)
27662769

27672770
/*
27682771
* make the whole retrans decision, xmit, disallow
2769-
* fallback atomic
2772+
* fallback atomic, note that we can't retrans even
2773+
* when an infinite fallback is in progress, i.e. new
2774+
* subflows are disallowed.
27702775
*/
27712776
spin_lock_bh(&msk->fallback_lock);
2772-
if (__mptcp_check_fallback(msk)) {
2777+
if (__mptcp_check_fallback(msk) ||
2778+
!msk->allow_subflows) {
27732779
spin_unlock_bh(&msk->fallback_lock);
27742780
release_sock(ssk);
27752781
goto clear_scheduled;

tools/testing/selftests/net/mptcp/pm_netlink.sh

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,10 @@ check "show_endpoints" \
192192
flush_endpoint
193193
check "show_endpoints" "" "flush addrs"
194194

195+
add_endpoint 10.0.1.1 flags unknown
196+
check "show_endpoints" "$(format_endpoints "1,10.0.1.1")" "ignore unknown flags"
197+
flush_endpoint
198+
195199
set_limits 9 1 2>/dev/null
196200
check "get_limits" "${default_limits}" "rcv addrs above hard limit"
197201

tools/testing/selftests/net/mptcp/pm_nl_ctl.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
#define IPPROTO_MPTCP 262
2525
#endif
2626

27+
#define MPTCP_PM_ADDR_FLAG_UNKNOWN _BITUL(7)
28+
2729
static void syntax(char *argv[])
2830
{
2931
fprintf(stderr, "%s add|ann|rem|csf|dsf|get|set|del|flush|dump|events|listen|accept [<args>]\n", argv[0]);
@@ -836,6 +838,8 @@ int add_addr(int fd, int pm_family, int argc, char *argv[])
836838
flags |= MPTCP_PM_ADDR_FLAG_BACKUP;
837839
else if (!strcmp(tok, "fullmesh"))
838840
flags |= MPTCP_PM_ADDR_FLAG_FULLMESH;
841+
else if (!strcmp(tok, "unknown"))
842+
flags |= MPTCP_PM_ADDR_FLAG_UNKNOWN;
839843
else
840844
error(1, errno,
841845
"unknown flag %s", argv[arg]);
@@ -1048,6 +1052,13 @@ static void print_addr(struct rtattr *attrs, int len)
10481052
printf(",");
10491053
}
10501054

1055+
if (flags & MPTCP_PM_ADDR_FLAG_UNKNOWN) {
1056+
printf("unknown");
1057+
flags &= ~MPTCP_PM_ADDR_FLAG_UNKNOWN;
1058+
if (flags)
1059+
printf(",");
1060+
}
1061+
10511062
/* bump unknown flags, if any */
10521063
if (flags)
10531064
printf("0x%x", flags);

0 commit comments

Comments
 (0)