^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /* Multipath TCP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (c) 2017 - 2019, Intel Corporation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #define pr_fmt(fmt) "MPTCP: " fmt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <crypto/sha.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <net/tcp.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <net/mptcp.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include "protocol.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include "mib.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) static bool mptcp_cap_flag_sha256(u8 flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) return (flags & MPTCP_CAP_FLAG_MASK) == MPTCP_CAP_HMAC_SHA256;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) static void mptcp_parse_option(const struct sk_buff *skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) const unsigned char *ptr, int opsize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) struct mptcp_options_received *mp_opt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) u8 subtype = *ptr >> 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) int expected_opsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) u8 version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) u8 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) switch (subtype) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) case MPTCPOPT_MP_CAPABLE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) /* strict size checking */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) if (!(TCP_SKB_CB(skb)->tcp_flags & TCPHDR_SYN)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) if (skb->len > tcp_hdr(skb)->doff << 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) expected_opsize = TCPOLEN_MPTCP_MPC_ACK_DATA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) expected_opsize = TCPOLEN_MPTCP_MPC_ACK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_ACK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) expected_opsize = TCPOLEN_MPTCP_MPC_SYNACK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) expected_opsize = TCPOLEN_MPTCP_MPC_SYN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) if (opsize != expected_opsize)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) /* try to be gentle vs future versions on the initial syn */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) version = *ptr++ & MPTCP_VERSION_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) if (opsize != TCPOLEN_MPTCP_MPC_SYN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) if (version != MPTCP_SUPPORTED_VERSION)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) } else if (version < MPTCP_SUPPORTED_VERSION) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) flags = *ptr++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) if (!mptcp_cap_flag_sha256(flags) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) (flags & MPTCP_CAP_EXTENSIBILITY))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) /* RFC 6824, Section 3.1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) * "For the Checksum Required bit (labeled "A"), if either
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) * host requires the use of checksums, checksums MUST be used.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) * In other words, the only way for checksums not to be used
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) * is if both hosts in their SYNs set A=0."
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) * Section 3.3.0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) * "If a checksum is not present when its use has been
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) * negotiated, the receiver MUST close the subflow with a RST as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) * it is considered broken."
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) * We don't implement DSS checksum - fall back to TCP.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) if (flags & MPTCP_CAP_CHECKSUM_REQD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) mp_opt->mp_capable = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) if (opsize >= TCPOLEN_MPTCP_MPC_SYNACK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) mp_opt->sndr_key = get_unaligned_be64(ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) ptr += 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) if (opsize >= TCPOLEN_MPTCP_MPC_ACK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) mp_opt->rcvr_key = get_unaligned_be64(ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) ptr += 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) if (opsize == TCPOLEN_MPTCP_MPC_ACK_DATA) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) /* Section 3.1.:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) * "the data parameters in a MP_CAPABLE are semantically
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) * equivalent to those in a DSS option and can be used
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) * interchangeably."
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) mp_opt->dss = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) mp_opt->use_map = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) mp_opt->mpc_map = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) mp_opt->data_len = get_unaligned_be16(ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) ptr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) pr_debug("MP_CAPABLE version=%x, flags=%x, optlen=%d sndr=%llu, rcvr=%llu len=%d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) version, flags, opsize, mp_opt->sndr_key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) mp_opt->rcvr_key, mp_opt->data_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) case MPTCPOPT_MP_JOIN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) mp_opt->mp_join = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) if (opsize == TCPOLEN_MPTCP_MPJ_SYN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) mp_opt->backup = *ptr++ & MPTCPOPT_BACKUP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) mp_opt->join_id = *ptr++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) mp_opt->token = get_unaligned_be32(ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) ptr += 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) mp_opt->nonce = get_unaligned_be32(ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) ptr += 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) pr_debug("MP_JOIN bkup=%u, id=%u, token=%u, nonce=%u",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) mp_opt->backup, mp_opt->join_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) mp_opt->token, mp_opt->nonce);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) } else if (opsize == TCPOLEN_MPTCP_MPJ_SYNACK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) mp_opt->backup = *ptr++ & MPTCPOPT_BACKUP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) mp_opt->join_id = *ptr++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) mp_opt->thmac = get_unaligned_be64(ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) ptr += 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) mp_opt->nonce = get_unaligned_be32(ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) ptr += 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) pr_debug("MP_JOIN bkup=%u, id=%u, thmac=%llu, nonce=%u",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) mp_opt->backup, mp_opt->join_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) mp_opt->thmac, mp_opt->nonce);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) } else if (opsize == TCPOLEN_MPTCP_MPJ_ACK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) ptr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) memcpy(mp_opt->hmac, ptr, MPTCPOPT_HMAC_LEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) pr_debug("MP_JOIN hmac");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) mp_opt->mp_join = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) case MPTCPOPT_DSS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) pr_debug("DSS");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) ptr++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) /* we must clear 'mpc_map' be able to detect MP_CAPABLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) * map vs DSS map in mptcp_incoming_options(), and reconstruct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) * map info accordingly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) mp_opt->mpc_map = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) flags = (*ptr++) & MPTCP_DSS_FLAG_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) mp_opt->data_fin = (flags & MPTCP_DSS_DATA_FIN) != 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) mp_opt->dsn64 = (flags & MPTCP_DSS_DSN64) != 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) mp_opt->use_map = (flags & MPTCP_DSS_HAS_MAP) != 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) mp_opt->ack64 = (flags & MPTCP_DSS_ACK64) != 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) mp_opt->use_ack = (flags & MPTCP_DSS_HAS_ACK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) pr_debug("data_fin=%d dsn64=%d use_map=%d ack64=%d use_ack=%d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) mp_opt->data_fin, mp_opt->dsn64,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) mp_opt->use_map, mp_opt->ack64,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) mp_opt->use_ack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) expected_opsize = TCPOLEN_MPTCP_DSS_BASE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) if (mp_opt->use_ack) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) if (mp_opt->ack64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) expected_opsize += TCPOLEN_MPTCP_DSS_ACK64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) expected_opsize += TCPOLEN_MPTCP_DSS_ACK32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) if (mp_opt->use_map) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) if (mp_opt->dsn64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) expected_opsize += TCPOLEN_MPTCP_DSS_MAP64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) expected_opsize += TCPOLEN_MPTCP_DSS_MAP32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) /* RFC 6824, Section 3.3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) * If a checksum is present, but its use had
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) * not been negotiated in the MP_CAPABLE handshake,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) * the checksum field MUST be ignored.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) if (opsize != expected_opsize &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) opsize != expected_opsize + TCPOLEN_MPTCP_DSS_CHECKSUM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) mp_opt->dss = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) if (mp_opt->use_ack) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) if (mp_opt->ack64) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) mp_opt->data_ack = get_unaligned_be64(ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) ptr += 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) mp_opt->data_ack = get_unaligned_be32(ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) ptr += 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) pr_debug("data_ack=%llu", mp_opt->data_ack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) if (mp_opt->use_map) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) if (mp_opt->dsn64) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) mp_opt->data_seq = get_unaligned_be64(ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) ptr += 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) mp_opt->data_seq = get_unaligned_be32(ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) ptr += 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) mp_opt->subflow_seq = get_unaligned_be32(ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) ptr += 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) mp_opt->data_len = get_unaligned_be16(ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) ptr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) pr_debug("data_seq=%llu subflow_seq=%u data_len=%u",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) mp_opt->data_seq, mp_opt->subflow_seq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) mp_opt->data_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) case MPTCPOPT_ADD_ADDR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) mp_opt->echo = (*ptr++) & MPTCP_ADDR_ECHO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) if (!mp_opt->echo) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) if (opsize == TCPOLEN_MPTCP_ADD_ADDR ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) opsize == TCPOLEN_MPTCP_ADD_ADDR_PORT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) mp_opt->family = MPTCP_ADDR_IPVERSION_4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) #if IS_ENABLED(CONFIG_MPTCP_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) else if (opsize == TCPOLEN_MPTCP_ADD_ADDR6 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) opsize == TCPOLEN_MPTCP_ADD_ADDR6_PORT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) mp_opt->family = MPTCP_ADDR_IPVERSION_6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) if (opsize == TCPOLEN_MPTCP_ADD_ADDR_BASE ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) opsize == TCPOLEN_MPTCP_ADD_ADDR_BASE_PORT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) mp_opt->family = MPTCP_ADDR_IPVERSION_4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) #if IS_ENABLED(CONFIG_MPTCP_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) else if (opsize == TCPOLEN_MPTCP_ADD_ADDR6_BASE ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) opsize == TCPOLEN_MPTCP_ADD_ADDR6_BASE_PORT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) mp_opt->family = MPTCP_ADDR_IPVERSION_6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) mp_opt->add_addr = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) mp_opt->addr_id = *ptr++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) pr_debug("ADD_ADDR: id=%d, echo=%d", mp_opt->addr_id, mp_opt->echo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) if (mp_opt->family == MPTCP_ADDR_IPVERSION_4) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) memcpy((u8 *)&mp_opt->addr.s_addr, (u8 *)ptr, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) ptr += 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) if (opsize == TCPOLEN_MPTCP_ADD_ADDR_PORT ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) opsize == TCPOLEN_MPTCP_ADD_ADDR_BASE_PORT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) mp_opt->port = get_unaligned_be16(ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) ptr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) #if IS_ENABLED(CONFIG_MPTCP_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) memcpy(mp_opt->addr6.s6_addr, (u8 *)ptr, 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) ptr += 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) if (opsize == TCPOLEN_MPTCP_ADD_ADDR6_PORT ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) opsize == TCPOLEN_MPTCP_ADD_ADDR6_BASE_PORT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) mp_opt->port = get_unaligned_be16(ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) ptr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) if (!mp_opt->echo) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) mp_opt->ahmac = get_unaligned_be64(ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) ptr += 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) case MPTCPOPT_RM_ADDR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) if (opsize != TCPOLEN_MPTCP_RM_ADDR_BASE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) ptr++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) mp_opt->rm_addr = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) mp_opt->rm_id = *ptr++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) pr_debug("RM_ADDR: id=%d", mp_opt->rm_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) void mptcp_get_options(const struct sk_buff *skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) struct mptcp_options_received *mp_opt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) const struct tcphdr *th = tcp_hdr(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) const unsigned char *ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) int length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) /* initialize option status */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) mp_opt->mp_capable = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) mp_opt->mp_join = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) mp_opt->add_addr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) mp_opt->ahmac = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) mp_opt->port = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) mp_opt->rm_addr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) mp_opt->dss = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) length = (th->doff * 4) - sizeof(struct tcphdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) ptr = (const unsigned char *)(th + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) while (length > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) int opcode = *ptr++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) int opsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) switch (opcode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) case TCPOPT_EOL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) case TCPOPT_NOP: /* Ref: RFC 793 section 3.1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) length--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) if (length < 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) opsize = *ptr++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) if (opsize < 2) /* "silly options" */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) if (opsize > length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) return; /* don't parse partial options */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) if (opcode == TCPOPT_MPTCP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) mptcp_parse_option(skb, ptr, opsize, mp_opt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) ptr += opsize - 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) length -= opsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) bool mptcp_syn_options(struct sock *sk, const struct sk_buff *skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) unsigned int *size, struct mptcp_out_options *opts)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) /* we will use snd_isn to detect first pkt [re]transmission
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) * in mptcp_established_options_mp()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) subflow->snd_isn = TCP_SKB_CB(skb)->end_seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) if (subflow->request_mptcp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) opts->suboptions = OPTION_MPTCP_MPC_SYN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) *size = TCPOLEN_MPTCP_MPC_SYN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) } else if (subflow->request_join) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) pr_debug("remote_token=%u, nonce=%u", subflow->remote_token,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) subflow->local_nonce);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) opts->suboptions = OPTION_MPTCP_MPJ_SYN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) opts->join_id = subflow->local_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) opts->token = subflow->remote_token;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) opts->nonce = subflow->local_nonce;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) opts->backup = subflow->request_bkup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) *size = TCPOLEN_MPTCP_MPJ_SYN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) /* MP_JOIN client subflow must wait for 4th ack before sending any data:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) * TCP can't schedule delack timer before the subflow is fully established.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) * MPTCP uses the delack timer to do 3rd ack retransmissions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) static void schedule_3rdack_retransmission(struct sock *sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) struct inet_connection_sock *icsk = inet_csk(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) struct tcp_sock *tp = tcp_sk(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) unsigned long timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) /* reschedule with a timeout above RTT, as we must look only for drop */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) if (tp->srtt_us)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) timeout = usecs_to_jiffies(tp->srtt_us >> (3 - 1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) timeout = TCP_TIMEOUT_INIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) timeout += jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) WARN_ON_ONCE(icsk->icsk_ack.pending & ICSK_ACK_TIMER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) icsk->icsk_ack.pending |= ICSK_ACK_SCHED | ICSK_ACK_TIMER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) icsk->icsk_ack.timeout = timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) sk_reset_timer(sk, &icsk->icsk_delack_timer, timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) static void clear_3rdack_retransmission(struct sock *sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) struct inet_connection_sock *icsk = inet_csk(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) sk_stop_timer(sk, &icsk->icsk_delack_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) icsk->icsk_ack.timeout = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) icsk->icsk_ack.ato = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) icsk->icsk_ack.pending &= ~(ICSK_ACK_SCHED | ICSK_ACK_TIMER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) static bool mptcp_established_options_mp(struct sock *sk, struct sk_buff *skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) unsigned int *size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) unsigned int remaining,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) struct mptcp_out_options *opts)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) struct mptcp_ext *mpext;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) unsigned int data_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) /* When skb is not available, we better over-estimate the emitted
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) * options len. A full DSS option (28 bytes) is longer than
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) * TCPOLEN_MPTCP_MPC_ACK_DATA(22) or TCPOLEN_MPTCP_MPJ_ACK(24), so
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) * tell the caller to defer the estimate to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) * mptcp_established_options_dss(), which will reserve enough space.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) if (!skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) /* MPC/MPJ needed only on 3rd ack packet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) if (subflow->fully_established ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) subflow->snd_isn != TCP_SKB_CB(skb)->seq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) if (subflow->mp_capable) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) mpext = mptcp_get_ext(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) data_len = mpext ? mpext->data_len : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) /* we will check ext_copy.data_len in mptcp_write_options() to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) * discriminate between TCPOLEN_MPTCP_MPC_ACK_DATA and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) * TCPOLEN_MPTCP_MPC_ACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) opts->ext_copy.data_len = data_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) opts->suboptions = OPTION_MPTCP_MPC_ACK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) opts->sndr_key = subflow->local_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) opts->rcvr_key = subflow->remote_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) /* Section 3.1.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) * The MP_CAPABLE option is carried on the SYN, SYN/ACK, and ACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) * packets that start the first subflow of an MPTCP connection,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) * as well as the first packet that carries data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) if (data_len > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) *size = ALIGN(TCPOLEN_MPTCP_MPC_ACK_DATA, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) *size = TCPOLEN_MPTCP_MPC_ACK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) pr_debug("subflow=%p, local_key=%llu, remote_key=%llu map_len=%d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) subflow, subflow->local_key, subflow->remote_key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) data_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) } else if (subflow->mp_join) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) opts->suboptions = OPTION_MPTCP_MPJ_ACK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) memcpy(opts->hmac, subflow->hmac, MPTCPOPT_HMAC_LEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) *size = TCPOLEN_MPTCP_MPJ_ACK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) pr_debug("subflow=%p", subflow);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) schedule_3rdack_retransmission(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) static void mptcp_write_data_fin(struct mptcp_subflow_context *subflow,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) struct sk_buff *skb, struct mptcp_ext *ext)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) /* The write_seq value has already been incremented, so the actual
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) * sequence number for the DATA_FIN is one less.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) u64 data_fin_tx_seq = READ_ONCE(mptcp_sk(subflow->conn)->write_seq) - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) if (!ext->use_map || !skb->len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) /* RFC6824 requires a DSS mapping with specific values
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) * if DATA_FIN is set but no data payload is mapped
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) ext->data_fin = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) ext->use_map = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) ext->dsn64 = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) ext->data_seq = data_fin_tx_seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) ext->subflow_seq = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) ext->data_len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) } else if (ext->data_seq + ext->data_len == data_fin_tx_seq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) /* If there's an existing DSS mapping and it is the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) * final mapping, DATA_FIN consumes 1 additional byte of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) * mapping space.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) ext->data_fin = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) ext->data_len++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) static bool mptcp_established_options_dss(struct sock *sk, struct sk_buff *skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) unsigned int *size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) unsigned int remaining,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) struct mptcp_out_options *opts)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) struct mptcp_sock *msk = mptcp_sk(subflow->conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) unsigned int dss_size = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) u64 snd_data_fin_enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) struct mptcp_ext *mpext;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) unsigned int ack_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) bool ret = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) mpext = skb ? mptcp_get_ext(skb) : NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) snd_data_fin_enable = READ_ONCE(msk->snd_data_fin_enable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) if (!skb || (mpext && mpext->use_map) || snd_data_fin_enable) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) unsigned int map_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) map_size = TCPOLEN_MPTCP_DSS_BASE + TCPOLEN_MPTCP_DSS_MAP64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) remaining -= map_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) dss_size = map_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) if (mpext)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) opts->ext_copy = *mpext;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) if (skb && snd_data_fin_enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) mptcp_write_data_fin(subflow, skb, &opts->ext_copy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) ret = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) /* passive sockets msk will set the 'can_ack' after accept(), even
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) * if the first subflow may have the already the remote key handy
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) opts->ext_copy.use_ack = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) if (!READ_ONCE(msk->can_ack)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) *size = ALIGN(dss_size, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) if (READ_ONCE(msk->use_64bit_ack)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) ack_size = TCPOLEN_MPTCP_DSS_ACK64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) opts->ext_copy.data_ack = READ_ONCE(msk->ack_seq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) opts->ext_copy.ack64 = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) ack_size = TCPOLEN_MPTCP_DSS_ACK32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) opts->ext_copy.data_ack32 = (uint32_t)READ_ONCE(msk->ack_seq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) opts->ext_copy.ack64 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) opts->ext_copy.use_ack = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) /* Add kind/length/subtype/flag overhead if mapping is not populated */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) if (dss_size == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) ack_size += TCPOLEN_MPTCP_DSS_BASE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) dss_size += ack_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) *size = ALIGN(dss_size, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) static u64 add_addr_generate_hmac(u64 key1, u64 key2, u8 addr_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) struct in_addr *addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) u8 hmac[SHA256_DIGEST_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) u8 msg[7];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) msg[0] = addr_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) memcpy(&msg[1], &addr->s_addr, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) msg[5] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) msg[6] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) mptcp_crypto_hmac_sha(key1, key2, msg, 7, hmac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) return get_unaligned_be64(&hmac[SHA256_DIGEST_SIZE - sizeof(u64)]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) #if IS_ENABLED(CONFIG_MPTCP_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) static u64 add_addr6_generate_hmac(u64 key1, u64 key2, u8 addr_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) struct in6_addr *addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) u8 hmac[SHA256_DIGEST_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) u8 msg[19];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) msg[0] = addr_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) memcpy(&msg[1], &addr->s6_addr, 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) msg[17] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) msg[18] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) mptcp_crypto_hmac_sha(key1, key2, msg, 19, hmac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) return get_unaligned_be64(&hmac[SHA256_DIGEST_SIZE - sizeof(u64)]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) static bool mptcp_established_options_add_addr(struct sock *sk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) unsigned int *size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) unsigned int remaining,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) struct mptcp_out_options *opts)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) struct mptcp_sock *msk = mptcp_sk(subflow->conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) struct mptcp_addr_info saddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) bool echo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) int len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) if (!mptcp_pm_should_add_signal(msk) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) !(mptcp_pm_add_addr_signal(msk, remaining, &saddr, &echo)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) len = mptcp_add_addr_len(saddr.family, echo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) if (remaining < len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) *size = len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) opts->addr_id = saddr.id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) if (saddr.family == AF_INET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) opts->suboptions |= OPTION_MPTCP_ADD_ADDR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) opts->addr = saddr.addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) if (!echo) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) opts->ahmac = add_addr_generate_hmac(msk->local_key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) msk->remote_key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) opts->addr_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) &opts->addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) #if IS_ENABLED(CONFIG_MPTCP_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) else if (saddr.family == AF_INET6) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) opts->suboptions |= OPTION_MPTCP_ADD_ADDR6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) opts->addr6 = saddr.addr6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) if (!echo) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) opts->ahmac = add_addr6_generate_hmac(msk->local_key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) msk->remote_key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) opts->addr_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) &opts->addr6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) pr_debug("addr_id=%d, ahmac=%llu, echo=%d", opts->addr_id, opts->ahmac, echo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) static bool mptcp_established_options_rm_addr(struct sock *sk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) unsigned int *size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) unsigned int remaining,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) struct mptcp_out_options *opts)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) struct mptcp_sock *msk = mptcp_sk(subflow->conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) u8 rm_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) if (!mptcp_pm_should_rm_signal(msk) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) !(mptcp_pm_rm_addr_signal(msk, remaining, &rm_id)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) if (remaining < TCPOLEN_MPTCP_RM_ADDR_BASE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) *size = TCPOLEN_MPTCP_RM_ADDR_BASE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) opts->suboptions |= OPTION_MPTCP_RM_ADDR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) opts->rm_id = rm_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) pr_debug("rm_id=%d", opts->rm_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) bool mptcp_established_options(struct sock *sk, struct sk_buff *skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) unsigned int *size, unsigned int remaining,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) struct mptcp_out_options *opts)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) unsigned int opt_size = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) bool ret = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) opts->suboptions = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) if (unlikely(mptcp_check_fallback(sk)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) /* prevent adding of any MPTCP related options on reset packet
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) * until we support MP_TCPRST/MP_FASTCLOSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) if (unlikely(skb && TCP_SKB_CB(skb)->tcp_flags & TCPHDR_RST))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) if (mptcp_established_options_mp(sk, skb, &opt_size, remaining, opts))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) ret = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) else if (mptcp_established_options_dss(sk, skb, &opt_size, remaining,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) opts))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) ret = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) /* we reserved enough space for the above options, and exceeding the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) * TCP option space would be fatal
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) if (WARN_ON_ONCE(opt_size > remaining))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) *size += opt_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) remaining -= opt_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) if (mptcp_established_options_add_addr(sk, &opt_size, remaining, opts)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) *size += opt_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) remaining -= opt_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) ret = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) } else if (mptcp_established_options_rm_addr(sk, &opt_size, remaining, opts)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) *size += opt_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) remaining -= opt_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) ret = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) bool mptcp_synack_options(const struct request_sock *req, unsigned int *size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) struct mptcp_out_options *opts)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) struct mptcp_subflow_request_sock *subflow_req = mptcp_subflow_rsk(req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) if (subflow_req->mp_capable) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) opts->suboptions = OPTION_MPTCP_MPC_SYNACK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) opts->sndr_key = subflow_req->local_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) *size = TCPOLEN_MPTCP_MPC_SYNACK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) pr_debug("subflow_req=%p, local_key=%llu",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) subflow_req, subflow_req->local_key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) } else if (subflow_req->mp_join) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) opts->suboptions = OPTION_MPTCP_MPJ_SYNACK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) opts->backup = subflow_req->backup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) opts->join_id = subflow_req->local_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) opts->thmac = subflow_req->thmac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) opts->nonce = subflow_req->local_nonce;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) pr_debug("req=%p, bkup=%u, id=%u, thmac=%llu, nonce=%u",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) subflow_req, opts->backup, opts->join_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) opts->thmac, opts->nonce);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) *size = TCPOLEN_MPTCP_MPJ_SYNACK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) static bool check_fully_established(struct mptcp_sock *msk, struct sock *ssk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) struct mptcp_subflow_context *subflow,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) struct sk_buff *skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) struct mptcp_options_received *mp_opt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) /* here we can process OoO, in-window pkts, only in-sequence 4th ack
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) * will make the subflow fully established
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) if (likely(subflow->fully_established)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) /* on passive sockets, check for 3rd ack retransmission
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) * note that msk is always set by subflow_syn_recv_sock()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) * for mp_join subflows
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) if (TCP_SKB_CB(skb)->seq == subflow->ssn_offset + 1 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) TCP_SKB_CB(skb)->end_seq == TCP_SKB_CB(skb)->seq &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) subflow->mp_join && mp_opt->mp_join &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) READ_ONCE(msk->pm.server_side))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) tcp_send_ack(ssk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) goto fully_established;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) /* we must process OoO packets before the first subflow is fully
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) * established. OoO packets are instead a protocol violation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) * for MP_JOIN subflows as the peer must not send any data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) * before receiving the forth ack - cfr. RFC 8684 section 3.2.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) if (TCP_SKB_CB(skb)->seq != subflow->ssn_offset + 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) if (subflow->mp_join)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) goto reset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) return subflow->mp_capable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) if (mp_opt->dss && mp_opt->use_ack) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) /* subflows are fully established as soon as we get any
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) * additional ack.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) subflow->fully_established = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) WRITE_ONCE(msk->fully_established, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) goto fully_established;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) /* If the first established packet does not contain MP_CAPABLE + data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) * then fallback to TCP. Fallback scenarios requires a reset for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) * MP_JOIN subflows.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) if (!mp_opt->mp_capable) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) if (subflow->mp_join)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) goto reset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) subflow->mp_capable = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) pr_fallback(msk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) __mptcp_do_fallback(msk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) if (unlikely(!READ_ONCE(msk->pm.server_side)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) pr_warn_once("bogus mpc option on established client sk");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) mptcp_subflow_fully_established(subflow, mp_opt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) fully_established:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) if (likely(subflow->pm_notified))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) subflow->pm_notified = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) if (subflow->mp_join) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) clear_3rdack_retransmission(ssk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) mptcp_pm_subflow_established(msk, subflow);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) mptcp_pm_fully_established(msk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) reset:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) mptcp_subflow_reset(ssk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) static u64 expand_ack(u64 old_ack, u64 cur_ack, bool use_64bit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) u32 old_ack32, cur_ack32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) if (use_64bit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) return cur_ack;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) old_ack32 = (u32)old_ack;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) cur_ack32 = (u32)cur_ack;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) cur_ack = (old_ack & GENMASK_ULL(63, 32)) + cur_ack32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) if (unlikely(before(cur_ack32, old_ack32)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) return cur_ack + (1LL << 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) return cur_ack;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) static void update_una(struct mptcp_sock *msk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) struct mptcp_options_received *mp_opt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) u64 new_snd_una, snd_una, old_snd_una = atomic64_read(&msk->snd_una);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) u64 write_seq = READ_ONCE(msk->write_seq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) /* avoid ack expansion on update conflict, to reduce the risk of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) * wrongly expanding to a future ack sequence number, which is way
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) * more dangerous than missing an ack
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) new_snd_una = expand_ack(old_snd_una, mp_opt->data_ack, mp_opt->ack64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) /* ACK for data not even sent yet? Ignore. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) if (after64(new_snd_una, write_seq))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) new_snd_una = old_snd_una;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) while (after64(new_snd_una, old_snd_una)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) snd_una = old_snd_una;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) old_snd_una = atomic64_cmpxchg(&msk->snd_una, snd_una,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) new_snd_una);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) if (old_snd_una == snd_una) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) mptcp_data_acked((struct sock *)msk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) bool mptcp_update_rcv_data_fin(struct mptcp_sock *msk, u64 data_fin_seq, bool use_64bit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) /* Skip if DATA_FIN was already received.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) * If updating simultaneously with the recvmsg loop, values
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) * should match. If they mismatch, the peer is misbehaving and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) * we will prefer the most recent information.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) if (READ_ONCE(msk->rcv_data_fin) || !READ_ONCE(msk->first))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) WRITE_ONCE(msk->rcv_data_fin_seq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) expand_ack(READ_ONCE(msk->ack_seq), data_fin_seq, use_64bit));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) WRITE_ONCE(msk->rcv_data_fin, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) static bool add_addr_hmac_valid(struct mptcp_sock *msk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) struct mptcp_options_received *mp_opt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) u64 hmac = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) if (mp_opt->echo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) if (mp_opt->family == MPTCP_ADDR_IPVERSION_4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) hmac = add_addr_generate_hmac(msk->remote_key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) msk->local_key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) mp_opt->addr_id, &mp_opt->addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) #if IS_ENABLED(CONFIG_MPTCP_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) hmac = add_addr6_generate_hmac(msk->remote_key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) msk->local_key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) mp_opt->addr_id, &mp_opt->addr6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) pr_debug("msk=%p, ahmac=%llu, mp_opt->ahmac=%llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) msk, (unsigned long long)hmac,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) (unsigned long long)mp_opt->ahmac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) return hmac == mp_opt->ahmac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) void mptcp_incoming_options(struct sock *sk, struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) struct mptcp_sock *msk = mptcp_sk(subflow->conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) struct mptcp_options_received mp_opt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) struct mptcp_ext *mpext;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) if (__mptcp_check_fallback(msk))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) mptcp_get_options(skb, &mp_opt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) if (!check_fully_established(msk, sk, subflow, skb, &mp_opt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) if (mp_opt.add_addr && add_addr_hmac_valid(msk, &mp_opt)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) struct mptcp_addr_info addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) addr.port = htons(mp_opt.port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) addr.id = mp_opt.addr_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) if (mp_opt.family == MPTCP_ADDR_IPVERSION_4) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) addr.family = AF_INET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) addr.addr = mp_opt.addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) #if IS_ENABLED(CONFIG_MPTCP_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) else if (mp_opt.family == MPTCP_ADDR_IPVERSION_6) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) addr.family = AF_INET6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) addr.addr6 = mp_opt.addr6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) if (!mp_opt.echo) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) mptcp_pm_add_addr_received(msk, &addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_ADDADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) mptcp_pm_del_add_timer(msk, &addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_ECHOADD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) mp_opt.add_addr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) if (mp_opt.rm_addr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) mptcp_pm_rm_addr_received(msk, mp_opt.rm_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) mp_opt.rm_addr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) if (!mp_opt.dss)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) /* we can't wait for recvmsg() to update the ack_seq, otherwise
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) * monodirectional flows will stuck
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) if (mp_opt.use_ack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) update_una(msk, &mp_opt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) /* Zero-data-length packets are dropped by the caller and not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) * propagated to the MPTCP layer, so the skb extension does not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) * need to be allocated or populated. DATA_FIN information, if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) * present, needs to be updated here before the skb is freed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) if (TCP_SKB_CB(skb)->seq == TCP_SKB_CB(skb)->end_seq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) if (mp_opt.data_fin && mp_opt.data_len == 1 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) mptcp_update_rcv_data_fin(msk, mp_opt.data_seq, mp_opt.dsn64) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) schedule_work(&msk->work))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) sock_hold(subflow->conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) mpext = skb_ext_add(skb, SKB_EXT_MPTCP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) if (!mpext)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) memset(mpext, 0, sizeof(*mpext));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) if (mp_opt.use_map) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) if (mp_opt.mpc_map) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) /* this is an MP_CAPABLE carrying MPTCP data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) * we know this map the first chunk of data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) mptcp_crypto_key_sha(subflow->remote_key, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) &mpext->data_seq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) mpext->data_seq++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) mpext->subflow_seq = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) mpext->dsn64 = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) mpext->mpc_map = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) mpext->data_fin = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) mpext->data_seq = mp_opt.data_seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) mpext->subflow_seq = mp_opt.subflow_seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) mpext->dsn64 = mp_opt.dsn64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) mpext->data_fin = mp_opt.data_fin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) mpext->data_len = mp_opt.data_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) mpext->use_map = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) void mptcp_write_options(__be32 *ptr, struct mptcp_out_options *opts)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) if ((OPTION_MPTCP_MPC_SYN | OPTION_MPTCP_MPC_SYNACK |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) OPTION_MPTCP_MPC_ACK) & opts->suboptions) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) u8 len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) if (OPTION_MPTCP_MPC_SYN & opts->suboptions)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) len = TCPOLEN_MPTCP_MPC_SYN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) else if (OPTION_MPTCP_MPC_SYNACK & opts->suboptions)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) len = TCPOLEN_MPTCP_MPC_SYNACK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) else if (opts->ext_copy.data_len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) len = TCPOLEN_MPTCP_MPC_ACK_DATA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) len = TCPOLEN_MPTCP_MPC_ACK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) *ptr++ = mptcp_option(MPTCPOPT_MP_CAPABLE, len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) MPTCP_SUPPORTED_VERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) MPTCP_CAP_HMAC_SHA256);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) if (!((OPTION_MPTCP_MPC_SYNACK | OPTION_MPTCP_MPC_ACK) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) opts->suboptions))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) goto mp_capable_done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) put_unaligned_be64(opts->sndr_key, ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) ptr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) if (!((OPTION_MPTCP_MPC_ACK) & opts->suboptions))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) goto mp_capable_done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) put_unaligned_be64(opts->rcvr_key, ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) ptr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) if (!opts->ext_copy.data_len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) goto mp_capable_done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) put_unaligned_be32(opts->ext_copy.data_len << 16 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) TCPOPT_NOP << 8 | TCPOPT_NOP, ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) ptr += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) mp_capable_done:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) if (OPTION_MPTCP_ADD_ADDR & opts->suboptions) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) if (opts->ahmac)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) *ptr++ = mptcp_option(MPTCPOPT_ADD_ADDR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) TCPOLEN_MPTCP_ADD_ADDR, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) opts->addr_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) *ptr++ = mptcp_option(MPTCPOPT_ADD_ADDR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) TCPOLEN_MPTCP_ADD_ADDR_BASE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) MPTCP_ADDR_ECHO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) opts->addr_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) memcpy((u8 *)ptr, (u8 *)&opts->addr.s_addr, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) ptr += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) if (opts->ahmac) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) put_unaligned_be64(opts->ahmac, ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) ptr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) #if IS_ENABLED(CONFIG_MPTCP_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) if (OPTION_MPTCP_ADD_ADDR6 & opts->suboptions) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) if (opts->ahmac)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) *ptr++ = mptcp_option(MPTCPOPT_ADD_ADDR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) TCPOLEN_MPTCP_ADD_ADDR6, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) opts->addr_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) *ptr++ = mptcp_option(MPTCPOPT_ADD_ADDR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) TCPOLEN_MPTCP_ADD_ADDR6_BASE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) MPTCP_ADDR_ECHO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) opts->addr_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) memcpy((u8 *)ptr, opts->addr6.s6_addr, 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) ptr += 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) if (opts->ahmac) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) put_unaligned_be64(opts->ahmac, ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) ptr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) if (OPTION_MPTCP_RM_ADDR & opts->suboptions) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) *ptr++ = mptcp_option(MPTCPOPT_RM_ADDR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) TCPOLEN_MPTCP_RM_ADDR_BASE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) 0, opts->rm_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) if (OPTION_MPTCP_MPJ_SYN & opts->suboptions) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) *ptr++ = mptcp_option(MPTCPOPT_MP_JOIN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) TCPOLEN_MPTCP_MPJ_SYN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) opts->backup, opts->join_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) put_unaligned_be32(opts->token, ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) ptr += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) put_unaligned_be32(opts->nonce, ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) ptr += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) if (OPTION_MPTCP_MPJ_SYNACK & opts->suboptions) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) *ptr++ = mptcp_option(MPTCPOPT_MP_JOIN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) TCPOLEN_MPTCP_MPJ_SYNACK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) opts->backup, opts->join_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) put_unaligned_be64(opts->thmac, ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) ptr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) put_unaligned_be32(opts->nonce, ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) ptr += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) if (OPTION_MPTCP_MPJ_ACK & opts->suboptions) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) *ptr++ = mptcp_option(MPTCPOPT_MP_JOIN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) TCPOLEN_MPTCP_MPJ_ACK, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) memcpy(ptr, opts->hmac, MPTCPOPT_HMAC_LEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) ptr += 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) if (opts->ext_copy.use_ack || opts->ext_copy.use_map) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) struct mptcp_ext *mpext = &opts->ext_copy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) u8 len = TCPOLEN_MPTCP_DSS_BASE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) u8 flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) if (mpext->use_ack) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) flags = MPTCP_DSS_HAS_ACK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) if (mpext->ack64) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) len += TCPOLEN_MPTCP_DSS_ACK64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) flags |= MPTCP_DSS_ACK64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) len += TCPOLEN_MPTCP_DSS_ACK32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) if (mpext->use_map) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) len += TCPOLEN_MPTCP_DSS_MAP64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) /* Use only 64-bit mapping flags for now, add
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) * support for optional 32-bit mappings later.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) flags |= MPTCP_DSS_HAS_MAP | MPTCP_DSS_DSN64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) if (mpext->data_fin)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) flags |= MPTCP_DSS_DATA_FIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) *ptr++ = mptcp_option(MPTCPOPT_DSS, len, 0, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) if (mpext->use_ack) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) if (mpext->ack64) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) put_unaligned_be64(mpext->data_ack, ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) ptr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) put_unaligned_be32(mpext->data_ack32, ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) ptr += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) if (mpext->use_map) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) put_unaligned_be64(mpext->data_seq, ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) ptr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) put_unaligned_be32(mpext->subflow_seq, ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) ptr += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) put_unaligned_be32(mpext->data_len << 16 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) TCPOPT_NOP << 8 | TCPOPT_NOP, ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) }