Skip to content

Commit 237c385

Browse files
committed
Merge branch 'mptcp-close-subflow-when-receiving-tcp-fin-and-misc'
Matthieu Baerts says: ==================== mptcp: close subflow when receiving TCP+FIN and misc. Here are different fixes: Patch 1 closes the subflow after having received a FIN, instead of leaving it half-closed until the end of the MPTCP connection. A fix for v5.12. Patch 2 validates the previous patch. Patch 3 is a fix for a recent fix to check both directions for the backup flag. It can follow the 'Fixes' commit and be backported up to v5.7. Patch 4 adds a missing \n at the end of pr_debug(), causing debug messages to be displayed with a delay, which confuses the debugger. A fix for v5.6. ==================== Link: https://patch.msgid.link/20240826-net-mptcp-close-extra-sf-fin-v1-0-905199fe1172@kernel.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2 parents bac76cf + cb41b19 commit 237c385

File tree

10 files changed

+122
-118
lines changed

10 files changed

+122
-118
lines changed

net/mptcp/fastopen.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,12 @@ void __mptcp_fastopen_gen_msk_ackseq(struct mptcp_sock *msk, struct mptcp_subflo
6868
skb = skb_peek_tail(&sk->sk_receive_queue);
6969
if (skb) {
7070
WARN_ON_ONCE(MPTCP_SKB_CB(skb)->end_seq);
71-
pr_debug("msk %p moving seq %llx -> %llx end_seq %llx -> %llx", sk,
71+
pr_debug("msk %p moving seq %llx -> %llx end_seq %llx -> %llx\n", sk,
7272
MPTCP_SKB_CB(skb)->map_seq, MPTCP_SKB_CB(skb)->map_seq + msk->ack_seq,
7373
MPTCP_SKB_CB(skb)->end_seq, MPTCP_SKB_CB(skb)->end_seq + msk->ack_seq);
7474
MPTCP_SKB_CB(skb)->map_seq += msk->ack_seq;
7575
MPTCP_SKB_CB(skb)->end_seq += msk->ack_seq;
7676
}
7777

78-
pr_debug("msk=%p ack_seq=%llx", msk, msk->ack_seq);
78+
pr_debug("msk=%p ack_seq=%llx\n", msk, msk->ack_seq);
7979
}

net/mptcp/options.c

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ static void mptcp_parse_option(const struct sk_buff *skb,
117117
mp_opt->suboptions |= OPTION_MPTCP_CSUMREQD;
118118
ptr += 2;
119119
}
120-
pr_debug("MP_CAPABLE version=%x, flags=%x, optlen=%d sndr=%llu, rcvr=%llu len=%d csum=%u",
120+
pr_debug("MP_CAPABLE version=%x, flags=%x, optlen=%d sndr=%llu, rcvr=%llu len=%d csum=%u\n",
121121
version, flags, opsize, mp_opt->sndr_key,
122122
mp_opt->rcvr_key, mp_opt->data_len, mp_opt->csum);
123123
break;
@@ -131,7 +131,7 @@ static void mptcp_parse_option(const struct sk_buff *skb,
131131
ptr += 4;
132132
mp_opt->nonce = get_unaligned_be32(ptr);
133133
ptr += 4;
134-
pr_debug("MP_JOIN bkup=%u, id=%u, token=%u, nonce=%u",
134+
pr_debug("MP_JOIN bkup=%u, id=%u, token=%u, nonce=%u\n",
135135
mp_opt->backup, mp_opt->join_id,
136136
mp_opt->token, mp_opt->nonce);
137137
} else if (opsize == TCPOLEN_MPTCP_MPJ_SYNACK) {
@@ -142,19 +142,19 @@ static void mptcp_parse_option(const struct sk_buff *skb,
142142
ptr += 8;
143143
mp_opt->nonce = get_unaligned_be32(ptr);
144144
ptr += 4;
145-
pr_debug("MP_JOIN bkup=%u, id=%u, thmac=%llu, nonce=%u",
145+
pr_debug("MP_JOIN bkup=%u, id=%u, thmac=%llu, nonce=%u\n",
146146
mp_opt->backup, mp_opt->join_id,
147147
mp_opt->thmac, mp_opt->nonce);
148148
} else if (opsize == TCPOLEN_MPTCP_MPJ_ACK) {
149149
mp_opt->suboptions |= OPTION_MPTCP_MPJ_ACK;
150150
ptr += 2;
151151
memcpy(mp_opt->hmac, ptr, MPTCPOPT_HMAC_LEN);
152-
pr_debug("MP_JOIN hmac");
152+
pr_debug("MP_JOIN hmac\n");
153153
}
154154
break;
155155

156156
case MPTCPOPT_DSS:
157-
pr_debug("DSS");
157+
pr_debug("DSS\n");
158158
ptr++;
159159

160160
/* we must clear 'mpc_map' be able to detect MP_CAPABLE
@@ -169,7 +169,7 @@ static void mptcp_parse_option(const struct sk_buff *skb,
169169
mp_opt->ack64 = (flags & MPTCP_DSS_ACK64) != 0;
170170
mp_opt->use_ack = (flags & MPTCP_DSS_HAS_ACK);
171171

172-
pr_debug("data_fin=%d dsn64=%d use_map=%d ack64=%d use_ack=%d",
172+
pr_debug("data_fin=%d dsn64=%d use_map=%d ack64=%d use_ack=%d\n",
173173
mp_opt->data_fin, mp_opt->dsn64,
174174
mp_opt->use_map, mp_opt->ack64,
175175
mp_opt->use_ack);
@@ -207,7 +207,7 @@ static void mptcp_parse_option(const struct sk_buff *skb,
207207
ptr += 4;
208208
}
209209

210-
pr_debug("data_ack=%llu", mp_opt->data_ack);
210+
pr_debug("data_ack=%llu\n", mp_opt->data_ack);
211211
}
212212

213213
if (mp_opt->use_map) {
@@ -231,7 +231,7 @@ static void mptcp_parse_option(const struct sk_buff *skb,
231231
ptr += 2;
232232
}
233233

234-
pr_debug("data_seq=%llu subflow_seq=%u data_len=%u csum=%d:%u",
234+
pr_debug("data_seq=%llu subflow_seq=%u data_len=%u csum=%d:%u\n",
235235
mp_opt->data_seq, mp_opt->subflow_seq,
236236
mp_opt->data_len, !!(mp_opt->suboptions & OPTION_MPTCP_CSUMREQD),
237237
mp_opt->csum);
@@ -293,7 +293,7 @@ static void mptcp_parse_option(const struct sk_buff *skb,
293293
mp_opt->ahmac = get_unaligned_be64(ptr);
294294
ptr += 8;
295295
}
296-
pr_debug("ADD_ADDR%s: id=%d, ahmac=%llu, echo=%d, port=%d",
296+
pr_debug("ADD_ADDR%s: id=%d, ahmac=%llu, echo=%d, port=%d\n",
297297
(mp_opt->addr.family == AF_INET6) ? "6" : "",
298298
mp_opt->addr.id, mp_opt->ahmac, mp_opt->echo, ntohs(mp_opt->addr.port));
299299
break;
@@ -309,7 +309,7 @@ static void mptcp_parse_option(const struct sk_buff *skb,
309309
mp_opt->rm_list.nr = opsize - TCPOLEN_MPTCP_RM_ADDR_BASE;
310310
for (i = 0; i < mp_opt->rm_list.nr; i++)
311311
mp_opt->rm_list.ids[i] = *ptr++;
312-
pr_debug("RM_ADDR: rm_list_nr=%d", mp_opt->rm_list.nr);
312+
pr_debug("RM_ADDR: rm_list_nr=%d\n", mp_opt->rm_list.nr);
313313
break;
314314

315315
case MPTCPOPT_MP_PRIO:
@@ -318,7 +318,7 @@ static void mptcp_parse_option(const struct sk_buff *skb,
318318

319319
mp_opt->suboptions |= OPTION_MPTCP_PRIO;
320320
mp_opt->backup = *ptr++ & MPTCP_PRIO_BKUP;
321-
pr_debug("MP_PRIO: prio=%d", mp_opt->backup);
321+
pr_debug("MP_PRIO: prio=%d\n", mp_opt->backup);
322322
break;
323323

324324
case MPTCPOPT_MP_FASTCLOSE:
@@ -329,7 +329,7 @@ static void mptcp_parse_option(const struct sk_buff *skb,
329329
mp_opt->rcvr_key = get_unaligned_be64(ptr);
330330
ptr += 8;
331331
mp_opt->suboptions |= OPTION_MPTCP_FASTCLOSE;
332-
pr_debug("MP_FASTCLOSE: recv_key=%llu", mp_opt->rcvr_key);
332+
pr_debug("MP_FASTCLOSE: recv_key=%llu\n", mp_opt->rcvr_key);
333333
break;
334334

335335
case MPTCPOPT_RST:
@@ -343,7 +343,7 @@ static void mptcp_parse_option(const struct sk_buff *skb,
343343
flags = *ptr++;
344344
mp_opt->reset_transient = flags & MPTCP_RST_TRANSIENT;
345345
mp_opt->reset_reason = *ptr;
346-
pr_debug("MP_RST: transient=%u reason=%u",
346+
pr_debug("MP_RST: transient=%u reason=%u\n",
347347
mp_opt->reset_transient, mp_opt->reset_reason);
348348
break;
349349

@@ -354,7 +354,7 @@ static void mptcp_parse_option(const struct sk_buff *skb,
354354
ptr += 2;
355355
mp_opt->suboptions |= OPTION_MPTCP_FAIL;
356356
mp_opt->fail_seq = get_unaligned_be64(ptr);
357-
pr_debug("MP_FAIL: data_seq=%llu", mp_opt->fail_seq);
357+
pr_debug("MP_FAIL: data_seq=%llu\n", mp_opt->fail_seq);
358358
break;
359359

360360
default:
@@ -417,7 +417,7 @@ bool mptcp_syn_options(struct sock *sk, const struct sk_buff *skb,
417417
*size = TCPOLEN_MPTCP_MPC_SYN;
418418
return true;
419419
} else if (subflow->request_join) {
420-
pr_debug("remote_token=%u, nonce=%u", subflow->remote_token,
420+
pr_debug("remote_token=%u, nonce=%u\n", subflow->remote_token,
421421
subflow->local_nonce);
422422
opts->suboptions = OPTION_MPTCP_MPJ_SYN;
423423
opts->join_id = subflow->local_id;
@@ -500,7 +500,7 @@ static bool mptcp_established_options_mp(struct sock *sk, struct sk_buff *skb,
500500
*size = TCPOLEN_MPTCP_MPC_ACK;
501501
}
502502

503-
pr_debug("subflow=%p, local_key=%llu, remote_key=%llu map_len=%d",
503+
pr_debug("subflow=%p, local_key=%llu, remote_key=%llu map_len=%d\n",
504504
subflow, subflow->local_key, subflow->remote_key,
505505
data_len);
506506

@@ -509,7 +509,7 @@ static bool mptcp_established_options_mp(struct sock *sk, struct sk_buff *skb,
509509
opts->suboptions = OPTION_MPTCP_MPJ_ACK;
510510
memcpy(opts->hmac, subflow->hmac, MPTCPOPT_HMAC_LEN);
511511
*size = TCPOLEN_MPTCP_MPJ_ACK;
512-
pr_debug("subflow=%p", subflow);
512+
pr_debug("subflow=%p\n", subflow);
513513

514514
/* we can use the full delegate action helper only from BH context
515515
* If we are in process context - sk is flushing the backlog at
@@ -675,7 +675,7 @@ static bool mptcp_established_options_add_addr(struct sock *sk, struct sk_buff *
675675

676676
*size = len;
677677
if (drop_other_suboptions) {
678-
pr_debug("drop other suboptions");
678+
pr_debug("drop other suboptions\n");
679679
opts->suboptions = 0;
680680

681681
/* note that e.g. DSS could have written into the memory
@@ -695,7 +695,7 @@ static bool mptcp_established_options_add_addr(struct sock *sk, struct sk_buff *
695695
} else {
696696
MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_ECHOADDTX);
697697
}
698-
pr_debug("addr_id=%d, ahmac=%llu, echo=%d, port=%d",
698+
pr_debug("addr_id=%d, ahmac=%llu, echo=%d, port=%d\n",
699699
opts->addr.id, opts->ahmac, echo, ntohs(opts->addr.port));
700700

701701
return true;
@@ -726,7 +726,7 @@ static bool mptcp_established_options_rm_addr(struct sock *sk,
726726
opts->rm_list = rm_list;
727727

728728
for (i = 0; i < opts->rm_list.nr; i++)
729-
pr_debug("rm_list_ids[%d]=%d", i, opts->rm_list.ids[i]);
729+
pr_debug("rm_list_ids[%d]=%d\n", i, opts->rm_list.ids[i]);
730730
MPTCP_ADD_STATS(sock_net(sk), MPTCP_MIB_RMADDRTX, opts->rm_list.nr);
731731
return true;
732732
}
@@ -752,7 +752,7 @@ static bool mptcp_established_options_mp_prio(struct sock *sk,
752752
opts->suboptions |= OPTION_MPTCP_PRIO;
753753
opts->backup = subflow->request_bkup;
754754

755-
pr_debug("prio=%d", opts->backup);
755+
pr_debug("prio=%d\n", opts->backup);
756756

757757
return true;
758758
}
@@ -794,7 +794,7 @@ static bool mptcp_established_options_fastclose(struct sock *sk,
794794
opts->suboptions |= OPTION_MPTCP_FASTCLOSE;
795795
opts->rcvr_key = READ_ONCE(msk->remote_key);
796796

797-
pr_debug("FASTCLOSE key=%llu", opts->rcvr_key);
797+
pr_debug("FASTCLOSE key=%llu\n", opts->rcvr_key);
798798
MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPFASTCLOSETX);
799799
return true;
800800
}
@@ -816,7 +816,7 @@ static bool mptcp_established_options_mp_fail(struct sock *sk,
816816
opts->suboptions |= OPTION_MPTCP_FAIL;
817817
opts->fail_seq = subflow->map_seq;
818818

819-
pr_debug("MP_FAIL fail_seq=%llu", opts->fail_seq);
819+
pr_debug("MP_FAIL fail_seq=%llu\n", opts->fail_seq);
820820
MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPFAILTX);
821821

822822
return true;
@@ -904,7 +904,7 @@ bool mptcp_synack_options(const struct request_sock *req, unsigned int *size,
904904
opts->csum_reqd = subflow_req->csum_reqd;
905905
opts->allow_join_id0 = subflow_req->allow_join_id0;
906906
*size = TCPOLEN_MPTCP_MPC_SYNACK;
907-
pr_debug("subflow_req=%p, local_key=%llu",
907+
pr_debug("subflow_req=%p, local_key=%llu\n",
908908
subflow_req, subflow_req->local_key);
909909
return true;
910910
} else if (subflow_req->mp_join) {
@@ -913,7 +913,7 @@ bool mptcp_synack_options(const struct request_sock *req, unsigned int *size,
913913
opts->join_id = subflow_req->local_id;
914914
opts->thmac = subflow_req->thmac;
915915
opts->nonce = subflow_req->local_nonce;
916-
pr_debug("req=%p, bkup=%u, id=%u, thmac=%llu, nonce=%u",
916+
pr_debug("req=%p, bkup=%u, id=%u, thmac=%llu, nonce=%u\n",
917917
subflow_req, opts->backup, opts->join_id,
918918
opts->thmac, opts->nonce);
919919
*size = TCPOLEN_MPTCP_MPJ_SYNACK;

net/mptcp/pm.c

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ int mptcp_pm_announce_addr(struct mptcp_sock *msk,
1919
{
2020
u8 add_addr = READ_ONCE(msk->pm.addr_signal);
2121

22-
pr_debug("msk=%p, local_id=%d, echo=%d", msk, addr->id, echo);
22+
pr_debug("msk=%p, local_id=%d, echo=%d\n", msk, addr->id, echo);
2323

2424
lockdep_assert_held(&msk->pm.lock);
2525

@@ -45,7 +45,7 @@ int mptcp_pm_remove_addr(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_
4545
{
4646
u8 rm_addr = READ_ONCE(msk->pm.addr_signal);
4747

48-
pr_debug("msk=%p, rm_list_nr=%d", msk, rm_list->nr);
48+
pr_debug("msk=%p, rm_list_nr=%d\n", msk, rm_list->nr);
4949

5050
if (rm_addr) {
5151
MPTCP_ADD_STATS(sock_net((struct sock *)msk),
@@ -66,7 +66,7 @@ void mptcp_pm_new_connection(struct mptcp_sock *msk, const struct sock *ssk, int
6666
{
6767
struct mptcp_pm_data *pm = &msk->pm;
6868

69-
pr_debug("msk=%p, token=%u side=%d", msk, READ_ONCE(msk->token), server_side);
69+
pr_debug("msk=%p, token=%u side=%d\n", msk, READ_ONCE(msk->token), server_side);
7070

7171
WRITE_ONCE(pm->server_side, server_side);
7272
mptcp_event(MPTCP_EVENT_CREATED, msk, ssk, GFP_ATOMIC);
@@ -90,7 +90,7 @@ bool mptcp_pm_allow_new_subflow(struct mptcp_sock *msk)
9090

9191
subflows_max = mptcp_pm_get_subflows_max(msk);
9292

93-
pr_debug("msk=%p subflows=%d max=%d allow=%d", msk, pm->subflows,
93+
pr_debug("msk=%p subflows=%d max=%d allow=%d\n", msk, pm->subflows,
9494
subflows_max, READ_ONCE(pm->accept_subflow));
9595

9696
/* try to avoid acquiring the lock below */
@@ -114,7 +114,7 @@ bool mptcp_pm_allow_new_subflow(struct mptcp_sock *msk)
114114
static bool mptcp_pm_schedule_work(struct mptcp_sock *msk,
115115
enum mptcp_pm_status new_status)
116116
{
117-
pr_debug("msk=%p status=%x new=%lx", msk, msk->pm.status,
117+
pr_debug("msk=%p status=%x new=%lx\n", msk, msk->pm.status,
118118
BIT(new_status));
119119
if (msk->pm.status & BIT(new_status))
120120
return false;
@@ -129,7 +129,7 @@ void mptcp_pm_fully_established(struct mptcp_sock *msk, const struct sock *ssk)
129129
struct mptcp_pm_data *pm = &msk->pm;
130130
bool announce = false;
131131

132-
pr_debug("msk=%p", msk);
132+
pr_debug("msk=%p\n", msk);
133133

134134
spin_lock_bh(&pm->lock);
135135

@@ -153,14 +153,14 @@ void mptcp_pm_fully_established(struct mptcp_sock *msk, const struct sock *ssk)
153153

154154
void mptcp_pm_connection_closed(struct mptcp_sock *msk)
155155
{
156-
pr_debug("msk=%p", msk);
156+
pr_debug("msk=%p\n", msk);
157157
}
158158

159159
void mptcp_pm_subflow_established(struct mptcp_sock *msk)
160160
{
161161
struct mptcp_pm_data *pm = &msk->pm;
162162

163-
pr_debug("msk=%p", msk);
163+
pr_debug("msk=%p\n", msk);
164164

165165
if (!READ_ONCE(pm->work_pending))
166166
return;
@@ -212,7 +212,7 @@ void mptcp_pm_add_addr_received(const struct sock *ssk,
212212
struct mptcp_sock *msk = mptcp_sk(subflow->conn);
213213
struct mptcp_pm_data *pm = &msk->pm;
214214

215-
pr_debug("msk=%p remote_id=%d accept=%d", msk, addr->id,
215+
pr_debug("msk=%p remote_id=%d accept=%d\n", msk, addr->id,
216216
READ_ONCE(pm->accept_addr));
217217

218218
mptcp_event_addr_announced(ssk, addr);
@@ -243,7 +243,7 @@ void mptcp_pm_add_addr_echoed(struct mptcp_sock *msk,
243243
{
244244
struct mptcp_pm_data *pm = &msk->pm;
245245

246-
pr_debug("msk=%p", msk);
246+
pr_debug("msk=%p\n", msk);
247247

248248
spin_lock_bh(&pm->lock);
249249

@@ -267,7 +267,7 @@ void mptcp_pm_rm_addr_received(struct mptcp_sock *msk,
267267
struct mptcp_pm_data *pm = &msk->pm;
268268
u8 i;
269269

270-
pr_debug("msk=%p remote_ids_nr=%d", msk, rm_list->nr);
270+
pr_debug("msk=%p remote_ids_nr=%d\n", msk, rm_list->nr);
271271

272272
for (i = 0; i < rm_list->nr; i++)
273273
mptcp_event_addr_removed(msk, rm_list->ids[i]);
@@ -299,19 +299,19 @@ void mptcp_pm_mp_fail_received(struct sock *sk, u64 fail_seq)
299299
struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
300300
struct mptcp_sock *msk = mptcp_sk(subflow->conn);
301301

302-
pr_debug("fail_seq=%llu", fail_seq);
302+
pr_debug("fail_seq=%llu\n", fail_seq);
303303

304304
if (!READ_ONCE(msk->allow_infinite_fallback))
305305
return;
306306

307307
if (!subflow->fail_tout) {
308-
pr_debug("send MP_FAIL response and infinite map");
308+
pr_debug("send MP_FAIL response and infinite map\n");
309309

310310
subflow->send_mp_fail = 1;
311311
subflow->send_infinite_map = 1;
312312
tcp_send_ack(sk);
313313
} else {
314-
pr_debug("MP_FAIL response received");
314+
pr_debug("MP_FAIL response received\n");
315315
WRITE_ONCE(subflow->fail_tout, 0);
316316
}
317317
}

0 commit comments

Comments
 (0)