diff --git a/html/lcov/export/gcov.css b/html/lcov/export/gcov.css index 06b27599..3a92a2c6 100644 --- a/html/lcov/export/gcov.css +++ b/html/lcov/export/gcov.css @@ -927,10 +927,10 @@ Previously untested code is unused now" */ td.tlaEUB { text-align: right; - background-color: #000000; + background-color: #EEEEEE; } td.tlaBgEUB { - background-color: #000000; + background-color: #EEEEEE; } /* Source code view/table entry backround: format for lines classified as "Excluded Uncovered Baseline (0 => #): @@ -938,13 +938,13 @@ Previously untested code is unused now" */ span.tlaEUB { text-align: left; - background-color: #000000; + background-color: #EEEEEE; } span.tlaBgEUB { - background-color: #000000; + background-color: #EEEEEE; } a.tlaBgEUB { - background-color: #000000; + background-color: #EEEEEE; color: #e4e4e4; } @@ -955,7 +955,7 @@ td.headerCovTableHeadEUB { padding-bottom: 0px; font-family: sans-serif; white-space: nowrap; - background-color: #000000; + background-color: #EEEEEE; } /* Source code view/table entry backround: format for lines classified as "Excluded Covered Baseline (1 => #): @@ -963,10 +963,10 @@ Previously tested code is unused now" */ td.tlaECB { text-align: right; - background-color: #000000; + background-color: #EEEEEE; } td.tlaBgECB { - background-color: #000000; + background-color: #EEEEEE; } /* Source code view/table entry backround: format for lines classified as "Excluded Covered Baseline (1 => #): @@ -974,13 +974,13 @@ Previously tested code is unused now" */ span.tlaECB { text-align: left; - background-color: #000000; + background-color: #EEEEEE; } span.tlaBgECB { - background-color: #000000; + background-color: #EEEEEE; } a.tlaBgECB { - background-color: #000000; + background-color: #EEEEEE; color: #e4e4e4; } @@ -991,7 +991,7 @@ td.headerCovTableHeadECB { padding-bottom: 0px; font-family: sans-serif; white-space: nowrap; - background-color: #000000; + background-color: #EEEEEE; } /* Source code view/table entry backround: format for lines classified as "Deleted Uncovered Baseline (0 => -): @@ -999,10 +999,10 @@ Previously untested code has been deleted" */ td.tlaDUB { text-align: right; - background-color: #000000; + background-color: #EEEEEE; } td.tlaBgDUB { - background-color: #000000; + background-color: #EEEEEE; } /* Source code view/table entry backround: format for lines classified as "Deleted Uncovered Baseline (0 => -): @@ -1010,13 +1010,13 @@ Previously untested code has been deleted" */ span.tlaDUB { text-align: left; - background-color: #000000; + background-color: #EEEEEE; } span.tlaBgDUB { - background-color: #000000; + background-color: #EEEEEE; } a.tlaBgDUB { - background-color: #000000; + background-color: #EEEEEE; color: #e4e4e4; } @@ -1027,7 +1027,7 @@ td.headerCovTableHeadDUB { padding-bottom: 0px; font-family: sans-serif; white-space: nowrap; - background-color: #000000; + background-color: #EEEEEE; } /* Source code view/table entry backround: format for lines classified as "Deleted Covered Baseline (1 => -): @@ -1035,10 +1035,10 @@ Previously tested code has been deleted" */ td.tlaDCB { text-align: right; - background-color: #000000; + background-color: #EEEEEE; } td.tlaBgDCB { - background-color: #000000; + background-color: #EEEEEE; } /* Source code view/table entry backround: format for lines classified as "Deleted Covered Baseline (1 => -): @@ -1046,13 +1046,13 @@ Previously tested code has been deleted" */ span.tlaDCB { text-align: left; - background-color: #000000; + background-color: #EEEEEE; } span.tlaBgDCB { - background-color: #000000; + background-color: #EEEEEE; } a.tlaBgDCB { - background-color: #000000; + background-color: #EEEEEE; color: #e4e4e4; } @@ -1063,7 +1063,7 @@ td.headerCovTableHeadDCB { padding-bottom: 0px; font-family: sans-serif; white-space: nowrap; - background-color: #000000; + background-color: #EEEEEE; } /* Source code view: format for date/owner bin that is not hit */ diff --git a/html/lcov/export/index-sort-b.html b/html/lcov/export/index-sort-b.html index 22f84632..63bd5416 100644 --- a/html/lcov/export/index-sort-b.html +++ b/html/lcov/export/index-sort-b.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 96.4 % @@ -53,9 +53,9 @@ Branches: - 65.0 % - 6465 - 4200 + 64.6 % + 6547 + 4231 @@ -107,9 +107,9 @@ 84.6 % 13 11 - 45.6 % - 206 - 94 + 40.9 % + 254 + 104 100.0 % 1 1 @@ -212,9 +212,9 @@ 89.3 % 1314 1173 - 61.6 % + 61.7 % 1032 - 636 + 637 100.0 % 80 80 @@ -264,21 +264,6 @@ 67 64 - - mptcp/mptcp_diag.c - -
72.9%72.9%
- - 72.9 % - 133 - 97 - 64.3 % - 70 - 45 - 71.4 % - 7 - 5 - mptcp/sched.c @@ -294,6 +279,21 @@ 12 12 + + mptcp/mptcp_diag.c + +
73.7%73.7%
+ + 73.7 % + 133 + 98 + 68.6 % + 70 + 48 + 71.4 % + 7 + 5 + mptcp/protocol.c @@ -301,10 +301,10 @@ 91.4 % 2227 - 2035 - 69.0 % + 2036 + 68.7 % 1621 - 1118 + 1113 95.7 % 141 135 @@ -317,9 +317,9 @@ 94.9 % 234 222 - 70.9 % - 532 - 377 + 70.5 % + 566 + 399 100.0 % 35 35 @@ -372,11 +372,11 @@ mptcp/options.c -
98.4%98.4%
+
98.2%98.2%
- 98.4 % + 98.2 % 872 - 858 + 856 77.7 % 687 534 diff --git a/html/lcov/export/index-sort-f.html b/html/lcov/export/index-sort-f.html index bbb1e5f1..4005b0f5 100644 --- a/html/lcov/export/index-sort-f.html +++ b/html/lcov/export/index-sort-f.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 96.4 % @@ -53,9 +53,9 @@ Branches: - 65.0 % - 6465 - 4200 + 64.6 % + 6547 + 4231 @@ -117,14 +117,14 @@ mptcp/mptcp_diag.c -
72.9%72.9%
+
73.7%73.7%
- 72.9 % + 73.7 % 133 - 97 - 64.3 % + 98 + 68.6 % 70 - 45 + 48 71.4 % 7 5 @@ -181,10 +181,10 @@ 91.4 % 2227 - 2035 - 69.0 % + 2036 + 68.7 % 1621 - 1118 + 1113 95.7 % 141 135 @@ -212,9 +212,9 @@ 84.6 % 13 11 - 45.6 % - 206 - 94 + 40.9 % + 254 + 104 100.0 % 1 1 @@ -357,11 +357,11 @@ mptcp/options.c -
98.4%98.4%
+
98.2%98.2%
- 98.4 % + 98.2 % 872 - 858 + 856 77.7 % 687 534 @@ -392,9 +392,9 @@ 94.9 % 234 222 - 70.9 % - 532 - 377 + 70.5 % + 566 + 399 100.0 % 35 35 @@ -407,9 +407,9 @@ 89.3 % 1314 1173 - 61.6 % + 61.7 % 1032 - 636 + 637 100.0 % 80 80 diff --git a/html/lcov/export/index-sort-l.html b/html/lcov/export/index-sort-l.html index 6f5e8d32..dc92d9ac 100644 --- a/html/lcov/export/index-sort-l.html +++ b/html/lcov/export/index-sort-l.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 96.4 % @@ -53,9 +53,9 @@ Branches: - 65.0 % - 6465 - 4200 + 64.6 % + 6547 + 4231 @@ -117,14 +117,14 @@ mptcp/mptcp_diag.c -
72.9%72.9%
+
73.7%73.7%
- 72.9 % + 73.7 % 133 - 97 - 64.3 % + 98 + 68.6 % 70 - 45 + 48 71.4 % 7 5 @@ -182,9 +182,9 @@ 84.6 % 13 11 - 45.6 % - 206 - 94 + 40.9 % + 254 + 104 100.0 % 1 1 @@ -212,9 +212,9 @@ 89.3 % 1314 1173 - 61.6 % + 61.7 % 1032 - 636 + 637 100.0 % 80 80 @@ -256,10 +256,10 @@ 91.4 % 2227 - 2035 - 69.0 % + 2036 + 68.7 % 1621 - 1118 + 1113 95.7 % 141 135 @@ -287,9 +287,9 @@ 94.9 % 234 222 - 70.9 % - 532 - 377 + 70.5 % + 566 + 399 100.0 % 35 35 @@ -372,11 +372,11 @@ mptcp/options.c -
98.4%98.4%
+
98.2%98.2%
- 98.4 % + 98.2 % 872 - 858 + 856 77.7 % 687 534 diff --git a/html/lcov/export/index.html b/html/lcov/export/index.html index 87707ea2..411e5618 100644 --- a/html/lcov/export/index.html +++ b/html/lcov/export/index.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 96.4 % @@ -53,9 +53,9 @@ Branches: - 65.0 % - 6465 - 4200 + 64.6 % + 6547 + 4231 @@ -212,9 +212,9 @@ 84.6 % 13 11 - 45.6 % - 206 - 94 + 40.9 % + 254 + 104 100.0 % 1 1 @@ -222,14 +222,14 @@ mptcp/mptcp_diag.c -
72.9%72.9%
+
73.7%73.7%
- 72.9 % + 73.7 % 133 - 97 - 64.3 % + 98 + 68.6 % 70 - 45 + 48 71.4 % 7 5 @@ -237,11 +237,11 @@ mptcp/options.c -
98.4%98.4%
+
98.2%98.2%
- 98.4 % + 98.2 % 872 - 858 + 856 77.7 % 687 534 @@ -272,9 +272,9 @@ 89.3 % 1314 1173 - 61.6 % + 61.7 % 1032 - 636 + 637 100.0 % 80 80 @@ -301,10 +301,10 @@ 91.4 % 2227 - 2035 - 69.0 % + 2036 + 68.7 % 1621 - 1118 + 1113 95.7 % 141 135 @@ -317,9 +317,9 @@ 94.9 % 234 222 - 70.9 % - 532 - 377 + 70.5 % + 566 + 399 100.0 % 35 35 diff --git a/html/lcov/export/mptcp/bpf.c.func-c.html b/html/lcov/export/mptcp/bpf.c.func-c.html index b00f519b..3693a00a 100644 --- a/html/lcov/export/mptcp/bpf.c.func-c.html +++ b/html/lcov/export/mptcp/bpf.c.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 85.0 % @@ -151,7 +151,7 @@ bpf_mptcp_subflow_queues_empty - 10 + 12 @@ -214,7 +214,7 @@ bpf_mptcp_subflow_ctx_by_pos - 544457 + 545013 diff --git a/html/lcov/export/mptcp/bpf.c.func.html b/html/lcov/export/mptcp/bpf.c.func.html index b1e43f63..841099e9 100644 --- a/html/lcov/export/mptcp/bpf.c.func.html +++ b/html/lcov/export/mptcp/bpf.c.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 85.0 % @@ -207,14 +207,14 @@ bpf_mptcp_subflow_ctx_by_pos - 544457 + 545013 bpf_mptcp_subflow_queues_empty - 10 + 12 diff --git a/html/lcov/export/mptcp/bpf.c.gcov.html b/html/lcov/export/mptcp/bpf.c.gcov.html index 223e3996..6130681f 100644 --- a/html/lcov/export/mptcp/bpf.c.gcov.html +++ b/html/lcov/export/mptcp/bpf.c.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 85.0 % @@ -370,16 +370,16 @@ 291 : 6 : } 292 : : 293 : : __bpf_kfunc struct mptcp_subflow_context * - 294 : 544457 : bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int pos) + 294 : 545013 : bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int pos) 295 : : { - 296 [ + + ]: 544457 : if (pos >= MPTCP_SUBFLOWS_MAX) + 296 [ + + ]: 545013 : if (pos >= MPTCP_SUBFLOWS_MAX) 297 : : return NULL; - 298 : 544456 : return data->contexts[pos]; + 298 : 545012 : return data->contexts[pos]; 299 : : } 300 : : - 301 : 10 : __bpf_kfunc static bool bpf_mptcp_subflow_queues_empty(struct sock *sk) + 301 : 12 : __bpf_kfunc static bool bpf_mptcp_subflow_queues_empty(struct sock *sk) 302 : : { - 303 : 10 : return tcp_rtx_queue_empty(sk); + 303 : 12 : return tcp_rtx_queue_empty(sk); 304 : : } 305 : : 306 : : __bpf_kfunc_end_defs(); diff --git a/html/lcov/export/mptcp/crypto.c.func-c.html b/html/lcov/export/mptcp/crypto.c.func-c.html index 097a3d93..12862dbd 100644 --- a/html/lcov/export/mptcp/crypto.c.func-c.html +++ b/html/lcov/export/mptcp/crypto.c.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % @@ -88,7 +88,7 @@ mptcp_crypto_key_sha - 5985 + 5938 diff --git a/html/lcov/export/mptcp/crypto.c.func.html b/html/lcov/export/mptcp/crypto.c.func.html index d4dd409a..00bc813f 100644 --- a/html/lcov/export/mptcp/crypto.c.func.html +++ b/html/lcov/export/mptcp/crypto.c.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % @@ -88,7 +88,7 @@ mptcp_crypto_key_sha - 5985 + 5938 diff --git a/html/lcov/export/mptcp/crypto.c.gcov.html b/html/lcov/export/mptcp/crypto.c.gcov.html index 6a834e2a..96ef78d7 100644 --- a/html/lcov/export/mptcp/crypto.c.gcov.html +++ b/html/lcov/export/mptcp/crypto.c.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % @@ -106,18 +106,18 @@ 28 : : 29 : : #define SHA256_DIGEST_WORDS (SHA256_DIGEST_SIZE / 4) 30 : : - 31 : 5985 : void mptcp_crypto_key_sha(u64 key, u32 *token, u64 *idsn) + 31 : 5938 : void mptcp_crypto_key_sha(u64 key, u32 *token, u64 *idsn) 32 : : { - 33 : 5985 : __be32 mptcp_hashed_key[SHA256_DIGEST_WORDS]; - 34 : 5985 : __be64 input = cpu_to_be64(key); + 33 : 5938 : __be32 mptcp_hashed_key[SHA256_DIGEST_WORDS]; + 34 : 5938 : __be64 input = cpu_to_be64(key); 35 : : - 36 : 5985 : sha256((__force u8 *)&input, sizeof(input), (u8 *)mptcp_hashed_key); + 36 : 5938 : sha256((__force u8 *)&input, sizeof(input), (u8 *)mptcp_hashed_key); 37 : : - 38 [ + + ]: 5985 : if (token) - 39 : 3047 : *token = be32_to_cpu(mptcp_hashed_key[0]); - 40 [ + + ]: 5985 : if (idsn) - 41 : 5424 : *idsn = be64_to_cpu(*((__be64 *)&mptcp_hashed_key[6])); - 42 : 5985 : } + 38 [ + + ]: 5938 : if (token) + 39 : 3045 : *token = be32_to_cpu(mptcp_hashed_key[0]); + 40 [ + + ]: 5938 : if (idsn) + 41 : 5379 : *idsn = be64_to_cpu(*((__be64 *)&mptcp_hashed_key[6])); + 42 : 5938 : } 43 : : 44 : 2772 : void mptcp_crypto_hmac_sha(u64 key1, u64 key2, u8 *msg, int len, void *hmac) 45 : : { diff --git a/html/lcov/export/mptcp/crypto_test.c.func-c.html b/html/lcov/export/mptcp/crypto_test.c.func-c.html index 2d0ec0c5..2dde3875 100644 --- a/html/lcov/export/mptcp/crypto_test.c.func-c.html +++ b/html/lcov/export/mptcp/crypto_test.c.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % diff --git a/html/lcov/export/mptcp/crypto_test.c.func.html b/html/lcov/export/mptcp/crypto_test.c.func.html index 110b0068..b829878d 100644 --- a/html/lcov/export/mptcp/crypto_test.c.func.html +++ b/html/lcov/export/mptcp/crypto_test.c.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % diff --git a/html/lcov/export/mptcp/crypto_test.c.gcov.html b/html/lcov/export/mptcp/crypto_test.c.gcov.html index 00634520..16d14033 100644 --- a/html/lcov/export/mptcp/crypto_test.c.gcov.html +++ b/html/lcov/export/mptcp/crypto_test.c.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % diff --git a/html/lcov/export/mptcp/ctrl.c.func-c.html b/html/lcov/export/mptcp/ctrl.c.func-c.html index 0810c8bc..255587d1 100644 --- a/html/lcov/export/mptcp/ctrl.c.func-c.html +++ b/html/lcov/export/mptcp/ctrl.c.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % @@ -130,7 +130,7 @@ mptcp_stale_loss_cnt - 325 + 290 @@ -144,7 +144,7 @@ mptcp_active_detect_blackhole - 816 + 826 @@ -214,7 +214,7 @@ mptcp_close_timeout - 2924 + 2860 @@ -228,21 +228,21 @@ mptcp_allow_join_id0 - 4829 + 4823 mptcp_is_checksum_enabled - 6853 + 6854 mptcp_get_pernet - 12831 + 12790 diff --git a/html/lcov/export/mptcp/ctrl.c.func.html b/html/lcov/export/mptcp/ctrl.c.func.html index 1087eb9f..b5548255 100644 --- a/html/lcov/export/mptcp/ctrl.c.func.html +++ b/html/lcov/export/mptcp/ctrl.c.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % @@ -81,7 +81,7 @@ mptcp_active_detect_blackhole - 816 + 826 @@ -109,14 +109,14 @@ mptcp_allow_join_id0 - 4829 + 4823 mptcp_close_timeout - 2924 + 2860 @@ -130,7 +130,7 @@ mptcp_get_pernet - 12831 + 12790 @@ -158,7 +158,7 @@ mptcp_is_checksum_enabled - 6853 + 6854 @@ -214,7 +214,7 @@ mptcp_stale_loss_cnt - 325 + 290 diff --git a/html/lcov/export/mptcp/ctrl.c.gcov.html b/html/lcov/export/mptcp/ctrl.c.gcov.html index d6e5222e..6020ad88 100644 --- a/html/lcov/export/mptcp/ctrl.c.gcov.html +++ b/html/lcov/export/mptcp/ctrl.c.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % @@ -118,9 +118,9 @@ 40 : : char scheduler[MPTCP_SCHED_NAME_MAX]; 41 : : }; 42 : : - 43 : 12831 : static struct mptcp_pernet *mptcp_get_pernet(const struct net *net) + 43 : 12790 : static struct mptcp_pernet *mptcp_get_pernet(const struct net *net) 44 : : { - 45 : 12831 : return net_generic(net, mptcp_pernet_id); + 45 : 12790 : return net_generic(net, mptcp_pernet_id); 46 : : } 47 : : 48 : 2522 : int mptcp_is_enabled(const struct net *net) @@ -133,26 +133,26 @@ 55 : 392 : return mptcp_get_pernet(net)->add_addr_timeout; 56 : : } 57 : : - 58 : 6853 : int mptcp_is_checksum_enabled(const struct net *net) + 58 : 6854 : int mptcp_is_checksum_enabled(const struct net *net) 59 : : { - 60 : 6853 : return mptcp_get_pernet(net)->checksum_enabled; + 60 : 6854 : return mptcp_get_pernet(net)->checksum_enabled; 61 : : } 62 : : - 63 : 4829 : int mptcp_allow_join_id0(const struct net *net) + 63 : 4823 : int mptcp_allow_join_id0(const struct net *net) 64 : : { - 65 : 4829 : return mptcp_get_pernet(net)->allow_join_initial_addr_port; + 65 : 4823 : return mptcp_get_pernet(net)->allow_join_initial_addr_port; 66 : : } 67 : : - 68 : 325 : unsigned int mptcp_stale_loss_cnt(const struct net *net) + 68 : 290 : unsigned int mptcp_stale_loss_cnt(const struct net *net) 69 : : { - 70 : 325 : return mptcp_get_pernet(net)->stale_loss_cnt; + 70 : 290 : return mptcp_get_pernet(net)->stale_loss_cnt; 71 : : } 72 : : - 73 : 2924 : unsigned int mptcp_close_timeout(const struct sock *sk) + 73 : 2860 : unsigned int mptcp_close_timeout(const struct sock *sk) 74 : : { - 75 [ + + ]: 2924 : if (sock_flag(sk, SOCK_DEAD)) + 75 [ + + ]: 2860 : if (sock_flag(sk, SOCK_DEAD)) 76 : : return TCP_TIMEWAIT_LEN; - 77 : 112 : return mptcp_get_pernet(sock_net(sk))->close_timeout; + 77 : 114 : return mptcp_get_pernet(sock_net(sk))->close_timeout; 78 : : } 79 : : 80 : 3744 : int mptcp_get_pm_type(const struct net *net) @@ -467,24 +467,24 @@ 388 : 1118 : } 389 : : 390 : : /* Check the number of retransmissions, and fallback to TCP if needed */ - 391 : 816 : void mptcp_active_detect_blackhole(struct sock *ssk, bool expired) + 391 : 826 : void mptcp_active_detect_blackhole(struct sock *ssk, bool expired) 392 : : { - 393 : 816 : struct mptcp_subflow_context *subflow; - 394 : 816 : u32 timeouts; + 393 : 826 : struct mptcp_subflow_context *subflow; + 394 : 826 : u32 timeouts; 395 : : - 396 [ + + + - ]: 816 : if (!sk_is_mptcp(ssk)) + 396 [ + + + - ]: 826 : if (!sk_is_mptcp(ssk)) 397 : : return; 398 : : - 399 : 816 : timeouts = inet_csk(ssk)->icsk_retransmits; - 400 [ + + ]: 816 : subflow = mptcp_subflow_ctx(ssk); + 399 : 826 : timeouts = inet_csk(ssk)->icsk_retransmits; + 400 [ + + ]: 826 : subflow = mptcp_subflow_ctx(ssk); 401 : : - 402 [ + + + + ]: 816 : if (subflow->request_mptcp && ssk->sk_state == TCP_SYN_SENT) { - 403 [ + + + + ]: 30 : if (timeouts == 2 || (timeouts < 2 && expired)) { + 402 [ + + + + ]: 826 : if (subflow->request_mptcp && ssk->sk_state == TCP_SYN_SENT) { + 403 [ + + + + ]: 31 : if (timeouts == 2 || (timeouts < 2 && expired)) { 404 [ + - ]: 12 : MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_MPCAPABLEACTIVEDROP); 405 : 12 : subflow->mpc_drop = 1; 406 [ - + ]: 12 : mptcp_subflow_early_fallback(mptcp_sk(subflow->conn), subflow); 407 : : } else { - 408 : 18 : subflow->mpc_drop = 0; + 408 : 19 : subflow->mpc_drop = 0; 409 : : } 410 : : } 411 : : } diff --git a/html/lcov/export/mptcp/diag.c.func-c.html b/html/lcov/export/mptcp/diag.c.func-c.html index 7c89ceb3..22b66cd1 100644 --- a/html/lcov/export/mptcp/diag.c.func-c.html +++ b/html/lcov/export/mptcp/diag.c.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 66.7 % diff --git a/html/lcov/export/mptcp/diag.c.func.html b/html/lcov/export/mptcp/diag.c.func.html index 615b10ce..a1bb8ff4 100644 --- a/html/lcov/export/mptcp/diag.c.func.html +++ b/html/lcov/export/mptcp/diag.c.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 66.7 % diff --git a/html/lcov/export/mptcp/diag.c.gcov.html b/html/lcov/export/mptcp/diag.c.gcov.html index 0ed90ab5..aa6f38aa 100644 --- a/html/lcov/export/mptcp/diag.c.gcov.html +++ b/html/lcov/export/mptcp/diag.c.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 66.7 % diff --git a/html/lcov/export/mptcp/fastopen.c.func-c.html b/html/lcov/export/mptcp/fastopen.c.func-c.html index fb3cadbe..e156fcc2 100644 --- a/html/lcov/export/mptcp/fastopen.c.func-c.html +++ b/html/lcov/export/mptcp/fastopen.c.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % diff --git a/html/lcov/export/mptcp/fastopen.c.func.html b/html/lcov/export/mptcp/fastopen.c.func.html index b5a8bc14..9368a615 100644 --- a/html/lcov/export/mptcp/fastopen.c.func.html +++ b/html/lcov/export/mptcp/fastopen.c.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % diff --git a/html/lcov/export/mptcp/fastopen.c.gcov.html b/html/lcov/export/mptcp/fastopen.c.gcov.html index 21dc4a0f..275e27f4 100644 --- a/html/lcov/export/mptcp/fastopen.c.gcov.html +++ b/html/lcov/export/mptcp/fastopen.c.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % diff --git a/html/lcov/export/mptcp/mib.c.func-c.html b/html/lcov/export/mptcp/mib.c.func-c.html index 9978f838..8130ae09 100644 --- a/html/lcov/export/mptcp/mib.c.func-c.html +++ b/html/lcov/export/mptcp/mib.c.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % diff --git a/html/lcov/export/mptcp/mib.c.func.html b/html/lcov/export/mptcp/mib.c.func.html index 8d97a955..4f4902d6 100644 --- a/html/lcov/export/mptcp/mib.c.func.html +++ b/html/lcov/export/mptcp/mib.c.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % diff --git a/html/lcov/export/mptcp/mib.c.gcov.html b/html/lcov/export/mptcp/mib.c.gcov.html index 53725bb4..0ae820c8 100644 --- a/html/lcov/export/mptcp/mib.c.gcov.html +++ b/html/lcov/export/mptcp/mib.c.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % diff --git a/html/lcov/export/mptcp/mib.h.func-c.html b/html/lcov/export/mptcp/mib.h.func-c.html index 59bf0418..fb37635a 100644 --- a/html/lcov/export/mptcp/mib.h.func-c.html +++ b/html/lcov/export/mptcp/mib.h.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % @@ -56,9 +56,9 @@ Branches: - 45.6 % - 206 - 94 + 40.9 % + 254 + 104 diff --git a/html/lcov/export/mptcp/mib.h.func.html b/html/lcov/export/mptcp/mib.h.func.html index cf92fe41..3126df39 100644 --- a/html/lcov/export/mptcp/mib.h.func.html +++ b/html/lcov/export/mptcp/mib.h.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % @@ -56,9 +56,9 @@ Branches: - 45.6 % - 206 - 94 + 40.9 % + 254 + 104 diff --git a/html/lcov/export/mptcp/mib.h.gcov.html b/html/lcov/export/mptcp/mib.h.gcov.html index 2b485a1c..b688dab3 100644 --- a/html/lcov/export/mptcp/mib.h.gcov.html +++ b/html/lcov/export/mptcp/mib.h.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % @@ -56,9 +56,9 @@ Branches: - 45.6 % - 206 - 94 + 40.9 % + 254 + 104 @@ -178,47 +178,56 @@ 99 : 0 : static inline void MPTCP_INC_STATS(struct net *net, 100 : : enum linux_mptcp_mib_field field) 101 : : { - 102 [ + - + - : 279193 : if (likely(net->mib.mptcp_statistics)) - + - + - + + 102 [ + - + - : 325238 : if (likely(net->mib.mptcp_statistics)) + + - + - + - + - - - - - + - - + - - + - - + - + - + - - + - - - - + - + - + - - + - + - + + - + - + + - + - - - + + - + - + + - + - + - + - - - - - - - + - + - + - ] - [ + - # # ] - [ + - + - - - - + - + - - + - + - - + - + - + - - + - - - - + - + - + - - + - + - - + - + - + - - + - + - - + - ] + [ + - - - + - - + - + + - - - + - + - - - - - + - + - - - + + - + - + + - - - ][ + + - + - - - + + - + - + + - + - + - + + - + - + + - - - + - + + - + - + + - + - + - + + - + - + + - + - + - + - - - - - + - - - - - + - - ] [ + - + - ] - [ + - + - - - + + - + - - + - + - - + - + - + - - + - + - - + - + - + - - + - + - - + - + - - + [ + - - - + - + + - + + - + - + - + + - + - + + - + - + - + + - + - + + - + - + - + + - + - - - - - + - - - ] - 103 [ - + - + : 229328 : SNMP_INC_STATS(net->mib.mptcp_statistics, field); - - + - + + - + + + + - + ][ - + + - + + + ][ - - + + + + - + ] + 103 [ - + - + : 234636 : SNMP_INC_STATS(net->mib.mptcp_statistics, field); + - + - + + + + + + + + + ][ - + + + + + + - + + - + - + - + + ][ - + + + + + + ] 104 : : } 105 : : 106 : 0 : static inline void __MPTCP_INC_STATS(struct net *net, diff --git a/html/lcov/export/mptcp/mptcp_diag.c.func-c.html b/html/lcov/export/mptcp/mptcp_diag.c.func-c.html index 36219f27..449d55e7 100644 --- a/html/lcov/export/mptcp/mptcp_diag.c.func-c.html +++ b/html/lcov/export/mptcp/mptcp_diag.c.func-c.html @@ -31,13 +31,13 @@ export Lines: - 72.9 % + 73.7 % 133 - 97 + 98 Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 71.4 % @@ -56,9 +56,9 @@ Branches: - 64.3 % + 68.6 % 70 - 45 + 48 @@ -102,14 +102,14 @@ mptcp_diag_dump_listeners - 67 + 68 mptcp_diag_dump - 731 + 732 @@ -123,7 +123,7 @@ sk_diag_dump - 1333 + 1334 diff --git a/html/lcov/export/mptcp/mptcp_diag.c.func.html b/html/lcov/export/mptcp/mptcp_diag.c.func.html index 8b04b101..e982cd8d 100644 --- a/html/lcov/export/mptcp/mptcp_diag.c.func.html +++ b/html/lcov/export/mptcp/mptcp_diag.c.func.html @@ -31,13 +31,13 @@ export Lines: - 72.9 % + 73.7 % 133 - 97 + 98 Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 71.4 % @@ -56,9 +56,9 @@ Branches: - 64.3 % + 68.6 % 70 - 45 + 48 @@ -81,14 +81,14 @@ mptcp_diag_dump - 731 + 732 mptcp_diag_dump_listeners - 67 + 68 @@ -123,7 +123,7 @@ sk_diag_dump - 1333 + 1334 diff --git a/html/lcov/export/mptcp/mptcp_diag.c.gcov.html b/html/lcov/export/mptcp/mptcp_diag.c.gcov.html index 13928574..05d6fdfd 100644 --- a/html/lcov/export/mptcp/mptcp_diag.c.gcov.html +++ b/html/lcov/export/mptcp/mptcp_diag.c.gcov.html @@ -31,13 +31,13 @@ export Lines: - 72.9 % + 73.7 % 133 - 97 + 98 Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 71.4 % @@ -56,9 +56,9 @@ Branches: - 64.3 % + 68.6 % 70 - 45 + 48 @@ -90,15 +90,15 @@ 12 : : #include <net/netlink.h> 13 : : #include "protocol.h" 14 : : - 15 : 1333 : static int sk_diag_dump(struct sock *sk, struct sk_buff *skb, + 15 : 1334 : static int sk_diag_dump(struct sock *sk, struct sk_buff *skb, 16 : : struct netlink_callback *cb, 17 : : const struct inet_diag_req_v2 *req, 18 : : struct nlattr *bc, bool net_admin) 19 : : { - 20 [ + + ]: 1333 : if (!inet_diag_bc_sk(bc, sk)) + 20 [ + + ]: 1334 : if (!inet_diag_bc_sk(bc, sk)) 21 : : return 0; 22 : : - 23 : 1319 : return inet_sk_diag_fill(sk, inet_csk(sk), skb, cb, req, NLM_F_MULTI, + 23 : 1320 : return inet_sk_diag_fill(sk, inet_csk(sk), skb, cb, req, NLM_F_MULTI, 24 : : net_admin); 25 : : } 26 : : @@ -150,70 +150,70 @@ 72 : : unsigned int l_num; 73 : : }; 74 : : - 75 : 67 : static void mptcp_diag_dump_listeners(struct sk_buff *skb, struct netlink_callback *cb, + 75 : 68 : static void mptcp_diag_dump_listeners(struct sk_buff *skb, struct netlink_callback *cb, 76 : : const struct inet_diag_req_v2 *r, 77 : : bool net_admin) 78 : : { - 79 : 67 : struct inet_diag_dump_data *cb_data = cb->data; - 80 : 67 : struct mptcp_diag_ctx *diag_ctx = (void *)cb->ctx; - 81 : 67 : struct nlattr *bc = cb_data->inet_diag_nla_bc; - 82 : 67 : struct net *net = sock_net(skb->sk); - 83 : 67 : struct inet_hashinfo *hinfo; - 84 : 67 : int i; + 79 : 68 : struct inet_diag_dump_data *cb_data = cb->data; + 80 : 68 : struct mptcp_diag_ctx *diag_ctx = (void *)cb->ctx; + 81 : 68 : struct nlattr *bc = cb_data->inet_diag_nla_bc; + 82 : 68 : struct net *net = sock_net(skb->sk); + 83 : 68 : struct inet_hashinfo *hinfo; + 84 : 68 : int i; 85 : : - 86 : 67 : hinfo = net->ipv4.tcp_death_row.hashinfo; + 86 : 68 : hinfo = net->ipv4.tcp_death_row.hashinfo; 87 : : - 88 [ + + ]: 102467 : for (i = diag_ctx->l_slot; i <= hinfo->lhash2_mask; i++) { - 89 : 102406 : struct inet_listen_hashbucket *ilb; - 90 : 102406 : struct hlist_nulls_node *node; - 91 : 102406 : struct sock *sk; - 92 : 102406 : int num = 0; + 88 [ + + ]: 102468 : for (i = diag_ctx->l_slot; i <= hinfo->lhash2_mask; i++) { + 89 : 102407 : struct inet_listen_hashbucket *ilb; + 90 : 102407 : struct hlist_nulls_node *node; + 91 : 102407 : struct sock *sk; + 92 : 102407 : int num = 0; 93 : : - 94 : 102406 : ilb = &hinfo->lhash2[i]; + 94 : 102407 : ilb = &hinfo->lhash2[i]; 95 : : - 96 : 102406 : rcu_read_lock(); - 97 : 102406 : spin_lock(&ilb->lock); - 98 [ + + ]: 103030 : sk_nulls_for_each(sk, node, &ilb->nulls_head) { - 99 [ - + ]: 630 : const struct mptcp_subflow_context *ctx = mptcp_subflow_ctx(sk); - 100 : 630 : struct inet_sock *inet = inet_sk(sk); - 101 : 630 : int ret; + 96 : 102407 : rcu_read_lock(); + 97 : 102407 : spin_lock(&ilb->lock); + 98 [ + + ]: 103055 : sk_nulls_for_each(sk, node, &ilb->nulls_head) { + 99 [ - + ]: 655 : const struct mptcp_subflow_context *ctx = mptcp_subflow_ctx(sk); + 100 : 655 : struct inet_sock *inet = inet_sk(sk); + 101 : 655 : int ret; 102 : : - 103 [ - + ]: 630 : if (num < diag_ctx->l_num) + 103 [ - + ]: 655 : if (num < diag_ctx->l_num) 104 : 0 : goto next_listen; 105 : : - 106 [ + - - + ]: 630 : if (!ctx || strcmp(inet_csk(sk)->icsk_ulp_ops->name, "mptcp")) - 107 : 0 : goto next_listen; + 106 [ + + - + ]: 655 : if (!ctx || strcmp(inet_csk(sk)->icsk_ulp_ops->name, "mptcp")) + 107 : 4 : goto next_listen; 108 : : - 109 : 630 : sk = ctx->conn; - 110 [ + - + + ]: 940 : if (!sk || !net_eq(sock_net(sk), net)) + 109 : 651 : sk = ctx->conn; + 110 [ + - + + ]: 965 : if (!sk || !net_eq(sock_net(sk), net)) 111 : 4 : goto next_listen; 112 : : - 113 [ + - ]: 626 : if (r->sdiag_family != AF_UNSPEC && - 114 [ + + ]: 626 : sk->sk_family != r->sdiag_family) - 115 : 309 : goto next_listen; + 113 [ + - ]: 647 : if (r->sdiag_family != AF_UNSPEC && + 114 [ + + ]: 647 : sk->sk_family != r->sdiag_family) + 115 : 319 : goto next_listen; 116 : : - 117 [ + - - + ]: 317 : if (r->id.idiag_sport != inet->inet_sport && + 117 [ + - - + ]: 328 : if (r->id.idiag_sport != inet->inet_sport && 118 : : r->id.idiag_sport) 119 : 0 : goto next_listen; 120 : : - 121 [ - + ]: 317 : if (!refcount_inc_not_zero(&sk->sk_refcnt)) + 121 [ - + ]: 328 : if (!refcount_inc_not_zero(&sk->sk_refcnt)) 122 : 0 : goto next_listen; 123 : : - 124 : 317 : ret = sk_diag_dump(sk, skb, cb, r, bc, net_admin); + 124 : 328 : ret = sk_diag_dump(sk, skb, cb, r, bc, net_admin); 125 : : - 126 : 317 : sock_put(sk); + 126 : 328 : sock_put(sk); 127 : : - 128 [ + + ]: 317 : if (ret < 0) { - 129 : 6 : spin_unlock(&ilb->lock); - 130 : 6 : rcu_read_unlock(); - 131 : 6 : diag_ctx->l_slot = i; - 132 : 6 : diag_ctx->l_num = num; - 133 : 6 : return; + 128 [ + + ]: 328 : if (ret < 0) { + 129 : 7 : spin_unlock(&ilb->lock); + 130 : 7 : rcu_read_unlock(); + 131 : 7 : diag_ctx->l_slot = i; + 132 : 7 : diag_ctx->l_num = num; + 133 : 7 : return; 134 : : } - 135 : 311 : diag_ctx->l_num = num + 1; - 136 : 311 : num = 0; - 137 : 624 : next_listen: - 138 : 624 : ++num; + 135 : 321 : diag_ctx->l_num = num + 1; + 136 : 321 : num = 0; + 137 : 648 : next_listen: + 138 : 648 : ++num; 139 : : } 140 : 102400 : spin_unlock(&ilb->lock); 141 : 102400 : rcu_read_unlock(); @@ -226,53 +226,53 @@ 148 : 61 : diag_ctx->l_slot = i; 149 : : } 150 : : - 151 : 731 : static void mptcp_diag_dump(struct sk_buff *skb, struct netlink_callback *cb, + 151 : 732 : static void mptcp_diag_dump(struct sk_buff *skb, struct netlink_callback *cb, 152 : : const struct inet_diag_req_v2 *r) 153 : : { - 154 : 731 : bool net_admin = netlink_net_capable(cb->skb, CAP_NET_ADMIN); - 155 : 731 : struct mptcp_diag_ctx *diag_ctx = (void *)cb->ctx; - 156 : 731 : struct net *net = sock_net(skb->sk); - 157 : 731 : struct inet_diag_dump_data *cb_data; - 158 : 731 : struct mptcp_sock *msk; - 159 : 731 : struct nlattr *bc; + 154 : 732 : bool net_admin = netlink_net_capable(cb->skb, CAP_NET_ADMIN); + 155 : 732 : struct mptcp_diag_ctx *diag_ctx = (void *)cb->ctx; + 156 : 732 : struct net *net = sock_net(skb->sk); + 157 : 732 : struct inet_diag_dump_data *cb_data; + 158 : 732 : struct mptcp_sock *msk; + 159 : 732 : struct nlattr *bc; 160 : : - 161 : 731 : BUILD_BUG_ON(sizeof(cb->ctx) < sizeof(*diag_ctx)); + 161 : 732 : BUILD_BUG_ON(sizeof(cb->ctx) < sizeof(*diag_ctx)); 162 : : - 163 : 731 : cb_data = cb->data; - 164 : 731 : bc = cb_data->inet_diag_nla_bc; + 163 : 732 : cb_data = cb->data; + 164 : 732 : bc = cb_data->inet_diag_nla_bc; 165 : : - 166 : 731 : while ((msk = mptcp_token_iter_next(net, &diag_ctx->s_slot, - 167 [ + + ]: 3551 : &diag_ctx->s_num)) != NULL) { - 168 : 2832 : struct inet_sock *inet = (struct inet_sock *)msk; - 169 : 2832 : struct sock *sk = (struct sock *)msk; - 170 : 2832 : int ret = 0; + 166 : 732 : while ((msk = mptcp_token_iter_next(net, &diag_ctx->s_slot, + 167 [ + + ]: 3532 : &diag_ctx->s_num)) != NULL) { + 168 : 2812 : struct inet_sock *inet = (struct inet_sock *)msk; + 169 : 2812 : struct sock *sk = (struct sock *)msk; + 170 : 2812 : int ret = 0; 171 : : - 172 [ + + + + ]: 2832 : if (!(r->idiag_states & (1 << sk->sk_state))) + 172 [ + + + + ]: 2812 : if (!(r->idiag_states & (1 << sk->sk_state))) 173 : 812 : goto next; - 174 [ + - ]: 2020 : if (r->sdiag_family != AF_UNSPEC && - 175 [ + + ]: 2020 : sk->sk_family != r->sdiag_family) - 176 : 1004 : goto next; - 177 [ + - - + ]: 1016 : if (r->id.idiag_sport != inet->inet_sport && + 174 [ + - ]: 2000 : if (r->sdiag_family != AF_UNSPEC && + 175 [ + + ]: 2000 : sk->sk_family != r->sdiag_family) + 176 : 994 : goto next; + 177 [ + + - + ]: 1006 : if (r->id.idiag_sport != inet->inet_sport && 178 : : r->id.idiag_sport) 179 : 0 : goto next; - 180 [ + - - + ]: 1016 : if (r->id.idiag_dport != inet->inet_dport && + 180 [ + + - + ]: 1006 : if (r->id.idiag_dport != inet->inet_dport && 181 : : r->id.idiag_dport) 182 : 0 : goto next; 183 : : - 184 : 1016 : ret = sk_diag_dump(sk, skb, cb, r, bc, net_admin); - 185 : 2832 : next: - 186 : 2832 : sock_put(sk); - 187 [ + + ]: 2832 : if (ret < 0) { + 184 : 1006 : ret = sk_diag_dump(sk, skb, cb, r, bc, net_admin); + 185 : 2812 : next: + 186 : 2812 : sock_put(sk); + 187 [ + + ]: 2812 : if (ret < 0) { 188 : : /* will retry on the same position */ 189 : 12 : diag_ctx->s_num--; 190 : 12 : break; 191 : : } - 192 : 2820 : cond_resched(); + 192 : 2800 : cond_resched(); 193 : : } 194 : : - 195 [ + + + - ]: 731 : if ((r->idiag_states & TCPF_LISTEN) && r->id.idiag_dport == 0) - 196 : 67 : mptcp_diag_dump_listeners(skb, cb, r, net_admin); - 197 : 731 : } + 195 [ + + + - ]: 732 : if ((r->idiag_states & TCPF_LISTEN) && r->id.idiag_dport == 0) + 196 : 68 : mptcp_diag_dump_listeners(skb, cb, r, net_admin); + 197 : 732 : } 198 : : 199 : 1301 : static void mptcp_diag_get_info(struct sock *sk, struct inet_diag_msg *r, 200 : : void *_info) @@ -283,22 +283,22 @@ 205 : 1301 : r->idiag_rqueue = sk_rmem_alloc_get(sk); 206 : 1301 : r->idiag_wqueue = sk_wmem_alloc_get(sk); 207 : : - 208 [ + + ]: 1301 : if (inet_sk_state_load(sk) == TCP_LISTEN) { - 209 : 309 : struct sock *lsk = READ_ONCE(msk->first); + 208 [ + + ]: 1301 : if (inet_sk_state_load(sk) == TCP_LISTEN) { + 209 : 319 : struct sock *lsk = READ_ONCE(msk->first); 210 : : - 211 [ + - ]: 309 : if (lsk) { + 211 [ + - ]: 319 : if (lsk) { 212 : : /* override with settings from tcp listener, 213 : : * so Send-Q will show accept queue. 214 : : */ - 215 : 309 : r->idiag_rqueue = READ_ONCE(lsk->sk_ack_backlog); - 216 : 309 : r->idiag_wqueue = READ_ONCE(lsk->sk_max_ack_backlog); + 215 : 319 : r->idiag_rqueue = READ_ONCE(lsk->sk_ack_backlog); + 216 : 319 : r->idiag_wqueue = READ_ONCE(lsk->sk_max_ack_backlog); 217 : : } 218 : : } 219 : : - 220 [ + + ]: 1301 : if (!info) + 220 [ + + ]: 1301 : if (!info) 221 : : return; 222 : : - 223 : 992 : mptcp_diag_fill_info(msk, info); + 223 : 982 : mptcp_diag_fill_info(msk, info); 224 : : } 225 : : 226 : : static const struct inet_diag_handler mptcp_diag_handler = { diff --git a/html/lcov/export/mptcp/options.c.func-c.html b/html/lcov/export/mptcp/options.c.func-c.html index 47f07f28..2a8eee1a 100644 --- a/html/lcov/export/mptcp/options.c.func-c.html +++ b/html/lcov/export/mptcp/options.c.func-c.html @@ -31,13 +31,13 @@ export Lines: - 98.4 % + 98.2 % 872 - 858 + 856 Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % @@ -88,14 +88,14 @@ mptcp_established_options_fastclose - 433 + 430 mptcp_established_options_rst - 433 + 430 @@ -123,147 +123,147 @@ mptcp_synack_options - 1779 + 1787 mptcp_syn_options - 1859 + 1861 mptcp_make_csum - 1928 + 1902 __mptcp_make_csum - 2068 + 2043 mptcp_update_rcv_data_fin - 9627 + 6991 mptcp_write_data_fin - 25893 + 24742 __mptcp_expand_seq - 133771 + 157587 mptcp_set_rwin - 649633 + 883054 mptcp_write_options - 651773 + 885199 ack_update_msk - 776804 + 1072722 check_fully_established - 780307 + 1076175 mptcp_get_options - 785522 + 1081390 mptcp_parse_option - 785613 + 1081475 mptcp_incoming_options - 787815 + 1090052 mptcp_established_options_dss - 1575391 + 2215495 mptcp_established_options_mp_fail - 1575461 + 2215567 mptcp_established_options_rm_addr - 1576853 + 2216953 mptcp_established_options_add_addr - 1577608 + 2217708 mptcp_established_options_mp_prio - 1577608 + 2217708 mptcp_established_options_mp - 1577612 + 2217712 mptcp_established_options - 1605363 + 2284954 diff --git a/html/lcov/export/mptcp/options.c.func.html b/html/lcov/export/mptcp/options.c.func.html index 842ee6ec..f2620c3f 100644 --- a/html/lcov/export/mptcp/options.c.func.html +++ b/html/lcov/export/mptcp/options.c.func.html @@ -31,13 +31,13 @@ export Lines: - 98.4 % + 98.2 % 872 - 858 + 856 Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % @@ -81,21 +81,21 @@ __mptcp_expand_seq - 133771 + 157587 __mptcp_make_csum - 2068 + 2043 ack_update_msk - 776804 + 1072722 @@ -116,7 +116,7 @@ check_fully_established - 780307 + 1076175 @@ -130,70 +130,70 @@ mptcp_established_options - 1605363 + 2284954 mptcp_established_options_add_addr - 1577608 + 2217708 mptcp_established_options_dss - 1575391 + 2215495 mptcp_established_options_fastclose - 433 + 430 mptcp_established_options_mp - 1577612 + 2217712 mptcp_established_options_mp_fail - 1575461 + 2215567 mptcp_established_options_mp_prio - 1577608 + 2217708 mptcp_established_options_rm_addr - 1576853 + 2216953 mptcp_established_options_rst - 433 + 430 mptcp_get_options - 785522 + 1081390 @@ -207,63 +207,63 @@ mptcp_incoming_options - 787815 + 1090052 mptcp_make_csum - 1928 + 1902 mptcp_parse_option - 785613 + 1081475 mptcp_set_rwin - 649633 + 883054 mptcp_syn_options - 1859 + 1861 mptcp_synack_options - 1779 + 1787 mptcp_update_rcv_data_fin - 9627 + 6991 mptcp_write_data_fin - 25893 + 24742 mptcp_write_options - 651773 + 885199 diff --git a/html/lcov/export/mptcp/options.c.gcov.html b/html/lcov/export/mptcp/options.c.gcov.html index f13afaf5..c145d99f 100644 --- a/html/lcov/export/mptcp/options.c.gcov.html +++ b/html/lcov/export/mptcp/options.c.gcov.html @@ -31,13 +31,13 @@ export Lines: - 98.4 % + 98.2 % 872 - 858 + 856 Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % @@ -98,27 +98,27 @@ 20 : : return (flags & MPTCP_CAP_FLAG_MASK) == MPTCP_CAP_HMAC_SHA256; 21 : : } 22 : : - 23 : 785613 : static void mptcp_parse_option(const struct sk_buff *skb, + 23 : 1081475 : static void mptcp_parse_option(const struct sk_buff *skb, 24 : : const unsigned char *ptr, int opsize, 25 : : struct mptcp_options_received *mp_opt) 26 : : { - 27 : 785613 : u8 subtype = *ptr >> 4; - 28 : 785613 : int expected_opsize; - 29 : 785613 : u16 subopt; - 30 : 785613 : u8 version; - 31 : 785613 : u8 flags; - 32 : 785613 : u8 i; + 27 : 1081475 : u8 subtype = *ptr >> 4; + 28 : 1081475 : int expected_opsize; + 29 : 1081475 : u16 subopt; + 30 : 1081475 : u8 version; + 31 : 1081475 : u8 flags; + 32 : 1081475 : u8 i; 33 : : - 34 [ + + + + : 785613 : switch (subtype) { - + + + + + + 34 [ + + + + : 1081475 : switch (subtype) { + + + + + + - ] - 35 : 5364 : case MPTCPOPT_MP_CAPABLE: + 35 : 5320 : case MPTCPOPT_MP_CAPABLE: 36 : : /* strict size checking */ - 37 [ + + ]: 5364 : if (!(TCP_SKB_CB(skb)->tcp_flags & TCPHDR_SYN)) { - 38 [ + + ]: 2984 : if (skb->len > tcp_hdr(skb)->doff << 2) + 37 [ + + ]: 5320 : if (!(TCP_SKB_CB(skb)->tcp_flags & TCPHDR_SYN)) { + 38 [ + + ]: 2940 : if (skb->len > tcp_hdr(skb)->doff << 2) 39 : : expected_opsize = TCPOLEN_MPTCP_MPC_ACK_DATA; 40 : : else - 41 : 2308 : expected_opsize = TCPOLEN_MPTCP_MPC_ACK; + 41 : 2309 : expected_opsize = TCPOLEN_MPTCP_MPC_ACK; 42 : : subopt = OPTION_MPTCP_MPC_ACK; 43 : : } else { 44 [ + + ]: 2380 : if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_ACK) { @@ -140,22 +140,22 @@ 60 : : * We parse even option with mismatching csum presence, so that 61 : : * later in subflow_data_ready we can trigger the reset. 62 : : */ - 63 [ + + ]: 5364 : if (opsize != expected_opsize && + 63 [ + + ]: 5320 : if (opsize != expected_opsize && 64 : 16 : (expected_opsize != TCPOLEN_MPTCP_MPC_ACK_DATA || 65 [ + + ]: 16 : opsize != TCPOLEN_MPTCP_MPC_ACK_DATA_CSUM)) 66 : : break; 67 : : 68 : : /* try to be gentle vs future versions on the initial syn */ - 69 : 5352 : version = *ptr++ & MPTCP_VERSION_MASK; - 70 [ + + ]: 5352 : if (opsize != TCPOLEN_MPTCP_MPC_SYN) { - 71 [ + + ]: 4114 : if (version != MPTCP_SUPPORTED_VERSION) + 69 : 5308 : version = *ptr++ & MPTCP_VERSION_MASK; + 70 [ + + ]: 5308 : if (opsize != TCPOLEN_MPTCP_MPC_SYN) { + 71 [ + + ]: 4070 : if (version != MPTCP_SUPPORTED_VERSION) 72 : : break; 73 [ + - ]: 1238 : } else if (version < MPTCP_SUPPORTED_VERSION) { 74 : : break; 75 : : } 76 : : - 77 : 5346 : flags = *ptr++; - 78 [ + + + + ]: 5346 : if (!mptcp_cap_flag_sha256(flags) || + 77 : 5302 : flags = *ptr++; + 78 [ + + + + ]: 5302 : if (!mptcp_cap_flag_sha256(flags) || 79 : : (flags & MPTCP_CAP_EXTENSIBILITY)) 80 : : break; 81 : : @@ -165,45 +165,45 @@ 85 : : * In other words, the only way for checksums not to be used 86 : : * is if both hosts in their SYNs set A=0." 87 : : */ - 88 [ + + ]: 5310 : if (flags & MPTCP_CAP_CHECKSUM_REQD) + 88 [ + + ]: 5266 : if (flags & MPTCP_CAP_CHECKSUM_REQD) 89 : 40 : mp_opt->suboptions |= OPTION_MPTCP_CSUMREQD; 90 : : - 91 : 5310 : mp_opt->deny_join_id0 = !!(flags & MPTCP_CAP_DENY_JOIN_ID0); + 91 : 5266 : mp_opt->deny_join_id0 = !!(flags & MPTCP_CAP_DENY_JOIN_ID0); 92 : : - 93 : 5310 : mp_opt->suboptions |= subopt; - 94 [ + + ]: 5310 : if (opsize >= TCPOLEN_MPTCP_MPC_SYNACK) { - 95 [ + + ]: 4084 : mp_opt->sndr_key = get_unaligned_be64(ptr); - 96 : 4084 : ptr += 8; + 93 : 5266 : mp_opt->suboptions |= subopt; + 94 [ + + ]: 5266 : if (opsize >= TCPOLEN_MPTCP_MPC_SYNACK) { + 95 [ + + ]: 4040 : mp_opt->sndr_key = get_unaligned_be64(ptr); + 96 : 4040 : ptr += 8; 97 : : } - 98 [ + + ]: 4084 : if (opsize >= TCPOLEN_MPTCP_MPC_ACK) { - 99 : 2966 : mp_opt->rcvr_key = get_unaligned_be64(ptr); - 100 : 2966 : ptr += 8; + 98 [ + + ]: 4040 : if (opsize >= TCPOLEN_MPTCP_MPC_ACK) { + 99 : 2922 : mp_opt->rcvr_key = get_unaligned_be64(ptr); + 100 : 2922 : ptr += 8; 101 : : } - 102 [ + + ]: 4192 : if (opsize >= TCPOLEN_MPTCP_MPC_ACK_DATA) { + 102 [ + + ]: 4148 : if (opsize >= TCPOLEN_MPTCP_MPC_ACK_DATA) { 103 : : /* Section 3.1.: 104 : : * "the data parameters in a MP_CAPABLE are semantically 105 : : * equivalent to those in a DSS option and can be used 106 : : * interchangeably." 107 : : */ - 108 : 676 : mp_opt->suboptions |= OPTION_MPTCP_DSS; - 109 : 676 : mp_opt->use_map = 1; - 110 : 676 : mp_opt->mpc_map = 1; - 111 : 676 : mp_opt->use_ack = 0; - 112 [ + + ]: 676 : mp_opt->data_len = get_unaligned_be16(ptr); - 113 : 676 : ptr += 2; + 108 : 631 : mp_opt->suboptions |= OPTION_MPTCP_DSS; + 109 : 631 : mp_opt->use_map = 1; + 110 : 631 : mp_opt->mpc_map = 1; + 111 : 631 : mp_opt->use_ack = 0; + 112 [ + + ]: 631 : mp_opt->data_len = get_unaligned_be16(ptr); + 113 : 631 : ptr += 2; 114 : : } - 115 [ + + ]: 676 : if (opsize == TCPOLEN_MPTCP_MPC_ACK_DATA_CSUM) { + 115 [ + + ]: 631 : if (opsize == TCPOLEN_MPTCP_MPC_ACK_DATA_CSUM) { 116 : 4 : mp_opt->csum = get_unaligned((__force __sum16 *)ptr); 117 : 4 : mp_opt->suboptions |= OPTION_MPTCP_CSUMREQD; 118 : 4 : ptr += 2; 119 : : } - 120 [ - + ]: 5310 : pr_debug("MP_CAPABLE version=%x, flags=%x, optlen=%d sndr=%llu, rcvr=%llu len=%d csum=%u\n", + 120 [ - + ]: 5266 : pr_debug("MP_CAPABLE version=%x, flags=%x, optlen=%d sndr=%llu, rcvr=%llu len=%d csum=%u\n", 121 : : version, flags, opsize, mp_opt->sndr_key, 122 : : mp_opt->rcvr_key, mp_opt->data_len, mp_opt->csum); 123 : : break; 124 : : - 125 : 2048 : case MPTCPOPT_MP_JOIN: - 126 [ + + ]: 2048 : if (opsize == TCPOLEN_MPTCP_MPJ_SYN) { + 125 : 2051 : case MPTCPOPT_MP_JOIN: + 126 [ + + ]: 2051 : if (opsize == TCPOLEN_MPTCP_MPJ_SYN) { 127 : 521 : mp_opt->suboptions |= OPTION_MPTCP_MPJ_SYN; 128 : 521 : mp_opt->backup = *ptr++ & MPTCPOPT_BACKUP; 129 : 521 : mp_opt->join_id = *ptr++; @@ -214,7 +214,7 @@ 134 [ - + ]: 521 : pr_debug("MP_JOIN bkup=%u, id=%u, token=%u, nonce=%u\n", 135 : : mp_opt->backup, mp_opt->join_id, 136 : : mp_opt->token, mp_opt->nonce); - 137 [ + + ]: 1527 : } else if (opsize == TCPOLEN_MPTCP_MPJ_SYNACK) { + 137 [ + + ]: 1530 : } else if (opsize == TCPOLEN_MPTCP_MPJ_SYNACK) { 138 : 487 : mp_opt->suboptions |= OPTION_MPTCP_MPJ_SYNACK; 139 : 487 : mp_opt->backup = *ptr++ & MPTCPOPT_BACKUP; 140 : 487 : mp_opt->join_id = *ptr++; @@ -225,47 +225,47 @@ 145 [ - + ]: 487 : pr_debug("MP_JOIN bkup=%u, id=%u, thmac=%llu, nonce=%u\n", 146 : : mp_opt->backup, mp_opt->join_id, 147 : : mp_opt->thmac, mp_opt->nonce); - 148 [ + - ]: 1040 : } else if (opsize == TCPOLEN_MPTCP_MPJ_ACK) { - 149 : 1040 : mp_opt->suboptions |= OPTION_MPTCP_MPJ_ACK; - 150 : 1040 : ptr += 2; - 151 : 1040 : memcpy(mp_opt->hmac, ptr, MPTCPOPT_HMAC_LEN); - 152 [ - + ]: 1040 : pr_debug("MP_JOIN hmac\n"); + 148 [ + - ]: 1043 : } else if (opsize == TCPOLEN_MPTCP_MPJ_ACK) { + 149 : 1043 : mp_opt->suboptions |= OPTION_MPTCP_MPJ_ACK; + 150 : 1043 : ptr += 2; + 151 : 1043 : memcpy(mp_opt->hmac, ptr, MPTCPOPT_HMAC_LEN); + 152 [ - + ]: 1043 : pr_debug("MP_JOIN hmac\n"); 153 : : } 154 : : break; 155 : : 156 : : case MPTCPOPT_DSS: - 157 [ - + ]: 776804 : pr_debug("DSS\n"); - 158 : 776804 : ptr++; + 157 [ - + ]: 1072722 : pr_debug("DSS\n"); + 158 : 1072722 : ptr++; 159 : : 160 : : /* we must clear 'mpc_map' be able to detect MP_CAPABLE 161 : : * map vs DSS map in mptcp_incoming_options(), and reconstruct 162 : : * map info accordingly 163 : : */ - 164 : 776804 : mp_opt->mpc_map = 0; - 165 : 776804 : flags = (*ptr++) & MPTCP_DSS_FLAG_MASK; - 166 : 776804 : mp_opt->data_fin = (flags & MPTCP_DSS_DATA_FIN) != 0; - 167 : 776804 : mp_opt->dsn64 = (flags & MPTCP_DSS_DSN64) != 0; - 168 : 776804 : mp_opt->use_map = (flags & MPTCP_DSS_HAS_MAP) != 0; - 169 : 776804 : mp_opt->ack64 = (flags & MPTCP_DSS_ACK64) != 0; - 170 : 776804 : mp_opt->use_ack = (flags & MPTCP_DSS_HAS_ACK); + 164 : 1072722 : mp_opt->mpc_map = 0; + 165 : 1072722 : flags = (*ptr++) & MPTCP_DSS_FLAG_MASK; + 166 : 1072722 : mp_opt->data_fin = (flags & MPTCP_DSS_DATA_FIN) != 0; + 167 : 1072722 : mp_opt->dsn64 = (flags & MPTCP_DSS_DSN64) != 0; + 168 : 1072722 : mp_opt->use_map = (flags & MPTCP_DSS_HAS_MAP) != 0; + 169 : 1072722 : mp_opt->ack64 = (flags & MPTCP_DSS_ACK64) != 0; + 170 : 1072722 : mp_opt->use_ack = (flags & MPTCP_DSS_HAS_ACK); 171 : : - 172 [ - + ]: 776804 : pr_debug("data_fin=%d dsn64=%d use_map=%d ack64=%d use_ack=%d\n", + 172 [ - + ]: 1072722 : pr_debug("data_fin=%d dsn64=%d use_map=%d ack64=%d use_ack=%d\n", 173 : : mp_opt->data_fin, mp_opt->dsn64, 174 : : mp_opt->use_map, mp_opt->ack64, 175 : : mp_opt->use_ack); 176 : : - 177 : 776804 : expected_opsize = TCPOLEN_MPTCP_DSS_BASE; + 177 : 1072722 : expected_opsize = TCPOLEN_MPTCP_DSS_BASE; 178 : : - 179 [ + - ]: 776804 : if (mp_opt->use_ack) { - 180 [ + + ]: 776804 : if (mp_opt->ack64) + 179 [ + - ]: 1072722 : if (mp_opt->use_ack) { + 180 [ + + ]: 1072722 : if (mp_opt->ack64) 181 : : expected_opsize += TCPOLEN_MPTCP_DSS_ACK64; 182 : : else - 183 : 133729 : expected_opsize += TCPOLEN_MPTCP_DSS_ACK32; + 183 : 157545 : expected_opsize += TCPOLEN_MPTCP_DSS_ACK32; 184 : : } 185 : : - 186 [ + + ]: 776804 : if (mp_opt->use_map) { - 187 [ + + ]: 499193 : if (mp_opt->dsn64) - 188 : 499151 : expected_opsize += TCPOLEN_MPTCP_DSS_MAP64; + 186 [ + + ]: 1072722 : if (mp_opt->use_map) { + 187 [ + + ]: 711269 : if (mp_opt->dsn64) + 188 : 711227 : expected_opsize += TCPOLEN_MPTCP_DSS_MAP64; 189 : : else 190 : 42 : expected_opsize += TCPOLEN_MPTCP_DSS_MAP32; 191 : : } @@ -273,45 +273,45 @@ 193 : : /* Always parse any csum presence combination, we will enforce 194 : : * RFC 8684 Section 3.3.0 checks later in subflow_data_ready 195 : : */ - 196 [ + + ]: 776804 : if (opsize != expected_opsize && - 197 [ + - ]: 1930 : opsize != expected_opsize + TCPOLEN_MPTCP_DSS_CHECKSUM) + 196 [ + + ]: 1072722 : if (opsize != expected_opsize && + 197 [ + - ]: 1902 : opsize != expected_opsize + TCPOLEN_MPTCP_DSS_CHECKSUM) 198 : : break; 199 : : - 200 : 776804 : mp_opt->suboptions |= OPTION_MPTCP_DSS; - 201 [ + - ]: 776804 : if (mp_opt->use_ack) { - 202 [ + + ]: 776804 : if (mp_opt->ack64) { - 203 : 643075 : mp_opt->data_ack = get_unaligned_be64(ptr); - 204 : 643075 : ptr += 8; + 200 : 1072722 : mp_opt->suboptions |= OPTION_MPTCP_DSS; + 201 [ + - ]: 1072722 : if (mp_opt->use_ack) { + 202 [ + + ]: 1072722 : if (mp_opt->ack64) { + 203 : 915177 : mp_opt->data_ack = get_unaligned_be64(ptr); + 204 : 915177 : ptr += 8; 205 : : } else { - 206 : 133729 : mp_opt->data_ack = get_unaligned_be32(ptr); - 207 : 133729 : ptr += 4; + 206 : 157545 : mp_opt->data_ack = get_unaligned_be32(ptr); + 207 : 157545 : ptr += 4; 208 : : } 209 : : - 210 [ - + ]: 776804 : pr_debug("data_ack=%llu\n", mp_opt->data_ack); + 210 [ - + ]: 1072722 : pr_debug("data_ack=%llu\n", mp_opt->data_ack); 211 : : } 212 : : - 213 [ + + ]: 776804 : if (mp_opt->use_map) { - 214 [ + + ]: 499193 : if (mp_opt->dsn64) { - 215 : 499151 : mp_opt->data_seq = get_unaligned_be64(ptr); - 216 : 499151 : ptr += 8; + 213 [ + + ]: 1072722 : if (mp_opt->use_map) { + 214 [ + + ]: 711269 : if (mp_opt->dsn64) { + 215 : 711227 : mp_opt->data_seq = get_unaligned_be64(ptr); + 216 : 711227 : ptr += 8; 217 : : } else { 218 : 42 : mp_opt->data_seq = get_unaligned_be32(ptr); 219 : 42 : ptr += 4; 220 : : } 221 : : - 222 [ + + ]: 499193 : mp_opt->subflow_seq = get_unaligned_be32(ptr); - 223 : 499193 : ptr += 4; + 222 [ + + ]: 711269 : mp_opt->subflow_seq = get_unaligned_be32(ptr); + 223 : 711269 : ptr += 4; 224 : : - 225 [ + + ]: 499193 : mp_opt->data_len = get_unaligned_be16(ptr); - 226 : 499193 : ptr += 2; + 225 [ + + ]: 711269 : mp_opt->data_len = get_unaligned_be16(ptr); + 226 : 711269 : ptr += 2; 227 : : - 228 [ + + ]: 499193 : if (opsize == expected_opsize + TCPOLEN_MPTCP_DSS_CHECKSUM) { - 229 : 1930 : mp_opt->suboptions |= OPTION_MPTCP_CSUMREQD; - 230 : 1930 : mp_opt->csum = get_unaligned((__force __sum16 *)ptr); - 231 : 1930 : ptr += 2; + 228 [ + + ]: 711269 : if (opsize == expected_opsize + TCPOLEN_MPTCP_DSS_CHECKSUM) { + 229 : 1902 : mp_opt->suboptions |= OPTION_MPTCP_CSUMREQD; + 230 : 1902 : mp_opt->csum = get_unaligned((__force __sum16 *)ptr); + 231 : 1902 : ptr += 2; 232 : : } 233 : : - 234 [ - + ]: 499193 : pr_debug("data_seq=%llu subflow_seq=%u data_len=%u csum=%d:%u\n", + 234 [ - + ]: 711269 : pr_debug("data_seq=%llu subflow_seq=%u data_len=%u csum=%d:%u\n", 235 : : mp_opt->data_seq, mp_opt->subflow_seq, 236 : : mp_opt->data_len, !!(mp_opt->suboptions & OPTION_MPTCP_CSUMREQD), 237 : : mp_opt->csum); @@ -334,12 +334,12 @@ 254 : : break; 255 : : } else { 256 : 331 : if (opsize == TCPOLEN_MPTCP_ADD_ADDR_BASE || - 257 [ + + ]: 331 : opsize == TCPOLEN_MPTCP_ADD_ADDR_BASE_PORT) - 258 : 257 : mp_opt->addr.family = AF_INET; + 257 [ + + ]: 331 : opsize == TCPOLEN_MPTCP_ADD_ADDR_BASE_PORT) + 258 : 258 : mp_opt->addr.family = AF_INET; 259 : : #if IS_ENABLED(CONFIG_MPTCP_IPV6) - 260 : 74 : else if (opsize == TCPOLEN_MPTCP_ADD_ADDR6_BASE || - 261 [ + - ]: 74 : opsize == TCPOLEN_MPTCP_ADD_ADDR6_BASE_PORT) - 262 : 74 : mp_opt->addr.family = AF_INET6; + 260 : 73 : else if (opsize == TCPOLEN_MPTCP_ADD_ADDR6_BASE || + 261 [ + - ]: 73 : opsize == TCPOLEN_MPTCP_ADD_ADDR6_BASE_PORT) + 262 : 73 : mp_opt->addr.family = AF_INET6; 263 : : #endif 264 : : else 265 : : break; @@ -349,21 +349,21 @@ 269 : 691 : mp_opt->addr.id = *ptr++; 270 : 691 : mp_opt->addr.port = 0; 271 : 691 : mp_opt->ahmac = 0; - 272 [ + + ]: 691 : if (mp_opt->addr.family == AF_INET) { - 273 : 537 : memcpy((u8 *)&mp_opt->addr.addr.s_addr, (u8 *)ptr, 4); - 274 : 537 : ptr += 4; - 275 : 537 : if (opsize == TCPOLEN_MPTCP_ADD_ADDR_PORT || - 276 [ + + ]: 537 : opsize == TCPOLEN_MPTCP_ADD_ADDR_BASE_PORT) { + 272 [ + + ]: 691 : if (mp_opt->addr.family == AF_INET) { + 273 : 538 : memcpy((u8 *)&mp_opt->addr.addr.s_addr, (u8 *)ptr, 4); + 274 : 538 : ptr += 4; + 275 : 538 : if (opsize == TCPOLEN_MPTCP_ADD_ADDR_PORT || + 276 [ + + ]: 538 : opsize == TCPOLEN_MPTCP_ADD_ADDR_BASE_PORT) { 277 : 62 : mp_opt->addr.port = htons(get_unaligned_be16(ptr)); 278 : 62 : ptr += 2; 279 : : } 280 : : } 281 : : #if IS_ENABLED(CONFIG_MPTCP_IPV6) 282 : : else { - 283 : 154 : memcpy(mp_opt->addr.addr6.s6_addr, (u8 *)ptr, 16); - 284 : 154 : ptr += 16; - 285 : 154 : if (opsize == TCPOLEN_MPTCP_ADD_ADDR6_PORT || - 286 [ + + ]: 154 : opsize == TCPOLEN_MPTCP_ADD_ADDR6_BASE_PORT) { + 283 : 153 : memcpy(mp_opt->addr.addr6.s6_addr, (u8 *)ptr, 16); + 284 : 153 : ptr += 16; + 285 : 153 : if (opsize == TCPOLEN_MPTCP_ADD_ADDR6_PORT || + 286 [ + + ]: 153 : opsize == TCPOLEN_MPTCP_ADD_ADDR6_BASE_PORT) { 287 : 6 : mp_opt->addr.port = htons(get_unaligned_be16(ptr)); 288 : 6 : ptr += 2; 289 : : } @@ -401,29 +401,29 @@ 321 [ - + ]: 40 : pr_debug("MP_PRIO: prio=%d\n", mp_opt->backup); 322 : : break; 323 : : - 324 : 263 : case MPTCPOPT_MP_FASTCLOSE: - 325 [ + - ]: 263 : if (opsize != TCPOLEN_MPTCP_FASTCLOSE) + 324 : 255 : case MPTCPOPT_MP_FASTCLOSE: + 325 [ + - ]: 255 : if (opsize != TCPOLEN_MPTCP_FASTCLOSE) 326 : : break; 327 : : - 328 : 263 : ptr += 2; - 329 [ - + ]: 263 : mp_opt->rcvr_key = get_unaligned_be64(ptr); - 330 : 263 : ptr += 8; - 331 : 263 : mp_opt->suboptions |= OPTION_MPTCP_FASTCLOSE; - 332 [ - + ]: 263 : pr_debug("MP_FASTCLOSE: recv_key=%llu\n", mp_opt->rcvr_key); + 328 : 255 : ptr += 2; + 329 [ - + ]: 255 : mp_opt->rcvr_key = get_unaligned_be64(ptr); + 330 : 255 : ptr += 8; + 331 : 255 : mp_opt->suboptions |= OPTION_MPTCP_FASTCLOSE; + 332 [ - + ]: 255 : pr_debug("MP_FASTCLOSE: recv_key=%llu\n", mp_opt->rcvr_key); 333 : : break; 334 : : - 335 : 285 : case MPTCPOPT_RST: - 336 [ + - ]: 285 : if (opsize != TCPOLEN_MPTCP_RST) + 335 : 278 : case MPTCPOPT_RST: + 336 [ + - ]: 278 : if (opsize != TCPOLEN_MPTCP_RST) 337 : : break; 338 : : - 339 [ + + ]: 285 : if (!(TCP_SKB_CB(skb)->tcp_flags & TCPHDR_RST)) + 339 [ + + ]: 278 : if (!(TCP_SKB_CB(skb)->tcp_flags & TCPHDR_RST)) 340 : : break; 341 : : - 342 : 273 : mp_opt->suboptions |= OPTION_MPTCP_RST; - 343 : 273 : flags = *ptr++; - 344 : 273 : mp_opt->reset_transient = flags & MPTCP_RST_TRANSIENT; - 345 : 273 : mp_opt->reset_reason = *ptr; - 346 [ - + ]: 273 : pr_debug("MP_RST: transient=%u reason=%u\n", + 342 : 266 : mp_opt->suboptions |= OPTION_MPTCP_RST; + 343 : 266 : flags = *ptr++; + 344 : 266 : mp_opt->reset_transient = flags & MPTCP_RST_TRANSIENT; + 345 : 266 : mp_opt->reset_reason = *ptr; + 346 [ - + ]: 266 : pr_debug("MP_RST: transient=%u reason=%u\n", 347 : : mp_opt->reset_transient, mp_opt->reset_reason); 348 : : break; 349 : : @@ -440,72 +440,72 @@ 360 : : default: 361 : : break; 362 : : } - 363 : 785613 : } + 363 : 1081475 : } 364 : : - 365 : 785522 : void mptcp_get_options(const struct sk_buff *skb, + 365 : 1081390 : void mptcp_get_options(const struct sk_buff *skb, 366 : : struct mptcp_options_received *mp_opt) 367 : : { - 368 : 785522 : const struct tcphdr *th = tcp_hdr(skb); - 369 : 785522 : const unsigned char *ptr; - 370 : 785522 : int length; + 368 : 1081390 : const struct tcphdr *th = tcp_hdr(skb); + 369 : 1081390 : const unsigned char *ptr; + 370 : 1081390 : int length; 371 : : 372 : : /* initialize option status */ - 373 : 785522 : mp_opt->suboptions = 0; + 373 : 1081390 : mp_opt->suboptions = 0; 374 : : - 375 : 785522 : length = (th->doff * 4) - sizeof(struct tcphdr); - 376 : 785522 : ptr = (const unsigned char *)(th + 1); + 375 : 1081390 : length = (th->doff * 4) - sizeof(struct tcphdr); + 376 : 1081390 : ptr = (const unsigned char *)(th + 1); 377 : : - 378 [ + + ]: 4934692 : while (length > 0) { - 379 : 4149170 : int opcode = *ptr++; - 380 : 4149170 : int opsize; + 378 [ + + ]: 6822364 : while (length > 0) { + 379 : 5740974 : int opcode = *ptr++; + 380 : 5740974 : int opsize; 381 : : - 382 [ + + - ]: 4149170 : switch (opcode) { + 382 [ + + - ]: 5740974 : switch (opcode) { 383 : : case TCPOPT_EOL: 384 : : return; - 385 : 2566446 : case TCPOPT_NOP: /* Ref: RFC 793 section 3.1 */ - 386 : 2566446 : length--; - 387 : 2566446 : continue; - 388 : 1582724 : default: - 389 [ + - ]: 1582724 : if (length < 2) + 385 : 3571780 : case TCPOPT_NOP: /* Ref: RFC 793 section 3.1 */ + 386 : 3571780 : length--; + 387 : 3571780 : continue; + 388 : 2169194 : default: + 389 [ + - ]: 2169194 : if (length < 2) 390 : : return; - 391 : 1582724 : opsize = *ptr++; - 392 [ + - ]: 1582724 : if (opsize < 2) /* "silly options" */ + 391 : 2169194 : opsize = *ptr++; + 392 [ + - ]: 2169194 : if (opsize < 2) /* "silly options" */ 393 : : return; - 394 [ + - ]: 1582724 : if (opsize > length) + 394 [ + - ]: 2169194 : if (opsize > length) 395 : : return; /* don't parse partial options */ - 396 [ + + ]: 1582724 : if (opcode == TCPOPT_MPTCP) - 397 : 785613 : mptcp_parse_option(skb, ptr, opsize, mp_opt); - 398 : 1582724 : ptr += opsize - 2; - 399 : 1582724 : length -= opsize; + 396 [ + + ]: 2169194 : if (opcode == TCPOPT_MPTCP) + 397 : 1081475 : mptcp_parse_option(skb, ptr, opsize, mp_opt); + 398 : 2169194 : ptr += opsize - 2; + 399 : 2169194 : length -= opsize; 400 : : } 401 : : } 402 : : } 403 : : - 404 : 1859 : bool mptcp_syn_options(struct sock *sk, const struct sk_buff *skb, + 404 : 1861 : bool mptcp_syn_options(struct sock *sk, const struct sk_buff *skb, 405 : : unsigned int *size, struct mptcp_out_options *opts) 406 : : { - 407 [ + + ]: 1859 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); + 407 [ + + ]: 1861 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); 408 : : 409 : : /* we will use snd_isn to detect first pkt [re]transmission 410 : : * in mptcp_established_options_mp() 411 : : */ - 412 : 1859 : subflow->snd_isn = TCP_SKB_CB(skb)->end_seq; - 413 [ + + ]: 1859 : if (subflow->request_mptcp) { - 414 : 1276 : opts->suboptions = OPTION_MPTCP_MPC_SYN; - 415 : 1276 : opts->csum_reqd = mptcp_is_checksum_enabled(sock_net(sk)); - 416 : 1276 : opts->allow_join_id0 = mptcp_allow_join_id0(sock_net(sk)); - 417 : 1276 : *size = TCPOLEN_MPTCP_MPC_SYN; - 418 : 1276 : return true; - 419 [ + + ]: 583 : } else if (subflow->request_join) { - 420 [ - + ]: 571 : pr_debug("remote_token=%u, nonce=%u\n", subflow->remote_token, + 412 : 1861 : subflow->snd_isn = TCP_SKB_CB(skb)->end_seq; + 413 [ + + ]: 1861 : if (subflow->request_mptcp) { + 414 : 1277 : opts->suboptions = OPTION_MPTCP_MPC_SYN; + 415 : 1277 : opts->csum_reqd = mptcp_is_checksum_enabled(sock_net(sk)); + 416 : 1277 : opts->allow_join_id0 = mptcp_allow_join_id0(sock_net(sk)); + 417 : 1277 : *size = TCPOLEN_MPTCP_MPC_SYN; + 418 : 1277 : return true; + 419 [ + + ]: 584 : } else if (subflow->request_join) { + 420 [ - + ]: 572 : pr_debug("remote_token=%u, nonce=%u\n", subflow->remote_token, 421 : : subflow->local_nonce); - 422 : 571 : opts->suboptions = OPTION_MPTCP_MPJ_SYN; - 423 : 571 : opts->join_id = subflow->local_id; - 424 : 571 : opts->token = subflow->remote_token; - 425 : 571 : opts->nonce = subflow->local_nonce; - 426 : 571 : opts->backup = subflow->request_bkup; - 427 : 571 : *size = TCPOLEN_MPTCP_MPJ_SYN; - 428 : 571 : return true; + 422 : 572 : opts->suboptions = OPTION_MPTCP_MPJ_SYN; + 423 : 572 : opts->join_id = subflow->local_id; + 424 : 572 : opts->token = subflow->remote_token; + 425 : 572 : opts->nonce = subflow->local_nonce; + 426 : 572 : opts->backup = subflow->request_bkup; + 427 : 572 : *size = TCPOLEN_MPTCP_MPJ_SYN; + 428 : 572 : return true; 429 : : } 430 : : return false; 431 : : } @@ -520,16 +520,16 @@ 440 : 984 : icsk->icsk_ack.pending &= ~(ICSK_ACK_SCHED | ICSK_ACK_TIMER); 441 : 984 : } 442 : : - 443 : 1577612 : static bool mptcp_established_options_mp(struct sock *sk, struct sk_buff *skb, + 443 : 2217712 : static bool mptcp_established_options_mp(struct sock *sk, struct sk_buff *skb, 444 : : bool snd_data_fin_enable, 445 : : unsigned int *size, 446 : : struct mptcp_out_options *opts) 447 : : { - 448 [ - + ]: 1577612 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); - 449 [ - + ]: 1577612 : struct mptcp_sock *msk = mptcp_sk(subflow->conn); - 450 : 1577612 : struct mptcp_ext *mpext; - 451 : 1577612 : unsigned int data_len; - 452 : 1577612 : u8 len; + 448 [ - + ]: 2217712 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); + 449 [ - + ]: 2217712 : struct mptcp_sock *msk = mptcp_sk(subflow->conn); + 450 : 2217712 : struct mptcp_ext *mpext; + 451 : 2217712 : unsigned int data_len; + 452 : 2217712 : u8 len; 453 : : 454 : : /* When skb is not available, we better over-estimate the emitted 455 : : * options len. A full DSS option (28 bytes) is longer than @@ -537,168 +537,168 @@ 457 : : * tell the caller to defer the estimate to 458 : : * mptcp_established_options_dss(), which will reserve enough space. 459 : : */ - 460 [ + + ]: 1577612 : if (!skb) + 460 [ + + ]: 2217712 : if (!skb) 461 : : return false; 462 : : 463 : : /* MPC/MPJ needed only on 3rd ack packet, DATA_FIN and TCP shutdown take precedence */ - 464 [ + + + + : 647790 : if (READ_ONCE(subflow->fully_established) || snd_data_fin_enable || - + + ] - 465 [ + + ]: 2632 : subflow->snd_isn != TCP_SKB_CB(skb)->seq || - 466 [ + + ]: 2221 : sk->sk_state != TCP_ESTABLISHED) + 464 [ + + + + : 881209 : if (READ_ONCE(subflow->fully_established) || snd_data_fin_enable || + + + ] + 465 [ + + ]: 2700 : subflow->snd_isn != TCP_SKB_CB(skb)->seq || + 466 [ + + ]: 2217 : sk->sk_state != TCP_ESTABLISHED) 467 : : return false; 468 : : - 469 [ + + ]: 2221 : if (subflow->mp_capable) { - 470 [ + + ]: 1720 : mpext = mptcp_get_ext(skb); - 471 [ + + ]: 1161 : data_len = mpext ? mpext->data_len : 0; + 469 [ + + ]: 2217 : if (subflow->mp_capable) { + 470 [ + + ]: 1713 : mpext = mptcp_get_ext(skb); + 471 [ + + ]: 1154 : data_len = mpext ? mpext->data_len : 0; 472 : : 473 : : /* we will check ops->data_len in mptcp_write_options() to 474 : : * discriminate between TCPOLEN_MPTCP_MPC_ACK_DATA and 475 : : * TCPOLEN_MPTCP_MPC_ACK 476 : : */ - 477 : 1720 : opts->data_len = data_len; - 478 : 1720 : opts->suboptions = OPTION_MPTCP_MPC_ACK; - 479 : 1720 : opts->sndr_key = subflow->local_key; - 480 : 1720 : opts->rcvr_key = subflow->remote_key; - 481 [ - + ]: 1720 : opts->csum_reqd = READ_ONCE(msk->csum_enabled); - 482 : 1720 : opts->allow_join_id0 = mptcp_allow_join_id0(sock_net(sk)); + 477 : 1713 : opts->data_len = data_len; + 478 : 1713 : opts->suboptions = OPTION_MPTCP_MPC_ACK; + 479 : 1713 : opts->sndr_key = subflow->local_key; + 480 : 1713 : opts->rcvr_key = subflow->remote_key; + 481 [ - + ]: 1713 : opts->csum_reqd = READ_ONCE(msk->csum_enabled); + 482 : 1713 : opts->allow_join_id0 = mptcp_allow_join_id0(sock_net(sk)); 483 : : 484 : : /* Section 3.1. 485 : : * The MP_CAPABLE option is carried on the SYN, SYN/ACK, and ACK 486 : : * packets that start the first subflow of an MPTCP connection, 487 : : * as well as the first packet that carries data 488 : : */ - 489 [ + + ]: 1720 : if (data_len > 0) { - 490 : 602 : len = TCPOLEN_MPTCP_MPC_ACK_DATA; - 491 [ + + ]: 602 : if (opts->csum_reqd) { + 489 [ + + ]: 1713 : if (data_len > 0) { + 490 : 594 : len = TCPOLEN_MPTCP_MPC_ACK_DATA; + 491 [ + + ]: 594 : if (opts->csum_reqd) { 492 : : /* we need to propagate more info to csum the pseudo hdr */ 493 : 4 : opts->data_seq = mpext->data_seq; 494 : 4 : opts->subflow_seq = mpext->subflow_seq; 495 : 4 : opts->csum = mpext->csum; 496 : 4 : len += TCPOLEN_MPTCP_DSS_CHECKSUM; 497 : : } - 498 : 602 : *size = ALIGN(len, 4); + 498 : 594 : *size = ALIGN(len, 4); 499 : : } else { - 500 : 1118 : *size = TCPOLEN_MPTCP_MPC_ACK; + 500 : 1119 : *size = TCPOLEN_MPTCP_MPC_ACK; 501 : : } 502 : : - 503 [ - + ]: 1720 : pr_debug("subflow=%p, local_key=%llu, remote_key=%llu map_len=%d\n", + 503 [ - + ]: 1713 : pr_debug("subflow=%p, local_key=%llu, remote_key=%llu map_len=%d\n", 504 : : subflow, subflow->local_key, subflow->remote_key, 505 : : data_len); 506 : : - 507 : 1720 : return true; - 508 [ + + ]: 501 : } else if (subflow->mp_join) { - 509 : 501 : opts->suboptions = OPTION_MPTCP_MPJ_ACK; - 510 : 501 : memcpy(opts->hmac, subflow->hmac, MPTCPOPT_HMAC_LEN); - 511 : 501 : *size = TCPOLEN_MPTCP_MPJ_ACK; - 512 [ - + ]: 501 : pr_debug("subflow=%p\n", subflow); + 507 : 1713 : return true; + 508 [ + + ]: 504 : } else if (subflow->mp_join) { + 509 : 504 : opts->suboptions = OPTION_MPTCP_MPJ_ACK; + 510 : 504 : memcpy(opts->hmac, subflow->hmac, MPTCPOPT_HMAC_LEN); + 511 : 504 : *size = TCPOLEN_MPTCP_MPJ_ACK; + 512 [ - + ]: 504 : pr_debug("subflow=%p\n", subflow); 513 : : 514 : : /* we can use the full delegate action helper only from BH context 515 : : * If we are in process context - sk is flushing the backlog at 516 : : * socket lock release time - just set the appropriate flag, will 517 : : * be handled by the release callback 518 : : */ - 519 [ + + ]: 501 : if (sock_owned_by_user(sk)) - 520 : 416 : set_bit(MPTCP_DELEGATE_ACK, &subflow->delegated_status); + 519 [ + + ]: 504 : if (sock_owned_by_user(sk)) + 520 : 413 : set_bit(MPTCP_DELEGATE_ACK, &subflow->delegated_status); 521 : : else - 522 : 85 : mptcp_subflow_delegate(subflow, MPTCP_DELEGATE_ACK); - 523 : 501 : return true; + 522 : 91 : mptcp_subflow_delegate(subflow, MPTCP_DELEGATE_ACK); + 523 : 504 : return true; 524 : : } 525 : : return false; 526 : : } 527 : : - 528 : 25893 : static void mptcp_write_data_fin(struct mptcp_subflow_context *subflow, + 528 : 24742 : static void mptcp_write_data_fin(struct mptcp_subflow_context *subflow, 529 : : struct sk_buff *skb, struct mptcp_ext *ext) 530 : : { 531 : : /* The write_seq value has already been incremented, so the actual 532 : : * sequence number for the DATA_FIN is one less. 533 : : */ - 534 [ - + ]: 25893 : u64 data_fin_tx_seq = READ_ONCE(mptcp_sk(subflow->conn)->write_seq) - 1; + 534 [ - + ]: 24742 : u64 data_fin_tx_seq = READ_ONCE(mptcp_sk(subflow->conn)->write_seq) - 1; 535 : : - 536 [ + + - + ]: 25893 : if (!ext->use_map || !skb->len) { + 536 [ + + - + ]: 24742 : if (!ext->use_map || !skb->len) { 537 : : /* RFC6824 requires a DSS mapping with specific values 538 : : * if DATA_FIN is set but no data payload is mapped 539 : : */ - 540 : 9546 : ext->data_fin = 1; - 541 : 9546 : ext->use_map = 1; - 542 : 9546 : ext->dsn64 = 1; - 543 : 9546 : ext->data_seq = data_fin_tx_seq; - 544 : 9546 : ext->subflow_seq = 0; - 545 : 9546 : ext->data_len = 1; - 546 [ + + ]: 16347 : } else if (ext->data_seq + ext->data_len == data_fin_tx_seq) { + 540 : 7264 : ext->data_fin = 1; + 541 : 7264 : ext->use_map = 1; + 542 : 7264 : ext->dsn64 = 1; + 543 : 7264 : ext->data_seq = data_fin_tx_seq; + 544 : 7264 : ext->subflow_seq = 0; + 545 : 7264 : ext->data_len = 1; + 546 [ + + ]: 17478 : } else if (ext->data_seq + ext->data_len == data_fin_tx_seq) { 547 : : /* If there's an existing DSS mapping and it is the 548 : : * final mapping, DATA_FIN consumes 1 additional byte of 549 : : * mapping space. 550 : : */ - 551 : 1028 : ext->data_fin = 1; - 552 : 1028 : ext->data_len++; + 551 : 897 : ext->data_fin = 1; + 552 : 897 : ext->data_len++; 553 : : } - 554 : 25893 : } + 554 : 24742 : } 555 : : - 556 : 1575391 : static bool mptcp_established_options_dss(struct sock *sk, struct sk_buff *skb, + 556 : 2215495 : static bool mptcp_established_options_dss(struct sock *sk, struct sk_buff *skb, 557 : : bool snd_data_fin_enable, 558 : : unsigned int *size, 559 : : struct mptcp_out_options *opts) 560 : : { - 561 [ - + ]: 1575391 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); - 562 [ - + ]: 1575391 : struct mptcp_sock *msk = mptcp_sk(subflow->conn); - 563 : 1575391 : unsigned int dss_size = 0; - 564 : 1575391 : struct mptcp_ext *mpext; - 565 : 1575391 : unsigned int ack_size; - 566 : 1575391 : bool ret = false; - 567 : 1575391 : u64 ack_seq; + 561 [ - + ]: 2215495 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); + 562 [ - + ]: 2215495 : struct mptcp_sock *msk = mptcp_sk(subflow->conn); + 563 : 2215495 : unsigned int dss_size = 0; + 564 : 2215495 : struct mptcp_ext *mpext; + 565 : 2215495 : unsigned int ack_size; + 566 : 2215495 : bool ret = false; + 567 : 2215495 : u64 ack_seq; 568 : : - 569 [ - + ]: 1575391 : opts->csum_reqd = READ_ONCE(msk->csum_enabled); - 570 [ + + ]: 1575391 : mpext = skb ? mptcp_get_ext(skb) : NULL; + 569 [ - + ]: 2215495 : opts->csum_reqd = READ_ONCE(msk->csum_enabled); + 570 [ + + ]: 2215495 : mpext = skb ? mptcp_get_ext(skb) : NULL; 571 : : - 572 [ + + - + : 645569 : if (!skb || (mpext && mpext->use_map) || snd_data_fin_enable) { - + + ] - 573 : 1294623 : unsigned int map_size = TCPOLEN_MPTCP_DSS_BASE + TCPOLEN_MPTCP_DSS_MAP64; + 572 [ + + - + : 878992 : if (!skb || (mpext && mpext->use_map) || snd_data_fin_enable) { + + + ] + 573 : 1850829 : unsigned int map_size = TCPOLEN_MPTCP_DSS_BASE + TCPOLEN_MPTCP_DSS_MAP64; 574 : : - 575 [ + + ]: 1294623 : if (mpext) { - 576 [ + + ]: 355255 : if (opts->csum_reqd) - 577 : 1607 : map_size += TCPOLEN_MPTCP_DSS_CHECKSUM; + 575 [ + + ]: 1850829 : if (mpext) { + 576 [ + + ]: 507062 : if (opts->csum_reqd) + 577 : 1605 : map_size += TCPOLEN_MPTCP_DSS_CHECKSUM; 578 : : - 579 : 355255 : opts->ext_copy = *mpext; + 579 : 507062 : opts->ext_copy = *mpext; 580 : : } 581 : : - 582 : 1294623 : dss_size = map_size; - 583 [ + + ]: 1294623 : if (skb && snd_data_fin_enable) - 584 : 25893 : mptcp_write_data_fin(subflow, skb, &opts->ext_copy); - 585 : 1294623 : opts->suboptions = OPTION_MPTCP_DSS; - 586 : 1294623 : ret = true; + 582 : 1850829 : dss_size = map_size; + 583 [ + + ]: 1850829 : if (skb && snd_data_fin_enable) + 584 : 24742 : mptcp_write_data_fin(subflow, skb, &opts->ext_copy); + 585 : 1850829 : opts->suboptions = OPTION_MPTCP_DSS; + 586 : 1850829 : ret = true; 587 : : } 588 : : 589 : : /* passive sockets msk will set the 'can_ack' after accept(), even 590 : : * if the first subflow may have the already the remote key handy 591 : : */ - 592 : 1575391 : opts->ext_copy.use_ack = 0; - 593 [ + + + + ]: 1575391 : if (!READ_ONCE(msk->can_ack)) { - 594 : 18 : *size = ALIGN(dss_size, 4); - 595 : 18 : return ret; + 592 : 2215495 : opts->ext_copy.use_ack = 0; + 593 [ + + + + ]: 2215495 : if (!READ_ONCE(msk->can_ack)) { + 594 : 19 : *size = ALIGN(dss_size, 4); + 595 : 19 : return ret; 596 : : } 597 : : - 598 : 1575373 : ack_seq = READ_ONCE(msk->ack_seq); - 599 [ + + + + ]: 1575373 : if (READ_ONCE(msk->use_64bit_ack)) { - 600 : 1119783 : ack_size = TCPOLEN_MPTCP_DSS_ACK64; - 601 : 1119783 : opts->ext_copy.data_ack = ack_seq; - 602 : 1119783 : opts->ext_copy.ack64 = 1; + 598 : 2215476 : ack_seq = READ_ONCE(msk->ack_seq); + 599 [ + + + + ]: 2215476 : if (READ_ONCE(msk->use_64bit_ack)) { + 600 : 1720819 : ack_size = TCPOLEN_MPTCP_DSS_ACK64; + 601 : 1720819 : opts->ext_copy.data_ack = ack_seq; + 602 : 1720819 : opts->ext_copy.ack64 = 1; 603 : : } else { - 604 : 455590 : ack_size = TCPOLEN_MPTCP_DSS_ACK32; - 605 : 455590 : opts->ext_copy.data_ack32 = (uint32_t)ack_seq; - 606 : 455590 : opts->ext_copy.ack64 = 0; + 604 : 494657 : ack_size = TCPOLEN_MPTCP_DSS_ACK32; + 605 : 494657 : opts->ext_copy.data_ack32 = (uint32_t)ack_seq; + 606 : 494657 : opts->ext_copy.ack64 = 0; 607 : : } - 608 : 1575373 : opts->ext_copy.use_ack = 1; - 609 : 1575373 : opts->suboptions = OPTION_MPTCP_DSS; - 610 : 1575373 : WRITE_ONCE(msk->old_wspace, __mptcp_space((struct sock *)msk)); + 608 : 2215476 : opts->ext_copy.use_ack = 1; + 609 : 2215476 : opts->suboptions = OPTION_MPTCP_DSS; + 610 : 2215476 : WRITE_ONCE(msk->old_wspace, __mptcp_space((struct sock *)msk)); 611 : : 612 : : /* Add kind/length/subtype/flag overhead if mapping is not populated */ - 613 [ + + ]: 1575373 : if (dss_size == 0) - 614 : 280768 : ack_size += TCPOLEN_MPTCP_DSS_BASE; + 613 [ + + ]: 2215476 : if (dss_size == 0) + 614 : 364666 : ack_size += TCPOLEN_MPTCP_DSS_BASE; 615 : : - 616 : 1575373 : dss_size += ack_size; + 616 : 2215476 : dss_size += ack_size; 617 : : - 618 : 1575373 : *size = ALIGN(dss_size, 4); - 619 : 1575373 : return true; + 618 : 2215476 : *size = ALIGN(dss_size, 4); + 619 : 2215476 : return true; 620 : : } 621 : : 622 : 764 : static u64 add_addr_generate_hmac(u64 key1, u64 key2, @@ -728,30 +728,30 @@ 646 : 764 : return get_unaligned_be64(&hmac[SHA256_DIGEST_SIZE - sizeof(u64)]); 647 : : } 648 : : - 649 : 1577608 : static bool mptcp_established_options_add_addr(struct sock *sk, struct sk_buff *skb, + 649 : 2217708 : static bool mptcp_established_options_add_addr(struct sock *sk, struct sk_buff *skb, 650 : : unsigned int *size, 651 : : unsigned int remaining, 652 : : struct mptcp_out_options *opts) 653 : : { - 654 [ - + ]: 1577608 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); - 655 [ - + ]: 1577608 : struct mptcp_sock *msk = mptcp_sk(subflow->conn); - 656 : 1577608 : bool drop_other_suboptions = false; - 657 : 1577608 : unsigned int opt_size = *size; - 658 : 1577608 : bool echo; - 659 : 1577608 : int len; + 654 [ - + ]: 2217708 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); + 655 [ - + ]: 2217708 : struct mptcp_sock *msk = mptcp_sk(subflow->conn); + 656 : 2217708 : bool drop_other_suboptions = false; + 657 : 2217708 : unsigned int opt_size = *size; + 658 : 2217708 : bool echo; + 659 : 2217708 : int len; 660 : : 661 : : /* add addr will strip the existing options, be sure to avoid breaking 662 : : * MPC/MPJ handshakes 663 : : */ - 664 [ + + ]: 1577608 : if (!mptcp_pm_should_add_signal(msk) || + 664 [ + + ]: 2217708 : if (!mptcp_pm_should_add_signal(msk) || 665 [ + - - + ]: 1510 : (opts->suboptions & (OPTION_MPTCP_MPJ_ACK | OPTION_MPTCP_MPC_ACK)) || 666 : 755 : !mptcp_pm_add_addr_signal(msk, skb, opt_size, remaining, &opts->addr, 667 : : &echo, &drop_other_suboptions)) - 668 : 1576853 : return false; + 668 : 2216953 : return false; 669 : : 670 [ + + + - ]: 755 : if (drop_other_suboptions) 671 : 755 : remaining += opt_size; - 672 [ + + + + ]: 755 : len = mptcp_add_addr_len(opts->addr.family, echo, !!opts->addr.port); + 672 [ + + + + ]: 755 : len = mptcp_add_addr_len(opts->addr.family, echo, !!opts->addr.port); 673 [ - + ]: 755 : if (remaining < len) 674 : : return false; 675 : : @@ -783,21 +783,21 @@ 701 : : return true; 702 : : } 703 : : - 704 : 1576853 : static bool mptcp_established_options_rm_addr(struct sock *sk, + 704 : 2216953 : static bool mptcp_established_options_rm_addr(struct sock *sk, 705 : : unsigned int *size, 706 : : unsigned int remaining, 707 : : struct mptcp_out_options *opts) 708 : : { - 709 [ - + ]: 1576853 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); - 710 [ - + ]: 1576853 : struct mptcp_sock *msk = mptcp_sk(subflow->conn); - 711 : 1576853 : struct mptcp_rm_list rm_list; - 712 : 1576853 : int i, len; + 709 [ - + ]: 2216953 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); + 710 [ - + ]: 2216953 : struct mptcp_sock *msk = mptcp_sk(subflow->conn); + 711 : 2216953 : struct mptcp_rm_list rm_list; + 712 : 2216953 : int i, len; 713 : : - 714 [ + + - + ]: 1576959 : if (!mptcp_pm_should_rm_signal(msk) || + 714 [ + + - + ]: 2217059 : if (!mptcp_pm_should_rm_signal(msk) || 715 : 106 : !(mptcp_pm_rm_addr_signal(msk, remaining, &rm_list))) - 716 : 1576747 : return false; + 716 : 2216847 : return false; 717 : : - 718 [ - + ]: 405933 : len = mptcp_rm_addr_len(&rm_list); + 718 [ - + ]: 407239 : len = mptcp_rm_addr_len(&rm_list); 719 : 106 : if (len < 0) 720 : : return false; 721 [ - + ]: 106 : if (remaining < len) @@ -813,17 +813,17 @@ 731 : 106 : return true; 732 : : } 733 : : - 734 : 1577608 : static bool mptcp_established_options_mp_prio(struct sock *sk, + 734 : 2217708 : static bool mptcp_established_options_mp_prio(struct sock *sk, 735 : : unsigned int *size, 736 : : unsigned int remaining, 737 : : struct mptcp_out_options *opts) 738 : : { - 739 [ + + ]: 1577608 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); + 739 [ + + ]: 2217708 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); 740 : : 741 : : /* can't send MP_PRIO with MPC, as they share the same option space: 742 : : * 'backup'. Also it makes no sense at all 743 : : */ - 744 [ + + + - ]: 1577608 : if (!subflow->send_mp_prio || (opts->suboptions & OPTIONS_MPTCP_MPC)) + 744 [ + + + - ]: 2217708 : if (!subflow->send_mp_prio || (opts->suboptions & OPTIONS_MPTCP_MPC)) 745 : : return false; 746 : : 747 : : /* account for the trailing 'nop' option */ @@ -839,56 +839,56 @@ 757 : : return true; 758 : : } 759 : : - 760 : 433 : static noinline bool mptcp_established_options_rst(struct sock *sk, struct sk_buff *skb, + 760 : 430 : static noinline bool mptcp_established_options_rst(struct sock *sk, struct sk_buff *skb, 761 : : unsigned int *size, 762 : : unsigned int remaining, 763 : : struct mptcp_out_options *opts) 764 : : { - 765 [ + - ]: 433 : const struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); + 765 [ + - ]: 430 : const struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); 766 : : - 767 [ + - ]: 433 : if (remaining < TCPOLEN_MPTCP_RST) + 767 [ + - ]: 430 : if (remaining < TCPOLEN_MPTCP_RST) 768 : : return false; 769 : : - 770 : 433 : *size = TCPOLEN_MPTCP_RST; - 771 : 433 : opts->suboptions |= OPTION_MPTCP_RST; - 772 : 433 : opts->reset_transient = subflow->reset_transient; - 773 : 433 : opts->reset_reason = subflow->reset_reason; - 774 [ + - ]: 433 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPRSTTX); + 770 : 430 : *size = TCPOLEN_MPTCP_RST; + 771 : 430 : opts->suboptions |= OPTION_MPTCP_RST; + 772 : 430 : opts->reset_transient = subflow->reset_transient; + 773 : 430 : opts->reset_reason = subflow->reset_reason; + 774 [ + - ]: 430 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPRSTTX); 775 : : 776 : : return true; 777 : : } 778 : : - 779 : 433 : static bool mptcp_established_options_fastclose(struct sock *sk, + 779 : 430 : static bool mptcp_established_options_fastclose(struct sock *sk, 780 : : unsigned int *size, 781 : : unsigned int remaining, 782 : : struct mptcp_out_options *opts) 783 : : { - 784 [ - + ]: 433 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); - 785 [ - + ]: 433 : struct mptcp_sock *msk = mptcp_sk(subflow->conn); + 784 [ - + ]: 430 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); + 785 [ - + ]: 430 : struct mptcp_sock *msk = mptcp_sk(subflow->conn); 786 : : - 787 [ + + ]: 433 : if (likely(!subflow->send_fastclose)) + 787 [ + + ]: 430 : if (likely(!subflow->send_fastclose)) 788 : : return false; 789 : : - 790 [ + - ]: 363 : if (remaining < TCPOLEN_MPTCP_FASTCLOSE) + 790 [ + - ]: 358 : if (remaining < TCPOLEN_MPTCP_FASTCLOSE) 791 : : return false; 792 : : - 793 : 363 : *size = TCPOLEN_MPTCP_FASTCLOSE; - 794 : 363 : opts->suboptions |= OPTION_MPTCP_FASTCLOSE; - 795 : 363 : opts->rcvr_key = READ_ONCE(msk->remote_key); + 793 : 358 : *size = TCPOLEN_MPTCP_FASTCLOSE; + 794 : 358 : opts->suboptions |= OPTION_MPTCP_FASTCLOSE; + 795 : 358 : opts->rcvr_key = READ_ONCE(msk->remote_key); 796 : : - 797 [ - + ]: 363 : pr_debug("FASTCLOSE key=%llu\n", opts->rcvr_key); - 798 [ + - ]: 363 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPFASTCLOSETX); + 797 [ - + ]: 358 : pr_debug("FASTCLOSE key=%llu\n", opts->rcvr_key); + 798 [ + - ]: 358 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPFASTCLOSETX); 799 : : return true; 800 : : } 801 : : - 802 : 1575461 : static bool mptcp_established_options_mp_fail(struct sock *sk, + 802 : 2215567 : static bool mptcp_established_options_mp_fail(struct sock *sk, 803 : : unsigned int *size, 804 : : unsigned int remaining, 805 : : struct mptcp_out_options *opts) 806 : : { - 807 [ + + ]: 1575461 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); + 807 [ + + ]: 2215567 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); 808 : : - 809 [ + + ]: 1575461 : if (likely(!subflow->send_mp_fail)) + 809 [ + + ]: 2215567 : if (likely(!subflow->send_mp_fail)) 810 : : return false; 811 : : 812 [ + - ]: 6 : if (remaining < TCPOLEN_MPTCP_FAIL) @@ -904,43 +904,43 @@ 822 : : return true; 823 : : } 824 : : - 825 : 1605363 : bool mptcp_established_options(struct sock *sk, struct sk_buff *skb, + 825 : 2284954 : bool mptcp_established_options(struct sock *sk, struct sk_buff *skb, 826 : : unsigned int *size, unsigned int remaining, 827 : : struct mptcp_out_options *opts) 828 : : { - 829 [ - + ]: 1605363 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); - 830 [ - + ]: 1605363 : struct mptcp_sock *msk = mptcp_sk(subflow->conn); - 831 : 1605363 : unsigned int opt_size = 0; - 832 : 1605363 : bool snd_data_fin; - 833 : 1605363 : bool ret = false; + 829 [ - + ]: 2284954 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); + 830 [ - + ]: 2284954 : struct mptcp_sock *msk = mptcp_sk(subflow->conn); + 831 : 2284954 : unsigned int opt_size = 0; + 832 : 2284954 : bool snd_data_fin; + 833 : 2284954 : bool ret = false; 834 : : - 835 : 1605363 : opts->suboptions = 0; + 835 : 2284954 : opts->suboptions = 0; 836 : : - 837 [ + + + + ]: 1605363 : if (unlikely(__mptcp_check_fallback(msk) && !mptcp_check_infinite_map(skb))) + 837 [ + + + + ]: 2284954 : if (unlikely(__mptcp_check_fallback(msk) && !mptcp_check_infinite_map(skb))) 838 : : return false; 839 : : - 840 [ + + + + ]: 1578045 : if (unlikely(skb && TCP_SKB_CB(skb)->tcp_flags & TCPHDR_RST)) { - 841 [ + + + + ]: 503 : if (mptcp_established_options_fastclose(sk, &opt_size, remaining, opts) || - 842 : 70 : mptcp_established_options_mp_fail(sk, &opt_size, remaining, opts)) { - 843 : 365 : *size += opt_size; - 844 : 365 : remaining -= opt_size; + 840 [ + + + + ]: 2218142 : if (unlikely(skb && TCP_SKB_CB(skb)->tcp_flags & TCPHDR_RST)) { + 841 [ + + + + ]: 502 : if (mptcp_established_options_fastclose(sk, &opt_size, remaining, opts) || + 842 : 72 : mptcp_established_options_mp_fail(sk, &opt_size, remaining, opts)) { + 843 : 360 : *size += opt_size; + 844 : 360 : remaining -= opt_size; 845 : : } 846 : : /* MP_RST can be used with MP_FASTCLOSE and MP_FAIL if there is room */ - 847 [ + - ]: 433 : if (mptcp_established_options_rst(sk, skb, &opt_size, remaining, opts)) { - 848 : 433 : *size += opt_size; - 849 : 433 : remaining -= opt_size; + 847 [ + - ]: 430 : if (mptcp_established_options_rst(sk, skb, &opt_size, remaining, opts)) { + 848 : 430 : *size += opt_size; + 849 : 430 : remaining -= opt_size; 850 : : } - 851 : 433 : return true; + 851 : 430 : return true; 852 : : } 853 : : - 854 [ + + ]: 1577612 : snd_data_fin = mptcp_data_fin_enabled(msk); - 855 [ + + ]: 1577612 : if (mptcp_established_options_mp(sk, skb, snd_data_fin, &opt_size, opts)) + 854 [ + + ]: 2217712 : snd_data_fin = mptcp_data_fin_enabled(msk); + 855 [ + + ]: 2217712 : if (mptcp_established_options_mp(sk, skb, snd_data_fin, &opt_size, opts)) 856 : : ret = true; - 857 [ + - ]: 1575391 : else if (mptcp_established_options_dss(sk, skb, snd_data_fin, &opt_size, opts)) { - 858 : 1575391 : unsigned int mp_fail_size; + 857 [ + - ]: 2215495 : else if (mptcp_established_options_dss(sk, skb, snd_data_fin, &opt_size, opts)) { + 858 : 2215495 : unsigned int mp_fail_size; 859 : : - 860 : 1575391 : ret = true; - 861 [ + + ]: 1575391 : if (mptcp_established_options_mp_fail(sk, &mp_fail_size, + 860 : 2215495 : ret = true; + 861 [ + + ]: 2215495 : if (mptcp_established_options_mp_fail(sk, &mp_fail_size, 862 : : remaining - opt_size, opts)) { 863 : 4 : *size += opt_size + mp_fail_size; 864 : 4 : remaining -= opt_size - mp_fail_size; @@ -951,22 +951,22 @@ 869 : : /* we reserved enough space for the above options, and exceeding the 870 : : * TCP option space would be fatal 871 : : */ - 872 [ - + - + ]: 1577608 : if (WARN_ON_ONCE(opt_size > remaining)) + 872 [ - + - + ]: 2217708 : if (WARN_ON_ONCE(opt_size > remaining)) 873 : : return false; 874 : : - 875 : 1577608 : *size += opt_size; - 876 : 1577608 : remaining -= opt_size; - 877 [ + + ]: 1577608 : if (mptcp_established_options_add_addr(sk, skb, &opt_size, remaining, opts)) { + 875 : 2217708 : *size += opt_size; + 876 : 2217708 : remaining -= opt_size; + 877 [ + + ]: 2217708 : if (mptcp_established_options_add_addr(sk, skb, &opt_size, remaining, opts)) { 878 : 755 : *size += opt_size; 879 : 755 : remaining -= opt_size; 880 : 755 : ret = true; - 881 [ + + ]: 1576853 : } else if (mptcp_established_options_rm_addr(sk, &opt_size, remaining, opts)) { + 881 [ + + ]: 2216953 : } else if (mptcp_established_options_rm_addr(sk, &opt_size, remaining, opts)) { 882 : 106 : *size += opt_size; 883 : 106 : remaining -= opt_size; 884 : 106 : ret = true; 885 : : } 886 : : - 887 [ + + ]: 1577608 : if (mptcp_established_options_mp_prio(sk, &opt_size, remaining, opts)) { + 887 [ + + ]: 2217708 : if (mptcp_established_options_mp_prio(sk, &opt_size, remaining, opts)) { 888 : 28 : *size += opt_size; 889 : 28 : remaining -= opt_size; 890 : 28 : ret = true; @@ -975,36 +975,36 @@ 893 : : return ret; 894 : : } 895 : : - 896 : 1779 : bool mptcp_synack_options(const struct request_sock *req, unsigned int *size, + 896 : 1787 : bool mptcp_synack_options(const struct request_sock *req, unsigned int *size, 897 : : struct mptcp_out_options *opts) 898 : : { - 899 : 1779 : struct mptcp_subflow_request_sock *subflow_req = mptcp_subflow_rsk(req); + 899 : 1787 : struct mptcp_subflow_request_sock *subflow_req = mptcp_subflow_rsk(req); 900 : : - 901 [ + + ]: 1779 : if (subflow_req->mp_capable) { - 902 : 1186 : opts->suboptions = OPTION_MPTCP_MPC_SYNACK; - 903 : 1186 : opts->sndr_key = subflow_req->local_key; - 904 : 1186 : opts->csum_reqd = subflow_req->csum_reqd; - 905 : 1186 : opts->allow_join_id0 = subflow_req->allow_join_id0; - 906 : 1186 : *size = TCPOLEN_MPTCP_MPC_SYNACK; - 907 [ - + ]: 1186 : pr_debug("subflow_req=%p, local_key=%llu\n", + 901 [ + + ]: 1787 : if (subflow_req->mp_capable) { + 902 : 1188 : opts->suboptions = OPTION_MPTCP_MPC_SYNACK; + 903 : 1188 : opts->sndr_key = subflow_req->local_key; + 904 : 1188 : opts->csum_reqd = subflow_req->csum_reqd; + 905 : 1188 : opts->allow_join_id0 = subflow_req->allow_join_id0; + 906 : 1188 : *size = TCPOLEN_MPTCP_MPC_SYNACK; + 907 [ - + ]: 1188 : pr_debug("subflow_req=%p, local_key=%llu\n", 908 : : subflow_req, subflow_req->local_key); - 909 : 1186 : return true; - 910 [ + + ]: 593 : } else if (subflow_req->mp_join) { - 911 : 517 : opts->suboptions = OPTION_MPTCP_MPJ_SYNACK; - 912 : 517 : opts->backup = subflow_req->request_bkup; - 913 : 517 : opts->join_id = subflow_req->local_id; - 914 : 517 : opts->thmac = subflow_req->thmac; - 915 : 517 : opts->nonce = subflow_req->local_nonce; - 916 [ - + ]: 517 : pr_debug("req=%p, bkup=%u, id=%u, thmac=%llu, nonce=%u\n", + 909 : 1188 : return true; + 910 [ + + ]: 599 : } else if (subflow_req->mp_join) { + 911 : 523 : opts->suboptions = OPTION_MPTCP_MPJ_SYNACK; + 912 : 523 : opts->backup = subflow_req->request_bkup; + 913 : 523 : opts->join_id = subflow_req->local_id; + 914 : 523 : opts->thmac = subflow_req->thmac; + 915 : 523 : opts->nonce = subflow_req->local_nonce; + 916 [ - + ]: 523 : pr_debug("req=%p, bkup=%u, id=%u, thmac=%llu, nonce=%u\n", 917 : : subflow_req, opts->backup, opts->join_id, 918 : : opts->thmac, opts->nonce); - 919 : 517 : *size = TCPOLEN_MPTCP_MPJ_SYNACK; - 920 : 517 : return true; + 919 : 523 : *size = TCPOLEN_MPTCP_MPJ_SYNACK; + 920 : 523 : return true; 921 : : } 922 : : return false; 923 : : } 924 : : - 925 : 780307 : static bool check_fully_established(struct mptcp_sock *msk, struct sock *ssk, + 925 : 1076175 : static bool check_fully_established(struct mptcp_sock *msk, struct sock *ssk, 926 : : struct mptcp_subflow_context *subflow, 927 : : struct sk_buff *skb, 928 : : struct mptcp_options_received *mp_opt) @@ -1012,17 +1012,17 @@ 930 : : /* here we can process OoO, in-window pkts, only in-sequence 4th ack 931 : : * will make the subflow fully established 932 : : */ - 933 [ + + + + ]: 780307 : if (likely(READ_ONCE(subflow->fully_established))) { + 933 [ + + + + ]: 1076175 : if (likely(READ_ONCE(subflow->fully_established))) { 934 : : /* on passive sockets, check for 3rd ack retransmission 935 : : * note that msk is always set by subflow_syn_recv_sock() 936 : : * for mp_join subflows 937 : : */ - 938 [ + + ]: 778674 : if (TCP_SKB_CB(skb)->seq == subflow->ssn_offset + 1 && - 939 [ + + + + ]: 101256 : TCP_SKB_CB(skb)->end_seq == TCP_SKB_CB(skb)->seq && - 940 [ + + ]: 40229 : subflow->mp_join && (mp_opt->suboptions & OPTIONS_MPTCP_MPJ) && - 941 [ + - ]: 507 : !subflow->request_join) - 942 : 507 : tcp_send_ack(ssk); - 943 : 778674 : goto check_notify; + 938 [ + + ]: 1074544 : if (TCP_SKB_CB(skb)->seq == subflow->ssn_offset + 1 && + 939 [ + + + + ]: 126268 : TCP_SKB_CB(skb)->end_seq == TCP_SKB_CB(skb)->seq && + 940 [ + + ]: 59156 : subflow->mp_join && (mp_opt->suboptions & OPTIONS_MPTCP_MPJ) && + 941 [ + - ]: 510 : !subflow->request_join) + 942 : 510 : tcp_send_ack(ssk); + 943 : 1074544 : goto check_notify; 944 : : } 945 : : 946 : : /* we must process OoO packets before the first subflow is fully @@ -1030,19 +1030,19 @@ 948 : : * for MP_JOIN subflows as the peer must not send any data 949 : : * before receiving the forth ack - cfr. RFC 8684 section 3.2. 950 : : */ - 951 [ + + ]: 1633 : if (TCP_SKB_CB(skb)->seq != subflow->ssn_offset + 1) { - 952 [ - + ]: 50 : if (subflow->mp_join) + 951 [ + + ]: 1631 : if (TCP_SKB_CB(skb)->seq != subflow->ssn_offset + 1) { + 952 [ - + ]: 48 : if (subflow->mp_join) 953 : 0 : goto reset; - 954 [ - + - - ]: 50 : if (subflow->is_mptfo && mp_opt->suboptions & OPTION_MPTCP_MPC_ACK) + 954 [ - + - - ]: 48 : if (subflow->is_mptfo && mp_opt->suboptions & OPTION_MPTCP_MPC_ACK) 955 : 0 : goto set_fully_established; - 956 : 50 : return subflow->mp_capable; + 956 : 48 : return subflow->mp_capable; 957 : : } 958 : : 959 [ + + ]: 1583 : if (subflow->remote_key_valid && - 960 [ + + - + : 1557 : (((mp_opt->suboptions & OPTION_MPTCP_DSS) && mp_opt->use_ack) || - + + ] - 961 : 140 : ((mp_opt->suboptions & OPTION_MPTCP_ADD_ADDR) && - 962 [ + + + - ]: 140 : (!mp_opt->echo || subflow->mp_join)))) { + 960 [ + + - + : 1557 : (((mp_opt->suboptions & OPTION_MPTCP_DSS) && mp_opt->use_ack) || + + + ] + 961 : 143 : ((mp_opt->suboptions & OPTION_MPTCP_ADD_ADDR) && + 962 [ + + + - ]: 143 : (!mp_opt->echo || subflow->mp_join)))) { 963 : : /* subflows are fully established as soon as we get any 964 : : * additional ack, including ADD_ADDR. 965 : : */ @@ -1074,13 +1074,13 @@ 991 : 1575 : __mptcp_subflow_fully_established(msk, subflow, mp_opt); 992 : 1575 : mptcp_data_unlock((struct sock *)msk); 993 : : - 994 : 780249 : check_notify: + 994 : 1076119 : check_notify: 995 : : /* if the subflow is not already linked into the conn_list, we can't 996 : : * notify the PM: this subflow is still on the listener queue 997 : : * and the PM possibly acquiring the subflow lock could race with 998 : : * the listener close 999 : : */ - 1000 [ + + + - ]: 780249 : if (likely(subflow->pm_notified) || list_empty(&subflow->node)) + 1000 [ + + + - ]: 1076119 : if (likely(subflow->pm_notified) || list_empty(&subflow->node)) 1001 : : return true; 1002 : : 1003 : 2080 : subflow->pm_notified = 1; @@ -1097,85 +1097,85 @@ 1014 : 8 : return false; 1015 : : } 1016 : : - 1017 : 133771 : u64 __mptcp_expand_seq(u64 old_seq, u64 cur_seq) + 1017 : 157587 : u64 __mptcp_expand_seq(u64 old_seq, u64 cur_seq) 1018 : : { - 1019 : 133771 : u32 old_seq32, cur_seq32; + 1019 : 157587 : u32 old_seq32, cur_seq32; 1020 : : - 1021 : 133771 : old_seq32 = (u32)old_seq; - 1022 : 133771 : cur_seq32 = (u32)cur_seq; - 1023 : 133771 : cur_seq = (old_seq & GENMASK_ULL(63, 32)) + cur_seq32; - 1024 [ - + - - ]: 133771 : if (unlikely(cur_seq32 < old_seq32 && before(old_seq32, cur_seq32))) + 1021 : 157587 : old_seq32 = (u32)old_seq; + 1022 : 157587 : cur_seq32 = (u32)cur_seq; + 1023 : 157587 : cur_seq = (old_seq & GENMASK_ULL(63, 32)) + cur_seq32; + 1024 [ - + - - ]: 157587 : if (unlikely(cur_seq32 < old_seq32 && before(old_seq32, cur_seq32))) 1025 : 0 : return cur_seq + (1LL << 32); 1026 : : 1027 : : /* reverse wrap could happen, too */ - 1028 [ + + - + ]: 133771 : if (unlikely(cur_seq32 > old_seq32 && after(old_seq32, cur_seq32))) + 1028 [ + + - + ]: 157587 : if (unlikely(cur_seq32 > old_seq32 && after(old_seq32, cur_seq32))) 1029 : 0 : return cur_seq - (1LL << 32); 1030 : : return cur_seq; 1031 : : } 1032 : : 1033 : 0 : static void __mptcp_snd_una_update(struct mptcp_sock *msk, u64 new_snd_una) 1034 : : { - 1035 : 171750 : msk->bytes_acked += new_snd_una - msk->snd_una; - 1036 : 171750 : WRITE_ONCE(msk->snd_una, new_snd_una); + 1035 : 274676 : msk->bytes_acked += new_snd_una - msk->snd_una; + 1036 : 274676 : WRITE_ONCE(msk->snd_una, new_snd_una); 1037 : : } 1038 : : - 1039 : 776804 : static void ack_update_msk(struct mptcp_sock *msk, + 1039 : 1072722 : static void ack_update_msk(struct mptcp_sock *msk, 1040 : : struct sock *ssk, 1041 : : struct mptcp_options_received *mp_opt) 1042 : : { - 1043 : 776804 : u64 new_wnd_end, new_snd_una, snd_nxt = READ_ONCE(msk->snd_nxt); - 1044 : 776804 : struct sock *sk = (struct sock *)msk; - 1045 : 776804 : u64 old_snd_una; + 1043 : 1072722 : u64 new_wnd_end, new_snd_una, snd_nxt = READ_ONCE(msk->snd_nxt); + 1044 : 1072722 : struct sock *sk = (struct sock *)msk; + 1045 : 1072722 : u64 old_snd_una; 1046 : : - 1047 : 776804 : mptcp_data_lock(sk); + 1047 : 1072722 : mptcp_data_lock(sk); 1048 : : 1049 : : /* avoid ack expansion on update conflict, to reduce the risk of 1050 : : * wrongly expanding to a future ack sequence number, which is way 1051 : : * more dangerous than missing an ack 1052 : : */ - 1053 : 776804 : old_snd_una = msk->snd_una; - 1054 [ + + ]: 776804 : new_snd_una = mptcp_expand_seq(old_snd_una, mp_opt->data_ack, mp_opt->ack64); + 1053 : 1072722 : old_snd_una = msk->snd_una; + 1054 [ + + ]: 1072722 : new_snd_una = mptcp_expand_seq(old_snd_una, mp_opt->data_ack, mp_opt->ack64); 1055 : : 1056 : : /* ACK for data not even sent yet? Ignore.*/ - 1057 [ + + ]: 776804 : if (unlikely(after64(new_snd_una, snd_nxt))) - 1058 : 46 : new_snd_una = old_snd_una; + 1057 [ + + ]: 1072722 : if (unlikely(after64(new_snd_una, snd_nxt))) + 1058 : 54 : new_snd_una = old_snd_una; 1059 : : - 1060 [ - + ]: 776804 : new_wnd_end = new_snd_una + tcp_sk(ssk)->snd_wnd; + 1060 [ - + ]: 1072722 : new_wnd_end = new_snd_una + tcp_sk(ssk)->snd_wnd; 1061 : : - 1062 [ + + ]: 776804 : if (after64(new_wnd_end, msk->wnd_end)) - 1063 : 215375 : WRITE_ONCE(msk->wnd_end, new_wnd_end); + 1062 [ + + ]: 1072722 : if (after64(new_wnd_end, msk->wnd_end)) + 1063 : 317239 : WRITE_ONCE(msk->wnd_end, new_wnd_end); 1064 : : 1065 : : /* this assumes mptcp_incoming_options() is invoked after tcp_ack() */ - 1066 [ + + ]: 776804 : if (after64(msk->wnd_end, snd_nxt)) - 1067 : 757490 : __mptcp_check_push(sk, ssk); + 1066 [ + + ]: 1072722 : if (after64(msk->wnd_end, snd_nxt)) + 1067 : 966459 : __mptcp_check_push(sk, ssk); 1068 : : - 1069 [ + + ]: 776804 : if (after64(new_snd_una, old_snd_una)) { - 1070 : 205863 : __mptcp_snd_una_update(msk, new_snd_una); - 1071 : 205863 : __mptcp_data_acked(sk); + 1069 [ + + ]: 1072722 : if (after64(new_snd_una, old_snd_una)) { + 1070 : 302354 : __mptcp_snd_una_update(msk, new_snd_una); + 1071 : 302354 : __mptcp_data_acked(sk); 1072 : : } - 1073 : 776804 : msk->last_ack_recv = tcp_jiffies32; - 1074 : 776804 : mptcp_data_unlock(sk); + 1073 : 1072722 : msk->last_ack_recv = tcp_jiffies32; + 1074 : 1072722 : mptcp_data_unlock(sk); 1075 : : - 1076 : 776804 : trace_ack_update_msk(mp_opt->data_ack, + 1076 : 1072722 : trace_ack_update_msk(mp_opt->data_ack, 1077 : : old_snd_una, new_snd_una, - 1078 : 776804 : new_wnd_end, READ_ONCE(msk->wnd_end)); - 1079 : 776804 : } + 1078 : 1072722 : new_wnd_end, READ_ONCE(msk->wnd_end)); + 1079 : 1072722 : } 1080 : : - 1081 : 9627 : bool mptcp_update_rcv_data_fin(struct mptcp_sock *msk, u64 data_fin_seq, bool use_64bit) + 1081 : 6991 : bool mptcp_update_rcv_data_fin(struct mptcp_sock *msk, u64 data_fin_seq, bool use_64bit) 1082 : : { 1083 : : /* Skip if DATA_FIN was already received. 1084 : : * If updating simultaneously with the recvmsg loop, values 1085 : : * should match. If they mismatch, the peer is misbehaving and 1086 : : * we will prefer the most recent information. 1087 : : */ - 1088 [ + + + + ]: 9627 : if (READ_ONCE(msk->rcv_data_fin)) + 1088 [ + + + + ]: 6991 : if (READ_ONCE(msk->rcv_data_fin)) 1089 : : return false; 1090 : : - 1091 [ + + ]: 2205 : WRITE_ONCE(msk->rcv_data_fin_seq, + 1091 [ + + ]: 2207 : WRITE_ONCE(msk->rcv_data_fin_seq, 1092 : : mptcp_expand_seq(READ_ONCE(msk->ack_seq), data_fin_seq, use_64bit)); - 1093 : 2205 : WRITE_ONCE(msk->rcv_data_fin, 1); + 1093 : 2207 : WRITE_ONCE(msk->rcv_data_fin, 1); 1094 : : - 1095 : 2205 : return true; + 1095 : 2207 : return true; 1096 : : } 1097 : : 1098 : 691 : static bool add_addr_hmac_valid(struct mptcp_sock *msk, @@ -1197,50 +1197,50 @@ 1114 : : } 1115 : : 1116 : : /* Return false if a subflow has been reset, else return true */ - 1117 : 787815 : bool mptcp_incoming_options(struct sock *sk, struct sk_buff *skb) + 1117 : 1090052 : bool mptcp_incoming_options(struct sock *sk, struct sk_buff *skb) 1118 : : { - 1119 [ - + ]: 787815 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); - 1120 [ - + ]: 787815 : struct mptcp_sock *msk = mptcp_sk(subflow->conn); - 1121 : 787815 : struct mptcp_options_received mp_opt; - 1122 : 787815 : struct mptcp_ext *mpext; + 1119 [ - + ]: 1090052 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); + 1120 [ - + ]: 1090052 : struct mptcp_sock *msk = mptcp_sk(subflow->conn); + 1121 : 1090052 : struct mptcp_options_received mp_opt; + 1122 : 1090052 : struct mptcp_ext *mpext; 1123 : : - 1124 [ + + ]: 787815 : if (__mptcp_check_fallback(msk)) { + 1124 [ + + ]: 1090052 : if (__mptcp_check_fallback(msk)) { 1125 : : /* Keep it simple and unconditionally trigger send data cleanup and 1126 : : * pending queue spooling. We will need to acquire the data lock 1127 : : * for more accurate checks, and once the lock is acquired, such 1128 : : * helpers are cheap. 1129 : : */ - 1130 : 7508 : mptcp_data_lock(subflow->conn); - 1131 [ + + ]: 7508 : if (sk_stream_memory_free(sk)) - 1132 : 7499 : __mptcp_check_push(subflow->conn, sk); + 1130 : 13877 : mptcp_data_lock(subflow->conn); + 1131 [ + + ]: 13877 : if (sk_stream_memory_free(sk)) + 1132 : 13303 : __mptcp_check_push(subflow->conn, sk); 1133 : : 1134 : : /* on fallback we just need to ignore the msk-level snd_una, as 1135 : : * this is really plain TCP 1136 : : */ - 1137 : 7508 : __mptcp_snd_una_update(msk, READ_ONCE(msk->snd_nxt)); + 1137 : 13877 : __mptcp_snd_una_update(msk, READ_ONCE(msk->snd_nxt)); 1138 : : - 1139 : 7508 : __mptcp_data_acked(subflow->conn); - 1140 : 7508 : mptcp_data_unlock(subflow->conn); - 1141 : 7508 : return true; + 1139 : 13877 : __mptcp_data_acked(subflow->conn); + 1140 : 13877 : mptcp_data_unlock(subflow->conn); + 1141 : 13877 : return true; 1142 : : } 1143 : : - 1144 : 780307 : mptcp_get_options(skb, &mp_opt); + 1144 : 1076175 : mptcp_get_options(skb, &mp_opt); 1145 : : 1146 : : /* The subflow can be in close state only if check_fully_established() 1147 : : * just sent a reset. If so, tell the caller to ignore the current packet. 1148 : : */ - 1149 [ + + ]: 780307 : if (!check_fully_established(msk, sk, subflow, skb, &mp_opt)) - 1150 : 52 : return sk->sk_state != TCP_CLOSE; + 1149 [ + + ]: 1076175 : if (!check_fully_established(msk, sk, subflow, skb, &mp_opt)) + 1150 : 50 : return sk->sk_state != TCP_CLOSE; 1151 : : - 1152 [ + + ]: 780255 : if (unlikely(mp_opt.suboptions != OPTION_MPTCP_DSS)) { - 1153 [ + + ]: 5553 : if ((mp_opt.suboptions & OPTION_MPTCP_FASTCLOSE) && - 1154 [ + + ]: 263 : READ_ONCE(msk->local_key) == mp_opt.rcvr_key) { - 1155 : 253 : WRITE_ONCE(msk->rcv_fastclose, true); - 1156 : 253 : mptcp_schedule_work((struct sock *)msk); - 1157 [ + - ]: 253 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPFASTCLOSERX); + 1152 [ + + ]: 1076125 : if (unlikely(mp_opt.suboptions != OPTION_MPTCP_DSS)) { + 1153 [ + + ]: 5477 : if ((mp_opt.suboptions & OPTION_MPTCP_FASTCLOSE) && + 1154 [ + + ]: 255 : READ_ONCE(msk->local_key) == mp_opt.rcvr_key) { + 1155 : 245 : WRITE_ONCE(msk->rcv_fastclose, true); + 1156 : 245 : mptcp_schedule_work((struct sock *)msk); + 1157 [ + - ]: 245 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPFASTCLOSERX); 1158 : : } 1159 : : - 1160 [ + + + - ]: 6244 : if ((mp_opt.suboptions & OPTION_MPTCP_ADD_ADDR) && + 1160 [ + + + - ]: 6168 : if ((mp_opt.suboptions & OPTION_MPTCP_ADD_ADDR) && 1161 : 691 : add_addr_hmac_valid(msk, &mp_opt)) { 1162 [ + + ]: 691 : if (!mp_opt.echo) { 1163 : 360 : mptcp_pm_add_addr_received(sk, &mp_opt.addr); @@ -1255,184 +1255,184 @@ 1172 [ + - ]: 68 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_PORTADD); 1173 : : } 1174 : : - 1175 [ + + ]: 5553 : if (mp_opt.suboptions & OPTION_MPTCP_RM_ADDR) + 1175 [ + + ]: 5477 : if (mp_opt.suboptions & OPTION_MPTCP_RM_ADDR) 1176 : 106 : mptcp_pm_rm_addr_received(msk, &mp_opt.rm_list); 1177 : : - 1178 [ + + ]: 5553 : if (mp_opt.suboptions & OPTION_MPTCP_PRIO) { + 1178 [ + + ]: 5477 : if (mp_opt.suboptions & OPTION_MPTCP_PRIO) { 1179 : 40 : mptcp_pm_mp_prio_received(sk, mp_opt.backup); 1180 [ + - ]: 40 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPPRIORX); 1181 : : } 1182 : : - 1183 [ + + ]: 5553 : if (mp_opt.suboptions & OPTION_MPTCP_FAIL) { + 1183 [ + + ]: 5477 : if (mp_opt.suboptions & OPTION_MPTCP_FAIL) { 1184 : 6 : mptcp_pm_mp_fail_received(sk, mp_opt.fail_seq); 1185 [ + - ]: 6 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPFAILRX); 1186 : : } 1187 : : - 1188 [ + + ]: 5553 : if (mp_opt.suboptions & OPTION_MPTCP_RST) { - 1189 : 263 : subflow->reset_seen = 1; - 1190 : 263 : subflow->reset_reason = mp_opt.reset_reason; - 1191 : 263 : subflow->reset_transient = mp_opt.reset_transient; - 1192 [ + - ]: 263 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPRSTRX); + 1188 [ + + ]: 5477 : if (mp_opt.suboptions & OPTION_MPTCP_RST) { + 1189 : 256 : subflow->reset_seen = 1; + 1190 : 256 : subflow->reset_reason = mp_opt.reset_reason; + 1191 : 256 : subflow->reset_transient = mp_opt.reset_transient; + 1192 [ + - ]: 256 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPRSTRX); 1193 : : } 1194 : : - 1195 [ + + ]: 5553 : if (!(mp_opt.suboptions & OPTION_MPTCP_DSS)) + 1195 [ + + ]: 5477 : if (!(mp_opt.suboptions & OPTION_MPTCP_DSS)) 1196 : : return true; 1197 : : } 1198 : : 1199 : : /* we can't wait for recvmsg() to update the ack_seq, otherwise 1200 : : * monodirectional flows will stuck 1201 : : */ - 1202 [ + + ]: 777474 : if (mp_opt.use_ack) - 1203 : 776804 : ack_update_msk(msk, sk, &mp_opt); + 1202 [ + + ]: 1073347 : if (mp_opt.use_ack) + 1203 : 1072722 : ack_update_msk(msk, sk, &mp_opt); 1204 : : 1205 : : /* Zero-data-length packets are dropped by the caller and not 1206 : : * propagated to the MPTCP layer, so the skb extension does not 1207 : : * need to be allocated or populated. DATA_FIN information, if 1208 : : * present, needs to be updated here before the skb is freed. 1209 : : */ - 1210 [ + + ]: 777474 : if (TCP_SKB_CB(skb)->seq == TCP_SKB_CB(skb)->end_seq) { - 1211 [ + + + - : 291771 : if (mp_opt.data_fin && mp_opt.data_len == 1 && - + + ] - 1212 : 8085 : mptcp_update_rcv_data_fin(msk, mp_opt.data_seq, mp_opt.dsn64)) - 1213 : 2112 : mptcp_schedule_work((struct sock *)msk); + 1210 [ + + ]: 1073347 : if (TCP_SKB_CB(skb)->seq == TCP_SKB_CB(skb)->end_seq) { + 1211 [ + + + - : 371080 : if (mp_opt.data_fin && mp_opt.data_len == 1 && + + + ] + 1212 : 5793 : mptcp_update_rcv_data_fin(msk, mp_opt.data_seq, mp_opt.dsn64)) + 1213 : 2116 : mptcp_schedule_work((struct sock *)msk); 1214 : : - 1215 : 283686 : return true; + 1215 : 365287 : return true; 1216 : : } 1217 : : - 1218 : 493788 : mpext = skb_ext_add(skb, SKB_EXT_MPTCP); - 1219 [ - + ]: 493788 : if (!mpext) + 1218 : 708060 : mpext = skb_ext_add(skb, SKB_EXT_MPTCP); + 1219 [ - + ]: 708060 : if (!mpext) 1220 : : return true; 1221 : : - 1222 : 493788 : memset(mpext, 0, sizeof(*mpext)); + 1222 : 708060 : memset(mpext, 0, sizeof(*mpext)); 1223 : : - 1224 [ + + ]: 493788 : if (likely(mp_opt.use_map)) { - 1225 [ + + ]: 491742 : if (mp_opt.mpc_map) { + 1224 [ + + ]: 708060 : if (likely(mp_opt.use_map)) { + 1225 [ + + ]: 706065 : if (mp_opt.mpc_map) { 1226 : : /* this is an MP_CAPABLE carrying MPTCP data 1227 : : * we know this map the first chunk of data 1228 : : */ - 1229 : 670 : mptcp_crypto_key_sha(subflow->remote_key, NULL, + 1229 : 625 : mptcp_crypto_key_sha(subflow->remote_key, NULL, 1230 : : &mpext->data_seq); - 1231 : 670 : mpext->data_seq++; - 1232 : 670 : mpext->subflow_seq = 1; - 1233 : 670 : mpext->dsn64 = 1; - 1234 : 670 : mpext->mpc_map = 1; - 1235 : 670 : mpext->data_fin = 0; + 1231 : 625 : mpext->data_seq++; + 1232 : 625 : mpext->subflow_seq = 1; + 1233 : 625 : mpext->dsn64 = 1; + 1234 : 625 : mpext->mpc_map = 1; + 1235 : 625 : mpext->data_fin = 0; 1236 : : } else { - 1237 : 491072 : mpext->data_seq = mp_opt.data_seq; - 1238 : 491072 : mpext->subflow_seq = mp_opt.subflow_seq; - 1239 : 491072 : mpext->dsn64 = mp_opt.dsn64; - 1240 : 491072 : mpext->data_fin = mp_opt.data_fin; + 1237 : 705440 : mpext->data_seq = mp_opt.data_seq; + 1238 : 705440 : mpext->subflow_seq = mp_opt.subflow_seq; + 1239 : 705440 : mpext->dsn64 = mp_opt.dsn64; + 1240 : 705440 : mpext->data_fin = mp_opt.data_fin; 1241 : : } - 1242 : 491742 : mpext->data_len = mp_opt.data_len; - 1243 : 491742 : mpext->use_map = 1; - 1244 : 491742 : mpext->csum_reqd = !!(mp_opt.suboptions & OPTION_MPTCP_CSUMREQD); + 1242 : 706065 : mpext->data_len = mp_opt.data_len; + 1243 : 706065 : mpext->use_map = 1; + 1244 : 706065 : mpext->csum_reqd = !!(mp_opt.suboptions & OPTION_MPTCP_CSUMREQD); 1245 : : - 1246 [ + + ]: 491742 : if (mpext->csum_reqd) - 1247 : 1611 : mpext->csum = mp_opt.csum; + 1246 [ + + ]: 706065 : if (mpext->csum_reqd) + 1247 : 1607 : mpext->csum = mp_opt.csum; 1248 : : } 1249 : : 1250 : : return true; 1251 : : } 1252 : : - 1253 : 649633 : static void mptcp_set_rwin(struct tcp_sock *tp, struct tcphdr *th) + 1253 : 883054 : static void mptcp_set_rwin(struct tcp_sock *tp, struct tcphdr *th) 1254 : : { - 1255 : 649633 : const struct sock *ssk = (const struct sock *)tp; - 1256 : 649633 : struct mptcp_subflow_context *subflow; - 1257 : 649633 : u64 ack_seq, rcv_wnd_old, rcv_wnd_new; - 1258 : 649633 : struct mptcp_sock *msk; - 1259 : 649633 : u32 new_win; - 1260 : 649633 : u64 win; + 1255 : 883054 : const struct sock *ssk = (const struct sock *)tp; + 1256 : 883054 : struct mptcp_subflow_context *subflow; + 1257 : 883054 : u64 ack_seq, rcv_wnd_old, rcv_wnd_new; + 1258 : 883054 : struct mptcp_sock *msk; + 1259 : 883054 : u32 new_win; + 1260 : 883054 : u64 win; 1261 : : - 1262 [ - + ]: 649633 : subflow = mptcp_subflow_ctx(ssk); - 1263 [ - + ]: 649633 : msk = mptcp_sk(subflow->conn); + 1262 [ - + ]: 883054 : subflow = mptcp_subflow_ctx(ssk); + 1263 [ - + ]: 883054 : msk = mptcp_sk(subflow->conn); 1264 : : - 1265 : 649633 : ack_seq = READ_ONCE(msk->ack_seq); - 1266 : 649633 : rcv_wnd_new = ack_seq + tp->rcv_wnd; + 1265 : 883054 : ack_seq = READ_ONCE(msk->ack_seq); + 1266 : 883054 : rcv_wnd_new = ack_seq + tp->rcv_wnd; 1267 : : - 1268 [ + + ]: 649633 : rcv_wnd_old = atomic64_read(&msk->rcv_wnd_sent); - 1269 [ + + ]: 649633 : if (after64(rcv_wnd_new, rcv_wnd_old)) { - 1270 : 44244 : u64 rcv_wnd; + 1268 [ + + ]: 883054 : rcv_wnd_old = atomic64_read(&msk->rcv_wnd_sent); + 1269 [ + + ]: 883054 : if (after64(rcv_wnd_new, rcv_wnd_old)) { + 1270 : 44501 : u64 rcv_wnd; 1271 : : - 1272 : 237793 : for (;;) { - 1273 : 282037 : rcv_wnd = atomic64_cmpxchg(&msk->rcv_wnd_sent, rcv_wnd_old, rcv_wnd_new); + 1272 : 344752 : for (;;) { + 1273 : 389253 : rcv_wnd = atomic64_cmpxchg(&msk->rcv_wnd_sent, rcv_wnd_old, rcv_wnd_new); 1274 : : - 1275 [ + + ]: 237793 : if (rcv_wnd == rcv_wnd_old) + 1275 [ + + ]: 344752 : if (rcv_wnd == rcv_wnd_old) 1276 : : break; 1277 : : - 1278 : 4 : rcv_wnd_old = rcv_wnd; - 1279 [ + + ]: 4 : if (before64(rcv_wnd_new, rcv_wnd_old)) { - 1280 [ # # ]: 3 : MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_RCVWNDCONFLICTUPDATE); - 1281 : 3 : goto raise_win; + 1278 : 6 : rcv_wnd_old = rcv_wnd; + 1279 [ - + ]: 6 : if (before64(rcv_wnd_new, rcv_wnd_old)) { + 1280 [ # # ]: 0 : MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_RCVWNDCONFLICTUPDATE); + 1281 : 0 : goto raise_win; 1282 : : } - 1283 [ - - ]: 44245 : MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_RCVWNDCONFLICT); + 1283 [ - + ]: 44507 : MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_RCVWNDCONFLICT); 1284 : : } 1285 : : return; 1286 : : } 1287 : : - 1288 [ + + ]: 411841 : if (rcv_wnd_new != rcv_wnd_old) { - 1289 : 53858 : raise_win: - 1290 : 53861 : win = rcv_wnd_old - ack_seq; - 1291 : 53861 : tp->rcv_wnd = min_t(u64, win, U32_MAX); - 1292 : 53861 : new_win = tp->rcv_wnd; + 1288 [ + + ]: 538308 : if (rcv_wnd_new != rcv_wnd_old) { + 1289 : 64583 : raise_win: + 1290 : 64583 : win = rcv_wnd_old - ack_seq; + 1291 : 64583 : tp->rcv_wnd = min_t(u64, win, U32_MAX); + 1292 : 64583 : new_win = tp->rcv_wnd; 1293 : : 1294 : : /* Make sure we do not exceed the maximum possible 1295 : : * scaled window. 1296 : : */ - 1297 [ + + ]: 53861 : if (unlikely(th->syn)) - 1298 : 526 : new_win = min(new_win, 65535U) << tp->rx_opt.rcv_wscale; - 1299 [ - + - - ]: 53861 : if (!tp->rx_opt.rcv_wscale && + 1297 [ + + ]: 64583 : if (unlikely(th->syn)) + 1298 : 521 : new_win = min(new_win, 65535U) << tp->rx_opt.rcv_wscale; + 1299 [ - + - - ]: 64583 : if (!tp->rx_opt.rcv_wscale && 1300 [ # # ]: 0 : READ_ONCE(sock_net(ssk)->ipv4.sysctl_tcp_workaround_signed_windows)) 1301 : 0 : new_win = min(new_win, MAX_TCP_WINDOW); 1302 : : else - 1303 : 53861 : new_win = min(new_win, (65535U << tp->rx_opt.rcv_wscale)); + 1303 : 64583 : new_win = min(new_win, (65535U << tp->rx_opt.rcv_wscale)); 1304 : : 1305 : : /* RFC1323 scaling applied */ - 1306 : 53861 : new_win >>= tp->rx_opt.rcv_wscale; - 1307 : 53861 : th->window = htons(new_win); - 1308 [ + - ]: 53861 : MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_RCVWNDSHARED); + 1306 : 64583 : new_win >>= tp->rx_opt.rcv_wscale; + 1307 : 64583 : th->window = htons(new_win); + 1308 [ + - ]: 64583 : MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_RCVWNDSHARED); 1309 : : } 1310 : : } 1311 : : - 1312 : 2068 : __sum16 __mptcp_make_csum(u64 data_seq, u32 subflow_seq, u16 data_len, __wsum sum) + 1312 : 2043 : __sum16 __mptcp_make_csum(u64 data_seq, u32 subflow_seq, u16 data_len, __wsum sum) 1313 : : { - 1314 : 2068 : struct csum_pseudo_header header; - 1315 : 2068 : __wsum csum; + 1314 : 2043 : struct csum_pseudo_header header; + 1315 : 2043 : __wsum csum; 1316 : : 1317 : : /* cfr RFC 8684 3.3.1.: 1318 : : * the data sequence number used in the pseudo-header is 1319 : : * always the 64-bit value, irrespective of what length is used in the 1320 : : * DSS option itself. 1321 : : */ - 1322 : 2068 : header.data_seq = cpu_to_be64(data_seq); - 1323 : 2068 : header.subflow_seq = htonl(subflow_seq); - 1324 : 2068 : header.data_len = htons(data_len); - 1325 : 2068 : header.csum = 0; + 1322 : 2043 : header.data_seq = cpu_to_be64(data_seq); + 1323 : 2043 : header.subflow_seq = htonl(subflow_seq); + 1324 : 2043 : header.data_len = htons(data_len); + 1325 : 2043 : header.csum = 0; 1326 : : - 1327 : 2068 : csum = csum_partial(&header, sizeof(header), sum); - 1328 : 2068 : return csum_fold(csum); + 1327 : 2043 : csum = csum_partial(&header, sizeof(header), sum); + 1328 : 2043 : return csum_fold(csum); 1329 : : } 1330 : : - 1331 : 1928 : static __sum16 mptcp_make_csum(const struct mptcp_ext *mpext) + 1331 : 1902 : static __sum16 mptcp_make_csum(const struct mptcp_ext *mpext) 1332 : : { - 1333 : 3856 : return __mptcp_make_csum(mpext->data_seq, mpext->subflow_seq, mpext->data_len, - 1334 : 1928 : ~csum_unfold(mpext->csum)); + 1333 : 3804 : return __mptcp_make_csum(mpext->data_seq, mpext->subflow_seq, mpext->data_len, + 1334 : 1902 : ~csum_unfold(mpext->csum)); 1335 : : } 1336 : : 1337 : 0 : static void put_len_csum(u16 len, __sum16 csum, void *data) 1338 : : { - 1339 : 1934 : __sum16 *sumptr = data + 2; - 1340 : 1934 : __be16 *ptr = data; + 1339 : 1908 : __sum16 *sumptr = data + 2; + 1340 : 1908 : __be16 *ptr = data; 1341 : : - 1342 : 1934 : put_unaligned_be16(len, ptr); + 1342 : 1908 : put_unaligned_be16(len, ptr); 1343 : : - 1344 : 1934 : put_unaligned(csum, sumptr); - 1345 : 1934 : } + 1344 : 1908 : put_unaligned(csum, sumptr); + 1345 : 1908 : } 1346 : : - 1347 : 651773 : void mptcp_write_options(struct tcphdr *th, __be32 *ptr, struct tcp_sock *tp, + 1347 : 885199 : void mptcp_write_options(struct tcphdr *th, __be32 *ptr, struct tcp_sock *tp, 1348 : : struct mptcp_out_options *opts) 1349 : : { - 1350 : 651773 : const struct sock *ssk = (const struct sock *)tp; - 1351 : 651773 : struct mptcp_subflow_context *subflow; + 1350 : 885199 : const struct sock *ssk = (const struct sock *)tp; + 1351 : 885199 : struct mptcp_subflow_context *subflow; 1352 : : 1353 : : /* Which options can be used together? 1354 : : * @@ -1456,109 +1456,109 @@ 1372 : : * 1373 : : * The same applies in mptcp_established_options() function. 1374 : : */ - 1375 [ + + ]: 651773 : if (likely(OPTION_MPTCP_DSS & opts->suboptions)) { - 1376 : 644814 : struct mptcp_ext *mpext = &opts->ext_copy; - 1377 : 644814 : u8 len = TCPOLEN_MPTCP_DSS_BASE; - 1378 : 644814 : u8 flags = 0; + 1375 [ + + ]: 885199 : if (likely(OPTION_MPTCP_DSS & opts->suboptions)) { + 1376 : 878237 : struct mptcp_ext *mpext = &opts->ext_copy; + 1377 : 878237 : u8 len = TCPOLEN_MPTCP_DSS_BASE; + 1378 : 878237 : u8 flags = 0; 1379 : : - 1380 [ + - ]: 644814 : if (mpext->use_ack) { - 1381 : 644814 : flags = MPTCP_DSS_HAS_ACK; - 1382 [ + + ]: 644814 : if (mpext->ack64) { + 1380 [ + - ]: 878237 : if (mpext->use_ack) { + 1381 : 878237 : flags = MPTCP_DSS_HAS_ACK; + 1382 [ + + ]: 878237 : if (mpext->ack64) { 1383 : : len += TCPOLEN_MPTCP_DSS_ACK64; 1384 : : flags |= MPTCP_DSS_ACK64; 1385 : : } else { - 1386 : 102886 : len += TCPOLEN_MPTCP_DSS_ACK32; + 1386 : 113757 : len += TCPOLEN_MPTCP_DSS_ACK32; 1387 : : } 1388 : : } 1389 : : - 1390 [ + + ]: 644814 : if (mpext->use_map) { - 1391 : 364801 : len += TCPOLEN_MPTCP_DSS_MAP64; + 1390 [ + + ]: 878237 : if (mpext->use_map) { + 1391 : 514326 : len += TCPOLEN_MPTCP_DSS_MAP64; 1392 : : 1393 : : /* Use only 64-bit mapping flags for now, add 1394 : : * support for optional 32-bit mappings later. 1395 : : */ - 1396 : 364801 : flags |= MPTCP_DSS_HAS_MAP | MPTCP_DSS_DSN64; - 1397 [ + + ]: 364801 : if (mpext->data_fin) - 1398 : 10574 : flags |= MPTCP_DSS_DATA_FIN; + 1396 : 514326 : flags |= MPTCP_DSS_HAS_MAP | MPTCP_DSS_DSN64; + 1397 [ + + ]: 514326 : if (mpext->data_fin) + 1398 : 8161 : flags |= MPTCP_DSS_DATA_FIN; 1399 : : - 1400 [ + + ]: 364801 : if (opts->csum_reqd) - 1401 : 1930 : len += TCPOLEN_MPTCP_DSS_CHECKSUM; + 1400 [ + + ]: 514326 : if (opts->csum_reqd) + 1401 : 1904 : len += TCPOLEN_MPTCP_DSS_CHECKSUM; 1402 : : } 1403 : : - 1404 [ + - ]: 644814 : *ptr++ = mptcp_option(MPTCPOPT_DSS, len, 0, flags); + 1404 [ + - ]: 878237 : *ptr++ = mptcp_option(MPTCPOPT_DSS, len, 0, flags); 1405 : : - 1406 [ + - ]: 644814 : if (mpext->use_ack) { - 1407 [ + + ]: 644814 : if (mpext->ack64) { - 1408 : 541928 : put_unaligned_be64(mpext->data_ack, ptr); - 1409 : 541928 : ptr += 2; + 1406 [ + - ]: 878237 : if (mpext->use_ack) { + 1407 [ + + ]: 878237 : if (mpext->ack64) { + 1408 : 764480 : put_unaligned_be64(mpext->data_ack, ptr); + 1409 : 764480 : ptr += 2; 1410 : : } else { - 1411 : 102886 : put_unaligned_be32(mpext->data_ack32, ptr); - 1412 : 102886 : ptr += 1; + 1411 : 113757 : put_unaligned_be32(mpext->data_ack32, ptr); + 1412 : 113757 : ptr += 1; 1413 : : } 1414 : : } 1415 : : - 1416 [ + + ]: 644814 : if (mpext->use_map) { - 1417 [ + + ]: 364801 : put_unaligned_be64(mpext->data_seq, ptr); - 1418 : 364801 : ptr += 2; - 1419 [ + + ]: 364801 : put_unaligned_be32(mpext->subflow_seq, ptr); - 1420 : 364801 : ptr += 1; - 1421 [ + + ]: 364801 : if (opts->csum_reqd) { + 1416 [ + + ]: 878237 : if (mpext->use_map) { + 1417 [ + + ]: 514326 : put_unaligned_be64(mpext->data_seq, ptr); + 1418 : 514326 : ptr += 2; + 1419 [ + + ]: 514326 : put_unaligned_be32(mpext->subflow_seq, ptr); + 1420 : 514326 : ptr += 1; + 1421 [ + + ]: 514326 : if (opts->csum_reqd) { 1422 : : /* data_len == 0 is reserved for the infinite mapping, 1423 : : * the checksum will also be set to 0. 1424 : : */ - 1425 : 1930 : put_len_csum(mpext->data_len, - 1426 [ + + ]: 1930 : (mpext->data_len ? mptcp_make_csum(mpext) : 0), + 1425 : 1904 : put_len_csum(mpext->data_len, + 1426 [ + + ]: 1904 : (mpext->data_len ? mptcp_make_csum(mpext) : 0), 1427 : : ptr); 1428 : : } else { - 1429 : 362871 : put_unaligned_be32(mpext->data_len << 16 | - 1430 : 362871 : TCPOPT_NOP << 8 | TCPOPT_NOP, ptr); + 1429 : 512422 : put_unaligned_be32(mpext->data_len << 16 | + 1430 : 512422 : TCPOPT_NOP << 8 | TCPOPT_NOP, ptr); 1431 : : } - 1432 : 364801 : ptr += 1; + 1432 : 514326 : ptr += 1; 1433 : : } 1434 : : 1435 : : /* We might need to add MP_FAIL options in rare cases */ - 1436 [ + + ]: 644814 : if (unlikely(OPTION_MPTCP_FAIL & opts->suboptions)) + 1436 [ + + ]: 878237 : if (unlikely(OPTION_MPTCP_FAIL & opts->suboptions)) 1437 : 4 : goto mp_fail; - 1438 [ + + ]: 6959 : } else if (OPTIONS_MPTCP_MPC & opts->suboptions) { - 1439 : 4182 : u8 len, flag = MPTCP_CAP_HMAC_SHA256; + 1438 [ + + ]: 6962 : } else if (OPTIONS_MPTCP_MPC & opts->suboptions) { + 1439 : 4178 : u8 len, flag = MPTCP_CAP_HMAC_SHA256; 1440 : : - 1441 [ + + ]: 4182 : if (OPTION_MPTCP_MPC_SYN & opts->suboptions) { + 1441 [ + + ]: 4178 : if (OPTION_MPTCP_MPC_SYN & opts->suboptions) { 1442 : : len = TCPOLEN_MPTCP_MPC_SYN; - 1443 [ + + ]: 2906 : } else if (OPTION_MPTCP_MPC_SYNACK & opts->suboptions) { + 1443 [ + + ]: 2901 : } else if (OPTION_MPTCP_MPC_SYNACK & opts->suboptions) { 1444 : : len = TCPOLEN_MPTCP_MPC_SYNACK; - 1445 [ + + ]: 1720 : } else if (opts->data_len) { - 1446 : 602 : len = TCPOLEN_MPTCP_MPC_ACK_DATA; - 1447 [ + + ]: 602 : if (opts->csum_reqd) + 1445 [ + + ]: 1713 : } else if (opts->data_len) { + 1446 : 594 : len = TCPOLEN_MPTCP_MPC_ACK_DATA; + 1447 [ + + ]: 594 : if (opts->csum_reqd) 1448 : 4 : len += TCPOLEN_MPTCP_DSS_CHECKSUM; 1449 : : } else { 1450 : : len = TCPOLEN_MPTCP_MPC_ACK; 1451 : : } 1452 : : - 1453 [ + + ]: 4182 : if (opts->csum_reqd) + 1453 [ + + ]: 4178 : if (opts->csum_reqd) 1454 : 30 : flag |= MPTCP_CAP_CHECKSUM_REQD; 1455 : : - 1456 [ + + ]: 4182 : if (!opts->allow_join_id0) + 1456 [ + + ]: 4178 : if (!opts->allow_join_id0) 1457 : 18 : flag |= MPTCP_CAP_DENY_JOIN_ID0; 1458 : : - 1459 [ + + ]: 4182 : *ptr++ = mptcp_option(MPTCPOPT_MP_CAPABLE, len, + 1459 [ + + ]: 4178 : *ptr++ = mptcp_option(MPTCPOPT_MP_CAPABLE, len, 1460 : : MPTCP_SUPPORTED_VERSION, 1461 : : flag); 1462 : : - 1463 : 4182 : if (!((OPTION_MPTCP_MPC_SYNACK | OPTION_MPTCP_MPC_ACK) & - 1464 [ + + ]: 4182 : opts->suboptions)) - 1465 : 1276 : goto mp_capable_done; + 1463 : 4178 : if (!((OPTION_MPTCP_MPC_SYNACK | OPTION_MPTCP_MPC_ACK) & + 1464 [ + + ]: 4178 : opts->suboptions)) + 1465 : 1277 : goto mp_capable_done; 1466 : : - 1467 [ + + ]: 2906 : put_unaligned_be64(opts->sndr_key, ptr); - 1468 : 2906 : ptr += 2; - 1469 [ + + ]: 2906 : if (!((OPTION_MPTCP_MPC_ACK) & opts->suboptions)) - 1470 : 1186 : goto mp_capable_done; + 1467 [ + + ]: 2901 : put_unaligned_be64(opts->sndr_key, ptr); + 1468 : 2901 : ptr += 2; + 1469 [ + + ]: 2901 : if (!((OPTION_MPTCP_MPC_ACK) & opts->suboptions)) + 1470 : 1188 : goto mp_capable_done; 1471 : : - 1472 [ + + ]: 1720 : put_unaligned_be64(opts->rcvr_key, ptr); - 1473 : 1720 : ptr += 2; - 1474 [ + + ]: 1720 : if (!opts->data_len) - 1475 : 1118 : goto mp_capable_done; + 1472 [ + + ]: 1713 : put_unaligned_be64(opts->rcvr_key, ptr); + 1473 : 1713 : ptr += 2; + 1474 [ + + ]: 1713 : if (!opts->data_len) + 1475 : 1119 : goto mp_capable_done; 1476 : : - 1477 [ + + ]: 602 : if (opts->csum_reqd) { + 1477 [ + + ]: 594 : if (opts->csum_reqd) { 1478 : 4 : put_len_csum(opts->data_len, 1479 : 4 : __mptcp_make_csum(opts->data_seq, 1480 : : opts->subflow_seq, @@ -1566,43 +1566,43 @@ 1482 : 4 : ~csum_unfold(opts->csum)), 1483 : : ptr); 1484 : : } else { - 1485 : 598 : put_unaligned_be32(opts->data_len << 16 | - 1486 : 598 : TCPOPT_NOP << 8 | TCPOPT_NOP, ptr); + 1485 : 590 : put_unaligned_be32(opts->data_len << 16 | + 1486 : 590 : TCPOPT_NOP << 8 | TCPOPT_NOP, ptr); 1487 : : } - 1488 : 602 : ptr += 1; + 1488 : 594 : ptr += 1; 1489 : : 1490 : : /* MPC is additionally mutually exclusive with MP_PRIO */ - 1491 : 602 : goto mp_capable_done; - 1492 [ + + ]: 2777 : } else if (OPTIONS_MPTCP_MPJ & opts->suboptions) { - 1493 [ + + ]: 1589 : if (OPTION_MPTCP_MPJ_SYN & opts->suboptions) { - 1494 : 571 : *ptr++ = mptcp_option(MPTCPOPT_MP_JOIN, + 1491 : 594 : goto mp_capable_done; + 1492 [ + + ]: 2784 : } else if (OPTIONS_MPTCP_MPJ & opts->suboptions) { + 1493 [ + + ]: 1599 : if (OPTION_MPTCP_MPJ_SYN & opts->suboptions) { + 1494 : 572 : *ptr++ = mptcp_option(MPTCPOPT_MP_JOIN, 1495 : : TCPOLEN_MPTCP_MPJ_SYN, - 1496 : 571 : opts->backup, opts->join_id); - 1497 : 571 : put_unaligned_be32(opts->token, ptr); - 1498 : 571 : ptr += 1; - 1499 : 571 : put_unaligned_be32(opts->nonce, ptr); - 1500 : 571 : ptr += 1; - 1501 [ + + ]: 1018 : } else if (OPTION_MPTCP_MPJ_SYNACK & opts->suboptions) { - 1502 : 517 : *ptr++ = mptcp_option(MPTCPOPT_MP_JOIN, + 1496 : 572 : opts->backup, opts->join_id); + 1497 : 572 : put_unaligned_be32(opts->token, ptr); + 1498 : 572 : ptr += 1; + 1499 : 572 : put_unaligned_be32(opts->nonce, ptr); + 1500 : 572 : ptr += 1; + 1501 [ + + ]: 1027 : } else if (OPTION_MPTCP_MPJ_SYNACK & opts->suboptions) { + 1502 : 523 : *ptr++ = mptcp_option(MPTCPOPT_MP_JOIN, 1503 : : TCPOLEN_MPTCP_MPJ_SYNACK, - 1504 : 517 : opts->backup, opts->join_id); - 1505 : 517 : put_unaligned_be64(opts->thmac, ptr); - 1506 : 517 : ptr += 2; - 1507 : 517 : put_unaligned_be32(opts->nonce, ptr); - 1508 : 517 : ptr += 1; + 1504 : 523 : opts->backup, opts->join_id); + 1505 : 523 : put_unaligned_be64(opts->thmac, ptr); + 1506 : 523 : ptr += 2; + 1507 : 523 : put_unaligned_be32(opts->nonce, ptr); + 1508 : 523 : ptr += 1; 1509 : : } else { - 1510 : 501 : *ptr++ = mptcp_option(MPTCPOPT_MP_JOIN, + 1510 : 504 : *ptr++ = mptcp_option(MPTCPOPT_MP_JOIN, 1511 : : TCPOLEN_MPTCP_MPJ_ACK, 0, 0); - 1512 : 501 : memcpy(ptr, opts->hmac, MPTCPOPT_HMAC_LEN); - 1513 : 501 : ptr += 5; + 1512 : 504 : memcpy(ptr, opts->hmac, MPTCPOPT_HMAC_LEN); + 1513 : 504 : ptr += 5; 1514 : : } - 1515 [ + + ]: 1188 : } else if (OPTION_MPTCP_ADD_ADDR & opts->suboptions) { + 1515 [ + + ]: 1185 : } else if (OPTION_MPTCP_ADD_ADDR & opts->suboptions) { 1516 : 755 : u8 len = TCPOLEN_MPTCP_ADD_ADDR_BASE; 1517 : 755 : u8 echo = MPTCP_ADDR_ECHO; 1518 : : 1519 : : #if IS_ENABLED(CONFIG_MPTCP_IPV6) - 1520 [ + + ]: 755 : if (opts->addr.family == AF_INET6) - 1521 : 170 : len = TCPOLEN_MPTCP_ADD_ADDR6_BASE; + 1520 [ + + ]: 755 : if (opts->addr.family == AF_INET6) + 1521 : 169 : len = TCPOLEN_MPTCP_ADD_ADDR6_BASE; 1522 : : #endif 1523 : : 1524 [ + + ]: 755 : if (opts->addr.port) @@ -1614,15 +1614,15 @@ 1530 : : } 1531 : : 1532 : 755 : *ptr++ = mptcp_option(MPTCPOPT_ADD_ADDR, - 1533 [ + + ]: 755 : len, echo, opts->addr.id); - 1534 [ + + ]: 755 : if (opts->addr.family == AF_INET) { - 1535 : 585 : memcpy((u8 *)ptr, (u8 *)&opts->addr.addr.s_addr, 4); - 1536 : 585 : ptr += 1; + 1533 [ + + ]: 755 : len, echo, opts->addr.id); + 1534 [ + + ]: 755 : if (opts->addr.family == AF_INET) { + 1535 : 586 : memcpy((u8 *)ptr, (u8 *)&opts->addr.addr.s_addr, 4); + 1536 : 586 : ptr += 1; 1537 : : } 1538 : : #if IS_ENABLED(CONFIG_MPTCP_IPV6) - 1539 [ + - ]: 170 : else if (opts->addr.family == AF_INET6) { - 1540 : 170 : memcpy((u8 *)ptr, opts->addr.addr6.s6_addr, 16); - 1541 : 170 : ptr += 4; + 1539 [ + - ]: 169 : else if (opts->addr.family == AF_INET6) { + 1540 : 169 : memcpy((u8 *)ptr, opts->addr.addr6.s6_addr, 16); + 1541 : 169 : ptr += 4; 1542 : : } 1543 : : #endif 1544 : : @@ -1652,18 +1652,18 @@ 1568 : 40 : ptr += 1; 1569 : : } 1570 : : } - 1571 [ + + ]: 433 : } else if (unlikely(OPTION_MPTCP_FASTCLOSE & opts->suboptions)) { + 1571 [ + + ]: 430 : } else if (unlikely(OPTION_MPTCP_FASTCLOSE & opts->suboptions)) { 1572 : : /* FASTCLOSE is mutually exclusive with others except RST */ - 1573 : 363 : *ptr++ = mptcp_option(MPTCPOPT_MP_FASTCLOSE, + 1573 : 358 : *ptr++ = mptcp_option(MPTCPOPT_MP_FASTCLOSE, 1574 : : TCPOLEN_MPTCP_FASTCLOSE, 1575 : : 0, 0); - 1576 [ + - ]: 363 : put_unaligned_be64(opts->rcvr_key, ptr); - 1577 : 363 : ptr += 2; + 1576 [ + - ]: 358 : put_unaligned_be64(opts->rcvr_key, ptr); + 1577 : 358 : ptr += 2; 1578 : : - 1579 [ + - ]: 363 : if (OPTION_MPTCP_RST & opts->suboptions) - 1580 : 363 : goto mp_rst; + 1579 [ + - ]: 358 : if (OPTION_MPTCP_RST & opts->suboptions) + 1580 : 358 : goto mp_rst; 1581 : : return; - 1582 [ + + ]: 70 : } else if (unlikely(OPTION_MPTCP_FAIL & opts->suboptions)) { + 1582 [ + + ]: 72 : } else if (unlikely(OPTION_MPTCP_FAIL & opts->suboptions)) { 1583 : 2 : mp_fail: 1584 : : /* MP_FAIL is mutually exclusive with others except RST */ 1585 [ + + ]: 6 : subflow = mptcp_subflow_ctx(ssk); @@ -1678,16 +1678,16 @@ 1594 [ + + ]: 6 : if (OPTION_MPTCP_RST & opts->suboptions) 1595 : 2 : goto mp_rst; 1596 : : return; - 1597 [ + - ]: 68 : } else if (unlikely(OPTION_MPTCP_RST & opts->suboptions)) { - 1598 : 68 : mp_rst: - 1599 : 433 : *ptr++ = mptcp_option(MPTCPOPT_RST, + 1597 [ + - ]: 70 : } else if (unlikely(OPTION_MPTCP_RST & opts->suboptions)) { + 1598 : 70 : mp_rst: + 1599 : 430 : *ptr++ = mptcp_option(MPTCPOPT_RST, 1600 : : TCPOLEN_MPTCP_RST, - 1601 : 433 : opts->reset_transient, - 1602 : 433 : opts->reset_reason); - 1603 : 433 : return; + 1601 : 430 : opts->reset_transient, + 1602 : 430 : opts->reset_reason); + 1603 : 430 : return; 1604 : : } 1605 : : - 1606 [ + + ]: 647154 : if (OPTION_MPTCP_PRIO & opts->suboptions) { + 1606 [ + + ]: 880587 : if (OPTION_MPTCP_PRIO & opts->suboptions) { 1607 [ + - ]: 28 : subflow = mptcp_subflow_ctx(ssk); 1608 : 28 : subflow->send_mp_prio = 0; 1609 : : @@ -1698,8 +1698,8 @@ 1614 [ + - ]: 28 : MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_MPPRIOTX); 1615 : : } 1616 : : - 1617 : 647126 : mp_capable_done: - 1618 [ + + ]: 651336 : if (OPTION_MPTCP_RM_ADDR & opts->suboptions) { + 1617 : 880559 : mp_capable_done: + 1618 [ + + ]: 884765 : if (OPTION_MPTCP_RM_ADDR & opts->suboptions) { 1619 : 106 : u8 i = 1; 1620 : : 1621 : 106 : *ptr++ = mptcp_option(MPTCPOPT_RM_ADDR, @@ -1719,8 +1719,8 @@ 1635 : : } 1636 : : } 1637 : : - 1638 [ + + ]: 651336 : if (tp) - 1639 : 649633 : mptcp_set_rwin(tp, th); + 1638 [ + + ]: 884765 : if (tp) + 1639 : 883054 : mptcp_set_rwin(tp, th); 1640 : : } 1641 : : 1642 : 16 : __be32 mptcp_get_reset_option(const struct sk_buff *skb) diff --git a/html/lcov/export/mptcp/pm.c.func-c.html b/html/lcov/export/mptcp/pm.c.func-c.html index 665f585e..001aed56 100644 --- a/html/lcov/export/mptcp/pm.c.func-c.html +++ b/html/lcov/export/mptcp/pm.c.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % @@ -172,49 +172,49 @@ mptcp_pm_subflow_chk_stale - 650 + 636 mptcp_pm_addr_families_match - 662 + 663 - mptcp_pm_add_addr_signal + mptcp_pm_subflow_check_next - 755 + 752 - mptcp_pm_announce_addr + mptcp_pm_add_addr_signal 755 - mptcp_pm_get_local_id + mptcp_pm_announce_addr - 765 + 755 - mptcp_pm_is_backup + mptcp_pm_get_local_id - 765 + 766 - mptcp_pm_subflow_check_next + mptcp_pm_is_backup - 768 + 766 @@ -228,7 +228,7 @@ mptcp_pm_schedule_work - 1381 + 1384 diff --git a/html/lcov/export/mptcp/pm.c.func.html b/html/lcov/export/mptcp/pm.c.func.html index 1a0b4cf9..7c495bac 100644 --- a/html/lcov/export/mptcp/pm.c.func.html +++ b/html/lcov/export/mptcp/pm.c.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % @@ -109,7 +109,7 @@ mptcp_pm_addr_families_match - 662 + 663 @@ -172,7 +172,7 @@ mptcp_pm_get_local_id - 765 + 766 @@ -186,7 +186,7 @@ mptcp_pm_is_backup - 765 + 766 @@ -235,7 +235,7 @@ mptcp_pm_schedule_work - 1381 + 1384 @@ -249,14 +249,14 @@ mptcp_pm_subflow_check_next - 768 + 752 mptcp_pm_subflow_chk_stale - 650 + 636 diff --git a/html/lcov/export/mptcp/pm.c.gcov.html b/html/lcov/export/mptcp/pm.c.gcov.html index be4f6784..6818d0d1 100644 --- a/html/lcov/export/mptcp/pm.c.gcov.html +++ b/html/lcov/export/mptcp/pm.c.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % @@ -189,12 +189,12 @@ 111 : : /* return true if the new status bit is currently cleared, that is, this event 112 : : * can be server, eventually by an already scheduled work 113 : : */ - 114 : 1381 : static bool mptcp_pm_schedule_work(struct mptcp_sock *msk, + 114 : 1384 : static bool mptcp_pm_schedule_work(struct mptcp_sock *msk, 115 : : enum mptcp_pm_status new_status) 116 : : { - 117 [ - + - - ]: 1381 : pr_debug("msk=%p status=%x new=%lx\n", msk, msk->pm.status, + 117 [ - + - - ]: 1384 : pr_debug("msk=%p status=%x new=%lx\n", msk, msk->pm.status, 118 : : BIT(new_status)); - 119 [ + + + + ]: 1381 : if (msk->pm.status & BIT(new_status)) + 119 [ + + + + ]: 1384 : if (msk->pm.status & BIT(new_status)) 120 : : return false; 121 : : 122 [ - + ]: 1234 : msk->pm.status |= BIT(new_status); @@ -233,8 +233,8 @@ 155 : : { 156 [ - + ]: 3682 : pr_debug("msk=%p\n", msk); 157 : : - 158 [ + + ]: 3682 : if (msk->token) - 159 : 2287 : mptcp_event(MPTCP_EVENT_CLOSED, msk, NULL, GFP_KERNEL); + 158 [ + + ]: 3682 : if (msk->token) + 159 : 2280 : mptcp_event(MPTCP_EVENT_CLOSED, msk, NULL, GFP_KERNEL); 160 : 3682 : } 161 : : 162 : 996 : void mptcp_pm_subflow_established(struct mptcp_sock *msk) @@ -243,35 +243,35 @@ 165 : : 166 [ - + ]: 996 : pr_debug("msk=%p\n", msk); 167 : : - 168 [ + + + + ]: 996 : if (!READ_ONCE(pm->work_pending)) + 168 [ + + + + ]: 996 : if (!READ_ONCE(pm->work_pending)) 169 : : return; 170 : : - 171 : 260 : spin_lock_bh(&pm->lock); + 171 : 261 : spin_lock_bh(&pm->lock); 172 : : - 173 [ + + + - ]: 260 : if (READ_ONCE(pm->work_pending)) - 174 : 260 : mptcp_pm_schedule_work(msk, MPTCP_PM_SUBFLOW_ESTABLISHED); + 173 [ + + + - ]: 261 : if (READ_ONCE(pm->work_pending)) + 174 : 261 : mptcp_pm_schedule_work(msk, MPTCP_PM_SUBFLOW_ESTABLISHED); 175 : : - 176 : 260 : spin_unlock_bh(&pm->lock); + 176 : 261 : spin_unlock_bh(&pm->lock); 177 : : } 178 : : - 179 : 768 : void mptcp_pm_subflow_check_next(struct mptcp_sock *msk, + 179 : 752 : void mptcp_pm_subflow_check_next(struct mptcp_sock *msk, 180 : : const struct mptcp_subflow_context *subflow) 181 : : { - 182 : 768 : struct mptcp_pm_data *pm = &msk->pm; - 183 : 768 : bool update_subflows; + 182 : 752 : struct mptcp_pm_data *pm = &msk->pm; + 183 : 752 : bool update_subflows; 184 : : - 185 : 768 : update_subflows = subflow->request_join || subflow->mp_join; - 186 [ + + ]: 768 : if (mptcp_pm_is_userspace(msk)) { - 187 [ + + ]: 51 : if (update_subflows) { - 188 : 40 : spin_lock_bh(&pm->lock); - 189 : 40 : pm->subflows--; - 190 : 40 : spin_unlock_bh(&pm->lock); + 185 : 752 : update_subflows = subflow->request_join || subflow->mp_join; + 186 [ + + ]: 752 : if (mptcp_pm_is_userspace(msk)) { + 187 [ + + ]: 50 : if (update_subflows) { + 188 : 39 : spin_lock_bh(&pm->lock); + 189 : 39 : pm->subflows--; + 190 : 39 : spin_unlock_bh(&pm->lock); 191 : : } - 192 : 51 : return; + 192 : 50 : return; 193 : : } 194 : : - 195 [ + + + + : 717 : if (!READ_ONCE(pm->work_pending) && !update_subflows) - + + ] + 195 [ + + + + : 702 : if (!READ_ONCE(pm->work_pending) && !update_subflows) + + + ] 196 : : return; 197 : : 198 : 294 : spin_lock_bh(&pm->lock); @@ -281,8 +281,8 @@ 202 : : /* Even if this subflow is not really established, tell the PM to try 203 : : * to pick the next ones, if possible. 204 : : */ - 205 [ + + ]: 294 : if (mptcp_pm_nl_check_work_pending(msk)) - 206 : 77 : mptcp_pm_schedule_work(msk, MPTCP_PM_SUBFLOW_ESTABLISHED); + 205 [ + + ]: 294 : if (mptcp_pm_nl_check_work_pending(msk)) + 206 : 78 : mptcp_pm_schedule_work(msk, MPTCP_PM_SUBFLOW_ESTABLISHED); 207 : : 208 : 294 : spin_unlock_bh(&pm->lock); 209 : : } @@ -332,9 +332,9 @@ 252 : : 253 : 331 : spin_lock_bh(&pm->lock); 254 : : - 255 [ + + + + : 331 : if (mptcp_lookup_anno_list_by_saddr(msk, addr) && READ_ONCE(pm->work_pending)) + 255 [ + + + + : 331 : if (mptcp_lookup_anno_list_by_saddr(msk, addr) && READ_ONCE(pm->work_pending)) + + ] - 256 : 84 : mptcp_pm_schedule_work(msk, MPTCP_PM_SUBFLOW_ESTABLISHED); + 256 : 85 : mptcp_pm_schedule_work(msk, MPTCP_PM_SUBFLOW_ESTABLISHED); 257 : : 258 : 331 : spin_unlock_bh(&pm->lock); 259 : 331 : } @@ -433,7 +433,7 @@ 352 [ + + + + ]: 755 : port = !!(*echo ? msk->pm.remote.port : msk->pm.local.port); 353 : : 354 [ + + + + ]: 755 : family = *echo ? msk->pm.remote.family : msk->pm.local.family; - 355 [ + + + + : 1510 : if (remaining < mptcp_add_addr_len(family, *echo, port)) + 355 [ + + + + : 1510 : if (remaining < mptcp_add_addr_len(family, *echo, port)) - + ] 356 : 0 : goto out_unlock; 357 : : @@ -482,37 +482,37 @@ 400 : 106 : return ret; 401 : : } 402 : : - 403 : 765 : int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc) + 403 : 766 : int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc) 404 : : { - 405 : 765 : struct mptcp_addr_info skc_local; - 406 : 765 : struct mptcp_addr_info msk_local; + 405 : 766 : struct mptcp_addr_info skc_local; + 406 : 766 : struct mptcp_addr_info msk_local; 407 : : - 408 [ - + ]: 765 : if (WARN_ON_ONCE(!msk)) + 408 [ - + ]: 766 : if (WARN_ON_ONCE(!msk)) 409 : 0 : return -1; 410 : : 411 : : /* The 0 ID mapping is defined by the first subflow, copied into the msk 412 : : * addr 413 : : */ - 414 : 765 : mptcp_local_address((struct sock_common *)msk, &msk_local); - 415 : 765 : mptcp_local_address((struct sock_common *)skc, &skc_local); - 416 [ + + ]: 765 : if (mptcp_addresses_equal(&msk_local, &skc_local, false)) + 414 : 766 : mptcp_local_address((struct sock_common *)msk, &msk_local); + 415 : 766 : mptcp_local_address((struct sock_common *)skc, &skc_local); + 416 [ + + ]: 766 : if (mptcp_addresses_equal(&msk_local, &skc_local, false)) 417 : : return 0; 418 : : - 419 [ + + ]: 383 : if (mptcp_pm_is_userspace(msk)) + 419 [ + + ]: 384 : if (mptcp_pm_is_userspace(msk)) 420 : 22 : return mptcp_userspace_pm_get_local_id(msk, &skc_local); - 421 : 361 : return mptcp_pm_nl_get_local_id(msk, &skc_local); + 421 : 362 : return mptcp_pm_nl_get_local_id(msk, &skc_local); 422 : : } 423 : : - 424 : 765 : bool mptcp_pm_is_backup(struct mptcp_sock *msk, struct sock_common *skc) + 424 : 766 : bool mptcp_pm_is_backup(struct mptcp_sock *msk, struct sock_common *skc) 425 : : { - 426 : 765 : struct mptcp_addr_info skc_local; + 426 : 766 : struct mptcp_addr_info skc_local; 427 : : - 428 : 765 : mptcp_local_address((struct sock_common *)skc, &skc_local); + 428 : 766 : mptcp_local_address((struct sock_common *)skc, &skc_local); 429 : : - 430 [ + + ]: 765 : if (mptcp_pm_is_userspace(msk)) + 430 [ + + ]: 766 : if (mptcp_pm_is_userspace(msk)) 431 : 26 : return mptcp_userspace_pm_is_backup(msk, &skc_local); 432 : : - 433 : 739 : return mptcp_pm_nl_is_backup(msk, &skc_local); + 433 : 740 : return mptcp_pm_nl_is_backup(msk, &skc_local); 434 : : } 435 : : 436 : 28 : int mptcp_pm_get_addr(struct sk_buff *skb, struct genl_info *info) @@ -538,45 +538,45 @@ 456 : 46 : return mptcp_pm_nl_set_flags(skb, info); 457 : : } 458 : : - 459 : 650 : void mptcp_pm_subflow_chk_stale(const struct mptcp_sock *msk, struct sock *ssk) + 459 : 636 : void mptcp_pm_subflow_chk_stale(const struct mptcp_sock *msk, struct sock *ssk) 460 : : { - 461 [ - + ]: 650 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); - 462 [ - + ]: 650 : u32 rcv_tstamp = READ_ONCE(tcp_sk(ssk)->rcv_tstamp); + 461 [ - + ]: 636 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); + 462 [ - + ]: 636 : u32 rcv_tstamp = READ_ONCE(tcp_sk(ssk)->rcv_tstamp); 463 : : 464 : : /* keep track of rtx periods with no progress */ - 465 [ + + ]: 650 : if (!subflow->stale_count) { - 466 : 223 : subflow->stale_rcv_tstamp = rcv_tstamp; - 467 : 223 : subflow->stale_count++; - 468 [ + + ]: 427 : } else if (subflow->stale_rcv_tstamp == rcv_tstamp) { - 469 [ + - ]: 325 : if (subflow->stale_count < U8_MAX) - 470 : 325 : subflow->stale_count++; - 471 : 325 : mptcp_pm_nl_subflow_chk_stale(msk, ssk); + 465 [ + + ]: 636 : if (!subflow->stale_count) { + 466 : 236 : subflow->stale_rcv_tstamp = rcv_tstamp; + 467 : 236 : subflow->stale_count++; + 468 [ + + ]: 400 : } else if (subflow->stale_rcv_tstamp == rcv_tstamp) { + 469 [ + - ]: 291 : if (subflow->stale_count < U8_MAX) + 470 : 291 : subflow->stale_count++; + 471 : 291 : mptcp_pm_nl_subflow_chk_stale(msk, ssk); 472 : : } else { - 473 : 102 : subflow->stale_count = 0; - 474 : 102 : mptcp_subflow_set_active(subflow); + 473 : 109 : subflow->stale_count = 0; + 474 : 109 : mptcp_subflow_set_active(subflow); 475 : : } - 476 : 650 : } + 476 : 636 : } 477 : : 478 : : /* if sk is ipv4 or ipv6_only allows only same-family local and remote addresses, 479 : : * otherwise allow any matching local/remote pair 480 : : */ - 481 : 662 : bool mptcp_pm_addr_families_match(const struct sock *sk, + 481 : 663 : bool mptcp_pm_addr_families_match(const struct sock *sk, 482 : : const struct mptcp_addr_info *loc, 483 : : const struct mptcp_addr_info *rem) 484 : : { - 485 : 662 : bool mptcp_is_v4 = sk->sk_family == AF_INET; + 485 : 663 : bool mptcp_is_v4 = sk->sk_family == AF_INET; 486 : : 487 : : #if IS_ENABLED(CONFIG_MPTCP_IPV6) - 488 [ + + + + ]: 662 : bool loc_is_v4 = loc->family == AF_INET || ipv6_addr_v4mapped(&loc->addr6); - 489 [ + + + + ]: 662 : bool rem_is_v4 = rem->family == AF_INET || ipv6_addr_v4mapped(&rem->addr6); + 488 [ + + + + ]: 663 : bool loc_is_v4 = loc->family == AF_INET || ipv6_addr_v4mapped(&loc->addr6); + 489 [ + + + + ]: 663 : bool rem_is_v4 = rem->family == AF_INET || ipv6_addr_v4mapped(&rem->addr6); 490 : : - 491 [ + + ]: 662 : if (mptcp_is_v4) + 491 [ + + ]: 663 : if (mptcp_is_v4) 492 : 538 : return loc_is_v4 && rem_is_v4; 493 : : - 494 [ - + ]: 124 : if (ipv6_only_sock(sk)) + 494 [ - + ]: 125 : if (ipv6_only_sock(sk)) 495 : 0 : return !loc_is_v4 && !rem_is_v4; 496 : : - 497 : 124 : return loc_is_v4 == rem_is_v4; + 497 : 125 : return loc_is_v4 == rem_is_v4; 498 : : #else 499 : : return mptcp_is_v4 && loc->family == AF_INET && rem->family == AF_INET; 500 : : #endif diff --git a/html/lcov/export/mptcp/pm_netlink.c.func-c.html b/html/lcov/export/mptcp/pm_netlink.c.func-c.html index 71218998..52b13a79 100644 --- a/html/lcov/export/mptcp/pm_netlink.c.func-c.html +++ b/html/lcov/export/mptcp/pm_netlink.c.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % @@ -56,9 +56,9 @@ Branches: - 61.6 % + 61.7 % 1032 - 636 + 637 @@ -305,7 +305,7 @@ fill_local_addresses_vec - 270 + 271 @@ -324,16 +324,16 @@ - select_signal_address + mptcp_pm_nl_subflow_chk_stale - 310 + 291 - mptcp_pm_nl_subflow_chk_stale + select_signal_address - 325 + 310 @@ -361,7 +361,7 @@ mptcp_pm_nl_get_local_id - 361 + 362 @@ -375,7 +375,7 @@ mptcp_nl_mcast_send - 430 + 432 @@ -417,7 +417,7 @@ mptcp_pm_nl_is_backup - 739 + 740 @@ -438,21 +438,21 @@ mptcp_pm_send_ack - 866 + 863 __mptcp_pm_send_ack - 888 + 885 pm_nl_exit_net - 918 + 925 @@ -536,7 +536,7 @@ __lookup_addr - 1584 + 1586 @@ -557,14 +557,14 @@ mptcp_event_pm_listener - 2512 + 2514 mptcp_local_address - 3403 + 3405 @@ -578,63 +578,63 @@ mptcp_pm_get_add_addr_signal_max - 4367 + 4358 mptcp_pm_get_add_addr_accept_max - 4669 + 4660 mptcp_pm_get_local_addr_max - 4669 + 4660 mptcp_pm_get_subflows_max - 5537 + 5531 mptcp_event - 8142 + 8132 mptcp_addresses_equal - 8879 + 8893 - mptcp_pm_nl_work + pm_nl_get_pernet_from_msk - 9066 + 13195 - pm_nl_get_pernet_from_msk + mptcp_pm_nl_work - 13221 + 13801 pm_nl_get_pernet - 15990 + 15987 diff --git a/html/lcov/export/mptcp/pm_netlink.c.func.html b/html/lcov/export/mptcp/pm_netlink.c.func.html index d28397bd..276b1eb2 100644 --- a/html/lcov/export/mptcp/pm_netlink.c.func.html +++ b/html/lcov/export/mptcp/pm_netlink.c.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % @@ -56,9 +56,9 @@ Branches: - 61.6 % + 61.7 % 1032 - 636 + 637 @@ -88,7 +88,7 @@ __lookup_addr - 1584 + 1586 @@ -116,14 +116,14 @@ __mptcp_pm_send_ack - 888 + 885 fill_local_addresses_vec - 270 + 271 @@ -151,14 +151,14 @@ mptcp_addresses_equal - 8879 + 8893 mptcp_event - 8142 + 8132 @@ -193,7 +193,7 @@ mptcp_event_pm_listener - 2512 + 2514 @@ -214,7 +214,7 @@ mptcp_local_address - 3403 + 3405 @@ -256,7 +256,7 @@ mptcp_nl_mcast_send - 430 + 432 @@ -326,28 +326,28 @@ mptcp_pm_get_add_addr_accept_max - 4669 + 4660 mptcp_pm_get_add_addr_signal_max - 4367 + 4358 mptcp_pm_get_local_addr_max - 4669 + 4660 mptcp_pm_get_subflows_max - 5537 + 5531 @@ -459,7 +459,7 @@ mptcp_pm_nl_get_local_id - 361 + 362 @@ -473,7 +473,7 @@ mptcp_pm_nl_is_backup - 739 + 740 @@ -522,14 +522,14 @@ mptcp_pm_nl_subflow_chk_stale - 325 + 291 mptcp_pm_nl_work - 9066 + 13801 @@ -564,7 +564,7 @@ mptcp_pm_send_ack - 866 + 863 @@ -599,21 +599,21 @@ pm_nl_exit_net - 918 + 925 pm_nl_get_pernet - 15990 + 15987 pm_nl_get_pernet_from_msk - 13221 + 13195 diff --git a/html/lcov/export/mptcp/pm_netlink.c.gcov.html b/html/lcov/export/mptcp/pm_netlink.c.gcov.html index b61317e8..7f4e6bb1 100644 --- a/html/lcov/export/mptcp/pm_netlink.c.gcov.html +++ b/html/lcov/export/mptcp/pm_netlink.c.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % @@ -56,9 +56,9 @@ Branches: - 61.6 % + 61.7 % 1032 - 636 + 637 @@ -121,64 +121,64 @@ 43 : : #define MPTCP_PM_ADDR_MAX 8 44 : : #define ADD_ADDR_RETRANS_MAX 3 45 : : - 46 : 15990 : static struct pm_nl_pernet *pm_nl_get_pernet(const struct net *net) + 46 : 15987 : static struct pm_nl_pernet *pm_nl_get_pernet(const struct net *net) 47 : : { - 48 : 29813 : return net_generic(net, pm_nl_pernet_id); + 48 : 29788 : return net_generic(net, pm_nl_pernet_id); 49 : : } 50 : : 51 : : static struct pm_nl_pernet * - 52 : 13221 : pm_nl_get_pernet_from_msk(const struct mptcp_sock *msk) + 52 : 13195 : pm_nl_get_pernet_from_msk(const struct mptcp_sock *msk) 53 : : { - 54 : 25476 : return pm_nl_get_pernet(sock_net((struct sock *)msk)); + 54 : 25439 : return pm_nl_get_pernet(sock_net((struct sock *)msk)); 55 : : } 56 : : - 57 : 8879 : bool mptcp_addresses_equal(const struct mptcp_addr_info *a, + 57 : 8893 : bool mptcp_addresses_equal(const struct mptcp_addr_info *a, 58 : : const struct mptcp_addr_info *b, bool use_port) 59 : : { - 60 : 8879 : bool addr_equals = false; + 60 : 8893 : bool addr_equals = false; 61 : : - 62 [ + + ]: 8879 : if (a->family == b->family) { - 63 [ + + ]: 7502 : if (a->family == AF_INET) - 64 : 6488 : addr_equals = a->addr.s_addr == b->addr.s_addr; + 62 [ + + ]: 8893 : if (a->family == b->family) { + 63 [ + + ]: 7510 : if (a->family == AF_INET) + 64 : 6504 : addr_equals = a->addr.s_addr == b->addr.s_addr; 65 : : #if IS_ENABLED(CONFIG_MPTCP_IPV6) 66 : : else - 67 : 1014 : addr_equals = !ipv6_addr_cmp(&a->addr6, &b->addr6); - 68 [ + + ]: 1377 : } else if (a->family == AF_INET) { - 69 [ + + ]: 981 : if (ipv6_addr_v4mapped(&b->addr6)) - 70 : 672 : addr_equals = a->addr.s_addr == b->addr6.s6_addr32[3]; - 71 [ + - ]: 396 : } else if (b->family == AF_INET) { - 72 [ + + ]: 396 : if (ipv6_addr_v4mapped(&a->addr6)) - 73 : 184 : addr_equals = a->addr6.s6_addr32[3] == b->addr.s_addr; + 67 : 1006 : addr_equals = !ipv6_addr_cmp(&a->addr6, &b->addr6); + 68 [ + + ]: 1383 : } else if (a->family == AF_INET) { + 69 [ + + ]: 976 : if (ipv6_addr_v4mapped(&b->addr6)) + 70 : 678 : addr_equals = a->addr.s_addr == b->addr6.s6_addr32[3]; + 71 [ + - ]: 407 : } else if (b->family == AF_INET) { + 72 [ + + ]: 407 : if (ipv6_addr_v4mapped(&a->addr6)) + 73 : 182 : addr_equals = a->addr6.s6_addr32[3] == b->addr.s_addr; 74 : : #endif 75 : : } 76 : : - 77 [ + + ]: 8358 : if (!addr_equals) + 77 [ + + ]: 8370 : if (!addr_equals) 78 : : return false; - 79 [ + + ]: 2003 : if (!use_port) + 79 [ + + ]: 2004 : if (!use_port) 80 : : return true; 81 : : 82 : 836 : return a->port == b->port; 83 : : } 84 : : - 85 : 3403 : void mptcp_local_address(const struct sock_common *skc, struct mptcp_addr_info *addr) + 85 : 3405 : void mptcp_local_address(const struct sock_common *skc, struct mptcp_addr_info *addr) 86 : : { - 87 : 3403 : addr->family = skc->skc_family; - 88 : 3403 : addr->port = htons(skc->skc_num); - 89 [ + + ]: 3403 : if (addr->family == AF_INET) - 90 : 1654 : addr->addr.s_addr = skc->skc_rcv_saddr; + 87 : 3405 : addr->family = skc->skc_family; + 88 : 3405 : addr->port = htons(skc->skc_num); + 89 [ + + ]: 3405 : if (addr->family == AF_INET) + 90 : 1658 : addr->addr.s_addr = skc->skc_rcv_saddr; 91 : : #if IS_ENABLED(CONFIG_MPTCP_IPV6) - 92 [ + - ]: 1749 : else if (addr->family == AF_INET6) - 93 : 1749 : addr->addr6 = skc->skc_v6_rcv_saddr; + 92 [ + - ]: 1747 : else if (addr->family == AF_INET6) + 93 : 1747 : addr->addr6 = skc->skc_v6_rcv_saddr; 94 : : #endif - 95 : 3403 : } + 95 : 3405 : } 96 : : 97 : 0 : static void remote_address(const struct sock_common *skc, 98 : : struct mptcp_addr_info *addr) 99 : : { - 100 : 788 : addr->family = skc->skc_family; - 101 : 788 : addr->port = skc->skc_dport; - 102 : 788 : if (addr->family == AF_INET) - 103 : 597 : addr->addr.s_addr = skc->skc_daddr; + 100 : 787 : addr->family = skc->skc_family; + 101 : 787 : addr->port = skc->skc_dport; + 102 : 787 : if (addr->family == AF_INET) + 103 : 596 : addr->addr.s_addr = skc->skc_daddr; 104 : : #if IS_ENABLED(CONFIG_MPTCP_IPV6) 105 [ - - - - : 191 : else if (addr->family == AF_INET6) + - + - + @@ -194,11 +194,11 @@ 114 : 102 : struct mptcp_addr_info cur; 115 : 102 : struct sock_common *skc; 116 : : - 117 [ + + ]: 224 : list_for_each_entry(subflow, list, node) { - 118 : 200 : skc = (struct sock_common *)mptcp_subflow_tcp_sock(subflow); + 117 [ + + ]: 222 : list_for_each_entry(subflow, list, node) { + 118 : 198 : skc = (struct sock_common *)mptcp_subflow_tcp_sock(subflow); 119 : : - 120 : 200 : mptcp_local_address(skc, &cur); - 121 [ + + ]: 200 : if (mptcp_addresses_equal(&cur, saddr, saddr->port)) + 120 : 198 : mptcp_local_address(skc, &cur); + 121 [ + + ]: 198 : if (mptcp_addresses_equal(&cur, saddr, saddr->port)) 122 : : return true; 123 : : } 124 : : @@ -211,15 +211,15 @@ 131 : 289 : struct mptcp_subflow_context *subflow; 132 : 289 : struct mptcp_addr_info cur; 133 : : - 134 [ + + ]: 768 : list_for_each_entry(subflow, list, node) { - 135 : 498 : struct sock *ssk = mptcp_subflow_tcp_sock(subflow); + 134 [ + + ]: 768 : list_for_each_entry(subflow, list, node) { + 135 : 497 : struct sock *ssk = mptcp_subflow_tcp_sock(subflow); 136 : : - 137 [ + + + + ]: 498 : if (!((1 << inet_sk_state_load(ssk)) & + 137 [ + + + + ]: 497 : if (!((1 << inet_sk_state_load(ssk)) & 138 : : (TCPF_ESTABLISHED | TCPF_SYN_SENT | TCPF_SYN_RECV))) 139 : 4 : continue; 140 : : - 141 [ + + ]: 494 : remote_address((struct sock_common *)ssk, &cur); - 142 [ + + ]: 494 : if (mptcp_addresses_equal(&cur, daddr, daddr->port)) + 141 [ + + ]: 493 : remote_address((struct sock_common *)ssk, &cur); + 142 [ + + ]: 493 : if (mptcp_addresses_equal(&cur, daddr, daddr->port)) 143 : : return true; 144 : : } 145 : : @@ -294,35 +294,35 @@ 206 : 310 : return found; 207 : : } 208 : : - 209 : 4517 : unsigned int mptcp_pm_get_add_addr_signal_max(const struct mptcp_sock *msk) + 209 : 4508 : unsigned int mptcp_pm_get_add_addr_signal_max(const struct mptcp_sock *msk) 210 : : { - 211 : 4367 : const struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk); + 211 : 4358 : const struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk); 212 : : - 213 : 5158 : return READ_ONCE(pernet->add_addr_signal_max); + 213 : 5149 : return READ_ONCE(pernet->add_addr_signal_max); 214 : : } 215 : : EXPORT_SYMBOL_GPL(mptcp_pm_get_add_addr_signal_max); 216 : : - 217 : 4452 : unsigned int mptcp_pm_get_add_addr_accept_max(const struct mptcp_sock *msk) + 217 : 4442 : unsigned int mptcp_pm_get_add_addr_accept_max(const struct mptcp_sock *msk) 218 : : { - 219 : 4452 : struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk); + 219 : 4442 : struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk); 220 : : - 221 : 4785 : return READ_ONCE(pernet->add_addr_accept_max); + 221 : 4775 : return READ_ONCE(pernet->add_addr_accept_max); 222 : : } 223 : : EXPORT_SYMBOL_GPL(mptcp_pm_get_add_addr_accept_max); 224 : : - 225 : 5176 : unsigned int mptcp_pm_get_subflows_max(const struct mptcp_sock *msk) + 225 : 5169 : unsigned int mptcp_pm_get_subflows_max(const struct mptcp_sock *msk) 226 : : { - 227 : 5176 : struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk); + 227 : 5169 : struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk); 228 : : - 229 : 7517 : return READ_ONCE(pernet->subflows_max); + 229 : 7511 : return READ_ONCE(pernet->subflows_max); 230 : : } 231 : : EXPORT_SYMBOL_GPL(mptcp_pm_get_subflows_max); 232 : : - 233 : 4819 : unsigned int mptcp_pm_get_local_addr_max(const struct mptcp_sock *msk) + 233 : 4810 : unsigned int mptcp_pm_get_local_addr_max(const struct mptcp_sock *msk) 234 : : { - 235 : 4669 : struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk); + 235 : 4660 : struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk); 236 : : - 237 : 5460 : return READ_ONCE(pernet->local_addr_max); + 237 : 5451 : return READ_ONCE(pernet->local_addr_max); 238 : : } 239 : : EXPORT_SYMBOL_GPL(mptcp_pm_get_local_addr_max); 240 : : @@ -330,11 +330,11 @@ 242 : : { 243 : 1085 : struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk); 244 : : - 245 [ + + + + ]: 1810 : if (msk->pm.subflows == mptcp_pm_get_subflows_max(msk) || - 246 [ + - ]: 899 : (find_next_and_bit(pernet->id_bitmap, msk->pm.id_avail_bitmap, + 245 [ + + + + ]: 1806 : if (msk->pm.subflows == mptcp_pm_get_subflows_max(msk) || + 246 [ + - ]: 895 : (find_next_and_bit(pernet->id_bitmap, msk->pm.id_avail_bitmap, 247 : : MPTCP_PM_MAX_ADDR_ID + 1, 0) == MPTCP_PM_MAX_ADDR_ID + 1)) { - 248 : 845 : WRITE_ONCE(msk->pm.work_pending, false); - 249 : 845 : return false; + 248 : 844 : WRITE_ONCE(msk->pm.work_pending, false); + 249 : 844 : return false; 250 : : } 251 : : return true; 252 : : } @@ -364,8 +364,8 @@ 276 : 48 : mptcp_local_address((struct sock_common *)sk, &saddr); 277 : : 278 : 48 : spin_lock_bh(&msk->pm.lock); - 279 [ + - ]: 48 : list_for_each_entry(entry, &msk->pm.anno_list, list) { - 280 [ + - ]: 48 : if (mptcp_addresses_equal(&entry->addr, &saddr, true)) { + 279 [ + - ]: 50 : list_for_each_entry(entry, &msk->pm.anno_list, list) { + 280 [ + + ]: 50 : if (mptcp_addresses_equal(&entry->addr, &saddr, true)) { 281 : 48 : ret = true; 282 : 48 : goto out; 283 : : } @@ -570,33 +570,33 @@ 480 : 340 : return i; 481 : : } 482 : : - 483 : 888 : static void __mptcp_pm_send_ack(struct mptcp_sock *msk, struct mptcp_subflow_context *subflow, + 483 : 885 : static void __mptcp_pm_send_ack(struct mptcp_sock *msk, struct mptcp_subflow_context *subflow, 484 : : bool prio, bool backup) 485 : : { - 486 [ - + ]: 888 : struct sock *ssk = mptcp_subflow_tcp_sock(subflow); - 487 : 888 : bool slow; + 486 [ - + ]: 885 : struct sock *ssk = mptcp_subflow_tcp_sock(subflow); + 487 : 885 : bool slow; 488 : : - 489 [ - + - - : 888 : pr_debug("send ack for %s\n", + 489 [ - + - - : 885 : pr_debug("send ack for %s\n", - - ] 490 : : prio ? "mp_prio" : (mptcp_pm_should_add_signal(msk) ? "add_addr" : "rm_addr")); 491 : : - 492 : 888 : slow = lock_sock_fast(ssk); - 493 [ + + ]: 888 : if (prio) { + 492 : 885 : slow = lock_sock_fast(ssk); + 493 [ + + ]: 885 : if (prio) { 494 : 28 : subflow->send_mp_prio = 1; 495 : 28 : subflow->request_bkup = backup; 496 : : } 497 : : - 498 : 888 : __mptcp_subflow_send_ack(ssk); - 499 : 888 : unlock_sock_fast(ssk, slow); - 500 : 888 : } + 498 : 885 : __mptcp_subflow_send_ack(ssk); + 499 : 885 : unlock_sock_fast(ssk, slow); + 500 : 885 : } 501 : : - 502 : 866 : static void mptcp_pm_send_ack(struct mptcp_sock *msk, struct mptcp_subflow_context *subflow, + 502 : 863 : static void mptcp_pm_send_ack(struct mptcp_sock *msk, struct mptcp_subflow_context *subflow, 503 : : bool prio, bool backup) 504 : : { - 505 : 866 : spin_unlock_bh(&msk->pm.lock); - 506 : 866 : __mptcp_pm_send_ack(msk, subflow, prio, backup); - 507 : 866 : spin_lock_bh(&msk->pm.lock); - 508 : 866 : } + 505 : 863 : spin_unlock_bh(&msk->pm.lock); + 506 : 863 : __mptcp_pm_send_ack(msk, subflow, prio, backup); + 507 : 863 : spin_lock_bh(&msk->pm.lock); + 508 : 863 : } 509 : : 510 : : static struct mptcp_pm_addr_entry * 511 : 450 : __lookup_addr_by_id(struct pm_nl_pernet *pernet, unsigned int id) @@ -616,16 +616,16 @@ 521 : : } 522 : : 523 : : static struct mptcp_pm_addr_entry * - 524 : 1584 : __lookup_addr(struct pm_nl_pernet *pernet, const struct mptcp_addr_info *info) + 524 : 1586 : __lookup_addr(struct pm_nl_pernet *pernet, const struct mptcp_addr_info *info) 525 : : { - 526 : 1584 : struct mptcp_pm_addr_entry *entry; + 526 : 1586 : struct mptcp_pm_addr_entry *entry; 527 : : - 528 [ + + + + : 3086 : list_for_each_entry_rcu(entry, &pernet->local_addr_list, list, + 528 [ + + + + : 3100 : list_for_each_entry_rcu(entry, &pernet->local_addr_list, list, - + - - - - - - - + + - - - + + ] 529 : : lockdep_is_held(&pernet->lock)) { - 530 [ + + ]: 2130 : if (mptcp_addresses_equal(&entry->addr, info, entry->addr.port)) + 530 [ + + ]: 2144 : if (mptcp_addresses_equal(&entry->addr, info, entry->addr.port)) 531 : : return entry; 532 : : } 533 : : return NULL; @@ -761,28 +761,28 @@ 660 : : /* Fill all the local addresses into the array addrs[], 661 : : * and return the array size. 662 : : */ - 663 : 270 : static unsigned int fill_local_addresses_vec(struct mptcp_sock *msk, + 663 : 271 : static unsigned int fill_local_addresses_vec(struct mptcp_sock *msk, 664 : : struct mptcp_addr_info *remote, 665 : : struct mptcp_pm_local *locals) 666 : : { - 667 : 270 : struct sock *sk = (struct sock *)msk; - 668 : 270 : struct mptcp_pm_addr_entry *entry; - 669 : 270 : struct mptcp_addr_info mpc_addr; - 670 : 270 : struct pm_nl_pernet *pernet; - 671 : 270 : unsigned int subflows_max; - 672 : 270 : int i = 0; + 667 : 271 : struct sock *sk = (struct sock *)msk; + 668 : 271 : struct mptcp_pm_addr_entry *entry; + 669 : 271 : struct mptcp_addr_info mpc_addr; + 670 : 271 : struct pm_nl_pernet *pernet; + 671 : 271 : unsigned int subflows_max; + 672 : 271 : int i = 0; 673 : : - 674 : 270 : pernet = pm_nl_get_pernet_from_msk(msk); - 675 : 270 : subflows_max = mptcp_pm_get_subflows_max(msk); + 674 : 271 : pernet = pm_nl_get_pernet_from_msk(msk); + 675 : 271 : subflows_max = mptcp_pm_get_subflows_max(msk); 676 : : - 677 : 270 : mptcp_local_address((struct sock_common *)msk, &mpc_addr); + 677 : 271 : mptcp_local_address((struct sock_common *)msk, &mpc_addr); 678 : : - 679 : 270 : rcu_read_lock(); - 680 [ + + - + : 768 : list_for_each_entry_rcu(entry, &pernet->local_addr_list, list) { + 679 : 271 : rcu_read_lock(); + 680 [ + + - + : 777 : list_for_each_entry_rcu(entry, &pernet->local_addr_list, list) { - - - - - - + + ] - 681 [ + + ]: 498 : if (!(entry->flags & MPTCP_PM_ADDR_FLAG_FULLMESH)) - 682 : 490 : continue; + 681 [ + + ]: 506 : if (!(entry->flags & MPTCP_PM_ADDR_FLAG_FULLMESH)) + 682 : 498 : continue; 683 : : 684 [ + + ]: 8 : if (!mptcp_pm_addr_families_match(sk, &entry->addr, remote)) 685 : 2 : continue; @@ -800,28 +800,28 @@ 697 : 6 : i++; 698 : : } 699 : : } - 700 : 270 : rcu_read_unlock(); + 700 : 271 : rcu_read_unlock(); 701 : : 702 : : /* If the array is empty, fill in the single 703 : : * 'IPADDRANY' local address 704 : : */ - 705 [ + + ]: 270 : if (!i) { - 706 : 266 : memset(&locals[i], 0, sizeof(locals[i])); - 707 : 532 : locals[i].addr.family = + 705 [ + + ]: 271 : if (!i) { + 706 : 267 : memset(&locals[i], 0, sizeof(locals[i])); + 707 : 534 : locals[i].addr.family = 708 : : #if IS_ENABLED(CONFIG_MPTCP_IPV6) - 709 [ + + + + ]: 266 : remote->family == AF_INET6 && + 709 [ + + + + ]: 267 : remote->family == AF_INET6 && 710 [ # # ]: 0 : ipv6_addr_v4mapped(&remote->addr6) ? AF_INET : 711 : : #endif 712 : : remote->family; 713 : : - 714 [ + + ]: 266 : if (!mptcp_pm_addr_families_match(sk, &locals[i].addr, remote)) + 714 [ + + ]: 267 : if (!mptcp_pm_addr_families_match(sk, &locals[i].addr, remote)) 715 : : return 0; 716 : : - 717 : 244 : msk->pm.subflows++; - 718 : 244 : i++; + 717 : 245 : msk->pm.subflows++; + 718 : 245 : i++; 719 : : } 720 : : - 721 : 248 : return i; + 721 : 249 : return i; 722 : : } 723 : : 724 : 289 : static void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk) @@ -845,33 +845,33 @@ 742 : 289 : mptcp_pm_announce_addr(msk, &remote, true); 743 : 289 : mptcp_pm_nl_addr_send_ack(msk); 744 : : - 745 [ + + ]: 289 : if (lookup_subflow_by_daddr(&msk->conn_list, &remote)) - 746 : 41 : return; + 745 [ + + ]: 289 : if (lookup_subflow_by_daddr(&msk->conn_list, &remote)) + 746 : 40 : return; 747 : : 748 : : /* pick id 0 port, if none is provided the remote address */ - 749 [ + + ]: 270 : if (!remote.port) - 750 : 238 : remote.port = sk->sk_dport; + 749 [ + + ]: 271 : if (!remote.port) + 750 : 239 : remote.port = sk->sk_dport; 751 : : 752 : : /* connect to the specified remote address, using whatever 753 : : * local address the routing configuration will pick. 754 : : */ - 755 : 270 : nr = fill_local_addresses_vec(msk, &remote, locals); - 756 [ + + ]: 270 : if (nr == 0) + 755 : 271 : nr = fill_local_addresses_vec(msk, &remote, locals); + 756 [ + + ]: 271 : if (nr == 0) 757 : : return; 758 : : - 759 : 248 : spin_unlock_bh(&msk->pm.lock); - 760 [ + + ]: 746 : for (i = 0; i < nr; i++) - 761 [ + + ]: 250 : if (__mptcp_subflow_connect(sk, &locals[i], &remote) == 0) - 762 : 224 : sf_created = true; - 763 : 248 : spin_lock_bh(&msk->pm.lock); + 759 : 249 : spin_unlock_bh(&msk->pm.lock); + 760 [ + + ]: 749 : for (i = 0; i < nr; i++) + 761 [ + + ]: 251 : if (__mptcp_subflow_connect(sk, &locals[i], &remote) == 0) + 762 : 225 : sf_created = true; + 763 : 249 : spin_lock_bh(&msk->pm.lock); 764 : : - 765 [ + + ]: 248 : if (sf_created) { + 765 [ + + ]: 249 : if (sf_created) { 766 : : /* add_addr_accepted is not decr for ID 0 */ - 767 [ + + ]: 222 : if (remote.id) - 768 : 218 : msk->pm.add_addr_accepted++; - 769 [ + + ]: 222 : if (msk->pm.add_addr_accepted >= add_addr_accept_max || - 770 [ + + ]: 108 : msk->pm.subflows >= subflows_max) - 771 : 248 : WRITE_ONCE(msk->pm.accept_addr, false); + 767 [ + + ]: 223 : if (remote.id) + 768 : 219 : msk->pm.add_addr_accepted++; + 769 [ + + ]: 223 : if (msk->pm.add_addr_accepted >= add_addr_accept_max || + 770 [ + + ]: 109 : msk->pm.subflows >= subflows_max) + 771 : 249 : WRITE_ONCE(msk->pm.accept_addr, false); 772 : : } 773 : : } 774 : : @@ -891,15 +891,15 @@ 788 : 861 : msk_owned_by_me(msk); 789 [ + - - + ]: 861 : lockdep_assert_held(&msk->pm.lock); 790 : : - 791 [ + + + + ]: 861 : if (!mptcp_pm_should_add_signal(msk) && + 791 [ + + + + ]: 861 : if (!mptcp_pm_should_add_signal(msk) && 792 [ # # ]: 0 : !mptcp_pm_should_rm_signal(msk)) 793 : : return; 794 : : - 795 [ + - ]: 874 : mptcp_for_each_subflow(msk, subflow) { - 796 [ + + ]: 874 : if (__mptcp_subflow_active(subflow)) { - 797 [ + - ]: 860 : if (!subflow->stale) { - 798 : 860 : mptcp_pm_send_ack(msk, subflow, false, false); - 799 : 860 : return; + 795 [ + - ]: 871 : mptcp_for_each_subflow(msk, subflow) { + 796 [ + + ]: 871 : if (__mptcp_subflow_active(subflow)) { + 797 [ + - ]: 857 : if (!subflow->stale) { + 798 : 857 : mptcp_pm_send_ack(msk, subflow, false, false); + 799 : 857 : return; 800 : : } 801 : : 802 [ # # ]: 0 : if (!alt) @@ -1027,40 +1027,40 @@ 924 : 86 : mptcp_pm_nl_rm_addr_or_subflow(msk, rm_list, MPTCP_MIB_RMSUBFLOW); 925 : 12 : } 926 : : - 927 : 9066 : void mptcp_pm_nl_work(struct mptcp_sock *msk) + 927 : 13801 : void mptcp_pm_nl_work(struct mptcp_sock *msk) 928 : : { - 929 : 9066 : struct mptcp_pm_data *pm = &msk->pm; + 929 : 13801 : struct mptcp_pm_data *pm = &msk->pm; 930 : : - 931 : 9066 : msk_owned_by_me(msk); + 931 : 13801 : msk_owned_by_me(msk); 932 : : - 933 [ + + ]: 9066 : if (!(pm->status & MPTCP_PM_WORK_MASK)) + 933 [ + + ]: 13801 : if (!(pm->status & MPTCP_PM_WORK_MASK)) 934 : : return; 935 : : - 936 : 959 : spin_lock_bh(&msk->pm.lock); + 936 : 958 : spin_lock_bh(&msk->pm.lock); 937 : : - 938 [ - + ]: 959 : pr_debug("msk=%p status=%x\n", msk, pm->status); - 939 [ + + ]: 959 : if (pm->status & BIT(MPTCP_PM_ADD_ADDR_RECEIVED)) { + 938 [ - + ]: 958 : pr_debug("msk=%p status=%x\n", msk, pm->status); + 939 [ + + ]: 958 : if (pm->status & BIT(MPTCP_PM_ADD_ADDR_RECEIVED)) { 940 : 289 : pm->status &= ~BIT(MPTCP_PM_ADD_ADDR_RECEIVED); 941 : 289 : mptcp_pm_nl_add_addr_received(msk); 942 : : } - 943 [ + + ]: 959 : if (pm->status & BIT(MPTCP_PM_ADD_ADDR_SEND_ACK)) { + 943 [ + + ]: 958 : if (pm->status & BIT(MPTCP_PM_ADD_ADDR_SEND_ACK)) { 944 : 122 : pm->status &= ~BIT(MPTCP_PM_ADD_ADDR_SEND_ACK); 945 : 122 : mptcp_pm_nl_addr_send_ack(msk); 946 : : } - 947 [ + + ]: 959 : if (pm->status & BIT(MPTCP_PM_RM_ADDR_RECEIVED)) { + 947 [ + + ]: 958 : if (pm->status & BIT(MPTCP_PM_RM_ADDR_RECEIVED)) { 948 : 106 : pm->status &= ~BIT(MPTCP_PM_RM_ADDR_RECEIVED); 949 : 106 : mptcp_pm_nl_rm_addr_received(msk); 950 : : } - 951 [ + + ]: 959 : if (pm->status & BIT(MPTCP_PM_ESTABLISHED)) { + 951 [ + + ]: 958 : if (pm->status & BIT(MPTCP_PM_ESTABLISHED)) { 952 : 436 : pm->status &= ~BIT(MPTCP_PM_ESTABLISHED); 953 : 436 : mptcp_pm_nl_fully_established(msk); 954 : : } - 955 [ + + ]: 959 : if (pm->status & BIT(MPTCP_PM_SUBFLOW_ESTABLISHED)) { + 955 [ + + ]: 958 : if (pm->status & BIT(MPTCP_PM_SUBFLOW_ESTABLISHED)) { 956 : 277 : pm->status &= ~BIT(MPTCP_PM_SUBFLOW_ESTABLISHED); 957 : 277 : mptcp_pm_nl_subflow_established(msk); 958 : : } 959 : : - 960 : 959 : spin_unlock_bh(&msk->pm.lock); + 960 : 958 : spin_unlock_bh(&msk->pm.lock); 961 : : } 962 : : 963 : 0 : static bool address_use_port(struct mptcp_pm_addr_entry *entry) @@ -1245,20 +1245,20 @@ 1139 : 22 : return err; 1140 : : } 1141 : : - 1142 : 361 : int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct mptcp_addr_info *skc) + 1142 : 362 : int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct mptcp_addr_info *skc) 1143 : : { - 1144 : 361 : struct mptcp_pm_addr_entry *entry; - 1145 : 361 : struct pm_nl_pernet *pernet; - 1146 : 361 : int ret; + 1144 : 362 : struct mptcp_pm_addr_entry *entry; + 1145 : 362 : struct pm_nl_pernet *pernet; + 1146 : 362 : int ret; 1147 : : - 1148 : 361 : pernet = pm_nl_get_pernet_from_msk(msk); + 1148 : 362 : pernet = pm_nl_get_pernet_from_msk(msk); 1149 : : - 1150 : 361 : rcu_read_lock(); - 1151 : 361 : entry = __lookup_addr(pernet, skc); - 1152 [ + + ]: 361 : ret = entry ? entry->addr.id : -1; - 1153 : 249 : rcu_read_unlock(); - 1154 : 361 : if (ret >= 0) - 1155 : 221 : return ret; + 1150 : 362 : rcu_read_lock(); + 1151 : 362 : entry = __lookup_addr(pernet, skc); + 1152 [ + + ]: 362 : ret = entry ? entry->addr.id : -1; + 1153 : 250 : rcu_read_unlock(); + 1154 : 362 : if (ret >= 0) + 1155 : 222 : return ret; 1156 : : 1157 : : /* address not found, add to local list */ 1158 : 140 : entry = kmalloc(sizeof(*entry), GFP_ATOMIC); @@ -1278,18 +1278,18 @@ 1172 : : return ret; 1173 : : } 1174 : : - 1175 : 739 : bool mptcp_pm_nl_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc) + 1175 : 740 : bool mptcp_pm_nl_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc) 1176 : : { - 1177 : 739 : struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk); - 1178 : 739 : struct mptcp_pm_addr_entry *entry; - 1179 : 739 : bool backup; + 1177 : 740 : struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk); + 1178 : 740 : struct mptcp_pm_addr_entry *entry; + 1179 : 740 : bool backup; 1180 : : - 1181 : 739 : rcu_read_lock(); - 1182 : 739 : entry = __lookup_addr(pernet, skc); - 1183 [ + + + + ]: 739 : backup = entry && !!(entry->flags & MPTCP_PM_ADDR_FLAG_BACKUP); - 1184 : 739 : rcu_read_unlock(); + 1181 : 740 : rcu_read_lock(); + 1182 : 740 : entry = __lookup_addr(pernet, skc); + 1183 [ + + + + ]: 740 : backup = entry && !!(entry->flags & MPTCP_PM_ADDR_FLAG_BACKUP); + 1184 : 740 : rcu_read_unlock(); 1185 : : - 1186 : 739 : return backup; + 1186 : 740 : return backup; 1187 : : } 1188 : : 1189 : : #define MPTCP_PM_CMD_GRP_OFFSET 0 @@ -1302,40 +1302,40 @@ 1196 : : }, 1197 : : }; 1198 : : - 1199 : 325 : void mptcp_pm_nl_subflow_chk_stale(const struct mptcp_sock *msk, struct sock *ssk) + 1199 : 291 : void mptcp_pm_nl_subflow_chk_stale(const struct mptcp_sock *msk, struct sock *ssk) 1200 : : { - 1201 : 325 : struct mptcp_subflow_context *iter, *subflow = mptcp_subflow_ctx(ssk); - 1202 : 325 : struct sock *sk = (struct sock *)msk; - 1203 : 325 : unsigned int active_max_loss_cnt; - 1204 : 325 : struct net *net = sock_net(sk); - 1205 : 325 : unsigned int stale_loss_cnt; - 1206 : 325 : bool slow; + 1201 : 291 : struct mptcp_subflow_context *iter, *subflow = mptcp_subflow_ctx(ssk); + 1202 : 291 : struct sock *sk = (struct sock *)msk; + 1203 : 291 : unsigned int active_max_loss_cnt; + 1204 : 291 : struct net *net = sock_net(sk); + 1205 : 291 : unsigned int stale_loss_cnt; + 1206 : 291 : bool slow; 1207 : : - 1208 : 325 : stale_loss_cnt = mptcp_stale_loss_cnt(net); - 1209 [ + + + - : 325 : if (subflow->stale || !stale_loss_cnt || subflow->stale_count <= stale_loss_cnt) - + + ] + 1208 : 291 : stale_loss_cnt = mptcp_stale_loss_cnt(net); + 1209 [ + + + - : 291 : if (subflow->stale || !stale_loss_cnt || subflow->stale_count <= stale_loss_cnt) + + + ] 1210 : : return; 1211 : : 1212 : : /* look for another available subflow not in loss state */ - 1213 : 217 : active_max_loss_cnt = max_t(int, stale_loss_cnt - 1, 1); - 1214 [ + + ]: 442 : mptcp_for_each_subflow(msk, iter) { - 1215 [ + + + + ]: 244 : if (iter != subflow && mptcp_subflow_active(iter) && - 1216 [ + + ]: 25 : iter->stale_count < active_max_loss_cnt) { + 1213 : 195 : active_max_loss_cnt = max_t(int, stale_loss_cnt - 1, 1); + 1214 [ + + ]: 397 : mptcp_for_each_subflow(msk, iter) { + 1215 [ + + + + ]: 219 : if (iter != subflow && mptcp_subflow_active(iter) && + 1216 [ + + ]: 22 : iter->stale_count < active_max_loss_cnt) { 1217 : : /* we have some alternatives, try to mark this subflow as idle ...*/ - 1218 : 19 : slow = lock_sock_fast(ssk); - 1219 [ + + ]: 19 : if (!tcp_rtx_and_write_queues_empty(ssk)) { - 1220 : 19 : subflow->stale = 1; - 1221 : 19 : __mptcp_retransmit_pending_data(sk); - 1222 [ + - ]: 19 : MPTCP_INC_STATS(net, MPTCP_MIB_SUBFLOWSTALE); + 1218 : 17 : slow = lock_sock_fast(ssk); + 1219 [ + + ]: 17 : if (!tcp_rtx_and_write_queues_empty(ssk)) { + 1220 : 17 : subflow->stale = 1; + 1221 : 17 : __mptcp_retransmit_pending_data(sk); + 1222 [ + - ]: 17 : MPTCP_INC_STATS(net, MPTCP_MIB_SUBFLOWSTALE); 1223 : : } - 1224 : 19 : unlock_sock_fast(ssk, slow); + 1224 : 17 : unlock_sock_fast(ssk, slow); 1225 : : 1226 : : /* always try to push the pending data regardless of re-injections: 1227 : : * we can possibly use backup subflows now, and subflow selection 1228 : : * is cheap under the msk socket lock 1229 : : */ - 1230 : 19 : __mptcp_push_pending(sk, 0); - 1231 : 19 : return; + 1230 : 17 : __mptcp_push_pending(sk, 0); + 1231 : 17 : return; 1232 : : } 1233 : : } 1234 : : } @@ -2155,11 +2155,11 @@ 2040 : 48 : return mptcp_pm_set_flags(skb, info); 2041 : : } 2042 : : - 2043 : 430 : static void mptcp_nl_mcast_send(struct net *net, struct sk_buff *nlskb, gfp_t gfp) + 2043 : 432 : static void mptcp_nl_mcast_send(struct net *net, struct sk_buff *nlskb, gfp_t gfp) 2044 : : { - 2045 : 430 : genlmsg_multicast_netns(&mptcp_genl_family, net, + 2045 : 432 : genlmsg_multicast_netns(&mptcp_genl_family, net, 2046 : : nlskb, 0, MPTCP_PM_EV_GRP_OFFSET, gfp); - 2047 : 430 : } + 2047 : 432 : } 2048 : : 2049 : 78 : bool mptcp_userspace_pm_active(const struct mptcp_sock *msk) 2050 : : { @@ -2176,20 +2176,20 @@ 2061 [ - + ]: 268 : if (nla_put_u16(skb, MPTCP_ATTR_FAMILY, ssk->sk_family)) 2062 : : return -EMSGSIZE; 2063 : : - 2064 [ + + - ]: 268 : switch (ssk->sk_family) { - 2065 : 150 : case AF_INET: - 2066 [ - + ]: 150 : if (nla_put_in_addr(skb, MPTCP_ATTR_SADDR4, issk->inet_saddr)) + 2064 [ + + - ]: 268 : switch (ssk->sk_family) { + 2065 : 152 : case AF_INET: + 2066 [ - + ]: 152 : if (nla_put_in_addr(skb, MPTCP_ATTR_SADDR4, issk->inet_saddr)) 2067 : : return -EMSGSIZE; - 2068 [ - + ]: 150 : if (nla_put_in_addr(skb, MPTCP_ATTR_DADDR4, issk->inet_daddr)) + 2068 [ - + ]: 152 : if (nla_put_in_addr(skb, MPTCP_ATTR_DADDR4, issk->inet_daddr)) 2069 : : return -EMSGSIZE; 2070 : : break; 2071 : : #if IS_ENABLED(CONFIG_MPTCP_IPV6) 2072 : : case AF_INET6: { - 2073 [ + - ]: 118 : const struct ipv6_pinfo *np = inet6_sk(ssk); + 2073 [ + - ]: 116 : const struct ipv6_pinfo *np = inet6_sk(ssk); 2074 : : - 2075 [ - + ]: 118 : if (nla_put_in6_addr(skb, MPTCP_ATTR_SADDR6, &np->saddr)) + 2075 [ - + ]: 116 : if (nla_put_in6_addr(skb, MPTCP_ATTR_SADDR6, &np->saddr)) 2076 : : return -EMSGSIZE; - 2077 [ - + ]: 118 : if (nla_put_in6_addr(skb, MPTCP_ATTR_DADDR6, &ssk->sk_v6_daddr)) + 2077 [ - + ]: 116 : if (nla_put_in6_addr(skb, MPTCP_ATTR_DADDR6, &ssk->sk_v6_daddr)) 2078 : : return -EMSGSIZE; 2079 : : break; 2080 : : } @@ -2383,41 +2383,41 @@ 2267 : 0 : nlmsg_free(skb); 2268 : : } 2269 : : - 2270 : 2512 : void mptcp_event_pm_listener(const struct sock *ssk, + 2270 : 2514 : void mptcp_event_pm_listener(const struct sock *ssk, 2271 : : enum mptcp_event_type event) 2272 : : { - 2273 : 2512 : const struct inet_sock *issk = inet_sk(ssk); - 2274 : 2512 : struct net *net = sock_net(ssk); - 2275 : 2512 : struct nlmsghdr *nlh; - 2276 : 2512 : struct sk_buff *skb; + 2273 : 2514 : const struct inet_sock *issk = inet_sk(ssk); + 2274 : 2514 : struct net *net = sock_net(ssk); + 2275 : 2514 : struct nlmsghdr *nlh; + 2276 : 2514 : struct sk_buff *skb; 2277 : : - 2278 [ + + ]: 2512 : if (!genl_has_listeners(&mptcp_genl_family, net, MPTCP_PM_EV_GRP_OFFSET)) + 2278 [ + + ]: 2514 : if (!genl_has_listeners(&mptcp_genl_family, net, MPTCP_PM_EV_GRP_OFFSET)) 2279 : : return; 2280 : : - 2281 : 54 : skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); - 2282 [ + - ]: 54 : if (!skb) + 2281 : 56 : skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); + 2282 [ + - ]: 56 : if (!skb) 2283 : : return; 2284 : : - 2285 : 54 : nlh = genlmsg_put(skb, 0, 0, &mptcp_genl_family, 0, event); - 2286 [ - + ]: 54 : if (!nlh) + 2285 : 56 : nlh = genlmsg_put(skb, 0, 0, &mptcp_genl_family, 0, event); + 2286 [ - + ]: 56 : if (!nlh) 2287 : 0 : goto nla_put_failure; 2288 : : - 2289 [ - + ]: 54 : if (nla_put_u16(skb, MPTCP_ATTR_FAMILY, ssk->sk_family)) + 2289 [ - + ]: 56 : if (nla_put_u16(skb, MPTCP_ATTR_FAMILY, ssk->sk_family)) 2290 : 0 : goto nla_put_failure; 2291 : : - 2292 [ - + ]: 54 : if (nla_put_be16(skb, MPTCP_ATTR_SPORT, issk->inet_sport)) + 2292 [ - + ]: 56 : if (nla_put_be16(skb, MPTCP_ATTR_SPORT, issk->inet_sport)) 2293 : 0 : goto nla_put_failure; 2294 : : - 2295 [ + + - ]: 54 : switch (ssk->sk_family) { + 2295 [ + + - ]: 56 : switch (ssk->sk_family) { 2296 : 28 : case AF_INET: 2297 [ - + ]: 28 : if (nla_put_in_addr(skb, MPTCP_ATTR_SADDR4, issk->inet_saddr)) 2298 : 0 : goto nla_put_failure; 2299 : : break; 2300 : : #if IS_ENABLED(CONFIG_MPTCP_IPV6) 2301 : : case AF_INET6: { - 2302 [ + - ]: 26 : const struct ipv6_pinfo *np = inet6_sk(ssk); + 2302 [ + - ]: 28 : const struct ipv6_pinfo *np = inet6_sk(ssk); 2303 : : - 2304 [ - + ]: 26 : if (nla_put_in6_addr(skb, MPTCP_ATTR_SADDR6, &np->saddr)) + 2304 [ - + ]: 28 : if (nla_put_in6_addr(skb, MPTCP_ATTR_SADDR6, &np->saddr)) 2305 : 0 : goto nla_put_failure; 2306 : : break; 2307 : : } @@ -2427,22 +2427,22 @@ 2311 : 0 : goto nla_put_failure; 2312 : : } 2313 : : - 2314 : 54 : genlmsg_end(skb, nlh); - 2315 : 54 : mptcp_nl_mcast_send(net, skb, GFP_KERNEL); - 2316 : 54 : return; + 2314 : 56 : genlmsg_end(skb, nlh); + 2315 : 56 : mptcp_nl_mcast_send(net, skb, GFP_KERNEL); + 2316 : 56 : return; 2317 : : 2318 : 0 : nla_put_failure: 2319 : 0 : nlmsg_free(skb); 2320 : : } 2321 : : - 2322 : 8142 : void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk, + 2322 : 8132 : void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk, 2323 : : const struct sock *ssk, gfp_t gfp) 2324 : : { - 2325 : 8142 : struct net *net = sock_net((const struct sock *)msk); - 2326 : 8142 : struct nlmsghdr *nlh; - 2327 : 8142 : struct sk_buff *skb; + 2325 : 8132 : struct net *net = sock_net((const struct sock *)msk); + 2326 : 8132 : struct nlmsghdr *nlh; + 2327 : 8132 : struct sk_buff *skb; 2328 : : - 2329 [ + + ]: 8142 : if (!genl_has_listeners(&mptcp_genl_family, net, MPTCP_PM_EV_GRP_OFFSET)) + 2329 [ + + ]: 8132 : if (!genl_has_listeners(&mptcp_genl_family, net, MPTCP_PM_EV_GRP_OFFSET)) 2330 : : return; 2331 : : 2332 : 280 : skb = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); @@ -2525,11 +2525,11 @@ 2408 : 1088 : return 0; 2409 : : } 2410 : : - 2411 : 918 : static void __net_exit pm_nl_exit_net(struct list_head *net_list) + 2411 : 925 : static void __net_exit pm_nl_exit_net(struct list_head *net_list) 2412 : : { - 2413 : 918 : struct net *net; + 2413 : 925 : struct net *net; 2414 : : - 2415 [ + + ]: 1913 : list_for_each_entry(net, net_list, exit_list) { + 2415 [ + + ]: 1920 : list_for_each_entry(net, net_list, exit_list) { 2416 : 995 : struct pm_nl_pernet *pernet = pm_nl_get_pernet(net); 2417 : : 2418 : : /* net is removed from namespace list, can't race with @@ -2538,7 +2538,7 @@ 2421 : : */ 2422 : 995 : __flush_addrs(&pernet->local_addr_list); 2423 : : } - 2424 : 918 : } + 2424 : 925 : } 2425 : : 2426 : : static struct pernet_operations mptcp_pm_pernet_ops = { 2427 : : .init = pm_nl_init_net, diff --git a/html/lcov/export/mptcp/pm_userspace.c.func-c.html b/html/lcov/export/mptcp/pm_userspace.c.func-c.html index 845b8018..d75c67f9 100644 --- a/html/lcov/export/mptcp/pm_userspace.c.func-c.html +++ b/html/lcov/export/mptcp/pm_userspace.c.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % diff --git a/html/lcov/export/mptcp/pm_userspace.c.func.html b/html/lcov/export/mptcp/pm_userspace.c.func.html index 1b035d55..3c00a3d4 100644 --- a/html/lcov/export/mptcp/pm_userspace.c.func.html +++ b/html/lcov/export/mptcp/pm_userspace.c.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % diff --git a/html/lcov/export/mptcp/pm_userspace.c.gcov.html b/html/lcov/export/mptcp/pm_userspace.c.gcov.html index 776c6510..b0e4a84b 100644 --- a/html/lcov/export/mptcp/pm_userspace.c.gcov.html +++ b/html/lcov/export/mptcp/pm_userspace.c.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % diff --git a/html/lcov/export/mptcp/protocol.c.func-c.html b/html/lcov/export/mptcp/protocol.c.func-c.html index 80dbfdc7..5d9aef34 100644 --- a/html/lcov/export/mptcp/protocol.c.func-c.html +++ b/html/lcov/export/mptcp/protocol.c.func-c.html @@ -33,11 +33,11 @@ Lines: 91.4 % 2227 - 2035 + 2036 Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 95.7 % @@ -56,9 +56,9 @@ Branches: - 69.0 % + 68.7 % 1621 - 1118 + 1113 @@ -151,7 +151,7 @@ __mptcp_flush_join_list - 41 + 38 @@ -163,21 +163,21 @@ - mptcp_disconnect + mptcp_ioctl - 60 + 55 - mptcp_ioctl + mptcp_ioctl_outq - 60 + 55 - mptcp_ioctl_outq + mptcp_disconnect 60 @@ -207,21 +207,21 @@ mptcp_subflow_set_active - 102 + 109 mptcp_do_fastclose - 357 + 353 mptcp_inq_hint - 432 + 429 @@ -249,7 +249,7 @@ __mptcp_close_subflow - 598 + 586 @@ -263,35 +263,35 @@ __mptcp_retransmit_pending_data - 787 + 769 mptcp_close_ssk - 806 + 790 - __mptcp_error_report + __mptcp_subflow_disconnect - 810 + 796 - __mptcp_subflow_disconnect + __mptcp_error_report - 815 + 820 mptcp_update_data_checksum - 869 + 871 @@ -312,14 +312,14 @@ mptcp_reset_tout_timer - 1045 + 1050 mptcp_set_datafin_timeout - 1057 + 1077 @@ -347,7 +347,7 @@ mptcp_listen - 1242 + 1243 @@ -368,21 +368,21 @@ mptcp_shutdown - 1479 + 1486 mptcp_subflow_get_retrans - 1683 + 1742 __mptcp_wr_shutdown - 2148 + 2140 @@ -396,7 +396,7 @@ mptcp_check_listen_stop - 2400 + 2396 @@ -417,7 +417,7 @@ mptcp_close_state - 2539 + 2554 @@ -431,21 +431,21 @@ mptcp_cancel_work - 2654 + 2650 mptcp_send_ack - 2736 + 2760 mptcp_subflow_shutdown - 3006 + 2996 @@ -492,576 +492,576 @@ - mptcp_subflow_send_ack + __mptcp_init_sock - 3681 + 3684 - __mptcp_init_sock + mptcp_subflow_send_ack - 3684 + 3722 mptcp_close_wake_up - 4375 + 4358 __mptcp_subflow_send_ack - 4569 + 4607 mptcp_sock_graft - 4642 + 4640 mptcp_copy_inaddrs - 4916 + 4918 __mptcp_close_ssk - 5416 + 5395 __mptcp_subflow_error_report - 5479 + 5501 mptcp_forward_alloc_get - 5551 + 5531 - mptcp_check_and_set_pending + __mptcp_nmpc_sk - 5990 + 7135 - __mptcp_retrans + mptcp_check_and_set_pending - 6687 + 11067 - mptcp_clean_una_wakeup + __mptcp_retrans - 6687 + 11931 - mptcp_retransmit_timer + mptcp_clean_una_wakeup - 6998 + 11931 - __mptcp_nmpc_sk + mptcp_retransmit_timer - 7134 + 12231 mptcp_check_data_fin_ack - 9066 + 13800 mptcp_check_fastclose - 9066 + 13800 mptcp_close_tout_expired - 9066 + 13800 mptcp_check_data_fin - 9106 + 13845 mptcp_worker - 9156 + 13879 mptcp_schedule_work - 10628 + 15311 mptcp_set_state - 16903 + 16883 mptcp_rfree - 22027 + 23541 - mptcp_stop_rtx_timer + mptcp_subflow_process_delegated - 23390 + 28202 - mptcp_subflow_process_delegated + mptcp_napi_poll - 26249 + 31284 - mptcp_napi_poll + mptcp_stop_rtx_timer - 28124 + 41084 __mptcp_clean_una_wakeup - 32424 + 47241 mptcp_wnd_end - 61032 + 54686 __mptcp_subflow_push_pending - 67977 + 84241 mptcp_data_queue_ofo - 87099 + 102858 tcp_can_send_ack - 92401 + 125276 mptcp_subflow_cleanup_rbuf - 158562 + 223065 mptcp_subflow_recv_lookup - 168433 + 255433 __mptcp_splice_receive_queue - 194183 + 271338 __mptcp_rmem_reclaim - 197206 + 285611 mptcp_reset_rtx_timer - 206787 + 306104 __mptcp_clean_una - 207766 + 307625 - __mptcp_data_acked + mptcp_rmem_uncharge - 213371 + 315399 - mptcp_pending_data_fin_ack + __mptcp_data_acked - 216832 + 316231 - mptcp_rmem_uncharge + mptcp_pending_data_fin_ack - 223929 + 321425 __mptcp_add_ext - 229616 + 333147 __mptcp_alloc_tx_skb - 229616 + 333147 __mptcp_do_alloc_tx_skb - 229616 + 333147 mptcp_set_owner_r - 237456 + 335268 mptcp_set_timeout - 265373 + 386435 - mptcp_check_writeable + __mptcp_move_skbs - 274457 + 438671 - __mptcp_move_skbs + mptcp_check_send_data_fin - 305261 + 454671 - mptcp_check_send_data_fin + mptcp_check_writeable - 338360 + 454742 mptcp_subflow_get_send - 340419 + 484360 mptcp_try_coalesce - 344906 + 489674 dfrag_clear - 400397 + 553213 mptcp_carve_data_frag - 400403 + 553219 mptcp_page_frag_refill - 400403 + 553219 mptcp_sendmsg - 449188 + 582639 - mptcp_update_post_push + mptcp_push_release - 457019 + 589247 - mptcp_push_release + __mptcp_push_pending - 460812 + 608254 - __mptcp_push_pending + mptcp_skb_can_collapse_to - 468622 + 630484 - mptcp_skb_can_collapse_to + mptcp_update_post_push - 475876 + 633306 - move_skbs_to_msk + mptcp_poll - 480471 + 693168 - __mptcp_move_skbs_from_subflow + move_skbs_to_msk - 480940 + 693754 - mptcp_data_ready + __mptcp_move_skbs_from_subflow - 481725 + 694457 - __mptcp_move_skb + mptcp_data_ready - 483949 + 695121 - mptcp_rmem_schedule + __subflow_push_pending - 483949 + 698192 - mptcp_pending_data_fin + __mptcp_move_skb - 489577 + 698446 - mptcp_poll + mptcp_rmem_schedule - 512684 + 698446 do_copy_data_nocache - 526558 + 702776 mptcp_frag_can_collapse_to - 526558 + 702776 mptcp_send_limit - 528904 + 706004 - __subflow_push_pending + mptcp_pending_data_fin - 537850 + 707599 mptcp_recvmsg - 575461 + 762922 mptcp_rcv_space_adjust - 600431 + 792233 - __mptcp_set_timeout + mptcp_check_allowed_size - 605792 + 821720 - mptcp_check_allowed_size + mptcp_sendmsg_frag - 608968 + 821720 - mptcp_sendmsg_frag + __mptcp_set_timeout - 608969 + 870795 __mptcp_ofo_queue - 674654 + 965092 - __mptcp_recvmsg_mskq + __mptcp_check_push - 737581 + 979762 - mptcp_cleanup_rbuf + __mptcp_recvmsg_mskq - 737581 + 1001533 - __mptcp_check_push + mptcp_cleanup_rbuf - 764989 + 1001533 mptcp_subflow_active - 940107 + 1259231 mptcp_release_cb - 1091255 + 1422124 - mptcp_rmem_fwd_alloc_add + mptcp_subflow_could_cleanup - 1267089 + 1617331 __mptcp_update_rmem - 1285907 + 1694165 - mptcp_subflow_could_cleanup + mptcp_rmem_fwd_alloc_add - 1290743 + 1810815 diff --git a/html/lcov/export/mptcp/protocol.c.func.html b/html/lcov/export/mptcp/protocol.c.func.html index 011480df..ae2374d8 100644 --- a/html/lcov/export/mptcp/protocol.c.func.html +++ b/html/lcov/export/mptcp/protocol.c.func.html @@ -33,11 +33,11 @@ Lines: 91.4 % 2227 - 2035 + 2036 Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 95.7 % @@ -56,9 +56,9 @@ Branches: - 69.0 % + 68.7 % 1621 - 1118 + 1113 @@ -81,35 +81,35 @@ __mptcp_add_ext - 229616 + 333147 __mptcp_alloc_tx_skb - 229616 + 333147 __mptcp_check_push - 764989 + 979762 __mptcp_clean_una - 207766 + 307625 __mptcp_clean_una_wakeup - 32424 + 47241 @@ -130,21 +130,21 @@ __mptcp_close_ssk - 5416 + 5395 __mptcp_close_subflow - 598 + 586 __mptcp_data_acked - 213371 + 316231 @@ -158,14 +158,14 @@ __mptcp_do_alloc_tx_skb - 229616 + 333147 __mptcp_error_report - 810 + 820 @@ -179,7 +179,7 @@ __mptcp_flush_join_list - 41 + 38 @@ -193,77 +193,77 @@ __mptcp_move_skb - 483949 + 698446 __mptcp_move_skbs - 305261 + 438671 __mptcp_move_skbs_from_subflow - 480940 + 694457 __mptcp_nmpc_sk - 7134 + 7135 __mptcp_ofo_queue - 674654 + 965092 __mptcp_push_pending - 468622 + 608254 __mptcp_recvmsg_mskq - 737581 + 1001533 __mptcp_retrans - 6687 + 11931 __mptcp_retransmit_pending_data - 787 + 769 __mptcp_rmem_reclaim - 197206 + 285611 __mptcp_set_timeout - 605792 + 870795 @@ -277,35 +277,35 @@ __mptcp_splice_receive_queue - 194183 + 271338 __mptcp_subflow_disconnect - 815 + 796 __mptcp_subflow_error_report - 5479 + 5501 __mptcp_subflow_push_pending - 67977 + 84241 __mptcp_subflow_send_ack - 4569 + 4607 @@ -319,42 +319,42 @@ __mptcp_update_rmem - 1285907 + 1694165 __mptcp_wr_shutdown - 2148 + 2140 __subflow_push_pending - 537850 + 698192 dfrag_clear - 400397 + 553213 do_copy_data_nocache - 526558 + 702776 move_skbs_to_msk - 480471 + 693754 @@ -375,84 +375,84 @@ mptcp_cancel_work - 2654 + 2650 mptcp_carve_data_frag - 400403 + 553219 mptcp_check_allowed_size - 608968 + 821720 mptcp_check_and_set_pending - 5990 + 11067 mptcp_check_data_fin - 9106 + 13845 mptcp_check_data_fin_ack - 9066 + 13800 mptcp_check_fastclose - 9066 + 13800 mptcp_check_listen_stop - 2400 + 2396 mptcp_check_send_data_fin - 338360 + 454671 mptcp_check_writeable - 274457 + 454742 mptcp_clean_una_wakeup - 6687 + 11931 mptcp_cleanup_rbuf - 737581 + 1001533 @@ -466,28 +466,28 @@ mptcp_close_ssk - 806 + 790 mptcp_close_state - 2539 + 2554 mptcp_close_tout_expired - 9066 + 13800 mptcp_close_wake_up - 4375 + 4358 @@ -501,7 +501,7 @@ mptcp_copy_inaddrs - 4916 + 4918 @@ -522,14 +522,14 @@ mptcp_data_queue_ofo - 87099 + 102858 mptcp_data_ready - 481725 + 695121 @@ -557,7 +557,7 @@ mptcp_do_fastclose - 357 + 353 @@ -599,14 +599,14 @@ mptcp_forward_alloc_get - 5551 + 5531 mptcp_frag_can_collapse_to - 526558 + 702776 @@ -634,28 +634,28 @@ mptcp_inq_hint - 432 + 429 mptcp_ioctl - 60 + 55 mptcp_ioctl_outq - 60 + 55 mptcp_listen - 1242 + 1243 @@ -669,35 +669,35 @@ mptcp_napi_poll - 28124 + 31284 mptcp_page_frag_refill - 400403 + 553219 mptcp_pending_data_fin - 489577 + 707599 mptcp_pending_data_fin_ack - 216832 + 321425 mptcp_poll - 512684 + 693168 @@ -718,14 +718,14 @@ mptcp_push_release - 460812 + 589247 mptcp_rcv_space_adjust - 600431 + 792233 @@ -739,91 +739,91 @@ mptcp_recvmsg - 575461 + 762922 mptcp_release_cb - 1091255 + 1422124 mptcp_reset_rtx_timer - 206787 + 306104 mptcp_reset_tout_timer - 1045 + 1050 mptcp_retransmit_timer - 6998 + 12231 mptcp_rfree - 22027 + 23541 mptcp_rmem_fwd_alloc_add - 1267089 + 1810815 mptcp_rmem_schedule - 483949 + 698446 mptcp_rmem_uncharge - 223929 + 315399 mptcp_schedule_work - 10628 + 15311 mptcp_send_ack - 2736 + 2760 mptcp_send_limit - 528904 + 706004 mptcp_sendmsg - 449188 + 582639 @@ -837,42 +837,42 @@ mptcp_sendmsg_frag - 608969 + 821720 mptcp_set_datafin_timeout - 1057 + 1077 mptcp_set_owner_r - 237456 + 335268 mptcp_set_state - 16903 + 16883 mptcp_set_timeout - 265373 + 386435 mptcp_shutdown - 1479 + 1486 @@ -886,21 +886,21 @@ mptcp_skb_can_collapse_to - 475876 + 630484 mptcp_sock_graft - 4642 + 4640 mptcp_stop_rtx_timer - 23390 + 41084 @@ -914,35 +914,35 @@ mptcp_subflow_active - 940107 + 1259231 mptcp_subflow_cleanup_rbuf - 158562 + 223065 mptcp_subflow_could_cleanup - 1290743 + 1617331 mptcp_subflow_get_retrans - 1683 + 1742 mptcp_subflow_get_send - 340419 + 484360 @@ -956,35 +956,35 @@ mptcp_subflow_process_delegated - 26249 + 28202 mptcp_subflow_recv_lookup - 168433 + 255433 mptcp_subflow_send_ack - 3681 + 3722 mptcp_subflow_set_active - 102 + 109 mptcp_subflow_shutdown - 3006 + 2996 @@ -1005,7 +1005,7 @@ mptcp_try_coalesce - 344906 + 489674 @@ -1019,7 +1019,7 @@ mptcp_update_data_checksum - 869 + 871 @@ -1033,21 +1033,21 @@ mptcp_update_post_push - 457019 + 633306 mptcp_wnd_end - 61032 + 54686 mptcp_worker - 9156 + 13879 @@ -1061,7 +1061,7 @@ tcp_can_send_ack - 92401 + 125276 diff --git a/html/lcov/export/mptcp/protocol.c.gcov.html b/html/lcov/export/mptcp/protocol.c.gcov.html index 162f6a2d..e2958c6b 100644 --- a/html/lcov/export/mptcp/protocol.c.gcov.html +++ b/html/lcov/export/mptcp/protocol.c.gcov.html @@ -33,11 +33,11 @@ Lines: 91.4 % 2227 - 2035 + 2036 Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 95.7 % @@ -56,9 +56,9 @@ Branches: - 69.0 % + 68.7 % 1621 - 1118 + 1113 @@ -128,9 +128,9 @@ 50 : : static struct net_device mptcp_napi_dev; 51 : : 52 : : /* Returns end sequence number of the receiver's advertised window */ - 53 : 347223 : u64 mptcp_wnd_end(const struct mptcp_sock *msk) + 53 : 340758 : u64 mptcp_wnd_end(const struct mptcp_sock *msk) 54 : : { - 55 : 347223 : return READ_ONCE(msk->wnd_end); + 55 : 340758 : return READ_ONCE(msk->wnd_end); 56 : : } 57 : : 58 : 94 : static const struct proto_ops *mptcp_fallback_tcp_ops(const struct sock *sk) @@ -173,21 +173,21 @@ 95 : : /* If the MPC handshake is not started, returns the first subflow, 96 : : * eventually allocating it. 97 : : */ - 98 : 7134 : struct sock *__mptcp_nmpc_sk(struct mptcp_sock *msk) + 98 : 7135 : struct sock *__mptcp_nmpc_sk(struct mptcp_sock *msk) 99 : : { - 100 : 7134 : struct sock *sk = (struct sock *)msk; - 101 : 7134 : int ret; + 100 : 7135 : struct sock *sk = (struct sock *)msk; + 101 : 7135 : int ret; 102 : : - 103 [ + + + + ]: 7134 : if (!((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_LISTEN))) + 103 [ + + + + ]: 7135 : if (!((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_LISTEN))) 104 : : return ERR_PTR(-EINVAL); 105 : : - 106 [ + + ]: 7116 : if (!msk->first) { + 106 [ + + ]: 7117 : if (!msk->first) { 107 : 2506 : ret = __mptcp_socket_create(msk); 108 [ - + ]: 2506 : if (ret) 109 : 0 : return ERR_PTR(ret); 110 : : } 111 : : - 112 : 7116 : return msk->first; + 112 : 7117 : return msk->first; 113 : : } 114 : : 115 : 0 : static void mptcp_drop(struct sock *sk, struct sk_buff *skb) @@ -196,108 +196,108 @@ 118 : 0 : __kfree_skb(skb); 119 : : } 120 : : - 121 : 1267089 : static void mptcp_rmem_fwd_alloc_add(struct sock *sk, int size) + 121 : 1810815 : static void mptcp_rmem_fwd_alloc_add(struct sock *sk, int size) 122 : : { - 123 [ - + - + ]: 1267089 : WRITE_ONCE(mptcp_sk(sk)->rmem_fwd_alloc, + 123 [ - + - + ]: 1810815 : WRITE_ONCE(mptcp_sk(sk)->rmem_fwd_alloc, 124 : : mptcp_sk(sk)->rmem_fwd_alloc + size); - 125 : 1267089 : } + 125 : 1810815 : } 126 : : - 127 : 121325 : static void mptcp_rmem_charge(struct sock *sk, int size) + 127 : 122865 : static void mptcp_rmem_charge(struct sock *sk, int size) 128 : : { - 129 : 702416 : mptcp_rmem_fwd_alloc_add(sk, -size); + 129 : 1006656 : mptcp_rmem_fwd_alloc_add(sk, -size); 130 : : } 131 : : - 132 : 344906 : static bool mptcp_try_coalesce(struct sock *sk, struct sk_buff *to, + 132 : 489674 : static bool mptcp_try_coalesce(struct sock *sk, struct sk_buff *to, 133 : : struct sk_buff *from) 134 : : { - 135 : 344906 : bool fragstolen; - 136 : 344906 : int delta; + 135 : 489674 : bool fragstolen; + 136 : 489674 : int delta; 137 : : - 138 [ + + + + ]: 689808 : if (MPTCP_SKB_CB(from)->offset || - 139 : 344902 : !skb_try_coalesce(to, from, &fragstolen, &delta)) - 140 : 77152 : return false; + 138 [ + + + + ]: 979342 : if (MPTCP_SKB_CB(from)->offset || + 139 : 489668 : !skb_try_coalesce(to, from, &fragstolen, &delta)) + 140 : 103897 : return false; 141 : : - 142 [ - + ]: 267754 : pr_debug("colesced seq %llx into %llx new len %d new end seq %llx\n", + 142 [ - + ]: 385777 : pr_debug("colesced seq %llx into %llx new len %d new end seq %llx\n", 143 : : MPTCP_SKB_CB(from)->map_seq, MPTCP_SKB_CB(to)->map_seq, 144 : : to->len, MPTCP_SKB_CB(from)->end_seq); - 145 : 267754 : MPTCP_SKB_CB(to)->end_seq = MPTCP_SKB_CB(from)->end_seq; + 145 : 385777 : MPTCP_SKB_CB(to)->end_seq = MPTCP_SKB_CB(from)->end_seq; 146 : : 147 : : /* note the fwd memory can reach a negative value after accounting 148 : : * for the delta, but the later skb free will restore a non 149 : : * negative one 150 : : */ - 151 : 267754 : atomic_add(delta, &sk->sk_rmem_alloc); - 152 : 267754 : mptcp_rmem_charge(sk, delta); - 153 [ - + ]: 267754 : kfree_skb_partial(from, fragstolen); + 151 : 385777 : atomic_add(delta, &sk->sk_rmem_alloc); + 152 : 385777 : mptcp_rmem_charge(sk, delta); + 153 [ - + ]: 385777 : kfree_skb_partial(from, fragstolen); 154 : : - 155 : 267754 : return true; + 155 : 385777 : return true; 156 : : } 157 : : - 158 : 16817 : static bool mptcp_ooo_try_coalesce(struct mptcp_sock *msk, struct sk_buff *to, + 158 : 17491 : static bool mptcp_ooo_try_coalesce(struct mptcp_sock *msk, struct sk_buff *to, 159 : : struct sk_buff *from) 160 : : { - 161 [ + + ]: 41012 : if (MPTCP_SKB_CB(from)->map_seq != MPTCP_SKB_CB(to)->end_seq) + 161 [ + + ]: 50219 : if (MPTCP_SKB_CB(from)->map_seq != MPTCP_SKB_CB(to)->end_seq) 162 : : return false; 163 : : - 164 : 102017 : return mptcp_try_coalesce((struct sock *)msk, to, from); + 164 : 122133 : return mptcp_try_coalesce((struct sock *)msk, to, from); 165 : : } 166 : : - 167 : 197206 : static void __mptcp_rmem_reclaim(struct sock *sk, int amount) + 167 : 285611 : static void __mptcp_rmem_reclaim(struct sock *sk, int amount) 168 : : { - 169 : 197206 : amount >>= PAGE_SHIFT; - 170 : 197206 : mptcp_rmem_charge(sk, amount << PAGE_SHIFT); - 171 : 197206 : __sk_mem_reduce_allocated(sk, amount); - 172 : 197206 : } + 169 : 285611 : amount >>= PAGE_SHIFT; + 170 : 285611 : mptcp_rmem_charge(sk, amount << PAGE_SHIFT); + 171 : 285611 : __sk_mem_reduce_allocated(sk, amount); + 172 : 285611 : } 173 : : - 174 : 223929 : static void mptcp_rmem_uncharge(struct sock *sk, int size) + 174 : 315399 : static void mptcp_rmem_uncharge(struct sock *sk, int size) 175 : : { - 176 [ - + ]: 223929 : struct mptcp_sock *msk = mptcp_sk(sk); - 177 : 223929 : int reclaimable; + 176 [ - + ]: 315399 : struct mptcp_sock *msk = mptcp_sk(sk); + 177 : 315399 : int reclaimable; 178 : : - 179 : 223929 : mptcp_rmem_fwd_alloc_add(sk, size); - 180 [ - + ]: 223929 : reclaimable = msk->rmem_fwd_alloc - sk_unused_reserved_mem(sk); + 179 : 315399 : mptcp_rmem_fwd_alloc_add(sk, size); + 180 [ - + ]: 315399 : reclaimable = msk->rmem_fwd_alloc - sk_unused_reserved_mem(sk); 181 : : 182 : : /* see sk_mem_uncharge() for the rationale behind the following schema */ - 183 [ + + ]: 223929 : if (unlikely(reclaimable >= PAGE_SIZE)) - 184 : 197206 : __mptcp_rmem_reclaim(sk, reclaimable); - 185 : 223929 : } + 183 [ + + ]: 315399 : if (unlikely(reclaimable >= PAGE_SIZE)) + 184 : 285611 : __mptcp_rmem_reclaim(sk, reclaimable); + 185 : 315399 : } 186 : : - 187 : 22027 : static void mptcp_rfree(struct sk_buff *skb) + 187 : 23541 : static void mptcp_rfree(struct sk_buff *skb) 188 : : { - 189 : 22027 : unsigned int len = skb->truesize; - 190 : 22027 : struct sock *sk = skb->sk; + 189 : 23541 : unsigned int len = skb->truesize; + 190 : 23541 : struct sock *sk = skb->sk; 191 : : - 192 : 22027 : atomic_sub(len, &sk->sk_rmem_alloc); - 193 : 22027 : mptcp_rmem_uncharge(sk, len); - 194 : 22027 : } + 192 : 23541 : atomic_sub(len, &sk->sk_rmem_alloc); + 193 : 23541 : mptcp_rmem_uncharge(sk, len); + 194 : 23541 : } 195 : : - 196 : 237456 : void mptcp_set_owner_r(struct sk_buff *skb, struct sock *sk) + 196 : 335268 : void mptcp_set_owner_r(struct sk_buff *skb, struct sock *sk) 197 : : { - 198 : 237456 : skb_orphan(skb); - 199 : 237456 : skb->sk = sk; - 200 : 237456 : skb->destructor = mptcp_rfree; - 201 : 237456 : atomic_add(skb->truesize, &sk->sk_rmem_alloc); - 202 : 237456 : mptcp_rmem_charge(sk, skb->truesize); - 203 : 237456 : } + 198 : 335268 : skb_orphan(skb); + 199 : 335268 : skb->sk = sk; + 200 : 335268 : skb->destructor = mptcp_rfree; + 201 : 335268 : atomic_add(skb->truesize, &sk->sk_rmem_alloc); + 202 : 335268 : mptcp_rmem_charge(sk, skb->truesize); + 203 : 335268 : } 204 : : 205 : : /* "inspired" by tcp_data_queue_ofo(), main differences: 206 : : * - use mptcp seqs 207 : : * - don't cope with sacks 208 : : */ - 209 : 87099 : static void mptcp_data_queue_ofo(struct mptcp_sock *msk, struct sk_buff *skb) + 209 : 102858 : static void mptcp_data_queue_ofo(struct mptcp_sock *msk, struct sk_buff *skb) 210 : : { - 211 : 87099 : struct sock *sk = (struct sock *)msk; - 212 : 87099 : struct rb_node **p, *parent; - 213 : 87099 : u64 seq, end_seq, max_seq; - 214 : 87099 : struct sk_buff *skb1; + 211 : 102858 : struct sock *sk = (struct sock *)msk; + 212 : 102858 : struct rb_node **p, *parent; + 213 : 102858 : u64 seq, end_seq, max_seq; + 214 : 102858 : struct sk_buff *skb1; 215 : : - 216 : 87099 : seq = MPTCP_SKB_CB(skb)->map_seq; - 217 : 87099 : end_seq = MPTCP_SKB_CB(skb)->end_seq; - 218 [ - + ]: 87099 : max_seq = atomic64_read(&msk->rcv_wnd_sent); + 216 : 102858 : seq = MPTCP_SKB_CB(skb)->map_seq; + 217 : 102858 : end_seq = MPTCP_SKB_CB(skb)->end_seq; + 218 [ - + ]: 102858 : max_seq = atomic64_read(&msk->rcv_wnd_sent); 219 : : - 220 [ - + ]: 87099 : pr_debug("msk=%p seq=%llx limit=%llx empty=%d\n", msk, seq, max_seq, + 220 [ - + ]: 102858 : pr_debug("msk=%p seq=%llx limit=%llx empty=%d\n", msk, seq, max_seq, 221 : : RB_EMPTY_ROOT(&msk->out_of_order_queue)); - 222 [ - + ]: 87099 : if (after64(end_seq, max_seq)) { + 222 [ - + ]: 102858 : if (after64(end_seq, max_seq)) { 223 : : /* out of window */ 224 : 0 : mptcp_drop(sk, skb); 225 [ # # ]: 0 : pr_debug("oow by %lld, rcv_wnd_sent %llu\n", @@ -307,49 +307,49 @@ 229 : 0 : return; 230 : : } 231 : : - 232 : 87099 : p = &msk->out_of_order_queue.rb_node; - 233 [ + - ]: 87099 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_OFOQUEUE); - 234 [ + + ]: 87099 : if (RB_EMPTY_ROOT(&msk->out_of_order_queue)) { - 235 : 10016 : rb_link_node(&skb->rbnode, NULL, p); - 236 : 10016 : rb_insert_color(&skb->rbnode, &msk->out_of_order_queue); - 237 : 10016 : msk->ooo_last_skb = skb; - 238 : 10016 : goto end; + 232 : 102858 : p = &msk->out_of_order_queue.rb_node; + 233 [ + - ]: 102858 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_OFOQUEUE); + 234 [ + + ]: 102858 : if (RB_EMPTY_ROOT(&msk->out_of_order_queue)) { + 235 : 11143 : rb_link_node(&skb->rbnode, NULL, p); + 236 : 11143 : rb_insert_color(&skb->rbnode, &msk->out_of_order_queue); + 237 : 11143 : msk->ooo_last_skb = skb; + 238 : 11143 : goto end; 239 : : } 240 : : 241 : : /* with 2 subflows, adding at end of ooo queue is quite likely 242 : : * Use of ooo_last_skb avoids the O(Log(N)) rbtree lookup. 243 : : */ - 244 [ + + + + ]: 130083 : if (mptcp_ooo_try_coalesce(msk, msk->ooo_last_skb, skb)) { - 245 [ + - ]: 40355 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_OFOMERGE); - 246 [ + - ]: 40355 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_OFOQUEUETAIL); - 247 : 40355 : return; + 244 [ + + + + ]: 152096 : if (mptcp_ooo_try_coalesce(msk, msk->ooo_last_skb, skb)) { + 245 [ + - ]: 43748 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_OFOMERGE); + 246 [ + - ]: 43748 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_OFOQUEUETAIL); + 247 : 43748 : return; 248 : : } 249 : : 250 : : /* Can avoid an rbtree lookup if we are adding skb after ooo_last_skb */ - 251 [ + + ]: 36728 : if (!before64(seq, MPTCP_SKB_CB(msk->ooo_last_skb)->end_seq)) { - 252 [ + - ]: 26321 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_OFOQUEUETAIL); - 253 : 26321 : parent = &msk->ooo_last_skb->rbnode; - 254 : 26321 : p = &parent->rb_right; - 255 : 26321 : goto insert; + 251 [ + + ]: 47967 : if (!before64(seq, MPTCP_SKB_CB(msk->ooo_last_skb)->end_seq)) { + 252 [ + - ]: 32868 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_OFOQUEUETAIL); + 253 : 32868 : parent = &msk->ooo_last_skb->rbnode; + 254 : 32868 : p = &parent->rb_right; + 255 : 32868 : goto insert; 256 : : } 257 : : 258 : : /* Find place to insert this segment. Handle overlaps on the way. */ 259 : : parent = NULL; - 260 [ + + ]: 73966 : while (*p) { - 261 : 69075 : parent = *p; - 262 : 69075 : skb1 = rb_to_skb(parent); - 263 [ + + ]: 69075 : if (before64(seq, MPTCP_SKB_CB(skb1)->map_seq)) { - 264 : 16593 : p = &parent->rb_left; - 265 : 16593 : continue; + 260 [ + + ]: 90932 : while (*p) { + 261 : 84543 : parent = *p; + 262 : 84543 : skb1 = rb_to_skb(parent); + 263 [ + + ]: 84543 : if (before64(seq, MPTCP_SKB_CB(skb1)->map_seq)) { + 264 : 21968 : p = &parent->rb_left; + 265 : 21968 : continue; 266 : : } - 267 [ + + ]: 52482 : if (before64(seq, MPTCP_SKB_CB(skb1)->end_seq)) { - 268 [ + + ]: 503 : if (!after64(end_seq, MPTCP_SKB_CB(skb1)->end_seq)) { + 267 [ + + ]: 62575 : if (before64(seq, MPTCP_SKB_CB(skb1)->end_seq)) { + 268 [ + + ]: 726 : if (!after64(end_seq, MPTCP_SKB_CB(skb1)->end_seq)) { 269 : : /* All the bits are present. Drop. */ - 270 : 244 : mptcp_drop(sk, skb); - 271 [ + - ]: 244 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_DUPDATA); - 272 : 244 : return; + 270 : 452 : mptcp_drop(sk, skb); + 271 [ + - ]: 452 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_DUPDATA); + 272 : 452 : return; 273 : : } - 274 [ + + ]: 259 : if (after64(seq, MPTCP_SKB_CB(skb1)->map_seq)) { + 274 [ + + ]: 274 : if (after64(seq, MPTCP_SKB_CB(skb1)->map_seq)) { 275 : : /* partial overlap: 276 : : * | skb | 277 : : * | skb1 | @@ -362,299 +362,299 @@ 284 : 14 : rb_replace_node(&skb1->rbnode, &skb->rbnode, 285 : : &msk->out_of_order_queue); 286 : 14 : mptcp_drop(sk, skb1); - 287 [ + - ]: 14 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_DUPDATA); + 287 [ + - ]: 14 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_DUPDATA); 288 : 14 : goto merge_right; 289 : : } - 290 [ + + + + ]: 60618 : } else if (mptcp_ooo_try_coalesce(msk, skb1, skb)) { - 291 [ + - ]: 5258 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_OFOMERGE); - 292 : 5258 : return; + 290 [ + + + + ]: 74125 : } else if (mptcp_ooo_try_coalesce(msk, skb1, skb)) { + 291 [ + - ]: 8244 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_OFOMERGE); + 292 : 8244 : return; 293 : : } - 294 : 46966 : p = &parent->rb_right; + 294 : 53865 : p = &parent->rb_right; 295 : : } 296 : : - 297 : 4891 : insert: + 297 : 6389 : insert: 298 : : /* Insert segment into RB tree. */ - 299 : 31212 : rb_link_node(&skb->rbnode, parent, p); - 300 : 31212 : rb_insert_color(&skb->rbnode, &msk->out_of_order_queue); + 299 : 39257 : rb_link_node(&skb->rbnode, parent, p); + 300 : 39257 : rb_insert_color(&skb->rbnode, &msk->out_of_order_queue); 301 : : 302 : : merge_right: 303 : : /* Remove other segments covered by skb. */ - 304 [ + + ]: 31338 : while ((skb1 = skb_rb_next(skb)) != NULL) { - 305 [ + + ]: 5017 : if (before64(end_seq, MPTCP_SKB_CB(skb1)->end_seq)) + 304 [ + + ]: 39347 : while ((skb1 = skb_rb_next(skb)) != NULL) { + 305 [ + + ]: 6478 : if (before64(end_seq, MPTCP_SKB_CB(skb1)->end_seq)) 306 : : break; - 307 : 112 : rb_erase(&skb1->rbnode, &msk->out_of_order_queue); - 308 : 112 : mptcp_drop(sk, skb1); - 309 [ + - ]: 4817 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_DUPDATA); + 307 : 76 : rb_erase(&skb1->rbnode, &msk->out_of_order_queue); + 308 : 76 : mptcp_drop(sk, skb1); + 309 [ + - ]: 5205 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_DUPDATA); 310 : : } 311 : : /* If there is no skb after us, we are the last_skb ! */ - 312 [ + + ]: 31226 : if (!skb1) - 313 : 26321 : msk->ooo_last_skb = skb; + 312 [ + + ]: 39271 : if (!skb1) + 313 : 32869 : msk->ooo_last_skb = skb; 314 : : - 315 : 4905 : end: - 316 : 41242 : skb_condense(skb); - 317 : 41242 : mptcp_set_owner_r(skb, sk); + 315 : 6402 : end: + 316 : 50414 : skb_condense(skb); + 317 : 50414 : mptcp_set_owner_r(skb, sk); 318 : : } 319 : : - 320 : 483949 : static bool mptcp_rmem_schedule(struct sock *sk, struct sock *ssk, int size) + 320 : 698446 : static bool mptcp_rmem_schedule(struct sock *sk, struct sock *ssk, int size) 321 : : { - 322 [ - + ]: 483949 : struct mptcp_sock *msk = mptcp_sk(sk); - 323 : 483949 : int amt, amount; + 322 [ - + ]: 698446 : struct mptcp_sock *msk = mptcp_sk(sk); + 323 : 698446 : int amt, amount; 324 : : - 325 [ + + ]: 483949 : if (size <= msk->rmem_fwd_alloc) + 325 [ + + ]: 698446 : if (size <= msk->rmem_fwd_alloc) 326 : : return true; 327 : : - 328 : 340744 : size -= msk->rmem_fwd_alloc; - 329 : 340744 : amt = sk_mem_pages(size); - 330 : 340744 : amount = amt << PAGE_SHIFT; - 331 [ + - ]: 340744 : if (!__sk_mem_raise_allocated(sk, size, amt, SK_MEM_RECV)) + 328 : 488760 : size -= msk->rmem_fwd_alloc; + 329 : 488760 : amt = sk_mem_pages(size); + 330 : 488760 : amount = amt << PAGE_SHIFT; + 331 [ + - ]: 488760 : if (!__sk_mem_raise_allocated(sk, size, amt, SK_MEM_RECV)) 332 : : return false; 333 : : - 334 : 340744 : mptcp_rmem_fwd_alloc_add(sk, amount); - 335 : 340744 : return true; + 334 : 488760 : mptcp_rmem_fwd_alloc_add(sk, amount); + 335 : 488760 : return true; 336 : : } 337 : : - 338 : 483949 : static bool __mptcp_move_skb(struct mptcp_sock *msk, struct sock *ssk, + 338 : 698446 : static bool __mptcp_move_skb(struct mptcp_sock *msk, struct sock *ssk, 339 : : struct sk_buff *skb, unsigned int offset, 340 : : size_t copy_len) 341 : : { - 342 : 483949 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); - 343 : 483949 : struct sock *sk = (struct sock *)msk; - 344 : 483949 : struct sk_buff *tail; - 345 : 483949 : bool has_rxtstamp; + 342 : 698446 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); + 343 : 698446 : struct sock *sk = (struct sock *)msk; + 344 : 698446 : struct sk_buff *tail; + 345 : 698446 : bool has_rxtstamp; 346 : : - 347 : 483949 : __skb_unlink(skb, &ssk->sk_receive_queue); + 347 : 698446 : __skb_unlink(skb, &ssk->sk_receive_queue); 348 : : - 349 : 483949 : skb_ext_reset(skb); - 350 : 483949 : skb_orphan(skb); + 349 : 698446 : skb_ext_reset(skb); + 350 : 698446 : skb_orphan(skb); 351 : : 352 : : /* try to fetch required memory from subflow */ - 353 [ - + ]: 483949 : if (!mptcp_rmem_schedule(sk, ssk, skb->truesize)) { + 353 [ - + ]: 698446 : if (!mptcp_rmem_schedule(sk, ssk, skb->truesize)) { 354 [ # # ]: 0 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_RCVPRUNED); 355 : 0 : goto drop; 356 : : } 357 : : - 358 : 483949 : has_rxtstamp = TCP_SKB_CB(skb)->has_rxtstamp; + 358 : 698446 : has_rxtstamp = TCP_SKB_CB(skb)->has_rxtstamp; 359 : : 360 : : /* the skb map_seq accounts for the skb offset: 361 : : * mptcp_subflow_get_mapped_dsn() is based on the current tp->copied_seq 362 : : * value 363 : : */ - 364 : 483949 : MPTCP_SKB_CB(skb)->map_seq = mptcp_subflow_get_mapped_dsn(subflow); - 365 : 483949 : MPTCP_SKB_CB(skb)->end_seq = MPTCP_SKB_CB(skb)->map_seq + copy_len; - 366 : 483949 : MPTCP_SKB_CB(skb)->offset = offset; - 367 : 483949 : MPTCP_SKB_CB(skb)->has_rxtstamp = has_rxtstamp; + 364 : 698446 : MPTCP_SKB_CB(skb)->map_seq = mptcp_subflow_get_mapped_dsn(subflow); + 365 : 698446 : MPTCP_SKB_CB(skb)->end_seq = MPTCP_SKB_CB(skb)->map_seq + copy_len; + 366 : 698446 : MPTCP_SKB_CB(skb)->offset = offset; + 367 : 698446 : MPTCP_SKB_CB(skb)->has_rxtstamp = has_rxtstamp; 368 : : - 369 [ + + ]: 483949 : if (MPTCP_SKB_CB(skb)->map_seq == msk->ack_seq) { + 369 [ + + ]: 698446 : if (MPTCP_SKB_CB(skb)->map_seq == msk->ack_seq) { 370 : : /* in sequence */ - 371 : 396841 : msk->bytes_received += copy_len; - 372 : 396841 : WRITE_ONCE(msk->ack_seq, msk->ack_seq + copy_len); - 373 [ + + ]: 396841 : tail = skb_peek_tail(&sk->sk_receive_queue); - 374 [ + - + + ]: 242889 : if (tail && mptcp_try_coalesce(sk, tail, skb)) + 371 : 595582 : msk->bytes_received += copy_len; + 372 : 595582 : WRITE_ONCE(msk->ack_seq, msk->ack_seq + copy_len); + 373 [ + + ]: 595582 : tail = skb_peek_tail(&sk->sk_receive_queue); + 374 [ + - + + ]: 367541 : if (tail && mptcp_try_coalesce(sk, tail, skb)) 375 : : return true; 376 : : - 377 : 196176 : mptcp_set_owner_r(skb, sk); - 378 : 196176 : __skb_queue_tail(&sk->sk_receive_queue, skb); - 379 : 196176 : return true; - 380 [ + + ]: 87108 : } else if (after64(MPTCP_SKB_CB(skb)->map_seq, msk->ack_seq)) { - 381 : 87099 : mptcp_data_queue_ofo(msk, skb); - 382 : 87099 : return false; + 377 : 284816 : mptcp_set_owner_r(skb, sk); + 378 : 284816 : __skb_queue_tail(&sk->sk_receive_queue, skb); + 379 : 284816 : return true; + 380 [ + + ]: 102864 : } else if (after64(MPTCP_SKB_CB(skb)->map_seq, msk->ack_seq)) { + 381 : 102858 : mptcp_data_queue_ofo(msk, skb); + 382 : 102858 : return false; 383 : : } 384 : : 385 : : /* old data, keep it simple and drop the whole pkt, sender 386 : : * will retransmit as needed, if needed. 387 : : */ - 388 [ + - ]: 9 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_DUPDATA); - 389 : 9 : drop: - 390 : 9 : mptcp_drop(sk, skb); - 391 : 9 : return false; + 388 [ + - ]: 6 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_DUPDATA); + 389 : 6 : drop: + 390 : 6 : mptcp_drop(sk, skb); + 391 : 6 : return false; 392 : : } 393 : : - 394 : 23390 : static void mptcp_stop_rtx_timer(struct sock *sk) + 394 : 41084 : static void mptcp_stop_rtx_timer(struct sock *sk) 395 : : { - 396 : 23390 : struct inet_connection_sock *icsk = inet_csk(sk); + 396 : 41084 : struct inet_connection_sock *icsk = inet_csk(sk); 397 : : - 398 : 23390 : sk_stop_timer(sk, &icsk->icsk_retransmit_timer); - 399 [ - + ]: 23390 : mptcp_sk(sk)->timer_ival = 0; - 400 : 23390 : } + 398 : 41084 : sk_stop_timer(sk, &icsk->icsk_retransmit_timer); + 399 [ - + ]: 41084 : mptcp_sk(sk)->timer_ival = 0; + 400 : 41084 : } 401 : : - 402 : 4375 : static void mptcp_close_wake_up(struct sock *sk) + 402 : 4358 : static void mptcp_close_wake_up(struct sock *sk) 403 : : { - 404 [ + + ]: 4375 : if (sock_flag(sk, SOCK_DEAD)) + 404 [ + + ]: 4358 : if (sock_flag(sk, SOCK_DEAD)) 405 : : return; 406 : : - 407 : 3054 : sk->sk_state_change(sk); - 408 [ + + ]: 3054 : if (sk->sk_shutdown == SHUTDOWN_MASK || - 409 [ + + ]: 1488 : sk->sk_state == TCP_CLOSE) - 410 : 1621 : sk_wake_async(sk, SOCK_WAKE_WAITD, POLL_HUP); + 407 : 3048 : sk->sk_state_change(sk); + 408 [ + + ]: 3048 : if (sk->sk_shutdown == SHUTDOWN_MASK || + 409 [ + + ]: 1492 : sk->sk_state == TCP_CLOSE) + 410 : 1608 : sk_wake_async(sk, SOCK_WAKE_WAITD, POLL_HUP); 411 : : else - 412 : 1433 : sk_wake_async(sk, SOCK_WAKE_WAITD, POLL_IN); + 412 : 1440 : sk_wake_async(sk, SOCK_WAKE_WAITD, POLL_IN); 413 : : } 414 : : 415 : : /* called under the msk socket lock */ - 416 : 216832 : static bool mptcp_pending_data_fin_ack(struct sock *sk) + 416 : 321425 : static bool mptcp_pending_data_fin_ack(struct sock *sk) 417 : : { - 418 [ - + ]: 216832 : struct mptcp_sock *msk = mptcp_sk(sk); + 418 [ - + ]: 321425 : struct mptcp_sock *msk = mptcp_sk(sk); 419 : : - 420 : 106250 : return ((1 << sk->sk_state) & - 421 [ + + + + ]: 216832 : (TCPF_FIN_WAIT1 | TCPF_CLOSING | TCPF_LAST_ACK)) && - 422 [ + + ]: 31809 : msk->write_seq == READ_ONCE(msk->snd_una); + 420 : 162566 : return ((1 << sk->sk_state) & + 421 [ + + + + ]: 321425 : (TCPF_FIN_WAIT1 | TCPF_CLOSING | TCPF_LAST_ACK)) && + 422 [ + + ]: 34464 : msk->write_seq == READ_ONCE(msk->snd_una); 423 : : } 424 : : - 425 : 9066 : static void mptcp_check_data_fin_ack(struct sock *sk) + 425 : 13800 : static void mptcp_check_data_fin_ack(struct sock *sk) 426 : : { - 427 [ - + ]: 9066 : struct mptcp_sock *msk = mptcp_sk(sk); + 427 [ - + ]: 13800 : struct mptcp_sock *msk = mptcp_sk(sk); 428 : : 429 : : /* Look for an acknowledged DATA_FIN */ - 430 [ + + ]: 9066 : if (mptcp_pending_data_fin_ack(sk)) { - 431 : 1780 : WRITE_ONCE(msk->snd_data_fin_enable, 0); + 430 [ + + ]: 13800 : if (mptcp_pending_data_fin_ack(sk)) { + 431 : 1779 : WRITE_ONCE(msk->snd_data_fin_enable, 0); 432 : : - 433 [ + + - ]: 1780 : switch (sk->sk_state) { - 434 : 982 : case TCP_FIN_WAIT1: - 435 : 982 : mptcp_set_state(sk, TCP_FIN_WAIT2); - 436 : 982 : break; - 437 : 798 : case TCP_CLOSING: + 433 [ + + - ]: 1779 : switch (sk->sk_state) { + 434 : 967 : case TCP_FIN_WAIT1: + 435 : 967 : mptcp_set_state(sk, TCP_FIN_WAIT2); + 436 : 967 : break; + 437 : 812 : case TCP_CLOSING: 438 : : case TCP_LAST_ACK: - 439 : 798 : mptcp_set_state(sk, TCP_CLOSE); - 440 : 798 : break; + 439 : 812 : mptcp_set_state(sk, TCP_CLOSE); + 440 : 812 : break; 441 : : } 442 : : - 443 : 1780 : mptcp_close_wake_up(sk); + 443 : 1779 : mptcp_close_wake_up(sk); 444 : : } - 445 : 9066 : } + 445 : 13800 : } 446 : : 447 : : /* can be called with no lock acquired */ - 448 : 489577 : static bool mptcp_pending_data_fin(struct sock *sk, u64 *seq) + 448 : 707599 : static bool mptcp_pending_data_fin(struct sock *sk, u64 *seq) 449 : : { - 450 [ - + ]: 489577 : struct mptcp_sock *msk = mptcp_sk(sk); + 450 [ - + ]: 707599 : struct mptcp_sock *msk = mptcp_sk(sk); 451 : : - 452 [ + + + + : 514405 : if (READ_ONCE(msk->rcv_data_fin) && - + + + + ] - 453 [ + + ]: 188 : ((1 << inet_sk_state_load(sk)) & + 452 [ + + + + : 730173 : if (READ_ONCE(msk->rcv_data_fin) && + + + + + ] + 453 [ + + ]: 183 : ((1 << inet_sk_state_load(sk)) & 454 : : (TCPF_ESTABLISHED | TCPF_FIN_WAIT1 | TCPF_FIN_WAIT2))) { - 455 : 24309 : u64 rcv_data_fin_seq = READ_ONCE(msk->rcv_data_fin_seq); + 455 : 22079 : u64 rcv_data_fin_seq = READ_ONCE(msk->rcv_data_fin_seq); 456 : : - 457 [ + + ]: 24309 : if (READ_ONCE(msk->ack_seq) == rcv_data_fin_seq) { - 458 [ + + ]: 2043 : if (seq) - 459 : 1742 : *seq = rcv_data_fin_seq; + 457 [ + + ]: 22079 : if (READ_ONCE(msk->ack_seq) == rcv_data_fin_seq) { + 458 [ + + ]: 2058 : if (seq) + 459 : 1746 : *seq = rcv_data_fin_seq; 460 : : - 461 : 2043 : return true; + 461 : 2058 : return true; 462 : : } 463 : : } 464 : : 465 : : return false; 466 : : } 467 : : - 468 : 1057 : static void mptcp_set_datafin_timeout(struct sock *sk) + 468 : 1077 : static void mptcp_set_datafin_timeout(struct sock *sk) 469 : : { - 470 : 1057 : struct inet_connection_sock *icsk = inet_csk(sk); - 471 : 1057 : u32 retransmits; + 470 : 1077 : struct inet_connection_sock *icsk = inet_csk(sk); + 471 : 1077 : u32 retransmits; 472 : : - 473 : 1057 : retransmits = min_t(u32, icsk->icsk_retransmits, + 473 : 1077 : retransmits = min_t(u32, icsk->icsk_retransmits, 474 : : ilog2(TCP_RTO_MAX / TCP_RTO_MIN)); 475 : : - 476 [ - + ]: 1057 : mptcp_sk(sk)->timer_ival = TCP_RTO_MIN << retransmits; - 477 : 1057 : } + 476 [ - + ]: 1077 : mptcp_sk(sk)->timer_ival = TCP_RTO_MIN << retransmits; + 477 : 1077 : } 478 : : - 479 : 605792 : static void __mptcp_set_timeout(struct sock *sk, long tout) + 479 : 870795 : static void __mptcp_set_timeout(struct sock *sk, long tout) 480 : : { - 481 [ + + - + ]: 1054878 : mptcp_sk(sk)->timer_ival = tout > 0 ? tout : TCP_RTO_MIN; - 482 : 605792 : } + 481 [ + + - + ]: 1522314 : mptcp_sk(sk)->timer_ival = tout > 0 ? tout : TCP_RTO_MIN; + 482 : 870795 : } 483 : : - 484 : 291978 : static long mptcp_timeout_from_subflow(const struct mptcp_subflow_context *subflow) + 484 : 304525 : static long mptcp_timeout_from_subflow(const struct mptcp_subflow_context *subflow) 485 : : { - 486 : 1043719 : const struct sock *ssk = mptcp_subflow_tcp_sock(subflow); + 486 : 1393824 : const struct sock *ssk = mptcp_subflow_tcp_sock(subflow); 487 : : - 488 [ + + + + ]: 898419 : return inet_csk(ssk)->icsk_pending && !subflow->stale_count ? - 489 [ + + + + ]: 1779805 : inet_csk(ssk)->icsk_timeout - jiffies : 0; + 488 [ + + + + ]: 1159452 : return inet_csk(ssk)->icsk_pending && !subflow->stale_count ? + 489 [ + + + + ]: 2405735 : inet_csk(ssk)->icsk_timeout - jiffies : 0; 490 : : } 491 : : - 492 : 265373 : void mptcp_set_timeout(struct sock *sk) + 492 : 386435 : void mptcp_set_timeout(struct sock *sk) 493 : : { - 494 : 265373 : struct mptcp_subflow_context *subflow; - 495 : 265373 : long tout = 0; + 494 : 386435 : struct mptcp_subflow_context *subflow; + 495 : 386435 : long tout = 0; 496 : : - 497 [ - + - + : 752759 : mptcp_for_each_subflow(mptcp_sk(sk), subflow) - + + ] - 498 [ + + ]: 917171 : tout = max(tout, mptcp_timeout_from_subflow(subflow)); - 499 : 265373 : __mptcp_set_timeout(sk, tout); - 500 : 265373 : } + 497 [ - + - + : 1040916 : mptcp_for_each_subflow(mptcp_sk(sk), subflow) + + + ] + 498 [ + + ]: 1213195 : tout = max(tout, mptcp_timeout_from_subflow(subflow)); + 499 : 386435 : __mptcp_set_timeout(sk, tout); + 500 : 386435 : } 501 : : - 502 : 111181 : static inline bool tcp_can_send_ack(const struct sock *ssk) + 502 : 144049 : static inline bool tcp_can_send_ack(const struct sock *ssk) 503 : : { - 504 [ - + ]: 236409 : return !((1 << inet_sk_state_load(ssk)) & + 504 [ - + ]: 332762 : return !((1 << inet_sk_state_load(ssk)) & 505 : : (TCPF_SYN_SENT | TCPF_SYN_RECV | TCPF_TIME_WAIT | TCPF_CLOSE | TCPF_LISTEN)); 506 : : } 507 : : - 508 : 4569 : void __mptcp_subflow_send_ack(struct sock *ssk) + 508 : 4607 : void __mptcp_subflow_send_ack(struct sock *ssk) 509 : : { - 510 [ + + ]: 4569 : if (tcp_can_send_ack(ssk)) - 511 : 4493 : tcp_send_ack(ssk); - 512 : 4569 : } + 510 [ + + ]: 4607 : if (tcp_can_send_ack(ssk)) + 511 : 4531 : tcp_send_ack(ssk); + 512 : 4607 : } 513 : : - 514 : 3681 : static void mptcp_subflow_send_ack(struct sock *ssk) + 514 : 3722 : static void mptcp_subflow_send_ack(struct sock *ssk) 515 : : { - 516 : 3681 : bool slow; + 516 : 3722 : bool slow; 517 : : - 518 : 3681 : slow = lock_sock_fast(ssk); - 519 : 3681 : __mptcp_subflow_send_ack(ssk); - 520 : 3681 : unlock_sock_fast(ssk, slow); - 521 : 3681 : } + 518 : 3722 : slow = lock_sock_fast(ssk); + 519 : 3722 : __mptcp_subflow_send_ack(ssk); + 520 : 3722 : unlock_sock_fast(ssk, slow); + 521 : 3722 : } 522 : : - 523 : 2736 : static void mptcp_send_ack(struct mptcp_sock *msk) + 523 : 2760 : static void mptcp_send_ack(struct mptcp_sock *msk) 524 : : { - 525 : 2736 : struct mptcp_subflow_context *subflow; + 525 : 2760 : struct mptcp_subflow_context *subflow; 526 : : - 527 [ + + ]: 6417 : mptcp_for_each_subflow(msk, subflow) - 528 : 3681 : mptcp_subflow_send_ack(mptcp_subflow_tcp_sock(subflow)); - 529 : 2736 : } + 527 [ + + ]: 6482 : mptcp_for_each_subflow(msk, subflow) + 528 : 3722 : mptcp_subflow_send_ack(mptcp_subflow_tcp_sock(subflow)); + 529 : 2760 : } 530 : : - 531 : 158562 : static void mptcp_subflow_cleanup_rbuf(struct sock *ssk) + 531 : 223065 : static void mptcp_subflow_cleanup_rbuf(struct sock *ssk) 532 : : { - 533 : 158562 : bool slow; + 533 : 223065 : bool slow; 534 : : - 535 : 158562 : slow = lock_sock_fast(ssk); - 536 [ + + ]: 158562 : if (tcp_can_send_ack(ssk)) - 537 : 152857 : tcp_cleanup_rbuf(ssk, 1); - 538 : 158562 : unlock_sock_fast(ssk, slow); - 539 : 158562 : } + 535 : 223065 : slow = lock_sock_fast(ssk); + 536 [ + + ]: 223065 : if (tcp_can_send_ack(ssk)) + 537 : 216738 : tcp_cleanup_rbuf(ssk, 1); + 538 : 223065 : unlock_sock_fast(ssk, slow); + 539 : 223065 : } 540 : : - 541 : 1290743 : static bool mptcp_subflow_could_cleanup(const struct sock *ssk, bool rx_empty) + 541 : 1617331 : static bool mptcp_subflow_could_cleanup(const struct sock *ssk, bool rx_empty) 542 : : { - 543 : 1290743 : const struct inet_connection_sock *icsk = inet_csk(ssk); - 544 : 1290743 : u8 ack_pending = READ_ONCE(icsk->icsk_ack.pending); - 545 [ - + ]: 1290743 : const struct tcp_sock *tp = tcp_sk(ssk); + 543 : 1617331 : const struct inet_connection_sock *icsk = inet_csk(ssk); + 544 : 1617331 : u8 ack_pending = READ_ONCE(icsk->icsk_ack.pending); + 545 [ - + ]: 1617331 : const struct tcp_sock *tp = tcp_sk(ssk); 546 : : - 547 [ + + ]: 1290743 : return (ack_pending & ICSK_ACK_SCHED) && - 548 : 498001 : ((READ_ONCE(tp->rcv_nxt) - READ_ONCE(tp->rcv_wup) > - 549 [ + + + + ]: 498001 : READ_ONCE(icsk->icsk_ack.rcv_mss)) || - 550 [ + + ]: 65890 : (rx_empty && ack_pending & + 547 [ + + ]: 1617331 : return (ack_pending & ICSK_ACK_SCHED) && + 548 : 593565 : ((READ_ONCE(tp->rcv_nxt) - READ_ONCE(tp->rcv_wup) > + 549 [ + + + + ]: 593565 : READ_ONCE(icsk->icsk_ack.rcv_mss)) || + 550 [ + + ]: 82763 : (rx_empty && ack_pending & 551 : : (ICSK_ACK_PUSHED2 | ICSK_ACK_PUSHED))); 552 : : } 553 : : - 554 : 737581 : static void mptcp_cleanup_rbuf(struct mptcp_sock *msk) + 554 : 1001533 : static void mptcp_cleanup_rbuf(struct mptcp_sock *msk) 555 : : { - 556 : 737581 : int old_space = READ_ONCE(msk->old_wspace); - 557 : 737581 : struct mptcp_subflow_context *subflow; - 558 : 737581 : struct sock *sk = (struct sock *)msk; - 559 : 737581 : int space = __mptcp_space(sk); - 560 : 737581 : bool cleanup, rx_empty; + 556 : 1001533 : int old_space = READ_ONCE(msk->old_wspace); + 557 : 1001533 : struct mptcp_subflow_context *subflow; + 558 : 1001533 : struct sock *sk = (struct sock *)msk; + 559 : 1001533 : int space = __mptcp_space(sk); + 560 : 1001533 : bool cleanup, rx_empty; 561 : : - 562 [ + + + + ]: 737581 : cleanup = (space > 0) && (space >= (old_space << 1)); - 563 : 737581 : rx_empty = !__mptcp_rmem(sk); + 562 [ + + + + ]: 1001533 : cleanup = (space > 0) && (space >= (old_space << 1)); + 563 : 1001533 : rx_empty = !__mptcp_rmem(sk); 564 : : - 565 [ + + ]: 2080333 : mptcp_for_each_subflow(msk, subflow) { - 566 [ + + ]: 1342752 : struct sock *ssk = mptcp_subflow_tcp_sock(subflow); + 565 [ + + ]: 2684306 : mptcp_for_each_subflow(msk, subflow) { + 566 [ + + ]: 1682773 : struct sock *ssk = mptcp_subflow_tcp_sock(subflow); 567 : : - 568 [ + + + + ]: 1342752 : if (cleanup || mptcp_subflow_could_cleanup(ssk, rx_empty)) - 569 : 158562 : mptcp_subflow_cleanup_rbuf(ssk); + 568 [ + + + + ]: 1682773 : if (cleanup || mptcp_subflow_could_cleanup(ssk, rx_empty)) + 569 : 223065 : mptcp_subflow_cleanup_rbuf(ssk); 570 : : } - 571 : 737581 : } + 571 : 1001533 : } 572 : : - 573 : 9106 : static bool mptcp_check_data_fin(struct sock *sk) + 573 : 13845 : static bool mptcp_check_data_fin(struct sock *sk) 574 : : { - 575 [ - + ]: 9106 : struct mptcp_sock *msk = mptcp_sk(sk); - 576 : 9106 : u64 rcv_data_fin_seq; - 577 : 9106 : bool ret = false; + 575 [ - + ]: 13845 : struct mptcp_sock *msk = mptcp_sk(sk); + 576 : 13845 : u64 rcv_data_fin_seq; + 577 : 13845 : bool ret = false; 578 : : 579 : : /* Need to ack a DATA_FIN received from a peer while this side 580 : : * of the connection is in ESTABLISHED, FIN_WAIT1, or FIN_WAIT2. @@ -669,35 +669,35 @@ 589 : : * when catching up. 590 : : */ 591 : : - 592 [ + + ]: 9106 : if (mptcp_pending_data_fin(sk, &rcv_data_fin_seq)) { - 593 : 1742 : WRITE_ONCE(msk->ack_seq, msk->ack_seq + 1); - 594 : 1742 : WRITE_ONCE(msk->rcv_data_fin, 0); + 592 [ + + ]: 13845 : if (mptcp_pending_data_fin(sk, &rcv_data_fin_seq)) { + 593 : 1746 : WRITE_ONCE(msk->ack_seq, msk->ack_seq + 1); + 594 : 1746 : WRITE_ONCE(msk->rcv_data_fin, 0); 595 : : - 596 : 1742 : WRITE_ONCE(sk->sk_shutdown, sk->sk_shutdown | RCV_SHUTDOWN); - 597 : 1742 : smp_mb__before_atomic(); /* SHUTDOWN must be visible first */ + 596 : 1746 : WRITE_ONCE(sk->sk_shutdown, sk->sk_shutdown | RCV_SHUTDOWN); + 597 : 1746 : smp_mb__before_atomic(); /* SHUTDOWN must be visible first */ 598 : : - 599 [ + + + - ]: 1742 : switch (sk->sk_state) { + 599 [ + + + - ]: 1746 : switch (sk->sk_state) { 600 : : case TCP_ESTABLISHED: - 601 : 747 : mptcp_set_state(sk, TCP_CLOSE_WAIT); - 602 : 747 : break; - 603 : 216 : case TCP_FIN_WAIT1: - 604 : 216 : mptcp_set_state(sk, TCP_CLOSING); - 605 : 216 : break; - 606 : 779 : case TCP_FIN_WAIT2: - 607 : 779 : mptcp_set_state(sk, TCP_CLOSE); - 608 : 779 : break; + 601 : 753 : mptcp_set_state(sk, TCP_CLOSE_WAIT); + 602 : 753 : break; + 603 : 225 : case TCP_FIN_WAIT1: + 604 : 225 : mptcp_set_state(sk, TCP_CLOSING); + 605 : 225 : break; + 606 : 768 : case TCP_FIN_WAIT2: + 607 : 768 : mptcp_set_state(sk, TCP_CLOSE); + 608 : 768 : break; 609 : : default: 610 : : /* Other states not expected */ 611 : 0 : WARN_ON_ONCE(1); 612 : 0 : break; 613 : : } 614 : : - 615 : 1742 : ret = true; - 616 [ + + ]: 1742 : if (!__mptcp_check_fallback(msk)) - 617 : 1679 : mptcp_send_ack(msk); - 618 : 1742 : mptcp_close_wake_up(sk); + 615 : 1746 : ret = true; + 616 [ + + ]: 1746 : if (!__mptcp_check_fallback(msk)) + 617 : 1683 : mptcp_send_ack(msk); + 618 : 1746 : mptcp_close_wake_up(sk); 619 : : } - 620 : 9106 : return ret; + 620 : 13845 : return ret; 621 : : } 622 : : 623 : 0 : static void mptcp_dss_corruption(struct mptcp_sock *msk, struct sock *ssk) @@ -712,165 +712,165 @@ 632 : : } 633 : 0 : } 634 : : - 635 : 480940 : static bool __mptcp_move_skbs_from_subflow(struct mptcp_sock *msk, + 635 : 694457 : static bool __mptcp_move_skbs_from_subflow(struct mptcp_sock *msk, 636 : : struct sock *ssk, 637 : : unsigned int *bytes) 638 : : { - 639 [ + - ]: 480940 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); - 640 : 480940 : struct sock *sk = (struct sock *)msk; - 641 : 480940 : unsigned int moved = 0; - 642 : 480940 : bool more_data_avail; - 643 : 480940 : struct tcp_sock *tp; - 644 : 480940 : bool done = false; - 645 : 480940 : int sk_rbuf; + 639 [ + - ]: 694457 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); + 640 : 694457 : struct sock *sk = (struct sock *)msk; + 641 : 694457 : unsigned int moved = 0; + 642 : 694457 : bool more_data_avail; + 643 : 694457 : struct tcp_sock *tp; + 644 : 694457 : bool done = false; + 645 : 694457 : int sk_rbuf; 646 : : - 647 : 480940 : sk_rbuf = READ_ONCE(sk->sk_rcvbuf); + 647 : 694457 : sk_rbuf = READ_ONCE(sk->sk_rcvbuf); 648 : : - 649 [ + - ]: 480940 : if (!(sk->sk_userlocks & SOCK_RCVBUF_LOCK)) { - 650 : 480940 : int ssk_rbuf = READ_ONCE(ssk->sk_rcvbuf); + 649 [ + - ]: 694457 : if (!(sk->sk_userlocks & SOCK_RCVBUF_LOCK)) { + 650 : 694457 : int ssk_rbuf = READ_ONCE(ssk->sk_rcvbuf); 651 : : - 652 [ - + ]: 480940 : if (unlikely(ssk_rbuf > sk_rbuf)) { - 653 : 0 : WRITE_ONCE(sk->sk_rcvbuf, ssk_rbuf); - 654 : 0 : sk_rbuf = ssk_rbuf; + 652 [ + + ]: 694457 : if (unlikely(ssk_rbuf > sk_rbuf)) { + 653 : 5 : WRITE_ONCE(sk->sk_rcvbuf, ssk_rbuf); + 654 : 5 : sk_rbuf = ssk_rbuf; 655 : : } 656 : : } 657 : : - 658 [ - + ]: 480940 : pr_debug("msk=%p ssk=%p\n", msk, ssk); - 659 [ - + ]: 480940 : tp = tcp_sk(ssk); - 660 : 484383 : do { - 661 : 484383 : u32 map_remaining, offset; - 662 : 484383 : u32 seq = tp->copied_seq; - 663 : 484383 : struct sk_buff *skb; - 664 : 484383 : bool fin; + 658 [ - + ]: 694457 : pr_debug("msk=%p ssk=%p\n", msk, ssk); + 659 [ - + ]: 694457 : tp = tcp_sk(ssk); + 660 : 699111 : do { + 661 : 699111 : u32 map_remaining, offset; + 662 : 699111 : u32 seq = tp->copied_seq; + 663 : 699111 : struct sk_buff *skb; + 664 : 699111 : bool fin; 665 : : 666 : : /* try to move as much data as available */ - 667 : 968766 : map_remaining = subflow->map_data_len - - 668 : 484383 : mptcp_subflow_get_map_offset(subflow); + 667 : 1398222 : map_remaining = subflow->map_data_len - + 668 : 699111 : mptcp_subflow_get_map_offset(subflow); 669 : : - 670 [ + + ]: 484383 : skb = skb_peek(&ssk->sk_receive_queue); - 671 [ - + ]: 483965 : if (!skb) { + 670 [ + + ]: 699111 : skb = skb_peek(&ssk->sk_receive_queue); + 671 [ - + ]: 698465 : if (!skb) { 672 : : /* With racing move_skbs_to_msk() and __mptcp_move_skbs(), 673 : : * a different CPU can have already processed the pending 674 : : * data, stop here or we can enter an infinite loop 675 : : */ - 676 [ - + ]: 418 : if (!moved) + 676 [ - + ]: 646 : if (!moved) 677 : : done = true; 678 : : break; 679 : : } 680 : : - 681 [ + + ]: 483965 : if (__mptcp_check_fallback(msk)) { + 681 [ + + ]: 698465 : if (__mptcp_check_fallback(msk)) { 682 : : /* Under fallback skbs have no MPTCP extension and TCP could 683 : : * collapse them between the dummy map creation and the 684 : : * current dequeue. Be sure to adjust the map size. 685 : : */ - 686 : 3768 : map_remaining = skb->len; - 687 : 3768 : subflow->map_data_len = skb->len; + 686 : 6424 : map_remaining = skb->len; + 687 : 6424 : subflow->map_data_len = skb->len; 688 : : } 689 : : - 690 : 483965 : offset = seq - TCP_SKB_CB(skb)->seq; - 691 : 483965 : fin = TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN; - 692 [ + + ]: 483965 : if (fin) { + 690 : 698465 : offset = seq - TCP_SKB_CB(skb)->seq; + 691 : 698465 : fin = TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN; + 692 [ + + ]: 698465 : if (fin) { 693 : 64 : done = true; 694 : 64 : seq++; 695 : : } 696 : : - 697 [ + + ]: 483965 : if (offset < skb->len) { - 698 : 483949 : size_t len = skb->len - offset; + 697 [ + + ]: 698465 : if (offset < skb->len) { + 698 : 698446 : size_t len = skb->len - offset; 699 : : - 700 [ - + ]: 483949 : if (tp->urg_data) + 700 [ - + ]: 698446 : if (tp->urg_data) 701 : 0 : done = true; 702 : : - 703 [ + + ]: 483949 : if (__mptcp_move_skb(msk, ssk, skb, offset, len)) - 704 : 396841 : moved += len; - 705 : 483949 : seq += len; + 703 [ + + ]: 698446 : if (__mptcp_move_skb(msk, ssk, skb, offset, len)) + 704 : 595582 : moved += len; + 705 : 698446 : seq += len; 706 : : - 707 [ - + ]: 483949 : if (unlikely(map_remaining < len)) { + 707 [ - + ]: 698446 : if (unlikely(map_remaining < len)) { 708 : 0 : DEBUG_NET_WARN_ON_ONCE(1); 709 : 0 : mptcp_dss_corruption(msk, ssk); 710 : : } 711 : : } else { - 712 [ - + ]: 16 : if (unlikely(!fin)) { + 712 [ - + ]: 19 : if (unlikely(!fin)) { 713 : 0 : DEBUG_NET_WARN_ON_ONCE(1); 714 : 0 : mptcp_dss_corruption(msk, ssk); 715 : : } 716 : : - 717 : 16 : sk_eat_skb(ssk, skb); - 718 : 16 : done = true; + 717 : 19 : sk_eat_skb(ssk, skb); + 718 : 19 : done = true; 719 : : } 720 : : - 721 : 483965 : WRITE_ONCE(tp->copied_seq, seq); - 722 : 483965 : more_data_avail = mptcp_subflow_data_available(ssk); + 721 : 698465 : WRITE_ONCE(tp->copied_seq, seq); + 722 : 698465 : more_data_avail = mptcp_subflow_data_available(ssk); 723 : : - 724 [ + + ]: 483965 : if (atomic_read(&sk->sk_rmem_alloc) > sk_rbuf) { + 724 [ + + ]: 698465 : if (atomic_read(&sk->sk_rmem_alloc) > sk_rbuf) { 725 : : done = true; 726 : : break; 727 : : } - 728 [ + + ]: 468664 : } while (more_data_avail); + 728 [ + + ]: 679607 : } while (more_data_avail); 729 : : - 730 [ + + ]: 480522 : if (moved > 0) - 731 : 393920 : msk->last_data_recv = tcp_jiffies32; - 732 : 480940 : *bytes += moved; - 733 : 480940 : return done; + 730 [ + + ]: 693811 : if (moved > 0) + 731 : 592036 : msk->last_data_recv = tcp_jiffies32; + 732 : 694457 : *bytes += moved; + 733 : 694457 : return done; 734 : : } 735 : : - 736 : 674654 : static bool __mptcp_ofo_queue(struct mptcp_sock *msk) + 736 : 965092 : static bool __mptcp_ofo_queue(struct mptcp_sock *msk) 737 : : { - 738 : 674654 : struct sock *sk = (struct sock *)msk; - 739 : 674654 : struct sk_buff *skb, *tail; - 740 : 674654 : bool moved = false; - 741 : 674654 : struct rb_node *p; - 742 : 674654 : u64 end_seq; + 738 : 965092 : struct sock *sk = (struct sock *)msk; + 739 : 965092 : struct sk_buff *skb, *tail; + 740 : 965092 : bool moved = false; + 741 : 965092 : struct rb_node *p; + 742 : 965092 : u64 end_seq; 743 : : - 744 : 674654 : p = rb_first(&msk->out_of_order_queue); - 745 [ - + ]: 674654 : pr_debug("msk=%p empty=%d\n", msk, RB_EMPTY_ROOT(&msk->out_of_order_queue)); - 746 [ + + ]: 715770 : while (p) { - 747 : 253842 : skb = rb_to_skb(p); - 748 [ + + ]: 253842 : if (after64(MPTCP_SKB_CB(skb)->map_seq, msk->ack_seq)) + 744 : 965092 : p = rb_first(&msk->out_of_order_queue); + 745 [ - + ]: 965092 : pr_debug("msk=%p empty=%d\n", msk, RB_EMPTY_ROOT(&msk->out_of_order_queue)); + 746 [ + + ]: 1015416 : while (p) { + 747 : 289024 : skb = rb_to_skb(p); + 748 [ + + ]: 289024 : if (after64(MPTCP_SKB_CB(skb)->map_seq, msk->ack_seq)) 749 : : break; 750 : : - 751 : 41116 : p = rb_next(p); - 752 : 41116 : rb_erase(&skb->rbnode, &msk->out_of_order_queue); + 751 : 50324 : p = rb_next(p); + 752 : 50324 : rb_erase(&skb->rbnode, &msk->out_of_order_queue); 753 : : - 754 [ + + ]: 41116 : if (unlikely(!after64(MPTCP_SKB_CB(skb)->end_seq, + 754 [ + + ]: 50324 : if (unlikely(!after64(MPTCP_SKB_CB(skb)->end_seq, 755 : : msk->ack_seq))) { - 756 : 104 : mptcp_drop(sk, skb); - 757 [ + - ]: 104 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_DUPDATA); - 758 : 104 : continue; + 756 : 105 : mptcp_drop(sk, skb); + 757 [ + - ]: 105 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_DUPDATA); + 758 : 105 : continue; 759 : : } 760 : : - 761 : 41012 : end_seq = MPTCP_SKB_CB(skb)->end_seq; - 762 [ + - ]: 41012 : tail = skb_peek_tail(&sk->sk_receive_queue); - 763 [ + - + + ]: 81390 : if (!tail || !mptcp_ooo_try_coalesce(msk, tail, skb)) { - 764 : 19536 : int delta = msk->ack_seq - MPTCP_SKB_CB(skb)->map_seq; + 761 : 50219 : end_seq = MPTCP_SKB_CB(skb)->end_seq; + 762 [ + - ]: 50219 : tail = skb_peek_tail(&sk->sk_receive_queue); + 763 [ + - + + ]: 99695 : if (!tail || !mptcp_ooo_try_coalesce(msk, tail, skb)) { + 764 : 27200 : int delta = msk->ack_seq - MPTCP_SKB_CB(skb)->map_seq; 765 : : 766 : : /* skip overlapping data, if any */ - 767 [ - + ]: 19536 : pr_debug("uncoalesced seq=%llx ack seq=%llx delta=%d\n", + 767 [ - + ]: 27200 : pr_debug("uncoalesced seq=%llx ack seq=%llx delta=%d\n", 768 : : MPTCP_SKB_CB(skb)->map_seq, msk->ack_seq, 769 : : delta); - 770 : 19536 : MPTCP_SKB_CB(skb)->offset += delta; - 771 : 19536 : MPTCP_SKB_CB(skb)->map_seq += delta; - 772 : 19536 : __skb_queue_tail(&sk->sk_receive_queue, skb); + 770 : 27200 : MPTCP_SKB_CB(skb)->offset += delta; + 771 : 27200 : MPTCP_SKB_CB(skb)->map_seq += delta; + 772 : 27200 : __skb_queue_tail(&sk->sk_receive_queue, skb); 773 : : } - 774 : 41012 : msk->bytes_received += end_seq - msk->ack_seq; - 775 : 41012 : WRITE_ONCE(msk->ack_seq, end_seq); - 776 : 41012 : moved = true; + 774 : 50219 : msk->bytes_received += end_seq - msk->ack_seq; + 775 : 50219 : WRITE_ONCE(msk->ack_seq, end_seq); + 776 : 50219 : moved = true; 777 : : } - 778 : 674654 : return moved; + 778 : 965092 : return moved; 779 : : } 780 : : - 781 : 5479 : static bool __mptcp_subflow_error_report(struct sock *sk, struct sock *ssk) + 781 : 5501 : static bool __mptcp_subflow_error_report(struct sock *sk, struct sock *ssk) 782 : : { - 783 [ + + ]: 5479 : int err = sock_error(ssk); - 784 : 3288 : int ssk_state; + 783 [ + + ]: 5501 : int err = sock_error(ssk); + 784 : 3271 : int ssk_state; 785 : : - 786 [ + + ]: 3163 : if (!err) - 787 : 2316 : return false; + 786 [ + + ]: 3142 : if (!err) + 787 : 2359 : return false; 788 : : 789 : : /* only propagate errors on fallen-back sockets or 790 : : * on MPC connect 791 : : */ - 792 [ + + - + : 864 : if (sk->sk_state != TCP_SYN_SENT && !__mptcp_check_fallback(mptcp_sk(sk))) - + + ] + 792 [ + + - + : 855 : if (sk->sk_state != TCP_SYN_SENT && !__mptcp_check_fallback(mptcp_sk(sk))) + + + ] 793 : : return false; 794 : : 795 : : /* We need to propagate only transition to CLOSE state. @@ -878,38 +878,38 @@ 797 : : * subflow_sched_work_if_closed() and that path will properly 798 : : * destroy the msk as needed. 799 : : */ - 800 : 44 : ssk_state = inet_sk_state_load(ssk); - 801 [ + - + + ]: 44 : if (ssk_state == TCP_CLOSE && !sock_flag(sk, SOCK_DEAD)) - 802 : 26 : mptcp_set_state(sk, ssk_state); - 803 : 44 : WRITE_ONCE(sk->sk_err, -err); + 800 : 45 : ssk_state = inet_sk_state_load(ssk); + 801 [ + - + + ]: 45 : if (ssk_state == TCP_CLOSE && !sock_flag(sk, SOCK_DEAD)) + 802 : 27 : mptcp_set_state(sk, ssk_state); + 803 : 45 : WRITE_ONCE(sk->sk_err, -err); 804 : : 805 : : /* This barrier is coupled with smp_rmb() in mptcp_poll() */ - 806 : 44 : smp_wmb(); - 807 : 44 : sk_error_report(sk); - 808 : 44 : return true; + 806 : 45 : smp_wmb(); + 807 : 45 : sk_error_report(sk); + 808 : 45 : return true; 809 : : } 810 : : - 811 : 810 : void __mptcp_error_report(struct sock *sk) + 811 : 820 : void __mptcp_error_report(struct sock *sk) 812 : : { - 813 : 810 : struct mptcp_subflow_context *subflow; - 814 [ - + ]: 810 : struct mptcp_sock *msk = mptcp_sk(sk); + 813 : 820 : struct mptcp_subflow_context *subflow; + 814 [ - + ]: 820 : struct mptcp_sock *msk = mptcp_sk(sk); 815 : : - 816 [ + + ]: 1662 : mptcp_for_each_subflow(msk, subflow) - 817 [ + + ]: 878 : if (__mptcp_subflow_error_report(sk, mptcp_subflow_tcp_sock(subflow))) + 816 [ + + ]: 1695 : mptcp_for_each_subflow(msk, subflow) + 817 [ + + ]: 902 : if (__mptcp_subflow_error_report(sk, mptcp_subflow_tcp_sock(subflow))) 818 : : break; - 819 : 810 : } + 819 : 820 : } 820 : : 821 : : /* In most cases we will be able to lock the mptcp socket. If its already 822 : : * owned, we need to defer to the work queue to avoid ABBA deadlock. 823 : : */ - 824 : 480471 : static bool move_skbs_to_msk(struct mptcp_sock *msk, struct sock *ssk) + 824 : 693754 : static bool move_skbs_to_msk(struct mptcp_sock *msk, struct sock *ssk) 825 : : { - 826 : 480471 : struct sock *sk = (struct sock *)msk; - 827 : 480471 : unsigned int moved = 0; + 826 : 693754 : struct sock *sk = (struct sock *)msk; + 827 : 693754 : unsigned int moved = 0; 828 : : - 829 : 480471 : __mptcp_move_skbs_from_subflow(msk, ssk, &moved); - 830 : 480471 : __mptcp_ofo_queue(msk); - 831 [ - + ]: 480471 : if (unlikely(ssk->sk_err)) { + 829 : 693754 : __mptcp_move_skbs_from_subflow(msk, ssk, &moved); + 830 : 693754 : __mptcp_ofo_queue(msk); + 831 [ - + ]: 693754 : if (unlikely(ssk->sk_err)) { 832 [ # # ]: 0 : if (!sock_owned_by_user(sk)) 833 : 0 : __mptcp_error_report(sk); 834 : : else @@ -922,38 +922,38 @@ 840 : : * this is not a good place to change state. Let the workqueue 841 : : * do it. 842 : : */ - 843 [ + + ]: 480471 : if (mptcp_pending_data_fin(sk, NULL)) - 844 : 301 : mptcp_schedule_work(sk); - 845 : 480471 : return moved > 0; + 843 [ + + ]: 693754 : if (mptcp_pending_data_fin(sk, NULL)) + 844 : 312 : mptcp_schedule_work(sk); + 845 : 693754 : return moved > 0; 846 : : } 847 : : - 848 : 481725 : void mptcp_data_ready(struct sock *sk, struct sock *ssk) + 848 : 695121 : void mptcp_data_ready(struct sock *sk, struct sock *ssk) 849 : : { - 850 [ - + ]: 481725 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); - 851 [ - + ]: 481725 : struct mptcp_sock *msk = mptcp_sk(sk); - 852 : 481725 : int sk_rbuf, ssk_rbuf; + 850 [ - + ]: 695121 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); + 851 [ - + ]: 695121 : struct mptcp_sock *msk = mptcp_sk(sk); + 852 : 695121 : int sk_rbuf, ssk_rbuf; 853 : : 854 : : /* The peer can send data while we are shutting down this 855 : : * subflow at msk destruction time, but we must avoid enqueuing 856 : : * more data to the msk receive queue 857 : : */ - 858 [ + - ]: 481725 : if (unlikely(subflow->disposable)) + 858 [ + - ]: 695121 : if (unlikely(subflow->disposable)) 859 : : return; 860 : : - 861 : 481725 : ssk_rbuf = READ_ONCE(ssk->sk_rcvbuf); - 862 : 481725 : sk_rbuf = READ_ONCE(sk->sk_rcvbuf); - 863 [ - + ]: 481725 : if (unlikely(ssk_rbuf > sk_rbuf)) - 864 : 0 : sk_rbuf = ssk_rbuf; + 861 : 695121 : ssk_rbuf = READ_ONCE(ssk->sk_rcvbuf); + 862 : 695121 : sk_rbuf = READ_ONCE(sk->sk_rcvbuf); + 863 [ + + ]: 695121 : if (unlikely(ssk_rbuf > sk_rbuf)) + 864 : 9 : sk_rbuf = ssk_rbuf; 865 : : 866 : : /* over limit? can't append more skbs to msk, Also, no need to wake-up*/ - 867 [ + + ]: 481725 : if (__mptcp_rmem(sk) > sk_rbuf) + 867 [ + + ]: 695121 : if (__mptcp_rmem(sk) > sk_rbuf) 868 : : return; 869 : : 870 : : /* Wake-up the reader only for in-sequence data */ - 871 : 480471 : mptcp_data_lock(sk); - 872 [ + + + - ]: 480471 : if (move_skbs_to_msk(msk, ssk) && mptcp_epollin_ready(sk)) - 873 : 393879 : sk->sk_data_ready(sk); - 874 : 480471 : mptcp_data_unlock(sk); + 871 : 693754 : mptcp_data_lock(sk); + 872 [ + + + - ]: 693754 : if (move_skbs_to_msk(msk, ssk) && mptcp_epollin_ready(sk)) + 873 : 591991 : sk->sk_data_ready(sk); + 874 : 693754 : mptcp_data_unlock(sk); 875 : : } 876 : : 877 : 992 : static void mptcp_subflow_joined(struct mptcp_sock *msk, struct sock *ssk) @@ -973,8 +973,8 @@ 891 : : /* attach to msk socket only after we are sure we will deal with it 892 : : * at close time 893 : : */ - 894 [ + + + - ]: 505 : if (sk->sk_socket && !ssk->sk_socket) - 895 : 474 : mptcp_sock_graft(ssk, sk->sk_socket); + 894 [ + + + - ]: 505 : if (sk->sk_socket && !ssk->sk_socket) + 895 : 471 : mptcp_sock_graft(ssk, sk->sk_socket); 896 : : 897 : 505 : mptcp_subflow_ctx(ssk)->subflow_id = msk->subflow_id++; 898 : 505 : mptcp_sockopt_sync_locked(msk, ssk); @@ -984,79 +984,79 @@ 902 : : return true; 903 : : } 904 : : - 905 : 41 : static void __mptcp_flush_join_list(struct sock *sk, struct list_head *join_list) + 905 : 38 : static void __mptcp_flush_join_list(struct sock *sk, struct list_head *join_list) 906 : : { - 907 : 41 : struct mptcp_subflow_context *tmp, *subflow; - 908 [ - + ]: 41 : struct mptcp_sock *msk = mptcp_sk(sk); + 907 : 38 : struct mptcp_subflow_context *tmp, *subflow; + 908 [ - + ]: 38 : struct mptcp_sock *msk = mptcp_sk(sk); 909 : : - 910 [ + + ]: 84 : list_for_each_entry_safe(subflow, tmp, join_list, node) { - 911 : 43 : struct sock *ssk = mptcp_subflow_tcp_sock(subflow); - 912 : 43 : bool slow = lock_sock_fast(ssk); + 910 [ + + ]: 82 : list_for_each_entry_safe(subflow, tmp, join_list, node) { + 911 : 44 : struct sock *ssk = mptcp_subflow_tcp_sock(subflow); + 912 : 44 : bool slow = lock_sock_fast(ssk); 913 : : - 914 : 43 : list_move_tail(&subflow->node, &msk->conn_list); - 915 [ - + ]: 43 : if (!__mptcp_finish_join(msk, ssk)) + 914 : 44 : list_move_tail(&subflow->node, &msk->conn_list); + 915 [ - + ]: 44 : if (!__mptcp_finish_join(msk, ssk)) 916 : 0 : mptcp_subflow_reset(ssk); - 917 : 43 : unlock_sock_fast(ssk, slow); + 917 : 44 : unlock_sock_fast(ssk, slow); 918 : : } - 919 : 41 : } + 919 : 38 : } 920 : : - 921 : 271558 : static bool mptcp_rtx_timer_pending(struct sock *sk) + 921 : 271323 : static bool mptcp_rtx_timer_pending(struct sock *sk) 922 : : { - 923 : 537299 : return timer_pending(&inet_csk(sk)->icsk_retransmit_timer); + 923 : 712443 : return timer_pending(&inet_csk(sk)->icsk_retransmit_timer); 924 : : } 925 : : - 926 : 206787 : static void mptcp_reset_rtx_timer(struct sock *sk) + 926 : 306104 : static void mptcp_reset_rtx_timer(struct sock *sk) 927 : : { - 928 : 206787 : struct inet_connection_sock *icsk = inet_csk(sk); - 929 : 206787 : unsigned long tout; + 928 : 306104 : struct inet_connection_sock *icsk = inet_csk(sk); + 929 : 306104 : unsigned long tout; 930 : : 931 : : /* prevent rescheduling on close */ - 932 [ + + ]: 206787 : if (unlikely(inet_sk_state_load(sk) == TCP_CLOSE)) + 932 [ + + ]: 306104 : if (unlikely(inet_sk_state_load(sk) == TCP_CLOSE)) 933 : : return; 934 : : - 935 [ - + ]: 206748 : tout = mptcp_sk(sk)->timer_ival; - 936 : 206748 : sk_reset_timer(sk, &icsk->icsk_retransmit_timer, jiffies + tout); + 935 [ - + ]: 306054 : tout = mptcp_sk(sk)->timer_ival; + 936 : 306054 : sk_reset_timer(sk, &icsk->icsk_retransmit_timer, jiffies + tout); 937 : : } 938 : : - 939 : 10628 : bool mptcp_schedule_work(struct sock *sk) + 939 : 15311 : bool mptcp_schedule_work(struct sock *sk) 940 : : { - 941 [ + + + + ]: 20287 : if (inet_sk_state_load(sk) != TCP_CLOSE && - 942 [ - + + + ]: 10297 : schedule_work(&mptcp_sk(sk)->work)) { + 941 [ + + + + ]: 29674 : if (inet_sk_state_load(sk) != TCP_CLOSE && + 942 [ - + + + ]: 15012 : schedule_work(&mptcp_sk(sk)->work)) { 943 : : /* each subflow already holds a reference to the sk, and the 944 : : * workqueue is invoked by a subflow, so sk can't go away here. 945 : : */ - 946 : 9176 : sock_hold(sk); - 947 : 9176 : return true; + 946 : 13900 : sock_hold(sk); + 947 : 13900 : return true; 948 : : } 949 : : return false; 950 : : } 951 : : - 952 : 200665 : static struct sock *mptcp_subflow_recv_lookup(const struct mptcp_sock *msk) + 952 : 287858 : static struct sock *mptcp_subflow_recv_lookup(const struct mptcp_sock *msk) 953 : : { - 954 : 305302 : struct mptcp_subflow_context *subflow; + 954 : 438720 : struct mptcp_subflow_context *subflow; 955 : : - 956 : 305302 : msk_owned_by_me(msk); + 956 : 438720 : msk_owned_by_me(msk); 957 : : - 958 [ + + ]: 912214 : mptcp_for_each_subflow(msk, subflow) { - 959 [ + + + + ]: 607381 : if (READ_ONCE(subflow->data_avail)) - 960 : 469 : return mptcp_subflow_tcp_sock(subflow); + 958 [ + + ]: 1228510 : mptcp_for_each_subflow(msk, subflow) { + 959 [ + + + + ]: 790493 : if (READ_ONCE(subflow->data_avail)) + 960 : 703 : return mptcp_subflow_tcp_sock(subflow); 961 : : } 962 : : 963 : : return NULL; 964 : : } 965 : : - 966 : 475876 : static bool mptcp_skb_can_collapse_to(u64 write_seq, + 966 : 630484 : static bool mptcp_skb_can_collapse_to(u64 write_seq, 967 : : const struct sk_buff *skb, 968 : : const struct mptcp_ext *mpext) 969 : : { - 970 [ + + ]: 475876 : if (!tcp_skb_can_collapse_to(skb)) + 970 [ + + ]: 630484 : if (!tcp_skb_can_collapse_to(skb)) 971 : : return false; 972 : : 973 : : /* can collapse only if MPTCP level sequence is in order and this 974 : : * mapping has not been xmitted yet 975 : : */ - 976 [ + - + + ]: 914732 : return mpext && mpext->data_seq + mpext->data_len == write_seq && - 977 [ + + ]: 399622 : !mpext->frozen; + 976 [ + - + + ]: 1225870 : return mpext && mpext->data_seq + mpext->data_len == write_seq && + 977 [ + + ]: 547268 : !mpext->frozen; 978 : : } 979 : : 980 : : /* we can append data to the given data frag if: @@ -1064,44 +1064,44 @@ 982 : : * - the data frag tail matches the current page_frag free offset 983 : : * - the data frag end sequence number matches the current write seq 984 : : */ - 985 : 526558 : static bool mptcp_frag_can_collapse_to(const struct mptcp_sock *msk, + 985 : 702776 : static bool mptcp_frag_can_collapse_to(const struct mptcp_sock *msk, 986 : : const struct page_frag *pfrag, 987 : : const struct mptcp_data_frag *df) 988 : : { - 989 [ + - ]: 202638 : return df && pfrag->page == df->page && - 990 [ + + ]: 202638 : pfrag->size - pfrag->offset > 0 && - 991 [ + + + - ]: 652713 : pfrag->offset == (df->offset + df->data_len) && - 992 [ - + ]: 126155 : df->data_seq + df->data_len == msk->write_seq; + 989 [ + - ]: 268477 : return df && pfrag->page == df->page && + 990 [ + + ]: 268477 : pfrag->size - pfrag->offset > 0 && + 991 [ + + + - ]: 852333 : pfrag->offset == (df->offset + df->data_len) && + 992 [ - + ]: 149557 : df->data_seq + df->data_len == msk->write_seq; 993 : : } 994 : : - 995 : 214939 : static void dfrag_uncharge(struct sock *sk, int len) + 995 : 221187 : static void dfrag_uncharge(struct sock *sk, int len) 996 : : { - 997 : 521180 : sk_mem_uncharge(sk, len); - 998 : 521180 : sk_wmem_queued_add(sk, -len); - 999 : 120783 : } + 997 : 737854 : sk_mem_uncharge(sk, len); + 998 : 737854 : sk_wmem_queued_add(sk, -len); + 999 : 184641 : } 1000 : : - 1001 : 400397 : static void dfrag_clear(struct sock *sk, struct mptcp_data_frag *dfrag) + 1001 : 553213 : static void dfrag_clear(struct sock *sk, struct mptcp_data_frag *dfrag) 1002 : : { - 1003 : 400397 : int len = dfrag->data_len + dfrag->overhead; + 1003 : 553213 : int len = dfrag->data_len + dfrag->overhead; 1004 : : - 1005 : 400397 : list_del(&dfrag->list); - 1006 : 400397 : dfrag_uncharge(sk, len); - 1007 : 400397 : put_page(dfrag->page); - 1008 : 400397 : } + 1005 : 553213 : list_del(&dfrag->list); + 1006 : 553213 : dfrag_uncharge(sk, len); + 1007 : 553213 : put_page(dfrag->page); + 1008 : 553213 : } 1009 : : 1010 : : /* called under both the msk socket lock and the data lock */ - 1011 : 207766 : static void __mptcp_clean_una(struct sock *sk) + 1011 : 307625 : static void __mptcp_clean_una(struct sock *sk) 1012 : : { - 1013 [ - + ]: 207766 : struct mptcp_sock *msk = mptcp_sk(sk); - 1014 : 207766 : struct mptcp_data_frag *dtmp, *dfrag; - 1015 : 207766 : u64 snd_una; + 1013 [ - + ]: 307625 : struct mptcp_sock *msk = mptcp_sk(sk); + 1014 : 307625 : struct mptcp_data_frag *dtmp, *dfrag; + 1015 : 307625 : u64 snd_una; 1016 : : - 1017 : 207766 : snd_una = msk->snd_una; - 1018 [ + + ]: 608123 : list_for_each_entry_safe(dfrag, dtmp, &msk->rtx_queue, list) { - 1019 [ + + ]: 580685 : if (after64(dfrag->data_seq + dfrag->data_len, snd_una)) + 1017 : 307625 : snd_una = msk->snd_una; + 1018 [ + + ]: 860264 : list_for_each_entry_safe(dfrag, dtmp, &msk->rtx_queue, list) { + 1019 [ + + ]: 813756 : if (after64(dfrag->data_seq + dfrag->data_len, snd_una)) 1020 : : break; 1021 : : - 1022 [ - + ]: 400357 : if (unlikely(dfrag == msk->first_pending)) { + 1022 [ - + ]: 552639 : if (unlikely(dfrag == msk->first_pending)) { 1023 : : /* in recovery mode can see ack after the current snd head */ 1024 [ # # # # ]: 0 : if (WARN_ON_ONCE(!msk->recovery)) 1025 : : break; @@ -1109,15 +1109,15 @@ 1027 : 0 : WRITE_ONCE(msk->first_pending, mptcp_send_next(sk)); 1028 : : } 1029 : : - 1030 : 400357 : dfrag_clear(sk, dfrag); + 1030 : 552639 : dfrag_clear(sk, dfrag); 1031 : : } 1032 : : - 1033 : 207766 : dfrag = mptcp_rtx_head(sk); - 1034 [ + + + + ]: 207766 : if (dfrag && after64(snd_una, dfrag->data_seq)) { - 1035 : 120783 : u64 delta = snd_una - dfrag->data_seq; + 1033 : 307625 : dfrag = mptcp_rtx_head(sk); + 1034 [ + + + + ]: 307625 : if (dfrag && after64(snd_una, dfrag->data_seq)) { + 1035 : 184641 : u64 delta = snd_una - dfrag->data_seq; 1036 : : 1037 : : /* prevent wrap around in recovery mode */ - 1038 [ - + ]: 120783 : if (unlikely(delta > dfrag->already_sent)) { + 1038 [ - + ]: 184641 : if (unlikely(delta > dfrag->already_sent)) { 1039 [ # # # # ]: 0 : if (WARN_ON_ONCE(!msk->recovery)) 1040 : 0 : goto out; 1041 [ # # # # ]: 0 : if (WARN_ON_ONCE(delta > dfrag->data_len)) @@ -1125,45 +1125,45 @@ 1043 : 0 : dfrag->already_sent += delta - dfrag->already_sent; 1044 : : } 1045 : : - 1046 : 120783 : dfrag->data_seq += delta; - 1047 : 120783 : dfrag->offset += delta; - 1048 : 120783 : dfrag->data_len -= delta; - 1049 : 120783 : dfrag->already_sent -= delta; + 1046 : 184641 : dfrag->data_seq += delta; + 1047 : 184641 : dfrag->offset += delta; + 1048 : 184641 : dfrag->data_len -= delta; + 1049 : 184641 : dfrag->already_sent -= delta; 1050 : : - 1051 : 120783 : dfrag_uncharge(sk, delta); + 1051 : 184641 : dfrag_uncharge(sk, delta); 1052 : : } 1053 : : 1054 : : /* all retransmitted data acked, recovery completed */ - 1055 [ + + + + : 207766 : if (unlikely(msk->recovery) && after64(msk->snd_una, msk->recovery_snd_nxt)) - + + ] + 1055 [ + + + + : 307625 : if (unlikely(msk->recovery) && after64(msk->snd_una, msk->recovery_snd_nxt)) + + + ] 1056 : 19 : msk->recovery = false; 1057 : : - 1058 : 167500 : out: - 1059 [ + + + + ]: 207766 : if (snd_una == msk->snd_nxt && snd_una == msk->write_seq) { - 1060 [ + + + + ]: 26090 : if (mptcp_rtx_timer_pending(sk) && !mptcp_data_fin_enabled(msk)) - 1061 : 19743 : mptcp_stop_rtx_timer(sk); + 1058 : 267953 : out: + 1059 [ + + + + ]: 307625 : if (snd_una == msk->snd_nxt && snd_una == msk->write_seq) { + 1060 [ + + + + ]: 45192 : if (mptcp_rtx_timer_pending(sk) && !mptcp_data_fin_enabled(msk)) + 1061 : 37437 : mptcp_stop_rtx_timer(sk); 1062 : : } else { - 1063 : 181676 : mptcp_reset_rtx_timer(sk); + 1063 : 262433 : mptcp_reset_rtx_timer(sk); 1064 : : } 1065 : : - 1066 [ + + ]: 207766 : if (mptcp_pending_data_fin_ack(sk)) - 1067 : 1745 : mptcp_schedule_work(sk); - 1068 : 207766 : } + 1066 [ + + ]: 307625 : if (mptcp_pending_data_fin_ack(sk)) + 1067 : 1763 : mptcp_schedule_work(sk); + 1068 : 307625 : } 1069 : : - 1070 : 50837 : static void __mptcp_clean_una_wakeup(struct sock *sk) + 1070 : 65114 : static void __mptcp_clean_una_wakeup(struct sock *sk) 1071 : : { - 1072 [ + - - + ]: 59538 : lockdep_assert_held_once(&sk->sk_lock.slock); + 1072 [ + - - + ]: 95346 : lockdep_assert_held_once(&sk->sk_lock.slock); 1073 : : - 1074 : 59538 : __mptcp_clean_una(sk); - 1075 : 41383 : mptcp_write_space(sk); - 1076 : 57545 : } + 1074 : 95346 : __mptcp_clean_una(sk); + 1075 : 77737 : mptcp_write_space(sk); + 1076 : 90159 : } 1077 : : - 1078 : 6687 : static void mptcp_clean_una_wakeup(struct sock *sk) + 1078 : 11931 : static void mptcp_clean_una_wakeup(struct sock *sk) 1079 : : { - 1080 : 6687 : mptcp_data_lock(sk); - 1081 : 6687 : __mptcp_clean_una_wakeup(sk); - 1082 : 6687 : mptcp_data_unlock(sk); - 1083 : 6687 : } + 1080 : 11931 : mptcp_data_lock(sk); + 1081 : 11931 : __mptcp_clean_una_wakeup(sk); + 1082 : 11931 : mptcp_data_unlock(sk); + 1083 : 11931 : } 1084 : : 1085 : 0 : static void mptcp_enter_memory_pressure(struct sock *sk) 1086 : : { @@ -1186,9 +1186,9 @@ 1103 : : /* ensure we get enough memory for the frag hdr, beyond some minimal amount of 1104 : : * data 1105 : : */ - 1106 : 400403 : static bool mptcp_page_frag_refill(struct sock *sk, struct page_frag *pfrag) + 1106 : 553219 : static bool mptcp_page_frag_refill(struct sock *sk, struct page_frag *pfrag) 1107 : : { - 1108 [ - + ]: 400403 : if (likely(skb_page_frag_refill(32U + sizeof(struct mptcp_data_frag), + 1108 [ - + ]: 553219 : if (likely(skb_page_frag_refill(32U + sizeof(struct mptcp_data_frag), 1109 : : pfrag, sk->sk_allocation))) 1110 : : return true; 1111 : : @@ -1197,21 +1197,21 @@ 1114 : : } 1115 : : 1116 : : static struct mptcp_data_frag * - 1117 : 400403 : mptcp_carve_data_frag(const struct mptcp_sock *msk, struct page_frag *pfrag, + 1117 : 553219 : mptcp_carve_data_frag(const struct mptcp_sock *msk, struct page_frag *pfrag, 1118 : : int orig_offset) 1119 : : { - 1120 : 400403 : int offset = ALIGN(orig_offset, sizeof(long)); - 1121 : 400403 : struct mptcp_data_frag *dfrag; + 1120 : 553219 : int offset = ALIGN(orig_offset, sizeof(long)); + 1121 : 553219 : struct mptcp_data_frag *dfrag; 1122 : : - 1123 : 400403 : dfrag = (struct mptcp_data_frag *)(page_to_virt(pfrag->page) + offset); - 1124 : 400403 : dfrag->data_len = 0; - 1125 : 400403 : dfrag->data_seq = msk->write_seq; - 1126 : 400403 : dfrag->overhead = offset - orig_offset + sizeof(struct mptcp_data_frag); - 1127 : 400403 : dfrag->offset = offset + sizeof(struct mptcp_data_frag); - 1128 : 400403 : dfrag->already_sent = 0; - 1129 : 400403 : dfrag->page = pfrag->page; + 1123 : 553219 : dfrag = (struct mptcp_data_frag *)(page_to_virt(pfrag->page) + offset); + 1124 : 553219 : dfrag->data_len = 0; + 1125 : 553219 : dfrag->data_seq = msk->write_seq; + 1126 : 553219 : dfrag->overhead = offset - orig_offset + sizeof(struct mptcp_data_frag); + 1127 : 553219 : dfrag->offset = offset + sizeof(struct mptcp_data_frag); + 1128 : 553219 : dfrag->already_sent = 0; + 1129 : 553219 : dfrag->page = pfrag->page; 1130 : : - 1131 : 400403 : return dfrag; + 1131 : 553219 : return dfrag; 1132 : : } 1133 : : 1134 : : struct mptcp_sendmsg_info { @@ -1223,47 +1223,47 @@ 1140 : : bool data_lock_held; 1141 : : }; 1142 : : - 1143 : 608968 : static int mptcp_check_allowed_size(const struct mptcp_sock *msk, struct sock *ssk, + 1143 : 821720 : static int mptcp_check_allowed_size(const struct mptcp_sock *msk, struct sock *ssk, 1144 : : u64 data_seq, int avail_size) 1145 : : { - 1146 : 608968 : u64 window_end = mptcp_wnd_end(msk); - 1147 : 608968 : u64 mptcp_snd_wnd; + 1146 : 821720 : u64 window_end = mptcp_wnd_end(msk); + 1147 : 821720 : u64 mptcp_snd_wnd; 1148 : : - 1149 [ + + ]: 608968 : if (__mptcp_check_fallback(msk)) + 1149 [ + + ]: 821720 : if (__mptcp_check_fallback(msk)) 1150 : : return avail_size; 1151 : : - 1152 : 592803 : mptcp_snd_wnd = window_end - data_seq; - 1153 : 592803 : avail_size = min_t(unsigned int, mptcp_snd_wnd, avail_size); + 1152 : 777740 : mptcp_snd_wnd = window_end - data_seq; + 1153 : 777740 : avail_size = min_t(unsigned int, mptcp_snd_wnd, avail_size); 1154 : : - 1155 [ - + + + ]: 592803 : if (unlikely(tcp_sk(ssk)->snd_wnd < mptcp_snd_wnd)) { - 1156 [ - + ]: 4979 : tcp_sk(ssk)->snd_wnd = min_t(u64, U32_MAX, mptcp_snd_wnd); - 1157 [ + - ]: 4979 : MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_SNDWNDSHARED); + 1155 [ - + + + ]: 777740 : if (unlikely(tcp_sk(ssk)->snd_wnd < mptcp_snd_wnd)) { + 1156 [ - + ]: 7047 : tcp_sk(ssk)->snd_wnd = min_t(u64, U32_MAX, mptcp_snd_wnd); + 1157 [ + - ]: 7047 : MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_SNDWNDSHARED); 1158 : : } 1159 : : 1160 : : return avail_size; 1161 : : } 1162 : : - 1163 : 229616 : static bool __mptcp_add_ext(struct sk_buff *skb, gfp_t gfp) + 1163 : 333147 : static bool __mptcp_add_ext(struct sk_buff *skb, gfp_t gfp) 1164 : : { - 1165 : 229616 : struct skb_ext *mpext = __skb_ext_alloc(gfp); + 1165 : 333147 : struct skb_ext *mpext = __skb_ext_alloc(gfp); 1166 : : - 1167 [ + - ]: 229616 : if (!mpext) + 1167 [ + - ]: 333147 : if (!mpext) 1168 : : return false; - 1169 : 229616 : __skb_ext_set(skb, SKB_EXT_MPTCP, mpext); - 1170 : 229616 : return true; + 1169 : 333147 : __skb_ext_set(skb, SKB_EXT_MPTCP, mpext); + 1170 : 333147 : return true; 1171 : : } 1172 : : - 1173 : 229616 : static struct sk_buff *__mptcp_do_alloc_tx_skb(struct sock *sk, gfp_t gfp) + 1173 : 333147 : static struct sk_buff *__mptcp_do_alloc_tx_skb(struct sock *sk, gfp_t gfp) 1174 : : { - 1175 : 229616 : struct sk_buff *skb; + 1175 : 333147 : struct sk_buff *skb; 1176 : : - 1177 : 229616 : skb = alloc_skb_fclone(MAX_TCP_HEADER, gfp); - 1178 [ + - ]: 229616 : if (likely(skb)) { - 1179 [ + - ]: 229616 : if (likely(__mptcp_add_ext(skb, gfp))) { - 1180 : 229616 : skb_reserve(skb, MAX_TCP_HEADER); - 1181 : 229616 : skb->ip_summed = CHECKSUM_PARTIAL; - 1182 : 229616 : INIT_LIST_HEAD(&skb->tcp_tsorted_anchor); - 1183 : 229616 : return skb; + 1177 : 333147 : skb = alloc_skb_fclone(MAX_TCP_HEADER, gfp); + 1178 [ + - ]: 333147 : if (likely(skb)) { + 1179 [ + - ]: 333147 : if (likely(__mptcp_add_ext(skb, gfp))) { + 1180 : 333147 : skb_reserve(skb, MAX_TCP_HEADER); + 1181 : 333147 : skb->ip_summed = CHECKSUM_PARTIAL; + 1182 : 333147 : INIT_LIST_HEAD(&skb->tcp_tsorted_anchor); + 1183 : 333147 : return skb; 1184 : : } 1185 : 0 : __kfree_skb(skb); 1186 : : } else { @@ -1272,41 +1272,41 @@ 1189 : : return NULL; 1190 : : } 1191 : : - 1192 : 229616 : static struct sk_buff *__mptcp_alloc_tx_skb(struct sock *sk, struct sock *ssk, gfp_t gfp) + 1192 : 333147 : static struct sk_buff *__mptcp_alloc_tx_skb(struct sock *sk, struct sock *ssk, gfp_t gfp) 1193 : : { - 1194 : 229616 : struct sk_buff *skb; + 1194 : 333147 : struct sk_buff *skb; 1195 : : - 1196 : 229616 : skb = __mptcp_do_alloc_tx_skb(sk, gfp); - 1197 [ - + ]: 229616 : if (!skb) + 1196 : 333147 : skb = __mptcp_do_alloc_tx_skb(sk, gfp); + 1197 [ - + ]: 333147 : if (!skb) 1198 : : return NULL; 1199 : : - 1200 [ + - ]: 229616 : if (likely(sk_wmem_schedule(ssk, skb->truesize))) { - 1201 : 229616 : tcp_skb_entail(ssk, skb); - 1202 : 229616 : return skb; + 1200 [ + - ]: 333147 : if (likely(sk_wmem_schedule(ssk, skb->truesize))) { + 1201 : 333147 : tcp_skb_entail(ssk, skb); + 1202 : 333147 : return skb; 1203 : : } 1204 : 0 : tcp_skb_tsorted_anchor_cleanup(skb); 1205 : 0 : kfree_skb(skb); 1206 : 0 : return NULL; 1207 : : } 1208 : : - 1209 : 80145 : static struct sk_buff *mptcp_alloc_tx_skb(struct sock *sk, struct sock *ssk, bool data_lock_held) + 1209 : 78786 : static struct sk_buff *mptcp_alloc_tx_skb(struct sock *sk, struct sock *ssk, bool data_lock_held) 1210 : : { - 1211 : 200955 : gfp_t gfp = data_lock_held ? GFP_ATOMIC : sk->sk_allocation; + 1211 : 292706 : gfp_t gfp = data_lock_held ? GFP_ATOMIC : sk->sk_allocation; 1212 : : - 1213 : 229616 : return __mptcp_alloc_tx_skb(sk, ssk, gfp); + 1213 : 333147 : return __mptcp_alloc_tx_skb(sk, ssk, gfp); 1214 : : } 1215 : : 1216 : : /* note: this always recompute the csum on the whole skb, even 1217 : : * if we just appended a single frag. More status info needed 1218 : : */ - 1219 : 869 : static void mptcp_update_data_checksum(struct sk_buff *skb, int added) + 1219 : 871 : static void mptcp_update_data_checksum(struct sk_buff *skb, int added) 1220 : : { - 1221 [ + - ]: 869 : struct mptcp_ext *mpext = mptcp_get_ext(skb); - 1222 : 869 : __wsum csum = ~csum_unfold(mpext->csum); - 1223 : 869 : int offset = skb->len - added; + 1221 [ + - ]: 871 : struct mptcp_ext *mpext = mptcp_get_ext(skb); + 1222 : 871 : __wsum csum = ~csum_unfold(mpext->csum); + 1223 : 871 : int offset = skb->len - added; 1224 : : - 1225 [ # # ]: 869 : mpext->csum = csum_fold(csum_block_add(csum, skb_checksum(skb, offset, added, 0), offset)); - 1226 : 869 : } + 1225 [ # # ]: 871 : mpext->csum = csum_fold(csum_block_add(csum, skb_checksum(skb, offset, added, 0), offset)); + 1226 : 871 : } 1227 : : 1228 : 2 : static void mptcp_update_infinite_map(struct mptcp_sock *msk, 1229 : : struct sock *ssk, @@ -1326,79 +1326,79 @@ 1243 : : 1244 : : #define MPTCP_MAX_GSO_SIZE (GSO_LEGACY_MAX_SIZE - (MAX_TCP_HEADER + 1)) 1245 : : - 1246 : 608969 : static int mptcp_sendmsg_frag(struct sock *sk, struct sock *ssk, + 1246 : 821720 : static int mptcp_sendmsg_frag(struct sock *sk, struct sock *ssk, 1247 : : struct mptcp_data_frag *dfrag, 1248 : : struct mptcp_sendmsg_info *info) 1249 : : { - 1250 : 608969 : u64 data_seq = dfrag->data_seq + info->sent; - 1251 : 608969 : int offset = dfrag->offset + info->sent; - 1252 [ - + ]: 608969 : struct mptcp_sock *msk = mptcp_sk(sk); - 1253 : 608969 : bool zero_window_probe = false; - 1254 : 608969 : struct mptcp_ext *mpext = NULL; - 1255 : 608969 : bool can_coalesce = false; - 1256 : 608969 : bool reuse_skb = true; - 1257 : 608969 : struct sk_buff *skb; - 1258 : 608969 : size_t copy; - 1259 : 608969 : int i; + 1250 : 821720 : u64 data_seq = dfrag->data_seq + info->sent; + 1251 : 821720 : int offset = dfrag->offset + info->sent; + 1252 [ - + ]: 821720 : struct mptcp_sock *msk = mptcp_sk(sk); + 1253 : 821720 : bool zero_window_probe = false; + 1254 : 821720 : struct mptcp_ext *mpext = NULL; + 1255 : 821720 : bool can_coalesce = false; + 1256 : 821720 : bool reuse_skb = true; + 1257 : 821720 : struct sk_buff *skb; + 1258 : 821720 : size_t copy; + 1259 : 821720 : int i; 1260 : : - 1261 [ - + ]: 608969 : pr_debug("msk=%p ssk=%p sending dfrag at seq=%llu len=%u already sent=%u\n", + 1261 [ - + ]: 821720 : pr_debug("msk=%p ssk=%p sending dfrag at seq=%llu len=%u already sent=%u\n", 1262 : : msk, ssk, dfrag->data_seq, dfrag->data_len, info->sent); 1263 : : - 1264 [ + - - + ]: 608969 : if (WARN_ON_ONCE(info->sent > info->limit || + 1264 [ + - - + ]: 821720 : if (WARN_ON_ONCE(info->sent > info->limit || 1265 : : info->limit > dfrag->data_len)) 1266 : 0 : return 0; 1267 : : - 1268 [ + + ]: 608969 : if (unlikely(!__tcp_can_send(ssk))) + 1268 [ + - ]: 821720 : if (unlikely(!__tcp_can_send(ssk))) 1269 : : return -EAGAIN; 1270 : : 1271 : : /* compute send limit */ - 1272 [ - + ]: 608968 : if (unlikely(ssk->sk_gso_max_size > MPTCP_MAX_GSO_SIZE)) + 1272 [ - + ]: 821720 : if (unlikely(ssk->sk_gso_max_size > MPTCP_MAX_GSO_SIZE)) 1273 : 0 : ssk->sk_gso_max_size = MPTCP_MAX_GSO_SIZE; - 1274 : 608968 : info->mss_now = tcp_send_mss(ssk, &info->size_goal, info->flags); - 1275 : 608968 : copy = info->size_goal; + 1274 : 821720 : info->mss_now = tcp_send_mss(ssk, &info->size_goal, info->flags); + 1275 : 821720 : copy = info->size_goal; 1276 : : - 1277 [ + + ]: 608968 : skb = tcp_write_queue_tail(ssk); - 1278 [ + - + + ]: 498798 : if (skb && copy > skb->len) { + 1277 [ + + ]: 821720 : skb = tcp_write_queue_tail(ssk); + 1278 [ + - + + ]: 666623 : if (skb && copy > skb->len) { 1279 : : /* Limit the write to the size available in the 1280 : : * current skb, if any, so that we create at most a new skb. 1281 : : * Explicitly tells TCP internals to avoid collapsing on later 1282 : : * queue management operation, to avoid breaking the ext <-> 1283 : : * SSN association set here 1284 : : */ - 1285 [ + - ]: 475876 : mpext = mptcp_get_ext(skb); - 1286 [ + + ]: 475876 : if (!mptcp_skb_can_collapse_to(data_seq, skb, mpext)) { - 1287 : 91620 : TCP_SKB_CB(skb)->eor = 1; - 1288 [ - + ]: 91620 : tcp_mark_push(tcp_sk(ssk), skb); - 1289 : 91620 : goto alloc_skb; + 1285 [ + - ]: 630484 : mpext = mptcp_get_ext(skb); + 1286 [ + + ]: 630484 : if (!mptcp_skb_can_collapse_to(data_seq, skb, mpext)) { + 1287 : 136271 : TCP_SKB_CB(skb)->eor = 1; + 1288 [ - + ]: 136271 : tcp_mark_push(tcp_sk(ssk), skb); + 1289 : 136271 : goto alloc_skb; 1290 : : } 1291 : : - 1292 : 384256 : i = skb_shinfo(skb)->nr_frags; - 1293 : 384256 : can_coalesce = skb_can_coalesce(skb, i, dfrag->page, offset); - 1294 [ + + + + ]: 384256 : if (!can_coalesce && i >= READ_ONCE(net_hotdata.sysctl_max_skb_frags)) { - 1295 [ - + ]: 4904 : tcp_mark_push(tcp_sk(ssk), skb); - 1296 : 4904 : goto alloc_skb; + 1292 : 494213 : i = skb_shinfo(skb)->nr_frags; + 1293 : 494213 : can_coalesce = skb_can_coalesce(skb, i, dfrag->page, offset); + 1294 [ + + + + ]: 494213 : if (!can_coalesce && i >= READ_ONCE(net_hotdata.sysctl_max_skb_frags)) { + 1295 [ - + ]: 5640 : tcp_mark_push(tcp_sk(ssk), skb); + 1296 : 5640 : goto alloc_skb; 1297 : : } 1298 : : - 1299 : 379352 : copy -= skb->len; + 1299 : 488573 : copy -= skb->len; 1300 : : } else { - 1301 [ + + ]: 80145 : alloc_skb: - 1302 [ + + + + ]: 229616 : skb = mptcp_alloc_tx_skb(sk, ssk, info->data_lock_held); - 1303 [ - + ]: 229616 : if (!skb) + 1301 [ + + ]: 78786 : alloc_skb: + 1302 [ + + + + ]: 333147 : skb = mptcp_alloc_tx_skb(sk, ssk, info->data_lock_held); + 1303 [ - + ]: 333147 : if (!skb) 1304 : : return -ENOMEM; 1305 : : - 1306 [ + - ]: 229616 : i = skb_shinfo(skb)->nr_frags; - 1307 : 229616 : reuse_skb = false; - 1308 [ + - ]: 229616 : mpext = mptcp_get_ext(skb); + 1306 [ + - ]: 333147 : i = skb_shinfo(skb)->nr_frags; + 1307 : 333147 : reuse_skb = false; + 1308 [ + - ]: 333147 : mpext = mptcp_get_ext(skb); 1309 : : } 1310 : : 1311 : : /* Zero window and all data acked? Probe. */ - 1312 : 608968 : copy = mptcp_check_allowed_size(msk, ssk, data_seq, copy); - 1313 [ + + ]: 608968 : if (copy == 0) { - 1314 : 148641 : u64 snd_una = READ_ONCE(msk->snd_una); + 1312 : 821720 : copy = mptcp_check_allowed_size(msk, ssk, data_seq, copy); + 1313 [ + + ]: 821720 : if (copy == 0) { + 1314 : 184751 : u64 snd_una = READ_ONCE(msk->snd_una); 1315 : : - 1316 [ + + + - ]: 165855 : if (snd_una != msk->snd_nxt || tcp_write_queue_tail(ssk)) { - 1317 : 148641 : tcp_remove_empty_skb(ssk); - 1318 : 148641 : return 0; + 1316 [ + + + - ]: 214670 : if (snd_una != msk->snd_nxt || tcp_write_queue_tail(ssk)) { + 1317 : 184751 : tcp_remove_empty_skb(ssk); + 1318 : 184751 : return 0; 1319 : : } 1320 : : 1321 : 0 : zero_window_probe = true; @@ -1406,47 +1406,47 @@ 1323 : 0 : copy = 1; 1324 : : } 1325 : : - 1326 : 460327 : copy = min_t(size_t, copy, info->limit - info->sent); - 1327 [ - + ]: 460327 : if (!sk_wmem_schedule(ssk, copy)) { + 1326 : 636969 : copy = min_t(size_t, copy, info->limit - info->sent); + 1327 [ - + ]: 636969 : if (!sk_wmem_schedule(ssk, copy)) { 1328 : 0 : tcp_remove_empty_skb(ssk); 1329 : 0 : return -ENOMEM; 1330 : : } 1331 : : - 1332 [ + + ]: 460327 : if (can_coalesce) { - 1333 : 17358 : skb_frag_size_add(&skb_shinfo(skb)->frags[i - 1], copy); + 1332 [ + + ]: 636969 : if (can_coalesce) { + 1333 : 23500 : skb_frag_size_add(&skb_shinfo(skb)->frags[i - 1], copy); 1334 : : } else { - 1335 : 442969 : get_page(dfrag->page); - 1336 : 442969 : skb_fill_page_desc(skb, i, dfrag->page, offset, copy); + 1335 : 613469 : get_page(dfrag->page); + 1336 : 613469 : skb_fill_page_desc(skb, i, dfrag->page, offset, copy); 1337 : : } 1338 : : - 1339 : 460327 : skb->len += copy; - 1340 : 460327 : skb->data_len += copy; - 1341 : 460327 : skb->truesize += copy; - 1342 [ + - ]: 460327 : sk_wmem_queued_add(ssk, copy); - 1343 [ + - ]: 460327 : sk_mem_charge(ssk, copy); - 1344 [ - + - + ]: 460327 : WRITE_ONCE(tcp_sk(ssk)->write_seq, tcp_sk(ssk)->write_seq + copy); - 1345 : 460327 : TCP_SKB_CB(skb)->end_seq += copy; - 1346 [ + + ]: 460327 : tcp_skb_pcount_set(skb, 0); + 1339 : 636969 : skb->len += copy; + 1340 : 636969 : skb->data_len += copy; + 1341 : 636969 : skb->truesize += copy; + 1342 [ + - ]: 636969 : sk_wmem_queued_add(ssk, copy); + 1343 [ + - ]: 636969 : sk_mem_charge(ssk, copy); + 1344 [ - + - + ]: 636969 : WRITE_ONCE(tcp_sk(ssk)->write_seq, tcp_sk(ssk)->write_seq + copy); + 1345 : 636969 : TCP_SKB_CB(skb)->end_seq += copy; + 1346 [ + + ]: 636969 : tcp_skb_pcount_set(skb, 0); 1347 : : 1348 : : /* on skb reuse we just need to update the DSS len */ - 1349 [ + + ]: 460327 : if (reuse_skb) { - 1350 : 286390 : TCP_SKB_CB(skb)->tcp_flags &= ~TCPHDR_PSH; - 1351 : 286390 : mpext->data_len += copy; - 1352 : 286390 : goto out; + 1349 [ + + ]: 636969 : if (reuse_skb) { + 1350 : 370688 : TCP_SKB_CB(skb)->tcp_flags &= ~TCPHDR_PSH; + 1351 : 370688 : mpext->data_len += copy; + 1352 : 370688 : goto out; 1353 : : } 1354 : : - 1355 : 173937 : memset(mpext, 0, sizeof(*mpext)); - 1356 : 173937 : mpext->data_seq = data_seq; - 1357 [ - + ]: 173937 : mpext->subflow_seq = mptcp_subflow_ctx(ssk)->rel_write_seq; - 1358 : 173937 : mpext->data_len = copy; - 1359 : 173937 : mpext->use_map = 1; - 1360 : 173937 : mpext->dsn64 = 1; + 1355 : 266281 : memset(mpext, 0, sizeof(*mpext)); + 1356 : 266281 : mpext->data_seq = data_seq; + 1357 [ - + ]: 266281 : mpext->subflow_seq = mptcp_subflow_ctx(ssk)->rel_write_seq; + 1358 : 266281 : mpext->data_len = copy; + 1359 : 266281 : mpext->use_map = 1; + 1360 : 266281 : mpext->dsn64 = 1; 1361 : : - 1362 [ - + ]: 173937 : pr_debug("data_seq=%llu subflow_seq=%u data_len=%u dsn64=%d\n", + 1362 [ - + ]: 266281 : pr_debug("data_seq=%llu subflow_seq=%u data_len=%u dsn64=%d\n", 1363 : : mpext->data_seq, mpext->subflow_seq, mpext->data_len, 1364 : : mpext->dsn64); 1365 : : - 1366 [ - + ]: 173937 : if (zero_window_probe) { + 1366 [ - + ]: 266281 : if (zero_window_probe) { 1367 [ # # ]: 0 : mptcp_subflow_ctx(ssk)->rel_write_seq += copy; 1368 : 0 : mpext->frozen = 1; 1369 [ # # # # ]: 0 : if (READ_ONCE(msk->csum_enabled)) @@ -1454,14 +1454,14 @@ 1371 : 0 : tcp_push_pending_frames(ssk); 1372 : 0 : return 0; 1373 : : } - 1374 : 173937 : out: - 1375 [ + + + + ]: 460327 : if (READ_ONCE(msk->csum_enabled)) - 1376 : 869 : mptcp_update_data_checksum(skb, copy); - 1377 [ + + ]: 460327 : if (mptcp_subflow_ctx(ssk)->send_infinite_map) + 1374 : 266281 : out: + 1375 [ + + + + ]: 636969 : if (READ_ONCE(msk->csum_enabled)) + 1376 : 871 : mptcp_update_data_checksum(skb, copy); + 1377 [ + + ]: 636969 : if (mptcp_subflow_ctx(ssk)->send_infinite_map) 1378 : 2 : mptcp_update_infinite_map(msk, ssk, mpext); - 1379 : 460327 : trace_mptcp_sendmsg_frag(mpext); - 1380 : 460327 : mptcp_subflow_ctx(ssk)->rel_write_seq += copy; - 1381 : 460327 : return copy; + 1379 : 636969 : trace_mptcp_sendmsg_frag(mpext); + 1380 : 636969 : mptcp_subflow_ctx(ssk)->rel_write_seq += copy; + 1381 : 636969 : return copy; 1382 : : } 1383 : : 1384 : : #define MPTCP_SEND_BURST_SIZE ((1 << 16) - \ @@ -1475,26 +1475,26 @@ 1392 : : u64 linger_time; 1393 : : }; 1394 : : - 1395 : 102 : void mptcp_subflow_set_active(struct mptcp_subflow_context *subflow) + 1395 : 109 : void mptcp_subflow_set_active(struct mptcp_subflow_context *subflow) 1396 : : { - 1397 [ - + ]: 102 : if (!subflow->stale) + 1397 [ - + ]: 109 : if (!subflow->stale) 1398 : : return; 1399 : : 1400 : 0 : subflow->stale = 0; 1401 [ # # ]: 0 : MPTCP_INC_STATS(sock_net(mptcp_subflow_tcp_sock(subflow)), MPTCP_MIB_SUBFLOWRECOVER); 1402 : : } 1403 : : - 1404 : 940107 : bool mptcp_subflow_active(struct mptcp_subflow_context *subflow) + 1404 : 1259231 : bool mptcp_subflow_active(struct mptcp_subflow_context *subflow) 1405 : : { - 1406 [ + + ]: 940107 : if (unlikely(subflow->stale)) { - 1407 [ - + ]: 74742 : u32 rcv_tstamp = READ_ONCE(tcp_sk(mptcp_subflow_tcp_sock(subflow))->rcv_tstamp); + 1406 [ + + ]: 1259231 : if (unlikely(subflow->stale)) { + 1407 [ - + ]: 89868 : u32 rcv_tstamp = READ_ONCE(tcp_sk(mptcp_subflow_tcp_sock(subflow))->rcv_tstamp); 1408 : : - 1409 [ - + ]: 74742 : if (subflow->stale_rcv_tstamp == rcv_tstamp) + 1409 [ - + ]: 89868 : if (subflow->stale_rcv_tstamp == rcv_tstamp) 1410 : : return false; 1411 : : 1412 : 0 : mptcp_subflow_set_active(subflow); 1413 : : } - 1414 : 865365 : return __mptcp_subflow_active(subflow); + 1414 : 1169363 : return __mptcp_subflow_active(subflow); 1415 : : } 1416 : : 1417 : : #define SSK_MODE_ACTIVE 0 @@ -1505,35 +1505,35 @@ 1422 : : * returns the subflow that will transmit the next DSS 1423 : : * additionally updates the rtx timeout 1424 : : */ - 1425 : 340419 : struct sock *mptcp_subflow_get_send(struct mptcp_sock *msk) + 1425 : 484360 : struct sock *mptcp_subflow_get_send(struct mptcp_sock *msk) 1426 : : { - 1427 : 340419 : struct subflow_send_info send_info[SSK_MODE_MAX]; - 1428 : 340419 : struct mptcp_subflow_context *subflow; - 1429 : 340419 : struct sock *sk = (struct sock *)msk; - 1430 : 340419 : u32 pace, burst, wmem; - 1431 : 340419 : int i, nr_active = 0; - 1432 : 340419 : struct sock *ssk; - 1433 : 340419 : u64 linger_time; - 1434 : 340419 : long tout = 0; + 1427 : 484360 : struct subflow_send_info send_info[SSK_MODE_MAX]; + 1428 : 484360 : struct mptcp_subflow_context *subflow; + 1429 : 484360 : struct sock *sk = (struct sock *)msk; + 1430 : 484360 : u32 pace, burst, wmem; + 1431 : 484360 : int i, nr_active = 0; + 1432 : 484360 : struct sock *ssk; + 1433 : 484360 : u64 linger_time; + 1434 : 484360 : long tout = 0; 1435 : : 1436 : : /* pick the subflow with the lower wmem/wspace ratio */ - 1437 [ + + ]: 1021257 : for (i = 0; i < SSK_MODE_MAX; ++i) { - 1438 : 680838 : send_info[i].ssk = NULL; - 1439 : 680838 : send_info[i].linger_time = -1; + 1437 [ + + ]: 1453080 : for (i = 0; i < SSK_MODE_MAX; ++i) { + 1438 : 968720 : send_info[i].ssk = NULL; + 1439 : 968720 : send_info[i].linger_time = -1; 1440 : : } 1441 : : - 1442 [ + + ]: 972819 : mptcp_for_each_subflow(msk, subflow) { - 1443 : 632400 : bool backup = subflow->backup || subflow->request_bkup; + 1442 [ + + ]: 1314956 : mptcp_for_each_subflow(msk, subflow) { + 1443 : 830596 : bool backup = subflow->backup || subflow->request_bkup; 1444 : : - 1445 : 632400 : trace_mptcp_subflow_get_send(subflow); - 1446 : 632400 : ssk = mptcp_subflow_tcp_sock(subflow); - 1447 [ + + ]: 632400 : if (!mptcp_subflow_active(subflow)) - 1448 : 76067 : continue; + 1445 : 830596 : trace_mptcp_subflow_get_send(subflow); + 1446 : 830596 : ssk = mptcp_subflow_tcp_sock(subflow); + 1447 [ + + ]: 830596 : if (!mptcp_subflow_active(subflow)) + 1448 : 91253 : continue; 1449 : : - 1450 [ + + ]: 556333 : tout = max(tout, mptcp_timeout_from_subflow(subflow)); - 1451 : 556333 : nr_active += !backup; - 1452 : 556333 : pace = subflow->avg_pacing_rate; - 1453 [ + + ]: 556333 : if (unlikely(!pace)) { + 1450 [ + + ]: 739343 : tout = max(tout, mptcp_timeout_from_subflow(subflow)); + 1451 : 739343 : nr_active += !backup; + 1452 : 739343 : pace = subflow->avg_pacing_rate; + 1453 [ + + ]: 739343 : if (unlikely(!pace)) { 1454 : : /* init pacing rate from socket */ 1455 : 2488 : subflow->avg_pacing_rate = READ_ONCE(ssk->sk_pacing_rate); 1456 : 2488 : pace = subflow->avg_pacing_rate; @@ -1541,17 +1541,17 @@ 1458 : 0 : continue; 1459 : : } 1460 : : - 1461 [ + + ]: 556333 : linger_time = div_u64((u64)READ_ONCE(ssk->sk_wmem_queued) << 32, pace); - 1462 [ + + ]: 556333 : if (linger_time < send_info[backup].linger_time) { - 1463 : 436963 : send_info[backup].ssk = ssk; - 1464 : 436963 : send_info[backup].linger_time = linger_time; + 1461 [ + + ]: 739343 : linger_time = div_u64((u64)READ_ONCE(ssk->sk_wmem_queued) << 32, pace); + 1462 [ + + ]: 739343 : if (linger_time < send_info[backup].linger_time) { + 1463 : 605049 : send_info[backup].ssk = ssk; + 1464 : 605049 : send_info[backup].linger_time = linger_time; 1465 : : } 1466 : : } - 1467 : 340419 : __mptcp_set_timeout(sk, tout); + 1467 : 484360 : __mptcp_set_timeout(sk, tout); 1468 : : 1469 : : /* pick the best backup if no other subflow is active */ - 1470 [ + + ]: 340419 : if (!nr_active) - 1471 : 28619 : send_info[SSK_MODE_ACTIVE].ssk = send_info[SSK_MODE_BACKUP].ssk; + 1470 [ + + ]: 484360 : if (!nr_active) + 1471 : 32991 : send_info[SSK_MODE_ACTIVE].ssk = send_info[SSK_MODE_BACKUP].ssk; 1472 : : 1473 : : /* According to the blest algorithm, to avoid HoL blocking for the 1474 : : * faster flow, we need to: @@ -1564,40 +1564,40 @@ 1481 : : * the queued mem, which basically ensure the above. We just need 1482 : : * to check that subflow has a non empty cwin. 1483 : : */ - 1484 : 340419 : ssk = send_info[SSK_MODE_ACTIVE].ssk; - 1485 [ + + + + ]: 680827 : if (!ssk || !sk_stream_memory_free(ssk)) - 1486 : 52029 : return NULL; + 1484 : 484360 : ssk = send_info[SSK_MODE_ACTIVE].ssk; + 1485 [ + + + + ]: 968706 : if (!ssk || !sk_stream_memory_free(ssk)) + 1486 : 60131 : return NULL; 1487 : : - 1488 : 288390 : burst = min_t(int, MPTCP_SEND_BURST_SIZE, mptcp_wnd_end(msk) - msk->snd_nxt); - 1489 : 288390 : wmem = READ_ONCE(ssk->sk_wmem_queued); - 1490 [ + + ]: 288390 : if (!burst) + 1488 : 424229 : burst = min_t(int, MPTCP_SEND_BURST_SIZE, mptcp_wnd_end(msk) - msk->snd_nxt); + 1489 : 424229 : wmem = READ_ONCE(ssk->sk_wmem_queued); + 1490 [ + + ]: 424229 : if (!burst) 1491 : : return ssk; 1492 : : - 1493 : 187949 : subflow = mptcp_subflow_ctx(ssk); - 1494 : 187949 : subflow->avg_pacing_rate = div_u64((u64)subflow->avg_pacing_rate * wmem + - 1495 : 187949 : READ_ONCE(ssk->sk_pacing_rate) * burst, + 1493 : 290975 : subflow = mptcp_subflow_ctx(ssk); + 1494 : 290975 : subflow->avg_pacing_rate = div_u64((u64)subflow->avg_pacing_rate * wmem + + 1495 : 290975 : READ_ONCE(ssk->sk_pacing_rate) * burst, 1496 : : burst + wmem); - 1497 : 187949 : msk->snd_burst = burst; - 1498 : 187949 : return ssk; + 1497 : 290975 : msk->snd_burst = burst; + 1498 : 290975 : return ssk; 1499 : : } 1500 : : - 1501 : 460812 : static void mptcp_push_release(struct sock *ssk, struct mptcp_sendmsg_info *info) + 1501 : 589247 : static void mptcp_push_release(struct sock *ssk, struct mptcp_sendmsg_info *info) 1502 : : { - 1503 [ - + ]: 460812 : tcp_push(ssk, 0, info->mss_now, tcp_sk(ssk)->nonagle, info->size_goal); - 1504 : 460812 : release_sock(ssk); - 1505 : 460812 : } + 1503 [ - + ]: 589247 : tcp_push(ssk, 0, info->mss_now, tcp_sk(ssk)->nonagle, info->size_goal); + 1504 : 589247 : release_sock(ssk); + 1505 : 589247 : } 1506 : : - 1507 : 457019 : static void mptcp_update_post_push(struct mptcp_sock *msk, + 1507 : 633306 : static void mptcp_update_post_push(struct mptcp_sock *msk, 1508 : : struct mptcp_data_frag *dfrag, 1509 : : u32 sent) 1510 : : { - 1511 : 457019 : u64 snd_nxt_new = dfrag->data_seq; + 1511 : 633306 : u64 snd_nxt_new = dfrag->data_seq; 1512 : : - 1513 : 457019 : dfrag->already_sent += sent; + 1513 : 633306 : dfrag->already_sent += sent; 1514 : : - 1515 : 457019 : msk->snd_burst -= sent; + 1515 : 633306 : msk->snd_burst -= sent; 1516 : : - 1517 : 457019 : snd_nxt_new += dfrag->already_sent; + 1517 : 633306 : snd_nxt_new += dfrag->already_sent; 1518 : : 1519 : : /* snd_nxt_new can be smaller than snd_nxt in case mptcp 1520 : : * is recovering after a failover. In that event, this re-sends @@ -1608,113 +1608,113 @@ 1525 : : * that has been handed to the subflow for transmission 1526 : : * and skip update in case it was old dfrag. 1527 : : */ - 1528 [ + + ]: 457019 : if (likely(after64(snd_nxt_new, msk->snd_nxt))) { - 1529 : 452591 : msk->bytes_sent += snd_nxt_new - msk->snd_nxt; - 1530 : 452591 : WRITE_ONCE(msk->snd_nxt, snd_nxt_new); + 1528 [ + + ]: 633306 : if (likely(after64(snd_nxt_new, msk->snd_nxt))) { + 1529 : 628304 : msk->bytes_sent += snd_nxt_new - msk->snd_nxt; + 1530 : 628304 : WRITE_ONCE(msk->snd_nxt, snd_nxt_new); 1531 : : } - 1532 : 457019 : } + 1532 : 633306 : } 1533 : : - 1534 : 5990 : void mptcp_check_and_set_pending(struct sock *sk) + 1534 : 11067 : void mptcp_check_and_set_pending(struct sock *sk) 1535 : : { - 1536 [ + + ]: 5990 : if (mptcp_send_head(sk)) { - 1537 : 787 : mptcp_data_lock(sk); - 1538 [ - + ]: 787 : mptcp_sk(sk)->cb_flags |= BIT(MPTCP_PUSH_PENDING); - 1539 : 787 : mptcp_data_unlock(sk); + 1536 [ + + ]: 11067 : if (mptcp_send_head(sk)) { + 1537 : 2695 : mptcp_data_lock(sk); + 1538 [ - + ]: 2695 : mptcp_sk(sk)->cb_flags |= BIT(MPTCP_PUSH_PENDING); + 1539 : 2695 : mptcp_data_unlock(sk); 1540 : : } - 1541 : 5990 : } + 1541 : 11067 : } 1542 : : - 1543 : 537850 : static int __subflow_push_pending(struct sock *sk, struct sock *ssk, + 1543 : 698192 : static int __subflow_push_pending(struct sock *sk, struct sock *ssk, 1544 : : struct mptcp_sendmsg_info *info) 1545 : : { - 1546 [ - + ]: 537850 : struct mptcp_sock *msk = mptcp_sk(sk); - 1547 : 339386 : struct mptcp_data_frag *dfrag; - 1548 : 339386 : int len, copied = 0, err = 0; + 1546 [ - + ]: 698192 : struct mptcp_sock *msk = mptcp_sk(sk); + 1547 : 345532 : struct mptcp_data_frag *dfrag; + 1548 : 345532 : int len, copied = 0, err = 0; 1549 : : - 1550 [ + + ]: 760778 : while ((dfrag = mptcp_send_head(sk))) { - 1551 : 553077 : info->sent = dfrag->already_sent; - 1552 : 553077 : info->limit = dfrag->data_len; - 1553 : 553077 : len = dfrag->data_len - dfrag->already_sent; - 1554 [ + + ]: 1010096 : while (len > 0) { - 1555 : 605661 : int ret = 0; + 1550 [ + + ]: 1042337 : while ((dfrag = mptcp_send_head(sk))) { + 1551 : 742551 : info->sent = dfrag->already_sent; + 1552 : 742551 : info->limit = dfrag->data_len; + 1553 : 742551 : len = dfrag->data_len - dfrag->already_sent; + 1554 [ + + ]: 1375857 : while (len > 0) { + 1555 : 818057 : int ret = 0; 1556 : : - 1557 : 605661 : ret = mptcp_sendmsg_frag(sk, ssk, dfrag, info); - 1558 [ + + ]: 605661 : if (ret <= 0) { - 1559 [ + + ]: 148642 : err = copied ? : ret; - 1560 : 148642 : goto out; + 1557 : 818057 : ret = mptcp_sendmsg_frag(sk, ssk, dfrag, info); + 1558 [ + + ]: 818057 : if (ret <= 0) { + 1559 [ + + ]: 184751 : err = copied ? : ret; + 1560 : 184751 : goto out; 1561 : : } 1562 : : - 1563 : 457019 : info->sent += ret; - 1564 : 457019 : copied += ret; - 1565 : 457019 : len -= ret; + 1563 : 633306 : info->sent += ret; + 1564 : 633306 : copied += ret; + 1565 : 633306 : len -= ret; 1566 : : - 1567 : 457019 : mptcp_update_post_push(msk, dfrag, ret); + 1567 : 633306 : mptcp_update_post_push(msk, dfrag, ret); 1568 : : } - 1569 : 404435 : WRITE_ONCE(msk->first_pending, mptcp_send_next(sk)); + 1569 : 557800 : WRITE_ONCE(msk->first_pending, mptcp_send_next(sk)); 1570 : : - 1571 [ + + + + ]: 570367 : if (msk->snd_burst <= 0 || - 1572 [ + + - + ]: 284591 : !sk_stream_memory_free(ssk) || - 1573 : 222928 : !mptcp_subflow_active(mptcp_subflow_ctx(ssk))) { - 1574 : 181507 : err = copied; - 1575 : 181507 : goto out; + 1571 [ + + + + ]: 838983 : if (msk->snd_burst <= 0 || + 1572 [ + + - + ]: 412223 : !sk_stream_memory_free(ssk) || + 1573 : 344145 : !mptcp_subflow_active(mptcp_subflow_ctx(ssk))) { + 1574 : 213655 : err = copied; + 1575 : 213655 : goto out; 1576 : : } - 1577 : 222928 : mptcp_set_timeout(sk); + 1577 : 344145 : mptcp_set_timeout(sk); 1578 : : } 1579 : : err = copied; 1580 : : - 1581 : 537850 : out: - 1582 [ + + ]: 537850 : if (err > 0) - 1583 : 378686 : msk->last_data_sent = tcp_jiffies32; - 1584 : 537850 : return err; + 1581 : 698192 : out: + 1582 [ + + ]: 698192 : if (err > 0) + 1583 : 512625 : msk->last_data_sent = tcp_jiffies32; + 1584 : 698192 : return err; 1585 : : } 1586 : : - 1587 : 468622 : void __mptcp_push_pending(struct sock *sk, unsigned int flags) + 1587 : 608254 : void __mptcp_push_pending(struct sock *sk, unsigned int flags) 1588 : : { - 1589 : 468622 : struct sock *prev_ssk = NULL, *ssk = NULL; - 1590 [ - + ]: 468622 : struct mptcp_sock *msk = mptcp_sk(sk); - 1591 : 468622 : struct mptcp_sendmsg_info info = { + 1589 : 608254 : struct sock *prev_ssk = NULL, *ssk = NULL; + 1590 [ - + ]: 608254 : struct mptcp_sock *msk = mptcp_sk(sk); + 1591 : 608254 : struct mptcp_sendmsg_info info = { 1592 : : .flags = flags, 1593 : : }; - 1594 : 468622 : bool do_check_data_fin = false; - 1595 : 468622 : int push_count = 1; + 1594 : 608254 : bool do_check_data_fin = false; + 1595 : 608254 : int push_count = 1; 1596 : : - 1597 [ + + + + ]: 897045 : while (mptcp_send_head(sk) && (push_count > 0)) { - 1598 : 468960 : struct mptcp_subflow_context *subflow; - 1599 : 468960 : int ret = 0; + 1597 [ + + + + ]: 1172000 : while (mptcp_send_head(sk) && (push_count > 0)) { + 1598 : 613408 : struct mptcp_subflow_context *subflow; + 1599 : 613408 : int ret = 0; 1600 : : - 1601 [ + + ]: 468960 : if (mptcp_sched_get_send(msk)) + 1601 [ + + ]: 613408 : if (mptcp_sched_get_send(msk)) 1602 : : break; 1603 : : - 1604 : 428423 : push_count = 0; + 1604 : 563746 : push_count = 0; 1605 : : - 1606 [ + + ]: 1209175 : mptcp_for_each_subflow(msk, subflow) { - 1607 [ + + + + ]: 780752 : if (READ_ONCE(subflow->scheduled)) { - 1608 : 470244 : mptcp_subflow_set_scheduled(subflow, false); + 1606 [ + + ]: 1513608 : mptcp_for_each_subflow(msk, subflow) { + 1607 [ + + + + ]: 949862 : if (READ_ONCE(subflow->scheduled)) { + 1608 : 605590 : mptcp_subflow_set_scheduled(subflow, false); 1609 : : - 1610 : 470244 : prev_ssk = ssk; - 1611 [ + + ]: 470244 : ssk = mptcp_subflow_tcp_sock(subflow); - 1612 [ + + ]: 470244 : if (ssk != prev_ssk) { + 1610 : 605590 : prev_ssk = ssk; + 1611 [ + + ]: 605590 : ssk = mptcp_subflow_tcp_sock(subflow); + 1612 [ + + ]: 605590 : if (ssk != prev_ssk) { 1613 : : /* First check. If the ssk has changed since 1614 : : * the last round, release prev_ssk 1615 : : */ - 1616 [ + + ]: 460812 : if (prev_ssk) - 1617 : 44057 : mptcp_push_release(prev_ssk, &info); + 1616 [ + + ]: 589247 : if (prev_ssk) + 1617 : 44234 : mptcp_push_release(prev_ssk, &info); 1618 : : 1619 : : /* Need to lock the new subflow only if different 1620 : : * from the previous one, otherwise we are still 1621 : : * helding the relevant lock 1622 : : */ - 1623 : 460812 : lock_sock(ssk); + 1623 : 589247 : lock_sock(ssk); 1624 : : } 1625 : : - 1626 : 470244 : push_count++; + 1626 : 605590 : push_count++; 1627 : : - 1628 : 470244 : ret = __subflow_push_pending(sk, ssk, &info); - 1629 [ + + ]: 470244 : if (ret <= 0) { - 1630 [ + + - - ]: 132215 : if (ret != -EAGAIN || - 1631 [ + - ]: 1 : (1 << ssk->sk_state) & + 1628 : 605590 : ret = __subflow_push_pending(sk, ssk, &info); + 1629 [ + + ]: 605590 : if (ret <= 0) { + 1630 [ - + - - ]: 150036 : if (ret != -EAGAIN || + 1631 [ # # ]: 0 : (1 << ssk->sk_state) & 1632 : : (TCPF_FIN_WAIT1 | TCPF_FIN_WAIT2 | TCPF_CLOSE)) - 1633 : 59090 : push_count--; - 1634 : 132215 : continue; + 1633 : 81185 : push_count--; + 1634 : 150036 : continue; 1635 : : } 1636 : : do_check_data_fin = true; 1637 : : } @@ -1722,82 +1722,82 @@ 1639 : : } 1640 : : 1641 : : /* at this point we held the socket lock for the last subflow we used */ - 1642 [ + + ]: 468622 : if (ssk) - 1643 : 416755 : mptcp_push_release(ssk, &info); + 1642 [ + + ]: 608254 : if (ssk) + 1643 : 545013 : mptcp_push_release(ssk, &info); 1644 : : 1645 : : /* ensure the rtx timer is running */ - 1646 [ + + ]: 468622 : if (!mptcp_rtx_timer_pending(sk)) - 1647 : 23351 : mptcp_reset_rtx_timer(sk); - 1648 [ + + ]: 468622 : if (do_check_data_fin) - 1649 : 327146 : mptcp_check_send_data_fin(sk); - 1650 : 468622 : } + 1646 [ + + ]: 608254 : if (!mptcp_rtx_timer_pending(sk)) + 1647 : 41856 : mptcp_reset_rtx_timer(sk); + 1648 [ + + ]: 608254 : if (do_check_data_fin) + 1649 : 438731 : mptcp_check_send_data_fin(sk); + 1650 : 608254 : } 1651 : : - 1652 : 67977 : static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk, bool first) + 1652 : 84241 : static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk, bool first) 1653 : : { - 1654 [ - + ]: 67977 : struct mptcp_sock *msk = mptcp_sk(sk); - 1655 : 67977 : struct mptcp_sendmsg_info info = { + 1654 [ - + ]: 84241 : struct mptcp_sock *msk = mptcp_sk(sk); + 1655 : 84241 : struct mptcp_sendmsg_info info = { 1656 : : .data_lock_held = true, 1657 : : }; - 1658 : 67977 : bool keep_pushing = true; - 1659 : 67977 : struct sock *xmit_ssk; - 1660 : 67977 : int copied = 0; + 1658 : 84241 : bool keep_pushing = true; + 1659 : 84241 : struct sock *xmit_ssk; + 1660 : 84241 : int copied = 0; 1661 : : - 1662 : 67977 : info.flags = 0; - 1663 [ + + + + ]: 138354 : while (mptcp_send_head(sk) && keep_pushing) { - 1664 [ + + ]: 106733 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); - 1665 : 106733 : int ret = 0; + 1662 : 84241 : info.flags = 0; + 1663 [ + + + + ]: 179788 : while (mptcp_send_head(sk) && keep_pushing) { + 1664 [ + + ]: 139292 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); + 1665 : 139292 : int ret = 0; 1666 : : 1667 : : /* check for a different subflow usage only after 1668 : : * spooling the first chunk of data 1669 : : */ - 1670 [ + + ]: 106733 : if (first) { - 1671 : 3846 : mptcp_subflow_set_scheduled(subflow, false); - 1672 : 3846 : ret = __subflow_push_pending(sk, ssk, &info); - 1673 : 3846 : first = false; - 1674 [ + + ]: 3846 : if (ret <= 0) + 1670 [ + + ]: 139292 : if (first) { + 1671 : 4238 : mptcp_subflow_set_scheduled(subflow, false); + 1672 : 4238 : ret = __subflow_push_pending(sk, ssk, &info); + 1673 : 4238 : first = false; + 1674 [ + + ]: 4238 : if (ret <= 0) 1675 : : break; - 1676 : 2144 : copied += ret; - 1677 : 2144 : continue; + 1676 : 2377 : copied += ret; + 1677 : 2377 : continue; 1678 : : } 1679 : : - 1680 [ + + ]: 102887 : if (mptcp_sched_get_send(msk)) - 1681 : 34654 : goto out; + 1680 [ + + ]: 135054 : if (mptcp_sched_get_send(msk)) + 1681 : 41884 : goto out; 1682 : : - 1683 [ + + + + ]: 68233 : if (READ_ONCE(subflow->scheduled)) { - 1684 : 63760 : mptcp_subflow_set_scheduled(subflow, false); - 1685 : 63760 : ret = __subflow_push_pending(sk, ssk, &info); - 1686 [ + + ]: 63760 : if (ret <= 0) - 1687 : 25247 : keep_pushing = false; - 1688 : 63760 : copied += ret; + 1683 [ + + + + ]: 93170 : if (READ_ONCE(subflow->scheduled)) { + 1684 : 88364 : mptcp_subflow_set_scheduled(subflow, false); + 1685 : 88364 : ret = __subflow_push_pending(sk, ssk, &info); + 1686 [ + + ]: 88364 : if (ret <= 0) + 1687 : 33670 : keep_pushing = false; + 1688 : 88364 : copied += ret; 1689 : : } 1690 : : - 1691 [ + + ]: 161909 : mptcp_for_each_subflow(msk, subflow) { - 1692 [ + + + + ]: 93676 : if (READ_ONCE(subflow->scheduled)) { - 1693 [ + - ]: 4473 : xmit_ssk = mptcp_subflow_tcp_sock(subflow); - 1694 [ + - ]: 4473 : if (xmit_ssk != ssk) { - 1695 : 4473 : mptcp_subflow_delegate(subflow, + 1691 [ + + ]: 217504 : mptcp_for_each_subflow(msk, subflow) { + 1692 [ + + + + ]: 124334 : if (READ_ONCE(subflow->scheduled)) { + 1693 [ + - ]: 4806 : xmit_ssk = mptcp_subflow_tcp_sock(subflow); + 1694 [ + - ]: 4806 : if (xmit_ssk != ssk) { + 1695 : 4806 : mptcp_subflow_delegate(subflow, 1696 : : MPTCP_DELEGATE_SEND); - 1697 : 4473 : keep_pushing = false; + 1697 : 4806 : keep_pushing = false; 1698 : : } 1699 : : } 1700 : : } 1701 : : } 1702 : : - 1703 : 33323 : out: + 1703 : 42357 : out: 1704 : : /* __mptcp_alloc_tx_skb could have released some wmem and we are 1705 : : * not going to flush it via release_sock() 1706 : : */ - 1707 [ + + ]: 67977 : if (copied) { - 1708 [ - + ]: 33713 : tcp_push(ssk, 0, info.mss_now, tcp_sk(ssk)->nonagle, + 1707 [ + + ]: 84241 : if (copied) { + 1708 [ - + ]: 45055 : tcp_push(ssk, 0, info.mss_now, tcp_sk(ssk)->nonagle, 1709 : : info.size_goal); - 1710 [ + + ]: 33713 : if (!mptcp_rtx_timer_pending(sk)) - 1711 : 18 : mptcp_reset_rtx_timer(sk); + 1710 [ + + ]: 45055 : if (!mptcp_rtx_timer_pending(sk)) + 1711 : 39 : mptcp_reset_rtx_timer(sk); 1712 : : - 1713 [ + + + + ]: 33713 : if (msk->snd_data_fin_enable && - 1714 [ + + ]: 5929 : msk->snd_nxt + 1 == msk->write_seq) - 1715 : 323 : mptcp_schedule_work(sk); + 1713 [ + + + + ]: 45055 : if (msk->snd_data_fin_enable && + 1714 [ + + ]: 7498 : msk->snd_nxt + 1 == msk->write_seq) + 1715 : 367 : mptcp_schedule_work(sk); 1716 : : } - 1717 : 67977 : } + 1717 : 84241 : } 1718 : : 1719 : : static int mptcp_disconnect(struct sock *sk, int flags); 1720 : : @@ -1857,13 +1857,13 @@ 1774 : 82 : return ret; 1775 : : } 1776 : : - 1777 : 526558 : static int do_copy_data_nocache(struct sock *sk, int copy, + 1777 : 702776 : static int do_copy_data_nocache(struct sock *sk, int copy, 1778 : : struct iov_iter *from, char *to) 1779 : : { - 1780 [ - + ]: 526558 : if (sk->sk_route_caps & NETIF_F_NOCACHE_COPY) { + 1780 [ - + ]: 702776 : if (sk->sk_route_caps & NETIF_F_NOCACHE_COPY) { 1781 [ # # ]: 0 : if (!copy_from_iter_full_nocache(to, copy, from)) 1782 : 0 : return -EFAULT; - 1783 [ - + ]: 526558 : } else if (!copy_from_iter_full(to, copy, from)) { + 1783 [ - + ]: 702776 : } else if (!copy_from_iter_full(to, copy, from)) { 1784 : 0 : return -EFAULT; 1785 : : } 1786 : : return 0; @@ -1874,16 +1874,16 @@ 1791 : : * Called under the msk socket lock, so we can avoid a bunch of ONCE 1792 : : * annotations. 1793 : : */ - 1794 : 528904 : static u32 mptcp_send_limit(const struct sock *sk) + 1794 : 706004 : static u32 mptcp_send_limit(const struct sock *sk) 1795 : : { - 1796 [ - + ]: 528904 : const struct mptcp_sock *msk = mptcp_sk(sk); - 1797 : 528904 : u32 limit, not_sent; + 1796 [ - + ]: 706004 : const struct mptcp_sock *msk = mptcp_sk(sk); + 1797 : 706004 : u32 limit, not_sent; 1798 : : - 1799 [ + + ]: 528904 : if (sk->sk_wmem_queued >= READ_ONCE(sk->sk_sndbuf)) + 1799 [ + + ]: 706004 : if (sk->sk_wmem_queued >= READ_ONCE(sk->sk_sndbuf)) 1800 : : return 0; 1801 : : - 1802 : 526558 : limit = mptcp_notsent_lowat(sk); - 1803 [ - + ]: 526558 : if (limit == UINT_MAX) + 1802 : 702776 : limit = mptcp_notsent_lowat(sk); + 1803 [ - + ]: 702776 : if (limit == UINT_MAX) 1804 : : return UINT_MAX; 1805 : : 1806 : 0 : not_sent = msk->write_seq - msk->snd_nxt; @@ -1893,20 +1893,20 @@ 1810 : 0 : return limit - not_sent; 1811 : : } 1812 : : - 1813 : 449188 : static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) + 1813 : 582639 : static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) 1814 : : { - 1815 [ - + ]: 449188 : struct mptcp_sock *msk = mptcp_sk(sk); - 1816 : 449188 : struct page_frag *pfrag; - 1817 : 449188 : size_t copied = 0; - 1818 : 449188 : int ret = 0; - 1819 : 449188 : long timeo; + 1815 [ - + ]: 582639 : struct mptcp_sock *msk = mptcp_sk(sk); + 1816 : 582639 : struct page_frag *pfrag; + 1817 : 582639 : size_t copied = 0; + 1818 : 582639 : int ret = 0; + 1819 : 582639 : long timeo; 1820 : : 1821 : : /* silently ignore everything else */ - 1822 : 449188 : msg->msg_flags &= MSG_MORE | MSG_DONTWAIT | MSG_NOSIGNAL | MSG_FASTOPEN; + 1822 : 582639 : msg->msg_flags &= MSG_MORE | MSG_DONTWAIT | MSG_NOSIGNAL | MSG_FASTOPEN; 1823 : : - 1824 : 449188 : lock_sock(sk); + 1824 : 582639 : lock_sock(sk); 1825 : : - 1826 [ + + + + ]: 449188 : if (unlikely(inet_test_bit(DEFER_CONNECT, sk) || + 1826 [ + + + + ]: 582639 : if (unlikely(inet_test_bit(DEFER_CONNECT, sk) || 1827 : : msg->msg_flags & MSG_FASTOPEN)) { 1828 : 88 : int copied_syn = 0; 1829 : : @@ -1918,160 +1918,160 @@ 1835 : 24 : goto do_error; 1836 : : } 1837 : : - 1838 [ + + ]: 449122 : timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT); + 1838 [ + + ]: 582573 : timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT); 1839 : : - 1840 [ + + + + ]: 449122 : if ((1 << sk->sk_state) & ~(TCPF_ESTABLISHED | TCPF_CLOSE_WAIT)) { - 1841 : 53 : ret = sk_stream_wait_connect(sk, &timeo); - 1842 [ + - ]: 53 : if (ret) - 1843 : 53 : goto do_error; + 1840 [ + + + + ]: 582573 : if ((1 << sk->sk_state) & ~(TCPF_ESTABLISHED | TCPF_CLOSE_WAIT)) { + 1841 : 54 : ret = sk_stream_wait_connect(sk, &timeo); + 1842 [ + - ]: 54 : if (ret) + 1843 : 54 : goto do_error; 1844 : : } 1845 : : - 1846 : 449069 : ret = -EPIPE; - 1847 [ + - - + ]: 449069 : if (unlikely(sk->sk_err || (sk->sk_shutdown & SEND_SHUTDOWN))) + 1846 : 582519 : ret = -EPIPE; + 1847 [ + - - + ]: 582519 : if (unlikely(sk->sk_err || (sk->sk_shutdown & SEND_SHUTDOWN))) 1848 : 0 : goto do_error; 1849 : : - 1850 [ + - ]: 449069 : pfrag = sk_page_frag(sk); + 1850 [ + - ]: 582519 : pfrag = sk_page_frag(sk); 1851 : : - 1852 [ + + ]: 977973 : while (msg_data_left(msg)) { - 1853 : 528904 : int total_ts, frag_truesize = 0; - 1854 : 528904 : struct mptcp_data_frag *dfrag; - 1855 : 528904 : bool dfrag_collapsed; - 1856 : 528904 : size_t psize, offset; - 1857 : 528904 : u32 copy_limit; + 1852 [ + + ]: 1288523 : while (msg_data_left(msg)) { + 1853 : 706004 : int total_ts, frag_truesize = 0; + 1854 : 706004 : struct mptcp_data_frag *dfrag; + 1855 : 706004 : bool dfrag_collapsed; + 1856 : 706004 : size_t psize, offset; + 1857 : 706004 : u32 copy_limit; 1858 : : 1859 : : /* ensure fitting the notsent_lowat() constraint */ - 1860 : 528904 : copy_limit = mptcp_send_limit(sk); - 1861 [ + + ]: 528904 : if (!copy_limit) - 1862 : 2346 : goto wait_for_memory; + 1860 : 706004 : copy_limit = mptcp_send_limit(sk); + 1861 [ + + ]: 706004 : if (!copy_limit) + 1862 : 3228 : goto wait_for_memory; 1863 : : 1864 : : /* reuse tail pfrag, if possible, or carve a new one from the 1865 : : * page allocator 1866 : : */ - 1867 : 526558 : dfrag = mptcp_pending_tail(sk); - 1868 : 526558 : dfrag_collapsed = mptcp_frag_can_collapse_to(msk, pfrag, dfrag); - 1869 [ + + ]: 526558 : if (!dfrag_collapsed) { - 1870 [ - + ]: 400403 : if (!mptcp_page_frag_refill(sk, pfrag)) + 1867 : 702776 : dfrag = mptcp_pending_tail(sk); + 1868 : 702776 : dfrag_collapsed = mptcp_frag_can_collapse_to(msk, pfrag, dfrag); + 1869 [ + + ]: 702776 : if (!dfrag_collapsed) { + 1870 [ - + ]: 553219 : if (!mptcp_page_frag_refill(sk, pfrag)) 1871 : 0 : goto wait_for_memory; 1872 : : - 1873 : 400403 : dfrag = mptcp_carve_data_frag(msk, pfrag, pfrag->offset); - 1874 : 400403 : frag_truesize = dfrag->overhead; + 1873 : 553219 : dfrag = mptcp_carve_data_frag(msk, pfrag, pfrag->offset); + 1874 : 553219 : frag_truesize = dfrag->overhead; 1875 : : } 1876 : : 1877 : : /* we do not bound vs wspace, to allow a single packet. 1878 : : * memory accounting will prevent execessive memory usage 1879 : : * anyway 1880 : : */ - 1881 : 526558 : offset = dfrag->offset + dfrag->data_len; - 1882 : 526558 : psize = pfrag->size - offset; - 1883 : 526558 : psize = min_t(size_t, psize, msg_data_left(msg)); - 1884 : 526558 : psize = min_t(size_t, psize, copy_limit); - 1885 : 526558 : total_ts = psize + frag_truesize; + 1881 : 702776 : offset = dfrag->offset + dfrag->data_len; + 1882 : 702776 : psize = pfrag->size - offset; + 1883 : 702776 : psize = min_t(size_t, psize, msg_data_left(msg)); + 1884 : 702776 : psize = min_t(size_t, psize, copy_limit); + 1885 : 702776 : total_ts = psize + frag_truesize; 1886 : : - 1887 [ - + ]: 526558 : if (!sk_wmem_schedule(sk, total_ts)) + 1887 [ - + ]: 702776 : if (!sk_wmem_schedule(sk, total_ts)) 1888 : 0 : goto wait_for_memory; 1889 : : - 1890 : 788263 : ret = do_copy_data_nocache(sk, psize, &msg->msg_iter, - 1891 : 526558 : page_address(dfrag->page) + offset); - 1892 [ - + ]: 526558 : if (ret) + 1890 : 964376 : ret = do_copy_data_nocache(sk, psize, &msg->msg_iter, + 1891 : 702776 : page_address(dfrag->page) + offset); + 1892 [ - + ]: 702776 : if (ret) 1893 : 0 : goto do_error; 1894 : : 1895 : : /* data successfully copied into the write queue */ - 1896 [ + + ]: 526558 : sk_forward_alloc_add(sk, -total_ts); - 1897 : 526558 : copied += psize; - 1898 : 526558 : dfrag->data_len += psize; - 1899 : 526558 : frag_truesize += psize; - 1900 : 526558 : pfrag->offset += frag_truesize; - 1901 : 526558 : WRITE_ONCE(msk->write_seq, msk->write_seq + psize); + 1896 [ + + ]: 702776 : sk_forward_alloc_add(sk, -total_ts); + 1897 : 702776 : copied += psize; + 1898 : 702776 : dfrag->data_len += psize; + 1899 : 702776 : frag_truesize += psize; + 1900 : 702776 : pfrag->offset += frag_truesize; + 1901 : 702776 : WRITE_ONCE(msk->write_seq, msk->write_seq + psize); 1902 : : 1903 : : /* charge data on mptcp pending queue to the msk socket 1904 : : * Note: we charge such data both to sk and ssk 1905 : : */ - 1906 [ + + ]: 526558 : sk_wmem_queued_add(sk, frag_truesize); - 1907 [ + + ]: 526558 : if (!dfrag_collapsed) { - 1908 : 400403 : get_page(dfrag->page); - 1909 [ + + ]: 400403 : list_add_tail(&dfrag->list, &msk->rtx_queue); - 1910 [ + + ]: 400403 : if (!msk->first_pending) - 1911 : 323920 : WRITE_ONCE(msk->first_pending, dfrag); + 1906 [ + + ]: 702776 : sk_wmem_queued_add(sk, frag_truesize); + 1907 [ + + ]: 702776 : if (!dfrag_collapsed) { + 1908 : 553219 : get_page(dfrag->page); + 1909 [ + + ]: 553219 : list_add_tail(&dfrag->list, &msk->rtx_queue); + 1910 [ + + ]: 553219 : if (!msk->first_pending) + 1911 : 434299 : WRITE_ONCE(msk->first_pending, dfrag); 1912 : : } - 1913 [ - + ]: 526558 : pr_debug("msk=%p dfrag at seq=%llu len=%u sent=%u new=%d\n", msk, + 1913 [ - + ]: 702776 : pr_debug("msk=%p dfrag at seq=%llu len=%u sent=%u new=%d\n", msk, 1914 : : dfrag->data_seq, dfrag->data_len, dfrag->already_sent, 1915 : : !dfrag_collapsed); 1916 : : - 1917 : 526558 : continue; + 1917 : 702776 : continue; 1918 : : - 1919 : 2346 : wait_for_memory: - 1920 : 2346 : set_bit(SOCK_NOSPACE, &sk->sk_socket->flags); - 1921 : 2346 : __mptcp_push_pending(sk, msg->msg_flags); - 1922 : 2346 : ret = sk_stream_wait_memory(sk, &timeo); - 1923 [ - + ]: 2346 : if (ret) + 1919 : 3228 : wait_for_memory: + 1920 : 3228 : set_bit(SOCK_NOSPACE, &sk->sk_socket->flags); + 1921 : 3228 : __mptcp_push_pending(sk, msg->msg_flags); + 1922 : 3228 : ret = sk_stream_wait_memory(sk, &timeo); + 1923 [ - + ]: 3228 : if (ret) 1924 : 0 : goto do_error; 1925 : : } 1926 : : - 1927 [ + + ]: 449069 : if (copied) - 1928 : 449045 : __mptcp_push_pending(sk, msg->msg_flags); + 1927 [ + + ]: 582519 : if (copied) + 1928 : 582495 : __mptcp_push_pending(sk, msg->msg_flags); 1929 : : 1930 : 24 : out: - 1931 : 449188 : release_sock(sk); - 1932 : 449188 : return copied; + 1931 : 582639 : release_sock(sk); + 1932 : 582639 : return copied; 1933 : : - 1934 : 77 : do_error: - 1935 [ - + ]: 77 : if (copied) + 1934 : 78 : do_error: + 1935 [ - + ]: 78 : if (copied) 1936 : 0 : goto out; 1937 : : - 1938 : 77 : copied = sk_stream_error(sk, msg->msg_flags, ret); - 1939 : 77 : goto out; + 1938 : 78 : copied = sk_stream_error(sk, msg->msg_flags, ret); + 1939 : 78 : goto out; 1940 : : } 1941 : : - 1942 : 737581 : static int __mptcp_recvmsg_mskq(struct mptcp_sock *msk, + 1942 : 1001533 : static int __mptcp_recvmsg_mskq(struct mptcp_sock *msk, 1943 : : struct msghdr *msg, 1944 : : size_t len, int flags, 1945 : : struct scm_timestamping_internal *tss, 1946 : : int *cmsg_flags) 1947 : : { - 1948 : 737581 : struct sk_buff *skb, *tmp; - 1949 : 737581 : int copied = 0; + 1948 : 1001533 : struct sk_buff *skb, *tmp; + 1949 : 1001533 : int copied = 0; 1950 : : - 1951 [ + + ]: 895006 : skb_queue_walk_safe(&msk->receive_queue, skb, tmp) { - 1952 : 631937 : u32 offset = MPTCP_SKB_CB(skb)->offset; - 1953 : 631937 : u32 data_len = skb->len - offset; - 1954 : 631937 : u32 count = min_t(size_t, len - copied, data_len); - 1955 : 631937 : int err; + 1951 [ + + ]: 1238114 : skb_queue_walk_safe(&msk->receive_queue, skb, tmp) { + 1952 : 857014 : u32 offset = MPTCP_SKB_CB(skb)->offset; + 1953 : 857014 : u32 data_len = skb->len - offset; + 1954 : 857014 : u32 count = min_t(size_t, len - copied, data_len); + 1955 : 857014 : int err; 1956 : : - 1957 [ + - ]: 631937 : if (!(flags & MSG_TRUNC)) { - 1958 : 631937 : err = skb_copy_datagram_msg(skb, offset, msg, count); - 1959 [ - + ]: 631937 : if (unlikely(err < 0)) { + 1957 [ + - ]: 857014 : if (!(flags & MSG_TRUNC)) { + 1958 : 857014 : err = skb_copy_datagram_msg(skb, offset, msg, count); + 1959 [ - + ]: 857014 : if (unlikely(err < 0)) { 1960 [ # # ]: 0 : if (!copied) 1961 : 0 : return err; 1962 : : break; 1963 : : } 1964 : : } 1965 : : - 1966 [ + + ]: 631937 : if (MPTCP_SKB_CB(skb)->has_rxtstamp) { - 1967 : 598 : tcp_update_recv_tstamps(skb, tss); - 1968 : 598 : *cmsg_flags |= MPTCP_CMSG_TS; + 1966 [ + + ]: 857014 : if (MPTCP_SKB_CB(skb)->has_rxtstamp) { + 1967 : 596 : tcp_update_recv_tstamps(skb, tss); + 1968 : 596 : *cmsg_flags |= MPTCP_CMSG_TS; 1969 : : } 1970 : : - 1971 : 631937 : copied += count; + 1971 : 857014 : copied += count; 1972 : : - 1973 [ + + ]: 631937 : if (count < data_len) { - 1974 [ + + ]: 414457 : if (!(flags & MSG_PEEK)) { - 1975 : 395789 : MPTCP_SKB_CB(skb)->offset += count; - 1976 : 395789 : MPTCP_SKB_CB(skb)->map_seq += count; - 1977 : 395789 : msk->bytes_consumed += count; + 1973 [ + + ]: 857014 : if (count < data_len) { + 1974 [ + + ]: 541463 : if (!(flags & MSG_PEEK)) { + 1975 : 512886 : MPTCP_SKB_CB(skb)->offset += count; + 1976 : 512886 : MPTCP_SKB_CB(skb)->map_seq += count; + 1977 : 512886 : msk->bytes_consumed += count; 1978 : : } 1979 : : break; 1980 : : } 1981 : : - 1982 [ + + ]: 217480 : if (!(flags & MSG_PEEK)) { + 1982 [ + + ]: 315551 : if (!(flags & MSG_PEEK)) { 1983 : : /* we will bulk release the skb memory later */ - 1984 : 215429 : skb->destructor = NULL; - 1985 : 215429 : WRITE_ONCE(msk->rmem_released, msk->rmem_released + skb->truesize); - 1986 : 215429 : __skb_unlink(skb, &msk->receive_queue); - 1987 : 215429 : __kfree_skb(skb); - 1988 : 215429 : msk->bytes_consumed += count; + 1984 : 311727 : skb->destructor = NULL; + 1985 : 311727 : WRITE_ONCE(msk->rmem_released, msk->rmem_released + skb->truesize); + 1986 : 311727 : __skb_unlink(skb, &msk->receive_queue); + 1987 : 311727 : __kfree_skb(skb); + 1988 : 311727 : msk->bytes_consumed += count; 1989 : : } 1990 : : - 1991 [ + + ]: 217480 : if (copied >= len) + 1991 [ + + ]: 315551 : if (copied >= len) 1992 : : break; 1993 : : } 1994 : : @@ -2082,170 +2082,170 @@ 1999 : : * 2000 : : * Only difference: Use highest rtt estimate of the subflows in use. 2001 : : */ - 2002 : 600431 : static void mptcp_rcv_space_adjust(struct mptcp_sock *msk, int copied) + 2002 : 792233 : static void mptcp_rcv_space_adjust(struct mptcp_sock *msk, int copied) 2003 : : { - 2004 : 600431 : struct mptcp_subflow_context *subflow; - 2005 : 600431 : struct sock *sk = (struct sock *)msk; - 2006 : 600431 : u8 scaling_ratio = U8_MAX; - 2007 : 600431 : u32 time, advmss = 1; - 2008 : 600431 : u64 rtt_us, mstamp; + 2004 : 792233 : struct mptcp_subflow_context *subflow; + 2005 : 792233 : struct sock *sk = (struct sock *)msk; + 2006 : 792233 : u8 scaling_ratio = U8_MAX; + 2007 : 792233 : u32 time, advmss = 1; + 2008 : 792233 : u64 rtt_us, mstamp; 2009 : : - 2010 : 600431 : msk_owned_by_me(msk); + 2010 : 792233 : msk_owned_by_me(msk); 2011 : : - 2012 [ + + ]: 600431 : if (copied <= 0) + 2012 [ + + ]: 792233 : if (copied <= 0) 2013 : : return; 2014 : : - 2015 [ - + ]: 574024 : if (!msk->rcvspace_init) + 2015 [ - + ]: 761486 : if (!msk->rcvspace_init) 2016 : 0 : mptcp_rcv_space_init(msk, msk->first); 2017 : : - 2018 : 574024 : msk->rcvq_space.copied += copied; + 2018 : 761486 : msk->rcvq_space.copied += copied; 2019 : : - 2020 [ + + ]: 574024 : mstamp = div_u64(tcp_clock_ns(), NSEC_PER_USEC); - 2021 [ + + ]: 574024 : time = tcp_stamp_us_delta(mstamp, msk->rcvq_space.time); + 2020 [ + + ]: 761486 : mstamp = div_u64(tcp_clock_ns(), NSEC_PER_USEC); + 2021 [ + + ]: 761486 : time = tcp_stamp_us_delta(mstamp, msk->rcvq_space.time); 2022 : : - 2023 : 574024 : rtt_us = msk->rcvq_space.rtt_us; - 2024 [ + + + + ]: 574024 : if (rtt_us && time < (rtt_us >> 3)) + 2023 : 761486 : rtt_us = msk->rcvq_space.rtt_us; + 2024 [ + + + + ]: 761486 : if (rtt_us && time < (rtt_us >> 3)) 2025 : : return; 2026 : : - 2027 : 60056 : rtt_us = 0; - 2028 [ + + ]: 139538 : mptcp_for_each_subflow(msk, subflow) { - 2029 : 79482 : const struct tcp_sock *tp; - 2030 : 79482 : u64 sf_rtt_us; - 2031 : 79482 : u32 sf_advmss; + 2027 : 94494 : rtt_us = 0; + 2028 [ + + ]: 209379 : mptcp_for_each_subflow(msk, subflow) { + 2029 : 114885 : const struct tcp_sock *tp; + 2030 : 114885 : u64 sf_rtt_us; + 2031 : 114885 : u32 sf_advmss; 2032 : : - 2033 [ - + ]: 79482 : tp = tcp_sk(mptcp_subflow_tcp_sock(subflow)); + 2033 [ - + ]: 114885 : tp = tcp_sk(mptcp_subflow_tcp_sock(subflow)); 2034 : : - 2035 : 79482 : sf_rtt_us = READ_ONCE(tp->rcv_rtt_est.rtt_us); - 2036 : 79482 : sf_advmss = READ_ONCE(tp->advmss); + 2035 : 114885 : sf_rtt_us = READ_ONCE(tp->rcv_rtt_est.rtt_us); + 2036 : 114885 : sf_advmss = READ_ONCE(tp->advmss); 2037 : : - 2038 : 79482 : rtt_us = max(sf_rtt_us, rtt_us); - 2039 : 79482 : advmss = max(sf_advmss, advmss); - 2040 : 79482 : scaling_ratio = min(tp->scaling_ratio, scaling_ratio); + 2038 : 114885 : rtt_us = max(sf_rtt_us, rtt_us); + 2039 : 114885 : advmss = max(sf_advmss, advmss); + 2040 : 114885 : scaling_ratio = min(tp->scaling_ratio, scaling_ratio); 2041 : : } 2042 : : - 2043 : 60056 : msk->rcvq_space.rtt_us = rtt_us; - 2044 : 60056 : msk->scaling_ratio = scaling_ratio; - 2045 [ + + + + ]: 60056 : if (time < (rtt_us >> 3) || rtt_us == 0) + 2043 : 94494 : msk->rcvq_space.rtt_us = rtt_us; + 2044 : 94494 : msk->scaling_ratio = scaling_ratio; + 2045 [ + + + + ]: 94494 : if (time < (rtt_us >> 3) || rtt_us == 0) 2046 : : return; 2047 : : - 2048 [ + + ]: 47553 : if (msk->rcvq_space.copied <= msk->rcvq_space.space) - 2049 : 44642 : goto new_measure; + 2048 [ + + ]: 81692 : if (msk->rcvq_space.copied <= msk->rcvq_space.space) + 2049 : 78444 : goto new_measure; 2050 : : - 2051 [ + - ]: 2911 : if (READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_moderate_rcvbuf) && - 2052 [ + - ]: 2911 : !(sk->sk_userlocks & SOCK_RCVBUF_LOCK)) { - 2053 : 2911 : u64 rcvwin, grow; - 2054 : 2911 : int rcvbuf; + 2051 [ + - ]: 3248 : if (READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_moderate_rcvbuf) && + 2052 [ + - ]: 3248 : !(sk->sk_userlocks & SOCK_RCVBUF_LOCK)) { + 2053 : 3248 : u64 rcvwin, grow; + 2054 : 3248 : int rcvbuf; 2055 : : - 2056 : 2911 : rcvwin = ((u64)msk->rcvq_space.copied << 1) + 16 * advmss; + 2056 : 3248 : rcvwin = ((u64)msk->rcvq_space.copied << 1) + 16 * advmss; 2057 : : - 2058 : 2911 : grow = rcvwin * (msk->rcvq_space.copied - msk->rcvq_space.space); + 2058 : 3248 : grow = rcvwin * (msk->rcvq_space.copied - msk->rcvq_space.space); 2059 : : - 2060 : 2911 : do_div(grow, msk->rcvq_space.space); - 2061 : 2911 : rcvwin += (grow << 1); + 2060 : 3248 : do_div(grow, msk->rcvq_space.space); + 2061 : 3248 : rcvwin += (grow << 1); 2062 : : - 2063 [ + + ]: 2911 : rcvbuf = min_t(u64, mptcp_space_from_win(sk, rcvwin), + 2063 [ + + ]: 3248 : rcvbuf = min_t(u64, mptcp_space_from_win(sk, rcvwin), 2064 : : READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_rmem[2])); 2065 : : - 2066 [ + + ]: 2911 : if (rcvbuf > sk->sk_rcvbuf) { - 2067 : 1129 : u32 window_clamp; + 2066 [ + + ]: 3248 : if (rcvbuf > sk->sk_rcvbuf) { + 2067 : 1202 : u32 window_clamp; 2068 : : - 2069 : 1129 : window_clamp = mptcp_win_from_space(sk, rcvbuf); - 2070 : 1129 : WRITE_ONCE(sk->sk_rcvbuf, rcvbuf); + 2069 : 1202 : window_clamp = mptcp_win_from_space(sk, rcvbuf); + 2070 : 1202 : WRITE_ONCE(sk->sk_rcvbuf, rcvbuf); 2071 : : 2072 : : /* Make subflows follow along. If we do not do this, we 2073 : : * get drops at subflow level if skbs can't be moved to 2074 : : * the mptcp rx queue fast enough (announced rcv_win can 2075 : : * exceed ssk->sk_rcvbuf). 2076 : : */ - 2077 [ + + ]: 2403 : mptcp_for_each_subflow(msk, subflow) { - 2078 : 1274 : struct sock *ssk; - 2079 : 1274 : bool slow; + 2077 [ + + ]: 2549 : mptcp_for_each_subflow(msk, subflow) { + 2078 : 1347 : struct sock *ssk; + 2079 : 1347 : bool slow; 2080 : : - 2081 : 1274 : ssk = mptcp_subflow_tcp_sock(subflow); - 2082 : 1274 : slow = lock_sock_fast(ssk); - 2083 : 1274 : WRITE_ONCE(ssk->sk_rcvbuf, rcvbuf); - 2084 [ - + ]: 1274 : WRITE_ONCE(tcp_sk(ssk)->window_clamp, window_clamp); - 2085 [ + + ]: 1274 : if (tcp_can_send_ack(ssk)) - 2086 : 1271 : tcp_cleanup_rbuf(ssk, 1); - 2087 : 1274 : unlock_sock_fast(ssk, slow); + 2081 : 1347 : ssk = mptcp_subflow_tcp_sock(subflow); + 2082 : 1347 : slow = lock_sock_fast(ssk); + 2083 : 1347 : WRITE_ONCE(ssk->sk_rcvbuf, rcvbuf); + 2084 [ - + ]: 1347 : WRITE_ONCE(tcp_sk(ssk)->window_clamp, window_clamp); + 2085 [ + + ]: 1347 : if (tcp_can_send_ack(ssk)) + 2086 : 1341 : tcp_cleanup_rbuf(ssk, 1); + 2087 : 1347 : unlock_sock_fast(ssk, slow); 2088 : : } 2089 : : } 2090 : : } 2091 : : - 2092 : 2911 : msk->rcvq_space.space = msk->rcvq_space.copied; - 2093 : 47553 : new_measure: - 2094 : 47553 : msk->rcvq_space.copied = 0; - 2095 : 47553 : msk->rcvq_space.time = mstamp; + 2092 : 3248 : msk->rcvq_space.space = msk->rcvq_space.copied; + 2093 : 81692 : new_measure: + 2094 : 81692 : msk->rcvq_space.copied = 0; + 2095 : 81692 : msk->rcvq_space.time = mstamp; 2096 : : } 2097 : : - 2098 : 1285907 : static void __mptcp_update_rmem(struct sock *sk) + 2098 : 1694165 : static void __mptcp_update_rmem(struct sock *sk) 2099 : : { - 2100 [ - + ]: 1285907 : struct mptcp_sock *msk = mptcp_sk(sk); + 2100 [ - + ]: 1694165 : struct mptcp_sock *msk = mptcp_sk(sk); 2101 : : - 2102 [ + + ]: 1285907 : if (!msk->rmem_released) + 2102 [ + + ]: 1694165 : if (!msk->rmem_released) 2103 : : return; 2104 : : - 2105 : 201902 : atomic_sub(msk->rmem_released, &sk->sk_rmem_alloc); - 2106 : 201902 : mptcp_rmem_uncharge(sk, msk->rmem_released); - 2107 : 201902 : WRITE_ONCE(msk->rmem_released, 0); + 2105 : 291858 : atomic_sub(msk->rmem_released, &sk->sk_rmem_alloc); + 2106 : 291858 : mptcp_rmem_uncharge(sk, msk->rmem_released); + 2107 : 291858 : WRITE_ONCE(msk->rmem_released, 0); 2108 : : } 2109 : : - 2110 : 194183 : static void __mptcp_splice_receive_queue(struct sock *sk) + 2110 : 271338 : static void __mptcp_splice_receive_queue(struct sock *sk) 2111 : : { - 2112 [ - + ]: 194183 : struct mptcp_sock *msk = mptcp_sk(sk); + 2112 [ - + ]: 271338 : struct mptcp_sock *msk = mptcp_sk(sk); 2113 : : - 2114 : 194183 : skb_queue_splice_tail_init(&sk->sk_receive_queue, &msk->receive_queue); - 2115 : 194183 : } + 2114 : 271338 : skb_queue_splice_tail_init(&sk->sk_receive_queue, &msk->receive_queue); + 2115 : 271338 : } 2116 : : - 2117 : 305261 : static bool __mptcp_move_skbs(struct mptcp_sock *msk) + 2117 : 438671 : static bool __mptcp_move_skbs(struct mptcp_sock *msk) 2118 : : { - 2119 : 305261 : struct sock *sk = (struct sock *)msk; - 2120 : 305261 : unsigned int moved = 0; - 2121 : 305261 : bool ret, done; + 2119 : 438671 : struct sock *sk = (struct sock *)msk; + 2120 : 438671 : unsigned int moved = 0; + 2121 : 438671 : bool ret, done; 2122 : : - 2123 : 305302 : do { - 2124 : 305302 : struct sock *ssk = mptcp_subflow_recv_lookup(msk); - 2125 : 305302 : bool slowpath; + 2123 : 438720 : do { + 2124 : 438720 : struct sock *ssk = mptcp_subflow_recv_lookup(msk); + 2125 : 438720 : bool slowpath; 2126 : : 2127 : : /* we can have data pending in the subflows only if the msk 2128 : : * receive buffer was full at subflow_data_ready() time, 2129 : : * that is an unlikely slow path. 2130 : : */ - 2131 [ + + ]: 305302 : if (likely(!ssk)) + 2131 [ + + ]: 438720 : if (likely(!ssk)) 2132 : : break; 2133 : : - 2134 : 469 : slowpath = lock_sock_fast(ssk); - 2135 : 469 : mptcp_data_lock(sk); - 2136 : 469 : __mptcp_update_rmem(sk); - 2137 : 469 : done = __mptcp_move_skbs_from_subflow(msk, ssk, &moved); - 2138 : 469 : mptcp_data_unlock(sk); + 2134 : 703 : slowpath = lock_sock_fast(ssk); + 2135 : 703 : mptcp_data_lock(sk); + 2136 : 703 : __mptcp_update_rmem(sk); + 2137 : 703 : done = __mptcp_move_skbs_from_subflow(msk, ssk, &moved); + 2138 : 703 : mptcp_data_unlock(sk); 2139 : : - 2140 [ - + ]: 469 : if (unlikely(ssk->sk_err)) + 2140 [ - + ]: 703 : if (unlikely(ssk->sk_err)) 2141 : 0 : __mptcp_error_report(sk); - 2142 : 469 : unlock_sock_fast(ssk, slowpath); - 2143 [ + + ]: 469 : } while (!done); + 2142 : 703 : unlock_sock_fast(ssk, slowpath); + 2143 [ + + ]: 703 : } while (!done); 2144 : : 2145 : : /* acquire the data lock only if some input data is pending */ - 2146 : 305261 : ret = moved > 0; - 2147 [ + + + + ]: 305261 : if (!RB_EMPTY_ROOT(&msk->out_of_order_queue) || - 2148 [ + + ]: 224127 : !skb_queue_empty_lockless(&sk->sk_receive_queue)) { - 2149 : 194183 : mptcp_data_lock(sk); - 2150 : 194183 : __mptcp_update_rmem(sk); - 2151 : 194183 : ret |= __mptcp_ofo_queue(msk); - 2152 : 194183 : __mptcp_splice_receive_queue(sk); - 2153 : 194183 : mptcp_data_unlock(sk); + 2146 : 438671 : ret = moved > 0; + 2147 [ + + + + ]: 438671 : if (!RB_EMPTY_ROOT(&msk->out_of_order_queue) || + 2148 [ + + ]: 351258 : !skb_queue_empty_lockless(&sk->sk_receive_queue)) { + 2149 : 271338 : mptcp_data_lock(sk); + 2150 : 271338 : __mptcp_update_rmem(sk); + 2151 : 271338 : ret |= __mptcp_ofo_queue(msk); + 2152 : 271338 : __mptcp_splice_receive_queue(sk); + 2153 : 271338 : mptcp_data_unlock(sk); 2154 : : } - 2155 [ + + ]: 305261 : if (ret) - 2156 : 40 : mptcp_check_data_fin((struct sock *)msk); - 2157 : 305261 : return !skb_queue_empty(&msk->receive_queue); + 2155 [ + + ]: 438671 : if (ret) + 2156 : 45 : mptcp_check_data_fin((struct sock *)msk); + 2157 : 438671 : return !skb_queue_empty(&msk->receive_queue); 2158 : : } 2159 : : - 2160 : 432 : static unsigned int mptcp_inq_hint(const struct sock *sk) + 2160 : 429 : static unsigned int mptcp_inq_hint(const struct sock *sk) 2161 : : { - 2162 [ - + ]: 432 : const struct mptcp_sock *msk = mptcp_sk(sk); - 2163 : 432 : const struct sk_buff *skb; + 2162 [ - + ]: 429 : const struct mptcp_sock *msk = mptcp_sk(sk); + 2163 : 429 : const struct sk_buff *skb; 2164 : : - 2165 [ - + ]: 432 : skb = skb_peek(&msk->receive_queue); + 2165 [ - + ]: 429 : skb = skb_peek(&msk->receive_queue); 2166 [ # # ]: 0 : if (skb) { 2167 : 0 : u64 hint_val = READ_ONCE(msk->ack_seq) - MPTCP_SKB_CB(skb)->map_seq; 2168 : : @@ -2255,64 +2255,64 @@ 2172 : 0 : return (unsigned int)hint_val; 2173 : : } 2174 : : - 2175 [ + + + + ]: 432 : if (sk->sk_state == TCP_CLOSE || (sk->sk_shutdown & RCV_SHUTDOWN)) + 2175 [ + + - + ]: 429 : if (sk->sk_state == TCP_CLOSE || (sk->sk_shutdown & RCV_SHUTDOWN)) 2176 : 8 : return 1; 2177 : : 2178 : : return 0; 2179 : : } 2180 : : - 2181 : 575461 : static int mptcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, + 2181 : 762922 : static int mptcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, 2182 : : int flags, int *addr_len) 2183 : : { - 2184 [ - + ]: 575461 : struct mptcp_sock *msk = mptcp_sk(sk); - 2185 : 575461 : struct scm_timestamping_internal tss; - 2186 : 575461 : int copied = 0, cmsg_flags = 0; - 2187 : 575461 : int target; - 2188 : 575461 : long timeo; + 2184 [ - + ]: 762922 : struct mptcp_sock *msk = mptcp_sk(sk); + 2185 : 762922 : struct scm_timestamping_internal tss; + 2186 : 762922 : int copied = 0, cmsg_flags = 0; + 2187 : 762922 : int target; + 2188 : 762922 : long timeo; 2189 : : 2190 : : /* MSG_ERRQUEUE is really a no-op till we support IP_RECVERR */ - 2191 [ - + ]: 575461 : if (unlikely(flags & MSG_ERRQUEUE)) + 2191 [ - + ]: 762922 : if (unlikely(flags & MSG_ERRQUEUE)) 2192 : 0 : return inet_recv_error(sk, msg, len, addr_len); 2193 : : - 2194 : 575461 : lock_sock(sk); - 2195 [ - + ]: 575461 : if (unlikely(sk->sk_state == TCP_LISTEN)) { + 2194 : 762922 : lock_sock(sk); + 2195 [ - + ]: 762922 : if (unlikely(sk->sk_state == TCP_LISTEN)) { 2196 : 0 : copied = -ENOTCONN; 2197 : 0 : goto out_err; 2198 : : } 2199 : : - 2200 [ + + ]: 575461 : timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT); + 2200 [ + + ]: 762922 : timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT); 2201 : : - 2202 : 575461 : len = min_t(size_t, len, INT_MAX); - 2203 [ + - ]: 575461 : target = sock_rcvlowat(sk, flags & MSG_WAITALL, len); + 2202 : 762922 : len = min_t(size_t, len, INT_MAX); + 2203 [ + - ]: 762922 : target = sock_rcvlowat(sk, flags & MSG_WAITALL, len); 2204 : : - 2205 [ + + ]: 575461 : if (unlikely(msk->recvmsg_inq)) - 2206 : 432 : cmsg_flags = MPTCP_CMSG_INQ; + 2205 [ + + ]: 762922 : if (unlikely(msk->recvmsg_inq)) + 2206 : 429 : cmsg_flags = MPTCP_CMSG_INQ; 2207 : : - 2208 [ + + ]: 754118 : while (copied < len) { - 2209 : 737581 : int err, bytes_read; + 2208 [ + + ]: 1020004 : while (copied < len) { + 2209 : 1001533 : int err, bytes_read; 2210 : : - 2211 : 737581 : bytes_read = __mptcp_recvmsg_mskq(msk, msg, len - copied, flags, &tss, &cmsg_flags); - 2212 [ - + ]: 737581 : if (unlikely(bytes_read < 0)) { + 2211 : 1001533 : bytes_read = __mptcp_recvmsg_mskq(msk, msg, len - copied, flags, &tss, &cmsg_flags); + 2212 [ - + ]: 1001533 : if (unlikely(bytes_read < 0)) { 2213 [ # # ]: 0 : if (!copied) 2214 : 0 : copied = bytes_read; 2215 : 0 : goto out_err; 2216 : : } 2217 : : - 2218 : 737581 : copied += bytes_read; + 2218 : 1001533 : copied += bytes_read; 2219 : : 2220 : : /* be sure to advertise window change */ - 2221 : 737581 : mptcp_cleanup_rbuf(msk); + 2221 : 1001533 : mptcp_cleanup_rbuf(msk); 2222 : : - 2223 [ + + + + ]: 737581 : if (skb_queue_empty(&msk->receive_queue) && __mptcp_move_skbs(msk)) - 2224 : 153687 : continue; + 2223 [ + + + + ]: 1001533 : if (skb_queue_empty(&msk->receive_queue) && __mptcp_move_skbs(msk)) + 2224 : 227771 : continue; 2225 : : 2226 : : /* only the MPTCP socket status is relevant here. The exit 2227 : : * conditions mirror closely tcp_recvmsg() 2228 : : */ - 2229 [ + + ]: 583894 : if (copied >= target) + 2229 [ + + ]: 773762 : if (copied >= target) 2230 : : break; 2231 : : - 2232 [ - + ]: 26395 : if (copied) { + 2232 [ - + ]: 30735 : if (copied) { 2233 [ # # ]: 0 : if (sk->sk_err || 2234 [ # # ]: 0 : sk->sk_state == TCP_CLOSE || 2235 [ # # ]: 0 : (sk->sk_shutdown & RCV_SHUTDOWN) || @@ -2320,87 +2320,87 @@ 2237 : 0 : signal_pending(current)) 2238 : : break; 2239 : : } else { - 2240 [ + + ]: 26395 : if (sk->sk_err) { - 2241 : 3 : copied = sock_error(sk); - 2242 : 3 : break; + 2240 [ + + ]: 30735 : if (sk->sk_err) { + 2241 : 4 : copied = sock_error(sk); + 2242 : 4 : break; 2243 : : } 2244 : : - 2245 [ + + ]: 26392 : if (sk->sk_shutdown & RCV_SHUTDOWN) { + 2245 [ + + ]: 30731 : if (sk->sk_shutdown & RCV_SHUTDOWN) { 2246 : : /* race breaker: the shutdown could be after the 2247 : : * previous receive queue check 2248 : : */ - 2249 [ - + ]: 1403 : if (__mptcp_move_skbs(msk)) + 2249 [ - + ]: 1402 : if (__mptcp_move_skbs(msk)) 2250 : 0 : continue; 2251 : : break; 2252 : : } 2253 : : - 2254 [ + + ]: 24989 : if (sk->sk_state == TCP_CLOSE) { + 2254 [ + + ]: 29329 : if (sk->sk_state == TCP_CLOSE) { 2255 : : copied = -ENOTCONN; 2256 : : break; 2257 : : } 2258 : : - 2259 [ + - ]: 24971 : if (!timeo) { + 2259 [ + - ]: 29311 : if (!timeo) { 2260 : : copied = -EAGAIN; 2261 : : break; 2262 : : } 2263 : : - 2264 [ + + ]: 24971 : if (signal_pending(current)) { - 2265 [ - + ]: 1 : copied = sock_intr_errno(timeo); + 2264 [ - + ]: 29311 : if (signal_pending(current)) { + 2265 [ # # ]: 0 : copied = sock_intr_errno(timeo); 2266 : : break; 2267 : : } 2268 : : } 2269 : : - 2270 [ - + ]: 24970 : pr_debug("block timeout %ld\n", timeo); - 2271 : 24970 : mptcp_rcv_space_adjust(msk, copied); - 2272 : 24970 : err = sk_wait_data(sk, &timeo, NULL); - 2273 [ - + ]: 24970 : if (err < 0) { + 2270 [ - + ]: 29311 : pr_debug("block timeout %ld\n", timeo); + 2271 : 29311 : mptcp_rcv_space_adjust(msk, copied); + 2272 : 29311 : err = sk_wait_data(sk, &timeo, NULL); + 2273 [ - + ]: 29311 : if (err < 0) { 2274 : 0 : err = copied ? : err; 2275 : 0 : goto out_err; 2276 : : } 2277 : : } 2278 : : - 2279 : 575461 : mptcp_rcv_space_adjust(msk, copied); + 2279 : 762922 : mptcp_rcv_space_adjust(msk, copied); 2280 : : - 2281 : 575461 : out_err: - 2282 [ + + + - ]: 575461 : if (cmsg_flags && copied >= 0) { - 2283 [ + + ]: 582 : if (cmsg_flags & MPTCP_CMSG_TS) - 2284 : 574 : tcp_recv_timestamp(msg, sk, &tss); + 2281 : 762922 : out_err: + 2282 [ + + + - ]: 762922 : if (cmsg_flags && copied >= 0) { + 2283 [ + + ]: 579 : if (cmsg_flags & MPTCP_CMSG_TS) + 2284 : 571 : tcp_recv_timestamp(msg, sk, &tss); 2285 : : - 2286 [ + + ]: 582 : if (cmsg_flags & MPTCP_CMSG_INQ) { - 2287 : 432 : unsigned int inq = mptcp_inq_hint(sk); + 2286 [ + + ]: 579 : if (cmsg_flags & MPTCP_CMSG_INQ) { + 2287 : 429 : unsigned int inq = mptcp_inq_hint(sk); 2288 : : - 2289 : 432 : put_cmsg(msg, SOL_TCP, TCP_CM_INQ, sizeof(inq), &inq); + 2289 : 429 : put_cmsg(msg, SOL_TCP, TCP_CM_INQ, sizeof(inq), &inq); 2290 : : } 2291 : : } 2292 : : - 2293 [ - + ]: 575461 : pr_debug("msk=%p rx queue empty=%d:%d copied=%d\n", + 2293 [ - + ]: 762922 : pr_debug("msk=%p rx queue empty=%d:%d copied=%d\n", 2294 : : msk, skb_queue_empty_lockless(&sk->sk_receive_queue), 2295 : : skb_queue_empty(&msk->receive_queue), copied); 2296 : : - 2297 : 575461 : release_sock(sk); - 2298 : 575461 : return copied; + 2297 : 762922 : release_sock(sk); + 2298 : 762922 : return copied; 2299 : : } 2300 : : - 2301 : 6998 : static void mptcp_retransmit_timer(struct timer_list *t) + 2301 : 12231 : static void mptcp_retransmit_timer(struct timer_list *t) 2302 : : { - 2303 : 6998 : struct inet_connection_sock *icsk = from_timer(icsk, t, + 2303 : 12231 : struct inet_connection_sock *icsk = from_timer(icsk, t, 2304 : : icsk_retransmit_timer); - 2305 : 6998 : struct sock *sk = &icsk->icsk_inet.sk; - 2306 [ - + ]: 6998 : struct mptcp_sock *msk = mptcp_sk(sk); + 2305 : 12231 : struct sock *sk = &icsk->icsk_inet.sk; + 2306 [ - + ]: 12231 : struct mptcp_sock *msk = mptcp_sk(sk); 2307 : : - 2308 : 6998 : bh_lock_sock(sk); - 2309 [ + + ]: 6998 : if (!sock_owned_by_user(sk)) { + 2308 : 12231 : bh_lock_sock(sk); + 2309 [ + + ]: 12231 : if (!sock_owned_by_user(sk)) { 2310 : : /* we need a process context to retransmit */ - 2311 [ + - ]: 5949 : if (!test_and_set_bit(MPTCP_WORK_RTX, &msk->flags)) - 2312 : 3756 : mptcp_schedule_work(sk); + 2311 [ + + ]: 12072 : if (!test_and_set_bit(MPTCP_WORK_RTX, &msk->flags)) + 2312 : 8375 : mptcp_schedule_work(sk); 2313 : : } else { 2314 : : /* delegate our work to tcp_release_cb() */ - 2315 [ - + - - : 3242 : __set_bit(MPTCP_RETRANSMIT, &msk->cb_flags); + 2315 [ - + - - : 3851 : __set_bit(MPTCP_RETRANSMIT, &msk->cb_flags); - - ] 2316 : : } - 2317 : 6998 : bh_unlock_sock(sk); - 2318 : 6998 : sock_put(sk); - 2319 : 6998 : } + 2317 : 12231 : bh_unlock_sock(sk); + 2318 : 12231 : sock_put(sk); + 2319 : 12231 : } 2320 : : 2321 : 93 : static void mptcp_tout_timer(struct timer_list *t) 2322 : : { @@ -2415,60 +2415,60 @@ 2331 : : * 2332 : : * A backup subflow is returned only if that is the only kind available. 2333 : : */ - 2334 : 1683 : struct sock *mptcp_subflow_get_retrans(struct mptcp_sock *msk) + 2334 : 1742 : struct sock *mptcp_subflow_get_retrans(struct mptcp_sock *msk) 2335 : : { - 2336 : 1683 : struct sock *backup = NULL, *pick = NULL; - 2337 : 1683 : struct mptcp_subflow_context *subflow; - 2338 : 1683 : int min_stale_count = INT_MAX; + 2336 : 1742 : struct sock *backup = NULL, *pick = NULL; + 2337 : 1742 : struct mptcp_subflow_context *subflow; + 2338 : 1742 : int min_stale_count = INT_MAX; 2339 : : - 2340 [ + + ]: 3854 : mptcp_for_each_subflow(msk, subflow) { - 2341 : 2171 : struct sock *ssk = mptcp_subflow_tcp_sock(subflow); + 2340 [ + + ]: 3981 : mptcp_for_each_subflow(msk, subflow) { + 2341 : 2239 : struct sock *ssk = mptcp_subflow_tcp_sock(subflow); 2342 : : - 2343 [ + + ]: 2171 : if (!__mptcp_subflow_active(subflow)) - 2344 : 67 : continue; + 2343 [ + + ]: 2239 : if (!__mptcp_subflow_active(subflow)) + 2344 : 77 : continue; 2345 : : 2346 : : /* still data outstanding at TCP level? skip this */ - 2347 [ + + ]: 2104 : if (!tcp_rtx_and_write_queues_empty(ssk)) { - 2348 : 647 : mptcp_pm_subflow_chk_stale(msk, ssk); - 2349 : 647 : min_stale_count = min_t(int, min_stale_count, subflow->stale_count); - 2350 : 647 : continue; + 2347 [ + + ]: 2162 : if (!tcp_rtx_and_write_queues_empty(ssk)) { + 2348 : 632 : mptcp_pm_subflow_chk_stale(msk, ssk); + 2349 : 632 : min_stale_count = min_t(int, min_stale_count, subflow->stale_count); + 2350 : 632 : continue; 2351 : : } 2352 : : - 2353 [ + + ]: 1457 : if (subflow->backup || subflow->request_bkup) { - 2354 [ + - ]: 50 : if (!backup) - 2355 : 50 : backup = ssk; - 2356 : 50 : continue; + 2353 [ + + ]: 1530 : if (subflow->backup || subflow->request_bkup) { + 2354 [ + + ]: 55 : if (!backup) + 2355 : 53 : backup = ssk; + 2356 : 55 : continue; 2357 : : } 2358 : : - 2359 [ + + ]: 1407 : if (!pick) - 2360 : 1160 : pick = ssk; + 2359 [ + + ]: 1475 : if (!pick) + 2360 : 1220 : pick = ssk; 2361 : : } 2362 : : - 2363 [ + + ]: 1683 : if (pick) + 2363 [ + + ]: 1742 : if (pick) 2364 : : return pick; 2365 : : 2366 : : /* use backup only if there are no progresses anywhere */ - 2367 [ + + ]: 523 : return min_stale_count > 1 ? backup : NULL; + 2367 [ + + ]: 522 : return min_stale_count > 1 ? backup : NULL; 2368 : : } 2369 : : - 2370 : 787 : bool __mptcp_retransmit_pending_data(struct sock *sk) + 2370 : 769 : bool __mptcp_retransmit_pending_data(struct sock *sk) 2371 : : { - 2372 : 787 : struct mptcp_data_frag *cur, *rtx_head; - 2373 [ - + ]: 787 : struct mptcp_sock *msk = mptcp_sk(sk); + 2372 : 769 : struct mptcp_data_frag *cur, *rtx_head; + 2373 [ - + ]: 769 : struct mptcp_sock *msk = mptcp_sk(sk); 2374 : : - 2375 [ + + ]: 787 : if (__mptcp_check_fallback(msk)) + 2375 [ + + ]: 769 : if (__mptcp_check_fallback(msk)) 2376 : : return false; 2377 : : 2378 : : /* the closing socket has some data untransmitted and/or unacked: 2379 : : * some data in the mptcp rtx queue has not really xmitted yet. 2380 : : * keep it simple and re-inject the whole mptcp level rtx queue 2381 : : */ - 2382 : 728 : mptcp_data_lock(sk); - 2383 : 728 : __mptcp_clean_una_wakeup(sk); - 2384 : 728 : rtx_head = mptcp_rtx_head(sk); - 2385 [ + + ]: 728 : if (!rtx_head) { - 2386 : 700 : mptcp_data_unlock(sk); - 2387 : 700 : return false; + 2382 : 718 : mptcp_data_lock(sk); + 2383 : 718 : __mptcp_clean_una_wakeup(sk); + 2384 : 718 : rtx_head = mptcp_rtx_head(sk); + 2385 [ + + ]: 718 : if (!rtx_head) { + 2386 : 690 : mptcp_data_unlock(sk); + 2387 : 690 : return false; 2388 : : } 2389 : : 2390 : 28 : msk->recovery_snd_nxt = msk->snd_nxt; @@ -2479,10 +2479,10 @@ 2395 : 28 : msk->snd_burst = 0; 2396 : : 2397 : : /* be sure to clear the "sent status" on all re-injected fragments */ - 2398 [ + + ]: 4083 : list_for_each_entry(cur, &msk->rtx_queue, list) { - 2399 [ + + ]: 4065 : if (!cur->already_sent) + 2398 [ + + ]: 4631 : list_for_each_entry(cur, &msk->rtx_queue, list) { + 2399 [ + + ]: 4614 : if (!cur->already_sent) 2400 : : break; - 2401 : 4055 : cur->already_sent = 0; + 2401 : 4603 : cur->already_sent = 0; 2402 : : } 2403 : : 2404 : : return true; @@ -2496,22 +2496,22 @@ 2412 : : * clean completely the subflow status when the subflow reaches 2413 : : * TCP_CLOSE state 2414 : : */ - 2415 : 815 : static void __mptcp_subflow_disconnect(struct sock *ssk, + 2415 : 796 : static void __mptcp_subflow_disconnect(struct sock *ssk, 2416 : : struct mptcp_subflow_context *subflow, 2417 : : unsigned int flags) 2418 : : { - 2419 [ + + + + : 815 : if (((1 << ssk->sk_state) & (TCPF_CLOSE | TCPF_LISTEN)) || - + + ] + 2419 [ + + + + : 796 : if (((1 << ssk->sk_state) & (TCPF_CLOSE | TCPF_LISTEN)) || + + + ] 2420 : : (flags & MPTCP_CF_FASTCLOSE)) { 2421 : : /* The MPTCP code never wait on the subflow sockets, TCP-level 2422 : : * disconnect should never fail 2423 : : */ - 2424 [ - + ]: 791 : WARN_ON_ONCE(tcp_disconnect(ssk, 0)); - 2425 : 791 : mptcp_subflow_ctx_reset(subflow); + 2424 [ - + ]: 772 : WARN_ON_ONCE(tcp_disconnect(ssk, 0)); + 2425 : 772 : mptcp_subflow_ctx_reset(subflow); 2426 : : } else { 2427 : 24 : tcp_shutdown(ssk, SEND_SHUTDOWN); 2428 : : } - 2429 : 815 : } + 2429 : 796 : } 2430 : : 2431 : : /* subflow sockets can be either outgoing (connect) or incoming 2432 : : * (accept). @@ -2521,21 +2521,21 @@ 2436 : : * so we need to use tcp_close() after detaching them from the mptcp 2437 : : * parent socket. 2438 : : */ - 2439 : 5416 : static void __mptcp_close_ssk(struct sock *sk, struct sock *ssk, + 2439 : 5395 : static void __mptcp_close_ssk(struct sock *sk, struct sock *ssk, 2440 : : struct mptcp_subflow_context *subflow, 2441 : : unsigned int flags) 2442 : : { - 2443 [ - + ]: 5416 : struct mptcp_sock *msk = mptcp_sk(sk); - 2444 : 5416 : bool dispose_it, need_push = false; + 2443 [ - + ]: 5395 : struct mptcp_sock *msk = mptcp_sk(sk); + 2444 : 5395 : bool dispose_it, need_push = false; 2445 : : 2446 : : /* If the first subflow moved to a close state before accept, e.g. due 2447 : : * to an incoming reset or listener shutdown, the subflow socket is 2448 : : * already deleted by inet_child_forget() and the mptcp socket can't 2449 : : * survive too. 2450 : : */ - 2451 [ + + + + : 5459 : if (msk->in_accept_queue && msk->first == ssk && - + + ] - 2452 [ - + ]: 44 : (sock_flag(sk, SOCK_DEAD) || sock_flag(ssk, SOCK_DEAD))) { + 2451 [ + + + + : 5437 : if (msk->in_accept_queue && msk->first == ssk && + - + ] + 2452 [ - - ]: 42 : (sock_flag(sk, SOCK_DEAD) || sock_flag(ssk, SOCK_DEAD))) { 2453 : : /* ensure later check in mptcp_worker() will dispose the msk */ 2454 : 42 : sock_set_flag(sk, SOCK_DEAD); 2455 : 42 : mptcp_set_close_tout(sk, tcp_jiffies32 - (mptcp_close_timeout(sk) + 1)); @@ -2544,96 +2544,96 @@ 2458 : 42 : goto out_release; 2459 : : } 2460 : : - 2461 [ + + + + ]: 5374 : dispose_it = msk->free_first || ssk != msk->first; + 2461 [ + + + + ]: 5353 : dispose_it = msk->free_first || ssk != msk->first; 2462 : : if (dispose_it) - 2463 : 4559 : list_del(&subflow->node); + 2463 : 4557 : list_del(&subflow->node); 2464 : : - 2465 : 5374 : lock_sock_nested(ssk, SINGLE_DEPTH_NESTING); + 2465 : 5353 : lock_sock_nested(ssk, SINGLE_DEPTH_NESTING); 2466 : : - 2467 [ + + + + ]: 5374 : if ((flags & MPTCP_CF_FASTCLOSE) && !__mptcp_check_fallback(msk)) { + 2467 [ + + + + ]: 5353 : if ((flags & MPTCP_CF_FASTCLOSE) && !__mptcp_check_fallback(msk)) { 2468 : : /* be sure to force the tcp_close path 2469 : : * to generate the egress reset 2470 : : */ - 2471 : 413 : ssk->sk_lingertime = 0; - 2472 : 413 : sock_set_flag(ssk, SOCK_LINGER); - 2473 : 413 : subflow->send_fastclose = 1; + 2471 : 410 : ssk->sk_lingertime = 0; + 2472 : 410 : sock_set_flag(ssk, SOCK_LINGER); + 2473 : 410 : subflow->send_fastclose = 1; 2474 : : } 2475 : : - 2476 [ + + + + ]: 5374 : need_push = (flags & MPTCP_CF_PUSH) && __mptcp_retransmit_pending_data(sk); - 2477 [ + + ]: 5374 : if (!dispose_it) { - 2478 : 815 : __mptcp_subflow_disconnect(ssk, subflow, flags); - 2479 : 815 : release_sock(ssk); + 2476 [ + + + + ]: 5353 : need_push = (flags & MPTCP_CF_PUSH) && __mptcp_retransmit_pending_data(sk); + 2477 [ + + ]: 5353 : if (!dispose_it) { + 2478 : 796 : __mptcp_subflow_disconnect(ssk, subflow, flags); + 2479 : 796 : release_sock(ssk); 2480 : : - 2481 : 815 : goto out; + 2481 : 796 : goto out; 2482 : : } 2483 : : - 2484 : 4559 : subflow->disposable = 1; + 2484 : 4557 : subflow->disposable = 1; 2485 : : 2486 : : /* if ssk hit tcp_done(), tcp_cleanup_ulp() cleared the related ops 2487 : : * the ssk has been already destroyed, we just need to release the 2488 : : * reference owned by msk; 2489 : : */ - 2490 [ - + ]: 4559 : if (!inet_csk(ssk)->icsk_ulp_ops) { + 2490 [ - + ]: 4557 : if (!inet_csk(ssk)->icsk_ulp_ops) { 2491 [ # # ]: 0 : WARN_ON_ONCE(!sock_flag(ssk, SOCK_DEAD)); 2492 [ # # ]: 0 : kfree_rcu(subflow, rcu); 2493 : : } else { 2494 : : /* otherwise tcp will dispose of the ssk and subflow ctx */ - 2495 : 4559 : __tcp_close(ssk, 0); + 2495 : 4557 : __tcp_close(ssk, 0); 2496 : : 2497 : : /* close acquired an extra ref */ - 2498 : 4559 : __sock_put(ssk); + 2498 : 4557 : __sock_put(ssk); 2499 : : } 2500 : : - 2501 : 4601 : out_release: - 2502 : 4601 : __mptcp_subflow_error_report(sk, ssk); - 2503 : 4601 : release_sock(ssk); + 2501 : 4599 : out_release: + 2502 : 4599 : __mptcp_subflow_error_report(sk, ssk); + 2503 : 4599 : release_sock(ssk); 2504 : : - 2505 : 4601 : sock_put(ssk); + 2505 : 4599 : sock_put(ssk); 2506 : : - 2507 [ + + ]: 4601 : if (ssk == msk->first) + 2507 [ + + ]: 4599 : if (ssk == msk->first) 2508 : 3575 : WRITE_ONCE(msk->first, NULL); 2509 : : - 2510 : 1026 : out: - 2511 : 5416 : __mptcp_sync_sndbuf(sk); - 2512 [ + + ]: 5416 : if (need_push) - 2513 : 9 : __mptcp_push_pending(sk, 0); + 2510 : 1024 : out: + 2511 : 5395 : __mptcp_sync_sndbuf(sk); + 2512 [ + + ]: 5395 : if (need_push) + 2513 : 11 : __mptcp_push_pending(sk, 0); 2514 : : 2515 : : /* Catch every 'all subflows closed' scenario, including peers silently 2516 : : * closing them, e.g. due to timeout. 2517 : : * For established sockets, allow an additional timeout before closing, 2518 : : * as the protocol can still create more subflows. 2519 : : */ - 2520 [ + + + + : 7666 : if (list_is_singular(&msk->conn_list) && msk->first && - + + ] + 2520 [ + + + + : 7599 : if (list_is_singular(&msk->conn_list) && msk->first && + + + ] 2521 [ + - ]: 30 : inet_sk_state_load(msk->first) == TCP_CLOSE) { - 2522 [ + + + + ]: 793 : if (sk->sk_state != TCP_ESTABLISHED || - 2523 [ - + ]: 33 : msk->in_accept_queue || sock_flag(sk, SOCK_DEAD)) { - 2524 : 760 : mptcp_set_state(sk, TCP_CLOSE); - 2525 : 760 : mptcp_close_wake_up(sk); + 2522 [ + + + - ]: 774 : if (sk->sk_state != TCP_ESTABLISHED || + 2523 [ - + ]: 34 : msk->in_accept_queue || sock_flag(sk, SOCK_DEAD)) { + 2524 : 740 : mptcp_set_state(sk, TCP_CLOSE); + 2525 : 740 : mptcp_close_wake_up(sk); 2526 : : } else { - 2527 : 33 : mptcp_start_tout_timer(sk); + 2527 : 34 : mptcp_start_tout_timer(sk); 2528 : : } 2529 : : } - 2530 : 5416 : } + 2530 : 5395 : } 2531 : : - 2532 : 806 : void mptcp_close_ssk(struct sock *sk, struct sock *ssk, + 2532 : 790 : void mptcp_close_ssk(struct sock *sk, struct sock *ssk, 2533 : : struct mptcp_subflow_context *subflow) 2534 : : { 2535 : : /* The first subflow can already be closed and still in the list */ - 2536 [ + + ]: 806 : if (subflow->close_event_done) + 2536 [ + + ]: 790 : if (subflow->close_event_done) 2537 : : return; 2538 : : - 2539 : 768 : subflow->close_event_done = true; + 2539 : 752 : subflow->close_event_done = true; 2540 : : - 2541 [ + + ]: 768 : if (sk->sk_state == TCP_ESTABLISHED) - 2542 [ - + ]: 323 : mptcp_event(MPTCP_EVENT_SUB_CLOSED, mptcp_sk(sk), ssk, GFP_KERNEL); + 2541 [ + + ]: 752 : if (sk->sk_state == TCP_ESTABLISHED) + 2542 [ - + ]: 320 : mptcp_event(MPTCP_EVENT_SUB_CLOSED, mptcp_sk(sk), ssk, GFP_KERNEL); 2543 : : 2544 : : /* subflow aborted before reaching the fully_established status 2545 : : * attempt the creation of the next subflow 2546 : : */ - 2547 [ - + ]: 768 : mptcp_pm_subflow_check_next(mptcp_sk(sk), subflow); + 2547 [ - + ]: 752 : mptcp_pm_subflow_check_next(mptcp_sk(sk), subflow); 2548 : : - 2549 : 768 : __mptcp_close_ssk(sk, ssk, subflow, MPTCP_CF_PUSH); + 2549 : 752 : __mptcp_close_ssk(sk, ssk, subflow, MPTCP_CF_PUSH); 2550 : : } 2551 : : 2552 : 0 : static unsigned int mptcp_sync_mss(struct sock *sk, u32 pmtu) @@ -2641,189 +2641,189 @@ 2554 : 0 : return 0; 2555 : : } 2556 : : - 2557 : 598 : static void __mptcp_close_subflow(struct sock *sk) + 2557 : 586 : static void __mptcp_close_subflow(struct sock *sk) 2558 : : { - 2559 : 598 : struct mptcp_subflow_context *subflow, *tmp; - 2560 [ - + ]: 598 : struct mptcp_sock *msk = mptcp_sk(sk); + 2559 : 586 : struct mptcp_subflow_context *subflow, *tmp; + 2560 [ - + ]: 586 : struct mptcp_sock *msk = mptcp_sk(sk); 2561 : : - 2562 : 598 : might_sleep(); + 2562 : 586 : might_sleep(); 2563 : : - 2564 [ + + ]: 1505 : mptcp_for_each_subflow_safe(msk, subflow, tmp) { - 2565 : 907 : struct sock *ssk = mptcp_subflow_tcp_sock(subflow); - 2566 : 907 : int ssk_state = inet_sk_state_load(ssk); + 2564 [ + + ]: 1490 : mptcp_for_each_subflow_safe(msk, subflow, tmp) { + 2565 : 904 : struct sock *ssk = mptcp_subflow_tcp_sock(subflow); + 2566 : 904 : int ssk_state = inet_sk_state_load(ssk); 2567 : : - 2568 [ + + + + ]: 907 : if (ssk_state != TCP_CLOSE && - 2569 [ + + ]: 63 : (ssk_state != TCP_CLOSE_WAIT || + 2568 [ + + + + ]: 904 : if (ssk_state != TCP_CLOSE && + 2569 [ + + ]: 66 : (ssk_state != TCP_CLOSE_WAIT || 2570 [ # # ]: 0 : inet_sk_state_load(sk) != TCP_ESTABLISHED)) - 2571 : 293 : continue; + 2571 : 306 : continue; 2572 : : 2573 : : /* 'subflow_data_ready' will re-sched once rx queue is empty */ - 2574 [ - + ]: 614 : if (!skb_queue_empty_lockless(&ssk->sk_receive_queue)) + 2574 [ - + ]: 598 : if (!skb_queue_empty_lockless(&ssk->sk_receive_queue)) 2575 : 0 : continue; 2576 : : - 2577 : 614 : mptcp_close_ssk(sk, ssk, subflow); + 2577 : 598 : mptcp_close_ssk(sk, ssk, subflow); 2578 : : } 2579 : : - 2580 : 598 : } + 2580 : 586 : } 2581 : : - 2582 : 9066 : static bool mptcp_close_tout_expired(const struct sock *sk) + 2582 : 13800 : static bool mptcp_close_tout_expired(const struct sock *sk) 2583 : : { - 2584 [ + + ]: 9066 : if (!inet_csk(sk)->icsk_mtup.probe_timestamp || - 2585 [ + + ]: 2689 : sk->sk_state == TCP_CLOSE) + 2584 [ + + ]: 13800 : if (!inet_csk(sk)->icsk_mtup.probe_timestamp || + 2585 [ + + ]: 2624 : sk->sk_state == TCP_CLOSE) 2586 : : return false; 2587 : : - 2588 : 1837 : return time_after32(tcp_jiffies32, + 2588 : 1768 : return time_after32(tcp_jiffies32, 2589 : : inet_csk(sk)->icsk_mtup.probe_timestamp + mptcp_close_timeout(sk)); 2590 : : } 2591 : : - 2592 : 9066 : static void mptcp_check_fastclose(struct mptcp_sock *msk) + 2592 : 13800 : static void mptcp_check_fastclose(struct mptcp_sock *msk) 2593 : : { - 2594 : 9066 : struct mptcp_subflow_context *subflow, *tmp; - 2595 : 9066 : struct sock *sk = (struct sock *)msk; + 2594 : 13800 : struct mptcp_subflow_context *subflow, *tmp; + 2595 : 13800 : struct sock *sk = (struct sock *)msk; 2596 : : - 2597 [ + + + + ]: 9066 : if (likely(!READ_ONCE(msk->rcv_fastclose))) + 2597 [ + + + + ]: 13800 : if (likely(!READ_ONCE(msk->rcv_fastclose))) 2598 : : return; 2599 : : - 2600 : 227 : mptcp_token_destroy(msk); + 2600 : 221 : mptcp_token_destroy(msk); 2601 : : - 2602 [ + + ]: 518 : mptcp_for_each_subflow_safe(msk, subflow, tmp) { - 2603 : 291 : struct sock *tcp_sk = mptcp_subflow_tcp_sock(subflow); - 2604 : 291 : bool slow; + 2602 [ + + ]: 507 : mptcp_for_each_subflow_safe(msk, subflow, tmp) { + 2603 : 286 : struct sock *tcp_sk = mptcp_subflow_tcp_sock(subflow); + 2604 : 286 : bool slow; 2605 : : - 2606 : 291 : slow = lock_sock_fast(tcp_sk); - 2607 [ + + ]: 291 : if (tcp_sk->sk_state != TCP_CLOSE) { - 2608 : 46 : mptcp_send_active_reset_reason(tcp_sk); - 2609 : 46 : tcp_set_state(tcp_sk, TCP_CLOSE); + 2606 : 286 : slow = lock_sock_fast(tcp_sk); + 2607 [ + + ]: 286 : if (tcp_sk->sk_state != TCP_CLOSE) { + 2608 : 48 : mptcp_send_active_reset_reason(tcp_sk); + 2609 : 48 : tcp_set_state(tcp_sk, TCP_CLOSE); 2610 : : } - 2611 : 291 : unlock_sock_fast(tcp_sk, slow); + 2611 : 286 : unlock_sock_fast(tcp_sk, slow); 2612 : : } 2613 : : 2614 : : /* Mirror the tcp_reset() error propagation */ - 2615 [ - + + - ]: 227 : switch (sk->sk_state) { + 2615 [ - + + - ]: 221 : switch (sk->sk_state) { 2616 : : case TCP_SYN_SENT: 2617 : 0 : WRITE_ONCE(sk->sk_err, ECONNREFUSED); 2618 : 0 : break; 2619 : : case TCP_CLOSE_WAIT: - 2620 : 12 : WRITE_ONCE(sk->sk_err, EPIPE); - 2621 : 12 : break; + 2620 : 20 : WRITE_ONCE(sk->sk_err, EPIPE); + 2621 : 20 : break; 2622 : : case TCP_CLOSE: 2623 : : return; 2624 : : default: - 2625 : 215 : WRITE_ONCE(sk->sk_err, ECONNRESET); + 2625 : 201 : WRITE_ONCE(sk->sk_err, ECONNRESET); 2626 : : } 2627 : : - 2628 : 227 : mptcp_set_state(sk, TCP_CLOSE); - 2629 : 227 : WRITE_ONCE(sk->sk_shutdown, SHUTDOWN_MASK); - 2630 : 227 : smp_mb__before_atomic(); /* SHUTDOWN must be visible first */ - 2631 : 227 : set_bit(MPTCP_WORK_CLOSE_SUBFLOW, &msk->flags); + 2628 : 221 : mptcp_set_state(sk, TCP_CLOSE); + 2629 : 221 : WRITE_ONCE(sk->sk_shutdown, SHUTDOWN_MASK); + 2630 : 221 : smp_mb__before_atomic(); /* SHUTDOWN must be visible first */ + 2631 : 221 : set_bit(MPTCP_WORK_CLOSE_SUBFLOW, &msk->flags); 2632 : : 2633 : : /* the calling mptcp_worker will properly destroy the socket */ - 2634 [ + + ]: 227 : if (sock_flag(sk, SOCK_DEAD)) + 2634 [ + + ]: 221 : if (sock_flag(sk, SOCK_DEAD)) 2635 : : return; 2636 : : - 2637 : 97 : sk->sk_state_change(sk); - 2638 : 97 : sk_error_report(sk); + 2637 : 104 : sk->sk_state_change(sk); + 2638 : 104 : sk_error_report(sk); 2639 : : } 2640 : : - 2641 : 6687 : static void __mptcp_retrans(struct sock *sk) + 2641 : 11931 : static void __mptcp_retrans(struct sock *sk) 2642 : : { - 2643 [ - + ]: 6687 : struct mptcp_sock *msk = mptcp_sk(sk); - 2644 : 6687 : struct mptcp_subflow_context *subflow; - 2645 : 6687 : struct mptcp_sendmsg_info info = {}; - 2646 : 6687 : struct mptcp_data_frag *dfrag; - 2647 : 6687 : struct sock *ssk; - 2648 : 6687 : int ret, err; - 2649 : 6687 : u16 len = 0; + 2643 [ - + ]: 11931 : struct mptcp_sock *msk = mptcp_sk(sk); + 2644 : 11931 : struct mptcp_subflow_context *subflow; + 2645 : 11931 : struct mptcp_sendmsg_info info = {}; + 2646 : 11931 : struct mptcp_data_frag *dfrag; + 2647 : 11931 : struct sock *ssk; + 2648 : 11931 : int ret, err; + 2649 : 11931 : u16 len = 0; 2650 : : - 2651 : 6687 : mptcp_clean_una_wakeup(sk); + 2651 : 11931 : mptcp_clean_una_wakeup(sk); 2652 : : 2653 : : /* first check ssk: need to kick "stale" logic */ - 2654 : 6687 : err = mptcp_sched_get_retrans(msk); - 2655 : 6687 : dfrag = mptcp_rtx_head(sk); - 2656 [ + + ]: 6687 : if (!dfrag) { - 2657 [ + + ]: 2430 : if (mptcp_data_fin_enabled(msk)) { - 2658 : 1057 : struct inet_connection_sock *icsk = inet_csk(sk); + 2654 : 11931 : err = mptcp_sched_get_retrans(msk); + 2655 : 11931 : dfrag = mptcp_rtx_head(sk); + 2656 [ + + ]: 11931 : if (!dfrag) { + 2657 [ + + ]: 4412 : if (mptcp_data_fin_enabled(msk)) { + 2658 : 1077 : struct inet_connection_sock *icsk = inet_csk(sk); 2659 : : - 2660 : 1057 : icsk->icsk_retransmits++; - 2661 : 1057 : mptcp_set_datafin_timeout(sk); - 2662 : 1057 : mptcp_send_ack(msk); + 2660 : 1077 : icsk->icsk_retransmits++; + 2661 : 1077 : mptcp_set_datafin_timeout(sk); + 2662 : 1077 : mptcp_send_ack(msk); 2663 : : - 2664 : 1057 : goto reset_timer; + 2664 : 1077 : goto reset_timer; 2665 : : } 2666 : : - 2667 [ + + ]: 1373 : if (!mptcp_send_head(sk)) - 2668 : 715 : return; + 2667 [ + + ]: 3335 : if (!mptcp_send_head(sk)) + 2668 : 882 : return; 2669 : : - 2670 : 658 : goto reset_timer; + 2670 : 2453 : goto reset_timer; 2671 : : } 2672 : : - 2673 [ + + ]: 4257 : if (err) - 2674 : 1319 : goto reset_timer; + 2673 [ + + ]: 7519 : if (err) + 2674 : 4324 : goto reset_timer; 2675 : : - 2676 [ + + ]: 8907 : mptcp_for_each_subflow(msk, subflow) { - 2677 [ + + + + ]: 5969 : if (READ_ONCE(subflow->scheduled)) { - 2678 : 3308 : u16 copied = 0; + 2676 [ + + ]: 9678 : mptcp_for_each_subflow(msk, subflow) { + 2677 [ + + + + ]: 6483 : if (READ_ONCE(subflow->scheduled)) { + 2678 : 3663 : u16 copied = 0; 2679 : : - 2680 : 3308 : mptcp_subflow_set_scheduled(subflow, false); + 2680 : 3663 : mptcp_subflow_set_scheduled(subflow, false); 2681 : : - 2682 : 3308 : ssk = mptcp_subflow_tcp_sock(subflow); + 2682 : 3663 : ssk = mptcp_subflow_tcp_sock(subflow); 2683 : : - 2684 : 3308 : lock_sock(ssk); + 2684 : 3663 : lock_sock(ssk); 2685 : : 2686 : : /* limit retransmission to the bytes already sent on some subflows */ - 2687 : 3308 : info.sent = 0; - 2688 [ - + - + ]: 3308 : info.limit = READ_ONCE(msk->csum_enabled) ? dfrag->data_len : + 2687 : 3663 : info.sent = 0; + 2688 [ - + - + ]: 3663 : info.limit = READ_ONCE(msk->csum_enabled) ? dfrag->data_len : 2689 : : dfrag->already_sent; - 2690 [ + + ]: 6616 : while (info.sent < info.limit) { - 2691 : 3308 : ret = mptcp_sendmsg_frag(sk, ssk, dfrag, &info); - 2692 [ + - ]: 3308 : if (ret <= 0) + 2690 [ + + ]: 7326 : while (info.sent < info.limit) { + 2691 : 3663 : ret = mptcp_sendmsg_frag(sk, ssk, dfrag, &info); + 2692 [ + - ]: 3663 : if (ret <= 0) 2693 : : break; 2694 : : - 2695 [ + - ]: 3308 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_RETRANSSEGS); - 2696 : 3308 : copied += ret; - 2697 : 3308 : info.sent += ret; + 2695 [ + - ]: 3663 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_RETRANSSEGS); + 2696 : 3663 : copied += ret; + 2697 : 3663 : info.sent += ret; 2698 : : } - 2699 [ + - ]: 3308 : if (copied) { - 2700 : 3308 : len = max(copied, len); - 2701 [ - + ]: 3308 : tcp_push(ssk, 0, info.mss_now, tcp_sk(ssk)->nonagle, + 2699 [ + - ]: 3663 : if (copied) { + 2700 : 3663 : len = max(copied, len); + 2701 [ - + ]: 3663 : tcp_push(ssk, 0, info.mss_now, tcp_sk(ssk)->nonagle, 2702 : : info.size_goal); - 2703 : 3308 : WRITE_ONCE(msk->allow_infinite_fallback, false); + 2703 : 3663 : WRITE_ONCE(msk->allow_infinite_fallback, false); 2704 : : } 2705 : : - 2706 : 3308 : release_sock(ssk); + 2706 : 3663 : release_sock(ssk); 2707 : : } 2708 : : } 2709 : : - 2710 : 2938 : msk->bytes_retrans += len; - 2711 : 2938 : dfrag->already_sent = max(dfrag->already_sent, len); + 2710 : 3195 : msk->bytes_retrans += len; + 2711 : 3195 : dfrag->already_sent = max(dfrag->already_sent, len); 2712 : : - 2713 : 5972 : reset_timer: - 2714 : 5972 : mptcp_check_and_set_pending(sk); + 2713 : 11049 : reset_timer: + 2714 : 11049 : mptcp_check_and_set_pending(sk); 2715 : : - 2716 [ + + ]: 5972 : if (!mptcp_rtx_timer_pending(sk)) - 2717 : 65 : mptcp_reset_rtx_timer(sk); + 2716 [ + + ]: 11049 : if (!mptcp_rtx_timer_pending(sk)) + 2717 : 103 : mptcp_reset_rtx_timer(sk); 2718 : : } 2719 : : 2720 : : /* schedule the timeout timer for the relevant event: either close timeout 2721 : : * or mp_fail timeout. The close timeout takes precedence on the mp_fail one 2722 : : */ - 2723 : 1045 : void mptcp_reset_tout_timer(struct mptcp_sock *msk, unsigned long fail_tout) + 2723 : 1050 : void mptcp_reset_tout_timer(struct mptcp_sock *msk, unsigned long fail_tout) 2724 : : { - 2725 : 1045 : struct sock *sk = (struct sock *)msk; - 2726 : 1045 : unsigned long timeout, close_timeout; + 2725 : 1050 : struct sock *sk = (struct sock *)msk; + 2726 : 1050 : unsigned long timeout, close_timeout; 2727 : : - 2728 [ + + + - ]: 1045 : if (!fail_tout && !inet_csk(sk)->icsk_mtup.probe_timestamp) + 2728 [ + + + - ]: 1050 : if (!fail_tout && !inet_csk(sk)->icsk_mtup.probe_timestamp) 2729 : : return; 2730 : : - 2731 : 2090 : close_timeout = (unsigned long)inet_csk(sk)->icsk_mtup.probe_timestamp - - 2732 : 1045 : tcp_jiffies32 + jiffies + mptcp_close_timeout(sk); + 2731 : 2100 : close_timeout = (unsigned long)inet_csk(sk)->icsk_mtup.probe_timestamp - + 2732 : 1050 : tcp_jiffies32 + jiffies + mptcp_close_timeout(sk); 2733 : : 2734 : : /* the close timeout takes precedence on the fail one, and here at least one of 2735 : : * them is active 2736 : : */ - 2737 [ + + ]: 1045 : timeout = inet_csk(sk)->icsk_mtup.probe_timestamp ? close_timeout : fail_tout; + 2737 [ + + ]: 1050 : timeout = inet_csk(sk)->icsk_mtup.probe_timestamp ? close_timeout : fail_tout; 2738 : : - 2739 : 1045 : sk_reset_timer(sk, &sk->sk_timer, timeout); + 2739 : 1050 : sk_reset_timer(sk, &sk->sk_timer, timeout); 2740 : : } 2741 : : 2742 : 0 : static void mptcp_mp_fail_no_response(struct mptcp_sock *msk) @@ -2842,61 +2842,61 @@ 2755 : 0 : unlock_sock_fast(ssk, slow); 2756 : : } 2757 : : - 2758 : 357 : static void mptcp_do_fastclose(struct sock *sk) + 2758 : 353 : static void mptcp_do_fastclose(struct sock *sk) 2759 : : { - 2760 : 357 : struct mptcp_subflow_context *subflow, *tmp; - 2761 [ - + ]: 357 : struct mptcp_sock *msk = mptcp_sk(sk); + 2760 : 353 : struct mptcp_subflow_context *subflow, *tmp; + 2761 [ - + ]: 353 : struct mptcp_sock *msk = mptcp_sk(sk); 2762 : : - 2763 : 357 : mptcp_set_state(sk, TCP_CLOSE); - 2764 [ + + ]: 792 : mptcp_for_each_subflow_safe(msk, subflow, tmp) - 2765 : 435 : __mptcp_close_ssk(sk, mptcp_subflow_tcp_sock(subflow), + 2763 : 353 : mptcp_set_state(sk, TCP_CLOSE); + 2764 [ + + ]: 785 : mptcp_for_each_subflow_safe(msk, subflow, tmp) + 2765 : 432 : __mptcp_close_ssk(sk, mptcp_subflow_tcp_sock(subflow), 2766 : : subflow, MPTCP_CF_FASTCLOSE); - 2767 : 357 : } + 2767 : 353 : } 2768 : : - 2769 : 9156 : static void mptcp_worker(struct work_struct *work) + 2769 : 13879 : static void mptcp_worker(struct work_struct *work) 2770 : : { - 2771 : 9156 : struct mptcp_sock *msk = container_of(work, struct mptcp_sock, work); - 2772 : 9156 : struct sock *sk = (struct sock *)msk; - 2773 : 9156 : unsigned long fail_tout; - 2774 : 9156 : int state; + 2771 : 13879 : struct mptcp_sock *msk = container_of(work, struct mptcp_sock, work); + 2772 : 13879 : struct sock *sk = (struct sock *)msk; + 2773 : 13879 : unsigned long fail_tout; + 2774 : 13879 : int state; 2775 : : - 2776 : 9156 : lock_sock(sk); - 2777 : 9156 : state = sk->sk_state; - 2778 [ + + + + ]: 9156 : if (unlikely((1 << state) & (TCPF_CLOSE | TCPF_LISTEN))) - 2779 : 90 : goto unlock; + 2776 : 13879 : lock_sock(sk); + 2777 : 13879 : state = sk->sk_state; + 2778 [ + + + + ]: 13879 : if (unlikely((1 << state) & (TCPF_CLOSE | TCPF_LISTEN))) + 2779 : 79 : goto unlock; 2780 : : - 2781 : 9066 : mptcp_check_fastclose(msk); + 2781 : 13800 : mptcp_check_fastclose(msk); 2782 : : - 2783 : 9066 : mptcp_pm_nl_work(msk); + 2783 : 13800 : mptcp_pm_nl_work(msk); 2784 : : - 2785 : 9066 : mptcp_check_send_data_fin(sk); - 2786 : 9066 : mptcp_check_data_fin_ack(sk); - 2787 : 9066 : mptcp_check_data_fin(sk); + 2785 : 13800 : mptcp_check_send_data_fin(sk); + 2786 : 13800 : mptcp_check_data_fin_ack(sk); + 2787 : 13800 : mptcp_check_data_fin(sk); 2788 : : - 2789 [ + + ]: 13871 : if (test_and_clear_bit(MPTCP_WORK_CLOSE_SUBFLOW, &msk->flags)) - 2790 : 598 : __mptcp_close_subflow(sk); + 2789 [ + + ]: 20128 : if (test_and_clear_bit(MPTCP_WORK_CLOSE_SUBFLOW, &msk->flags)) + 2790 : 586 : __mptcp_close_subflow(sk); 2791 : : - 2792 [ + + ]: 9066 : if (mptcp_close_tout_expired(sk)) { + 2792 [ + + ]: 13800 : if (mptcp_close_tout_expired(sk)) { 2793 : 93 : mptcp_do_fastclose(sk); 2794 : 93 : mptcp_close_wake_up(sk); 2795 : : } 2796 : : - 2797 [ + + + + ]: 9066 : if (sock_flag(sk, SOCK_DEAD) && sk->sk_state == TCP_CLOSE) { - 2798 : 933 : __mptcp_destroy_sock(sk); - 2799 : 933 : goto unlock; + 2797 [ + + + + ]: 13800 : if (sock_flag(sk, SOCK_DEAD) && sk->sk_state == TCP_CLOSE) { + 2798 : 937 : __mptcp_destroy_sock(sk); + 2799 : 937 : goto unlock; 2800 : : } 2801 : : - 2802 [ + + ]: 12444 : if (test_and_clear_bit(MPTCP_WORK_RTX, &msk->flags)) - 2803 : 3445 : __mptcp_retrans(sk); + 2802 [ + + ]: 18692 : if (test_and_clear_bit(MPTCP_WORK_RTX, &msk->flags)) + 2803 : 8080 : __mptcp_retrans(sk); 2804 : : - 2805 [ + - + - ]: 8133 : fail_tout = msk->first ? READ_ONCE(mptcp_subflow_ctx(msk->first)->fail_tout) : 0; - 2806 [ + - - - ]: 8133 : if (fail_tout && time_after(jiffies, fail_tout)) + 2805 [ + - + - ]: 12863 : fail_tout = msk->first ? READ_ONCE(mptcp_subflow_ctx(msk->first)->fail_tout) : 0; + 2806 [ + - - - ]: 12863 : if (fail_tout && time_after(jiffies, fail_tout)) 2807 : 0 : mptcp_mp_fail_no_response(msk); 2808 : : 2809 : 0 : unlock: - 2810 : 9156 : release_sock(sk); - 2811 : 9156 : sock_put(sk); - 2812 : 9156 : } + 2810 : 13879 : release_sock(sk); + 2811 : 13879 : sock_put(sk); + 2812 : 13879 : } 2813 : : 2814 : 3684 : static void __mptcp_init_sock(struct sock *sk) 2815 : : { @@ -2984,23 +2984,23 @@ 2897 : 3651 : struct mptcp_data_frag *dtmp, *dfrag; 2898 : : 2899 : 3651 : WRITE_ONCE(msk->first_pending, NULL); - 2900 [ + + ]: 3691 : list_for_each_entry_safe(dfrag, dtmp, &msk->rtx_queue, list) - 2901 : 40 : dfrag_clear(sk, dfrag); + 2900 [ + + ]: 4225 : list_for_each_entry_safe(dfrag, dtmp, &msk->rtx_queue, list) + 2901 : 574 : dfrag_clear(sk, dfrag); 2902 : 3651 : } 2903 : : - 2904 : 2654 : void mptcp_cancel_work(struct sock *sk) + 2904 : 2650 : void mptcp_cancel_work(struct sock *sk) 2905 : : { - 2906 [ - + ]: 2654 : struct mptcp_sock *msk = mptcp_sk(sk); + 2906 [ - + ]: 2650 : struct mptcp_sock *msk = mptcp_sk(sk); 2907 : : - 2908 [ + + ]: 2654 : if (cancel_work_sync(&msk->work)) - 2909 : 20 : __sock_put(sk); - 2910 : 2654 : } + 2908 [ + + ]: 2650 : if (cancel_work_sync(&msk->work)) + 2909 : 21 : __sock_put(sk); + 2910 : 2650 : } 2911 : : - 2912 : 3006 : void mptcp_subflow_shutdown(struct sock *sk, struct sock *ssk, int how) + 2912 : 2996 : void mptcp_subflow_shutdown(struct sock *sk, struct sock *ssk, int how) 2913 : : { - 2914 : 3006 : lock_sock(ssk); + 2914 : 2996 : lock_sock(ssk); 2915 : : - 2916 [ - + + ]: 3006 : switch (ssk->sk_state) { + 2916 [ - + + ]: 2996 : switch (ssk->sk_state) { 2917 : 0 : case TCP_LISTEN: 2918 [ # # ]: 0 : if (!(how & RCV_SHUTDOWN)) 2919 : : break; @@ -3008,34 +3008,34 @@ 2921 : : case TCP_SYN_SENT: 2922 [ - + ]: 16 : WARN_ON_ONCE(tcp_disconnect(ssk, O_NONBLOCK)); 2923 : : break; - 2924 : 2990 : default: - 2925 [ - + + + ]: 2990 : if (__mptcp_check_fallback(mptcp_sk(sk))) { - 2926 [ - + ]: 88 : pr_debug("Fallback\n"); - 2927 : 88 : ssk->sk_shutdown |= how; - 2928 : 88 : tcp_shutdown(ssk, how); + 2924 : 2980 : default: + 2925 [ - + + + ]: 2980 : if (__mptcp_check_fallback(mptcp_sk(sk))) { + 2926 [ - + ]: 87 : pr_debug("Fallback\n"); + 2927 : 87 : ssk->sk_shutdown |= how; + 2928 : 87 : tcp_shutdown(ssk, how); 2929 : : 2930 : : /* simulate the data_fin ack reception to let the state 2931 : : * machine move forward 2932 : : */ - 2933 [ - + - + ]: 88 : WRITE_ONCE(mptcp_sk(sk)->snd_una, mptcp_sk(sk)->snd_nxt); - 2934 : 88 : mptcp_schedule_work(sk); + 2933 [ - + - + ]: 87 : WRITE_ONCE(mptcp_sk(sk)->snd_una, mptcp_sk(sk)->snd_nxt); + 2934 : 87 : mptcp_schedule_work(sk); 2935 : : } else { - 2936 [ - + ]: 2902 : pr_debug("Sending DATA_FIN on subflow %p\n", ssk); - 2937 : 2902 : tcp_send_ack(ssk); - 2938 [ + + ]: 2902 : if (!mptcp_rtx_timer_pending(sk)) - 2939 : 1677 : mptcp_reset_rtx_timer(sk); + 2936 [ - + ]: 2893 : pr_debug("Sending DATA_FIN on subflow %p\n", ssk); + 2937 : 2893 : tcp_send_ack(ssk); + 2938 [ + + ]: 2893 : if (!mptcp_rtx_timer_pending(sk)) + 2939 : 1673 : mptcp_reset_rtx_timer(sk); 2940 : : } 2941 : : break; 2942 : : } 2943 : : - 2944 : 3006 : release_sock(ssk); - 2945 : 3006 : } + 2944 : 2996 : release_sock(ssk); + 2945 : 2996 : } 2946 : : - 2947 : 16960 : void mptcp_set_state(struct sock *sk, int state) + 2947 : 16939 : void mptcp_set_state(struct sock *sk, int state) 2948 : : { - 2949 : 17650 : int oldstate = sk->sk_state; + 2949 : 17636 : int oldstate = sk->sk_state; 2950 : : - 2951 [ + + - ]: 16903 : switch (state) { + 2951 [ + + - ]: 16883 : switch (state) { 2952 : 2364 : case TCP_ESTABLISHED: 2953 [ + - ]: 2364 : if (oldstate != TCP_ESTABLISHED) 2954 [ + - ]: 2364 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_CURRESTAB); @@ -3046,13 +3046,13 @@ 2959 : : * transition from TCP_SYN_RECV to TCP_CLOSE_WAIT. 2960 : : */ 2961 : : break; - 2962 : 14539 : default: - 2963 [ + + ]: 14539 : if (oldstate == TCP_ESTABLISHED || oldstate == TCP_CLOSE_WAIT) + 2962 : 14519 : default: + 2963 [ + + ]: 14519 : if (oldstate == TCP_ESTABLISHED || oldstate == TCP_CLOSE_WAIT) 2964 [ + - ]: 2364 : MPTCP_DEC_STATS(sock_net(sk), MPTCP_MIB_CURRESTAB); 2965 : : } 2966 : : - 2967 : 17650 : inet_sk_state_store(sk, state); - 2968 : 747 : } + 2967 : 17636 : inet_sk_state_store(sk, state); + 2968 : 753 : } 2969 : : 2970 : : static const unsigned char new_state[16] = { 2971 : : /* current state: new state: action: */ @@ -3071,56 +3071,56 @@ 2984 : : [TCP_NEW_SYN_RECV] = TCP_CLOSE, /* should not happen ! */ 2985 : : }; 2986 : : - 2987 : 2539 : static int mptcp_close_state(struct sock *sk) + 2987 : 2554 : static int mptcp_close_state(struct sock *sk) 2988 : : { - 2989 : 2539 : int next = (int)new_state[sk->sk_state]; - 2990 : 2539 : int ns = next & TCP_STATE_MASK; + 2989 : 2554 : int next = (int)new_state[sk->sk_state]; + 2990 : 2554 : int ns = next & TCP_STATE_MASK; 2991 : : - 2992 : 2539 : mptcp_set_state(sk, ns); + 2992 : 2554 : mptcp_set_state(sk, ns); 2993 : : - 2994 : 2539 : return next & TCP_ACTION_FIN; + 2994 : 2554 : return next & TCP_ACTION_FIN; 2995 : : } 2996 : : - 2997 : 338360 : static void mptcp_check_send_data_fin(struct sock *sk) + 2997 : 454671 : static void mptcp_check_send_data_fin(struct sock *sk) 2998 : : { - 2999 : 338360 : struct mptcp_subflow_context *subflow; - 3000 [ - + ]: 338360 : struct mptcp_sock *msk = mptcp_sk(sk); + 2999 : 454671 : struct mptcp_subflow_context *subflow; + 3000 [ - + ]: 454671 : struct mptcp_sock *msk = mptcp_sk(sk); 3001 : : - 3002 [ - + - - ]: 338360 : pr_debug("msk=%p snd_data_fin_enable=%d pending=%d snd_nxt=%llu write_seq=%llu\n", + 3002 [ - + - - ]: 454671 : pr_debug("msk=%p snd_data_fin_enable=%d pending=%d snd_nxt=%llu write_seq=%llu\n", 3003 : : msk, msk->snd_data_fin_enable, !!mptcp_send_head(sk), 3004 : : msk->snd_nxt, msk->write_seq); 3005 : : 3006 : : /* we still need to enqueue subflows or not really shutting down, 3007 : : * skip this 3008 : : */ - 3009 [ + + + + : 340508 : if (!msk->snd_data_fin_enable || msk->snd_nxt + 1 != msk->write_seq || - + + - + ] - 3010 : 2148 : mptcp_send_head(sk)) - 3011 : 336212 : return; + 3009 [ + + + + : 456811 : if (!msk->snd_data_fin_enable || msk->snd_nxt + 1 != msk->write_seq || + + + - + ] + 3010 : 2140 : mptcp_send_head(sk)) + 3011 : 452531 : return; 3012 : : - 3013 : 2148 : WRITE_ONCE(msk->snd_nxt, msk->write_seq); + 3013 : 2140 : WRITE_ONCE(msk->snd_nxt, msk->write_seq); 3014 : : - 3015 [ + + ]: 4962 : mptcp_for_each_subflow(msk, subflow) { - 3016 : 2814 : struct sock *tcp_sk = mptcp_subflow_tcp_sock(subflow); + 3015 [ + + ]: 4944 : mptcp_for_each_subflow(msk, subflow) { + 3016 : 2804 : struct sock *tcp_sk = mptcp_subflow_tcp_sock(subflow); 3017 : : - 3018 : 2814 : mptcp_subflow_shutdown(sk, tcp_sk, SEND_SHUTDOWN); + 3018 : 2804 : mptcp_subflow_shutdown(sk, tcp_sk, SEND_SHUTDOWN); 3019 : : } 3020 : : } 3021 : : - 3022 : 2148 : static void __mptcp_wr_shutdown(struct sock *sk) + 3022 : 2140 : static void __mptcp_wr_shutdown(struct sock *sk) 3023 : : { - 3024 [ - + ]: 2148 : struct mptcp_sock *msk = mptcp_sk(sk); + 3024 [ - + ]: 2140 : struct mptcp_sock *msk = mptcp_sk(sk); 3025 : : - 3026 [ - + - - ]: 2148 : pr_debug("msk=%p snd_data_fin_enable=%d shutdown=%x state=%d pending=%d\n", + 3026 [ - + - - ]: 2140 : pr_debug("msk=%p snd_data_fin_enable=%d shutdown=%x state=%d pending=%d\n", 3027 : : msk, msk->snd_data_fin_enable, sk->sk_shutdown, sk->sk_state, 3028 : : !!mptcp_send_head(sk)); 3029 : : 3030 : : /* will be ignored by fallback sockets */ - 3031 : 2148 : WRITE_ONCE(msk->write_seq, msk->write_seq + 1); - 3032 : 2148 : WRITE_ONCE(msk->snd_data_fin_enable, 1); + 3031 : 2140 : WRITE_ONCE(msk->write_seq, msk->write_seq + 1); + 3032 : 2140 : WRITE_ONCE(msk->snd_data_fin_enable, 1); 3033 : : - 3034 : 2148 : mptcp_check_send_data_fin(sk); - 3035 : 2148 : } + 3034 : 2140 : mptcp_check_send_data_fin(sk); + 3035 : 2140 : } 3036 : : 3037 : 3587 : static void __mptcp_destroy_sock(struct sock *sk) 3038 : : { @@ -3154,27 +3154,27 @@ 3066 : : 3067 : 0 : static __poll_t mptcp_check_readable(struct sock *sk) 3068 : : { - 3069 [ + + ]: 510800 : return mptcp_epollin_ready(sk) ? EPOLLIN | EPOLLRDNORM : 0; + 3069 [ + + ]: 691283 : return mptcp_epollin_ready(sk) ? EPOLLIN | EPOLLRDNORM : 0; 3070 : : } 3071 : : - 3072 : 2400 : static void mptcp_check_listen_stop(struct sock *sk) + 3072 : 2396 : static void mptcp_check_listen_stop(struct sock *sk) 3073 : : { - 3074 : 2400 : struct sock *ssk; + 3074 : 2396 : struct sock *ssk; 3075 : : - 3076 [ + + ]: 2400 : if (inet_sk_state_load(sk) != TCP_LISTEN) + 3076 [ + + ]: 2396 : if (inet_sk_state_load(sk) != TCP_LISTEN) 3077 : : return; 3078 : : - 3079 : 1248 : sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1); - 3080 [ - + ]: 1248 : ssk = mptcp_sk(sk)->first; - 3081 [ + - - + ]: 2496 : if (WARN_ON_ONCE(!ssk || inet_sk_state_load(ssk) != TCP_LISTEN)) + 3079 : 1249 : sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1); + 3080 [ - + ]: 1249 : ssk = mptcp_sk(sk)->first; + 3081 [ + - - + ]: 2498 : if (WARN_ON_ONCE(!ssk || inet_sk_state_load(ssk) != TCP_LISTEN)) 3082 : 0 : return; 3083 : : - 3084 : 1248 : lock_sock_nested(ssk, SINGLE_DEPTH_NESTING); - 3085 : 1248 : tcp_set_state(ssk, TCP_CLOSE); - 3086 : 1248 : mptcp_subflow_queue_clean(sk, ssk); - 3087 : 1248 : inet_csk_listen_stop(ssk); - 3088 : 1248 : mptcp_event_pm_listener(ssk, MPTCP_EVENT_LISTENER_CLOSED); - 3089 : 1248 : release_sock(ssk); + 3084 : 1249 : lock_sock_nested(ssk, SINGLE_DEPTH_NESTING); + 3085 : 1249 : tcp_set_state(ssk, TCP_CLOSE); + 3086 : 1249 : mptcp_subflow_queue_clean(sk, ssk); + 3087 : 1249 : inet_csk_listen_stop(ssk); + 3088 : 1249 : mptcp_event_pm_listener(ssk, MPTCP_EVENT_LISTENER_CLOSED); + 3089 : 1249 : release_sock(ssk); 3090 : : } 3091 : : 3092 : 3622 : bool __mptcp_close(struct sock *sk, long timeout) @@ -3186,62 +3186,62 @@ 3098 : : 3099 : 3622 : WRITE_ONCE(sk->sk_shutdown, SHUTDOWN_MASK); 3100 : : - 3101 [ + + + + ]: 3622 : if ((1 << sk->sk_state) & (TCPF_LISTEN | TCPF_CLOSE)) { - 3102 : 2340 : mptcp_check_listen_stop(sk); - 3103 : 2340 : mptcp_set_state(sk, TCP_CLOSE); - 3104 : 2340 : goto cleanup; + 3101 [ + + + + ]: 3622 : if ((1 << sk->sk_state) & (TCPF_LISTEN | TCPF_CLOSE)) { + 3102 : 2336 : mptcp_check_listen_stop(sk); + 3103 : 2336 : mptcp_set_state(sk, TCP_CLOSE); + 3104 : 2336 : goto cleanup; 3105 : : } 3106 : : - 3107 [ + + - + ]: 1282 : if (mptcp_data_avail(msk) || timeout < 0) { + 3107 [ + + - + ]: 1286 : if (mptcp_data_avail(msk) || timeout < 0) { 3108 : : /* If the msk has read data, or the caller explicitly ask it, 3109 : : * do the MPTCP equivalent of TCP reset, aka MPTCP fastclose 3110 : : */ - 3111 : 222 : mptcp_do_fastclose(sk); - 3112 : 222 : timeout = 0; - 3113 [ + + ]: 1060 : } else if (mptcp_close_state(sk)) { - 3114 : 751 : __mptcp_wr_shutdown(sk); + 3111 : 218 : mptcp_do_fastclose(sk); + 3112 : 218 : timeout = 0; + 3113 [ + + ]: 1068 : } else if (mptcp_close_state(sk)) { + 3114 : 741 : __mptcp_wr_shutdown(sk); 3115 : : } 3116 : : - 3117 : 1282 : sk_stream_wait_close(sk, timeout); + 3117 : 1286 : sk_stream_wait_close(sk, timeout); 3118 : : 3119 : 3622 : cleanup: 3120 : : /* orphan all the subflows */ - 3121 [ + + ]: 7898 : mptcp_for_each_subflow(msk, subflow) { - 3122 : 4276 : struct sock *ssk = mptcp_subflow_tcp_sock(subflow); - 3123 : 4276 : bool slow = lock_sock_fast_nested(ssk); + 3121 [ + + ]: 7896 : mptcp_for_each_subflow(msk, subflow) { + 3122 : 4274 : struct sock *ssk = mptcp_subflow_tcp_sock(subflow); + 3123 : 4274 : bool slow = lock_sock_fast_nested(ssk); 3124 : : - 3125 : 4276 : subflows_alive += ssk->sk_state != TCP_CLOSE; + 3125 : 4274 : subflows_alive += ssk->sk_state != TCP_CLOSE; 3126 : : 3127 : : /* since the close timeout takes precedence on the fail one, 3128 : : * cancel the latter 3129 : : */ - 3130 [ + + ]: 4276 : if (ssk == msk->first) + 3130 [ + + ]: 4274 : if (ssk == msk->first) 3131 : 3610 : subflow->fail_tout = 0; 3132 : : 3133 : : /* detach from the parent socket, but allow data_ready to 3134 : : * push incoming data into the mptcp stack, to properly ack it 3135 : : */ - 3136 : 4276 : ssk->sk_socket = NULL; - 3137 : 4276 : ssk->sk_wq = NULL; - 3138 : 4276 : unlock_sock_fast(ssk, slow); + 3136 : 4274 : ssk->sk_socket = NULL; + 3137 : 4274 : ssk->sk_wq = NULL; + 3138 : 4274 : unlock_sock_fast(ssk, slow); 3139 : : } 3140 : 3622 : sock_orphan(sk); 3141 : : 3142 : : /* all the subflows are closed, only timeout can change the msk 3143 : : * state, let's not keep resources busy for no reasons 3144 : : */ - 3145 [ + + ]: 3622 : if (subflows_alive == 0) - 3146 : 1695 : mptcp_set_state(sk, TCP_CLOSE); + 3145 [ + + ]: 3622 : if (subflows_alive == 0) + 3146 : 1694 : mptcp_set_state(sk, TCP_CLOSE); 3147 : : 3148 : 3622 : sock_hold(sk); 3149 [ - + ]: 3622 : pr_debug("msk=%p state=%d\n", sk, sk->sk_state); 3150 : 3622 : mptcp_pm_connection_closed(msk); 3151 : : - 3152 [ + + ]: 3622 : if (sk->sk_state == TCP_CLOSE) { - 3153 : 2612 : __mptcp_destroy_sock(sk); - 3154 : 2612 : do_cancel_work = true; + 3152 [ + + ]: 3622 : if (sk->sk_state == TCP_CLOSE) { + 3153 : 2608 : __mptcp_destroy_sock(sk); + 3154 : 2608 : do_cancel_work = true; 3155 : : } else { - 3156 : 1010 : mptcp_start_tout_timer(sk); + 3156 : 1014 : mptcp_start_tout_timer(sk); 3157 : : } 3158 : : 3159 : 3622 : return do_cancel_work; @@ -3255,34 +3255,34 @@ 3167 : : 3168 : 3622 : do_cancel_work = __mptcp_close(sk, timeout); 3169 : 3622 : release_sock(sk); - 3170 [ + + ]: 3622 : if (do_cancel_work) - 3171 : 2612 : mptcp_cancel_work(sk); + 3170 [ + + ]: 3622 : if (do_cancel_work) + 3171 : 2608 : mptcp_cancel_work(sk); 3172 : : 3173 : 3622 : sock_put(sk); 3174 : 3622 : } 3175 : : - 3176 : 4916 : static void mptcp_copy_inaddrs(struct sock *msk, const struct sock *ssk) + 3176 : 4918 : static void mptcp_copy_inaddrs(struct sock *msk, const struct sock *ssk) 3177 : : { 3178 : : #if IS_ENABLED(CONFIG_MPTCP_IPV6) - 3179 [ + - ]: 4916 : const struct ipv6_pinfo *ssk6 = inet6_sk(ssk); - 3180 [ + - ]: 4916 : struct ipv6_pinfo *msk6 = inet6_sk(msk); + 3179 [ + - ]: 4918 : const struct ipv6_pinfo *ssk6 = inet6_sk(ssk); + 3180 [ + - ]: 4918 : struct ipv6_pinfo *msk6 = inet6_sk(msk); 3181 : : - 3182 : 4916 : msk->sk_v6_daddr = ssk->sk_v6_daddr; - 3183 : 4916 : msk->sk_v6_rcv_saddr = ssk->sk_v6_rcv_saddr; + 3182 : 4918 : msk->sk_v6_daddr = ssk->sk_v6_daddr; + 3183 : 4918 : msk->sk_v6_rcv_saddr = ssk->sk_v6_rcv_saddr; 3184 : : - 3185 [ + + ]: 4916 : if (msk6 && ssk6) { - 3186 : 1920 : msk6->saddr = ssk6->saddr; - 3187 : 1920 : msk6->flow_label = ssk6->flow_label; + 3185 [ + + ]: 4918 : if (msk6 && ssk6) { + 3186 : 1922 : msk6->saddr = ssk6->saddr; + 3187 : 1922 : msk6->flow_label = ssk6->flow_label; 3188 : : } 3189 : : #endif 3190 : : - 3191 : 4916 : inet_sk(msk)->inet_num = inet_sk(ssk)->inet_num; - 3192 : 4916 : inet_sk(msk)->inet_dport = inet_sk(ssk)->inet_dport; - 3193 : 4916 : inet_sk(msk)->inet_sport = inet_sk(ssk)->inet_sport; - 3194 : 4916 : inet_sk(msk)->inet_daddr = inet_sk(ssk)->inet_daddr; - 3195 : 4916 : inet_sk(msk)->inet_saddr = inet_sk(ssk)->inet_saddr; - 3196 : 4916 : inet_sk(msk)->inet_rcv_saddr = inet_sk(ssk)->inet_rcv_saddr; - 3197 : 4916 : } + 3191 : 4918 : inet_sk(msk)->inet_num = inet_sk(ssk)->inet_num; + 3192 : 4918 : inet_sk(msk)->inet_dport = inet_sk(ssk)->inet_dport; + 3193 : 4918 : inet_sk(msk)->inet_sport = inet_sk(ssk)->inet_sport; + 3194 : 4918 : inet_sk(msk)->inet_daddr = inet_sk(ssk)->inet_daddr; + 3195 : 4918 : inet_sk(msk)->inet_saddr = inet_sk(ssk)->inet_saddr; + 3196 : 4918 : inet_sk(msk)->inet_rcv_saddr = inet_sk(ssk)->inet_rcv_saddr; + 3197 : 4918 : } 3198 : : 3199 : 60 : static int mptcp_disconnect(struct sock *sk, int flags) 3200 : : { @@ -3491,8 +3491,8 @@ 3399 : 3651 : __mptcp_clear_xmit(sk); 3400 : : 3401 : : /* join list will be eventually flushed (with rst) at sock lock release time */ - 3402 [ + + ]: 7858 : mptcp_for_each_subflow_safe(msk, subflow, tmp) - 3403 : 4207 : __mptcp_close_ssk(sk, mptcp_subflow_tcp_sock(subflow), subflow, flags); + 3402 [ + + ]: 7856 : mptcp_for_each_subflow_safe(msk, subflow, tmp) + 3403 : 4205 : __mptcp_close_ssk(sk, mptcp_subflow_tcp_sock(subflow), subflow, flags); 3404 : : 3405 : : /* move to sk_receive_queue, sk_stream_kill_queues will purge it */ 3406 : 3651 : mptcp_data_lock(sk); @@ -3521,23 +3521,23 @@ 3429 : 3591 : sk_sockets_allocated_dec(sk); 3430 : 3591 : } 3431 : : - 3432 : 213371 : void __mptcp_data_acked(struct sock *sk) + 3432 : 316231 : void __mptcp_data_acked(struct sock *sk) 3433 : : { - 3434 [ + + ]: 213371 : if (!sock_owned_by_user(sk)) - 3435 : 148228 : __mptcp_clean_una(sk); + 3434 [ + + ]: 316231 : if (!sock_owned_by_user(sk)) + 3435 : 212279 : __mptcp_clean_una(sk); 3436 : : else - 3437 [ - + ]: 65143 : __set_bit(MPTCP_CLEAN_UNA, &mptcp_sk(sk)->cb_flags); - 3438 : 213371 : } + 3437 [ - + ]: 103952 : __set_bit(MPTCP_CLEAN_UNA, &mptcp_sk(sk)->cb_flags); + 3438 : 316231 : } 3439 : : - 3440 : 764989 : void __mptcp_check_push(struct sock *sk, struct sock *ssk) + 3440 : 979762 : void __mptcp_check_push(struct sock *sk, struct sock *ssk) 3441 : : { - 3442 [ + + ]: 764989 : if (!mptcp_send_head(sk)) + 3442 [ + + ]: 979762 : if (!mptcp_send_head(sk)) 3443 : : return; 3444 : : - 3445 [ + + ]: 85414 : if (!sock_owned_by_user(sk)) - 3446 : 64121 : __mptcp_subflow_push_pending(sk, ssk, false); + 3445 [ + + ]: 106975 : if (!sock_owned_by_user(sk)) + 3446 : 79991 : __mptcp_subflow_push_pending(sk, ssk, false); 3447 : : else - 3448 [ - + ]: 21293 : __set_bit(MPTCP_PUSH_PENDING, &mptcp_sk(sk)->cb_flags); + 3448 [ - + ]: 26984 : __set_bit(MPTCP_PUSH_PENDING, &mptcp_sk(sk)->cb_flags); 3449 : : } 3450 : : 3451 : : #define MPTCP_FLAGS_PROCESS_CTX_NEED (BIT(MPTCP_PUSH_PENDING) | \ @@ -3545,20 +3545,20 @@ 3453 : : BIT(MPTCP_FLUSH_JOIN_LIST)) 3454 : : 3455 : : /* processes deferred events and flush wmem */ - 3456 : 1091255 : static void mptcp_release_cb(struct sock *sk) + 3456 : 1422124 : static void mptcp_release_cb(struct sock *sk) 3457 : : __must_hold(&sk->sk_lock.slock) 3458 : : { - 3459 [ - + ]: 1091255 : struct mptcp_sock *msk = mptcp_sk(sk); + 3459 [ - + ]: 1422124 : struct mptcp_sock *msk = mptcp_sk(sk); 3460 : : - 3461 : 559989 : for (;;) { - 3462 : 1111070 : unsigned long flags = (msk->cb_flags & MPTCP_FLAGS_PROCESS_CTX_NEED); - 3463 : 1111070 : struct list_head join_list; + 3461 : 564670 : for (;;) { + 3462 : 1447730 : unsigned long flags = (msk->cb_flags & MPTCP_FLAGS_PROCESS_CTX_NEED); + 3463 : 1447730 : struct list_head join_list; 3464 : : - 3465 [ + + ]: 1111070 : if (!flags) + 3465 [ + + ]: 1447730 : if (!flags) 3466 : : break; 3467 : : - 3468 [ + + ]: 19815 : INIT_LIST_HEAD(&join_list); - 3469 [ + + ]: 19815 : list_splice_init(&msk->join_list, &join_list); + 3468 [ + + ]: 25606 : INIT_LIST_HEAD(&join_list); + 3469 [ + + ]: 25606 : list_splice_init(&msk->join_list, &join_list); 3470 : : 3471 : : /* the following actions acquire the subflow socket lock 3472 : : * @@ -3567,42 +3567,42 @@ 3475 : : * datapath acquires the msk socket spinlock while helding 3476 : : * the subflow socket lock 3477 : : */ - 3478 : 19815 : msk->cb_flags &= ~flags; - 3479 : 19815 : spin_unlock_bh(&sk->sk_lock.slock); + 3478 : 25606 : msk->cb_flags &= ~flags; + 3479 : 25606 : spin_unlock_bh(&sk->sk_lock.slock); 3480 : : - 3481 [ + + ]: 19815 : if (flags & BIT(MPTCP_FLUSH_JOIN_LIST)) - 3482 : 41 : __mptcp_flush_join_list(sk, &join_list); - 3483 [ + + ]: 19815 : if (flags & BIT(MPTCP_PUSH_PENDING)) - 3484 : 17203 : __mptcp_push_pending(sk, 0); - 3485 [ + + ]: 19815 : if (flags & BIT(MPTCP_RETRANSMIT)) - 3486 : 3242 : __mptcp_retrans(sk); + 3481 [ + + ]: 25606 : if (flags & BIT(MPTCP_FLUSH_JOIN_LIST)) + 3482 : 38 : __mptcp_flush_join_list(sk, &join_list); + 3483 [ + + ]: 25606 : if (flags & BIT(MPTCP_PUSH_PENDING)) + 3484 : 22503 : __mptcp_push_pending(sk, 0); + 3485 [ + + ]: 25606 : if (flags & BIT(MPTCP_RETRANSMIT)) + 3486 : 3851 : __mptcp_retrans(sk); 3487 : : - 3488 : 19815 : cond_resched(); - 3489 : 19815 : spin_lock_bh(&sk->sk_lock.slock); + 3488 : 25606 : cond_resched(); + 3489 : 25606 : spin_lock_bh(&sk->sk_lock.slock); 3490 : : } 3491 : : - 3492 [ - + - - : 1657428 : if (__test_and_clear_bit(MPTCP_CLEAN_UNA, &msk->cb_flags)) - - - + + ] - 3493 : 52123 : __mptcp_clean_una_wakeup(sk); - 3494 [ + + ]: 1091255 : if (unlikely(msk->cb_flags)) { + 3492 [ - + - - : 2320085 : if (__test_and_clear_bit(MPTCP_CLEAN_UNA, &msk->cb_flags)) + - - + + ] + 3493 : 82697 : __mptcp_clean_una_wakeup(sk); + 3494 [ + + ]: 1422124 : if (unlikely(msk->cb_flags)) { 3495 : : /* be sure to sync the msk state before taking actions 3496 : : * depending on sk_state (MPTCP_ERROR_REPORT) 3497 : : * On sk release avoid actions depending on the first subflow 3498 : : */ - 3499 [ - + - - : 6383 : if (__test_and_clear_bit(MPTCP_SYNC_STATE, &msk->cb_flags) && msk->first) - - - + + + + 3499 [ - + - - : 6592 : if (__test_and_clear_bit(MPTCP_SYNC_STATE, &msk->cb_flags) && msk->first) + - - + + + - ] - 3500 : 881 : __mptcp_sync_state(sk, msk->pending_state); - 3501 [ - + - - : 6383 : if (__test_and_clear_bit(MPTCP_ERROR_REPORT, &msk->cb_flags)) - - - + + ] - 3502 : 453 : __mptcp_error_report(sk); - 3503 [ - + - - : 6383 : if (__test_and_clear_bit(MPTCP_SYNC_SNDBUF, &msk->cb_flags)) - - - + + ] - 3504 : 1915 : __mptcp_sync_sndbuf(sk); + 3500 : 882 : __mptcp_sync_state(sk, msk->pending_state); + 3501 [ - + - - : 6592 : if (__test_and_clear_bit(MPTCP_ERROR_REPORT, &msk->cb_flags)) + - - + + ] + 3502 : 444 : __mptcp_error_report(sk); + 3503 [ - + - - : 6592 : if (__test_and_clear_bit(MPTCP_SYNC_SNDBUF, &msk->cb_flags)) + - - + + ] + 3504 : 2027 : __mptcp_sync_sndbuf(sk); 3505 : : } 3506 : : - 3507 : 1091255 : __mptcp_update_rmem(sk); - 3508 : 1091255 : } + 3507 : 1422124 : __mptcp_update_rmem(sk); + 3508 : 1422124 : } 3509 : : 3510 : : /* MP_JOIN client subflow must wait for 4th ack before sending any data: 3511 : : * TCP can't schedule delack timer before the subflow is fully established. @@ -3631,30 +3631,30 @@ 3534 : 90 : sk_reset_timer(ssk, &icsk->icsk_delack_timer, timeout); 3535 : : } 3536 : : - 3537 : 26249 : void mptcp_subflow_process_delegated(struct sock *ssk, long status) + 3537 : 28202 : void mptcp_subflow_process_delegated(struct sock *ssk, long status) 3538 : : { - 3539 [ + + ]: 26249 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); - 3540 : 26249 : struct sock *sk = subflow->conn; + 3539 [ + + ]: 28202 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); + 3540 : 28202 : struct sock *sk = subflow->conn; 3541 : : - 3542 [ + + ]: 26249 : if (status & BIT(MPTCP_DELEGATE_SEND)) { - 3543 : 4153 : mptcp_data_lock(sk); - 3544 [ + + ]: 4153 : if (!sock_owned_by_user(sk)) - 3545 : 3856 : __mptcp_subflow_push_pending(sk, ssk, true); + 3542 [ + + ]: 28202 : if (status & BIT(MPTCP_DELEGATE_SEND)) { + 3543 : 4547 : mptcp_data_lock(sk); + 3544 [ + + ]: 4547 : if (!sock_owned_by_user(sk)) + 3545 : 4250 : __mptcp_subflow_push_pending(sk, ssk, true); 3546 : : else 3547 [ - + ]: 297 : __set_bit(MPTCP_PUSH_PENDING, &mptcp_sk(sk)->cb_flags); - 3548 : 4153 : mptcp_data_unlock(sk); + 3548 : 4547 : mptcp_data_unlock(sk); 3549 : : } - 3550 [ + + ]: 26249 : if (status & BIT(MPTCP_DELEGATE_SNDBUF)) { - 3551 : 21397 : mptcp_data_lock(sk); - 3552 [ + + ]: 21397 : if (!sock_owned_by_user(sk)) - 3553 : 19208 : __mptcp_sync_sndbuf(sk); + 3550 [ + + ]: 28202 : if (status & BIT(MPTCP_DELEGATE_SNDBUF)) { + 3551 : 23246 : mptcp_data_lock(sk); + 3552 [ + + ]: 23246 : if (!sock_owned_by_user(sk)) + 3553 : 20890 : __mptcp_sync_sndbuf(sk); 3554 : : else - 3555 [ - + ]: 2189 : __set_bit(MPTCP_SYNC_SNDBUF, &mptcp_sk(sk)->cb_flags); - 3556 : 21397 : mptcp_data_unlock(sk); + 3555 [ - + ]: 2356 : __set_bit(MPTCP_SYNC_SNDBUF, &mptcp_sk(sk)->cb_flags); + 3556 : 23246 : mptcp_data_unlock(sk); 3557 : : } - 3558 [ + + ]: 26249 : if (status & BIT(MPTCP_DELEGATE_ACK)) + 3558 [ + + ]: 28202 : if (status & BIT(MPTCP_DELEGATE_ACK)) 3559 : 499 : schedule_3rdack_retransmission(ssk); - 3560 : 26249 : } + 3560 : 28202 : } 3561 : : 3562 : 0 : static int mptcp_hash(struct sock *sk) 3563 : : { @@ -3704,14 +3704,14 @@ 3607 : 1118 : mptcp_pm_new_connection(msk, ssk, 0); 3608 : 1118 : } 3609 : : - 3610 : 4642 : void mptcp_sock_graft(struct sock *sk, struct socket *parent) + 3610 : 4640 : void mptcp_sock_graft(struct sock *sk, struct socket *parent) 3611 : : { - 3612 : 4642 : write_lock_bh(&sk->sk_callback_lock); - 3613 : 4642 : rcu_assign_pointer(sk->sk_wq, &parent->wq); - 3614 : 4642 : sk_set_socket(sk, parent); - 3615 : 4642 : sk->sk_uid = SOCK_INODE(parent)->i_uid; - 3616 : 4642 : write_unlock_bh(&sk->sk_callback_lock); - 3617 : 4642 : } + 3612 : 4640 : write_lock_bh(&sk->sk_callback_lock); + 3613 : 4640 : rcu_assign_pointer(sk->sk_wq, &parent->wq); + 3614 : 4640 : sk_set_socket(sk, parent); + 3615 : 4640 : sk->sk_uid = SOCK_INODE(parent)->i_uid; + 3616 : 4640 : write_unlock_bh(&sk->sk_callback_lock); + 3617 : 4640 : } 3618 : : 3619 : 992 : bool mptcp_finish_join(struct sock *ssk) 3620 : : { @@ -3742,16 +3742,16 @@ 3645 : : * handle it 3646 : : */ 3647 : 505 : mptcp_data_lock(parent); - 3648 [ + + ]: 505 : if (!sock_owned_by_user(parent)) { - 3649 : 462 : ret = __mptcp_finish_join(msk, ssk); - 3650 [ + - ]: 462 : if (ret) { - 3651 : 462 : sock_hold(ssk); - 3652 : 462 : list_add_tail(&subflow->node, &msk->conn_list); + 3648 [ + + ]: 505 : if (!sock_owned_by_user(parent)) { + 3649 : 461 : ret = __mptcp_finish_join(msk, ssk); + 3650 [ + - ]: 461 : if (ret) { + 3651 : 461 : sock_hold(ssk); + 3652 : 461 : list_add_tail(&subflow->node, &msk->conn_list); 3653 : : } 3654 : : } else { - 3655 : 43 : sock_hold(ssk); - 3656 [ - + ]: 43 : list_add_tail(&subflow->node, &msk->join_list); - 3657 [ - + - - : 43 : __set_bit(MPTCP_FLUSH_JOIN_LIST, &msk->cb_flags); + 3655 : 44 : sock_hold(ssk); + 3656 [ - + ]: 44 : list_add_tail(&subflow->node, &msk->join_list); + 3657 [ - + - - : 44 : __set_bit(MPTCP_FLUSH_JOIN_LIST, &msk->cb_flags); - - ] 3658 : : } 3659 : 505 : mptcp_data_unlock(parent); @@ -3765,55 +3765,55 @@ 3667 : : return true; 3668 : : } 3669 : : - 3670 : 1479 : static void mptcp_shutdown(struct sock *sk, int how) + 3670 : 1486 : static void mptcp_shutdown(struct sock *sk, int how) 3671 : : { - 3672 [ - + ]: 1479 : pr_debug("sk=%p, how=%d\n", sk, how); + 3672 [ - + ]: 1486 : pr_debug("sk=%p, how=%d\n", sk, how); 3673 : : - 3674 [ + - + + ]: 1479 : if ((how & SEND_SHUTDOWN) && mptcp_close_state(sk)) - 3675 : 1397 : __mptcp_wr_shutdown(sk); - 3676 : 1479 : } + 3674 [ + - + + ]: 1486 : if ((how & SEND_SHUTDOWN) && mptcp_close_state(sk)) + 3675 : 1399 : __mptcp_wr_shutdown(sk); + 3676 : 1486 : } 3677 : : - 3678 : 5551 : static int mptcp_forward_alloc_get(const struct sock *sk) + 3678 : 5531 : static int mptcp_forward_alloc_get(const struct sock *sk) 3679 : : { - 3680 : 11102 : return READ_ONCE(sk->sk_forward_alloc) + - 3681 [ - + ]: 5551 : READ_ONCE(mptcp_sk(sk)->rmem_fwd_alloc); + 3680 : 11062 : return READ_ONCE(sk->sk_forward_alloc) + + 3681 [ - + ]: 5531 : READ_ONCE(mptcp_sk(sk)->rmem_fwd_alloc); 3682 : : } 3683 : : - 3684 : 60 : static int mptcp_ioctl_outq(const struct mptcp_sock *msk, u64 v) + 3684 : 55 : static int mptcp_ioctl_outq(const struct mptcp_sock *msk, u64 v) 3685 : : { - 3686 : 60 : const struct sock *sk = (void *)msk; - 3687 : 60 : u64 delta; + 3686 : 55 : const struct sock *sk = (void *)msk; + 3687 : 55 : u64 delta; 3688 : : - 3689 [ + - ]: 60 : if (sk->sk_state == TCP_LISTEN) + 3689 [ + - ]: 55 : if (sk->sk_state == TCP_LISTEN) 3690 : : return -EINVAL; 3691 : : - 3692 [ + + + - ]: 60 : if ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) + 3692 [ + + + - ]: 55 : if ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) 3693 : : return 0; 3694 : : - 3695 : 60 : delta = msk->write_seq - v; - 3696 [ + + + + ]: 60 : if (__mptcp_check_fallback(msk) && msk->first) { - 3697 [ - + ]: 34 : struct tcp_sock *tp = tcp_sk(msk->first); + 3695 : 55 : delta = msk->write_seq - v; + 3696 [ + + + + ]: 55 : if (__mptcp_check_fallback(msk) && msk->first) { + 3697 [ - + ]: 32 : struct tcp_sock *tp = tcp_sk(msk->first); 3698 : : 3699 : : /* the first subflow is disconnected after close - see 3700 : : * __mptcp_close_ssk(). tcp_disconnect() moves the write_seq 3701 : : * so ignore that status, too. 3702 : : */ - 3703 [ + + + + ]: 34 : if (!((1 << msk->first->sk_state) & + 3703 [ + + + + ]: 32 : if (!((1 << msk->first->sk_state) & 3704 : : (TCPF_SYN_SENT | TCPF_SYN_RECV | TCPF_CLOSE))) - 3705 : 18 : delta += READ_ONCE(tp->write_seq) - tp->snd_una; + 3705 : 16 : delta += READ_ONCE(tp->write_seq) - tp->snd_una; 3706 : : } - 3707 : 60 : if (delta > INT_MAX) + 3707 : 55 : if (delta > INT_MAX) 3708 : : delta = INT_MAX; 3709 : : - 3710 : 60 : return (int)delta; + 3710 : 55 : return (int)delta; 3711 : : } 3712 : : - 3713 : 60 : static int mptcp_ioctl(struct sock *sk, int cmd, int *karg) + 3713 : 55 : static int mptcp_ioctl(struct sock *sk, int cmd, int *karg) 3714 : : { - 3715 [ - + ]: 60 : struct mptcp_sock *msk = mptcp_sk(sk); - 3716 : 60 : bool slow; + 3715 [ - + ]: 55 : struct mptcp_sock *msk = mptcp_sk(sk); + 3716 : 55 : bool slow; 3717 : : - 3718 [ - + + - ]: 60 : switch (cmd) { + 3718 [ - + + - ]: 55 : switch (cmd) { 3719 : 0 : case SIOCINQ: 3720 [ # # ]: 0 : if (sk->sk_state == TCP_LISTEN) 3721 : : return -EINVAL; @@ -3823,11 +3823,11 @@ 3725 : 0 : *karg = mptcp_inq_hint(sk); 3726 : 0 : release_sock(sk); 3727 : 0 : break; - 3728 : 23 : case SIOCOUTQ: - 3729 : 52 : slow = lock_sock_fast(sk); - 3730 : 52 : *karg = mptcp_ioctl_outq(msk, READ_ONCE(msk->snd_una)); - 3731 : 52 : unlock_sock_fast(sk, slow); - 3732 : 52 : break; + 3728 : 21 : case SIOCOUTQ: + 3729 : 47 : slow = lock_sock_fast(sk); + 3730 : 47 : *karg = mptcp_ioctl_outq(msk, READ_ONCE(msk->snd_una)); + 3731 : 47 : unlock_sock_fast(sk, slow); + 3732 : 47 : break; 3733 : 4 : case SIOCOUTQNSD: 3734 : 8 : slow = lock_sock_fast(sk); 3735 : 8 : *karg = mptcp_ioctl_outq(msk, msk->snd_nxt); @@ -3972,52 +3972,52 @@ 3873 [ + - ]: 542 : else if (sk->sk_family == AF_INET6) 3874 : 542 : err = inet6_bind_sk(ssk, uaddr, addr_len); 3875 : : #endif - 3876 [ + + ]: 1246 : if (!err) - 3877 : 1242 : mptcp_copy_inaddrs(sk, ssk); + 3876 [ + + ]: 1246 : if (!err) + 3877 : 1243 : mptcp_copy_inaddrs(sk, ssk); 3878 : : - 3879 : 4 : unlock: + 3879 : 3 : unlock: 3880 : 1246 : release_sock(sk); 3881 : 1246 : return err; 3882 : : } 3883 : : - 3884 : 1242 : static int mptcp_listen(struct socket *sock, int backlog) + 3884 : 1243 : static int mptcp_listen(struct socket *sock, int backlog) 3885 : : { - 3886 [ - + ]: 1242 : struct mptcp_sock *msk = mptcp_sk(sock->sk); - 3887 : 1242 : struct sock *sk = sock->sk; - 3888 : 1242 : struct sock *ssk; - 3889 : 1242 : int err; + 3886 [ - + ]: 1243 : struct mptcp_sock *msk = mptcp_sk(sock->sk); + 3887 : 1243 : struct sock *sk = sock->sk; + 3888 : 1243 : struct sock *ssk; + 3889 : 1243 : int err; 3890 : : - 3891 [ - + ]: 1242 : pr_debug("msk=%p\n", msk); + 3891 [ - + ]: 1243 : pr_debug("msk=%p\n", msk); 3892 : : - 3893 : 1242 : lock_sock(sk); + 3893 : 1243 : lock_sock(sk); 3894 : : - 3895 : 1242 : err = -EINVAL; - 3896 [ - + ]: 1242 : if (sock->state != SS_UNCONNECTED || sock->type != SOCK_STREAM) + 3895 : 1243 : err = -EINVAL; + 3896 [ - + ]: 1243 : if (sock->state != SS_UNCONNECTED || sock->type != SOCK_STREAM) 3897 : 0 : goto unlock; 3898 : : - 3899 : 1242 : ssk = __mptcp_nmpc_sk(msk); - 3900 [ - + ]: 1242 : if (IS_ERR(ssk)) { + 3899 : 1243 : ssk = __mptcp_nmpc_sk(msk); + 3900 [ - + ]: 1243 : if (IS_ERR(ssk)) { 3901 : 0 : err = PTR_ERR(ssk); 3902 : 0 : goto unlock; 3903 : : } 3904 : : - 3905 : 1242 : mptcp_set_state(sk, TCP_LISTEN); - 3906 : 1242 : sock_set_flag(sk, SOCK_RCU_FREE); + 3905 : 1243 : mptcp_set_state(sk, TCP_LISTEN); + 3906 : 1243 : sock_set_flag(sk, SOCK_RCU_FREE); 3907 : : - 3908 : 1242 : lock_sock(ssk); - 3909 : 1242 : err = __inet_listen_sk(ssk, backlog); - 3910 : 1242 : release_sock(ssk); - 3911 : 1242 : mptcp_set_state(sk, inet_sk_state_load(ssk)); + 3908 : 1243 : lock_sock(ssk); + 3909 : 1243 : err = __inet_listen_sk(ssk, backlog); + 3910 : 1243 : release_sock(ssk); + 3911 : 1243 : mptcp_set_state(sk, inet_sk_state_load(ssk)); 3912 : : - 3913 [ - + ]: 1242 : if (!err) { - 3914 : 1242 : sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1); - 3915 : 1242 : mptcp_copy_inaddrs(sk, ssk); - 3916 : 1242 : mptcp_event_pm_listener(ssk, MPTCP_EVENT_LISTENER_CREATED); + 3913 [ - + ]: 1243 : if (!err) { + 3914 : 1243 : sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1); + 3915 : 1243 : mptcp_copy_inaddrs(sk, ssk); + 3916 : 1243 : mptcp_event_pm_listener(ssk, MPTCP_EVENT_LISTENER_CREATED); 3917 : : } 3918 : : 3919 : 0 : unlock: - 3920 : 1242 : release_sock(sk); - 3921 : 1242 : return err; + 3920 : 1243 : release_sock(sk); + 3921 : 1243 : return err; 3922 : : } 3923 : : 3924 : 1220 : static int mptcp_stream_accept(struct socket *sock, struct socket *newsock, @@ -4070,11 +4070,11 @@ 3971 : : /* set ssk->sk_socket of accept()ed flows to mptcp socket. 3972 : : * This is needed so NOSPACE flag can be set from tcp stack. 3973 : : */ - 3974 [ + + ]: 2247 : mptcp_for_each_subflow(msk, subflow) { - 3975 [ + - ]: 1127 : struct sock *ssk = mptcp_subflow_tcp_sock(subflow); + 3974 [ + + ]: 2250 : mptcp_for_each_subflow(msk, subflow) { + 3975 [ + - ]: 1130 : struct sock *ssk = mptcp_subflow_tcp_sock(subflow); 3976 : : - 3977 [ + - ]: 1127 : if (!ssk->sk_socket) - 3978 : 1127 : mptcp_sock_graft(ssk, newsock); + 3977 [ + - ]: 1130 : if (!ssk->sk_socket) + 3978 : 1130 : mptcp_sock_graft(ssk, newsock); 3979 : : } 3980 : : 3981 : : /* Do late cleanup for the first subflow as necessary. Also @@ -4105,56 +4105,56 @@ 4006 : 1214 : return 0; 4007 : : } 4008 : : - 4009 : 274457 : static __poll_t mptcp_check_writeable(struct mptcp_sock *msk) + 4009 : 454742 : static __poll_t mptcp_check_writeable(struct mptcp_sock *msk) 4010 : : { - 4011 : 274457 : struct sock *sk = (struct sock *)msk; + 4011 : 454742 : struct sock *sk = (struct sock *)msk; 4012 : : - 4013 [ + + ]: 274457 : if (__mptcp_stream_is_writeable(sk, 1)) + 4013 [ + + ]: 454742 : if (__mptcp_stream_is_writeable(sk, 1)) 4014 : : return EPOLLOUT | EPOLLWRNORM; 4015 : : - 4016 : 81743 : set_bit(SOCK_NOSPACE, &sk->sk_socket->flags); - 4017 : 81743 : smp_mb__after_atomic(); /* NOSPACE is changed by mptcp_write_space() */ - 4018 [ - + ]: 81743 : if (__mptcp_stream_is_writeable(sk, 1)) + 4016 : 135273 : set_bit(SOCK_NOSPACE, &sk->sk_socket->flags); + 4017 : 135273 : smp_mb__after_atomic(); /* NOSPACE is changed by mptcp_write_space() */ + 4018 [ - + ]: 135273 : if (__mptcp_stream_is_writeable(sk, 1)) 4019 : : return EPOLLOUT | EPOLLWRNORM; 4020 : : 4021 : : return 0; 4022 : : } 4023 : : - 4024 : 512684 : static __poll_t mptcp_poll(struct file *file, struct socket *sock, + 4024 : 693168 : static __poll_t mptcp_poll(struct file *file, struct socket *sock, 4025 : : struct poll_table_struct *wait) 4026 : : { - 4027 : 512684 : struct sock *sk = sock->sk; - 4028 : 512684 : struct mptcp_sock *msk; - 4029 : 512684 : __poll_t mask = 0; - 4030 : 512684 : u8 shutdown; - 4031 : 512684 : int state; + 4027 : 693168 : struct sock *sk = sock->sk; + 4028 : 693168 : struct mptcp_sock *msk; + 4029 : 693168 : __poll_t mask = 0; + 4030 : 693168 : u8 shutdown; + 4031 : 693168 : int state; 4032 : : - 4033 [ - + ]: 512684 : msk = mptcp_sk(sk); - 4034 : 512684 : sock_poll_wait(file, sock, wait); + 4033 [ - + ]: 693168 : msk = mptcp_sk(sk); + 4034 : 693168 : sock_poll_wait(file, sock, wait); 4035 : : - 4036 : 512684 : state = inet_sk_state_load(sk); - 4037 [ - + ]: 512684 : pr_debug("msk=%p state=%d flags=%lx\n", msk, state, msk->flags); - 4038 [ + + ]: 512684 : if (state == TCP_LISTEN) { - 4039 : 1884 : struct sock *ssk = READ_ONCE(msk->first); + 4036 : 693168 : state = inet_sk_state_load(sk); + 4037 [ - + ]: 693168 : pr_debug("msk=%p state=%d flags=%lx\n", msk, state, msk->flags); + 4038 [ + + ]: 693168 : if (state == TCP_LISTEN) { + 4039 : 1885 : struct sock *ssk = READ_ONCE(msk->first); 4040 : : - 4041 [ - + ]: 1884 : if (WARN_ON_ONCE(!ssk)) + 4041 [ - + ]: 1885 : if (WARN_ON_ONCE(!ssk)) 4042 : 0 : return 0; 4043 : : - 4044 [ + + ]: 2824 : return inet_csk_listen_poll(ssk); + 4044 [ + + ]: 2826 : return inet_csk_listen_poll(ssk); 4045 : : } 4046 : : - 4047 : 510800 : shutdown = READ_ONCE(sk->sk_shutdown); - 4048 [ + + ]: 510800 : if (shutdown == SHUTDOWN_MASK || state == TCP_CLOSE) - 4049 : 9842 : mask |= EPOLLHUP; - 4050 [ + + ]: 510800 : if (shutdown & RCV_SHUTDOWN) - 4051 : 174208 : mask |= EPOLLIN | EPOLLRDNORM | EPOLLRDHUP; + 4047 : 691283 : shutdown = READ_ONCE(sk->sk_shutdown); + 4048 [ + + ]: 691283 : if (shutdown == SHUTDOWN_MASK || state == TCP_CLOSE) + 4049 : 8858 : mask |= EPOLLHUP; + 4050 [ + + ]: 691283 : if (shutdown & RCV_SHUTDOWN) + 4051 : 157629 : mask |= EPOLLIN | EPOLLRDNORM | EPOLLRDHUP; 4052 : : - 4053 [ + - ]: 510800 : if (state != TCP_SYN_SENT && state != TCP_SYN_RECV) { - 4054 : 510800 : mask |= mptcp_check_readable(sk); - 4055 [ + + ]: 510800 : if (shutdown & SEND_SHUTDOWN) - 4056 : 236343 : mask |= EPOLLOUT | EPOLLWRNORM; + 4053 [ + - ]: 691283 : if (state != TCP_SYN_SENT && state != TCP_SYN_RECV) { + 4054 : 691283 : mask |= mptcp_check_readable(sk); + 4055 [ + + ]: 691283 : if (shutdown & SEND_SHUTDOWN) + 4056 : 236541 : mask |= EPOLLOUT | EPOLLWRNORM; 4057 : : else - 4058 : 274457 : mask |= mptcp_check_writeable(msk); + 4058 : 454742 : mask |= mptcp_check_writeable(msk); 4059 [ # # # # ]: 0 : } else if (state == TCP_SYN_SENT && 4060 [ # # ]: 0 : inet_test_bit(DEFER_CONNECT, sk)) { 4061 : : /* cf tcp_poll() note about TFO */ @@ -4162,9 +4162,9 @@ 4063 : : } 4064 : : 4065 : : /* This barrier is coupled with smp_wmb() in __mptcp_error_report() */ - 4066 : 510800 : smp_rmb(); - 4067 [ + + ]: 510800 : if (READ_ONCE(sk->sk_err)) - 4068 : 20 : mask |= EPOLLERR; + 4066 : 691283 : smp_rmb(); + 4067 [ + + ]: 691283 : if (READ_ONCE(sk->sk_err)) + 4068 : 21 : mask |= EPOLLERR; 4069 : : 4070 : : return mask; 4071 : : } @@ -4199,40 +4199,40 @@ 4100 : : .flags = INET_PROTOSW_ICSK, 4101 : : }; 4102 : : - 4103 : 28124 : static int mptcp_napi_poll(struct napi_struct *napi, int budget) + 4103 : 31284 : static int mptcp_napi_poll(struct napi_struct *napi, int budget) 4104 : : { - 4105 : 28124 : struct mptcp_delegated_action *delegated; - 4106 : 28124 : struct mptcp_subflow_context *subflow; - 4107 : 28124 : int work_done = 0; + 4105 : 31284 : struct mptcp_delegated_action *delegated; + 4106 : 31284 : struct mptcp_subflow_context *subflow; + 4107 : 31284 : int work_done = 0; 4108 : : - 4109 : 28124 : delegated = container_of(napi, struct mptcp_delegated_action, napi); - 4110 [ + + ]: 57421 : while ((subflow = mptcp_subflow_delegated_next(delegated)) != NULL) { - 4111 : 29297 : struct sock *ssk = mptcp_subflow_tcp_sock(subflow); + 4109 : 31284 : delegated = container_of(napi, struct mptcp_delegated_action, napi); + 4110 [ + + ]: 63781 : while ((subflow = mptcp_subflow_delegated_next(delegated)) != NULL) { + 4111 : 32497 : struct sock *ssk = mptcp_subflow_tcp_sock(subflow); 4112 : : - 4113 : 29297 : bh_lock_sock_nested(ssk); - 4114 [ + + ]: 29297 : if (!sock_owned_by_user(ssk)) { - 4115 : 23865 : mptcp_subflow_process_delegated(ssk, xchg(&subflow->delegated_status, 0)); + 4113 : 32497 : bh_lock_sock_nested(ssk); + 4114 [ + + ]: 32497 : if (!sock_owned_by_user(ssk)) { + 4115 : 26017 : mptcp_subflow_process_delegated(ssk, xchg(&subflow->delegated_status, 0)); 4116 : : } else { 4117 : : /* tcp_release_cb_override already processed 4118 : : * the action or will do at next release_sock(). 4119 : : * In both case must dequeue the subflow here - on the same 4120 : : * CPU that scheduled it. 4121 : : */ - 4122 : 5432 : smp_wmb(); - 4123 : 5432 : clear_bit(MPTCP_DELEGATE_SCHEDULED, &subflow->delegated_status); + 4122 : 6480 : smp_wmb(); + 4123 : 6480 : clear_bit(MPTCP_DELEGATE_SCHEDULED, &subflow->delegated_status); 4124 : : } - 4125 : 29297 : bh_unlock_sock(ssk); - 4126 : 29297 : sock_put(ssk); + 4125 : 32497 : bh_unlock_sock(ssk); + 4126 : 32497 : sock_put(ssk); 4127 : : - 4128 [ + - ]: 29297 : if (++work_done == budget) + 4128 [ + - ]: 32497 : if (++work_done == budget) 4129 : : return budget; 4130 : : } 4131 : : 4132 : : /* always provide a 0 'work_done' argument, so that napi_complete_done 4133 : : * will not try accessing the NULL napi->dev ptr 4134 : : */ - 4135 : 28124 : napi_complete_done(napi, 0); - 4136 : 28124 : return work_done; + 4135 : 31284 : napi_complete_done(napi, 0); + 4136 : 31284 : return work_done; 4137 : : } 4138 : : 4139 : 4 : void __init mptcp_proto_init(void) diff --git a/html/lcov/export/mptcp/protocol.h.func-c.html b/html/lcov/export/mptcp/protocol.h.func-c.html index 74b6547e..9290393a 100644 --- a/html/lcov/export/mptcp/protocol.h.func-c.html +++ b/html/lcov/export/mptcp/protocol.h.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % @@ -56,9 +56,9 @@ Branches: - 70.9 % - 532 - 377 + 70.5 % + 566 + 399 @@ -88,7 +88,7 @@ mptcp_send_active_reset_reason - 56 + 58 @@ -102,7 +102,7 @@ mptcp_pm_close_subflow - 91 + 94 @@ -116,210 +116,210 @@ __mptcp_pm_close_subflow - 385 + 388 __mptcp_has_initial_subflow - 1041 + 1032 mptcp_start_tout_timer - 1043 + 1048 mptcp_stop_tout_timer - 1100 + 1098 mptcp_is_fully_established - 2153 + 2154 mptcp_space_from_win - 2911 + 3248 subflow_simultaneous_connect - 4953 + 4969 - mptcp_check_infinite_map + __mptcp_sync_sndbuf - 27320 + 31149 - __mptcp_sync_sndbuf + mptcp_subflow_delegated_next - 29376 + 63781 - mptcp_subflow_delegated_next + mptcp_check_infinite_map - 57421 + 66814 mptcp_subflow_delegate - 61731 + 69663 mptcp_rtx_head - 215181 + 320274 mptcp_propagate_sndbuf - 306329 + 405742 - __mptcp_stream_is_writeable + mptcp_write_space - 356200 + 531750 - mptcp_write_space + mptcp_send_next - 394756 + 557800 - mptcp_send_next + __mptcp_stream_is_writeable - 404435 + 590015 - mptcp_check_fallback + mptcp_pending_tail - 489173 + 702776 - mptcp_pending_tail + mptcp_check_fallback - 526558 + 704369 __tcp_can_send - 732291 + 956688 mptcp_data_fin_enabled - 789630 + 1069885 __mptcp_subflow_active - 868410 + 1172473 mptcp_epollin_ready - 904679 + 1283274 mptcp_stream_memory_free - 1078364 + 1615205 mptcp_notsent_lowat - 1604922 + 2317981 mptcp_subflow_get_map_offset - 2257678 + 3239815 mptcp_send_head - 2570677 + 3390429 __mptcp_space - 3370089 + 4669055 mptcp_win_from_space - 4428353 + 6122303 __mptcp_rmem - 4589395 + 6365709 __mptcp_check_fallback - 5067699 + 7090462 diff --git a/html/lcov/export/mptcp/protocol.h.func.html b/html/lcov/export/mptcp/protocol.h.func.html index 5cf29b5a..034e313a 100644 --- a/html/lcov/export/mptcp/protocol.h.func.html +++ b/html/lcov/export/mptcp/protocol.h.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % @@ -56,9 +56,9 @@ Branches: - 70.9 % - 532 - 377 + 70.5 % + 566 + 399 @@ -81,7 +81,7 @@ __mptcp_check_fallback - 5067699 + 7090462 @@ -95,77 +95,77 @@ __mptcp_has_initial_subflow - 1041 + 1032 __mptcp_pm_close_subflow - 385 + 388 __mptcp_rmem - 4589395 + 6365709 __mptcp_space - 3370089 + 4669055 __mptcp_stream_is_writeable - 356200 + 590015 __mptcp_subflow_active - 868410 + 1172473 __mptcp_sync_sndbuf - 29376 + 31149 __tcp_can_send - 732291 + 956688 mptcp_check_fallback - 489173 + 704369 mptcp_check_infinite_map - 27320 + 66814 mptcp_data_fin_enabled - 789630 + 1069885 @@ -179,112 +179,112 @@ mptcp_epollin_ready - 904679 + 1283274 mptcp_is_fully_established - 2153 + 2154 mptcp_notsent_lowat - 1604922 + 2317981 mptcp_pending_tail - 526558 + 702776 mptcp_pm_close_subflow - 91 + 94 mptcp_propagate_sndbuf - 306329 + 405742 mptcp_rtx_head - 215181 + 320274 mptcp_send_active_reset_reason - 56 + 58 mptcp_send_head - 2570677 + 3390429 mptcp_send_next - 404435 + 557800 mptcp_space_from_win - 2911 + 3248 mptcp_start_tout_timer - 1043 + 1048 mptcp_stop_tout_timer - 1100 + 1098 mptcp_stream_memory_free - 1078364 + 1615205 mptcp_subflow_delegate - 61731 + 69663 mptcp_subflow_delegated_next - 57421 + 63781 @@ -298,28 +298,28 @@ mptcp_subflow_get_map_offset - 2257678 + 3239815 mptcp_win_from_space - 4428353 + 6122303 mptcp_write_space - 394756 + 531750 subflow_simultaneous_connect - 4953 + 4969 diff --git a/html/lcov/export/mptcp/protocol.h.gcov.html b/html/lcov/export/mptcp/protocol.h.gcov.html index 2c263e63..ed3cbd3d 100644 --- a/html/lcov/export/mptcp/protocol.h.gcov.html +++ b/html/lcov/export/mptcp/protocol.h.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % @@ -56,9 +56,9 @@ Branches: - 70.9 % - 532 - 377 + 70.5 % + 566 + 399 @@ -212,21 +212,23 @@ 134 : : 135 : : #define MPTCP_SKB_CB(__skb) ((struct mptcp_skb_cb *)&((__skb)->cb[0])) 136 : : - 137 : 72816 : static inline bool before64(__u64 seq1, __u64 seq2) + 137 : 73781 : static inline bool before64(__u64 seq1, __u64 seq2) 138 : : { - 139 [ + + ][ + + : 5454340 : return (__s64)(seq1 - seq2) < 0; - + + + + + - + + + + + - + + - + + - + + + + + - + + + + + - + ][ + + + - + + + + + - + + + + + - - - + + + - + + - + - - - - - - - + ] + 139 [ + + - - : 7391376 : return (__s64)(seq1 - seq2) < 0; + - + + + + + + + + ][ + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + ][ + + + + + + + + + + + + + + + + - - + + + + + + - + + - - - - - + - ] 140 : : } 141 : : 142 : : #define after64(seq2, seq1) before64(seq1, seq2) @@ -265,8 +267,8 @@ 175 : : 176 : 0 : static inline __be32 mptcp_option(u8 subopt, u8 len, u8 nib, u8 field) 177 : : { - 178 [ + - + + : 651422 : return htonl((TCPOPT_MPTCP << 24) | (len << 16) | (subopt << 12) | - + + + - ] + 178 [ + - + + : 884845 : return htonl((TCPOPT_MPTCP << 24) | (len << 16) | (subopt << 12) | + + + + - ] 179 : : ((nib & 0xF) << 8) | field); 180 : : } 181 : : @@ -447,9 +449,9 @@ 356 : : 357 : : extern struct genl_family mptcp_genl_family; 358 : : - 359 : 316824 : static inline void msk_owned_by_me(const struct mptcp_sock *msk) + 359 : 314245 : static inline void msk_owned_by_me(const struct mptcp_sock *msk) 360 : : { - 361 : 770681 : sock_owned_by_me((const struct sock *)msk); + 361 : 1015352 : sock_owned_by_me((const struct sock *)msk); 362 : : } 363 : : 364 : : #ifdef CONFIG_DEBUG_NET @@ -473,64 +475,64 @@ 382 : : /* the msk socket don't use the backlog, also account for the bulk 383 : : * free memory 384 : : */ - 385 : 4589395 : static inline int __mptcp_rmem(const struct sock *sk) + 385 : 6365709 : static inline int __mptcp_rmem(const struct sock *sk) 386 : : { - 387 [ - + ]: 4589395 : return atomic_read(&sk->sk_rmem_alloc) - READ_ONCE(mptcp_sk(sk)->rmem_released); + 387 [ - + ]: 6365709 : return atomic_read(&sk->sk_rmem_alloc) - READ_ONCE(mptcp_sk(sk)->rmem_released); 388 : : } 389 : : - 390 : 4428353 : static inline int mptcp_win_from_space(const struct sock *sk, int space) + 390 : 6122303 : static inline int mptcp_win_from_space(const struct sock *sk, int space) 391 : : { - 392 [ - + ]: 4428353 : return __tcp_win_from_space(mptcp_sk(sk)->scaling_ratio, space); + 392 [ - + ]: 6122303 : return __tcp_win_from_space(mptcp_sk(sk)->scaling_ratio, space); 393 : : } 394 : : - 395 : 2911 : static inline int mptcp_space_from_win(const struct sock *sk, int win) + 395 : 3248 : static inline int mptcp_space_from_win(const struct sock *sk, int win) 396 : : { - 397 [ - + ]: 2911 : return __tcp_space_from_win(mptcp_sk(sk)->scaling_ratio, win); + 397 [ - + ]: 3248 : return __tcp_space_from_win(mptcp_sk(sk)->scaling_ratio, win); 398 : : } 399 : : - 400 : 3370089 : static inline int __mptcp_space(const struct sock *sk) + 400 : 4669055 : static inline int __mptcp_space(const struct sock *sk) 401 : : { - 402 : 3370089 : return mptcp_win_from_space(sk, READ_ONCE(sk->sk_rcvbuf) - __mptcp_rmem(sk)); + 402 : 4669055 : return mptcp_win_from_space(sk, READ_ONCE(sk->sk_rcvbuf) - __mptcp_rmem(sk)); 403 : : } 404 : : - 405 : 2570677 : static inline struct mptcp_data_frag *mptcp_send_head(const struct sock *sk) + 405 : 3390429 : static inline struct mptcp_data_frag *mptcp_send_head(const struct sock *sk) 406 : : { - 407 [ - + ]: 2570677 : const struct mptcp_sock *msk = mptcp_sk(sk); + 407 [ - + ]: 3390429 : const struct mptcp_sock *msk = mptcp_sk(sk); 408 : : - 409 : 2570677 : return READ_ONCE(msk->first_pending); + 409 : 3390429 : return READ_ONCE(msk->first_pending); 410 : : } 411 : : - 412 : 404435 : static inline struct mptcp_data_frag *mptcp_send_next(struct sock *sk) + 412 : 557800 : static inline struct mptcp_data_frag *mptcp_send_next(struct sock *sk) 413 : : { - 414 [ - + ]: 404435 : struct mptcp_sock *msk = mptcp_sk(sk); - 415 : 404435 : struct mptcp_data_frag *cur; + 414 [ - + ]: 557800 : struct mptcp_sock *msk = mptcp_sk(sk); + 415 : 557800 : struct mptcp_data_frag *cur; 416 : : - 417 : 404435 : cur = msk->first_pending; - 418 [ + + ]: 404435 : return list_is_last(&cur->list, &msk->rtx_queue) ? NULL : - 419 : 80501 : list_next_entry(cur, list); + 417 : 557800 : cur = msk->first_pending; + 418 [ + + ]: 557800 : return list_is_last(&cur->list, &msk->rtx_queue) ? NULL : + 419 : 123488 : list_next_entry(cur, list); 420 : : } 421 : : - 422 : 526558 : static inline struct mptcp_data_frag *mptcp_pending_tail(const struct sock *sk) + 422 : 702776 : static inline struct mptcp_data_frag *mptcp_pending_tail(const struct sock *sk) 423 : : { - 424 [ - + ]: 526558 : const struct mptcp_sock *msk = mptcp_sk(sk); + 424 [ - + ]: 702776 : const struct mptcp_sock *msk = mptcp_sk(sk); 425 : : - 426 [ + + ]: 526558 : if (!msk->first_pending) + 426 [ + + ]: 702776 : if (!msk->first_pending) 427 : : return NULL; 428 : : - 429 [ - + + - ]: 202638 : if (WARN_ON_ONCE(list_empty(&msk->rtx_queue))) + 429 [ - + + - ]: 268477 : if (WARN_ON_ONCE(list_empty(&msk->rtx_queue))) 430 : : return NULL; 431 : : - 432 : 202638 : return list_last_entry(&msk->rtx_queue, struct mptcp_data_frag, list); + 432 : 268477 : return list_last_entry(&msk->rtx_queue, struct mptcp_data_frag, list); 433 : : } 434 : : - 435 : 215181 : static inline struct mptcp_data_frag *mptcp_rtx_head(struct sock *sk) + 435 : 320274 : static inline struct mptcp_data_frag *mptcp_rtx_head(struct sock *sk) 436 : : { - 437 [ - + ]: 215181 : struct mptcp_sock *msk = mptcp_sk(sk); + 437 [ - + ]: 320274 : struct mptcp_sock *msk = mptcp_sk(sk); 438 : : - 439 [ + + ]: 215181 : if (msk->snd_una == msk->snd_nxt) + 439 [ + + ]: 320274 : if (msk->snd_una == msk->snd_nxt) 440 : : return NULL; 441 : : - 442 [ + + ]: 181815 : return list_first_entry_or_null(&msk->rtx_queue, struct mptcp_data_frag, list); + 442 [ + + ]: 259243 : return list_first_entry_or_null(&msk->rtx_queue, struct mptcp_data_frag, list); 443 : : } 444 : : 445 : : struct csum_pseudo_header { @@ -669,65 +671,69 @@ 578 : : static inline struct mptcp_subflow_context * 579 : 84 : mptcp_subflow_ctx(const struct sock *sk) 580 : : { - 581 [ - + + - ]: 266340 : const struct inet_connection_sock *icsk = inet_csk(sk); + 581 [ - + + - ]: 426963 : const struct inet_connection_sock *icsk = inet_csk(sk); 582 : : 583 : : /* Use RCU on icsk_ulp_data only for sock diag code */ - 584 [ + + ][ + + : 21845268 : return (__force struct mptcp_subflow_context *)icsk->icsk_ulp_data; - + - + - - - + - + + + - + + + + - - + - + + + - + + - + - - - - + + + - + - + + - - + - + - + - + + + - + - + - + ][ - - + + + - + - - + + + - - + + + + + - - + - + - - + - + + + - + + ][ + + - + - - + - - + + + + + - + + + + + - + - + + + - - + - + + - + ][ + + + - + - + - + - + + - + + - - + + - + - - + - + - - + + + + - - ] + 584 [ + + ][ + + : 30835400 : return (__force struct mptcp_subflow_context *)icsk->icsk_ulp_data; + + + + + - + + - + + + + + + + + - + + - + + + + + + + + - + - - + + + + + - + + - + + - + - + + + + + - + + + - + ][ - + + + + + + + - + + + - + + + + + + + - + - + - + + + + - + + + + - + - + + + - + - + - + - + - + + + - - - + + - - + ] + [ + + + - + - + - + + + + + + + + + + + + + - + + + + - + + - + + + ] + [ + + + + + - + - + + + + - + + - + + + - + - + + - + - + + + + + - ] 585 : : } 586 : : 587 : : static inline struct sock * 588 : 0 : mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow) 589 : : { - 590 [ + - - + : 3705542 : return subflow->tcp_sock; - + - + + + - + - + - - - + + + + + - + - - - + 590 [ + - - + : 4784040 : return subflow->tcp_sock; + + - + + + + + - + - - + + + + + + + + - - - - ][ + + + - + + + + + - + + - - - - - + + + + - + + - - - + + + + + + + + + - - - + - + + + + + + + - - - - ] - [ - + + + ] + [ - + + + ] [ + + ] 591 : : } 592 : : 593 : : static inline void 594 : 30 : mptcp_subflow_ctx_reset(struct mptcp_subflow_context *subflow) 595 : : { - 596 : 791 : memset(&subflow->reset, 0, sizeof(subflow->reset)); - 597 : 791 : subflow->request_mptcp = 1; - 598 : 791 : WRITE_ONCE(subflow->local_id, -1); - 599 : 791 : } + 596 : 772 : memset(&subflow->reset, 0, sizeof(subflow->reset)); + 597 : 772 : subflow->request_mptcp = 1; + 598 : 772 : WRITE_ONCE(subflow->local_id, -1); + 599 : 772 : } 600 : : 601 : : /* Convert reset reasons in MPTCP to enum sk_rst_reason type */ 602 : : static inline enum sk_rst_reason @@ -757,71 +763,71 @@ 626 : : } 627 : : 628 : : static inline void - 629 : 56 : mptcp_send_active_reset_reason(struct sock *sk) + 629 : 58 : mptcp_send_active_reset_reason(struct sock *sk) 630 : : { - 631 : 56 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); - 632 : 56 : enum sk_rst_reason reason; + 631 : 58 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); + 632 : 58 : enum sk_rst_reason reason; 633 : : - 634 [ + - ]: 56 : reason = sk_rst_convert_mptcp_reason(subflow->reset_reason); - 635 : 56 : tcp_send_active_reset(sk, GFP_ATOMIC, reason); - 636 : 56 : } + 634 [ + - ]: 58 : reason = sk_rst_convert_mptcp_reason(subflow->reset_reason); + 635 : 58 : tcp_send_active_reset(sk, GFP_ATOMIC, reason); + 636 : 58 : } 637 : : 638 : : static inline u64 - 639 : 2257678 : mptcp_subflow_get_map_offset(const struct mptcp_subflow_context *subflow) + 639 : 3239815 : mptcp_subflow_get_map_offset(const struct mptcp_subflow_context *subflow) 640 : : { - 641 [ - + ]: 2257678 : return tcp_sk(mptcp_subflow_tcp_sock(subflow))->copied_seq - - 642 : 2257678 : subflow->ssn_offset - - 643 : 2257678 : subflow->map_subflow_seq; + 641 [ - + ]: 3239815 : return tcp_sk(mptcp_subflow_tcp_sock(subflow))->copied_seq - + 642 : 3239815 : subflow->ssn_offset - + 643 : 3239815 : subflow->map_subflow_seq; 644 : : } 645 : : 646 : : static inline u64 - 647 : 142390 : mptcp_subflow_get_mapped_dsn(const struct mptcp_subflow_context *subflow) + 647 : 143968 : mptcp_subflow_get_mapped_dsn(const struct mptcp_subflow_context *subflow) 648 : : { - 649 [ + + ]: 966945 : return subflow->map_seq + mptcp_subflow_get_map_offset(subflow); + 649 [ + + ]: 1393962 : return subflow->map_seq + mptcp_subflow_get_map_offset(subflow); 650 : : } 651 : : 652 : : void mptcp_subflow_process_delegated(struct sock *ssk, long actions); 653 : : - 654 : 61731 : static inline void mptcp_subflow_delegate(struct mptcp_subflow_context *subflow, int action) + 654 : 69663 : static inline void mptcp_subflow_delegate(struct mptcp_subflow_context *subflow, int action) 655 : : { - 656 [ - + ]: 61731 : long old, set_bits = BIT(MPTCP_DELEGATE_SCHEDULED) | BIT(action); - 657 : 61731 : struct mptcp_delegated_action *delegated; - 658 : 61731 : bool schedule; + 656 [ - + ]: 69663 : long old, set_bits = BIT(MPTCP_DELEGATE_SCHEDULED) | BIT(action); + 657 : 69663 : struct mptcp_delegated_action *delegated; + 658 : 69663 : bool schedule; 659 : : 660 : : /* the caller held the subflow bh socket lock */ - 661 [ + - + - : 61731 : lockdep_assert_in_softirq(); - + - + - - - + ] + 661 [ + - + - : 69663 : lockdep_assert_in_softirq(); + + - + - - + + ] 662 : : 663 : : /* The implied barrier pairs with tcp_release_cb_override() 664 : : * mptcp_napi_poll(), and ensures the below list check sees list 665 : : * updates done prior to delegated status bits changes 666 : : */ - 667 [ - + - + ]: 61731 : old = set_mask_bits(&subflow->delegated_status, 0, set_bits); - 668 [ + + ]: 61731 : if (!(old & BIT(MPTCP_DELEGATE_SCHEDULED))) { - 669 [ - + + - ]: 29297 : if (WARN_ON_ONCE(!list_empty(&subflow->delegated_node))) + 667 [ - + - + ]: 69663 : old = set_mask_bits(&subflow->delegated_status, 0, set_bits); + 668 [ + + ]: 69663 : if (!(old & BIT(MPTCP_DELEGATE_SCHEDULED))) { + 669 [ - + + - ]: 32497 : if (WARN_ON_ONCE(!list_empty(&subflow->delegated_node))) 670 : : return; 671 : : - 672 : 29297 : delegated = this_cpu_ptr(&mptcp_delegated_actions); - 673 : 29297 : schedule = list_empty(&delegated->head); - 674 : 29297 : list_add_tail(&subflow->delegated_node, &delegated->head); - 675 : 29297 : sock_hold(mptcp_subflow_tcp_sock(subflow)); - 676 [ + + ]: 29297 : if (schedule) - 677 : 28276 : napi_schedule(&delegated->napi); + 672 : 32497 : delegated = this_cpu_ptr(&mptcp_delegated_actions); + 673 : 32497 : schedule = list_empty(&delegated->head); + 674 : 32497 : list_add_tail(&subflow->delegated_node, &delegated->head); + 675 : 32497 : sock_hold(mptcp_subflow_tcp_sock(subflow)); + 676 [ + + ]: 32497 : if (schedule) + 677 : 31404 : napi_schedule(&delegated->napi); 678 : : } 679 : : } 680 : : 681 : : static inline struct mptcp_subflow_context * - 682 : 57421 : mptcp_subflow_delegated_next(struct mptcp_delegated_action *delegated) + 682 : 63781 : mptcp_subflow_delegated_next(struct mptcp_delegated_action *delegated) 683 : : { - 684 : 57421 : struct mptcp_subflow_context *ret; + 684 : 63781 : struct mptcp_subflow_context *ret; 685 : : - 686 [ + + ]: 57421 : if (list_empty(&delegated->head)) + 686 [ + + ]: 63781 : if (list_empty(&delegated->head)) 687 : : return NULL; 688 : : - 689 : 29297 : ret = list_first_entry(&delegated->head, struct mptcp_subflow_context, delegated_node); - 690 : 29297 : list_del_init(&ret->delegated_node); - 691 : 29297 : return ret; + 689 : 32497 : ret = list_first_entry(&delegated->head, struct mptcp_subflow_context, delegated_node); + 690 : 32497 : list_del_init(&ret->delegated_node); + 691 : 32497 : return ret; 692 : : } 693 : : 694 : : int mptcp_is_enabled(const struct net *net); @@ -890,38 +896,38 @@ 757 : : int mptcp_sched_get_send(struct mptcp_sock *msk); 758 : : int mptcp_sched_get_retrans(struct mptcp_sock *msk); 759 : : - 760 : 127080 : static inline u64 mptcp_data_avail(const struct mptcp_sock *msk) + 760 : 128098 : static inline u64 mptcp_data_avail(const struct mptcp_sock *msk) 761 : : { - 762 [ + + ]: 482943 : return READ_ONCE(msk->bytes_received) - READ_ONCE(msk->bytes_consumed); + 762 [ + + ]: 696343 : return READ_ONCE(msk->bytes_received) - READ_ONCE(msk->bytes_consumed); 763 : : } 764 : : - 765 : 904679 : static inline bool mptcp_epollin_ready(const struct sock *sk) + 765 : 1283274 : static inline bool mptcp_epollin_ready(const struct sock *sk) 766 : : { 767 : : /* mptcp doesn't have to deal with small skbs in the receive queue, 768 : : * at it can always coalesce them 769 : : */ - 770 [ - + ]: 904679 : return (mptcp_data_avail(mptcp_sk(sk)) >= sk->sk_rcvlowat) || + 770 [ - + ]: 1283274 : return (mptcp_data_avail(mptcp_sk(sk)) >= sk->sk_rcvlowat) || 771 : : (mem_cgroup_sockets_enabled && sk->sk_memcg && - 772 [ + + ]: 904679 : mem_cgroup_under_socket_pressure(sk->sk_memcg)) || - 773 [ - + ]: 278944 : READ_ONCE(tcp_memory_pressure); + 772 [ + + ]: 1283274 : mem_cgroup_under_socket_pressure(sk->sk_memcg)) || + 773 [ - + ]: 326022 : READ_ONCE(tcp_memory_pressure); 774 : : } 775 : : 776 : : int mptcp_set_rcvlowat(struct sock *sk, int val); 777 : : - 778 : 967352 : static inline bool __tcp_can_send(const struct sock *ssk) + 778 : 1193733 : static inline bool __tcp_can_send(const struct sock *ssk) 779 : : { 780 : : /* only send if our side has not closed yet */ - 781 [ + + ]: 1051850 : return ((1 << inet_sk_state_load(ssk)) & (TCPF_ESTABLISHED | TCPF_CLOSE_WAIT)); + 781 [ + + ]: 1433607 : return ((1 << inet_sk_state_load(ssk)) & (TCPF_ESTABLISHED | TCPF_CLOSE_WAIT)); 782 : : } 783 : : - 784 : 868410 : static inline bool __mptcp_subflow_active(struct mptcp_subflow_context *subflow) + 784 : 1172473 : static inline bool __mptcp_subflow_active(struct mptcp_subflow_context *subflow) 785 : : { 786 : : /* can't send if JOIN hasn't completed yet (i.e. is usable for mptcp) */ - 787 [ + + + + : 868410 : if (subflow->request_join && !READ_ONCE(subflow->fully_established)) - + + ] + 787 [ + + + + : 1172473 : if (subflow->request_join && !READ_ONCE(subflow->fully_established)) + + + ] 788 : : return false; 789 : : - 790 : 868048 : return __tcp_can_send(mptcp_subflow_tcp_sock(subflow)); + 790 : 1172093 : return __tcp_can_send(mptcp_subflow_tcp_sock(subflow)); 791 : : } 792 : : 793 : : void mptcp_subflow_set_active(struct mptcp_subflow_context *subflow); @@ -957,9 +963,9 @@ 823 : : void __mptcp_sync_state(struct sock *sk, int state); 824 : : void mptcp_reset_tout_timer(struct mptcp_sock *msk, unsigned long fail_tout); 825 : : - 826 : 1100 : static inline void mptcp_stop_tout_timer(struct sock *sk) + 826 : 1098 : static inline void mptcp_stop_tout_timer(struct sock *sk) 827 : : { - 828 [ + + ]: 1100 : if (!inet_csk(sk)->icsk_mtup.probe_timestamp) + 828 [ + + ]: 1098 : if (!inet_csk(sk)->icsk_mtup.probe_timestamp) 829 : : return; 830 : : 831 : 4 : sk_stop_timer(sk, &sk->sk_timer); @@ -972,16 +978,16 @@ 838 : 42 : inet_csk(sk)->icsk_mtup.probe_timestamp = tout ? : 1; 839 : : } 840 : : - 841 : 1043 : static inline void mptcp_start_tout_timer(struct sock *sk) + 841 : 1048 : static inline void mptcp_start_tout_timer(struct sock *sk) 842 : : { - 843 : 1043 : mptcp_set_close_tout(sk, tcp_jiffies32); - 844 [ - + ]: 1043 : mptcp_reset_tout_timer(mptcp_sk(sk), 0); - 845 : 1043 : } + 843 : 1048 : mptcp_set_close_tout(sk, tcp_jiffies32); + 844 [ - + ]: 1048 : mptcp_reset_tout_timer(mptcp_sk(sk), 0); + 845 : 1048 : } 846 : : - 847 : 2153 : static inline bool mptcp_is_fully_established(struct sock *sk) + 847 : 2154 : static inline bool mptcp_is_fully_established(struct sock *sk) 848 : : { - 849 [ + - ]: 2153 : return inet_sk_state_load(sk) == TCP_ESTABLISHED && - 850 [ - + - + : 2153 : READ_ONCE(mptcp_sk(sk)->fully_established); + 849 [ + - ]: 2154 : return inet_sk_state_load(sk) == TCP_ESTABLISHED && + 850 [ - + - + : 2154 : READ_ONCE(mptcp_sk(sk)->fully_established); - + ] 851 : : } 852 : : @@ -995,78 +1001,78 @@ 860 : : char __user *optval, int __user *option); 861 : : 862 : : u64 __mptcp_expand_seq(u64 old_seq, u64 cur_seq); - 863 : 196232 : static inline u64 mptcp_expand_seq(u64 old_seq, u64 cur_seq, bool use_64bit) + 863 : 198388 : static inline u64 mptcp_expand_seq(u64 old_seq, u64 cur_seq, bool use_64bit) 864 : : { - 865 [ + + ]: 1261831 : if (use_64bit) - [ + + + + ] + 865 [ + + + + ]: 1770190 : if (use_64bit) + [ + + + + ] 866 : : return cur_seq; 867 : : - 868 : 60701 : return __mptcp_expand_seq(old_seq, cur_seq); + 868 : 83572 : return __mptcp_expand_seq(old_seq, cur_seq); 869 : : } 870 : : void __mptcp_check_push(struct sock *sk, struct sock *ssk); 871 : : void __mptcp_data_acked(struct sock *sk); 872 : : void __mptcp_error_report(struct sock *sk); 873 : : bool mptcp_update_rcv_data_fin(struct mptcp_sock *msk, u64 data_fin_seq, bool use_64bit); - 874 : 990900 : static inline bool mptcp_data_fin_enabled(const struct mptcp_sock *msk) + 874 : 1271431 : static inline bool mptcp_data_fin_enabled(const struct mptcp_sock *msk) 875 : : { - 876 [ + + + + ]: 1601347 : return READ_ONCE(msk->snd_data_fin_enable) && - [ + + + + ] - 877 [ + + - + ]: 112575 : READ_ONCE(msk->write_seq) == READ_ONCE(msk->snd_nxt); - [ + + - + ] + 876 [ + + + + ]: 2261140 : return READ_ONCE(msk->snd_data_fin_enable) && + [ + + + + ] + 877 [ + + - + ]: 127404 : READ_ONCE(msk->write_seq) == READ_ONCE(msk->snd_nxt); + [ + + - + ] 878 : : } 879 : : - 880 : 1604922 : static inline u32 mptcp_notsent_lowat(const struct sock *sk) + 880 : 2317981 : static inline u32 mptcp_notsent_lowat(const struct sock *sk) 881 : : { - 882 [ - + ]: 1604922 : struct net *net = sock_net(sk); - 883 : 1604922 : u32 val; + 882 [ - + ]: 2317981 : struct net *net = sock_net(sk); + 883 : 2317981 : u32 val; 884 : : - 885 [ - + ]: 1604922 : val = READ_ONCE(mptcp_sk(sk)->notsent_lowat); - 886 [ + - ]: 1604922 : return val ?: READ_ONCE(net->ipv4.sysctl_tcp_notsent_lowat); + 885 [ - + ]: 2317981 : val = READ_ONCE(mptcp_sk(sk)->notsent_lowat); + 886 [ + - ]: 2317981 : return val ?: READ_ONCE(net->ipv4.sysctl_tcp_notsent_lowat); 887 : : } 888 : : - 889 : 1078364 : static inline bool mptcp_stream_memory_free(const struct sock *sk, int wake) + 889 : 1615205 : static inline bool mptcp_stream_memory_free(const struct sock *sk, int wake) 890 : : { - 891 [ - + ]: 1078364 : const struct mptcp_sock *msk = mptcp_sk(sk); - 892 : 1078364 : u32 notsent_bytes; + 891 [ - + ]: 1615205 : const struct mptcp_sock *msk = mptcp_sk(sk); + 892 : 1615205 : u32 notsent_bytes; 893 : : - 894 : 1078364 : notsent_bytes = READ_ONCE(msk->write_seq) - READ_ONCE(msk->snd_nxt); - 895 [ - + ]: 1078364 : return (notsent_bytes << wake) < mptcp_notsent_lowat(sk); + 894 : 1615205 : notsent_bytes = READ_ONCE(msk->write_seq) - READ_ONCE(msk->snd_nxt); + 895 [ - + ]: 1615205 : return (notsent_bytes << wake) < mptcp_notsent_lowat(sk); 896 : : } 897 : : - 898 : 356200 : static inline bool __mptcp_stream_is_writeable(const struct sock *sk, int wake) + 898 : 590015 : static inline bool __mptcp_stream_is_writeable(const struct sock *sk, int wake) 899 : : { - 900 [ + - + + ]: 712400 : return mptcp_stream_memory_free(sk, wake) && - 901 : 356200 : __sk_stream_is_writeable(sk, wake); + 900 [ + - + + ]: 1180030 : return mptcp_stream_memory_free(sk, wake) && + 901 : 590015 : __sk_stream_is_writeable(sk, wake); 902 : : } 903 : : - 904 : 394756 : static inline void mptcp_write_space(struct sock *sk) + 904 : 531750 : static inline void mptcp_write_space(struct sock *sk) 905 : : { 906 : : /* pairs with memory barrier in mptcp_poll */ - 907 : 394756 : smp_mb(); - 908 [ + - ]: 394756 : if (mptcp_stream_memory_free(sk, 1)) - 909 : 394756 : sk_stream_write_space(sk); - 910 : 394756 : } + 907 : 531750 : smp_mb(); + 908 [ + - ]: 531750 : if (mptcp_stream_memory_free(sk, 1)) + 909 : 531750 : sk_stream_write_space(sk); + 910 : 531750 : } 911 : : - 912 : 29376 : static inline void __mptcp_sync_sndbuf(struct sock *sk) + 912 : 31149 : static inline void __mptcp_sync_sndbuf(struct sock *sk) 913 : : { - 914 : 29376 : struct mptcp_subflow_context *subflow; - 915 : 29376 : int ssk_sndbuf, new_sndbuf; + 914 : 31149 : struct mptcp_subflow_context *subflow; + 915 : 31149 : int ssk_sndbuf, new_sndbuf; 916 : : - 917 [ + - ]: 29376 : if (sk->sk_userlocks & SOCK_SNDBUF_LOCK) + 917 [ + - ]: 31149 : if (sk->sk_userlocks & SOCK_SNDBUF_LOCK) 918 : : return; 919 : : - 920 [ - + ]: 29376 : new_sndbuf = READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_wmem[0]); - 921 [ - + - + : 80953 : mptcp_for_each_subflow(mptcp_sk(sk), subflow) { - + + ] - 922 : 51577 : ssk_sndbuf = READ_ONCE(mptcp_subflow_tcp_sock(subflow)->sk_sndbuf); + 920 [ - + ]: 31149 : new_sndbuf = READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_wmem[0]); + 921 [ - + - + : 88904 : mptcp_for_each_subflow(mptcp_sk(sk), subflow) { + + + ] + 922 : 57755 : ssk_sndbuf = READ_ONCE(mptcp_subflow_tcp_sock(subflow)->sk_sndbuf); 923 : : - 924 : 51577 : subflow->cached_sndbuf = ssk_sndbuf; - 925 : 51577 : new_sndbuf += ssk_sndbuf; + 924 : 57755 : subflow->cached_sndbuf = ssk_sndbuf; + 925 : 57755 : new_sndbuf += ssk_sndbuf; 926 : : } 927 : : 928 : : /* the msk max wmem limit is <nr_subflows> * tcp wmem[2] */ - 929 : 29376 : WRITE_ONCE(sk->sk_sndbuf, new_sndbuf); - 930 : 29376 : mptcp_write_space(sk); + 929 : 31149 : WRITE_ONCE(sk->sk_sndbuf, new_sndbuf); + 930 : 31149 : mptcp_write_space(sk); 931 : : } 932 : : 933 : : /* The called held both the msk socket and the subflow socket locks, @@ -1086,16 +1092,16 @@ 946 : : * so we can't acquire such lock here: let the delegate action acquires 947 : : * the needed locks in suitable order. 948 : : */ - 949 : 306329 : static inline void mptcp_propagate_sndbuf(struct sock *sk, struct sock *ssk) + 949 : 405742 : static inline void mptcp_propagate_sndbuf(struct sock *sk, struct sock *ssk) 950 : : { - 951 : 306329 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); + 951 : 405742 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); 952 : : - 953 [ + + ]: 306329 : if (likely(READ_ONCE(ssk->sk_sndbuf) == subflow->cached_sndbuf)) + 953 [ + + ]: 405742 : if (likely(READ_ONCE(ssk->sk_sndbuf) == subflow->cached_sndbuf)) 954 : : return; 955 : : - 956 : 57173 : local_bh_disable(); - 957 : 57173 : mptcp_subflow_delegate(subflow, MPTCP_DELEGATE_SNDBUF); - 958 : 57173 : local_bh_enable(); + 956 : 64766 : local_bh_disable(); + 957 : 64766 : mptcp_subflow_delegate(subflow, MPTCP_DELEGATE_SNDBUF); + 958 : 64766 : local_bh_enable(); 959 : : } 960 : : 961 : : void mptcp_destroy_common(struct mptcp_sock *msk, unsigned int flags); @@ -1202,10 +1208,10 @@ 1062 : : int mptcp_nl_fill_addr(struct sk_buff *skb, 1063 : : struct mptcp_pm_addr_entry *entry); 1064 : : - 1065 : 405839 : static inline bool mptcp_pm_should_add_signal(struct mptcp_sock *msk) + 1065 : 407145 : static inline bool mptcp_pm_should_add_signal(struct mptcp_sock *msk) 1066 : : { - 1067 [ + + + - ]: 1579346 : return READ_ONCE(msk->pm.addr_signal) & - [ + + - - ] + 1067 [ + + + - ]: 2219446 : return READ_ONCE(msk->pm.addr_signal) & + [ + + - - ] 1068 : : (BIT(MPTCP_ADD_ADDR_SIGNAL) | BIT(MPTCP_ADD_ADDR_ECHO)); 1069 : : } 1070 : : @@ -1219,22 +1225,22 @@ 1078 [ + + ]: 755 : return READ_ONCE(msk->pm.addr_signal) & BIT(MPTCP_ADD_ADDR_ECHO); 1079 : : } 1080 : : - 1081 : 405827 : static inline bool mptcp_pm_should_rm_signal(struct mptcp_sock *msk) + 1081 : 407133 : static inline bool mptcp_pm_should_rm_signal(struct mptcp_sock *msk) 1082 : : { - 1083 [ + + ]: 1577066 : return READ_ONCE(msk->pm.addr_signal) & BIT(MPTCP_RM_ADDR_SIGNAL); + 1083 [ + + ]: 2217169 : return READ_ONCE(msk->pm.addr_signal) & BIT(MPTCP_RM_ADDR_SIGNAL); 1084 : : } 1085 : : 1086 : 60 : static inline bool mptcp_pm_is_userspace(const struct mptcp_sock *msk) 1087 : : { - 1088 [ + + ][ + + : 7291 : return READ_ONCE(msk->pm.pm_type) == MPTCP_PM_TYPE_USERSPACE; - + + + + + - + + + ] + 1088 [ + + ][ + + : 7277 : return READ_ONCE(msk->pm.pm_type) == MPTCP_PM_TYPE_USERSPACE; + + + + + + + + + + ] [ - + + + ] 1089 : : } 1090 : : - 1091 : 25 : static inline bool mptcp_pm_is_kernel(const struct mptcp_sock *msk) + 1091 : 26 : static inline bool mptcp_pm_is_kernel(const struct mptcp_sock *msk) 1092 : : { - 1093 [ + + ]: 1131 : return READ_ONCE(msk->pm.pm_type) == MPTCP_PM_TYPE_KERNEL; + 1093 [ + + ]: 1122 : return READ_ONCE(msk->pm.pm_type) == MPTCP_PM_TYPE_KERNEL; [ - + - - ] 1094 : : } 1095 : : @@ -1242,8 +1248,8 @@ 1097 : : { 1098 : 1510 : u8 len = TCPOLEN_MPTCP_ADD_ADDR_BASE; 1099 : : - 1100 [ + + ]: 1510 : if (family == AF_INET6) - 1101 : 340 : len = TCPOLEN_MPTCP_ADD_ADDR6_BASE; + 1100 [ + + ]: 1510 : if (family == AF_INET6) + 1101 : 338 : len = TCPOLEN_MPTCP_ADD_ADDR6_BASE; 1102 [ + + ]: 1510 : if (!echo) 1103 : 808 : len += MPTCPOPT_THMAC_LEN; 1104 : : /* account for 2 trailing 'nop' options */ @@ -1300,47 +1306,47 @@ 1155 : : unsigned int mptcp_pm_get_local_addr_max(const struct mptcp_sock *msk); 1156 : : 1157 : : /* called under PM lock */ - 1158 : 385 : static inline void __mptcp_pm_close_subflow(struct mptcp_sock *msk) + 1158 : 388 : static inline void __mptcp_pm_close_subflow(struct mptcp_sock *msk) 1159 : : { - 1160 [ + - ]: 385 : if (--msk->pm.subflows < mptcp_pm_get_subflows_max(msk)) - 1161 : 385 : WRITE_ONCE(msk->pm.accept_subflow, true); - 1162 : 385 : } + 1160 [ + - ]: 388 : if (--msk->pm.subflows < mptcp_pm_get_subflows_max(msk)) + 1161 : 388 : WRITE_ONCE(msk->pm.accept_subflow, true); + 1162 : 388 : } 1163 : : - 1164 : 91 : static inline void mptcp_pm_close_subflow(struct mptcp_sock *msk) + 1164 : 94 : static inline void mptcp_pm_close_subflow(struct mptcp_sock *msk) 1165 : : { - 1166 : 91 : spin_lock_bh(&msk->pm.lock); - 1167 : 91 : __mptcp_pm_close_subflow(msk); - 1168 : 91 : spin_unlock_bh(&msk->pm.lock); - 1169 : 91 : } + 1166 : 94 : spin_lock_bh(&msk->pm.lock); + 1167 : 94 : __mptcp_pm_close_subflow(msk); + 1168 : 94 : spin_unlock_bh(&msk->pm.lock); + 1169 : 94 : } 1170 : : 1171 : : void mptcp_sockopt_sync_locked(struct mptcp_sock *msk, struct sock *ssk); 1172 : : 1173 : 0 : static inline struct mptcp_ext *mptcp_get_ext(const struct sk_buff *skb) 1174 : : { - 1175 [ + + + - : 1857648 : return (struct mptcp_ext *)skb_ext_find(skb, SKB_EXT_MPTCP); - + + - - - - - ][ + - + - - + + + + + 1175 [ + + + - : 2568427 : return (struct mptcp_ext *)skb_ext_find(skb, SKB_EXT_MPTCP); + + + - - - + - ][ + - + + - + + + + + + + - - - - ][ + - + - + + + + - + ] + - ][ + - + + + + + + + + ] 1176 : : } 1177 : : 1178 : : void mptcp_diag_subflow_init(struct tcp_ulp_ops *ops); 1179 : : - 1180 : 5067699 : static inline bool __mptcp_check_fallback(const struct mptcp_sock *msk) + 1180 : 7090462 : static inline bool __mptcp_check_fallback(const struct mptcp_sock *msk) 1181 : : { - 1182 [ - + - - : 5067699 : return test_bit(MPTCP_FALLBACK_DONE, &msk->flags); + 1182 [ - + - - : 7090462 : return test_bit(MPTCP_FALLBACK_DONE, &msk->flags); - - ] 1183 : : } 1184 : : - 1185 : 489173 : static inline bool mptcp_check_fallback(const struct sock *sk) + 1185 : 704369 : static inline bool mptcp_check_fallback(const struct sock *sk) 1186 : : { - 1187 : 489173 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); - 1188 [ - + ]: 489173 : struct mptcp_sock *msk = mptcp_sk(subflow->conn); + 1187 : 704369 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); + 1188 [ - + ]: 704369 : struct mptcp_sock *msk = mptcp_sk(subflow->conn); 1189 : : - 1190 : 489173 : return __mptcp_check_fallback(msk); + 1190 : 704369 : return __mptcp_check_fallback(msk); 1191 : : } 1192 : : 1193 : 100 : static inline void __mptcp_do_fallback(struct mptcp_sock *msk) @@ -1352,12 +1358,12 @@ 1199 : 100 : set_bit(MPTCP_FALLBACK_DONE, &msk->flags); 1200 : : } 1201 : : - 1202 : 1041 : static inline bool __mptcp_has_initial_subflow(const struct mptcp_sock *msk) + 1202 : 1032 : static inline bool __mptcp_has_initial_subflow(const struct mptcp_sock *msk) 1203 : : { - 1204 : 1041 : struct sock *ssk = READ_ONCE(msk->first); + 1204 : 1032 : struct sock *ssk = READ_ONCE(msk->first); 1205 : : - 1206 [ + - + + : 2082 : return ssk && ((1 << inet_sk_state_load(ssk)) & - + + ] + 1206 [ + - + + : 2064 : return ssk && ((1 << inet_sk_state_load(ssk)) & + + + ] 1207 : : (TCPF_ESTABLISHED | TCPF_SYN_SENT | 1208 : : TCPF_SYN_RECV | TCPF_LISTEN)); 1209 : : } @@ -1394,12 +1400,12 @@ 1239 : 18 : __mptcp_do_fallback(msk); 1240 : 18 : } 1241 : : - 1242 : 27320 : static inline bool mptcp_check_infinite_map(struct sk_buff *skb) + 1242 : 66814 : static inline bool mptcp_check_infinite_map(struct sk_buff *skb) 1243 : : { - 1244 : 27320 : struct mptcp_ext *mpext; + 1244 : 66814 : struct mptcp_ext *mpext; 1245 : : - 1246 [ + + ]: 27320 : mpext = skb ? mptcp_get_ext(skb) : NULL; - 1247 [ + + + + ]: 5936 : if (mpext && mpext->infinite_map) + 1246 [ + + ]: 66814 : mpext = skb ? mptcp_get_ext(skb) : NULL; + 1247 [ + + + + ]: 11451 : if (mpext && mpext->infinite_map) 1248 : 1 : return true; 1249 : : 1250 : : return false; @@ -1407,18 +1413,18 @@ 1252 : : 1253 : 246 : static inline bool is_active_ssk(struct mptcp_subflow_context *subflow) 1254 : : { - 1255 : 3410 : return (subflow->request_mptcp || subflow->request_join); + 1255 : 3407 : return (subflow->request_mptcp || subflow->request_join); 1256 : : } 1257 : : - 1258 : 4953 : static inline bool subflow_simultaneous_connect(struct sock *sk) + 1258 : 4969 : static inline bool subflow_simultaneous_connect(struct sock *sk) 1259 : : { - 1260 : 4953 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); + 1260 : 4969 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); 1261 : : - 1262 : 2477 : return (1 << sk->sk_state) & - 1263 [ + + ]: 3410 : (TCPF_ESTABLISHED | TCPF_FIN_WAIT1 | TCPF_FIN_WAIT2 | TCPF_CLOSING) && - 1264 [ + + + + : 4953 : is_active_ssk(subflow) && + 1262 : 2484 : return (1 << sk->sk_state) & + 1263 [ + + ]: 3407 : (TCPF_ESTABLISHED | TCPF_FIN_WAIT1 | TCPF_FIN_WAIT2 | TCPF_CLOSING) && + 1264 [ + + + + : 4969 : is_active_ssk(subflow) && + + ] - 1265 [ + - ]: 1731 : !subflow->conn_finished; + 1265 [ + - ]: 1726 : !subflow->conn_finished; 1266 : : } 1267 : : 1268 : : #ifdef CONFIG_SYN_COOKIES diff --git a/html/lcov/export/mptcp/sched.c.func-c.html b/html/lcov/export/mptcp/sched.c.func-c.html index 4f380dd0..3474344b 100644 --- a/html/lcov/export/mptcp/sched.c.func-c.html +++ b/html/lcov/export/mptcp/sched.c.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % @@ -130,7 +130,7 @@ mptcp_sched_get_retrans - 6687 + 11932 @@ -144,21 +144,21 @@ mptcp_sched_default_get_subflow - 342102 + 486103 mptcp_sched_get_send - 571847 + 748462 mptcp_subflow_set_scheduled - 779975 + 940793 diff --git a/html/lcov/export/mptcp/sched.c.func.html b/html/lcov/export/mptcp/sched.c.func.html index 6a58a5e2..57c852dc 100644 --- a/html/lcov/export/mptcp/sched.c.func.html +++ b/html/lcov/export/mptcp/sched.c.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % @@ -116,7 +116,7 @@ mptcp_sched_default_get_subflow - 342102 + 486103 @@ -130,14 +130,14 @@ mptcp_sched_get_retrans - 6687 + 11932 mptcp_sched_get_send - 571847 + 748462 @@ -151,7 +151,7 @@ mptcp_subflow_set_scheduled - 779975 + 940793 diff --git a/html/lcov/export/mptcp/sched.c.gcov.html b/html/lcov/export/mptcp/sched.c.gcov.html index 1f5c3595..ba614746 100644 --- a/html/lcov/export/mptcp/sched.c.gcov.html +++ b/html/lcov/export/mptcp/sched.c.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % @@ -94,18 +94,18 @@ 16 : : static DEFINE_SPINLOCK(mptcp_sched_list_lock); 17 : : static LIST_HEAD(mptcp_sched_list); 18 : : - 19 : 342102 : static int mptcp_sched_default_get_subflow(struct mptcp_sock *msk, + 19 : 486103 : static int mptcp_sched_default_get_subflow(struct mptcp_sock *msk, 20 : : struct mptcp_sched_data *data) 21 : : { - 22 : 342102 : struct sock *ssk; + 22 : 486103 : struct sock *ssk; 23 : : - 24 [ + + + + ]: 342102 : ssk = data->reinject ? mptcp_subflow_get_retrans(msk) : - 25 : 340419 : mptcp_subflow_get_send(msk); - 26 [ + + ]: 342102 : if (!ssk) + 24 [ + + + + ]: 486103 : ssk = data->reinject ? mptcp_subflow_get_retrans(msk) : + 25 : 484360 : mptcp_subflow_get_send(msk); + 26 [ + + ]: 486103 : if (!ssk) 27 : : return -EINVAL; 28 : : - 29 : 289569 : mptcp_subflow_set_scheduled(mptcp_subflow_ctx(ssk), true); - 30 : 289569 : return 0; + 29 : 425471 : mptcp_subflow_set_scheduled(mptcp_subflow_ctx(ssk), true); + 30 : 425471 : return 0; 31 : : } 32 : : 33 : : static struct mptcp_sched_ops mptcp_sched_default = { @@ -217,11 +217,11 @@ 135 : 3587 : bpf_module_put(sched, sched->owner); 136 : : } 137 : : - 138 : 260193 : void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subflow, + 138 : 420806 : void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subflow, 139 : : bool scheduled) 140 : : { 141 : 0 : WRITE_ONCE(subflow->scheduled, scheduled); - 142 : 779975 : } + 142 : 940793 : } 143 : : 144 : 196621 : static void mptcp_sched_data_set_contexts(const struct mptcp_sock *msk, 145 : : struct mptcp_sched_data *data) @@ -229,71 +229,71 @@ 147 : 196621 : struct mptcp_subflow_context *subflow; 148 : 196621 : int i = 0; 149 : : - 150 [ + + ]: 589294 : mptcp_for_each_subflow(msk, subflow) { - 151 [ - + ]: 392673 : if (i == MPTCP_SUBFLOWS_MAX) { + 150 [ + + ]: 589255 : mptcp_for_each_subflow(msk, subflow) { + 151 [ - + ]: 392634 : if (i == MPTCP_SUBFLOWS_MAX) { 152 [ # # # # ]: 0 : pr_warn_once("too many subflows"); 153 : : break; 154 : : } - 155 : 392673 : mptcp_subflow_set_scheduled(subflow, false); - 156 : 392673 : data->contexts[i++] = subflow; + 155 : 392634 : mptcp_subflow_set_scheduled(subflow, false); + 156 : 392634 : data->contexts[i++] = subflow; 157 : : } 158 : 196621 : data->subflows = i; 159 : : - 160 [ + + ]: 1376916 : for (; i < MPTCP_SUBFLOWS_MAX; i++) - 161 : 1180295 : data->contexts[i] = NULL; + 160 [ + + ]: 1376955 : for (; i < MPTCP_SUBFLOWS_MAX; i++) + 161 : 1180334 : data->contexts[i] = NULL; 162 : 196621 : } 163 : : - 164 : 571847 : int mptcp_sched_get_send(struct mptcp_sock *msk) + 164 : 748462 : int mptcp_sched_get_send(struct mptcp_sock *msk) 165 : : { - 166 : 571847 : struct mptcp_subflow_context *subflow; - 167 : 571847 : struct mptcp_sched_data data; + 166 : 748462 : struct mptcp_subflow_context *subflow; + 167 : 748462 : struct mptcp_sched_data data; 168 : : - 169 : 571847 : msk_owned_by_me(msk); + 169 : 748462 : msk_owned_by_me(msk); 170 : : 171 : : /* the following check is moved out of mptcp_subflow_get_send */ - 172 [ + + ]: 571847 : if (__mptcp_check_fallback(msk)) { - 173 [ + - + - ]: 28924 : if (msk->first && - 174 [ + + ]: 20416 : __tcp_can_send(msk->first) && - 175 [ # # ]: 14462 : sk_stream_memory_free(msk->first)) { - 176 : 13387 : mptcp_subflow_set_scheduled(mptcp_subflow_ctx(msk->first), true); - 177 : 13387 : return 0; + 172 [ + + ]: 748462 : if (__mptcp_check_fallback(msk)) { + 173 [ + - + - ]: 94948 : if (msk->first && + 174 [ + + ]: 64883 : __tcp_can_send(msk->first) && + 175 [ # # ]: 47474 : sk_stream_memory_free(msk->first)) { + 176 : 38073 : mptcp_subflow_set_scheduled(mptcp_subflow_ctx(msk->first), true); + 177 : 38073 : return 0; 178 : : } - 179 : 1075 : return -EINVAL; + 179 : 9401 : return -EINVAL; 180 : : } 181 : : - 182 [ + + ]: 1576926 : mptcp_for_each_subflow(msk, subflow) { - 183 [ + + + + ]: 1043052 : if (READ_ONCE(subflow->scheduled)) + 182 [ + + ]: 1918128 : mptcp_for_each_subflow(msk, subflow) { + 183 [ + + + + ]: 1240601 : if (READ_ONCE(subflow->scheduled)) 184 : : return 0; 185 : : } 186 : : - 187 : 533874 : data.reinject = false; - 188 [ + + - + ]: 533874 : if (msk->sched == &mptcp_sched_default || !msk->sched) - 189 : 340419 : return mptcp_sched_default_get_subflow(msk, &data); - 190 : 193455 : mptcp_sched_data_set_contexts(msk, &data); - 191 : 193455 : return msk->sched->get_subflow(msk, &data); + 187 : 677527 : data.reinject = false; + 188 [ + + - + ]: 677527 : if (msk->sched == &mptcp_sched_default || !msk->sched) + 189 : 484360 : return mptcp_sched_default_get_subflow(msk, &data); + 190 : 193167 : mptcp_sched_data_set_contexts(msk, &data); + 191 : 193167 : return msk->sched->get_subflow(msk, &data); 192 : : } 193 : : - 194 : 6687 : int mptcp_sched_get_retrans(struct mptcp_sock *msk) + 194 : 11932 : int mptcp_sched_get_retrans(struct mptcp_sock *msk) 195 : : { - 196 : 6687 : struct mptcp_subflow_context *subflow; - 197 : 6687 : struct mptcp_sched_data data; + 196 : 11932 : struct mptcp_subflow_context *subflow; + 197 : 11932 : struct mptcp_sched_data data; 198 : : - 199 : 6687 : msk_owned_by_me(msk); + 199 : 11932 : msk_owned_by_me(msk); 200 : : 201 : : /* the following check is moved out of mptcp_subflow_get_retrans */ - 202 [ + + ]: 6687 : if (__mptcp_check_fallback(msk)) + 202 [ + + ]: 11932 : if (__mptcp_check_fallback(msk)) 203 : : return -EINVAL; 204 : : - 205 [ + + ]: 14287 : mptcp_for_each_subflow(msk, subflow) { - 206 [ + + + + ]: 9438 : if (READ_ONCE(subflow->scheduled)) + 205 [ + + ]: 15291 : mptcp_for_each_subflow(msk, subflow) { + 206 [ + + + + ]: 10094 : if (READ_ONCE(subflow->scheduled)) 207 : : return 0; 208 : : } 209 : : - 210 : 4849 : data.reinject = true; - 211 [ + + + + ]: 4849 : if (msk->sched == &mptcp_sched_default || !msk->sched) - 212 : 1683 : return mptcp_sched_default_get_subflow(msk, &data); - 213 : 3166 : mptcp_sched_data_set_contexts(msk, &data); - 214 : 3166 : return msk->sched->get_subflow(msk, &data); + 210 : 5197 : data.reinject = true; + 211 [ + + + + ]: 5197 : if (msk->sched == &mptcp_sched_default || !msk->sched) + 212 : 1743 : return mptcp_sched_default_get_subflow(msk, &data); + 213 : 3454 : mptcp_sched_data_set_contexts(msk, &data); + 214 : 3454 : return msk->sched->get_subflow(msk, &data); 215 : : } diff --git a/html/lcov/export/mptcp/sockopt.c.func-c.html b/html/lcov/export/mptcp/sockopt.c.func-c.html index 48f35d28..2903db3b 100644 --- a/html/lcov/export/mptcp/sockopt.c.func-c.html +++ b/html/lcov/export/mptcp/sockopt.c.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 90.2 % @@ -214,14 +214,14 @@ mptcp_getsockopt_info - 41 + 42 sync_socket_options - 44 + 45 @@ -298,14 +298,14 @@ mptcp_getsockopt_sol_mptcp - 321 + 322 mptcp_diag_fill_info - 1041 + 1032 @@ -319,7 +319,7 @@ mptcp_sockopt_sync_locked - 3574 + 3572 @@ -340,14 +340,14 @@ mptcp_getsockopt - 6951 + 6952 __mptcp_tcp_fallback - 7175 + 7176 diff --git a/html/lcov/export/mptcp/sockopt.c.func.html b/html/lcov/export/mptcp/sockopt.c.func.html index 9ce5d6e4..376fff62 100644 --- a/html/lcov/export/mptcp/sockopt.c.func.html +++ b/html/lcov/export/mptcp/sockopt.c.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 90.2 % @@ -102,14 +102,14 @@ __mptcp_tcp_fallback - 7175 + 7176 mptcp_diag_fill_info - 1041 + 1032 @@ -144,7 +144,7 @@ mptcp_getsockopt - 6951 + 6952 @@ -165,14 +165,14 @@ mptcp_getsockopt_info - 41 + 42 mptcp_getsockopt_sol_mptcp - 321 + 322 @@ -326,7 +326,7 @@ mptcp_sockopt_sync_locked - 3574 + 3572 @@ -361,7 +361,7 @@ sync_socket_options - 44 + 45 diff --git a/html/lcov/export/mptcp/sockopt.c.gcov.html b/html/lcov/export/mptcp/sockopt.c.gcov.html index 1b936f81..271994ce 100644 --- a/html/lcov/export/mptcp/sockopt.c.gcov.html +++ b/html/lcov/export/mptcp/sockopt.c.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 90.2 % @@ -95,11 +95,11 @@ 17 : : #define MIN_INFO_OPTLEN_SIZE 16 18 : : #define MIN_FULL_INFO_OPTLEN_SIZE 40 19 : : - 20 : 7175 : static struct sock *__mptcp_tcp_fallback(struct mptcp_sock *msk) + 20 : 7176 : static struct sock *__mptcp_tcp_fallback(struct mptcp_sock *msk) 21 : : { - 22 : 7175 : msk_owned_by_me(msk); + 22 : 7176 : msk_owned_by_me(msk); 23 : : - 24 [ + + ]: 7175 : if (likely(!__mptcp_check_fallback(msk))) + 24 [ + + ]: 7176 : if (likely(!__mptcp_check_fallback(msk))) 25 : : return NULL; 26 : : 27 : 114 : return msk->first; @@ -236,12 +236,12 @@ 157 : : return ret; 158 : : 159 : 8 : lock_sock(sk); - 160 [ + + ]: 23 : mptcp_for_each_subflow(msk, subflow) { - 161 : 15 : struct sock *ssk = mptcp_subflow_tcp_sock(subflow); - 162 : 15 : bool slow = lock_sock_fast(ssk); + 160 [ + + ]: 22 : mptcp_for_each_subflow(msk, subflow) { + 161 : 14 : struct sock *ssk = mptcp_subflow_tcp_sock(subflow); + 162 : 14 : bool slow = lock_sock_fast(ssk); 163 : : - 164 : 15 : sock_set_timestamp(sk, optname, !!val); - 165 : 15 : unlock_sock_fast(ssk, slow); + 164 : 14 : sock_set_timestamp(sk, optname, !!val); + 165 : 14 : unlock_sock_fast(ssk, slow); 166 : : } 167 : : 168 : 8 : release_sock(sk); @@ -1015,85 +1015,85 @@ 932 : 6354 : return ret; 933 : : } 934 : : - 935 : 1041 : void mptcp_diag_fill_info(struct mptcp_sock *msk, struct mptcp_info *info) + 935 : 1032 : void mptcp_diag_fill_info(struct mptcp_sock *msk, struct mptcp_info *info) 936 : : { - 937 : 1041 : struct sock *sk = (struct sock *)msk; - 938 : 1041 : u32 flags = 0; - 939 : 1041 : bool slow; - 940 : 1041 : u32 now; + 937 : 1032 : struct sock *sk = (struct sock *)msk; + 938 : 1032 : u32 flags = 0; + 939 : 1032 : bool slow; + 940 : 1032 : u32 now; 941 : : - 942 : 1041 : memset(info, 0, sizeof(*info)); + 942 : 1032 : memset(info, 0, sizeof(*info)); 943 : : - 944 : 1041 : info->mptcpi_subflows = READ_ONCE(msk->pm.subflows); - 945 : 1041 : info->mptcpi_add_addr_signal = READ_ONCE(msk->pm.add_addr_signaled); - 946 : 1041 : info->mptcpi_add_addr_accepted = READ_ONCE(msk->pm.add_addr_accepted); - 947 : 1041 : info->mptcpi_local_addr_used = READ_ONCE(msk->pm.local_addr_used); + 944 : 1032 : info->mptcpi_subflows = READ_ONCE(msk->pm.subflows); + 945 : 1032 : info->mptcpi_add_addr_signal = READ_ONCE(msk->pm.add_addr_signaled); + 946 : 1032 : info->mptcpi_add_addr_accepted = READ_ONCE(msk->pm.add_addr_accepted); + 947 : 1032 : info->mptcpi_local_addr_used = READ_ONCE(msk->pm.local_addr_used); 948 : : - 949 [ + - ]: 1041 : if (inet_sk_state_load(sk) == TCP_LISTEN) + 949 [ + - ]: 1032 : if (inet_sk_state_load(sk) == TCP_LISTEN) 950 : : return; 951 : : 952 : : /* The following limits only make sense for the in-kernel PM */ - 953 [ + + ]: 1041 : if (mptcp_pm_is_kernel(msk)) { - 954 : 1978 : info->mptcpi_subflows_max = - 955 : 989 : mptcp_pm_get_subflows_max(msk); - 956 : 1978 : info->mptcpi_add_addr_signal_max = - 957 : 989 : mptcp_pm_get_add_addr_signal_max(msk); - 958 : 1978 : info->mptcpi_add_addr_accepted_max = - 959 : 989 : mptcp_pm_get_add_addr_accept_max(msk); - 960 : 989 : info->mptcpi_local_addr_max = - 961 : 989 : mptcp_pm_get_local_addr_max(msk); + 953 [ + + ]: 1032 : if (mptcp_pm_is_kernel(msk)) { + 954 : 1960 : info->mptcpi_subflows_max = + 955 : 980 : mptcp_pm_get_subflows_max(msk); + 956 : 1960 : info->mptcpi_add_addr_signal_max = + 957 : 980 : mptcp_pm_get_add_addr_signal_max(msk); + 958 : 1960 : info->mptcpi_add_addr_accepted_max = + 959 : 980 : mptcp_pm_get_add_addr_accept_max(msk); + 960 : 980 : info->mptcpi_local_addr_max = + 961 : 980 : mptcp_pm_get_local_addr_max(msk); 962 : : } 963 : : - 964 [ + + ]: 1041 : if (__mptcp_check_fallback(msk)) + 964 [ + + ]: 1032 : if (__mptcp_check_fallback(msk)) 965 : 2 : flags |= MPTCP_INFO_FLAG_FALLBACK; - 966 [ + + + + ]: 1041 : if (READ_ONCE(msk->can_ack)) - 967 : 1039 : flags |= MPTCP_INFO_FLAG_REMOTE_KEY_RECEIVED; - 968 : 1041 : info->mptcpi_flags = flags; + 966 [ + + + + ]: 1032 : if (READ_ONCE(msk->can_ack)) + 967 : 1029 : flags |= MPTCP_INFO_FLAG_REMOTE_KEY_RECEIVED; + 968 : 1032 : info->mptcpi_flags = flags; 969 : : - 970 : 1041 : slow = lock_sock_fast(sk); - 971 [ - + ]: 1041 : info->mptcpi_csum_enabled = READ_ONCE(msk->csum_enabled); - 972 : 1041 : info->mptcpi_token = msk->token; - 973 : 1041 : info->mptcpi_write_seq = msk->write_seq; - 974 : 1041 : info->mptcpi_retransmits = inet_csk(sk)->icsk_retransmits; - 975 : 1041 : info->mptcpi_bytes_sent = msk->bytes_sent; - 976 : 1041 : info->mptcpi_bytes_received = msk->bytes_received; - 977 : 1041 : info->mptcpi_bytes_retrans = msk->bytes_retrans; - 978 : 2082 : info->mptcpi_subflows_total = info->mptcpi_subflows + - 979 : 1041 : __mptcp_has_initial_subflow(msk); - 980 : 1041 : now = tcp_jiffies32; - 981 : 1041 : info->mptcpi_last_data_sent = jiffies_to_msecs(now - msk->last_data_sent); - 982 : 1041 : info->mptcpi_last_data_recv = jiffies_to_msecs(now - msk->last_data_recv); - 983 : 1041 : unlock_sock_fast(sk, slow); + 970 : 1032 : slow = lock_sock_fast(sk); + 971 [ - + ]: 1032 : info->mptcpi_csum_enabled = READ_ONCE(msk->csum_enabled); + 972 : 1032 : info->mptcpi_token = msk->token; + 973 : 1032 : info->mptcpi_write_seq = msk->write_seq; + 974 : 1032 : info->mptcpi_retransmits = inet_csk(sk)->icsk_retransmits; + 975 : 1032 : info->mptcpi_bytes_sent = msk->bytes_sent; + 976 : 1032 : info->mptcpi_bytes_received = msk->bytes_received; + 977 : 1032 : info->mptcpi_bytes_retrans = msk->bytes_retrans; + 978 : 2064 : info->mptcpi_subflows_total = info->mptcpi_subflows + + 979 : 1032 : __mptcp_has_initial_subflow(msk); + 980 : 1032 : now = tcp_jiffies32; + 981 : 1032 : info->mptcpi_last_data_sent = jiffies_to_msecs(now - msk->last_data_sent); + 982 : 1032 : info->mptcpi_last_data_recv = jiffies_to_msecs(now - msk->last_data_recv); + 983 : 1032 : unlock_sock_fast(sk, slow); 984 : : - 985 : 1041 : mptcp_data_lock(sk); - 986 : 1041 : info->mptcpi_last_ack_recv = jiffies_to_msecs(now - msk->last_ack_recv); - 987 : 1041 : info->mptcpi_snd_una = msk->snd_una; - 988 : 1041 : info->mptcpi_rcv_nxt = msk->ack_seq; - 989 : 1041 : info->mptcpi_bytes_acked = msk->bytes_acked; - 990 : 1041 : mptcp_data_unlock(sk); + 985 : 1032 : mptcp_data_lock(sk); + 986 : 1032 : info->mptcpi_last_ack_recv = jiffies_to_msecs(now - msk->last_ack_recv); + 987 : 1032 : info->mptcpi_snd_una = msk->snd_una; + 988 : 1032 : info->mptcpi_rcv_nxt = msk->ack_seq; + 989 : 1032 : info->mptcpi_bytes_acked = msk->bytes_acked; + 990 : 1032 : mptcp_data_unlock(sk); 991 : : } 992 : : EXPORT_SYMBOL_GPL(mptcp_diag_fill_info); 993 : : - 994 : 41 : static int mptcp_getsockopt_info(struct mptcp_sock *msk, char __user *optval, int __user *optlen) + 994 : 42 : static int mptcp_getsockopt_info(struct mptcp_sock *msk, char __user *optval, int __user *optlen) 995 : : { - 996 : 41 : struct mptcp_info m_info; - 997 : 41 : int len; + 996 : 42 : struct mptcp_info m_info; + 997 : 42 : int len; 998 : : - 999 [ - + ]: 41 : if (get_user(len, optlen)) + 999 [ - + ]: 42 : if (get_user(len, optlen)) 1000 : : return -EFAULT; 1001 : : 1002 : : /* When used only to check if a fallback to TCP happened. */ - 1003 [ - + ]: 41 : if (len == 0) + 1003 [ - + ]: 42 : if (len == 0) 1004 : : return 0; 1005 : : - 1006 : 41 : len = min_t(unsigned int, len, sizeof(struct mptcp_info)); + 1006 : 42 : len = min_t(unsigned int, len, sizeof(struct mptcp_info)); 1007 : : - 1008 : 41 : mptcp_diag_fill_info(msk, &m_info); + 1008 : 42 : mptcp_diag_fill_info(msk, &m_info); 1009 : : - 1010 [ - + ]: 41 : if (put_user(len, optlen)) + 1010 [ - + ]: 42 : if (put_user(len, optlen)) 1011 : : return -EFAULT; 1012 : : - 1013 [ - + ]: 41 : if (copy_to_user(optval, &m_info, len)) + 1013 [ - + ]: 42 : if (copy_to_user(optval, &m_info, len)) 1014 : : return -EFAULT; 1015 : : 1016 : : return 0; @@ -1515,13 +1515,13 @@ 1430 : : return -EOPNOTSUPP; 1431 : : } 1432 : : - 1433 : 321 : static int mptcp_getsockopt_sol_mptcp(struct mptcp_sock *msk, int optname, + 1433 : 322 : static int mptcp_getsockopt_sol_mptcp(struct mptcp_sock *msk, int optname, 1434 : : char __user *optval, int __user *optlen) 1435 : : { - 1436 [ + + + + : 321 : switch (optname) { + 1436 [ + + + + : 322 : switch (optname) { - ] - 1437 : 41 : case MPTCP_INFO: - 1438 : 41 : return mptcp_getsockopt_info(msk, optval, optlen); + 1437 : 42 : case MPTCP_INFO: + 1438 : 42 : return mptcp_getsockopt_info(msk, optval, optlen); 1439 : 8 : case MPTCP_FULL_INFO: 1440 : 8 : return mptcp_getsockopt_full_info(msk, optval, optlen); 1441 : 128 : case MPTCP_TCPINFO: @@ -1533,13 +1533,13 @@ 1447 : : return -EOPNOTSUPP; 1448 : : } 1449 : : - 1450 : 6951 : int mptcp_getsockopt(struct sock *sk, int level, int optname, + 1450 : 6952 : int mptcp_getsockopt(struct sock *sk, int level, int optname, 1451 : : char __user *optval, int __user *option) 1452 : : { - 1453 [ - + ]: 6951 : struct mptcp_sock *msk = mptcp_sk(sk); - 1454 : 6951 : struct sock *ssk; + 1453 [ - + ]: 6952 : struct mptcp_sock *msk = mptcp_sk(sk); + 1454 : 6952 : struct sock *ssk; 1455 : : - 1456 [ - + ]: 6951 : pr_debug("msk=%p\n", msk); + 1456 [ - + ]: 6952 : pr_debug("msk=%p\n", msk); 1457 : : 1458 : : /* @@ the meaning of setsockopt() when the socket is connected and 1459 : : * there are multiple subflows is not yet defined. It is up to the @@ -1547,40 +1547,40 @@ 1461 : : * is in TCP fallback, when socket options are passed through 1462 : : * to the one remaining subflow. 1463 : : */ - 1464 : 6951 : lock_sock(sk); - 1465 : 6951 : ssk = __mptcp_tcp_fallback(msk); - 1466 : 6951 : release_sock(sk); - 1467 [ + + ]: 6951 : if (ssk) + 1464 : 6952 : lock_sock(sk); + 1465 : 6952 : ssk = __mptcp_tcp_fallback(msk); + 1466 : 6952 : release_sock(sk); + 1467 [ + + ]: 6952 : if (ssk) 1468 : 114 : return tcp_getsockopt(ssk, level, optname, optval, option); 1469 : : - 1470 [ + + ]: 6837 : if (level == SOL_IP) + 1470 [ + + ]: 6838 : if (level == SOL_IP) 1471 : 12 : return mptcp_getsockopt_v4(msk, optname, optval, option); - 1472 [ + + ]: 6825 : if (level == SOL_TCP) + 1472 [ + + ]: 6826 : if (level == SOL_TCP) 1473 : 6504 : return mptcp_getsockopt_sol_tcp(msk, optname, optval, option); - 1474 [ + - ]: 321 : if (level == SOL_MPTCP) - 1475 : 321 : return mptcp_getsockopt_sol_mptcp(msk, optname, optval, option); + 1474 [ + - ]: 322 : if (level == SOL_MPTCP) + 1475 : 322 : return mptcp_getsockopt_sol_mptcp(msk, optname, optval, option); 1476 : : return -EOPNOTSUPP; 1477 : : } 1478 : : - 1479 : 44 : static void sync_socket_options(struct mptcp_sock *msk, struct sock *ssk) + 1479 : 45 : static void sync_socket_options(struct mptcp_sock *msk, struct sock *ssk) 1480 : : { - 1481 : 44 : static const unsigned int tx_rx_locks = SOCK_RCVBUF_LOCK | SOCK_SNDBUF_LOCK; - 1482 : 44 : struct sock *sk = (struct sock *)msk; + 1481 : 45 : static const unsigned int tx_rx_locks = SOCK_RCVBUF_LOCK | SOCK_SNDBUF_LOCK; + 1482 : 45 : struct sock *sk = (struct sock *)msk; 1483 : : - 1484 [ + - ]: 44 : if (ssk->sk_prot->keepalive) { - 1485 [ - + ]: 44 : if (sock_flag(sk, SOCK_KEEPOPEN)) + 1484 [ + - ]: 45 : if (ssk->sk_prot->keepalive) { + 1485 [ - + ]: 45 : if (sock_flag(sk, SOCK_KEEPOPEN)) 1486 : 0 : ssk->sk_prot->keepalive(ssk, 1); 1487 : : else - 1488 : 44 : ssk->sk_prot->keepalive(ssk, 0); + 1488 : 45 : ssk->sk_prot->keepalive(ssk, 0); 1489 : : } 1490 : : - 1491 : 44 : ssk->sk_priority = sk->sk_priority; - 1492 : 44 : ssk->sk_bound_dev_if = sk->sk_bound_dev_if; - 1493 : 44 : ssk->sk_incoming_cpu = sk->sk_incoming_cpu; - 1494 : 44 : ssk->sk_ipv6only = sk->sk_ipv6only; - 1495 : 44 : __ip_sock_set_tos(ssk, inet_sk(sk)->tos); + 1491 : 45 : ssk->sk_priority = sk->sk_priority; + 1492 : 45 : ssk->sk_bound_dev_if = sk->sk_bound_dev_if; + 1493 : 45 : ssk->sk_incoming_cpu = sk->sk_incoming_cpu; + 1494 : 45 : ssk->sk_ipv6only = sk->sk_ipv6only; + 1495 : 45 : __ip_sock_set_tos(ssk, inet_sk(sk)->tos); 1496 : : - 1497 [ - + ]: 44 : if (sk->sk_userlocks & tx_rx_locks) { + 1497 [ - + ]: 45 : if (sk->sk_userlocks & tx_rx_locks) { 1498 : 0 : ssk->sk_userlocks |= sk->sk_userlocks & tx_rx_locks; 1499 [ # # ]: 0 : if (sk->sk_userlocks & SOCK_SNDBUF_LOCK) { 1500 : 0 : WRITE_ONCE(ssk->sk_sndbuf, sk->sk_sndbuf); @@ -1590,54 +1590,54 @@ 1504 : 0 : WRITE_ONCE(ssk->sk_rcvbuf, sk->sk_rcvbuf); 1505 : : } 1506 : : - 1507 [ - + ]: 44 : if (sock_flag(sk, SOCK_LINGER)) { + 1507 [ - + ]: 45 : if (sock_flag(sk, SOCK_LINGER)) { 1508 : 0 : ssk->sk_lingertime = sk->sk_lingertime; 1509 : 0 : sock_set_flag(ssk, SOCK_LINGER); 1510 : : } else { - 1511 : 44 : sock_reset_flag(ssk, SOCK_LINGER); + 1511 : 45 : sock_reset_flag(ssk, SOCK_LINGER); 1512 : : } 1513 : : - 1514 [ + + ]: 44 : if (sk->sk_mark != ssk->sk_mark) { - 1515 : 28 : ssk->sk_mark = sk->sk_mark; - 1516 : 28 : sk_dst_reset(ssk); + 1514 [ + + ]: 45 : if (sk->sk_mark != ssk->sk_mark) { + 1515 : 29 : ssk->sk_mark = sk->sk_mark; + 1516 : 29 : sk_dst_reset(ssk); 1517 : : } 1518 : : - 1519 : 44 : sock_valbool_flag(ssk, SOCK_DBG, sock_flag(sk, SOCK_DBG)); + 1519 : 45 : sock_valbool_flag(ssk, SOCK_DBG, sock_flag(sk, SOCK_DBG)); 1520 : : - 1521 [ + - ]: 44 : if (inet_csk(sk)->icsk_ca_ops != inet_csk(ssk)->icsk_ca_ops) - 1522 : 44 : tcp_set_congestion_control(ssk, msk->ca_name, false, true); - 1523 : 44 : __tcp_sock_set_cork(ssk, !!msk->cork); - 1524 : 44 : __tcp_sock_set_nodelay(ssk, !!msk->nodelay); - 1525 : 44 : tcp_sock_set_keepidle_locked(ssk, msk->keepalive_idle); - 1526 : 44 : tcp_sock_set_keepintvl(ssk, msk->keepalive_intvl); - 1527 : 44 : tcp_sock_set_keepcnt(ssk, msk->keepalive_cnt); + 1521 [ + - ]: 45 : if (inet_csk(sk)->icsk_ca_ops != inet_csk(ssk)->icsk_ca_ops) + 1522 : 45 : tcp_set_congestion_control(ssk, msk->ca_name, false, true); + 1523 : 45 : __tcp_sock_set_cork(ssk, !!msk->cork); + 1524 : 45 : __tcp_sock_set_nodelay(ssk, !!msk->nodelay); + 1525 : 45 : tcp_sock_set_keepidle_locked(ssk, msk->keepalive_idle); + 1526 : 45 : tcp_sock_set_keepintvl(ssk, msk->keepalive_intvl); + 1527 : 45 : tcp_sock_set_keepcnt(ssk, msk->keepalive_cnt); 1528 : : - 1529 [ - + ]: 44 : inet_assign_bit(TRANSPARENT, ssk, inet_test_bit(TRANSPARENT, sk)); - 1530 [ - + ]: 44 : inet_assign_bit(FREEBIND, ssk, inet_test_bit(FREEBIND, sk)); - 1531 [ - + ]: 44 : inet_assign_bit(BIND_ADDRESS_NO_PORT, ssk, inet_test_bit(BIND_ADDRESS_NO_PORT, sk)); - 1532 : 44 : WRITE_ONCE(inet_sk(ssk)->local_port_range, READ_ONCE(inet_sk(sk)->local_port_range)); - 1533 : 44 : } + 1529 [ - + ]: 45 : inet_assign_bit(TRANSPARENT, ssk, inet_test_bit(TRANSPARENT, sk)); + 1530 [ - + ]: 45 : inet_assign_bit(FREEBIND, ssk, inet_test_bit(FREEBIND, sk)); + 1531 [ - + ]: 45 : inet_assign_bit(BIND_ADDRESS_NO_PORT, ssk, inet_test_bit(BIND_ADDRESS_NO_PORT, sk)); + 1532 : 45 : WRITE_ONCE(inet_sk(ssk)->local_port_range, READ_ONCE(inet_sk(sk)->local_port_range)); + 1533 : 45 : } 1534 : : - 1535 : 3574 : void mptcp_sockopt_sync_locked(struct mptcp_sock *msk, struct sock *ssk) + 1535 : 3572 : void mptcp_sockopt_sync_locked(struct mptcp_sock *msk, struct sock *ssk) 1536 : : { - 1537 [ - + ]: 3574 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); + 1537 [ - + ]: 3572 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); 1538 : : - 1539 : 3574 : msk_owned_by_me(msk); + 1539 : 3572 : msk_owned_by_me(msk); 1540 : : - 1541 : 3574 : ssk->sk_rcvlowat = 0; + 1541 : 3572 : ssk->sk_rcvlowat = 0; 1542 : : 1543 : : /* subflows must ignore any latency-related settings: will not affect 1544 : : * the user-space - only the msk is relevant - but will foul the 1545 : : * mptcp scheduler 1546 : : */ - 1547 [ - + ]: 3574 : tcp_sk(ssk)->notsent_lowat = UINT_MAX; + 1547 [ - + ]: 3572 : tcp_sk(ssk)->notsent_lowat = UINT_MAX; 1548 : : - 1549 [ + + ]: 3574 : if (READ_ONCE(subflow->setsockopt_seq) != msk->setsockopt_seq) { - 1550 : 44 : sync_socket_options(msk, ssk); + 1549 [ + + ]: 3572 : if (READ_ONCE(subflow->setsockopt_seq) != msk->setsockopt_seq) { + 1550 : 45 : sync_socket_options(msk, ssk); 1551 : : - 1552 : 44 : subflow->setsockopt_seq = msk->setsockopt_seq; + 1552 : 45 : subflow->setsockopt_seq = msk->setsockopt_seq; 1553 : : } - 1554 : 3574 : } + 1554 : 3572 : } 1555 : : 1556 : : /* unfortunately this is different enough from the tcp version so 1557 : : * that we can't factor it out diff --git a/html/lcov/export/mptcp/subflow.c.func-c.html b/html/lcov/export/mptcp/subflow.c.func-c.html index 250f4cab..0d41cb7c 100644 --- a/html/lcov/export/mptcp/subflow.c.func-c.html +++ b/html/lcov/export/mptcp/subflow.c.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 95.5 % @@ -186,21 +186,21 @@ subflow_v6_route_req - 302 + 301 - subflow_v6_send_synack + subflow_v6_req_destructor - 304 + 309 - subflow_v6_req_destructor + subflow_v6_send_synack - 310 + 311 @@ -242,7 +242,7 @@ __mptcp_subflow_connect - 626 + 627 @@ -256,21 +256,21 @@ subflow_v6_conn_request - 939 + 938 subflow_set_local_id - 1082 + 1080 mptcp_info2sockaddr - 1146 + 1142 @@ -291,56 +291,56 @@ mptcp_subflow_queue_clean - 1248 + 1249 subflow_v4_send_synack - 1475 + 1476 subflow_v4_conn_request - 1483 + 1484 subflow_v4_route_req - 1483 + 1484 subflow_v4_req_destructor - 1523 + 1524 - subflow_syn_recv_sock + subflow_v6_rebuild_header - 1769 + 1525 - subflow_ulp_clone + subflow_syn_recv_sock 1769 - subflow_prep_synack + subflow_ulp_clone - 1779 + 1769 @@ -352,30 +352,30 @@ - subflow_init_req + subflow_prep_synack - 1833 + 1787 - subflow_req_destructor + subflow_error_report - 1833 + 1810 - subflow_error_report + subflow_init_req - 1838 + 1833 - subflow_v6_rebuild_header + subflow_req_destructor - 1979 + 1833 @@ -396,21 +396,21 @@ mptcp_attach_cgroup - 3069 + 3067 mptcp_subflow_create_socket - 3132 + 3133 subflow_ulp_init - 3381 + 3379 @@ -424,126 +424,126 @@ subflow_ulp_release - 4587 + 4585 - subflow_finish_connect + subflow_create_ctx - 4757 + 4760 - subflow_create_ctx + subflow_finish_connect - 4762 + 4795 - mptcp_subflow_discard_data + __subflow_state_change - 4796 + 4969 - __subflow_state_change + subflow_state_change - 4953 + 4969 - subflow_state_change + mptcp_subflow_discard_data - 4953 + 5470 subflow_rebuild_header - 5924 + 5695 subflow_chk_local_id - 7903 + 7220 validate_mapping - 169716 + 257044 subflow_write_space - 305842 + 405255 tcp_release_cb_override - 478202 + 606963 validate_data_csum - 484473 + 696986 subflow_data_ready - 490461 + 704465 subflow_sched_work_if_closed - 497232 + 711223 mptcp_subflow_data_available - 977618 + 1406138 subflow_check_data_avail - 977618 + 1406138 get_mapping_status - 979047 + 1408198 mptcp_space - 1057135 + 1452046 diff --git a/html/lcov/export/mptcp/subflow.c.func.html b/html/lcov/export/mptcp/subflow.c.func.html index 0cca88ab..f0f1d113 100644 --- a/html/lcov/export/mptcp/subflow.c.func.html +++ b/html/lcov/export/mptcp/subflow.c.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 95.5 % @@ -81,7 +81,7 @@ __mptcp_subflow_connect - 626 + 627 @@ -102,7 +102,7 @@ __subflow_state_change - 4953 + 4969 @@ -116,14 +116,14 @@ get_mapping_status - 979047 + 1408198 mptcp_attach_cgroup - 3069 + 3067 @@ -144,7 +144,7 @@ mptcp_info2sockaddr - 1146 + 1142 @@ -158,28 +158,28 @@ mptcp_space - 1057135 + 1452046 mptcp_subflow_create_socket - 3132 + 3133 mptcp_subflow_data_available - 977618 + 1406138 mptcp_subflow_discard_data - 4796 + 5470 @@ -214,7 +214,7 @@ mptcp_subflow_queue_clean - 1248 + 1249 @@ -263,7 +263,7 @@ subflow_check_data_avail - 977618 + 1406138 @@ -277,35 +277,35 @@ subflow_chk_local_id - 7903 + 7220 subflow_create_ctx - 4762 + 4760 subflow_data_ready - 490461 + 704465 subflow_error_report - 1838 + 1810 subflow_finish_connect - 4757 + 4795 @@ -340,14 +340,14 @@ subflow_prep_synack - 1779 + 1787 subflow_rebuild_header - 5924 + 5695 @@ -375,14 +375,14 @@ subflow_sched_work_if_closed - 497232 + 711223 subflow_set_local_id - 1082 + 1080 @@ -396,7 +396,7 @@ subflow_state_change - 4953 + 4969 @@ -438,84 +438,84 @@ subflow_ulp_init - 3381 + 3379 subflow_ulp_release - 4587 + 4585 subflow_v4_conn_request - 1483 + 1484 subflow_v4_req_destructor - 1523 + 1524 subflow_v4_route_req - 1483 + 1484 subflow_v4_send_synack - 1475 + 1476 subflow_v6_conn_request - 939 + 938 subflow_v6_rebuild_header - 1979 + 1525 subflow_v6_req_destructor - 310 + 309 subflow_v6_route_req - 302 + 301 subflow_v6_send_synack - 304 + 311 subflow_write_space - 305842 + 405255 @@ -529,21 +529,21 @@ tcp_release_cb_override - 478202 + 606963 validate_data_csum - 484473 + 696986 validate_mapping - 169716 + 257044 diff --git a/html/lcov/export/mptcp/subflow.c.gcov.html b/html/lcov/export/mptcp/subflow.c.gcov.html index caac4cc9..3a0393fa 100644 --- a/html/lcov/export/mptcp/subflow.c.gcov.html +++ b/html/lcov/export/mptcp/subflow.c.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 95.5 % @@ -395,24 +395,24 @@ 312 [ + - ]: 16 : return sk_rst_convert_mptcp_reason(mpext->reset_reason); 313 : : } 314 : : - 315 : 1483 : static struct dst_entry *subflow_v4_route_req(const struct sock *sk, + 315 : 1484 : static struct dst_entry *subflow_v4_route_req(const struct sock *sk, 316 : : struct sk_buff *skb, 317 : : struct flowi *fl, 318 : : struct request_sock *req, 319 : : u32 tw_isn) 320 : : { - 321 : 1483 : struct dst_entry *dst; - 322 : 1483 : int err; + 321 : 1484 : struct dst_entry *dst; + 322 : 1484 : int err; 323 : : - 324 : 1483 : tcp_rsk(req)->is_mptcp = 1; - 325 : 1483 : subflow_init_req(req, sk); + 324 : 1484 : tcp_rsk(req)->is_mptcp = 1; + 325 : 1484 : subflow_init_req(req, sk); 326 : : - 327 : 1483 : dst = tcp_request_sock_ipv4_ops.route_req(sk, skb, fl, req, tw_isn); - 328 [ - + ]: 1483 : if (!dst) + 327 : 1484 : dst = tcp_request_sock_ipv4_ops.route_req(sk, skb, fl, req, tw_isn); + 328 [ - + ]: 1484 : if (!dst) 329 : : return NULL; 330 : : - 331 : 1483 : err = subflow_check_req(req, sk, skb); - 332 [ + + ]: 1483 : if (err == 0) + 331 : 1484 : err = subflow_check_req(req, sk, skb); + 332 [ + + ]: 1484 : if (err == 0) 333 : : return dst; 334 : : 335 : 8 : dst_release(dst); @@ -422,66 +422,66 @@ 339 : : return NULL; 340 : : } 341 : : - 342 : 1779 : static void subflow_prep_synack(const struct sock *sk, struct request_sock *req, + 342 : 1787 : static void subflow_prep_synack(const struct sock *sk, struct request_sock *req, 343 : : struct tcp_fastopen_cookie *foc, 344 : : enum tcp_synack_type synack_type) 345 : : { - 346 [ + + ]: 1779 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); - 347 : 1779 : struct inet_request_sock *ireq = inet_rsk(req); + 346 [ + + ]: 1787 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); + 347 : 1787 : struct inet_request_sock *ireq = inet_rsk(req); 348 : : 349 : : /* clear tstamp_ok, as needed depending on cookie */ - 350 [ + + + + ]: 1779 : if (foc && foc->len > -1) + 350 [ + + + + ]: 1787 : if (foc && foc->len > -1) 351 : 20 : ireq->tstamp_ok = 0; 352 : : - 353 [ + + ]: 1779 : if (synack_type == TCP_SYNACK_FASTOPEN) + 353 [ + + ]: 1787 : if (synack_type == TCP_SYNACK_FASTOPEN) 354 : 38 : mptcp_fastopen_subflow_synack_set_params(subflow, req); - 355 : 1779 : } + 355 : 1787 : } 356 : : - 357 : 1475 : static int subflow_v4_send_synack(const struct sock *sk, struct dst_entry *dst, + 357 : 1476 : static int subflow_v4_send_synack(const struct sock *sk, struct dst_entry *dst, 358 : : struct flowi *fl, 359 : : struct request_sock *req, 360 : : struct tcp_fastopen_cookie *foc, 361 : : enum tcp_synack_type synack_type, 362 : : struct sk_buff *syn_skb) 363 : : { - 364 : 1475 : subflow_prep_synack(sk, req, foc, synack_type); + 364 : 1476 : subflow_prep_synack(sk, req, foc, synack_type); 365 : : - 366 : 1475 : return tcp_request_sock_ipv4_ops.send_synack(sk, dst, fl, req, foc, + 366 : 1476 : return tcp_request_sock_ipv4_ops.send_synack(sk, dst, fl, req, foc, 367 : : synack_type, syn_skb); 368 : : } 369 : : 370 : : #if IS_ENABLED(CONFIG_MPTCP_IPV6) - 371 : 304 : static int subflow_v6_send_synack(const struct sock *sk, struct dst_entry *dst, + 371 : 311 : static int subflow_v6_send_synack(const struct sock *sk, struct dst_entry *dst, 372 : : struct flowi *fl, 373 : : struct request_sock *req, 374 : : struct tcp_fastopen_cookie *foc, 375 : : enum tcp_synack_type synack_type, 376 : : struct sk_buff *syn_skb) 377 : : { - 378 : 304 : subflow_prep_synack(sk, req, foc, synack_type); + 378 : 311 : subflow_prep_synack(sk, req, foc, synack_type); 379 : : - 380 : 304 : return tcp_request_sock_ipv6_ops.send_synack(sk, dst, fl, req, foc, + 380 : 311 : return tcp_request_sock_ipv6_ops.send_synack(sk, dst, fl, req, foc, 381 : : synack_type, syn_skb); 382 : : } 383 : : - 384 : 302 : static struct dst_entry *subflow_v6_route_req(const struct sock *sk, + 384 : 301 : static struct dst_entry *subflow_v6_route_req(const struct sock *sk, 385 : : struct sk_buff *skb, 386 : : struct flowi *fl, 387 : : struct request_sock *req, 388 : : u32 tw_isn) 389 : : { - 390 : 302 : struct dst_entry *dst; - 391 : 302 : int err; + 390 : 301 : struct dst_entry *dst; + 391 : 301 : int err; 392 : : - 393 : 302 : tcp_rsk(req)->is_mptcp = 1; - 394 : 302 : subflow_init_req(req, sk); + 393 : 301 : tcp_rsk(req)->is_mptcp = 1; + 394 : 301 : subflow_init_req(req, sk); 395 : : - 396 : 302 : dst = tcp_request_sock_ipv6_ops.route_req(sk, skb, fl, req, tw_isn); - 397 [ - + ]: 302 : if (!dst) + 396 : 301 : dst = tcp_request_sock_ipv6_ops.route_req(sk, skb, fl, req, tw_isn); + 397 [ - + ]: 301 : if (!dst) 398 : : return NULL; 399 : : - 400 : 302 : err = subflow_check_req(req, sk, skb); - 401 [ + + ]: 302 : if (err == 0) + 400 : 301 : err = subflow_check_req(req, sk, skb); + 401 [ + + ]: 301 : if (err == 0) 402 : : return dst; 403 : : 404 : 2 : dst_release(dst); @@ -595,28 +595,28 @@ 512 : 1118 : subflow_set_remote_key(msk, subflow, mp_opt); 513 : : } 514 : : - 515 [ + + ]: 1202 : if (!sock_owned_by_user(sk)) { - 516 : 321 : __mptcp_sync_state(sk, ssk->sk_state); + 515 [ + + ]: 1202 : if (!sock_owned_by_user(sk)) { + 516 : 320 : __mptcp_sync_state(sk, ssk->sk_state); 517 : : } else { - 518 : 881 : msk->pending_state = ssk->sk_state; - 519 [ - + - - : 881 : __set_bit(MPTCP_SYNC_STATE, &msk->cb_flags); + 518 : 882 : msk->pending_state = ssk->sk_state; + 519 [ - + - - : 882 : __set_bit(MPTCP_SYNC_STATE, &msk->cb_flags); - - ] 520 : : } 521 : 1202 : mptcp_data_unlock(sk); 522 : 1202 : } 523 : : - 524 : 4757 : static void subflow_finish_connect(struct sock *sk, const struct sk_buff *skb) + 524 : 4795 : static void subflow_finish_connect(struct sock *sk, const struct sk_buff *skb) 525 : : { - 526 : 4757 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); - 527 : 4757 : struct mptcp_options_received mp_opt; - 528 : 4757 : struct sock *parent = subflow->conn; - 529 : 4757 : struct mptcp_sock *msk; + 526 : 4795 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); + 527 : 4795 : struct mptcp_options_received mp_opt; + 528 : 4795 : struct sock *parent = subflow->conn; + 529 : 4795 : struct mptcp_sock *msk; 530 : : - 531 : 4757 : subflow->icsk_af_ops->sk_rx_dst_set(sk, skb); + 531 : 4795 : subflow->icsk_af_ops->sk_rx_dst_set(sk, skb); 532 : : 533 : : /* be sure no special action on any packet other than syn-ack */ - 534 [ + + ]: 4757 : if (subflow->conn_finished) - 535 : 4757 : return; + 534 [ + + ]: 4795 : if (subflow->conn_finished) + 535 : 4795 : return; 536 : : 537 [ - + ]: 1689 : msk = mptcp_sk(parent); 538 : 1689 : subflow->rel_write_seq = 1; @@ -700,67 +700,67 @@ 616 : 0 : mptcp_subflow_reset(sk); 617 : : } 618 : : - 619 : 1148 : static void subflow_set_local_id(struct mptcp_subflow_context *subflow, int local_id) + 619 : 1146 : static void subflow_set_local_id(struct mptcp_subflow_context *subflow, int local_id) 620 : : { - 621 [ - + ]: 1082 : WARN_ON_ONCE(local_id < 0 || local_id > 255); - 622 : 2262 : WRITE_ONCE(subflow->local_id, local_id); - 623 : 2262 : } + 621 [ - + ]: 1080 : WARN_ON_ONCE(local_id < 0 || local_id > 255); + 622 : 2260 : WRITE_ONCE(subflow->local_id, local_id); + 623 : 2260 : } 624 : : - 625 : 7903 : static int subflow_chk_local_id(struct sock *sk) + 625 : 7220 : static int subflow_chk_local_id(struct sock *sk) 626 : : { - 627 [ - + ]: 7903 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); - 628 [ - + ]: 7903 : struct mptcp_sock *msk = mptcp_sk(subflow->conn); - 629 : 7903 : int err; + 627 [ - + ]: 7220 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); + 628 [ - + ]: 7220 : struct mptcp_sock *msk = mptcp_sk(subflow->conn); + 629 : 7220 : int err; 630 : : - 631 [ + + ]: 7903 : if (likely(subflow->local_id >= 0)) + 631 [ + + ]: 7220 : if (likely(subflow->local_id >= 0)) 632 : : return 0; 633 : : - 634 : 250 : err = mptcp_pm_get_local_id(msk, (struct sock_common *)sk); - 635 [ + - ]: 250 : if (err < 0) + 634 : 251 : err = mptcp_pm_get_local_id(msk, (struct sock_common *)sk); + 635 [ + - ]: 251 : if (err < 0) 636 : : return err; 637 : : - 638 : 250 : subflow_set_local_id(subflow, err); - 639 : 250 : subflow->request_bkup = mptcp_pm_is_backup(msk, (struct sock_common *)sk); + 638 : 251 : subflow_set_local_id(subflow, err); + 639 : 251 : subflow->request_bkup = mptcp_pm_is_backup(msk, (struct sock_common *)sk); 640 : : - 641 : 250 : return 0; + 641 : 251 : return 0; 642 : : } 643 : : - 644 : 5924 : static int subflow_rebuild_header(struct sock *sk) + 644 : 5695 : static int subflow_rebuild_header(struct sock *sk) 645 : : { - 646 : 5924 : int err = subflow_chk_local_id(sk); + 646 : 5695 : int err = subflow_chk_local_id(sk); 647 : : - 648 [ + - ]: 5924 : if (unlikely(err < 0)) + 648 [ + - ]: 5695 : if (unlikely(err < 0)) 649 : : return err; 650 : : - 651 : 5924 : return inet_sk_rebuild_header(sk); + 651 : 5695 : return inet_sk_rebuild_header(sk); 652 : : } 653 : : 654 : : #if IS_ENABLED(CONFIG_MPTCP_IPV6) - 655 : 1979 : static int subflow_v6_rebuild_header(struct sock *sk) + 655 : 1525 : static int subflow_v6_rebuild_header(struct sock *sk) 656 : : { - 657 : 1979 : int err = subflow_chk_local_id(sk); + 657 : 1525 : int err = subflow_chk_local_id(sk); 658 : : - 659 [ + - ]: 1979 : if (unlikely(err < 0)) + 659 [ + - ]: 1525 : if (unlikely(err < 0)) 660 : : return err; 661 : : - 662 : 1979 : return inet6_sk_rebuild_header(sk); + 662 : 1525 : return inet6_sk_rebuild_header(sk); 663 : : } 664 : : #endif 665 : : 666 : : static struct request_sock_ops mptcp_subflow_v4_request_sock_ops __ro_after_init; 667 : : static struct tcp_request_sock_ops subflow_request_sock_ipv4_ops __ro_after_init; 668 : : - 669 : 1483 : static int subflow_v4_conn_request(struct sock *sk, struct sk_buff *skb) + 669 : 1484 : static int subflow_v4_conn_request(struct sock *sk, struct sk_buff *skb) 670 : : { - 671 [ - + ]: 1483 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); + 671 [ - + ]: 1484 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); 672 : : - 673 [ - + ]: 1483 : pr_debug("subflow=%p\n", subflow); + 673 [ - + ]: 1484 : pr_debug("subflow=%p\n", subflow); 674 : : 675 : : /* Never answer to SYNs sent to broadcast or multicast */ - 676 [ - + ]: 1483 : if (skb_rtable(skb)->rt_flags & (RTCF_BROADCAST | RTCF_MULTICAST)) + 676 [ - + ]: 1484 : if (skb_rtable(skb)->rt_flags & (RTCF_BROADCAST | RTCF_MULTICAST)) 677 : 0 : goto drop; 678 : : - 679 : 1483 : return tcp_conn_request(&mptcp_subflow_v4_request_sock_ops, + 679 : 1484 : return tcp_conn_request(&mptcp_subflow_v4_request_sock_ops, 680 : : &subflow_request_sock_ipv4_ops, 681 : : sk, skb); 682 : 0 : drop: @@ -768,11 +768,11 @@ 684 : 0 : return 0; 685 : : } 686 : : - 687 : 1523 : static void subflow_v4_req_destructor(struct request_sock *req) + 687 : 1524 : static void subflow_v4_req_destructor(struct request_sock *req) 688 : : { - 689 : 1523 : subflow_req_destructor(req); - 690 : 1523 : tcp_request_sock_ops.destructor(req); - 691 : 1523 : } + 689 : 1524 : subflow_req_destructor(req); + 690 : 1524 : tcp_request_sock_ops.destructor(req); + 691 : 1524 : } 692 : : 693 : : #if IS_ENABLED(CONFIG_MPTCP_IPV6) 694 : : static struct request_sock_ops mptcp_subflow_v6_request_sock_ops __ro_after_init; @@ -781,24 +781,24 @@ 697 : : static struct inet_connection_sock_af_ops subflow_v6m_specific __ro_after_init; 698 : : static struct proto tcpv6_prot_override __ro_after_init; 699 : : - 700 : 939 : static int subflow_v6_conn_request(struct sock *sk, struct sk_buff *skb) + 700 : 938 : static int subflow_v6_conn_request(struct sock *sk, struct sk_buff *skb) 701 : : { - 702 [ - + ]: 939 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); + 702 [ - + ]: 938 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); 703 : : - 704 [ - + ]: 939 : pr_debug("subflow=%p\n", subflow); + 704 [ - + ]: 938 : pr_debug("subflow=%p\n", subflow); 705 : : - 706 [ + + ]: 939 : if (skb->protocol == htons(ETH_P_IP)) + 706 [ + + ]: 938 : if (skb->protocol == htons(ETH_P_IP)) 707 : 637 : return subflow_v4_conn_request(sk, skb); 708 : : - 709 [ - + ]: 302 : if (!ipv6_unicast_destination(skb)) + 709 [ - + ]: 301 : if (!ipv6_unicast_destination(skb)) 710 : 0 : goto drop; 711 : : - 712 [ - + ]: 302 : if (ipv6_addr_v4mapped(&ipv6_hdr(skb)->saddr)) { + 712 [ - + ]: 301 : if (ipv6_addr_v4mapped(&ipv6_hdr(skb)->saddr)) { 713 : 0 : __IP6_INC_STATS(sock_net(sk), NULL, IPSTATS_MIB_INHDRERRORS); 714 : 0 : return 0; 715 : : } 716 : : - 717 : 302 : return tcp_conn_request(&mptcp_subflow_v6_request_sock_ops, + 717 : 301 : return tcp_conn_request(&mptcp_subflow_v6_request_sock_ops, 718 : : &subflow_request_sock_ipv6_ops, sk, skb); 719 : : 720 : 0 : drop: @@ -806,11 +806,11 @@ 722 : 0 : return 0; /* don't send reset */ 723 : : } 724 : : - 725 : 310 : static void subflow_v6_req_destructor(struct request_sock *req) + 725 : 309 : static void subflow_v6_req_destructor(struct request_sock *req) 726 : : { - 727 : 310 : subflow_req_destructor(req); - 728 : 310 : tcp6_request_sock_ops.destructor(req); - 729 : 310 : } + 727 : 309 : subflow_req_destructor(req); + 728 : 309 : tcp6_request_sock_ops.destructor(req); + 729 : 309 : } 730 : : #endif 731 : : 732 : 48 : struct request_sock *mptcp_subflow_reqsk_alloc(const struct request_sock_ops *ops, @@ -1085,19 +1085,19 @@ 996 : 0 : mptcp_subflow_get_map_offset(subflow); 997 : : } 998 : : - 999 : 169716 : static bool validate_mapping(struct sock *ssk, struct sk_buff *skb) + 999 : 257044 : static bool validate_mapping(struct sock *ssk, struct sk_buff *skb) 1000 : : { - 1001 [ - + ]: 169716 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); - 1002 [ - + ]: 169716 : u32 ssn = tcp_sk(ssk)->copied_seq - subflow->ssn_offset; + 1001 [ - + ]: 257044 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); + 1002 [ - + ]: 257044 : u32 ssn = tcp_sk(ssk)->copied_seq - subflow->ssn_offset; 1003 : : - 1004 [ - + ]: 169716 : if (unlikely(before(ssn, subflow->map_subflow_seq))) { + 1004 [ - + ]: 257044 : if (unlikely(before(ssn, subflow->map_subflow_seq))) { 1005 : : /* Mapping covers data later in the subflow stream, 1006 : : * currently unsupported. 1007 : : */ 1008 : 0 : dbg_bad_map(subflow, ssn); 1009 : 0 : return false; 1010 : : } - 1011 [ - + ]: 169716 : if (unlikely(!before(ssn, subflow->map_subflow_seq + + 1011 [ - + ]: 257044 : if (unlikely(!before(ssn, subflow->map_subflow_seq + 1012 : : subflow->map_data_len))) { 1013 : : /* Mapping does covers past subflow data, invalid */ 1014 : 0 : dbg_bad_map(subflow, ssn); @@ -1106,19 +1106,19 @@ 1017 : : return true; 1018 : : } 1019 : : - 1020 : 484473 : static enum mapping_status validate_data_csum(struct sock *ssk, struct sk_buff *skb, + 1020 : 696986 : static enum mapping_status validate_data_csum(struct sock *ssk, struct sk_buff *skb, 1021 : : bool csum_reqd) 1022 : : { - 1023 [ + + ]: 484473 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); - 1024 : 484473 : u32 offset, seq, delta; - 1025 : 484473 : __sum16 csum; - 1026 : 484473 : int len; + 1023 [ + + ]: 696986 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); + 1024 : 696986 : u32 offset, seq, delta; + 1025 : 696986 : __sum16 csum; + 1026 : 696986 : int len; 1027 : : - 1028 [ + + ]: 484473 : if (!csum_reqd) + 1028 [ + + ]: 696986 : if (!csum_reqd) 1029 : : return MAPPING_OK; 1030 : : 1031 : : /* mapping already validated on previous traversal */ - 1032 [ + + ]: 1619 : if (subflow->map_csum_len == subflow->map_data_len) + 1032 [ + + ]: 1613 : if (subflow->map_csum_len == subflow->map_data_len) 1033 : : return MAPPING_OK; 1034 : : 1035 : : /* traverse the receive queue, ensuring it contains a full @@ -1126,39 +1126,39 @@ 1037 : : * Preserve the accoumlate csum across multiple calls, to compute 1038 : : * the csum only once 1039 : : */ - 1040 : 1609 : delta = subflow->map_data_len - subflow->map_csum_len; - 1041 : 10293 : for (;;) { - 1042 [ - + ]: 10293 : seq = tcp_sk(ssk)->copied_seq + subflow->map_csum_len; - 1043 : 10293 : offset = seq - TCP_SKB_CB(skb)->seq; + 1040 : 1603 : delta = subflow->map_data_len - subflow->map_csum_len; + 1041 : 10206 : for (;;) { + 1042 [ - + ]: 10206 : seq = tcp_sk(ssk)->copied_seq + subflow->map_csum_len; + 1043 : 10206 : offset = seq - TCP_SKB_CB(skb)->seq; 1044 : : 1045 : : /* if the current skb has not been accounted yet, csum its contents 1046 : : * up to the amount covered by the current DSS 1047 : : */ - 1048 [ + + ]: 10293 : if (offset < skb->len) { - 1049 : 1609 : __wsum csum; + 1048 [ + + ]: 10206 : if (offset < skb->len) { + 1049 : 1605 : __wsum csum; 1050 : : - 1051 : 1609 : len = min(skb->len - offset, delta); - 1052 : 1609 : csum = skb_checksum(skb, offset, len, 0); - 1053 : 3218 : subflow->map_data_csum = csum_block_add(subflow->map_data_csum, csum, - 1054 [ - + ]: 1609 : subflow->map_csum_len); + 1051 : 1605 : len = min(skb->len - offset, delta); + 1052 : 1605 : csum = skb_checksum(skb, offset, len, 0); + 1053 : 3210 : subflow->map_data_csum = csum_block_add(subflow->map_data_csum, csum, + 1054 [ - + ]: 1605 : subflow->map_csum_len); 1055 : : - 1056 : 1609 : delta -= len; - 1057 : 1609 : subflow->map_csum_len += len; + 1056 : 1605 : delta -= len; + 1057 : 1605 : subflow->map_csum_len += len; 1058 : : } - 1059 [ + + ]: 10293 : if (delta == 0) + 1059 [ + + ]: 10206 : if (delta == 0) 1060 : : break; 1061 : : - 1062 [ + + ]: 10157 : if (skb_queue_is_last(&ssk->sk_receive_queue, skb)) { + 1062 [ + + ]: 10069 : if (skb_queue_is_last(&ssk->sk_receive_queue, skb)) { 1063 : : /* if this subflow is closed, the partial mapping 1064 : : * will be never completed; flush the pending skbs, so 1065 : : * that subflow_sched_work_if_closed() can kick in 1066 : : */ - 1067 [ - + ]: 1473 : if (unlikely(ssk->sk_state == TCP_CLOSE)) + 1067 [ - + ]: 1466 : if (unlikely(ssk->sk_state == TCP_CLOSE)) 1068 [ # # # # ]: 0 : while ((skb = skb_peek(&ssk->sk_receive_queue))) 1069 : 0 : sk_eat_skb(ssk, skb); 1070 : : 1071 : : /* not enough data to validate the csum */ - 1072 : 1473 : return MAPPING_EMPTY; + 1072 : 1466 : return MAPPING_EMPTY; 1073 : : } 1074 : : 1075 : : /* the DSS mapping for next skbs will be validated later, @@ -1172,73 +1172,73 @@ 1083 : : * while the pseudo header requires the original DSS data len, 1084 : : * including that 1085 : : */ - 1086 : 136 : csum = __mptcp_make_csum(subflow->map_seq, + 1086 : 137 : csum = __mptcp_make_csum(subflow->map_seq, 1087 : : subflow->map_subflow_seq, - 1088 : 136 : subflow->map_data_len + subflow->map_data_fin, + 1088 : 137 : subflow->map_data_len + subflow->map_data_fin, 1089 : : subflow->map_data_csum); - 1090 [ + + ]: 136 : if (unlikely(csum)) { + 1090 [ + + ]: 137 : if (unlikely(csum)) { 1091 [ + - ]: 4 : MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_DATACSUMERR); 1092 : 4 : return MAPPING_BAD_CSUM; 1093 : : } 1094 : : - 1095 : 132 : subflow->valid_csum_seen = 1; - 1096 : 132 : return MAPPING_OK; + 1095 : 133 : subflow->valid_csum_seen = 1; + 1096 : 133 : return MAPPING_OK; 1097 : : } 1098 : : - 1099 : 979047 : static enum mapping_status get_mapping_status(struct sock *ssk, + 1099 : 1408198 : static enum mapping_status get_mapping_status(struct sock *ssk, 1100 : : struct mptcp_sock *msk) 1101 : : { - 1102 [ + + ]: 979047 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); - 1103 [ - + ]: 979047 : bool csum_reqd = READ_ONCE(msk->csum_enabled); - 1104 : 979047 : struct mptcp_ext *mpext; - 1105 : 979047 : struct sk_buff *skb; - 1106 : 979047 : u16 data_len; - 1107 : 979047 : u64 map_seq; + 1102 [ + + ]: 1408198 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); + 1103 [ - + ]: 1408198 : bool csum_reqd = READ_ONCE(msk->csum_enabled); + 1104 : 1408198 : struct mptcp_ext *mpext; + 1105 : 1408198 : struct sk_buff *skb; + 1106 : 1408198 : u16 data_len; + 1107 : 1408198 : u64 map_seq; 1108 : : - 1109 [ + + ]: 979119 : skb = skb_peek(&ssk->sk_receive_queue); - 1110 [ - + ]: 489161 : if (!skb) + 1109 [ + + ]: 1408270 : skb = skb_peek(&ssk->sk_receive_queue); + 1110 [ - + ]: 704357 : if (!skb) 1111 : : return MAPPING_EMPTY; 1112 : : - 1113 [ + + ]: 489161 : if (mptcp_check_fallback(ssk)) + 1113 [ + + ]: 704357 : if (mptcp_check_fallback(ssk)) 1114 : : return MAPPING_DUMMY; 1115 : : - 1116 [ + + ]: 485401 : mpext = mptcp_get_ext(skb); - 1117 [ + + + + ]: 484589 : if (!mpext || !mpext->use_map) { - 1118 [ + + + + ]: 2565 : if (!subflow->map_valid && !skb->len) { + 1116 [ + + ]: 697941 : mpext = mptcp_get_ext(skb); + 1117 [ + + + + ]: 697132 : if (!mpext || !mpext->use_map) { + 1118 [ + + + + ]: 2666 : if (!subflow->map_valid && !skb->len) { 1119 : : /* the TCP stack deliver 0 len FIN pkt to the receive 1120 : : * queue, that is the only 0len pkts ever expected here, 1121 : : * and we can admit no mapping only for 0 len pkts 1122 : : */ - 1123 [ - + ]: 908 : if (!(TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN)) + 1123 [ - + ]: 935 : if (!(TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN)) 1124 [ # # # # ]: 0 : WARN_ONCE(1, "0len seq %d:%d flags %x", 1125 : : TCP_SKB_CB(skb)->seq, 1126 : : TCP_SKB_CB(skb)->end_seq, 1127 : : TCP_SKB_CB(skb)->tcp_flags); - 1128 : 908 : sk_eat_skb(ssk, skb); - 1129 : 908 : return MAPPING_EMPTY; + 1128 : 935 : sk_eat_skb(ssk, skb); + 1129 : 935 : return MAPPING_EMPTY; 1130 : : } 1131 : : 1132 : : /* If the required DSS has likely been dropped by a middlebox */ - 1133 [ + + ]: 1657 : if (!subflow->map_valid) + 1133 [ + + ]: 1731 : if (!subflow->map_valid) 1134 : : return MAPPING_NODSS; 1135 : : - 1136 : 1651 : goto validate_seq; + 1136 : 1725 : goto validate_seq; 1137 : : } 1138 : : - 1139 : 482836 : trace_get_mapping_status(mpext); + 1139 : 695275 : trace_get_mapping_status(mpext); 1140 : : - 1141 : 482836 : data_len = mpext->data_len; - 1142 [ + + ]: 482836 : if (data_len == 0) { + 1141 : 695275 : data_len = mpext->data_len; + 1142 [ + + ]: 695275 : if (data_len == 0) { 1143 [ - + ]: 2 : pr_debug("infinite mapping received\n"); 1144 [ + - ]: 2 : MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_INFINITEMAPRX); 1145 : 2 : subflow->map_data_len = 0; 1146 : 2 : return MAPPING_INVALID; 1147 : : } 1148 : : - 1149 [ + + ]: 482834 : if (mpext->data_fin == 1) { - 1150 : 1408 : u64 data_fin_seq; + 1149 [ + + ]: 695273 : if (mpext->data_fin == 1) { + 1150 : 1068 : u64 data_fin_seq; 1151 : : - 1152 [ + + ]: 1408 : if (data_len == 1) { + 1152 [ + + ]: 1068 : if (data_len == 1) { 1153 : 12 : bool updated = mptcp_update_rcv_data_fin(msk, mpext->data_seq, 1154 : 12 : mpext->dsn64); 1155 [ - + ]: 12 : pr_debug("DATA_FIN with no payload seq=%llu\n", mpext->data_seq); @@ -1258,33 +1258,33 @@ 1169 : 12 : return MAPPING_DATA_FIN; 1170 : : } 1171 : : - 1172 : 1396 : data_fin_seq = mpext->data_seq + data_len - 1; + 1172 : 1056 : data_fin_seq = mpext->data_seq + data_len - 1; 1173 : : 1174 : : /* If mpext->data_seq is a 32-bit value, data_fin_seq must also 1175 : : * be limited to 32 bits. 1176 : : */ - 1177 [ - + ]: 1396 : if (!mpext->dsn64) + 1177 [ - + ]: 1056 : if (!mpext->dsn64) 1178 : 0 : data_fin_seq &= GENMASK_ULL(31, 0); 1179 : : - 1180 : 1396 : mptcp_update_rcv_data_fin(msk, data_fin_seq, mpext->dsn64); - 1181 [ - + ]: 1396 : pr_debug("DATA_FIN with mapping seq=%llu dsn64=%d\n", + 1180 : 1056 : mptcp_update_rcv_data_fin(msk, data_fin_seq, mpext->dsn64); + 1181 [ - + ]: 1056 : pr_debug("DATA_FIN with mapping seq=%llu dsn64=%d\n", 1182 : : data_fin_seq, mpext->dsn64); 1183 : : 1184 : : /* Adjust for DATA_FIN using 1 byte of sequence space */ - 1185 : 1396 : data_len--; + 1185 : 1056 : data_len--; 1186 : : } 1187 : : - 1188 [ + + ]: 482822 : map_seq = mptcp_expand_seq(READ_ONCE(msk->ack_seq), mpext->data_seq, mpext->dsn64); - 1189 [ - + ]: 482822 : WRITE_ONCE(mptcp_sk(subflow->conn)->use_64bit_ack, !!mpext->dsn64); + 1188 [ + + ]: 695261 : map_seq = mptcp_expand_seq(READ_ONCE(msk->ack_seq), mpext->data_seq, mpext->dsn64); + 1189 [ - + ]: 695261 : WRITE_ONCE(mptcp_sk(subflow->conn)->use_64bit_ack, !!mpext->dsn64); 1190 : : - 1191 [ + + ]: 482822 : if (subflow->map_valid) { + 1191 [ + + ]: 695261 : if (subflow->map_valid) { 1192 : : /* Allow replacing only with an identical map */ - 1193 [ + - ]: 314757 : if (subflow->map_seq == map_seq && - 1194 [ + - ]: 314757 : subflow->map_subflow_seq == mpext->subflow_seq && - 1195 [ + - ]: 314757 : subflow->map_data_len == data_len && - 1196 [ + - ]: 314757 : subflow->map_csum_reqd == mpext->csum_reqd) { - 1197 : 314757 : skb_ext_del(skb, SKB_EXT_MPTCP); - 1198 : 314757 : goto validate_csum; + 1193 [ + - ]: 439942 : if (subflow->map_seq == map_seq && + 1194 [ + - ]: 439942 : subflow->map_subflow_seq == mpext->subflow_seq && + 1195 [ + - ]: 439942 : subflow->map_data_len == data_len && + 1196 [ + - ]: 439942 : subflow->map_csum_reqd == mpext->csum_reqd) { + 1197 : 439942 : skb_ext_del(skb, SKB_EXT_MPTCP); + 1198 : 439942 : goto validate_csum; 1199 : : } 1200 : : 1201 : : /* If this skb data are fully covered by the current mapping, @@ -1299,81 +1299,81 @@ 1210 : 0 : goto validate_csum; 1211 : : } 1212 : : - 1213 : 168065 : subflow->map_seq = map_seq; - 1214 : 168065 : subflow->map_subflow_seq = mpext->subflow_seq; - 1215 : 168065 : subflow->map_data_len = data_len; - 1216 : 168065 : subflow->map_valid = 1; - 1217 : 168065 : subflow->map_data_fin = mpext->data_fin; - 1218 : 168065 : subflow->mpc_map = mpext->mpc_map; - 1219 : 168065 : subflow->map_csum_reqd = mpext->csum_reqd; - 1220 : 168065 : subflow->map_csum_len = 0; - 1221 [ - + ]: 168065 : subflow->map_data_csum = csum_unfold(mpext->csum); + 1213 : 255319 : subflow->map_seq = map_seq; + 1214 : 255319 : subflow->map_subflow_seq = mpext->subflow_seq; + 1215 : 255319 : subflow->map_data_len = data_len; + 1216 : 255319 : subflow->map_valid = 1; + 1217 : 255319 : subflow->map_data_fin = mpext->data_fin; + 1218 : 255319 : subflow->mpc_map = mpext->mpc_map; + 1219 : 255319 : subflow->map_csum_reqd = mpext->csum_reqd; + 1220 : 255319 : subflow->map_csum_len = 0; + 1221 [ - + ]: 255319 : subflow->map_data_csum = csum_unfold(mpext->csum); 1222 : : 1223 : : /* Cfr RFC 8684 Section 3.3.0 */ - 1224 [ - + ]: 168065 : if (unlikely(subflow->map_csum_reqd != csum_reqd)) + 1224 [ - + ]: 255319 : if (unlikely(subflow->map_csum_reqd != csum_reqd)) 1225 : : return MAPPING_INVALID; 1226 : : - 1227 [ - + ]: 168065 : pr_debug("new map seq=%llu subflow_seq=%u data_len=%u csum=%d:%u\n", + 1227 [ - + ]: 255319 : pr_debug("new map seq=%llu subflow_seq=%u data_len=%u csum=%d:%u\n", 1228 : : subflow->map_seq, subflow->map_subflow_seq, 1229 : : subflow->map_data_len, subflow->map_csum_reqd, 1230 : : subflow->map_data_csum); 1231 : : - 1232 : 169716 : validate_seq: + 1232 : 257044 : validate_seq: 1233 : : /* we revalidate valid mapping on new skb, because we must ensure 1234 : : * the current skb is completely covered by the available mapping 1235 : : */ - 1236 [ - + ]: 169716 : if (!validate_mapping(ssk, skb)) { + 1236 [ - + ]: 257044 : if (!validate_mapping(ssk, skb)) { 1237 [ # # ]: 0 : MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_DSSTCPMISMATCH); 1238 : 0 : return MAPPING_INVALID; 1239 : : } 1240 : : - 1241 : 169716 : skb_ext_del(skb, SKB_EXT_MPTCP); + 1241 : 257044 : skb_ext_del(skb, SKB_EXT_MPTCP); 1242 : : - 1243 : 484473 : validate_csum: - 1244 : 484473 : return validate_data_csum(ssk, skb, csum_reqd); + 1243 : 696986 : validate_csum: + 1244 : 696986 : return validate_data_csum(ssk, skb, csum_reqd); 1245 : : } 1246 : : - 1247 : 4796 : static void mptcp_subflow_discard_data(struct sock *ssk, struct sk_buff *skb, + 1247 : 5470 : static void mptcp_subflow_discard_data(struct sock *ssk, struct sk_buff *skb, 1248 : : u64 limit) 1249 : : { - 1250 [ - + ]: 4796 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); - 1251 : 4796 : bool fin = TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN; - 1252 [ - + ]: 4796 : struct tcp_sock *tp = tcp_sk(ssk); - 1253 : 4796 : u32 offset, incr, avail_len; + 1250 [ - + ]: 5470 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); + 1251 : 5470 : bool fin = TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN; + 1252 [ - + ]: 5470 : struct tcp_sock *tp = tcp_sk(ssk); + 1253 : 5470 : u32 offset, incr, avail_len; 1254 : : - 1255 : 4796 : offset = tp->copied_seq - TCP_SKB_CB(skb)->seq; - 1256 [ - + - + ]: 4796 : if (WARN_ON_ONCE(offset > skb->len)) + 1255 : 5470 : offset = tp->copied_seq - TCP_SKB_CB(skb)->seq; + 1256 [ - + - + ]: 5470 : if (WARN_ON_ONCE(offset > skb->len)) 1257 : 0 : goto out; 1258 : : - 1259 : 4796 : avail_len = skb->len - offset; - 1260 [ + + ]: 4796 : incr = limit >= avail_len ? avail_len + fin : limit; + 1259 : 5470 : avail_len = skb->len - offset; + 1260 [ + + ]: 5470 : incr = limit >= avail_len ? avail_len + fin : limit; 1261 : : - 1262 [ - + ]: 4796 : pr_debug("discarding=%d len=%d offset=%d seq=%d\n", incr, skb->len, + 1262 [ - + ]: 5470 : pr_debug("discarding=%d len=%d offset=%d seq=%d\n", incr, skb->len, 1263 : : offset, subflow->map_subflow_seq); - 1264 [ + - ]: 4796 : MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_DUPDATA); - 1265 [ - + ]: 4796 : tcp_sk(ssk)->copied_seq += incr; + 1264 [ + - ]: 5470 : MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_DUPDATA); + 1265 [ - + ]: 5470 : tcp_sk(ssk)->copied_seq += incr; 1266 : : - 1267 : 4796 : out: - 1268 [ - + + + ]: 4796 : if (!before(tcp_sk(ssk)->copied_seq, TCP_SKB_CB(skb)->end_seq)) - 1269 : 4618 : sk_eat_skb(ssk, skb); - 1270 [ + + ]: 4796 : if (mptcp_subflow_get_map_offset(subflow) >= subflow->map_data_len) - 1271 : 3461 : subflow->map_valid = 0; - 1272 : 4796 : } + 1267 : 5470 : out: + 1268 [ - + + + ]: 5470 : if (!before(tcp_sk(ssk)->copied_seq, TCP_SKB_CB(skb)->end_seq)) + 1269 : 5211 : sk_eat_skb(ssk, skb); + 1270 [ + + ]: 5470 : if (mptcp_subflow_get_map_offset(subflow) >= subflow->map_data_len) + 1271 : 3847 : subflow->map_valid = 0; + 1272 : 5470 : } 1273 : : 1274 : : /* sched mptcp worker to remove the subflow if no more data is pending */ - 1275 : 497232 : static void subflow_sched_work_if_closed(struct mptcp_sock *msk, struct sock *ssk) + 1275 : 711223 : static void subflow_sched_work_if_closed(struct mptcp_sock *msk, struct sock *ssk) 1276 : : { - 1277 : 497232 : struct sock *sk = (struct sock *)msk; + 1277 : 711223 : struct sock *sk = (struct sock *)msk; 1278 : : - 1279 [ + + + + : 499968 : if (likely(ssk->sk_state != TCP_CLOSE && - + + ] + 1279 [ + + + + : 714049 : if (likely(ssk->sk_state != TCP_CLOSE && + + + ] 1280 : : (ssk->sk_state != TCP_CLOSE_WAIT || 1281 : : inet_sk_state_load(sk) != TCP_ESTABLISHED))) - 1282 : 495497 : return; + 1282 : 709503 : return; 1283 : : - 1284 [ + + + + ]: 3362 : if (skb_queue_empty(&ssk->sk_receive_queue) && - 1285 [ + + ]: 1761 : !test_and_set_bit(MPTCP_WORK_CLOSE_SUBFLOW, &msk->flags)) - 1286 : 638 : mptcp_schedule_work(sk); + 1284 [ + + + + ]: 3332 : if (skb_queue_empty(&ssk->sk_receive_queue) && + 1285 [ + + ]: 1750 : !test_and_set_bit(MPTCP_WORK_CLOSE_SUBFLOW, &msk->flags)) + 1286 : 635 : mptcp_schedule_work(sk); 1287 : : } 1288 : : 1289 : 8 : static bool subflow_can_fallback(struct mptcp_subflow_context *subflow) @@ -1415,59 +1415,59 @@ 1325 : 2 : mptcp_reset_tout_timer(msk, subflow->fail_tout); 1326 : : } 1327 : : - 1328 : 977618 : static bool subflow_check_data_avail(struct sock *ssk) + 1328 : 1406138 : static bool subflow_check_data_avail(struct sock *ssk) 1329 : : { - 1330 [ + + ]: 977618 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); - 1331 : 977618 : enum mapping_status status; - 1332 : 977618 : struct mptcp_sock *msk; - 1333 : 977618 : struct sk_buff *skb; + 1330 [ + + ]: 1406138 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); + 1331 : 1406138 : enum mapping_status status; + 1332 : 1406138 : struct mptcp_sock *msk; + 1333 : 1406138 : struct sk_buff *skb; 1334 : : - 1335 [ + + - + ]: 977618 : if (!skb_peek(&ssk->sk_receive_queue)) - 1336 : 485295 : WRITE_ONCE(subflow->data_avail, false); - 1337 [ + + + + ]: 977618 : if (subflow->data_avail) + 1335 [ + + - + ]: 1406138 : if (!skb_peek(&ssk->sk_receive_queue)) + 1336 : 698660 : WRITE_ONCE(subflow->data_avail, false); + 1337 [ + + + + ]: 1406138 : if (subflow->data_avail) 1338 : : return true; 1339 : : - 1340 [ - + ]: 974251 : msk = mptcp_sk(subflow->conn); - 1341 : 983843 : for (;;) { - 1342 : 979047 : u64 ack_seq; - 1343 : 979047 : u64 old_ack; + 1340 [ - + ]: 1402728 : msk = mptcp_sk(subflow->conn); + 1341 : 1413668 : for (;;) { + 1342 : 1408198 : u64 ack_seq; + 1343 : 1408198 : u64 old_ack; 1344 : : - 1345 : 979047 : status = get_mapping_status(ssk, msk); - 1346 [ + + ]: 1469841 : trace_subflow_check_data_avail(status, skb_peek(&ssk->sk_receive_queue)); - 1347 [ + + + + ]: 979047 : if (unlikely(status == MAPPING_INVALID || status == MAPPING_DUMMY || + 1345 : 1408198 : status = get_mapping_status(ssk, msk); + 1346 [ + + ]: 2112974 : trace_subflow_check_data_avail(status, skb_peek(&ssk->sk_receive_queue)); + 1347 [ + + + + ]: 1408198 : if (unlikely(status == MAPPING_INVALID || status == MAPPING_DUMMY || 1348 : : status == MAPPING_BAD_CSUM || status == MAPPING_NODSS)) - 1349 : 3772 : goto fallback; + 1349 : 6428 : goto fallback; 1350 : : - 1351 [ + + ]: 975275 : if (status != MAPPING_OK) - 1352 : 492279 : goto no_data; + 1351 [ + + ]: 1401770 : if (status != MAPPING_OK) + 1352 : 706254 : goto no_data; 1353 : : - 1354 [ + - ]: 482996 : skb = skb_peek(&ssk->sk_receive_queue); - 1355 [ - + ]: 482996 : if (WARN_ON_ONCE(!skb)) + 1354 [ + - ]: 695516 : skb = skb_peek(&ssk->sk_receive_queue); + 1355 [ - + ]: 695516 : if (WARN_ON_ONCE(!skb)) 1356 : 0 : goto no_data; 1357 : : - 1358 [ - + - + ]: 482996 : if (unlikely(!READ_ONCE(msk->can_ack))) + 1358 [ - + - + ]: 695516 : if (unlikely(!READ_ONCE(msk->can_ack))) 1359 : 0 : goto fallback; 1360 : : - 1361 : 482996 : old_ack = READ_ONCE(msk->ack_seq); - 1362 : 482996 : ack_seq = mptcp_subflow_get_mapped_dsn(subflow); - 1363 [ - + ]: 482996 : pr_debug("msk ack_seq=%llx subflow ack_seq=%llx\n", old_ack, + 1361 : 695516 : old_ack = READ_ONCE(msk->ack_seq); + 1362 : 695516 : ack_seq = mptcp_subflow_get_mapped_dsn(subflow); + 1363 [ - + ]: 695516 : pr_debug("msk ack_seq=%llx subflow ack_seq=%llx\n", old_ack, 1364 : : ack_seq); - 1365 [ + + ]: 482996 : if (unlikely(before64(ack_seq, old_ack))) { - 1366 : 4796 : mptcp_subflow_discard_data(ssk, skb, old_ack - ack_seq); - 1367 : 4796 : continue; + 1365 [ + + ]: 695516 : if (unlikely(before64(ack_seq, old_ack))) { + 1366 : 5470 : mptcp_subflow_discard_data(ssk, skb, old_ack - ack_seq); + 1367 : 5470 : continue; 1368 : : } 1369 : : - 1370 : 478200 : WRITE_ONCE(subflow->data_avail, true); - 1371 : 478200 : break; + 1370 : 690046 : WRITE_ONCE(subflow->data_avail, true); + 1371 : 690046 : break; 1372 : : } - 1373 : 478200 : return true; + 1373 : 690046 : return true; 1374 : : - 1375 : 492279 : no_data: - 1376 : 492279 : subflow_sched_work_if_closed(msk, ssk); - 1377 : 492279 : return false; + 1375 : 706254 : no_data: + 1376 : 706254 : subflow_sched_work_if_closed(msk, ssk); + 1377 : 706254 : return false; 1378 : : - 1379 : 3772 : fallback: - 1380 [ + + ]: 3772 : if (!__mptcp_check_fallback(msk)) { + 1379 : 6428 : fallback: + 1380 [ + + ]: 6428 : if (!__mptcp_check_fallback(msk)) { 1381 : : /* RFC 8684 section 3.7. */ 1382 [ + + ]: 12 : if (status == MAPPING_BAD_CSUM && 1383 [ + - ]: 4 : (subflow->mp_join || subflow->valid_csum_seen)) { @@ -1505,31 +1505,31 @@ 1415 : 8 : mptcp_do_fallback(ssk); 1416 : : } 1417 : : - 1418 [ - + ]: 3768 : skb = skb_peek(&ssk->sk_receive_queue); - 1419 : 3768 : subflow->map_valid = 1; - 1420 : 3768 : subflow->map_seq = READ_ONCE(msk->ack_seq); - 1421 : 3768 : subflow->map_data_len = skb->len; - 1422 [ - + ]: 3768 : subflow->map_subflow_seq = tcp_sk(ssk)->copied_seq - subflow->ssn_offset; - 1423 : 3768 : WRITE_ONCE(subflow->data_avail, true); - 1424 : 3768 : return true; + 1418 [ - + ]: 6424 : skb = skb_peek(&ssk->sk_receive_queue); + 1419 : 6424 : subflow->map_valid = 1; + 1420 : 6424 : subflow->map_seq = READ_ONCE(msk->ack_seq); + 1421 : 6424 : subflow->map_data_len = skb->len; + 1422 [ - + ]: 6424 : subflow->map_subflow_seq = tcp_sk(ssk)->copied_seq - subflow->ssn_offset; + 1423 : 6424 : WRITE_ONCE(subflow->data_avail, true); + 1424 : 6424 : return true; 1425 : : } 1426 : : - 1427 : 977618 : bool mptcp_subflow_data_available(struct sock *sk) + 1427 : 1406138 : bool mptcp_subflow_data_available(struct sock *sk) 1428 : : { - 1429 [ + + ]: 977618 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); + 1429 [ + + ]: 1406138 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); 1430 : : 1431 : : /* check if current mapping is still valid */ - 1432 [ + + ]: 977618 : if (subflow->map_valid && - 1433 [ + + ]: 801554 : mptcp_subflow_get_map_offset(subflow) >= subflow->map_data_len) { - 1434 : 168369 : subflow->map_valid = 0; - 1435 : 168369 : WRITE_ONCE(subflow->data_avail, false); + 1432 [ + + ]: 1406138 : if (subflow->map_valid && + 1433 [ + + ]: 1141272 : mptcp_subflow_get_map_offset(subflow) >= subflow->map_data_len) { + 1434 : 257894 : subflow->map_valid = 0; + 1435 : 257894 : WRITE_ONCE(subflow->data_avail, false); 1436 : : - 1437 [ - + ]: 168369 : pr_debug("Done with mapping: seq=%u data_len=%u\n", + 1437 [ - + ]: 257894 : pr_debug("Done with mapping: seq=%u data_len=%u\n", 1438 : : subflow->map_subflow_seq, 1439 : : subflow->map_data_len); 1440 : : } 1441 : : - 1442 : 977618 : return subflow_check_data_avail(sk); + 1442 : 1406138 : return subflow_check_data_avail(sk); 1443 : : } 1444 : : 1445 : : /* If ssk has an mptcp parent socket, use the mptcp rcvbuf occupancy, @@ -1541,45 +1541,45 @@ 1451 : : * as far as mptcp peer is concerned that data is still inflight. 1452 : : * DSS ACK is updated when skb is moved to the mptcp rx queue. 1453 : : */ - 1454 : 1057135 : void mptcp_space(const struct sock *ssk, int *space, int *full_space) + 1454 : 1452046 : void mptcp_space(const struct sock *ssk, int *space, int *full_space) 1455 : : { - 1456 : 1057135 : const struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); - 1457 : 1057135 : const struct sock *sk = subflow->conn; + 1456 : 1452046 : const struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); + 1457 : 1452046 : const struct sock *sk = subflow->conn; 1458 : : - 1459 : 1057135 : *space = __mptcp_space(sk); - 1460 : 1057135 : *full_space = mptcp_win_from_space(sk, READ_ONCE(sk->sk_rcvbuf)); - 1461 : 1057135 : } + 1459 : 1452046 : *space = __mptcp_space(sk); + 1460 : 1452046 : *full_space = mptcp_win_from_space(sk, READ_ONCE(sk->sk_rcvbuf)); + 1461 : 1452046 : } 1462 : : - 1463 : 1838 : static void subflow_error_report(struct sock *ssk) + 1463 : 1810 : static void subflow_error_report(struct sock *ssk) 1464 : : { - 1465 [ + + ]: 1838 : struct sock *sk = mptcp_subflow_ctx(ssk)->conn; + 1465 [ + + ]: 1810 : struct sock *sk = mptcp_subflow_ctx(ssk)->conn; 1466 : : 1467 : : /* bail early if this is a no-op, so that we avoid introducing a 1468 : : * problematic lockdep dependency between TCP accept queue lock 1469 : : * and msk socket spinlock 1470 : : */ - 1471 [ + + ]: 1838 : if (!sk->sk_socket) + 1471 [ + + ]: 1810 : if (!sk->sk_socket) 1472 : : return; 1473 : : - 1474 : 958 : mptcp_data_lock(sk); - 1475 [ + + ]: 958 : if (!sock_owned_by_user(sk)) - 1476 : 357 : __mptcp_error_report(sk); + 1474 : 966 : mptcp_data_lock(sk); + 1475 [ + + ]: 966 : if (!sock_owned_by_user(sk)) + 1476 : 376 : __mptcp_error_report(sk); 1477 : : else - 1478 [ - + ]: 601 : __set_bit(MPTCP_ERROR_REPORT, &mptcp_sk(sk)->cb_flags); - 1479 : 958 : mptcp_data_unlock(sk); + 1478 [ - + ]: 590 : __set_bit(MPTCP_ERROR_REPORT, &mptcp_sk(sk)->cb_flags); + 1479 : 966 : mptcp_data_unlock(sk); 1480 : : } 1481 : : - 1482 : 490461 : static void subflow_data_ready(struct sock *sk) + 1482 : 704465 : static void subflow_data_ready(struct sock *sk) 1483 : : { - 1484 : 490461 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); - 1485 [ - + ]: 490461 : u16 state = 1 << inet_sk_state_load(sk); - 1486 : 490461 : struct sock *parent = subflow->conn; - 1487 : 490461 : struct mptcp_sock *msk; + 1484 : 704465 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); + 1485 [ - + ]: 704465 : u16 state = 1 << inet_sk_state_load(sk); + 1486 : 704465 : struct sock *parent = subflow->conn; + 1487 : 704465 : struct mptcp_sock *msk; 1488 : : - 1489 : 490461 : trace_sk_data_ready(sk); + 1489 : 704465 : trace_sk_data_ready(sk); 1490 : : - 1491 [ - + ]: 490461 : msk = mptcp_sk(parent); - 1492 [ + + ]: 490461 : if (state & TCPF_LISTEN) { + 1491 [ - + ]: 704465 : msk = mptcp_sk(parent); + 1492 [ + + ]: 704465 : if (state & TCPF_LISTEN) { 1493 : : /* MPJ subflow are removed from accept queue before reaching here, 1494 : : * avoid stray wakeups 1495 : : */ @@ -1590,32 +1590,32 @@ 1500 : 1286 : return; 1501 : : } 1502 : : - 1503 [ + + - + : 488700 : WARN_ON_ONCE(!__mptcp_check_fallback(msk) && !subflow->mp_capable && + 1503 [ + + - + : 702704 : WARN_ON_ONCE(!__mptcp_check_fallback(msk) && !subflow->mp_capable && - - ] 1504 : : !subflow->mp_join && !(state & TCPF_CLOSE)); 1505 : : - 1506 [ + + ]: 488700 : if (mptcp_subflow_data_available(sk)) { - 1507 : 481661 : mptcp_data_ready(parent, sk); + 1506 [ + + ]: 702704 : if (mptcp_subflow_data_available(sk)) { + 1507 : 695057 : mptcp_data_ready(parent, sk); 1508 : : 1509 : : /* subflow-level lowat test are not relevant. 1510 : : * respect the msk-level threshold eventually mandating an immediate ack 1511 : : */ - 1512 [ + + ]: 481661 : if (mptcp_data_avail(msk) < parent->sk_rcvlowat && - 1513 [ - + - + : 67084 : (tcp_sk(sk)->rcv_nxt - tcp_sk(sk)->rcv_wup) > inet_csk(sk)->icsk_ack.rcv_mss) - + + ] - 1514 : 50933 : inet_csk(sk)->icsk_ack.pending |= ICSK_ACK_NOW; - 1515 [ + + ]: 7039 : } else if (unlikely(sk->sk_err)) { + 1512 [ + + ]: 695057 : if (mptcp_data_avail(msk) < parent->sk_rcvlowat && + 1513 [ - + - + : 74204 : (tcp_sk(sk)->rcv_nxt - tcp_sk(sk)->rcv_wup) > inet_csk(sk)->icsk_ack.rcv_mss) + + + ] + 1514 : 56871 : inet_csk(sk)->icsk_ack.pending |= ICSK_ACK_NOW; + 1515 [ + + ]: 7647 : } else if (unlikely(sk->sk_err)) { 1516 : 2 : subflow_error_report(sk); 1517 : : } 1518 : : } 1519 : : - 1520 : 305842 : static void subflow_write_space(struct sock *ssk) + 1520 : 405255 : static void subflow_write_space(struct sock *ssk) 1521 : : { - 1522 : 305842 : struct sock *sk = mptcp_subflow_ctx(ssk)->conn; + 1522 : 405255 : struct sock *sk = mptcp_subflow_ctx(ssk)->conn; 1523 : : - 1524 : 305842 : mptcp_propagate_sndbuf(sk, ssk); - 1525 : 305842 : mptcp_write_space(sk); - 1526 : 305842 : } + 1524 : 405255 : mptcp_propagate_sndbuf(sk, ssk); + 1525 : 405255 : mptcp_write_space(sk); + 1526 : 405255 : } 1527 : : 1528 : : static const struct inet_connection_sock_af_ops * 1529 : 0 : subflow_default_af_ops(struct sock *sk) @@ -1647,22 +1647,22 @@ 1555 : : } 1556 : : #endif 1557 : : - 1558 : 1146 : void mptcp_info2sockaddr(const struct mptcp_addr_info *info, + 1558 : 1142 : void mptcp_info2sockaddr(const struct mptcp_addr_info *info, 1559 : : struct sockaddr_storage *addr, 1560 : : unsigned short family) 1561 : : { - 1562 : 1146 : memset(addr, 0, sizeof(*addr)); - 1563 : 1146 : addr->ss_family = family; - 1564 [ + + ]: 1146 : if (addr->ss_family == AF_INET) { - 1565 : 1028 : struct sockaddr_in *in_addr = (struct sockaddr_in *)addr; + 1562 : 1142 : memset(addr, 0, sizeof(*addr)); + 1563 : 1142 : addr->ss_family = family; + 1564 [ + + ]: 1142 : if (addr->ss_family == AF_INET) { + 1565 : 1024 : struct sockaddr_in *in_addr = (struct sockaddr_in *)addr; 1566 : : - 1567 [ + + ]: 1028 : if (info->family == AF_INET) - 1568 : 1007 : in_addr->sin_addr = info->addr; + 1567 [ + + ]: 1024 : if (info->family == AF_INET) + 1568 : 1006 : in_addr->sin_addr = info->addr; 1569 : : #if IS_ENABLED(CONFIG_MPTCP_IPV6) - 1570 [ + - ]: 21 : else if (ipv6_addr_v4mapped(&info->addr6)) - 1571 : 21 : in_addr->sin_addr.s_addr = info->addr6.s6_addr32[3]; + 1570 [ + - ]: 18 : else if (ipv6_addr_v4mapped(&info->addr6)) + 1571 : 18 : in_addr->sin_addr.s_addr = info->addr6.s6_addr32[3]; 1572 : : #endif - 1573 : 1028 : in_addr->sin_port = info->port; + 1573 : 1024 : in_addr->sin_port = info->port; 1574 : : } 1575 : : #if IS_ENABLED(CONFIG_MPTCP_IPV6) 1576 [ + - ]: 118 : else if (addr->ss_family == AF_INET6) { @@ -1676,43 +1676,43 @@ 1584 : 118 : in6_addr->sin6_port = info->port; 1585 : : } 1586 : : #endif - 1587 : 1146 : } + 1587 : 1142 : } 1588 : : - 1589 : 626 : int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_pm_local *local, + 1589 : 627 : int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_pm_local *local, 1590 : : const struct mptcp_addr_info *remote) 1591 : : { - 1592 [ - + ]: 626 : struct mptcp_sock *msk = mptcp_sk(sk); - 1593 : 626 : struct mptcp_subflow_context *subflow; - 1594 : 626 : int local_id = local->addr.id; - 1595 : 626 : struct sockaddr_storage addr; - 1596 : 626 : int remote_id = remote->id; - 1597 : 626 : int err = -ENOTCONN; - 1598 : 626 : struct socket *sf; - 1599 : 626 : struct sock *ssk; - 1600 : 626 : u32 remote_token; - 1601 : 626 : int addrlen; + 1592 [ - + ]: 627 : struct mptcp_sock *msk = mptcp_sk(sk); + 1593 : 627 : struct mptcp_subflow_context *subflow; + 1594 : 627 : int local_id = local->addr.id; + 1595 : 627 : struct sockaddr_storage addr; + 1596 : 627 : int remote_id = remote->id; + 1597 : 627 : int err = -ENOTCONN; + 1598 : 627 : struct socket *sf; + 1599 : 627 : struct sock *ssk; + 1600 : 627 : u32 remote_token; + 1601 : 627 : int addrlen; 1602 : : 1603 : : /* The userspace PM sent the request too early? */ - 1604 [ - + ]: 626 : if (!mptcp_is_fully_established(sk)) + 1604 [ - + ]: 627 : if (!mptcp_is_fully_established(sk)) 1605 : 0 : goto err_out; 1606 : : - 1607 : 626 : err = mptcp_subflow_create_socket(sk, local->addr.family, &sf); - 1608 [ + + ]: 626 : if (err) { - 1609 [ + - ]: 63 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_JOINSYNTXCREATSKERR); - 1610 [ - + ]: 63 : pr_debug("msk=%p local=%d remote=%d create sock error: %d\n", + 1607 : 627 : err = mptcp_subflow_create_socket(sk, local->addr.family, &sf); + 1608 [ + + ]: 627 : if (err) { + 1609 [ + - ]: 66 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_JOINSYNTXCREATSKERR); + 1610 [ - + ]: 66 : pr_debug("msk=%p local=%d remote=%d create sock error: %d\n", 1611 : : msk, local_id, remote_id, err); - 1612 : 63 : goto err_out; + 1612 : 66 : goto err_out; 1613 : : } 1614 : : - 1615 : 563 : ssk = sf->sk; - 1616 : 563 : subflow = mptcp_subflow_ctx(ssk); - 1617 : 563 : do { - 1618 : 563 : get_random_bytes(&subflow->local_nonce, sizeof(u32)); - 1619 [ - + ]: 563 : } while (!subflow->local_nonce); + 1615 : 561 : ssk = sf->sk; + 1616 : 561 : subflow = mptcp_subflow_ctx(ssk); + 1617 : 561 : do { + 1618 : 561 : get_random_bytes(&subflow->local_nonce, sizeof(u32)); + 1619 [ - + ]: 561 : } while (!subflow->local_nonce); 1620 : : 1621 : : /* if 'IPADDRANY', the ID will be set later, after the routing */ - 1622 [ + + ]: 563 : if (local->addr.family == AF_INET) { - 1623 [ + + ]: 504 : if (!local->addr.addr.s_addr) + 1622 [ + + ]: 561 : if (local->addr.family == AF_INET) { + 1623 [ + + ]: 502 : if (!local->addr.addr.s_addr) 1624 : : local_id = -1; 1625 : : #if IS_ENABLED(CONFIG_MPTCP_IPV6) 1626 [ + + ]: 59 : } else if (sk->sk_family == AF_INET6) { @@ -1721,57 +1721,57 @@ 1629 : : #endif 1630 : : } 1631 : : - 1632 : 319 : if (local_id >= 0) - 1633 : 319 : subflow_set_local_id(subflow, local_id); + 1632 : 316 : if (local_id >= 0) + 1633 : 316 : subflow_set_local_id(subflow, local_id); 1634 : : - 1635 : 563 : subflow->remote_key_valid = 1; - 1636 : 563 : subflow->remote_key = READ_ONCE(msk->remote_key); - 1637 : 563 : subflow->local_key = READ_ONCE(msk->local_key); - 1638 : 563 : subflow->token = msk->token; - 1639 : 563 : mptcp_info2sockaddr(&local->addr, &addr, ssk->sk_family); + 1635 : 561 : subflow->remote_key_valid = 1; + 1636 : 561 : subflow->remote_key = READ_ONCE(msk->remote_key); + 1637 : 561 : subflow->local_key = READ_ONCE(msk->local_key); + 1638 : 561 : subflow->token = msk->token; + 1639 : 561 : mptcp_info2sockaddr(&local->addr, &addr, ssk->sk_family); 1640 : : - 1641 : 563 : addrlen = sizeof(struct sockaddr_in); + 1641 : 561 : addrlen = sizeof(struct sockaddr_in); 1642 : : #if IS_ENABLED(CONFIG_MPTCP_IPV6) - 1643 [ + + ]: 563 : if (addr.ss_family == AF_INET6) + 1643 [ + + ]: 561 : if (addr.ss_family == AF_INET6) 1644 : 59 : addrlen = sizeof(struct sockaddr_in6); 1645 : : #endif - 1646 : 563 : ssk->sk_bound_dev_if = local->ifindex; - 1647 : 563 : err = kernel_bind(sf, (struct sockaddr *)&addr, addrlen); - 1648 [ + + ]: 563 : if (err) { + 1646 : 561 : ssk->sk_bound_dev_if = local->ifindex; + 1647 : 561 : err = kernel_bind(sf, (struct sockaddr *)&addr, addrlen); + 1648 [ + + ]: 561 : if (err) { 1649 [ + - ]: 2 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_JOINSYNTXBINDERR); 1650 [ - + ]: 2 : pr_debug("msk=%p local=%d remote=%d bind error: %d\n", 1651 : : msk, local_id, remote_id, err); 1652 : 2 : goto failed; 1653 : : } 1654 : : - 1655 : 561 : mptcp_crypto_key_sha(subflow->remote_key, &remote_token, NULL); - 1656 [ - + ]: 561 : pr_debug("msk=%p remote_token=%u local_id=%d remote_id=%d\n", msk, + 1655 : 559 : mptcp_crypto_key_sha(subflow->remote_key, &remote_token, NULL); + 1656 [ - + ]: 559 : pr_debug("msk=%p remote_token=%u local_id=%d remote_id=%d\n", msk, 1657 : : remote_token, local_id, remote_id); - 1658 : 561 : subflow->remote_token = remote_token; - 1659 : 561 : WRITE_ONCE(subflow->remote_id, remote_id); - 1660 : 561 : subflow->request_join = 1; - 1661 : 561 : subflow->request_bkup = !!(local->flags & MPTCP_PM_ADDR_FLAG_BACKUP); - 1662 : 561 : subflow->subflow_id = msk->subflow_id++; - 1663 : 561 : mptcp_info2sockaddr(remote, &addr, ssk->sk_family); + 1658 : 559 : subflow->remote_token = remote_token; + 1659 : 559 : WRITE_ONCE(subflow->remote_id, remote_id); + 1660 : 559 : subflow->request_join = 1; + 1661 : 559 : subflow->request_bkup = !!(local->flags & MPTCP_PM_ADDR_FLAG_BACKUP); + 1662 : 559 : subflow->subflow_id = msk->subflow_id++; + 1663 : 559 : mptcp_info2sockaddr(remote, &addr, ssk->sk_family); 1664 : : - 1665 : 561 : sock_hold(ssk); - 1666 : 561 : list_add_tail(&subflow->node, &msk->conn_list); - 1667 : 561 : err = kernel_connect(sf, (struct sockaddr *)&addr, addrlen, O_NONBLOCK); - 1668 [ + + ]: 561 : if (err && err != -EINPROGRESS) { + 1665 : 559 : sock_hold(ssk); + 1666 : 559 : list_add_tail(&subflow->node, &msk->conn_list); + 1667 : 559 : err = kernel_connect(sf, (struct sockaddr *)&addr, addrlen, O_NONBLOCK); + 1668 [ + + ]: 559 : if (err && err != -EINPROGRESS) { 1669 [ + - ]: 26 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_JOINSYNTXCONNECTERR); 1670 [ - + ]: 26 : pr_debug("msk=%p local=%d remote=%d connect error: %d\n", 1671 : : msk, local_id, remote_id, err); 1672 : 26 : goto failed_unlink; 1673 : : } 1674 : : - 1675 [ + - ]: 535 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_JOINSYNTX); + 1675 [ + - ]: 533 : MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_JOINSYNTX); 1676 : : 1677 : : /* discard the subflow socket */ - 1678 : 535 : mptcp_sock_graft(ssk, sk->sk_socket); - 1679 : 535 : iput(SOCK_INODE(sf)); - 1680 : 535 : WRITE_ONCE(msk->allow_infinite_fallback, false); - 1681 : 535 : mptcp_stop_tout_timer(sk); - 1682 : 535 : return 0; + 1678 : 533 : mptcp_sock_graft(ssk, sk->sk_socket); + 1679 : 533 : iput(SOCK_INODE(sf)); + 1680 : 533 : WRITE_ONCE(msk->allow_infinite_fallback, false); + 1681 : 533 : mptcp_stop_tout_timer(sk); + 1682 : 533 : return 0; 1683 : : 1684 : 0 : failed_unlink: 1685 : 26 : list_del(&subflow->node); @@ -1781,22 +1781,22 @@ 1689 : 28 : subflow->disposable = 1; 1690 : 28 : sock_release(sf); 1691 : : - 1692 : 91 : err_out: + 1692 : 94 : err_out: 1693 : : /* we account subflows before the creation, and this failures will not 1694 : : * be caught by sk_state_change() 1695 : : */ - 1696 : 91 : mptcp_pm_close_subflow(msk); - 1697 : 91 : return err; + 1696 : 94 : mptcp_pm_close_subflow(msk); + 1697 : 94 : return err; 1698 : : } 1699 : : - 1700 : 3069 : static void mptcp_attach_cgroup(struct sock *parent, struct sock *child) + 1700 : 3067 : static void mptcp_attach_cgroup(struct sock *parent, struct sock *child) 1701 : : { 1702 : : #ifdef CONFIG_SOCK_CGROUP_DATA - 1703 : 3069 : struct sock_cgroup_data *parent_skcd = &parent->sk_cgrp_data, - 1704 : 3069 : *child_skcd = &child->sk_cgrp_data; + 1703 : 3067 : struct sock_cgroup_data *parent_skcd = &parent->sk_cgrp_data, + 1704 : 3067 : *child_skcd = &child->sk_cgrp_data; 1705 : : 1706 : : /* only the additional subflows created by kworkers have to be modified */ - 1707 [ + + ]: 3069 : if (cgroup_id(sock_cgroup_ptr(parent_skcd)) != + 1707 [ + + ]: 3067 : if (cgroup_id(sock_cgroup_ptr(parent_skcd)) != 1708 [ + + ]: 186 : cgroup_id(sock_cgroup_ptr(child_skcd))) { 1709 : : #ifdef CONFIG_MEMCG 1710 : : struct mem_cgroup *memcg = parent->sk_memcg; @@ -1811,69 +1811,69 @@ 1719 : 60 : cgroup_sk_clone(child_skcd); 1720 : : } 1721 : : #endif /* CONFIG_SOCK_CGROUP_DATA */ - 1722 : 3069 : } + 1722 : 3067 : } 1723 : : 1724 : 186 : static void mptcp_subflow_ops_override(struct sock *ssk) 1725 : : { 1726 : : #if IS_ENABLED(CONFIG_MPTCP_IPV6) - 1727 : 3069 : if (ssk->sk_prot == &tcpv6_prot) + 1727 : 3067 : if (ssk->sk_prot == &tcpv6_prot) 1728 : 929 : ssk->sk_prot = &tcpv6_prot_override; 1729 : : else 1730 : : #endif - 1731 : 2140 : ssk->sk_prot = &tcp_prot_override; + 1731 : 2138 : ssk->sk_prot = &tcp_prot_override; 1732 : : } 1733 : : 1734 : 312 : static void mptcp_subflow_ops_undo_override(struct sock *ssk) 1735 : : { 1736 : : #if IS_ENABLED(CONFIG_MPTCP_IPV6) 1737 [ + + ]: 144 : if (ssk->sk_prot == &tcpv6_prot_override) - 1738 : 1797 : ssk->sk_prot = &tcpv6_prot; + 1738 : 1796 : ssk->sk_prot = &tcpv6_prot; 1739 : : else 1740 : : #endif - 1741 : 2926 : ssk->sk_prot = &tcp_prot; + 1741 : 2925 : ssk->sk_prot = &tcp_prot; 1742 : : } 1743 : : - 1744 : 3132 : int mptcp_subflow_create_socket(struct sock *sk, unsigned short family, + 1744 : 3133 : int mptcp_subflow_create_socket(struct sock *sk, unsigned short family, 1745 : : struct socket **new_sock) 1746 : : { - 1747 : 3132 : struct mptcp_subflow_context *subflow; - 1748 [ + + ]: 3132 : struct net *net = sock_net(sk); - 1749 : 3132 : struct socket *sf; - 1750 : 3132 : int err; + 1747 : 3133 : struct mptcp_subflow_context *subflow; + 1748 [ + + ]: 3133 : struct net *net = sock_net(sk); + 1749 : 3133 : struct socket *sf; + 1750 : 3133 : int err; 1751 : : 1752 : : /* un-accepted server sockets can reach here - on bad configuration 1753 : : * bail early to avoid greater trouble later 1754 : : */ - 1755 [ + + ]: 3132 : if (unlikely(!sk->sk_socket)) + 1755 [ + + ]: 3133 : if (unlikely(!sk->sk_socket)) 1756 : : return -EINVAL; 1757 : : - 1758 : 3069 : err = sock_create_kern(net, family, SOCK_STREAM, IPPROTO_TCP, &sf); - 1759 [ + - ]: 3069 : if (err) + 1758 : 3067 : err = sock_create_kern(net, family, SOCK_STREAM, IPPROTO_TCP, &sf); + 1759 [ + - ]: 3067 : if (err) 1760 : : return err; 1761 : : - 1762 : 3069 : lock_sock_nested(sf->sk, SINGLE_DEPTH_NESTING); + 1762 : 3067 : lock_sock_nested(sf->sk, SINGLE_DEPTH_NESTING); 1763 : : - 1764 : 3069 : err = security_mptcp_add_subflow(sk, sf->sk); - 1765 [ - + ]: 3069 : if (err) + 1764 : 3067 : err = security_mptcp_add_subflow(sk, sf->sk); + 1765 [ - + ]: 3067 : if (err) 1766 : 0 : goto err_free; 1767 : : 1768 : : /* the newly created socket has to be in the same cgroup as its parent */ - 1769 : 3069 : mptcp_attach_cgroup(sk, sf->sk); + 1769 : 3067 : mptcp_attach_cgroup(sk, sf->sk); 1770 : : 1771 : : /* kernel sockets do not by default acquire net ref, but TCP timer 1772 : : * needs it. 1773 : : * Update ns_tracker to current stack trace and refcounted tracker. 1774 : : */ - 1775 : 3069 : __netns_tracker_free(net, &sf->sk->ns_tracker, false); - 1776 : 3069 : sf->sk->sk_net_refcnt = 1; - 1777 : 3069 : get_net_track(net, &sf->sk->ns_tracker, GFP_KERNEL); - 1778 : 3069 : sock_inuse_add(net, 1); - 1779 : 3069 : err = tcp_set_ulp(sf->sk, "mptcp"); - 1780 [ - + ]: 3069 : if (err) + 1775 : 3067 : __netns_tracker_free(net, &sf->sk->ns_tracker, false); + 1776 : 3067 : sf->sk->sk_net_refcnt = 1; + 1777 : 3067 : get_net_track(net, &sf->sk->ns_tracker, GFP_KERNEL); + 1778 : 3067 : sock_inuse_add(net, 1); + 1779 : 3067 : err = tcp_set_ulp(sf->sk, "mptcp"); + 1780 [ - + ]: 3067 : if (err) 1781 : 0 : goto err_free; 1782 : : - 1783 [ - + ]: 3069 : mptcp_sockopt_sync_locked(mptcp_sk(sk), sf->sk); - 1784 : 3069 : release_sock(sf->sk); + 1783 [ - + ]: 3067 : mptcp_sockopt_sync_locked(mptcp_sk(sk), sf->sk); + 1784 : 3067 : release_sock(sf->sk); 1785 : : 1786 : : /* the newly created socket really belongs to the owning MPTCP 1787 : : * socket, even if for additional subflows the allocation is performed @@ -1881,17 +1881,17 @@ 1789 : : * procfs/diag interfaces really show this one belonging to the correct 1790 : : * user. 1791 : : */ - 1792 [ - + ]: 3069 : SOCK_INODE(sf)->i_ino = SOCK_INODE(sk->sk_socket)->i_ino; - 1793 : 3069 : SOCK_INODE(sf)->i_uid = SOCK_INODE(sk->sk_socket)->i_uid; - 1794 : 3069 : SOCK_INODE(sf)->i_gid = SOCK_INODE(sk->sk_socket)->i_gid; + 1792 [ - + ]: 3067 : SOCK_INODE(sf)->i_ino = SOCK_INODE(sk->sk_socket)->i_ino; + 1793 : 3067 : SOCK_INODE(sf)->i_uid = SOCK_INODE(sk->sk_socket)->i_uid; + 1794 : 3067 : SOCK_INODE(sf)->i_gid = SOCK_INODE(sk->sk_socket)->i_gid; 1795 : : - 1796 [ - + ]: 3069 : subflow = mptcp_subflow_ctx(sf->sk); - 1797 [ - + ]: 3069 : pr_debug("subflow=%p\n", subflow); + 1796 [ - + ]: 3067 : subflow = mptcp_subflow_ctx(sf->sk); + 1797 [ - + ]: 3067 : pr_debug("subflow=%p\n", subflow); 1798 : : - 1799 : 3069 : *new_sock = sf; - 1800 : 3069 : sock_hold(sk); - 1801 : 3069 : subflow->conn = sk; - 1802 [ + + ]: 3069 : mptcp_subflow_ops_override(sf->sk); + 1799 : 3067 : *new_sock = sf; + 1800 : 3067 : sock_hold(sk); + 1801 : 3067 : subflow->conn = sk; + 1802 [ + + ]: 3067 : mptcp_subflow_ops_override(sf->sk); 1803 : : 1804 : : return 0; 1805 : : @@ -1901,56 +1901,56 @@ 1809 : 0 : return err; 1810 : : } 1811 : : - 1812 : 4762 : static struct mptcp_subflow_context *subflow_create_ctx(struct sock *sk, + 1812 : 4760 : static struct mptcp_subflow_context *subflow_create_ctx(struct sock *sk, 1813 : : gfp_t priority) 1814 : : { - 1815 : 4762 : struct inet_connection_sock *icsk = inet_csk(sk); - 1816 : 4762 : struct mptcp_subflow_context *ctx; + 1815 : 4760 : struct inet_connection_sock *icsk = inet_csk(sk); + 1816 : 4760 : struct mptcp_subflow_context *ctx; 1817 : : - 1818 : 4762 : ctx = kzalloc(sizeof(*ctx), priority); - 1819 [ + - ]: 4762 : if (!ctx) + 1818 : 4760 : ctx = kzalloc(sizeof(*ctx), priority); + 1819 [ + - ]: 4760 : if (!ctx) 1820 : : return NULL; 1821 : : - 1822 : 4762 : rcu_assign_pointer(icsk->icsk_ulp_data, ctx); - 1823 [ - + ]: 4762 : INIT_LIST_HEAD(&ctx->node); - 1824 : 4762 : INIT_LIST_HEAD(&ctx->delegated_node); + 1822 : 4760 : rcu_assign_pointer(icsk->icsk_ulp_data, ctx); + 1823 [ - + ]: 4760 : INIT_LIST_HEAD(&ctx->node); + 1824 : 4760 : INIT_LIST_HEAD(&ctx->delegated_node); 1825 : : - 1826 [ - + ]: 4762 : pr_debug("subflow=%p\n", ctx); + 1826 [ - + ]: 4760 : pr_debug("subflow=%p\n", ctx); 1827 : : - 1828 : 4762 : ctx->tcp_sock = sk; - 1829 : 4762 : WRITE_ONCE(ctx->local_id, -1); + 1828 : 4760 : ctx->tcp_sock = sk; + 1829 : 4760 : WRITE_ONCE(ctx->local_id, -1); 1830 : : - 1831 : 4762 : return ctx; + 1831 : 4760 : return ctx; 1832 : : } 1833 : : - 1834 : 4953 : static void __subflow_state_change(struct sock *sk) + 1834 : 4969 : static void __subflow_state_change(struct sock *sk) 1835 : : { - 1836 : 4953 : struct socket_wq *wq; + 1836 : 4969 : struct socket_wq *wq; 1837 : : - 1838 : 4953 : rcu_read_lock(); - 1839 [ + - - + : 4953 : wq = rcu_dereference(sk->sk_wq); + 1838 : 4969 : rcu_read_lock(); + 1839 [ + - - + : 4969 : wq = rcu_dereference(sk->sk_wq); - - - - - - ] - 1840 [ + + ]: 4953 : if (skwq_has_sleeper(wq)) + 1840 [ + + ]: 4969 : if (skwq_has_sleeper(wq)) 1841 : 360 : wake_up_interruptible_all(&wq->wait); - 1842 : 4953 : rcu_read_unlock(); - 1843 : 4953 : } + 1842 : 4969 : rcu_read_unlock(); + 1843 : 4969 : } 1844 : : 1845 : 0 : static bool subflow_is_done(const struct sock *sk) 1846 : : { - 1847 [ + + - + ]: 271 : return sk->sk_shutdown & RCV_SHUTDOWN || sk->sk_state == TCP_CLOSE; + 1847 [ + + - + ]: 265 : return sk->sk_shutdown & RCV_SHUTDOWN || sk->sk_state == TCP_CLOSE; 1848 : : } 1849 : : - 1850 : 4953 : static void subflow_state_change(struct sock *sk) + 1850 : 4969 : static void subflow_state_change(struct sock *sk) 1851 : : { - 1852 : 4953 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); - 1853 : 4953 : struct sock *parent = subflow->conn; - 1854 : 4953 : struct mptcp_sock *msk; + 1852 : 4969 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); + 1853 : 4969 : struct sock *parent = subflow->conn; + 1854 : 4969 : struct mptcp_sock *msk; 1855 : : - 1856 : 4953 : __subflow_state_change(sk); + 1856 : 4969 : __subflow_state_change(sk); 1857 : : - 1858 [ - + ]: 4953 : msk = mptcp_sk(parent); - 1859 [ - + ]: 4953 : if (subflow_simultaneous_connect(sk)) { + 1858 [ - + ]: 4969 : msk = mptcp_sk(parent); + 1859 [ - + ]: 4969 : if (subflow_simultaneous_connect(sk)) { 1860 : 0 : mptcp_do_fallback(sk); 1861 [ # # ]: 0 : pr_fallback(msk); 1862 : 0 : subflow->conn_finished = 1; @@ -1961,41 +1961,41 @@ 1867 : : * a fin packet carrying a DSS can be unnoticed if we don't trigger 1868 : : * the data available machinery here. 1869 : : */ - 1870 [ + + ]: 4953 : if (mptcp_subflow_data_available(sk)) + 1870 [ + + ]: 4969 : if (mptcp_subflow_data_available(sk)) 1871 : 64 : mptcp_data_ready(parent, sk); - 1872 [ + + ]: 4889 : else if (unlikely(sk->sk_err)) - 1873 : 470 : subflow_error_report(sk); + 1872 [ + + ]: 4905 : else if (unlikely(sk->sk_err)) + 1873 : 466 : subflow_error_report(sk); 1874 : : - 1875 [ - + ]: 4953 : subflow_sched_work_if_closed(mptcp_sk(parent), sk); + 1875 [ - + ]: 4969 : subflow_sched_work_if_closed(mptcp_sk(parent), sk); 1876 : : 1877 : : /* when the fallback subflow closes the rx side, trigger a 'dummy' 1878 : : * ingress data fin, so that the msk state will follow along 1879 : : */ - 1880 [ + + + - : 5221 : if (__mptcp_check_fallback(msk) && subflow_is_done(sk) && msk->first == sk && - + + ] - 1881 : 134 : mptcp_update_rcv_data_fin(msk, READ_ONCE(msk->ack_seq), true)) - 1882 : 79 : mptcp_schedule_work(parent); - 1883 : 4953 : } + 1880 [ + + + - : 5229 : if (__mptcp_check_fallback(msk) && subflow_is_done(sk) && msk->first == sk && + + + ] + 1881 : 130 : mptcp_update_rcv_data_fin(msk, READ_ONCE(msk->ack_seq), true)) + 1882 : 78 : mptcp_schedule_work(parent); + 1883 : 4969 : } 1884 : : - 1885 : 1248 : void mptcp_subflow_queue_clean(struct sock *listener_sk, struct sock *listener_ssk) + 1885 : 1249 : void mptcp_subflow_queue_clean(struct sock *listener_sk, struct sock *listener_ssk) 1886 : : { - 1887 : 1248 : struct request_sock_queue *queue = &inet_csk(listener_ssk)->icsk_accept_queue; - 1888 : 1248 : struct request_sock *req, *head, *tail; - 1889 : 1248 : struct mptcp_subflow_context *subflow; - 1890 : 1248 : struct sock *sk, *ssk; + 1887 : 1249 : struct request_sock_queue *queue = &inet_csk(listener_ssk)->icsk_accept_queue; + 1888 : 1249 : struct request_sock *req, *head, *tail; + 1889 : 1249 : struct mptcp_subflow_context *subflow; + 1890 : 1249 : struct sock *sk, *ssk; 1891 : : 1892 : : /* Due to lock dependencies no relevant lock can be acquired under rskq_lock. 1893 : : * Splice the req list, so that accept() can not reach the pending ssk after 1894 : : * the listener socket is released below. 1895 : : */ - 1896 : 1248 : spin_lock_bh(&queue->rskq_lock); - 1897 : 1248 : head = queue->rskq_accept_head; - 1898 : 1248 : tail = queue->rskq_accept_tail; - 1899 : 1248 : queue->rskq_accept_head = NULL; - 1900 : 1248 : queue->rskq_accept_tail = NULL; - 1901 : 1248 : spin_unlock_bh(&queue->rskq_lock); + 1896 : 1249 : spin_lock_bh(&queue->rskq_lock); + 1897 : 1249 : head = queue->rskq_accept_head; + 1898 : 1249 : tail = queue->rskq_accept_tail; + 1899 : 1249 : queue->rskq_accept_head = NULL; + 1900 : 1249 : queue->rskq_accept_tail = NULL; + 1901 : 1249 : spin_unlock_bh(&queue->rskq_lock); 1902 : : - 1903 [ + + ]: 1248 : if (!head) + 1903 [ + + ]: 1249 : if (!head) 1904 : : return; 1905 : : 1906 : : /* can't acquire the msk socket lock under the subflow one, @@ -2048,62 +2048,62 @@ 1953 : 42 : spin_unlock_bh(&queue->rskq_lock); 1954 : : } 1955 : : - 1956 : 3381 : static int subflow_ulp_init(struct sock *sk) + 1956 : 3379 : static int subflow_ulp_init(struct sock *sk) 1957 : : { - 1958 : 3381 : struct inet_connection_sock *icsk = inet_csk(sk); - 1959 : 3381 : struct mptcp_subflow_context *ctx; - 1960 [ - + ]: 3381 : struct tcp_sock *tp = tcp_sk(sk); - 1961 : 3381 : int err = 0; + 1958 : 3379 : struct inet_connection_sock *icsk = inet_csk(sk); + 1959 : 3379 : struct mptcp_subflow_context *ctx; + 1960 [ - + ]: 3379 : struct tcp_sock *tp = tcp_sk(sk); + 1961 : 3379 : int err = 0; 1962 : : 1963 : : /* disallow attaching ULP to a socket unless it has been 1964 : : * created with sock_create_kern() 1965 : : */ - 1966 [ + + ]: 3381 : if (!sk->sk_kern_sock) { + 1966 [ + + ]: 3379 : if (!sk->sk_kern_sock) { 1967 : 312 : err = -EOPNOTSUPP; 1968 : 312 : goto out; 1969 : : } 1970 : : - 1971 : 3069 : ctx = subflow_create_ctx(sk, GFP_KERNEL); - 1972 [ - + ]: 3069 : if (!ctx) { + 1971 : 3067 : ctx = subflow_create_ctx(sk, GFP_KERNEL); + 1972 [ - + ]: 3067 : if (!ctx) { 1973 : 0 : err = -ENOMEM; 1974 : 0 : goto out; 1975 : : } 1976 : : - 1977 [ - + ]: 3069 : pr_debug("subflow=%p, family=%d\n", ctx, sk->sk_family); + 1977 [ - + ]: 3067 : pr_debug("subflow=%p, family=%d\n", ctx, sk->sk_family); 1978 : : - 1979 : 3069 : tp->is_mptcp = 1; - 1980 : 3069 : ctx->icsk_af_ops = icsk->icsk_af_ops; - 1981 [ + + ]: 3069 : icsk->icsk_af_ops = subflow_default_af_ops(sk); - 1982 : 3069 : ctx->tcp_state_change = sk->sk_state_change; - 1983 : 3069 : ctx->tcp_error_report = sk->sk_error_report; + 1979 : 3067 : tp->is_mptcp = 1; + 1980 : 3067 : ctx->icsk_af_ops = icsk->icsk_af_ops; + 1981 [ + + ]: 3067 : icsk->icsk_af_ops = subflow_default_af_ops(sk); + 1982 : 3067 : ctx->tcp_state_change = sk->sk_state_change; + 1983 : 3067 : ctx->tcp_error_report = sk->sk_error_report; 1984 : : - 1985 [ - + ]: 3069 : WARN_ON_ONCE(sk->sk_data_ready != sock_def_readable); - 1986 [ - + ]: 3069 : WARN_ON_ONCE(sk->sk_write_space != sk_stream_write_space); + 1985 [ - + ]: 3067 : WARN_ON_ONCE(sk->sk_data_ready != sock_def_readable); + 1986 [ - + ]: 3067 : WARN_ON_ONCE(sk->sk_write_space != sk_stream_write_space); 1987 : : - 1988 : 3069 : sk->sk_data_ready = subflow_data_ready; - 1989 : 3069 : sk->sk_write_space = subflow_write_space; - 1990 : 3069 : sk->sk_state_change = subflow_state_change; - 1991 : 3069 : sk->sk_error_report = subflow_error_report; - 1992 : 3381 : out: - 1993 : 3381 : return err; + 1988 : 3067 : sk->sk_data_ready = subflow_data_ready; + 1989 : 3067 : sk->sk_write_space = subflow_write_space; + 1990 : 3067 : sk->sk_state_change = subflow_state_change; + 1991 : 3067 : sk->sk_error_report = subflow_error_report; + 1992 : 3379 : out: + 1993 : 3379 : return err; 1994 : : } 1995 : : - 1996 : 4587 : static void subflow_ulp_release(struct sock *ssk) + 1996 : 4585 : static void subflow_ulp_release(struct sock *ssk) 1997 : : { - 1998 [ + - ]: 4587 : struct mptcp_subflow_context *ctx = mptcp_subflow_ctx(ssk); - 1999 : 4587 : bool release = true; - 2000 : 4587 : struct sock *sk; + 1998 [ + - ]: 4585 : struct mptcp_subflow_context *ctx = mptcp_subflow_ctx(ssk); + 1999 : 4585 : bool release = true; + 2000 : 4585 : struct sock *sk; 2001 : : - 2002 [ + - ]: 4587 : if (!ctx) + 2002 [ + - ]: 4585 : if (!ctx) 2003 : : return; 2004 : : - 2005 : 4587 : sk = ctx->conn; - 2006 [ + - ]: 4587 : if (sk) { + 2005 : 4585 : sk = ctx->conn; + 2006 [ + - ]: 4585 : if (sk) { 2007 : : /* if the msk has been orphaned, keep the ctx 2008 : : * alive, will be freed by __mptcp_close_ssk(), 2009 : : * when the subflow is still unaccepted 2010 : : */ - 2011 [ - + - - ]: 4587 : release = ctx->disposable || list_empty(&ctx->node); + 2011 [ - + - - ]: 4585 : release = ctx->disposable || list_empty(&ctx->node); 2012 : : 2013 : : /* inet_child_forget() does not call sk_state_change(), 2014 : : * explicitly trigger the socket close machinery @@ -2111,12 +2111,12 @@ 2016 [ # # ]: 0 : if (!release && !test_and_set_bit(MPTCP_WORK_CLOSE_SUBFLOW, 2017 [ # # ]: 0 : &mptcp_sk(sk)->flags)) 2018 : 0 : mptcp_schedule_work(sk); - 2019 : 4587 : sock_put(sk); + 2019 : 4585 : sock_put(sk); 2020 : : } 2021 : : - 2022 [ + + ]: 4587 : mptcp_subflow_ops_undo_override(ssk); - 2023 [ + - ]: 4587 : if (release) - 2024 : 4587 : kfree_rcu(ctx, rcu); + 2022 [ + + ]: 4585 : mptcp_subflow_ops_undo_override(ssk); + 2023 [ + - ]: 4585 : if (release) + 2024 : 4585 : kfree_rcu(ctx, rcu); 2025 : : } 2026 : : 2027 : 1769 : static void subflow_ulp_clone(const struct request_sock *req, @@ -2175,21 +2175,21 @@ 2080 : : } 2081 : : } 2082 : : - 2083 : 478202 : static void tcp_release_cb_override(struct sock *ssk) + 2083 : 606963 : static void tcp_release_cb_override(struct sock *ssk) 2084 : : { - 2085 : 478202 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); - 2086 : 478202 : long status; + 2085 : 606963 : struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); + 2086 : 606963 : long status; 2087 : : 2088 : : /* process and clear all the pending actions, but leave the subflow into 2089 : : * the napi queue. To respect locking, only the same CPU that originated 2090 : : * the action can touch the list. mptcp_napi_poll will take care of it. 2091 : : */ - 2092 [ - + - + ]: 478202 : status = set_mask_bits(&subflow->delegated_status, MPTCP_DELEGATE_ACTIONS_MASK, 0); - 2093 [ + + ]: 478202 : if (status) - 2094 : 2384 : mptcp_subflow_process_delegated(ssk, status); + 2092 [ - + - + ]: 606963 : status = set_mask_bits(&subflow->delegated_status, MPTCP_DELEGATE_ACTIONS_MASK, 0); + 2093 [ + + ]: 606963 : if (status) + 2094 : 2185 : mptcp_subflow_process_delegated(ssk, status); 2095 : : - 2096 : 478202 : tcp_release_cb(ssk); - 2097 : 478202 : } + 2096 : 606963 : tcp_release_cb(ssk); + 2097 : 606963 : } 2098 : : 2099 : 0 : static int tcp_abort_override(struct sock *ssk, int err) 2100 : : { diff --git a/html/lcov/export/mptcp/syncookies.c.func-c.html b/html/lcov/export/mptcp/syncookies.c.func-c.html index 862f80d7..47f4f82e 100644 --- a/html/lcov/export/mptcp/syncookies.c.func-c.html +++ b/html/lcov/export/mptcp/syncookies.c.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % diff --git a/html/lcov/export/mptcp/syncookies.c.func.html b/html/lcov/export/mptcp/syncookies.c.func.html index dcf29169..069aea45 100644 --- a/html/lcov/export/mptcp/syncookies.c.func.html +++ b/html/lcov/export/mptcp/syncookies.c.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % diff --git a/html/lcov/export/mptcp/syncookies.c.gcov.html b/html/lcov/export/mptcp/syncookies.c.gcov.html index ed771b93..940f1f1b 100644 --- a/html/lcov/export/mptcp/syncookies.c.gcov.html +++ b/html/lcov/export/mptcp/syncookies.c.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % diff --git a/html/lcov/export/mptcp/token.c.func-c.html b/html/lcov/export/mptcp/token.c.func-c.html index 10eedc14..9a0a945b 100644 --- a/html/lcov/export/mptcp/token.c.func-c.html +++ b/html/lcov/export/mptcp/token.c.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % @@ -144,7 +144,7 @@ mptcp_token_destroy - 3884 + 3878 @@ -158,7 +158,7 @@ mptcp_token_iter_next - 5497 + 5478 diff --git a/html/lcov/export/mptcp/token.c.func.html b/html/lcov/export/mptcp/token.c.func.html index a973bacc..9cf96d51 100644 --- a/html/lcov/export/mptcp/token.c.func.html +++ b/html/lcov/export/mptcp/token.c.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % @@ -109,7 +109,7 @@ mptcp_token_destroy - 3884 + 3878 @@ -144,7 +144,7 @@ mptcp_token_iter_next - 5497 + 5478 diff --git a/html/lcov/export/mptcp/token.c.gcov.html b/html/lcov/export/mptcp/token.c.gcov.html index 02f54b8a..defcb64b 100644 --- a/html/lcov/export/mptcp/token.c.gcov.html +++ b/html/lcov/export/mptcp/token.c.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % @@ -150,8 +150,8 @@ 70 : 4816 : struct hlist_nulls_node *pos; 71 : 4816 : struct sock *sk; 72 : : - 73 [ + + ]: 4846 : sk_nulls_for_each_rcu(sk, pos, &t->msk_chain) - 74 [ + + - + ]: 2388 : if (mptcp_sk(sk)->token == token) + 73 [ + + ]: 4837 : sk_nulls_for_each_rcu(sk, pos, &t->msk_chain) + 74 [ + + - + ]: 2379 : if (mptcp_sk(sk)->token == token) 75 [ - + ]: 2358 : return mptcp_sk(sk); 76 : : return NULL; 77 : : } @@ -375,50 +375,50 @@ 294 : : * On successful iteration, the iterator is moved to the next position and 295 : : * a reference to the returned socket is acquired. 296 : : */ - 297 : 5497 : struct mptcp_sock *mptcp_token_iter_next(const struct net *net, long *s_slot, + 297 : 5478 : struct mptcp_sock *mptcp_token_iter_next(const struct net *net, long *s_slot, 298 : : long *s_num) 299 : : { - 300 : 5497 : struct mptcp_sock *ret = NULL; - 301 : 5497 : struct hlist_nulls_node *pos; - 302 : 5497 : int slot, num = 0; + 300 : 5478 : struct mptcp_sock *ret = NULL; + 301 : 5478 : struct hlist_nulls_node *pos; + 302 : 5478 : int slot, num = 0; 303 : : - 304 [ + + ]: 9196921 : for (slot = *s_slot; slot <= token_mask; *s_num = 0, slot++) { - 305 : 9194444 : struct token_bucket *bucket = &token_hash[slot]; - 306 : 9194444 : struct sock *sk; + 304 [ + + ]: 9196902 : for (slot = *s_slot; slot <= token_mask; *s_num = 0, slot++) { + 305 : 9194424 : struct token_bucket *bucket = &token_hash[slot]; + 306 : 9194424 : struct sock *sk; 307 : : - 308 : 9194444 : num = 0; + 308 : 9194424 : num = 0; 309 : : - 310 [ + + ]: 9194444 : if (hlist_nulls_empty(&bucket->msk_chain)) + 310 [ + + ]: 9194424 : if (hlist_nulls_empty(&bucket->msk_chain)) 311 : 9186581 : continue; 312 : : - 313 : 7863 : rcu_read_lock(); - 314 [ + + ]: 12897 : sk_nulls_for_each_rcu(sk, pos, &bucket->msk_chain) { - 315 : 8054 : ++num; - 316 [ + + ]: 8054 : if (!net_eq(sock_net(sk), net)) - 317 : 1934 : continue; + 313 : 7843 : rcu_read_lock(); + 314 [ + + ]: 12765 : sk_nulls_for_each_rcu(sk, pos, &bucket->msk_chain) { + 315 : 7922 : ++num; + 316 [ + + ]: 7922 : if (!net_eq(sock_net(sk), net)) + 317 : 1896 : continue; 318 : : - 319 [ + + ]: 6120 : if (num <= *s_num) - 320 : 3100 : continue; + 319 [ + + ]: 6026 : if (num <= *s_num) + 320 : 3026 : continue; 321 : : - 322 [ - + ]: 3020 : if (!refcount_inc_not_zero(&sk->sk_refcnt)) + 322 [ - + ]: 3000 : if (!refcount_inc_not_zero(&sk->sk_refcnt)) 323 : 0 : continue; 324 : : - 325 [ - + ]: 3020 : if (!net_eq(sock_net(sk), net)) { + 325 [ - + ]: 3000 : if (!net_eq(sock_net(sk), net)) { 326 : 0 : sock_put(sk); 327 : 0 : continue; 328 : : } 329 : : - 330 [ - + ]: 3020 : ret = mptcp_sk(sk); - 331 : 3020 : rcu_read_unlock(); - 332 : 3020 : goto out; + 330 [ - + ]: 3000 : ret = mptcp_sk(sk); + 331 : 3000 : rcu_read_unlock(); + 332 : 3000 : goto out; 333 : : } 334 : 4843 : rcu_read_unlock(); 335 : : } 336 : : - 337 : 2477 : out: - 338 : 5497 : *s_slot = slot; - 339 : 5497 : *s_num = num; - 340 : 5497 : return ret; + 337 : 2478 : out: + 338 : 5478 : *s_slot = slot; + 339 : 5478 : *s_num = num; + 340 : 5478 : return ret; 341 : : } 342 : : EXPORT_SYMBOL_GPL(mptcp_token_iter_next); 343 : : @@ -453,13 +453,13 @@ 372 : : * 373 : : * Remove the token associated to @msk 374 : : */ - 375 : 3884 : void mptcp_token_destroy(struct mptcp_sock *msk) + 375 : 3878 : void mptcp_token_destroy(struct mptcp_sock *msk) 376 : : { - 377 : 3884 : struct sock *sk = (struct sock *)msk; - 378 : 3884 : struct token_bucket *bucket; - 379 : 3884 : struct mptcp_sock *pos; + 377 : 3878 : struct sock *sk = (struct sock *)msk; + 378 : 3878 : struct token_bucket *bucket; + 379 : 3878 : struct mptcp_sock *pos; 380 : : - 381 [ + + ]: 3884 : if (sk_unhashed((struct sock *)msk)) + 381 [ + + ]: 3878 : if (sk_unhashed((struct sock *)msk)) 382 : : return; 383 : : 384 : 2358 : sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1); diff --git a/html/lcov/export/mptcp/token_test.c.func-c.html b/html/lcov/export/mptcp/token_test.c.func-c.html index f2c4027a..5fde9602 100644 --- a/html/lcov/export/mptcp/token_test.c.func-c.html +++ b/html/lcov/export/mptcp/token_test.c.func-c.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % diff --git a/html/lcov/export/mptcp/token_test.c.func.html b/html/lcov/export/mptcp/token_test.c.func.html index bbbffbe2..74951f50 100644 --- a/html/lcov/export/mptcp/token_test.c.func.html +++ b/html/lcov/export/mptcp/token_test.c.func.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 % diff --git a/html/lcov/export/mptcp/token_test.c.gcov.html b/html/lcov/export/mptcp/token_test.c.gcov.html index 9d5ce28e..4d9465c0 100644 --- a/html/lcov/export/mptcp/token_test.c.gcov.html +++ b/html/lcov/export/mptcp/token_test.c.gcov.html @@ -37,7 +37,7 @@ Test Date: - 2024-12-18 06:39:14 + 2024-12-18 18:59:00 Functions: 100.0 %