protocol.c (419ce133ab928ab5efd7b50b2ef36ddfd4eadbd2) protocol.c (72377ab2d671befd6390a1d5677f5cca61235b65)
1// SPDX-License-Identifier: GPL-2.0
2/* Multipath TCP
3 *
4 * Copyright (c) 2017 - 2019, Intel Corporation.
5 */
6
7#define pr_fmt(fmt) "MPTCP: " fmt
8

--- 1284 unchanged lines hidden (view full) ---

1293 mpext = skb_ext_find(skb, SKB_EXT_MPTCP);
1294 }
1295
1296 /* Zero window and all data acked? Probe. */
1297 copy = mptcp_check_allowed_size(msk, ssk, data_seq, copy);
1298 if (copy == 0) {
1299 u64 snd_una = READ_ONCE(msk->snd_una);
1300
1// SPDX-License-Identifier: GPL-2.0
2/* Multipath TCP
3 *
4 * Copyright (c) 2017 - 2019, Intel Corporation.
5 */
6
7#define pr_fmt(fmt) "MPTCP: " fmt
8

--- 1284 unchanged lines hidden (view full) ---

1293 mpext = skb_ext_find(skb, SKB_EXT_MPTCP);
1294 }
1295
1296 /* Zero window and all data acked? Probe. */
1297 copy = mptcp_check_allowed_size(msk, ssk, data_seq, copy);
1298 if (copy == 0) {
1299 u64 snd_una = READ_ONCE(msk->snd_una);
1300
1301 if (snd_una != msk->snd_nxt) {
1301 if (snd_una != msk->snd_nxt || tcp_write_queue_tail(ssk)) {
1302 tcp_remove_empty_skb(ssk);
1303 return 0;
1304 }
1305
1306 zero_window_probe = true;
1307 data_seq = snd_una - 1;
1308 copy = 1;
1302 tcp_remove_empty_skb(ssk);
1303 return 0;
1304 }
1305
1306 zero_window_probe = true;
1307 data_seq = snd_una - 1;
1308 copy = 1;
1309
1310 /* all mptcp-level data is acked, no skbs should be present into the
1311 * ssk write queue
1312 */
1313 WARN_ON_ONCE(reuse_skb);
1314 }
1315
1316 copy = min_t(size_t, copy, info->limit - info->sent);
1317 if (!sk_wmem_schedule(ssk, copy)) {
1318 tcp_remove_empty_skb(ssk);
1319 return -ENOMEM;
1320 }
1321

--- 12 unchanged lines hidden (view full) ---

1334 WRITE_ONCE(tcp_sk(ssk)->write_seq, tcp_sk(ssk)->write_seq + copy);
1335 TCP_SKB_CB(skb)->end_seq += copy;
1336 tcp_skb_pcount_set(skb, 0);
1337
1338 /* on skb reuse we just need to update the DSS len */
1339 if (reuse_skb) {
1340 TCP_SKB_CB(skb)->tcp_flags &= ~TCPHDR_PSH;
1341 mpext->data_len += copy;
1309 }
1310
1311 copy = min_t(size_t, copy, info->limit - info->sent);
1312 if (!sk_wmem_schedule(ssk, copy)) {
1313 tcp_remove_empty_skb(ssk);
1314 return -ENOMEM;
1315 }
1316

--- 12 unchanged lines hidden (view full) ---

1329 WRITE_ONCE(tcp_sk(ssk)->write_seq, tcp_sk(ssk)->write_seq + copy);
1330 TCP_SKB_CB(skb)->end_seq += copy;
1331 tcp_skb_pcount_set(skb, 0);
1332
1333 /* on skb reuse we just need to update the DSS len */
1334 if (reuse_skb) {
1335 TCP_SKB_CB(skb)->tcp_flags &= ~TCPHDR_PSH;
1336 mpext->data_len += copy;
1342 WARN_ON_ONCE(zero_window_probe);
1343 goto out;
1344 }
1345
1346 memset(mpext, 0, sizeof(*mpext));
1347 mpext->data_seq = data_seq;
1348 mpext->subflow_seq = mptcp_subflow_ctx(ssk)->rel_write_seq;
1349 mpext->data_len = copy;
1350 mpext->use_map = 1;

--- 2723 unchanged lines hidden ---
1337 goto out;
1338 }
1339
1340 memset(mpext, 0, sizeof(*mpext));
1341 mpext->data_seq = data_seq;
1342 mpext->subflow_seq = mptcp_subflow_ctx(ssk)->rel_write_seq;
1343 mpext->data_len = copy;
1344 mpext->use_map = 1;

--- 2723 unchanged lines hidden ---