LCOV - code coverage report
Current view: top level - mptcp/options.c (source / functions) Coverage Total Hit
Test: export Lines: 98.3 % 876 861
Test Date: 2025-01-17 15:32:40 Functions: 100.0 % 27 27
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 77.9 % 689 537

             Branch data     Line data    Source code
       1                 :             : // SPDX-License-Identifier: GPL-2.0
       2                 :             : /* Multipath TCP
       3                 :             :  *
       4                 :             :  * Copyright (c) 2017 - 2019, Intel Corporation.
       5                 :             :  */
       6                 :             : 
       7                 :             : #define pr_fmt(fmt) "MPTCP: " fmt
       8                 :             : 
       9                 :             : #include <linux/kernel.h>
      10                 :             : #include <crypto/sha2.h>
      11                 :             : #include <net/tcp.h>
      12                 :             : #include <net/mptcp.h>
      13                 :             : #include "protocol.h"
      14                 :             : #include "mib.h"
      15                 :             : 
      16                 :             : #include <trace/events/mptcp.h>
      17                 :             : 
      18                 :             : static bool mptcp_cap_flag_sha256(u8 flags)
      19                 :             : {
      20                 :             :         return (flags & MPTCP_CAP_FLAG_MASK) == MPTCP_CAP_HMAC_SHA256;
      21                 :             : }
      22                 :             : 
      23                 :      821646 : 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                 :      821646 :         u8 subtype = *ptr >> 4;
      28                 :      821646 :         int expected_opsize;
      29                 :      821646 :         u16 subopt;
      30                 :      821646 :         u8 version;
      31                 :      821646 :         u8 flags;
      32                 :      821646 :         u8 i;
      33                 :             : 
      34   [ +  +  +  +  :      821646 :         switch (subtype) {
          +  +  +  +  +  
                      - ]
      35                 :        5323 :         case MPTCPOPT_MP_CAPABLE:
      36                 :             :                 /* strict size checking */
      37         [ +  + ]:        5323 :                 if (!(TCP_SKB_CB(skb)->tcp_flags & TCPHDR_SYN)) {
      38         [ +  + ]:        2943 :                         if (skb->len > tcp_hdr(skb)->doff << 2)
      39                 :             :                                 expected_opsize = TCPOLEN_MPTCP_MPC_ACK_DATA;
      40                 :             :                         else
      41                 :        2306 :                                 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) {
      45                 :             :                                 expected_opsize = TCPOLEN_MPTCP_MPC_SYNACK;
      46                 :             :                                 subopt = OPTION_MPTCP_MPC_SYNACK;
      47                 :             :                         } else {
      48                 :        1244 :                                 expected_opsize = TCPOLEN_MPTCP_MPC_SYN;
      49                 :        1244 :                                 subopt = OPTION_MPTCP_MPC_SYN;
      50                 :             :                         }
      51                 :             :                 }
      52                 :             : 
      53                 :             :                 /* Cfr RFC 8684 Section 3.3.0:
      54                 :             :                  * If a checksum is present but its use had
      55                 :             :                  * not been negotiated in the MP_CAPABLE handshake, the receiver MUST
      56                 :             :                  * close the subflow with a RST, as it is not behaving as negotiated.
      57                 :             :                  * If a checksum is not present when its use has been negotiated, the
      58                 :             :                  * receiver MUST close the subflow with a RST, as it is considered
      59                 :             :                  * broken
      60                 :             :                  * We parse even option with mismatching csum presence, so that
      61                 :             :                  * later in subflow_data_ready we can trigger the reset.
      62                 :             :                  */
      63         [ +  + ]:        5323 :                 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                 :        5311 :                 version = *ptr++ & MPTCP_VERSION_MASK;
      70         [ +  + ]:        5311 :                 if (opsize != TCPOLEN_MPTCP_MPC_SYN) {
      71         [ +  + ]:        4073 :                         if (version != MPTCP_SUPPORTED_VERSION)
      72                 :             :                                 break;
      73         [ +  - ]:        1238 :                 } else if (version < MPTCP_SUPPORTED_VERSION) {
      74                 :             :                         break;
      75                 :             :                 }
      76                 :             : 
      77                 :        5305 :                 flags = *ptr++;
      78   [ +  +  +  + ]:        5305 :                 if (!mptcp_cap_flag_sha256(flags) ||
      79                 :             :                     (flags & MPTCP_CAP_EXTENSIBILITY))
      80                 :             :                         break;
      81                 :             : 
      82                 :             :                 /* RFC 6824, Section 3.1:
      83                 :             :                  * "For the Checksum Required bit (labeled "A"), if either
      84                 :             :                  * host requires the use of checksums, checksums MUST be used.
      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         [ +  + ]:        5269 :                 if (flags & MPTCP_CAP_CHECKSUM_REQD)
      89                 :          40 :                         mp_opt->suboptions |= OPTION_MPTCP_CSUMREQD;
      90                 :             : 
      91                 :        5269 :                 mp_opt->deny_join_id0 = !!(flags & MPTCP_CAP_DENY_JOIN_ID0);
      92                 :             : 
      93                 :        5269 :                 mp_opt->suboptions |= subopt;
      94         [ +  + ]:        5269 :                 if (opsize >= TCPOLEN_MPTCP_MPC_SYNACK) {
      95         [ +  + ]:        4043 :                         mp_opt->sndr_key = get_unaligned_be64(ptr);
      96                 :        4043 :                         ptr += 8;
      97                 :             :                 }
      98         [ +  + ]:        4043 :                 if (opsize >= TCPOLEN_MPTCP_MPC_ACK) {
      99                 :        2925 :                         mp_opt->rcvr_key = get_unaligned_be64(ptr);
     100                 :        2925 :                         ptr += 8;
     101                 :             :                 }
     102         [ +  + ]:        4151 :                 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                 :         637 :                         mp_opt->suboptions |= OPTION_MPTCP_DSS;
     109                 :         637 :                         mp_opt->use_map = 1;
     110                 :         637 :                         mp_opt->mpc_map = 1;
     111         [ +  + ]:         637 :                         mp_opt->data_len = get_unaligned_be16(ptr);
     112                 :         637 :                         ptr += 2;
     113                 :             :                 }
     114         [ +  + ]:         637 :                 if (opsize == TCPOLEN_MPTCP_MPC_ACK_DATA_CSUM) {
     115                 :           4 :                         mp_opt->csum = get_unaligned((__force __sum16 *)ptr);
     116                 :           4 :                         mp_opt->suboptions |= OPTION_MPTCP_CSUMREQD;
     117                 :           4 :                         ptr += 2;
     118                 :             :                 }
     119         [ -  + ]:        5269 :                 pr_debug("MP_CAPABLE version=%x, flags=%x, optlen=%d sndr=%llu, rcvr=%llu len=%d csum=%u\n",
     120                 :             :                          version, flags, opsize, mp_opt->sndr_key,
     121                 :             :                          mp_opt->rcvr_key, mp_opt->data_len, mp_opt->csum);
     122                 :             :                 break;
     123                 :             : 
     124                 :        2053 :         case MPTCPOPT_MP_JOIN:
     125         [ +  + ]:        2053 :                 if (opsize == TCPOLEN_MPTCP_MPJ_SYN) {
     126                 :         522 :                         mp_opt->suboptions |= OPTION_MPTCP_MPJ_SYN;
     127                 :         522 :                         mp_opt->backup = *ptr++ & MPTCPOPT_BACKUP;
     128                 :         522 :                         mp_opt->join_id = *ptr++;
     129         [ -  + ]:         522 :                         mp_opt->token = get_unaligned_be32(ptr);
     130                 :         522 :                         ptr += 4;
     131                 :         522 :                         mp_opt->nonce = get_unaligned_be32(ptr);
     132                 :         522 :                         ptr += 4;
     133         [ -  + ]:         522 :                         pr_debug("MP_JOIN bkup=%u, id=%u, token=%u, nonce=%u\n",
     134                 :             :                                  mp_opt->backup, mp_opt->join_id,
     135                 :             :                                  mp_opt->token, mp_opt->nonce);
     136         [ +  + ]:        1531 :                 } else if (opsize == TCPOLEN_MPTCP_MPJ_SYNACK) {
     137                 :         488 :                         mp_opt->suboptions |= OPTION_MPTCP_MPJ_SYNACK;
     138                 :         488 :                         mp_opt->backup = *ptr++ & MPTCPOPT_BACKUP;
     139                 :         488 :                         mp_opt->join_id = *ptr++;
     140         [ -  + ]:         488 :                         mp_opt->thmac = get_unaligned_be64(ptr);
     141                 :         488 :                         ptr += 8;
     142         [ -  + ]:         488 :                         mp_opt->nonce = get_unaligned_be32(ptr);
     143                 :         488 :                         ptr += 4;
     144         [ -  + ]:         488 :                         pr_debug("MP_JOIN bkup=%u, id=%u, thmac=%llu, nonce=%u\n",
     145                 :             :                                  mp_opt->backup, mp_opt->join_id,
     146                 :             :                                  mp_opt->thmac, mp_opt->nonce);
     147         [ +  - ]:        1043 :                 } else if (opsize == TCPOLEN_MPTCP_MPJ_ACK) {
     148                 :        1043 :                         mp_opt->suboptions |= OPTION_MPTCP_MPJ_ACK;
     149                 :        1043 :                         ptr += 2;
     150                 :        1043 :                         memcpy(mp_opt->hmac, ptr, MPTCPOPT_HMAC_LEN);
     151         [ -  + ]:        1043 :                         pr_debug("MP_JOIN hmac\n");
     152                 :             :                 }
     153                 :             :                 break;
     154                 :             : 
     155                 :             :         case MPTCPOPT_DSS:
     156         [ -  + ]:      812892 :                 pr_debug("DSS\n");
     157                 :      812892 :                 ptr++;
     158                 :             : 
     159                 :      812892 :                 flags = (*ptr++) & MPTCP_DSS_FLAG_MASK;
     160                 :      812892 :                 mp_opt->data_fin = (flags & MPTCP_DSS_DATA_FIN) != 0;
     161                 :      812892 :                 mp_opt->dsn64 = (flags & MPTCP_DSS_DSN64) != 0;
     162                 :      812892 :                 mp_opt->use_map = (flags & MPTCP_DSS_HAS_MAP) != 0;
     163                 :      812892 :                 mp_opt->ack64 = (flags & MPTCP_DSS_ACK64) != 0;
     164                 :      812892 :                 mp_opt->use_ack = (flags & MPTCP_DSS_HAS_ACK);
     165                 :             : 
     166         [ -  + ]:      812892 :                 pr_debug("data_fin=%d dsn64=%d use_map=%d ack64=%d use_ack=%d\n",
     167                 :             :                          mp_opt->data_fin, mp_opt->dsn64,
     168                 :             :                          mp_opt->use_map, mp_opt->ack64,
     169                 :             :                          mp_opt->use_ack);
     170                 :             : 
     171                 :      812892 :                 expected_opsize = TCPOLEN_MPTCP_DSS_BASE;
     172                 :             : 
     173         [ +  - ]:      812892 :                 if (mp_opt->use_ack) {
     174         [ +  + ]:      812892 :                         if (mp_opt->ack64)
     175                 :             :                                 expected_opsize += TCPOLEN_MPTCP_DSS_ACK64;
     176                 :             :                         else
     177                 :      176312 :                                 expected_opsize += TCPOLEN_MPTCP_DSS_ACK32;
     178                 :             :                 }
     179                 :             : 
     180         [ +  + ]:      812892 :                 if (mp_opt->use_map) {
     181         [ +  + ]:      507765 :                         if (mp_opt->dsn64)
     182                 :      507723 :                                 expected_opsize += TCPOLEN_MPTCP_DSS_MAP64;
     183                 :             :                         else
     184                 :          42 :                                 expected_opsize += TCPOLEN_MPTCP_DSS_MAP32;
     185                 :             :                 }
     186                 :             : 
     187                 :             :                 /* Always parse any csum presence combination, we will enforce
     188                 :             :                  * RFC 8684 Section 3.3.0 checks later in subflow_data_ready
     189                 :             :                  */
     190         [ +  + ]:      812892 :                 if (opsize != expected_opsize &&
     191         [ +  - ]:        1895 :                     opsize != expected_opsize + TCPOLEN_MPTCP_DSS_CHECKSUM)
     192                 :             :                         break;
     193                 :             : 
     194                 :      812892 :                 mp_opt->suboptions |= OPTION_MPTCP_DSS;
     195         [ +  - ]:      812892 :                 if (mp_opt->use_ack) {
     196         [ +  + ]:      812892 :                         if (mp_opt->ack64) {
     197                 :      636580 :                                 mp_opt->data_ack = get_unaligned_be64(ptr);
     198                 :      636580 :                                 ptr += 8;
     199                 :             :                         } else {
     200                 :      176312 :                                 mp_opt->data_ack = get_unaligned_be32(ptr);
     201                 :      176312 :                                 ptr += 4;
     202                 :             :                         }
     203                 :             : 
     204         [ -  + ]:      812892 :                         pr_debug("data_ack=%llu\n", mp_opt->data_ack);
     205                 :             :                 }
     206                 :             : 
     207         [ +  + ]:      812892 :                 if (mp_opt->use_map) {
     208         [ +  + ]:      507765 :                         if (mp_opt->dsn64) {
     209                 :      507723 :                                 mp_opt->data_seq = get_unaligned_be64(ptr);
     210                 :      507723 :                                 ptr += 8;
     211                 :             :                         } else {
     212                 :          42 :                                 mp_opt->data_seq = get_unaligned_be32(ptr);
     213                 :          42 :                                 ptr += 4;
     214                 :             :                         }
     215                 :             : 
     216         [ +  + ]:      507765 :                         mp_opt->subflow_seq = get_unaligned_be32(ptr);
     217                 :      507765 :                         ptr += 4;
     218                 :             : 
     219         [ +  + ]:      507765 :                         mp_opt->data_len = get_unaligned_be16(ptr);
     220                 :      507765 :                         ptr += 2;
     221                 :             : 
     222         [ +  + ]:      507765 :                         if (opsize == expected_opsize + TCPOLEN_MPTCP_DSS_CHECKSUM) {
     223                 :        1895 :                                 mp_opt->suboptions |= OPTION_MPTCP_CSUMREQD;
     224                 :        1895 :                                 mp_opt->csum = get_unaligned((__force __sum16 *)ptr);
     225                 :        1895 :                                 ptr += 2;
     226                 :             :                         }
     227                 :             : 
     228         [ -  + ]:      507765 :                         pr_debug("data_seq=%llu subflow_seq=%u data_len=%u csum=%d:%u\n",
     229                 :             :                                  mp_opt->data_seq, mp_opt->subflow_seq,
     230                 :             :                                  mp_opt->data_len, !!(mp_opt->suboptions & OPTION_MPTCP_CSUMREQD),
     231                 :             :                                  mp_opt->csum);
     232                 :             :                 }
     233                 :             : 
     234                 :             :                 break;
     235                 :             : 
     236                 :         692 :         case MPTCPOPT_ADD_ADDR:
     237                 :         692 :                 mp_opt->echo = (*ptr++) & MPTCP_ADDR_ECHO;
     238         [ +  + ]:         692 :                 if (!mp_opt->echo) {
     239                 :         360 :                         if (opsize == TCPOLEN_MPTCP_ADD_ADDR ||
     240         [ +  + ]:         360 :                             opsize == TCPOLEN_MPTCP_ADD_ADDR_PORT)
     241                 :         280 :                                 mp_opt->addr.family = AF_INET;
     242                 :             : #if IS_ENABLED(CONFIG_MPTCP_IPV6)
     243                 :          80 :                         else if (opsize == TCPOLEN_MPTCP_ADD_ADDR6 ||
     244         [ +  - ]:          80 :                                  opsize == TCPOLEN_MPTCP_ADD_ADDR6_PORT)
     245                 :          80 :                                 mp_opt->addr.family = AF_INET6;
     246                 :             : #endif
     247                 :             :                         else
     248                 :             :                                 break;
     249                 :             :                 } else {
     250                 :         332 :                         if (opsize == TCPOLEN_MPTCP_ADD_ADDR_BASE ||
     251         [ +  + ]:         332 :                             opsize == TCPOLEN_MPTCP_ADD_ADDR_BASE_PORT)
     252                 :         258 :                                 mp_opt->addr.family = AF_INET;
     253                 :             : #if IS_ENABLED(CONFIG_MPTCP_IPV6)
     254                 :          74 :                         else if (opsize == TCPOLEN_MPTCP_ADD_ADDR6_BASE ||
     255         [ +  - ]:          74 :                                  opsize == TCPOLEN_MPTCP_ADD_ADDR6_BASE_PORT)
     256                 :          74 :                                 mp_opt->addr.family = AF_INET6;
     257                 :             : #endif
     258                 :             :                         else
     259                 :             :                                 break;
     260                 :             :                 }
     261                 :             : 
     262                 :         692 :                 mp_opt->suboptions |= OPTION_MPTCP_ADD_ADDR;
     263                 :         692 :                 mp_opt->addr.id = *ptr++;
     264                 :         692 :                 mp_opt->addr.port = 0;
     265                 :         692 :                 mp_opt->ahmac = 0;
     266         [ +  + ]:         692 :                 if (mp_opt->addr.family == AF_INET) {
     267                 :         538 :                         memcpy((u8 *)&mp_opt->addr.addr.s_addr, (u8 *)ptr, 4);
     268                 :         538 :                         ptr += 4;
     269                 :         538 :                         if (opsize == TCPOLEN_MPTCP_ADD_ADDR_PORT ||
     270         [ +  + ]:         538 :                             opsize == TCPOLEN_MPTCP_ADD_ADDR_BASE_PORT) {
     271                 :          62 :                                 mp_opt->addr.port = htons(get_unaligned_be16(ptr));
     272                 :          62 :                                 ptr += 2;
     273                 :             :                         }
     274                 :             :                 }
     275                 :             : #if IS_ENABLED(CONFIG_MPTCP_IPV6)
     276                 :             :                 else {
     277                 :         154 :                         memcpy(mp_opt->addr.addr6.s6_addr, (u8 *)ptr, 16);
     278                 :         154 :                         ptr += 16;
     279                 :         154 :                         if (opsize == TCPOLEN_MPTCP_ADD_ADDR6_PORT ||
     280         [ +  + ]:         154 :                             opsize == TCPOLEN_MPTCP_ADD_ADDR6_BASE_PORT) {
     281                 :           6 :                                 mp_opt->addr.port = htons(get_unaligned_be16(ptr));
     282                 :           6 :                                 ptr += 2;
     283                 :             :                         }
     284                 :             :                 }
     285                 :             : #endif
     286         [ +  + ]:         692 :                 if (!mp_opt->echo) {
     287                 :         360 :                         mp_opt->ahmac = get_unaligned_be64(ptr);
     288                 :         360 :                         ptr += 8;
     289                 :             :                 }
     290   [ -  +  -  - ]:         692 :                 pr_debug("ADD_ADDR%s: id=%d, ahmac=%llu, echo=%d, port=%d\n",
     291                 :             :                          (mp_opt->addr.family == AF_INET6) ? "6" : "",
     292                 :             :                          mp_opt->addr.id, mp_opt->ahmac, mp_opt->echo, ntohs(mp_opt->addr.port));
     293                 :             :                 break;
     294                 :             : 
     295                 :         106 :         case MPTCPOPT_RM_ADDR:
     296         [ +  - ]:         106 :                 if (opsize < TCPOLEN_MPTCP_RM_ADDR_BASE + 1 ||
     297                 :             :                     opsize > TCPOLEN_MPTCP_RM_ADDR_BASE + MPTCP_RM_IDS_MAX)
     298                 :             :                         break;
     299                 :             : 
     300                 :         106 :                 ptr++;
     301                 :             : 
     302                 :         106 :                 mp_opt->suboptions |= OPTION_MPTCP_RM_ADDR;
     303                 :         106 :                 mp_opt->rm_list.nr = opsize - TCPOLEN_MPTCP_RM_ADDR_BASE;
     304         [ +  + ]:         220 :                 for (i = 0; i < mp_opt->rm_list.nr; i++)
     305                 :         114 :                         mp_opt->rm_list.ids[i] = *ptr++;
     306         [ -  + ]:         106 :                 pr_debug("RM_ADDR: rm_list_nr=%d\n", mp_opt->rm_list.nr);
     307                 :             :                 break;
     308                 :             : 
     309                 :          46 :         case MPTCPOPT_MP_PRIO:
     310         [ +  + ]:          46 :                 if (opsize != TCPOLEN_MPTCP_PRIO)
     311                 :             :                         break;
     312                 :             : 
     313                 :          40 :                 mp_opt->suboptions |= OPTION_MPTCP_PRIO;
     314                 :          40 :                 mp_opt->backup = *ptr++ & MPTCP_PRIO_BKUP;
     315         [ -  + ]:          40 :                 pr_debug("MP_PRIO: prio=%d\n", mp_opt->backup);
     316                 :             :                 break;
     317                 :             : 
     318                 :         256 :         case MPTCPOPT_MP_FASTCLOSE:
     319         [ +  - ]:         256 :                 if (opsize != TCPOLEN_MPTCP_FASTCLOSE)
     320                 :             :                         break;
     321                 :             : 
     322                 :         256 :                 ptr += 2;
     323         [ -  + ]:         256 :                 mp_opt->rcvr_key = get_unaligned_be64(ptr);
     324                 :         256 :                 ptr += 8;
     325                 :         256 :                 mp_opt->suboptions |= OPTION_MPTCP_FASTCLOSE;
     326         [ -  + ]:         256 :                 pr_debug("MP_FASTCLOSE: recv_key=%llu\n", mp_opt->rcvr_key);
     327                 :             :                 break;
     328                 :             : 
     329                 :         272 :         case MPTCPOPT_RST:
     330         [ +  - ]:         272 :                 if (opsize != TCPOLEN_MPTCP_RST)
     331                 :             :                         break;
     332                 :             : 
     333         [ +  + ]:         272 :                 if (!(TCP_SKB_CB(skb)->tcp_flags & TCPHDR_RST))
     334                 :             :                         break;
     335                 :             : 
     336                 :         260 :                 mp_opt->suboptions |= OPTION_MPTCP_RST;
     337                 :         260 :                 flags = *ptr++;
     338                 :         260 :                 mp_opt->reset_transient = flags & MPTCP_RST_TRANSIENT;
     339                 :         260 :                 mp_opt->reset_reason = *ptr;
     340         [ -  + ]:         260 :                 pr_debug("MP_RST: transient=%u reason=%u\n",
     341                 :             :                          mp_opt->reset_transient, mp_opt->reset_reason);
     342                 :             :                 break;
     343                 :             : 
     344                 :           6 :         case MPTCPOPT_MP_FAIL:
     345         [ +  - ]:           6 :                 if (opsize != TCPOLEN_MPTCP_FAIL)
     346                 :             :                         break;
     347                 :             : 
     348                 :           6 :                 ptr += 2;
     349                 :           6 :                 mp_opt->suboptions |= OPTION_MPTCP_FAIL;
     350         [ -  + ]:           6 :                 mp_opt->fail_seq = get_unaligned_be64(ptr);
     351         [ -  + ]:           6 :                 pr_debug("MP_FAIL: data_seq=%llu\n", mp_opt->fail_seq);
     352                 :             :                 break;
     353                 :             : 
     354                 :             :         default:
     355                 :             :                 break;
     356                 :             :         }
     357                 :      821646 : }
     358                 :             : 
     359                 :      821561 : void mptcp_get_options(const struct sk_buff *skb,
     360                 :             :                        struct mptcp_options_received *mp_opt)
     361                 :             : {
     362                 :      821561 :         const struct tcphdr *th = tcp_hdr(skb);
     363                 :      821561 :         const unsigned char *ptr;
     364                 :      821561 :         int length;
     365                 :             : 
     366                 :             :         /* Ensure that casting the whole status to u32 is efficient and safe */
     367                 :      821561 :         BUILD_BUG_ON(sizeof_field(struct mptcp_options_received, status) != sizeof(u32));
     368                 :      821561 :         BUILD_BUG_ON(!IS_ALIGNED(offsetof(struct mptcp_options_received, status),
     369                 :             :                                  sizeof(u32)));
     370                 :      821561 :         *(u32 *)&mp_opt->status = 0;
     371                 :             : 
     372                 :      821561 :         length = (th->doff * 4) - sizeof(struct tcphdr);
     373                 :      821561 :         ptr = (const unsigned char *)(th + 1);
     374                 :             : 
     375         [ +  + ]:     5121296 :         while (length > 0) {
     376                 :     4299735 :                 int opcode = *ptr++;
     377                 :     4299735 :                 int opsize;
     378                 :             : 
     379      [ +  +  - ]:     4299735 :                 switch (opcode) {
     380                 :             :                 case TCPOPT_EOL:
     381                 :             :                         return;
     382                 :     2648508 :                 case TCPOPT_NOP:        /* Ref: RFC 793 section 3.1 */
     383                 :     2648508 :                         length--;
     384                 :     2648508 :                         continue;
     385                 :     1651227 :                 default:
     386         [ +  - ]:     1651227 :                         if (length < 2)
     387                 :             :                                 return;
     388                 :     1651227 :                         opsize = *ptr++;
     389         [ +  - ]:     1651227 :                         if (opsize < 2) /* "silly options" */
     390                 :             :                                 return;
     391         [ +  - ]:     1651227 :                         if (opsize > length)
     392                 :             :                                 return; /* don't parse partial options */
     393         [ +  + ]:     1651227 :                         if (opcode == TCPOPT_MPTCP)
     394                 :      821646 :                                 mptcp_parse_option(skb, ptr, opsize, mp_opt);
     395                 :     1651227 :                         ptr += opsize - 2;
     396                 :     1651227 :                         length -= opsize;
     397                 :             :                 }
     398                 :             :         }
     399                 :             : }
     400                 :             : 
     401                 :        1858 : bool mptcp_syn_options(struct sock *sk, const struct sk_buff *skb,
     402                 :             :                        unsigned int *size, struct mptcp_out_options *opts)
     403                 :             : {
     404         [ +  + ]:        1858 :         struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
     405                 :             : 
     406                 :             :         /* we will use snd_isn to detect first pkt [re]transmission
     407                 :             :          * in mptcp_established_options_mp()
     408                 :             :          */
     409                 :        1858 :         subflow->snd_isn = TCP_SKB_CB(skb)->end_seq;
     410         [ +  + ]:        1858 :         if (subflow->request_mptcp) {
     411                 :        1276 :                 opts->suboptions = OPTION_MPTCP_MPC_SYN;
     412                 :        1276 :                 opts->csum_reqd = mptcp_is_checksum_enabled(sock_net(sk));
     413                 :        1276 :                 opts->allow_join_id0 = mptcp_allow_join_id0(sock_net(sk));
     414                 :        1276 :                 *size = TCPOLEN_MPTCP_MPC_SYN;
     415                 :        1276 :                 return true;
     416         [ +  + ]:         582 :         } else if (subflow->request_join) {
     417         [ -  + ]:         570 :                 pr_debug("remote_token=%u, nonce=%u\n", subflow->remote_token,
     418                 :             :                          subflow->local_nonce);
     419                 :         570 :                 opts->suboptions = OPTION_MPTCP_MPJ_SYN;
     420                 :         570 :                 opts->join_id = subflow->local_id;
     421                 :         570 :                 opts->token = subflow->remote_token;
     422                 :         570 :                 opts->nonce = subflow->local_nonce;
     423                 :         570 :                 opts->backup = subflow->request_bkup;
     424                 :         570 :                 *size = TCPOLEN_MPTCP_MPJ_SYN;
     425                 :         570 :                 return true;
     426                 :             :         }
     427                 :             :         return false;
     428                 :             : }
     429                 :             : 
     430                 :         986 : static void clear_3rdack_retransmission(struct sock *sk)
     431                 :             : {
     432                 :         986 :         struct inet_connection_sock *icsk = inet_csk(sk);
     433                 :             : 
     434                 :         986 :         sk_stop_timer(sk, &icsk->icsk_delack_timer);
     435                 :         986 :         icsk->icsk_ack.timeout = 0;
     436                 :         986 :         icsk->icsk_ack.ato = 0;
     437                 :         986 :         icsk->icsk_ack.pending &= ~(ICSK_ACK_SCHED | ICSK_ACK_TIMER);
     438                 :         986 : }
     439                 :             : 
     440                 :     1634548 : static bool mptcp_established_options_mp(struct sock *sk, struct sk_buff *skb,
     441                 :             :                                          bool snd_data_fin_enable,
     442                 :             :                                          unsigned int *size,
     443                 :             :                                          struct mptcp_out_options *opts)
     444                 :             : {
     445         [ -  + ]:     1634548 :         struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
     446         [ -  + ]:     1634548 :         struct mptcp_sock *msk = mptcp_sk(subflow->conn);
     447                 :     1634548 :         struct mptcp_ext *mpext;
     448                 :     1634548 :         unsigned int data_len;
     449                 :     1634548 :         u8 len;
     450                 :             : 
     451                 :             :         /* When skb is not available, we better over-estimate the emitted
     452                 :             :          * options len. A full DSS option (28 bytes) is longer than
     453                 :             :          * TCPOLEN_MPTCP_MPC_ACK_DATA(22) or TCPOLEN_MPTCP_MPJ_ACK(24), so
     454                 :             :          * tell the caller to defer the estimate to
     455                 :             :          * mptcp_established_options_dss(), which will reserve enough space.
     456                 :             :          */
     457         [ +  + ]:     1634548 :         if (!skb)
     458                 :             :                 return false;
     459                 :             : 
     460                 :             :         /* MPC/MPJ needed only on 3rd ack packet, DATA_FIN and TCP shutdown take precedence */
     461   [ +  +  +  +  :      707544 :         if (READ_ONCE(subflow->fully_established) || snd_data_fin_enable ||
                   +  + ]
     462         [ +  + ]:        2651 :             subflow->snd_isn != TCP_SKB_CB(skb)->seq ||
     463         [ +  + ]:        2201 :             sk->sk_state != TCP_ESTABLISHED)
     464                 :             :                 return false;
     465                 :             : 
     466         [ +  + ]:        2201 :         if (subflow->mp_capable) {
     467         [ +  + ]:        1698 :                 mpext = mptcp_get_ext(skb);
     468         [ +  + ]:        1139 :                 data_len = mpext ? mpext->data_len : 0;
     469                 :             : 
     470                 :             :                 /* we will check ops->data_len in mptcp_write_options() to
     471                 :             :                  * discriminate between TCPOLEN_MPTCP_MPC_ACK_DATA and
     472                 :             :                  * TCPOLEN_MPTCP_MPC_ACK
     473                 :             :                  */
     474                 :        1698 :                 opts->data_len = data_len;
     475                 :        1698 :                 opts->suboptions = OPTION_MPTCP_MPC_ACK;
     476                 :        1698 :                 opts->sndr_key = subflow->local_key;
     477                 :        1698 :                 opts->rcvr_key = subflow->remote_key;
     478         [ -  + ]:        1698 :                 opts->csum_reqd = READ_ONCE(msk->csum_enabled);
     479                 :        1698 :                 opts->allow_join_id0 = mptcp_allow_join_id0(sock_net(sk));
     480                 :             : 
     481                 :             :                 /* Section 3.1.
     482                 :             :                  * The MP_CAPABLE option is carried on the SYN, SYN/ACK, and ACK
     483                 :             :                  * packets that start the first subflow of an MPTCP connection,
     484                 :             :                  * as well as the first packet that carries data
     485                 :             :                  */
     486         [ +  + ]:        1698 :                 if (data_len > 0) {
     487                 :         580 :                         len = TCPOLEN_MPTCP_MPC_ACK_DATA;
     488         [ +  + ]:         580 :                         if (opts->csum_reqd) {
     489                 :             :                                 /* we need to propagate more info to csum the pseudo hdr */
     490                 :           4 :                                 opts->data_seq = mpext->data_seq;
     491                 :           4 :                                 opts->subflow_seq = mpext->subflow_seq;
     492                 :           4 :                                 opts->csum = mpext->csum;
     493                 :           4 :                                 len += TCPOLEN_MPTCP_DSS_CHECKSUM;
     494                 :             :                         }
     495                 :         580 :                         *size = ALIGN(len, 4);
     496                 :             :                 } else {
     497                 :        1118 :                         *size = TCPOLEN_MPTCP_MPC_ACK;
     498                 :             :                 }
     499                 :             : 
     500         [ -  + ]:        1698 :                 pr_debug("subflow=%p, local_key=%llu, remote_key=%llu map_len=%d\n",
     501                 :             :                          subflow, subflow->local_key, subflow->remote_key,
     502                 :             :                          data_len);
     503                 :             : 
     504                 :        1698 :                 return true;
     505         [ +  + ]:         503 :         } else if (subflow->mp_join) {
     506                 :         503 :                 opts->suboptions = OPTION_MPTCP_MPJ_ACK;
     507                 :         503 :                 memcpy(opts->hmac, subflow->hmac, MPTCPOPT_HMAC_LEN);
     508                 :         503 :                 *size = TCPOLEN_MPTCP_MPJ_ACK;
     509         [ -  + ]:         503 :                 pr_debug("subflow=%p\n", subflow);
     510                 :             : 
     511                 :             :                 /* we can use the full delegate action helper only from BH context
     512                 :             :                  * If we are in process context - sk is flushing the backlog at
     513                 :             :                  * socket lock release time - just set the appropriate flag, will
     514                 :             :                  * be handled by the release callback
     515                 :             :                  */
     516         [ +  + ]:         503 :                 if (sock_owned_by_user(sk))
     517                 :         416 :                         set_bit(MPTCP_DELEGATE_ACK, &subflow->delegated_status);
     518                 :             :                 else
     519                 :          87 :                         mptcp_subflow_delegate(subflow, MPTCP_DELEGATE_ACK);
     520                 :         503 :                 return true;
     521                 :             :         }
     522                 :             :         return false;
     523                 :             : }
     524                 :             : 
     525                 :       22314 : static void mptcp_write_data_fin(struct mptcp_subflow_context *subflow,
     526                 :             :                                  struct sk_buff *skb, struct mptcp_ext *ext)
     527                 :             : {
     528                 :             :         /* The write_seq value has already been incremented, so the actual
     529                 :             :          * sequence number for the DATA_FIN is one less.
     530                 :             :          */
     531         [ -  + ]:       22314 :         u64 data_fin_tx_seq = READ_ONCE(mptcp_sk(subflow->conn)->write_seq) - 1;
     532                 :             : 
     533   [ +  +  -  + ]:       22314 :         if (!ext->use_map || !skb->len) {
     534                 :             :                 /* RFC6824 requires a DSS mapping with specific values
     535                 :             :                  * if DATA_FIN is set but no data payload is mapped
     536                 :             :                  */
     537                 :        7224 :                 ext->data_fin = 1;
     538                 :        7224 :                 ext->use_map = 1;
     539                 :        7224 :                 ext->dsn64 = 1;
     540                 :        7224 :                 ext->data_seq = data_fin_tx_seq;
     541                 :        7224 :                 ext->subflow_seq = 0;
     542                 :        7224 :                 ext->data_len = 1;
     543         [ +  + ]:       15090 :         } else if (ext->data_seq + ext->data_len == data_fin_tx_seq) {
     544                 :             :                 /* If there's an existing DSS mapping and it is the
     545                 :             :                  * final mapping, DATA_FIN consumes 1 additional byte of
     546                 :             :                  * mapping space.
     547                 :             :                  */
     548                 :         767 :                 ext->data_fin = 1;
     549                 :         767 :                 ext->data_len++;
     550                 :             :         }
     551                 :       22314 : }
     552                 :             : 
     553                 :     1632347 : static bool mptcp_established_options_dss(struct sock *sk, struct sk_buff *skb,
     554                 :             :                                           bool snd_data_fin_enable,
     555                 :             :                                           unsigned int *size,
     556                 :             :                                           struct mptcp_out_options *opts)
     557                 :             : {
     558         [ -  + ]:     1632347 :         struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
     559         [ -  + ]:     1632347 :         struct mptcp_sock *msk = mptcp_sk(subflow->conn);
     560                 :     1632347 :         unsigned int dss_size = 0;
     561                 :     1632347 :         struct mptcp_ext *mpext;
     562                 :     1632347 :         unsigned int ack_size;
     563                 :     1632347 :         bool ret = false;
     564                 :     1632347 :         u64 ack_seq;
     565                 :             : 
     566         [ -  + ]:     1632347 :         opts->csum_reqd = READ_ONCE(msk->csum_enabled);
     567         [ +  + ]:     1632347 :         mpext = skb ? mptcp_get_ext(skb) : NULL;
     568                 :             : 
     569   [ +  +  -  +  :      705343 :         if (!skb || (mpext && mpext->use_map) || snd_data_fin_enable) {
                   +  + ]
     570                 :     1321457 :                 unsigned int map_size = TCPOLEN_MPTCP_DSS_BASE + TCPOLEN_MPTCP_DSS_MAP64;
     571                 :             : 
     572         [ +  + ]:     1321457 :                 if (mpext) {
     573         [ +  + ]:      387229 :                         if (opts->csum_reqd)
     574                 :        1596 :                                 map_size += TCPOLEN_MPTCP_DSS_CHECKSUM;
     575                 :             : 
     576                 :      387229 :                         opts->ext_copy = *mpext;
     577                 :             :                 }
     578                 :             : 
     579                 :     1321457 :                 dss_size = map_size;
     580         [ +  + ]:     1321457 :                 if (skb && snd_data_fin_enable)
     581                 :       22314 :                         mptcp_write_data_fin(subflow, skb, &opts->ext_copy);
     582                 :     1321457 :                 opts->suboptions = OPTION_MPTCP_DSS;
     583                 :     1321457 :                 ret = true;
     584                 :             :         }
     585                 :             : 
     586                 :             :         /* passive sockets msk will set the 'can_ack' after accept(), even
     587                 :             :          * if the first subflow may have the already the remote key handy
     588                 :             :          */
     589                 :     1632347 :         opts->ext_copy.use_ack = 0;
     590   [ +  +  +  + ]:     1632347 :         if (!READ_ONCE(msk->can_ack)) {
     591                 :          18 :                 *size = ALIGN(dss_size, 4);
     592                 :          18 :                 return ret;
     593                 :             :         }
     594                 :             : 
     595                 :     1632329 :         ack_seq = READ_ONCE(msk->ack_seq);
     596   [ +  +  +  + ]:     1632329 :         if (READ_ONCE(msk->use_64bit_ack)) {
     597                 :     1135805 :                 ack_size = TCPOLEN_MPTCP_DSS_ACK64;
     598                 :     1135805 :                 opts->ext_copy.data_ack = ack_seq;
     599                 :     1135805 :                 opts->ext_copy.ack64 = 1;
     600                 :             :         } else {
     601                 :      496524 :                 ack_size = TCPOLEN_MPTCP_DSS_ACK32;
     602                 :      496524 :                 opts->ext_copy.data_ack32 = (uint32_t)ack_seq;
     603                 :      496524 :                 opts->ext_copy.ack64 = 0;
     604                 :             :         }
     605                 :     1632329 :         opts->ext_copy.use_ack = 1;
     606                 :     1632329 :         opts->suboptions = OPTION_MPTCP_DSS;
     607                 :             : 
     608                 :             :         /* Add kind/length/subtype/flag overhead if mapping is not populated */
     609         [ +  + ]:     1632329 :         if (dss_size == 0)
     610                 :      310890 :                 ack_size += TCPOLEN_MPTCP_DSS_BASE;
     611                 :             : 
     612                 :     1632329 :         dss_size += ack_size;
     613                 :             : 
     614                 :     1632329 :         *size = ALIGN(dss_size, 4);
     615                 :     1632329 :         return true;
     616                 :             : }
     617                 :             : 
     618                 :         764 : static u64 add_addr_generate_hmac(u64 key1, u64 key2,
     619                 :             :                                   struct mptcp_addr_info *addr)
     620                 :             : {
     621                 :         764 :         u16 port = ntohs(addr->port);
     622                 :         764 :         u8 hmac[SHA256_DIGEST_SIZE];
     623                 :         764 :         u8 msg[19];
     624                 :         764 :         int i = 0;
     625                 :             : 
     626                 :         764 :         msg[i++] = addr->id;
     627         [ +  + ]:         764 :         if (addr->family == AF_INET) {
     628                 :         594 :                 memcpy(&msg[i], &addr->addr.s_addr, 4);
     629                 :         594 :                 i += 4;
     630                 :             :         }
     631                 :             : #if IS_ENABLED(CONFIG_MPTCP_IPV6)
     632         [ +  - ]:         170 :         else if (addr->family == AF_INET6) {
     633                 :         170 :                 memcpy(&msg[i], &addr->addr6.s6_addr, 16);
     634                 :         170 :                 i += 16;
     635                 :             :         }
     636                 :             : #endif
     637                 :         764 :         msg[i++] = port >> 8;
     638                 :         764 :         msg[i++] = port & 0xFF;
     639                 :             : 
     640                 :         764 :         mptcp_crypto_hmac_sha(key1, key2, msg, i, hmac);
     641                 :             : 
     642                 :         764 :         return get_unaligned_be64(&hmac[SHA256_DIGEST_SIZE - sizeof(u64)]);
     643                 :             : }
     644                 :             : 
     645                 :     1634544 : static bool mptcp_established_options_add_addr(struct sock *sk, struct sk_buff *skb,
     646                 :             :                                                unsigned int *size,
     647                 :             :                                                unsigned int remaining,
     648                 :             :                                                struct mptcp_out_options *opts)
     649                 :             : {
     650         [ -  + ]:     1634544 :         struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
     651         [ -  + ]:     1634544 :         struct mptcp_sock *msk = mptcp_sk(subflow->conn);
     652                 :     1634544 :         bool drop_other_suboptions = false;
     653                 :     1634544 :         unsigned int opt_size = *size;
     654                 :     1634544 :         bool echo;
     655                 :     1634544 :         int len;
     656                 :             : 
     657                 :             :         /* add addr will strip the existing options, be sure to avoid breaking
     658                 :             :          * MPC/MPJ handshakes
     659                 :             :          */
     660         [ +  + ]:     1634544 :         if (!mptcp_pm_should_add_signal(msk) ||
     661   [ +  -  -  + ]:        1512 :             (opts->suboptions & (OPTION_MPTCP_MPJ_ACK | OPTION_MPTCP_MPC_ACK)) ||
     662                 :         756 :             !mptcp_pm_add_addr_signal(msk, skb, opt_size, remaining, &opts->addr,
     663                 :             :                     &echo, &drop_other_suboptions))
     664                 :     1633788 :                 return false;
     665                 :             : 
     666                 :             :         /*
     667                 :             :          * Later on, mptcp_write_options() will enforce mutually exclusion with
     668                 :             :          * DSS, bail out if such option is set and we can't drop it.
     669                 :             :          */
     670   [ +  +  +  - ]:         756 :         if (drop_other_suboptions)
     671                 :         756 :                 remaining += opt_size;
     672         [ #  # ]:           0 :         else if (opts->suboptions & OPTION_MPTCP_DSS)
     673                 :             :                 return false;
     674                 :             : 
     675   [ +  +  +  + ]:         756 :         len = mptcp_add_addr_len(opts->addr.family, echo, !!opts->addr.port);
     676         [ -  + ]:         756 :         if (remaining < len)
     677                 :             :                 return false;
     678                 :             : 
     679                 :         756 :         *size = len;
     680   [ +  +  +  - ]:         756 :         if (drop_other_suboptions) {
     681         [ -  + ]:         756 :                 pr_debug("drop other suboptions\n");
     682                 :         756 :                 opts->suboptions = 0;
     683                 :             : 
     684                 :             :                 /* note that e.g. DSS could have written into the memory
     685                 :             :                  * aliased by ahmac, we must reset the field here
     686                 :             :                  * to avoid appending the hmac even for ADD_ADDR echo
     687                 :             :                  * options
     688                 :             :                  */
     689                 :         756 :                 opts->ahmac = 0;
     690                 :         756 :                 *size -= opt_size;
     691                 :             :         }
     692                 :         756 :         opts->suboptions |= OPTION_MPTCP_ADD_ADDR;
     693   [ +  +  +  + ]:         756 :         if (!echo) {
     694         [ +  - ]:         404 :                 MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_ADDADDRTX);
     695                 :         404 :                 opts->ahmac = add_addr_generate_hmac(READ_ONCE(msk->local_key),
     696                 :         404 :                                                      READ_ONCE(msk->remote_key),
     697                 :             :                                                      &opts->addr);
     698                 :             :         } else {
     699         [ +  - ]:         352 :                 MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_ECHOADDTX);
     700                 :             :         }
     701   [ -  +  -  - ]:         756 :         pr_debug("addr_id=%d, ahmac=%llu, echo=%d, port=%d\n",
     702                 :             :                  opts->addr.id, opts->ahmac, echo, ntohs(opts->addr.port));
     703                 :             : 
     704                 :             :         return true;
     705                 :             : }
     706                 :             : 
     707                 :     1633788 : static bool mptcp_established_options_rm_addr(struct sock *sk,
     708                 :             :                                               unsigned int *size,
     709                 :             :                                               unsigned int remaining,
     710                 :             :                                               struct mptcp_out_options *opts)
     711                 :             : {
     712         [ -  + ]:     1633788 :         struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
     713         [ -  + ]:     1633788 :         struct mptcp_sock *msk = mptcp_sk(subflow->conn);
     714                 :     1633788 :         struct mptcp_rm_list rm_list;
     715                 :     1633788 :         int i, len;
     716                 :             : 
     717   [ +  +  -  + ]:     1633894 :         if (!mptcp_pm_should_rm_signal(msk) ||
     718                 :         106 :             !(mptcp_pm_rm_addr_signal(msk, remaining, &rm_list)))
     719                 :     1633682 :                 return false;
     720                 :             : 
     721         [ -  + ]:      407440 :         len = mptcp_rm_addr_len(&rm_list);
     722                 :         106 :         if (len < 0)
     723                 :             :                 return false;
     724         [ -  + ]:         106 :         if (remaining < len)
     725                 :             :                 return false;
     726                 :             : 
     727                 :         106 :         *size = len;
     728                 :         106 :         opts->suboptions |= OPTION_MPTCP_RM_ADDR;
     729                 :         106 :         opts->rm_list = rm_list;
     730                 :             : 
     731         [ +  + ]:         220 :         for (i = 0; i < opts->rm_list.nr; i++)
     732         [ -  + ]:         114 :                 pr_debug("rm_list_ids[%d]=%d\n", i, opts->rm_list.ids[i]);
     733                 :         106 :         MPTCP_ADD_STATS(sock_net(sk), MPTCP_MIB_RMADDRTX, opts->rm_list.nr);
     734                 :         106 :         return true;
     735                 :             : }
     736                 :             : 
     737                 :     1634544 : static bool mptcp_established_options_mp_prio(struct sock *sk,
     738                 :             :                                               unsigned int *size,
     739                 :             :                                               unsigned int remaining,
     740                 :             :                                               struct mptcp_out_options *opts)
     741                 :             : {
     742         [ +  + ]:     1634544 :         struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
     743                 :             : 
     744                 :             :         /* can't send MP_PRIO with MPC, as they share the same option space:
     745                 :             :          * 'backup'. Also it makes no sense at all
     746                 :             :          */
     747   [ +  +  +  - ]:     1634544 :         if (!subflow->send_mp_prio || (opts->suboptions & OPTIONS_MPTCP_MPC))
     748                 :             :                 return false;
     749                 :             : 
     750                 :             :         /* account for the trailing 'nop' option */
     751         [ +  - ]:          28 :         if (remaining < TCPOLEN_MPTCP_PRIO_ALIGN)
     752                 :             :                 return false;
     753                 :             : 
     754                 :          28 :         *size = TCPOLEN_MPTCP_PRIO_ALIGN;
     755                 :          28 :         opts->suboptions |= OPTION_MPTCP_PRIO;
     756                 :          28 :         opts->backup = subflow->request_bkup;
     757                 :             : 
     758         [ -  + ]:          28 :         pr_debug("prio=%d\n", opts->backup);
     759                 :             : 
     760                 :             :         return true;
     761                 :             : }
     762                 :             : 
     763                 :         446 : static noinline bool mptcp_established_options_rst(struct sock *sk, struct sk_buff *skb,
     764                 :             :                                                    unsigned int *size,
     765                 :             :                                                    unsigned int remaining,
     766                 :             :                                                    struct mptcp_out_options *opts)
     767                 :             : {
     768         [ +  - ]:         446 :         const struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
     769                 :             : 
     770         [ +  - ]:         446 :         if (remaining < TCPOLEN_MPTCP_RST)
     771                 :             :                 return false;
     772                 :             : 
     773                 :         446 :         *size = TCPOLEN_MPTCP_RST;
     774                 :         446 :         opts->suboptions |= OPTION_MPTCP_RST;
     775                 :         446 :         opts->reset_transient = subflow->reset_transient;
     776                 :         446 :         opts->reset_reason = subflow->reset_reason;
     777         [ +  - ]:         446 :         MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPRSTTX);
     778                 :             : 
     779                 :             :         return true;
     780                 :             : }
     781                 :             : 
     782                 :         446 : static bool mptcp_established_options_fastclose(struct sock *sk,
     783                 :             :                                                 unsigned int *size,
     784                 :             :                                                 unsigned int remaining,
     785                 :             :                                                 struct mptcp_out_options *opts)
     786                 :             : {
     787         [ -  + ]:         446 :         struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
     788         [ -  + ]:         446 :         struct mptcp_sock *msk = mptcp_sk(subflow->conn);
     789                 :             : 
     790         [ +  + ]:         446 :         if (likely(!subflow->send_fastclose))
     791                 :             :                 return false;
     792                 :             : 
     793         [ +  - ]:         384 :         if (remaining < TCPOLEN_MPTCP_FASTCLOSE)
     794                 :             :                 return false;
     795                 :             : 
     796                 :         384 :         *size = TCPOLEN_MPTCP_FASTCLOSE;
     797                 :         384 :         opts->suboptions |= OPTION_MPTCP_FASTCLOSE;
     798                 :         384 :         opts->rcvr_key = READ_ONCE(msk->remote_key);
     799                 :             : 
     800         [ -  + ]:         384 :         pr_debug("FASTCLOSE key=%llu\n", opts->rcvr_key);
     801         [ +  - ]:         384 :         MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPFASTCLOSETX);
     802                 :             :         return true;
     803                 :             : }
     804                 :             : 
     805                 :     1632409 : static bool mptcp_established_options_mp_fail(struct sock *sk,
     806                 :             :                                               unsigned int *size,
     807                 :             :                                               unsigned int remaining,
     808                 :             :                                               struct mptcp_out_options *opts)
     809                 :             : {
     810         [ +  + ]:     1632409 :         struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
     811                 :             : 
     812         [ +  + ]:     1632409 :         if (likely(!subflow->send_mp_fail))
     813                 :             :                 return false;
     814                 :             : 
     815         [ +  - ]:           6 :         if (remaining < TCPOLEN_MPTCP_FAIL)
     816                 :             :                 return false;
     817                 :             : 
     818                 :           6 :         *size = TCPOLEN_MPTCP_FAIL;
     819                 :           6 :         opts->suboptions |= OPTION_MPTCP_FAIL;
     820                 :           6 :         opts->fail_seq = subflow->map_seq;
     821                 :             : 
     822         [ -  + ]:           6 :         pr_debug("MP_FAIL fail_seq=%llu\n", opts->fail_seq);
     823         [ +  - ]:           6 :         MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPFAILTX);
     824                 :             : 
     825                 :             :         return true;
     826                 :             : }
     827                 :             : 
     828                 :     1676754 : bool mptcp_established_options(struct sock *sk, struct sk_buff *skb,
     829                 :             :                                unsigned int *size, unsigned int remaining,
     830                 :             :                                struct mptcp_out_options *opts)
     831                 :             : {
     832         [ -  + ]:     1676754 :         struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
     833         [ -  + ]:     1676754 :         struct mptcp_sock *msk = mptcp_sk(subflow->conn);
     834                 :     1676754 :         unsigned int opt_size = 0;
     835                 :     1676754 :         bool snd_data_fin;
     836                 :     1676754 :         bool ret = false;
     837                 :             : 
     838                 :     1676754 :         opts->suboptions = 0;
     839                 :             : 
     840   [ +  +  +  + ]:     1676754 :         if (unlikely(__mptcp_check_fallback(msk) && !mptcp_check_infinite_map(skb)))
     841                 :             :                 return false;
     842                 :             : 
     843   [ +  +  +  + ]:     1634994 :         if (unlikely(skb && TCP_SKB_CB(skb)->tcp_flags & TCPHDR_RST)) {
     844   [ +  +  +  + ]:         508 :                 if (mptcp_established_options_fastclose(sk, &opt_size, remaining, opts) ||
     845                 :          62 :                     mptcp_established_options_mp_fail(sk, &opt_size, remaining, opts)) {
     846                 :         386 :                         *size += opt_size;
     847                 :         386 :                         remaining -= opt_size;
     848                 :             :                 }
     849                 :             :                 /* MP_RST can be used with MP_FASTCLOSE and MP_FAIL if there is room */
     850         [ +  - ]:         446 :                 if (mptcp_established_options_rst(sk, skb, &opt_size, remaining, opts)) {
     851                 :         446 :                         *size += opt_size;
     852                 :         446 :                         remaining -= opt_size;
     853                 :             :                 }
     854                 :         446 :                 return true;
     855                 :             :         }
     856                 :             : 
     857         [ +  + ]:     1634548 :         snd_data_fin = mptcp_data_fin_enabled(msk);
     858         [ +  + ]:     1634548 :         if (mptcp_established_options_mp(sk, skb, snd_data_fin, &opt_size, opts))
     859                 :             :                 ret = true;
     860         [ +  - ]:     1632347 :         else if (mptcp_established_options_dss(sk, skb, snd_data_fin, &opt_size, opts)) {
     861                 :     1632347 :                 unsigned int mp_fail_size;
     862                 :             : 
     863                 :     1632347 :                 ret = true;
     864         [ +  + ]:     1632347 :                 if (mptcp_established_options_mp_fail(sk, &mp_fail_size,
     865                 :             :                                                       remaining - opt_size, opts)) {
     866                 :           4 :                         *size += opt_size + mp_fail_size;
     867                 :           4 :                         remaining -= opt_size - mp_fail_size;
     868                 :           4 :                         return true;
     869                 :             :                 }
     870                 :             :         }
     871                 :             : 
     872                 :             :         /* we reserved enough space for the above options, and exceeding the
     873                 :             :          * TCP option space would be fatal
     874                 :             :          */
     875   [ -  +  -  + ]:     1634544 :         if (WARN_ON_ONCE(opt_size > remaining))
     876                 :             :                 return false;
     877                 :             : 
     878                 :     1634544 :         *size += opt_size;
     879                 :     1634544 :         remaining -= opt_size;
     880         [ +  + ]:     1634544 :         if (mptcp_established_options_add_addr(sk, skb, &opt_size, remaining, opts)) {
     881                 :         756 :                 *size += opt_size;
     882                 :         756 :                 remaining -= opt_size;
     883                 :         756 :                 ret = true;
     884         [ +  + ]:     1633788 :         } else if (mptcp_established_options_rm_addr(sk, &opt_size, remaining, opts)) {
     885                 :         106 :                 *size += opt_size;
     886                 :         106 :                 remaining -= opt_size;
     887                 :         106 :                 ret = true;
     888                 :             :         }
     889                 :             : 
     890         [ +  + ]:     1634544 :         if (mptcp_established_options_mp_prio(sk, &opt_size, remaining, opts)) {
     891                 :          28 :                 *size += opt_size;
     892                 :          28 :                 remaining -= opt_size;
     893                 :          28 :                 ret = true;
     894                 :             :         }
     895                 :             : 
     896                 :             :         return ret;
     897                 :             : }
     898                 :             : 
     899                 :        1782 : bool mptcp_synack_options(const struct request_sock *req, unsigned int *size,
     900                 :             :                           struct mptcp_out_options *opts)
     901                 :             : {
     902                 :        1782 :         struct mptcp_subflow_request_sock *subflow_req = mptcp_subflow_rsk(req);
     903                 :             : 
     904         [ +  + ]:        1782 :         if (subflow_req->mp_capable) {
     905                 :        1186 :                 opts->suboptions = OPTION_MPTCP_MPC_SYNACK;
     906                 :        1186 :                 opts->sndr_key = subflow_req->local_key;
     907                 :        1186 :                 opts->csum_reqd = subflow_req->csum_reqd;
     908                 :        1186 :                 opts->allow_join_id0 = subflow_req->allow_join_id0;
     909                 :        1186 :                 *size = TCPOLEN_MPTCP_MPC_SYNACK;
     910         [ -  + ]:        1186 :                 pr_debug("subflow_req=%p, local_key=%llu\n",
     911                 :             :                          subflow_req, subflow_req->local_key);
     912                 :        1186 :                 return true;
     913         [ +  + ]:         596 :         } else if (subflow_req->mp_join) {
     914                 :         520 :                 opts->suboptions = OPTION_MPTCP_MPJ_SYNACK;
     915                 :         520 :                 opts->backup = subflow_req->request_bkup;
     916                 :         520 :                 opts->join_id = subflow_req->local_id;
     917                 :         520 :                 opts->thmac = subflow_req->thmac;
     918                 :         520 :                 opts->nonce = subflow_req->local_nonce;
     919         [ -  + ]:         520 :                 pr_debug("req=%p, bkup=%u, id=%u, thmac=%llu, nonce=%u\n",
     920                 :             :                          subflow_req, opts->backup, opts->join_id,
     921                 :             :                          opts->thmac, opts->nonce);
     922                 :         520 :                 *size = TCPOLEN_MPTCP_MPJ_SYNACK;
     923                 :         520 :                 return true;
     924                 :             :         }
     925                 :             :         return false;
     926                 :             : }
     927                 :             : 
     928                 :      816343 : static bool check_fully_established(struct mptcp_sock *msk, struct sock *ssk,
     929                 :             :                                     struct mptcp_subflow_context *subflow,
     930                 :             :                                     struct sk_buff *skb,
     931                 :             :                                     struct mptcp_options_received *mp_opt)
     932                 :             : {
     933                 :             :         /* here we can process OoO, in-window pkts, only in-sequence 4th ack
     934                 :             :          * will make the subflow fully established
     935                 :             :          */
     936   [ +  +  +  + ]:      816343 :         if (likely(READ_ONCE(subflow->fully_established))) {
     937                 :             :                 /* on passive sockets, check for 3rd ack retransmission
     938                 :             :                  * note that msk is always set by subflow_syn_recv_sock()
     939                 :             :                  * for mp_join subflows
     940                 :             :                  */
     941         [ +  + ]:      814703 :                 if (TCP_SKB_CB(skb)->seq == subflow->ssn_offset + 1 &&
     942   [ +  +  +  + ]:      132481 :                     TCP_SKB_CB(skb)->end_seq == TCP_SKB_CB(skb)->seq &&
     943         [ +  + ]:       53302 :                     subflow->mp_join && (mp_opt->suboptions & OPTIONS_MPTCP_MPJ) &&
     944         [ +  - ]:         509 :                     !subflow->request_join)
     945                 :         509 :                         tcp_send_ack(ssk);
     946                 :      814703 :                 goto check_notify;
     947                 :             :         }
     948                 :             : 
     949                 :             :         /* we must process OoO packets before the first subflow is fully
     950                 :             :          * established. OoO packets are instead a protocol violation
     951                 :             :          * for MP_JOIN subflows as the peer must not send any data
     952                 :             :          * before receiving the forth ack - cfr. RFC 8684 section 3.2.
     953                 :             :          */
     954         [ +  + ]:        1640 :         if (TCP_SKB_CB(skb)->seq != subflow->ssn_offset + 1) {
     955         [ -  + ]:          56 :                 if (subflow->mp_join)
     956                 :           0 :                         goto reset;
     957   [ -  +  -  - ]:          56 :                 if (subflow->is_mptfo && mp_opt->suboptions & OPTION_MPTCP_MPC_ACK)
     958                 :           0 :                         goto set_fully_established;
     959                 :          56 :                 return subflow->mp_capable;
     960                 :             :         }
     961                 :             : 
     962         [ +  + ]:        1584 :         if (subflow->remote_key_valid &&
     963   [ +  +  -  +  :        1558 :             (((mp_opt->suboptions & OPTION_MPTCP_DSS) && mp_opt->use_ack) ||
                   +  + ]
     964                 :         143 :              ((mp_opt->suboptions & OPTION_MPTCP_ADD_ADDR) &&
     965   [ +  +  +  - ]:         143 :               (!mp_opt->echo || subflow->mp_join)))) {
     966                 :             :                 /* subflows are fully established as soon as we get any
     967                 :             :                  * additional ack, including ADD_ADDR.
     968                 :             :                  */
     969                 :        1550 :                 goto set_fully_established;
     970                 :             :         }
     971                 :             : 
     972                 :             :         /* If the first established packet does not contain MP_CAPABLE + data
     973                 :             :          * then fallback to TCP. Fallback scenarios requires a reset for
     974                 :             :          * MP_JOIN subflows.
     975                 :             :          */
     976         [ +  + ]:          34 :         if (!(mp_opt->suboptions & OPTIONS_MPTCP_MPC)) {
     977         [ +  - ]:           8 :                 if (subflow->mp_join)
     978                 :           8 :                         goto reset;
     979                 :           0 :                 subflow->mp_capable = 0;
     980         [ #  # ]:           0 :                 pr_fallback(msk);
     981                 :           0 :                 mptcp_do_fallback(ssk);
     982                 :           0 :                 return false;
     983                 :             :         }
     984                 :             : 
     985         [ -  + ]:          26 :         if (mp_opt->deny_join_id0)
     986                 :           0 :                 WRITE_ONCE(msk->pm.remote_deny_join_id0, true);
     987                 :             : 
     988   [ +  +  +  - ]:          26 :         if (unlikely(!READ_ONCE(msk->pm.server_side)))
     989                 :             :                 /* DO-NOT-MERGE: use WARN i/o pr_warn: only for MPTCP export */
     990   [ #  #  #  # ]:           0 :                 WARN_ONCE(1, "bogus mpc option on established client sk");
     991                 :             : 
     992                 :          26 : set_fully_established:
     993                 :        1576 :         mptcp_data_lock((struct sock *)msk);
     994                 :        1576 :         __mptcp_subflow_fully_established(msk, subflow, mp_opt);
     995                 :        1576 :         mptcp_data_unlock((struct sock *)msk);
     996                 :             : 
     997                 :      816279 : check_notify:
     998                 :             :         /* if the subflow is not already linked into the conn_list, we can't
     999                 :             :          * notify the PM: this subflow is still on the listener queue
    1000                 :             :          * and the PM possibly acquiring the subflow lock could race with
    1001                 :             :          * the listener close
    1002                 :             :          */
    1003   [ +  +  +  - ]:      816279 :         if (likely(subflow->pm_notified) || list_empty(&subflow->node))
    1004                 :             :                 return true;
    1005                 :             : 
    1006                 :        2082 :         subflow->pm_notified = 1;
    1007         [ +  + ]:        2082 :         if (subflow->mp_join) {
    1008                 :         986 :                 clear_3rdack_retransmission(ssk);
    1009                 :         986 :                 mptcp_pm_subflow_established(msk);
    1010                 :             :         } else {
    1011                 :        1096 :                 mptcp_pm_fully_established(msk, ssk);
    1012                 :             :         }
    1013                 :             :         return true;
    1014                 :             : 
    1015                 :           8 : reset:
    1016                 :           8 :         mptcp_subflow_reset(ssk);
    1017                 :           8 :         return false;
    1018                 :             : }
    1019                 :             : 
    1020                 :      176354 : u64 __mptcp_expand_seq(u64 old_seq, u64 cur_seq)
    1021                 :             : {
    1022                 :      176354 :         u32 old_seq32, cur_seq32;
    1023                 :             : 
    1024                 :      176354 :         old_seq32 = (u32)old_seq;
    1025                 :      176354 :         cur_seq32 = (u32)cur_seq;
    1026                 :      176354 :         cur_seq = (old_seq & GENMASK_ULL(63, 32)) + cur_seq32;
    1027   [ +  +  -  + ]:      176354 :         if (unlikely(cur_seq32 < old_seq32 && before(old_seq32, cur_seq32)))
    1028                 :           0 :                 return cur_seq + (1LL << 32);
    1029                 :             : 
    1030                 :             :         /* reverse wrap could happen, too */
    1031   [ +  +  -  + ]:      176354 :         if (unlikely(cur_seq32 > old_seq32 && after(old_seq32, cur_seq32)))
    1032                 :           0 :                 return cur_seq - (1LL << 32);
    1033                 :             :         return cur_seq;
    1034                 :             : }
    1035                 :             : 
    1036                 :           0 : static void __mptcp_snd_una_update(struct mptcp_sock *msk, u64 new_snd_una)
    1037                 :             : {
    1038                 :      186461 :         msk->bytes_acked += new_snd_una - msk->snd_una;
    1039                 :      186461 :         WRITE_ONCE(msk->snd_una, new_snd_una);
    1040                 :             : }
    1041                 :             : 
    1042                 :      812892 : static void ack_update_msk(struct mptcp_sock *msk,
    1043                 :             :                            struct sock *ssk,
    1044                 :             :                            struct mptcp_options_received *mp_opt)
    1045                 :             : {
    1046                 :      812892 :         u64 new_wnd_end, new_snd_una, snd_nxt = READ_ONCE(msk->snd_nxt);
    1047                 :      812892 :         struct sock *sk = (struct sock *)msk;
    1048                 :      812892 :         u64 old_snd_una;
    1049                 :             : 
    1050                 :      812892 :         mptcp_data_lock(sk);
    1051                 :             : 
    1052                 :             :         /* avoid ack expansion on update conflict, to reduce the risk of
    1053                 :             :          * wrongly expanding to a future ack sequence number, which is way
    1054                 :             :          * more dangerous than missing an ack
    1055                 :             :          */
    1056                 :      812892 :         old_snd_una = msk->snd_una;
    1057         [ +  + ]:      812892 :         new_snd_una = mptcp_expand_seq(old_snd_una, mp_opt->data_ack, mp_opt->ack64);
    1058                 :             : 
    1059                 :             :         /* ACK for data not even sent yet? Ignore.*/
    1060         [ +  + ]:      812892 :         if (unlikely(after64(new_snd_una, snd_nxt)))
    1061                 :          33 :                 new_snd_una = old_snd_una;
    1062                 :             : 
    1063         [ -  + ]:      812892 :         new_wnd_end = new_snd_una + tcp_sk(ssk)->snd_wnd;
    1064                 :             : 
    1065         [ +  + ]:      812892 :         if (after64(new_wnd_end, msk->wnd_end))
    1066                 :      225220 :                 WRITE_ONCE(msk->wnd_end, new_wnd_end);
    1067                 :             : 
    1068                 :             :         /* this assumes mptcp_incoming_options() is invoked after tcp_ack() */
    1069         [ +  + ]:      812892 :         if (after64(msk->wnd_end, snd_nxt))
    1070                 :      795725 :                 __mptcp_check_push(sk, ssk);
    1071                 :             : 
    1072         [ +  + ]:      812892 :         if (after64(new_snd_una, old_snd_una)) {
    1073                 :      212381 :                 __mptcp_snd_una_update(msk, new_snd_una);
    1074                 :      212381 :                 __mptcp_data_acked(sk);
    1075                 :             :         }
    1076                 :      812892 :         msk->last_ack_recv = tcp_jiffies32;
    1077                 :      812892 :         mptcp_data_unlock(sk);
    1078                 :             : 
    1079                 :      812892 :         trace_ack_update_msk(mp_opt->data_ack,
    1080                 :             :                              old_snd_una, new_snd_una,
    1081                 :      812892 :                              new_wnd_end, READ_ONCE(msk->wnd_end));
    1082                 :      812892 : }
    1083                 :             : 
    1084                 :        6831 : bool mptcp_update_rcv_data_fin(struct mptcp_sock *msk, u64 data_fin_seq, bool use_64bit)
    1085                 :             : {
    1086                 :             :         /* Skip if DATA_FIN was already received.
    1087                 :             :          * If updating simultaneously with the recvmsg loop, values
    1088                 :             :          * should match. If they mismatch, the peer is misbehaving and
    1089                 :             :          * we will prefer the most recent information.
    1090                 :             :          */
    1091   [ +  +  +  + ]:        6831 :         if (READ_ONCE(msk->rcv_data_fin))
    1092                 :             :                 return false;
    1093                 :             : 
    1094         [ +  + ]:        2180 :         WRITE_ONCE(msk->rcv_data_fin_seq,
    1095                 :             :                    mptcp_expand_seq(READ_ONCE(msk->ack_seq), data_fin_seq, use_64bit));
    1096                 :        2180 :         WRITE_ONCE(msk->rcv_data_fin, 1);
    1097                 :             : 
    1098                 :        2180 :         return true;
    1099                 :             : }
    1100                 :             : 
    1101                 :         692 : static bool add_addr_hmac_valid(struct mptcp_sock *msk,
    1102                 :             :                                 struct mptcp_options_received *mp_opt)
    1103                 :             : {
    1104                 :         692 :         u64 hmac = 0;
    1105                 :             : 
    1106         [ +  + ]:         692 :         if (mp_opt->echo)
    1107                 :             :                 return true;
    1108                 :             : 
    1109                 :         360 :         hmac = add_addr_generate_hmac(READ_ONCE(msk->remote_key),
    1110                 :         360 :                                       READ_ONCE(msk->local_key),
    1111                 :             :                                       &mp_opt->addr);
    1112                 :             : 
    1113         [ -  + ]:         360 :         pr_debug("msk=%p, ahmac=%llu, mp_opt->ahmac=%llu\n",
    1114                 :             :                  msk, hmac, mp_opt->ahmac);
    1115                 :             : 
    1116                 :         360 :         return hmac == mp_opt->ahmac;
    1117                 :             : }
    1118                 :             : 
    1119                 :             : /* Return false if a subflow has been reset, else return true */
    1120                 :      826699 : bool mptcp_incoming_options(struct sock *sk, struct sk_buff *skb)
    1121                 :             : {
    1122         [ -  + ]:      826699 :         struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
    1123         [ -  + ]:      826699 :         struct mptcp_sock *msk = mptcp_sk(subflow->conn);
    1124                 :      826699 :         struct mptcp_options_received mp_opt;
    1125                 :      826699 :         struct mptcp_ext *mpext;
    1126                 :             : 
    1127         [ +  + ]:      826699 :         if (__mptcp_check_fallback(msk)) {
    1128                 :             :                 /* Keep it simple and unconditionally trigger send data cleanup and
    1129                 :             :                  * pending queue spooling. We will need to acquire the data lock
    1130                 :             :                  * for more accurate checks, and once the lock is acquired, such
    1131                 :             :                  * helpers are cheap.
    1132                 :             :                  */
    1133                 :       10356 :                 mptcp_data_lock(subflow->conn);
    1134         [ +  + ]:       10356 :                 if (sk_stream_memory_free(sk))
    1135                 :       10316 :                         __mptcp_check_push(subflow->conn, sk);
    1136                 :             : 
    1137                 :             :                 /* on fallback we just need to ignore the msk-level snd_una, as
    1138                 :             :                  * this is really plain TCP
    1139                 :             :                  */
    1140                 :       10356 :                 __mptcp_snd_una_update(msk, READ_ONCE(msk->snd_nxt));
    1141                 :             : 
    1142                 :       10356 :                 __mptcp_data_acked(subflow->conn);
    1143                 :       10356 :                 mptcp_data_unlock(subflow->conn);
    1144                 :       10356 :                 return true;
    1145                 :             :         }
    1146                 :             : 
    1147                 :      816343 :         mptcp_get_options(skb, &mp_opt);
    1148                 :             : 
    1149                 :             :         /* The subflow can be in close state only if check_fully_established()
    1150                 :             :          * just sent a reset. If so, tell the caller to ignore the current packet.
    1151                 :             :          */
    1152         [ +  + ]:      816343 :         if (!check_fully_established(msk, sk, subflow, skb, &mp_opt))
    1153                 :          49 :                 return sk->sk_state != TCP_CLOSE;
    1154                 :             : 
    1155         [ +  + ]:      816294 :         if (unlikely(mp_opt.suboptions != OPTION_MPTCP_DSS)) {
    1156         [ +  + ]:        5469 :                 if ((mp_opt.suboptions & OPTION_MPTCP_FASTCLOSE) &&
    1157         [ +  + ]:         256 :                     READ_ONCE(msk->local_key) == mp_opt.rcvr_key) {
    1158                 :         246 :                         WRITE_ONCE(msk->rcv_fastclose, true);
    1159                 :         246 :                         mptcp_schedule_work((struct sock *)msk);
    1160         [ +  - ]:         246 :                         MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPFASTCLOSERX);
    1161                 :             :                 }
    1162                 :             : 
    1163   [ +  +  +  - ]:        6161 :                 if ((mp_opt.suboptions & OPTION_MPTCP_ADD_ADDR) &&
    1164                 :         692 :                     add_addr_hmac_valid(msk, &mp_opt)) {
    1165         [ +  + ]:         692 :                         if (!mp_opt.echo) {
    1166                 :         360 :                                 mptcp_pm_add_addr_received(sk, &mp_opt.addr);
    1167         [ +  - ]:         360 :                                 MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_ADDADDR);
    1168                 :             :                         } else {
    1169                 :         332 :                                 mptcp_pm_add_addr_echoed(msk, &mp_opt.addr);
    1170                 :         332 :                                 mptcp_pm_del_add_timer(msk, &mp_opt.addr, true);
    1171         [ +  - ]:         332 :                                 MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_ECHOADD);
    1172                 :             :                         }
    1173                 :             : 
    1174         [ +  + ]:         692 :                         if (mp_opt.addr.port)
    1175         [ +  - ]:          68 :                                 MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_PORTADD);
    1176                 :             :                 }
    1177                 :             : 
    1178         [ +  + ]:        5469 :                 if (mp_opt.suboptions & OPTION_MPTCP_RM_ADDR)
    1179                 :         106 :                         mptcp_pm_rm_addr_received(msk, &mp_opt.rm_list);
    1180                 :             : 
    1181         [ +  + ]:        5469 :                 if (mp_opt.suboptions & OPTION_MPTCP_PRIO) {
    1182                 :          40 :                         mptcp_pm_mp_prio_received(sk, mp_opt.backup);
    1183         [ +  - ]:          40 :                         MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPPRIORX);
    1184                 :             :                 }
    1185                 :             : 
    1186         [ +  + ]:        5469 :                 if (mp_opt.suboptions & OPTION_MPTCP_FAIL) {
    1187                 :           6 :                         mptcp_pm_mp_fail_received(sk, mp_opt.fail_seq);
    1188         [ +  - ]:           6 :                         MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPFAILRX);
    1189                 :             :                 }
    1190                 :             : 
    1191         [ +  + ]:        5469 :                 if (mp_opt.suboptions & OPTION_MPTCP_RST) {
    1192                 :         250 :                         subflow->reset_seen = 1;
    1193                 :         250 :                         subflow->reset_reason = mp_opt.reset_reason;
    1194                 :         250 :                         subflow->reset_transient = mp_opt.reset_transient;
    1195         [ +  - ]:         250 :                         MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPRSTRX);
    1196                 :             :                 }
    1197                 :             : 
    1198         [ +  + ]:        5469 :                 if (!(mp_opt.suboptions & OPTION_MPTCP_DSS))
    1199                 :             :                         return true;
    1200                 :             :         }
    1201                 :             : 
    1202                 :             :         /* we can't wait for recvmsg() to update the ack_seq, otherwise
    1203                 :             :          * monodirectional flows will stuck
    1204                 :             :          */
    1205         [ +  + ]:      813522 :         if (mp_opt.use_ack)
    1206                 :      812892 :                 ack_update_msk(msk, sk, &mp_opt);
    1207                 :             : 
    1208                 :             :         /* Zero-data-length packets are dropped by the caller and not
    1209                 :             :          * propagated to the MPTCP layer, so the skb extension does not
    1210                 :             :          * need to be allocated or populated. DATA_FIN information, if
    1211                 :             :          * present, needs to be updated here before the skb is freed.
    1212                 :             :          */
    1213         [ +  + ]:      813522 :         if (TCP_SKB_CB(skb)->seq == TCP_SKB_CB(skb)->end_seq) {
    1214   [ +  +  +  -  :      314659 :                 if (mp_opt.data_fin && mp_opt.data_len == 1 &&
                   +  + ]
    1215                 :        5745 :                     mptcp_update_rcv_data_fin(msk, mp_opt.data_seq, mp_opt.dsn64))
    1216                 :        2088 :                         mptcp_schedule_work((struct sock *)msk);
    1217                 :             : 
    1218                 :      308914 :                 return true;
    1219                 :             :         }
    1220                 :             : 
    1221                 :      504608 :         mpext = skb_ext_add(skb, SKB_EXT_MPTCP);
    1222         [ -  + ]:      504608 :         if (!mpext)
    1223                 :             :                 return true;
    1224                 :             : 
    1225                 :      504608 :         memset(mpext, 0, sizeof(*mpext));
    1226                 :             : 
    1227         [ +  + ]:      504608 :         if (likely(mp_opt.use_map)) {
    1228         [ +  + ]:      502614 :                 if (mp_opt.mpc_map) {
    1229                 :             :                         /* this is an MP_CAPABLE carrying MPTCP data
    1230                 :             :                          * we know this map the first chunk of data
    1231                 :             :                          */
    1232                 :         630 :                         mptcp_crypto_key_sha(subflow->remote_key, NULL,
    1233                 :             :                                              &mpext->data_seq);
    1234                 :         630 :                         mpext->data_seq++;
    1235                 :         630 :                         mpext->subflow_seq = 1;
    1236                 :         630 :                         mpext->dsn64 = 1;
    1237                 :         630 :                         mpext->mpc_map = 1;
    1238                 :         630 :                         mpext->data_fin = 0;
    1239                 :             :                 } else {
    1240                 :      501984 :                         mpext->data_seq = mp_opt.data_seq;
    1241                 :      501984 :                         mpext->subflow_seq = mp_opt.subflow_seq;
    1242                 :      501984 :                         mpext->dsn64 = mp_opt.dsn64;
    1243                 :      501984 :                         mpext->data_fin = mp_opt.data_fin;
    1244                 :             :                 }
    1245                 :      502614 :                 mpext->data_len = mp_opt.data_len;
    1246                 :      502614 :                 mpext->use_map = 1;
    1247                 :      502614 :                 mpext->csum_reqd = !!(mp_opt.suboptions & OPTION_MPTCP_CSUMREQD);
    1248                 :             : 
    1249         [ +  + ]:      502614 :                 if (mpext->csum_reqd)
    1250                 :        1600 :                         mpext->csum = mp_opt.csum;
    1251                 :             :         }
    1252                 :             : 
    1253                 :             :         return true;
    1254                 :             : }
    1255                 :             : 
    1256                 :      709386 : static void mptcp_set_rwin(struct tcp_sock *tp, struct tcphdr *th)
    1257                 :             : {
    1258                 :      709386 :         const struct sock *ssk = (const struct sock *)tp;
    1259                 :      709386 :         struct mptcp_subflow_context *subflow;
    1260                 :      709386 :         u64 ack_seq, rcv_wnd_old, rcv_wnd_new;
    1261                 :      709386 :         struct mptcp_sock *msk;
    1262                 :      709386 :         u32 new_win;
    1263                 :      709386 :         u64 win;
    1264                 :             : 
    1265         [ -  + ]:      709386 :         subflow = mptcp_subflow_ctx(ssk);
    1266         [ -  + ]:      709386 :         msk = mptcp_sk(subflow->conn);
    1267                 :             : 
    1268                 :      709386 :         ack_seq = READ_ONCE(msk->ack_seq);
    1269                 :      709386 :         rcv_wnd_new = ack_seq + tp->rcv_wnd;
    1270                 :             : 
    1271         [ +  + ]:      709386 :         rcv_wnd_old = atomic64_read(&msk->rcv_wnd_sent);
    1272         [ +  + ]:      709386 :         if (after64(rcv_wnd_new, rcv_wnd_old)) {
    1273                 :       39104 :                 u64 rcv_wnd;
    1274                 :             : 
    1275                 :      246507 :                 for (;;) {
    1276                 :      285611 :                         rcv_wnd = atomic64_cmpxchg(&msk->rcv_wnd_sent, rcv_wnd_old, rcv_wnd_new);
    1277                 :             : 
    1278         [ +  + ]:      246507 :                         if (rcv_wnd == rcv_wnd_old)
    1279                 :             :                                 break;
    1280                 :             : 
    1281                 :           3 :                         rcv_wnd_old = rcv_wnd;
    1282         [ +  + ]:           3 :                         if (before64(rcv_wnd_new, rcv_wnd_old)) {
    1283         [ +  - ]:           2 :                                 MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_RCVWNDCONFLICTUPDATE);
    1284                 :           2 :                                 goto raise_win;
    1285                 :             :                         }
    1286         [ -  - ]:       39105 :                         MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_RCVWNDCONFLICT);
    1287                 :             :                 }
    1288                 :      246504 :                 goto update_wspace;
    1289                 :             :         }
    1290                 :             : 
    1291         [ +  + ]:      462880 :         if (rcv_wnd_new != rcv_wnd_old) {
    1292                 :       62237 : raise_win:
    1293                 :       62239 :                 win = rcv_wnd_old - ack_seq;
    1294                 :       62239 :                 tp->rcv_wnd = min_t(u64, win, U32_MAX);
    1295                 :       62239 :                 new_win = tp->rcv_wnd;
    1296                 :             : 
    1297                 :             :                 /* Make sure we do not exceed the maximum possible
    1298                 :             :                  * scaled window.
    1299                 :             :                  */
    1300         [ +  + ]:       62239 :                 if (unlikely(th->syn))
    1301                 :         516 :                         new_win = min(new_win, 65535U) << tp->rx_opt.rcv_wscale;
    1302   [ -  +  -  - ]:       62239 :                 if (!tp->rx_opt.rcv_wscale &&
    1303         [ #  # ]:           0 :                     READ_ONCE(sock_net(ssk)->ipv4.sysctl_tcp_workaround_signed_windows))
    1304                 :           0 :                         new_win = min(new_win, MAX_TCP_WINDOW);
    1305                 :             :                 else
    1306                 :       62239 :                         new_win = min(new_win, (65535U << tp->rx_opt.rcv_wscale));
    1307                 :             : 
    1308                 :             :                 /* RFC1323 scaling applied */
    1309                 :       62239 :                 new_win >>= tp->rx_opt.rcv_wscale;
    1310                 :       62239 :                 th->window = htons(new_win);
    1311         [ +  - ]:       62239 :                 MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_RCVWNDSHARED);
    1312                 :             :         }
    1313                 :             : 
    1314                 :      400643 : update_wspace:
    1315                 :      709386 :         WRITE_ONCE(msk->old_wspace, tp->rcv_wnd);
    1316                 :      709386 : }
    1317                 :             : 
    1318                 :        2026 : __sum16 __mptcp_make_csum(u64 data_seq, u32 subflow_seq, u16 data_len, __wsum sum)
    1319                 :             : {
    1320                 :        2026 :         struct csum_pseudo_header header;
    1321                 :        2026 :         __wsum csum;
    1322                 :             : 
    1323                 :             :         /* cfr RFC 8684 3.3.1.:
    1324                 :             :          * the data sequence number used in the pseudo-header is
    1325                 :             :          * always the 64-bit value, irrespective of what length is used in the
    1326                 :             :          * DSS option itself.
    1327                 :             :          */
    1328                 :        2026 :         header.data_seq = cpu_to_be64(data_seq);
    1329                 :        2026 :         header.subflow_seq = htonl(subflow_seq);
    1330                 :        2026 :         header.data_len = htons(data_len);
    1331                 :        2026 :         header.csum = 0;
    1332                 :             : 
    1333                 :        2026 :         csum = csum_partial(&header, sizeof(header), sum);
    1334                 :        2026 :         return csum_fold(csum);
    1335                 :             : }
    1336                 :             : 
    1337                 :        1893 : static __sum16 mptcp_make_csum(const struct mptcp_ext *mpext)
    1338                 :             : {
    1339                 :        3786 :         return __mptcp_make_csum(mpext->data_seq, mpext->subflow_seq, mpext->data_len,
    1340                 :        1893 :                                  ~csum_unfold(mpext->csum));
    1341                 :             : }
    1342                 :             : 
    1343                 :           0 : static void put_len_csum(u16 len, __sum16 csum, void *data)
    1344                 :             : {
    1345                 :        1899 :         __sum16 *sumptr = data + 2;
    1346                 :        1899 :         __be16 *ptr = data;
    1347                 :             : 
    1348                 :        1899 :         put_unaligned_be16(len, ptr);
    1349                 :             : 
    1350                 :        1899 :         put_unaligned(csum, sumptr);
    1351                 :        1899 : }
    1352                 :             : 
    1353                 :      711542 : void mptcp_write_options(struct tcphdr *th, __be32 *ptr, struct tcp_sock *tp,
    1354                 :             :                          struct mptcp_out_options *opts)
    1355                 :             : {
    1356                 :      711542 :         const struct sock *ssk = (const struct sock *)tp;
    1357                 :      711542 :         struct mptcp_subflow_context *subflow;
    1358                 :             : 
    1359                 :             :         /* Which options can be used together?
    1360                 :             :          *
    1361                 :             :          * X: mutually exclusive
    1362                 :             :          * O: often used together
    1363                 :             :          * C: can be used together in some cases
    1364                 :             :          * P: could be used together but we prefer not to (optimisations)
    1365                 :             :          *
    1366                 :             :          *  Opt: | MPC  | MPJ  | DSS  | ADD  |  RM  | PRIO | FAIL |  FC  |
    1367                 :             :          * ------|------|------|------|------|------|------|------|------|
    1368                 :             :          *  MPC  |------|------|------|------|------|------|------|------|
    1369                 :             :          *  MPJ  |  X   |------|------|------|------|------|------|------|
    1370                 :             :          *  DSS  |  X   |  X   |------|------|------|------|------|------|
    1371                 :             :          *  ADD  |  X   |  X   |  P   |------|------|------|------|------|
    1372                 :             :          *  RM   |  C   |  C   |  C   |  P   |------|------|------|------|
    1373                 :             :          *  PRIO |  X   |  C   |  C   |  C   |  C   |------|------|------|
    1374                 :             :          *  FAIL |  X   |  X   |  C   |  X   |  X   |  X   |------|------|
    1375                 :             :          *  FC   |  X   |  X   |  X   |  X   |  X   |  X   |  X   |------|
    1376                 :             :          *  RST  |  X   |  X   |  X   |  X   |  X   |  X   |  O   |  O   |
    1377                 :             :          * ------|------|------|------|------|------|------|------|------|
    1378                 :             :          *
    1379                 :             :          * The same applies in mptcp_established_options() function.
    1380                 :             :          */
    1381         [ +  + ]:      711542 :         if (likely(OPTION_MPTCP_DSS & opts->suboptions)) {
    1382                 :      704587 :                 struct mptcp_ext *mpext = &opts->ext_copy;
    1383                 :      704587 :                 u8 len = TCPOLEN_MPTCP_DSS_BASE;
    1384                 :      704587 :                 u8 flags = 0;
    1385                 :             : 
    1386         [ +  - ]:      704587 :                 if (mpext->use_ack) {
    1387                 :      704587 :                         flags = MPTCP_DSS_HAS_ACK;
    1388         [ +  + ]:      704587 :                         if (mpext->ack64) {
    1389                 :             :                                 len += TCPOLEN_MPTCP_DSS_ACK64;
    1390                 :             :                                 flags |= MPTCP_DSS_ACK64;
    1391                 :             :                         } else {
    1392                 :      121118 :                                 len += TCPOLEN_MPTCP_DSS_ACK32;
    1393                 :             :                         }
    1394                 :             :                 }
    1395                 :             : 
    1396         [ +  + ]:      704587 :                 if (mpext->use_map) {
    1397                 :      394453 :                         len += TCPOLEN_MPTCP_DSS_MAP64;
    1398                 :             : 
    1399                 :             :                         /* Use only 64-bit mapping flags for now, add
    1400                 :             :                          * support for optional 32-bit mappings later.
    1401                 :             :                          */
    1402                 :      394453 :                         flags |= MPTCP_DSS_HAS_MAP | MPTCP_DSS_DSN64;
    1403         [ +  + ]:      394453 :                         if (mpext->data_fin)
    1404                 :        7991 :                                 flags |= MPTCP_DSS_DATA_FIN;
    1405                 :             : 
    1406         [ +  + ]:      394453 :                         if (opts->csum_reqd)
    1407                 :        1895 :                                 len += TCPOLEN_MPTCP_DSS_CHECKSUM;
    1408                 :             :                 }
    1409                 :             : 
    1410         [ +  - ]:      704587 :                 *ptr++ = mptcp_option(MPTCPOPT_DSS, len, 0, flags);
    1411                 :             : 
    1412         [ +  - ]:      704587 :                 if (mpext->use_ack) {
    1413         [ +  + ]:      704587 :                         if (mpext->ack64) {
    1414                 :      583469 :                                 put_unaligned_be64(mpext->data_ack, ptr);
    1415                 :      583469 :                                 ptr += 2;
    1416                 :             :                         } else {
    1417                 :      121118 :                                 put_unaligned_be32(mpext->data_ack32, ptr);
    1418                 :      121118 :                                 ptr += 1;
    1419                 :             :                         }
    1420                 :             :                 }
    1421                 :             : 
    1422         [ +  + ]:      704587 :                 if (mpext->use_map) {
    1423         [ +  + ]:      394453 :                         put_unaligned_be64(mpext->data_seq, ptr);
    1424                 :      394453 :                         ptr += 2;
    1425         [ +  + ]:      394453 :                         put_unaligned_be32(mpext->subflow_seq, ptr);
    1426                 :      394453 :                         ptr += 1;
    1427         [ +  + ]:      394453 :                         if (opts->csum_reqd) {
    1428                 :             :                                 /* data_len == 0 is reserved for the infinite mapping,
    1429                 :             :                                  * the checksum will also be set to 0.
    1430                 :             :                                  */
    1431                 :        1895 :                                 put_len_csum(mpext->data_len,
    1432         [ +  + ]:        1895 :                                              (mpext->data_len ? mptcp_make_csum(mpext) : 0),
    1433                 :             :                                              ptr);
    1434                 :             :                         } else {
    1435                 :      392558 :                                 put_unaligned_be32(mpext->data_len << 16 |
    1436                 :      392558 :                                                    TCPOPT_NOP << 8 | TCPOPT_NOP, ptr);
    1437                 :             :                         }
    1438                 :      394453 :                         ptr += 1;
    1439                 :             :                 }
    1440                 :             : 
    1441                 :             :                 /* We might need to add MP_FAIL options in rare cases */
    1442         [ +  + ]:      704587 :                 if (unlikely(OPTION_MPTCP_FAIL & opts->suboptions))
    1443                 :           4 :                         goto mp_fail;
    1444         [ +  + ]:        6955 :         } else if (OPTIONS_MPTCP_MPC & opts->suboptions) {
    1445                 :        4160 :                 u8 len, flag = MPTCP_CAP_HMAC_SHA256;
    1446                 :             : 
    1447         [ +  + ]:        4160 :                 if (OPTION_MPTCP_MPC_SYN & opts->suboptions) {
    1448                 :             :                         len = TCPOLEN_MPTCP_MPC_SYN;
    1449         [ +  + ]:        2884 :                 } else if (OPTION_MPTCP_MPC_SYNACK & opts->suboptions) {
    1450                 :             :                         len = TCPOLEN_MPTCP_MPC_SYNACK;
    1451         [ +  + ]:        1698 :                 } else if (opts->data_len) {
    1452                 :         580 :                         len = TCPOLEN_MPTCP_MPC_ACK_DATA;
    1453         [ +  + ]:         580 :                         if (opts->csum_reqd)
    1454                 :           4 :                                 len += TCPOLEN_MPTCP_DSS_CHECKSUM;
    1455                 :             :                 } else {
    1456                 :             :                         len = TCPOLEN_MPTCP_MPC_ACK;
    1457                 :             :                 }
    1458                 :             : 
    1459         [ +  + ]:        4160 :                 if (opts->csum_reqd)
    1460                 :          30 :                         flag |= MPTCP_CAP_CHECKSUM_REQD;
    1461                 :             : 
    1462         [ +  + ]:        4160 :                 if (!opts->allow_join_id0)
    1463                 :          18 :                         flag |= MPTCP_CAP_DENY_JOIN_ID0;
    1464                 :             : 
    1465         [ +  + ]:        4160 :                 *ptr++ = mptcp_option(MPTCPOPT_MP_CAPABLE, len,
    1466                 :             :                                       MPTCP_SUPPORTED_VERSION,
    1467                 :             :                                       flag);
    1468                 :             : 
    1469                 :        4160 :                 if (!((OPTION_MPTCP_MPC_SYNACK | OPTION_MPTCP_MPC_ACK) &
    1470         [ +  + ]:        4160 :                     opts->suboptions))
    1471                 :        1276 :                         goto mp_capable_done;
    1472                 :             : 
    1473         [ +  + ]:        2884 :                 put_unaligned_be64(opts->sndr_key, ptr);
    1474                 :        2884 :                 ptr += 2;
    1475         [ +  + ]:        2884 :                 if (!((OPTION_MPTCP_MPC_ACK) & opts->suboptions))
    1476                 :        1186 :                         goto mp_capable_done;
    1477                 :             : 
    1478         [ +  + ]:        1698 :                 put_unaligned_be64(opts->rcvr_key, ptr);
    1479                 :        1698 :                 ptr += 2;
    1480         [ +  + ]:        1698 :                 if (!opts->data_len)
    1481                 :        1118 :                         goto mp_capable_done;
    1482                 :             : 
    1483         [ +  + ]:         580 :                 if (opts->csum_reqd) {
    1484                 :           4 :                         put_len_csum(opts->data_len,
    1485                 :           4 :                                      __mptcp_make_csum(opts->data_seq,
    1486                 :             :                                                        opts->subflow_seq,
    1487                 :             :                                                        opts->data_len,
    1488                 :           4 :                                                        ~csum_unfold(opts->csum)),
    1489                 :             :                                      ptr);
    1490                 :             :                 } else {
    1491                 :         576 :                         put_unaligned_be32(opts->data_len << 16 |
    1492                 :         576 :                                            TCPOPT_NOP << 8 | TCPOPT_NOP, ptr);
    1493                 :             :                 }
    1494                 :         580 :                 ptr += 1;
    1495                 :             : 
    1496                 :             :                 /* MPC is additionally mutually exclusive with MP_PRIO */
    1497                 :         580 :                 goto mp_capable_done;
    1498         [ +  + ]:        2795 :         } else if (OPTIONS_MPTCP_MPJ & opts->suboptions) {
    1499         [ +  + ]:        1593 :                 if (OPTION_MPTCP_MPJ_SYN & opts->suboptions) {
    1500                 :         570 :                         *ptr++ = mptcp_option(MPTCPOPT_MP_JOIN,
    1501                 :             :                                               TCPOLEN_MPTCP_MPJ_SYN,
    1502                 :         570 :                                               opts->backup, opts->join_id);
    1503                 :         570 :                         put_unaligned_be32(opts->token, ptr);
    1504                 :         570 :                         ptr += 1;
    1505                 :         570 :                         put_unaligned_be32(opts->nonce, ptr);
    1506                 :         570 :                         ptr += 1;
    1507         [ +  + ]:        1023 :                 } else if (OPTION_MPTCP_MPJ_SYNACK & opts->suboptions) {
    1508                 :         520 :                         *ptr++ = mptcp_option(MPTCPOPT_MP_JOIN,
    1509                 :             :                                               TCPOLEN_MPTCP_MPJ_SYNACK,
    1510                 :         520 :                                               opts->backup, opts->join_id);
    1511                 :         520 :                         put_unaligned_be64(opts->thmac, ptr);
    1512                 :         520 :                         ptr += 2;
    1513                 :         520 :                         put_unaligned_be32(opts->nonce, ptr);
    1514                 :         520 :                         ptr += 1;
    1515                 :             :                 } else {
    1516                 :         503 :                         *ptr++ = mptcp_option(MPTCPOPT_MP_JOIN,
    1517                 :             :                                               TCPOLEN_MPTCP_MPJ_ACK, 0, 0);
    1518                 :         503 :                         memcpy(ptr, opts->hmac, MPTCPOPT_HMAC_LEN);
    1519                 :         503 :                         ptr += 5;
    1520                 :             :                 }
    1521         [ +  + ]:        1202 :         } else if (OPTION_MPTCP_ADD_ADDR & opts->suboptions) {
    1522                 :         756 :                 u8 len = TCPOLEN_MPTCP_ADD_ADDR_BASE;
    1523                 :         756 :                 u8 echo = MPTCP_ADDR_ECHO;
    1524                 :             : 
    1525                 :             : #if IS_ENABLED(CONFIG_MPTCP_IPV6)
    1526         [ +  + ]:         756 :                 if (opts->addr.family == AF_INET6)
    1527                 :         170 :                         len = TCPOLEN_MPTCP_ADD_ADDR6_BASE;
    1528                 :             : #endif
    1529                 :             : 
    1530         [ +  + ]:         756 :                 if (opts->addr.port)
    1531                 :          68 :                         len += TCPOLEN_MPTCP_PORT_LEN;
    1532                 :             : 
    1533         [ +  + ]:         756 :                 if (opts->ahmac) {
    1534                 :         404 :                         len += sizeof(opts->ahmac);
    1535                 :         404 :                         echo = 0;
    1536                 :             :                 }
    1537                 :             : 
    1538                 :         756 :                 *ptr++ = mptcp_option(MPTCPOPT_ADD_ADDR,
    1539         [ +  + ]:         756 :                                       len, echo, opts->addr.id);
    1540         [ +  + ]:         756 :                 if (opts->addr.family == AF_INET) {
    1541                 :         586 :                         memcpy((u8 *)ptr, (u8 *)&opts->addr.addr.s_addr, 4);
    1542                 :         586 :                         ptr += 1;
    1543                 :             :                 }
    1544                 :             : #if IS_ENABLED(CONFIG_MPTCP_IPV6)
    1545         [ +  - ]:         170 :                 else if (opts->addr.family == AF_INET6) {
    1546                 :         170 :                         memcpy((u8 *)ptr, opts->addr.addr6.s6_addr, 16);
    1547                 :         170 :                         ptr += 4;
    1548                 :             :                 }
    1549                 :             : #endif
    1550                 :             : 
    1551         [ +  + ]:         756 :                 if (!opts->addr.port) {
    1552         [ +  + ]:         688 :                         if (opts->ahmac) {
    1553                 :         376 :                                 put_unaligned_be64(opts->ahmac, ptr);
    1554                 :         376 :                                 ptr += 2;
    1555                 :             :                         }
    1556                 :             :                 } else {
    1557                 :          68 :                         u16 port = ntohs(opts->addr.port);
    1558                 :             : 
    1559         [ +  + ]:          68 :                         if (opts->ahmac) {
    1560                 :          28 :                                 u8 *bptr = (u8 *)ptr;
    1561                 :             : 
    1562                 :          28 :                                 put_unaligned_be16(port, bptr);
    1563                 :          28 :                                 bptr += 2;
    1564                 :          28 :                                 put_unaligned_be64(opts->ahmac, bptr);
    1565                 :          28 :                                 bptr += 8;
    1566                 :          28 :                                 put_unaligned_be16(TCPOPT_NOP << 8 |
    1567                 :             :                                                    TCPOPT_NOP, bptr);
    1568                 :             : 
    1569                 :          28 :                                 ptr += 3;
    1570                 :             :                         } else {
    1571                 :          40 :                                 put_unaligned_be32(port << 16 |
    1572                 :          40 :                                                    TCPOPT_NOP << 8 |
    1573                 :             :                                                    TCPOPT_NOP, ptr);
    1574                 :          40 :                                 ptr += 1;
    1575                 :             :                         }
    1576                 :             :                 }
    1577         [ +  + ]:         446 :         } else if (unlikely(OPTION_MPTCP_FASTCLOSE & opts->suboptions)) {
    1578                 :             :                 /* FASTCLOSE is mutually exclusive with others except RST */
    1579                 :         384 :                 *ptr++ = mptcp_option(MPTCPOPT_MP_FASTCLOSE,
    1580                 :             :                                       TCPOLEN_MPTCP_FASTCLOSE,
    1581                 :             :                                       0, 0);
    1582         [ +  - ]:         384 :                 put_unaligned_be64(opts->rcvr_key, ptr);
    1583                 :         384 :                 ptr += 2;
    1584                 :             : 
    1585         [ +  - ]:         384 :                 if (OPTION_MPTCP_RST & opts->suboptions)
    1586                 :         384 :                         goto mp_rst;
    1587                 :             :                 return;
    1588         [ +  + ]:          62 :         } else if (unlikely(OPTION_MPTCP_FAIL & opts->suboptions)) {
    1589                 :           2 : mp_fail:
    1590                 :             :                 /* MP_FAIL is mutually exclusive with others except RST */
    1591         [ +  + ]:           6 :                 subflow = mptcp_subflow_ctx(ssk);
    1592                 :           6 :                 subflow->send_mp_fail = 0;
    1593                 :             : 
    1594                 :           6 :                 *ptr++ = mptcp_option(MPTCPOPT_MP_FAIL,
    1595                 :             :                                       TCPOLEN_MPTCP_FAIL,
    1596                 :             :                                       0, 0);
    1597         [ +  + ]:           6 :                 put_unaligned_be64(opts->fail_seq, ptr);
    1598                 :           6 :                 ptr += 2;
    1599                 :             : 
    1600         [ +  + ]:           6 :                 if (OPTION_MPTCP_RST & opts->suboptions)
    1601                 :           2 :                         goto mp_rst;
    1602                 :             :                 return;
    1603         [ +  - ]:          60 :         } else if (unlikely(OPTION_MPTCP_RST & opts->suboptions)) {
    1604                 :          60 : mp_rst:
    1605                 :         446 :                 *ptr++ = mptcp_option(MPTCPOPT_RST,
    1606                 :             :                                       TCPOLEN_MPTCP_RST,
    1607                 :         446 :                                       opts->reset_transient,
    1608                 :         446 :                                       opts->reset_reason);
    1609                 :         446 :                 return;
    1610                 :             :         }
    1611                 :             : 
    1612         [ +  + ]:      706932 :         if (OPTION_MPTCP_PRIO & opts->suboptions) {
    1613         [ +  - ]:          28 :                 subflow = mptcp_subflow_ctx(ssk);
    1614                 :          28 :                 subflow->send_mp_prio = 0;
    1615                 :             : 
    1616                 :          28 :                 *ptr++ = mptcp_option(MPTCPOPT_MP_PRIO,
    1617                 :             :                                       TCPOLEN_MPTCP_PRIO,
    1618         [ +  - ]:          28 :                                       opts->backup, TCPOPT_NOP);
    1619                 :             : 
    1620         [ +  - ]:          28 :                 MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_MPPRIOTX);
    1621                 :             :         }
    1622                 :             : 
    1623                 :      706904 : mp_capable_done:
    1624         [ +  + ]:      711092 :         if (OPTION_MPTCP_RM_ADDR & opts->suboptions) {
    1625                 :         106 :                 u8 i = 1;
    1626                 :             : 
    1627                 :         106 :                 *ptr++ = mptcp_option(MPTCPOPT_RM_ADDR,
    1628                 :         106 :                                       TCPOLEN_MPTCP_RM_ADDR_BASE + opts->rm_list.nr,
    1629                 :         106 :                                       0, opts->rm_list.ids[0]);
    1630                 :             : 
    1631         [ +  + ]:         110 :                 while (i < opts->rm_list.nr) {
    1632                 :           4 :                         u8 id1, id2, id3, id4;
    1633                 :             : 
    1634                 :           4 :                         id1 = opts->rm_list.ids[i];
    1635         [ +  - ]:           4 :                         id2 = i + 1 < opts->rm_list.nr ? opts->rm_list.ids[i + 1] : TCPOPT_NOP;
    1636         [ -  + ]:           4 :                         id3 = i + 2 < opts->rm_list.nr ? opts->rm_list.ids[i + 2] : TCPOPT_NOP;
    1637         [ -  + ]:           4 :                         id4 = i + 3 < opts->rm_list.nr ? opts->rm_list.ids[i + 3] : TCPOPT_NOP;
    1638                 :           4 :                         put_unaligned_be32(id1 << 24 | id2 << 16 | id3 << 8 | id4, ptr);
    1639                 :           4 :                         ptr += 1;
    1640                 :           4 :                         i += 4;
    1641                 :             :                 }
    1642                 :             :         }
    1643                 :             : 
    1644         [ +  + ]:      711092 :         if (tp)
    1645                 :      709386 :                 mptcp_set_rwin(tp, th);
    1646                 :             : }
    1647                 :             : 
    1648                 :          16 : __be32 mptcp_get_reset_option(const struct sk_buff *skb)
    1649                 :             : {
    1650         [ +  - ]:          16 :         const struct mptcp_ext *ext = mptcp_get_ext(skb);
    1651                 :          16 :         u8 flags, reason;
    1652                 :             : 
    1653         [ +  - ]:          16 :         if (ext) {
    1654                 :          16 :                 flags = ext->reset_transient;
    1655                 :          16 :                 reason = ext->reset_reason;
    1656                 :             : 
    1657                 :          16 :                 return mptcp_option(MPTCPOPT_RST, TCPOLEN_MPTCP_RST,
    1658                 :             :                                     flags, reason);
    1659                 :             :         }
    1660                 :             : 
    1661                 :             :         return htonl(0u);
    1662                 :             : }
    1663                 :             : EXPORT_SYMBOL_GPL(mptcp_get_reset_option);
        

Generated by: LCOV version 2.0-1