^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) #ifndef __MPTCP_PROTOCOL_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #define __MPTCP_PROTOCOL_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/random.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/inet_connection_sock.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #define MPTCP_SUPPORTED_VERSION 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) /* MPTCP option bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #define OPTION_MPTCP_MPC_SYN BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #define OPTION_MPTCP_MPC_SYNACK BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define OPTION_MPTCP_MPC_ACK BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define OPTION_MPTCP_MPJ_SYN BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define OPTION_MPTCP_MPJ_SYNACK BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define OPTION_MPTCP_MPJ_ACK BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define OPTION_MPTCP_ADD_ADDR BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define OPTION_MPTCP_ADD_ADDR6 BIT(7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define OPTION_MPTCP_RM_ADDR BIT(8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) /* MPTCP option subtypes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define MPTCPOPT_MP_CAPABLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define MPTCPOPT_MP_JOIN 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define MPTCPOPT_DSS 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define MPTCPOPT_ADD_ADDR 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define MPTCPOPT_RM_ADDR 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define MPTCPOPT_MP_PRIO 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define MPTCPOPT_MP_FAIL 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define MPTCPOPT_MP_FASTCLOSE 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) /* MPTCP suboption lengths */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define TCPOLEN_MPTCP_MPC_SYN 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define TCPOLEN_MPTCP_MPC_SYNACK 12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define TCPOLEN_MPTCP_MPC_ACK 20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define TCPOLEN_MPTCP_MPC_ACK_DATA 22
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define TCPOLEN_MPTCP_MPJ_SYN 12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define TCPOLEN_MPTCP_MPJ_SYNACK 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define TCPOLEN_MPTCP_MPJ_ACK 24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #define TCPOLEN_MPTCP_DSS_BASE 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define TCPOLEN_MPTCP_DSS_ACK32 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define TCPOLEN_MPTCP_DSS_ACK64 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define TCPOLEN_MPTCP_DSS_MAP32 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define TCPOLEN_MPTCP_DSS_MAP64 14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define TCPOLEN_MPTCP_DSS_CHECKSUM 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define TCPOLEN_MPTCP_ADD_ADDR 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define TCPOLEN_MPTCP_ADD_ADDR_PORT 18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define TCPOLEN_MPTCP_ADD_ADDR_BASE 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define TCPOLEN_MPTCP_ADD_ADDR_BASE_PORT 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define TCPOLEN_MPTCP_ADD_ADDR6 28
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define TCPOLEN_MPTCP_ADD_ADDR6_PORT 30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define TCPOLEN_MPTCP_ADD_ADDR6_BASE 20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define TCPOLEN_MPTCP_ADD_ADDR6_BASE_PORT 22
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #define TCPOLEN_MPTCP_PORT_LEN 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define TCPOLEN_MPTCP_RM_ADDR_BASE 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) /* MPTCP MP_JOIN flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define MPTCPOPT_BACKUP BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #define MPTCPOPT_HMAC_LEN 20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #define MPTCPOPT_THMAC_LEN 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) /* MPTCP MP_CAPABLE flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #define MPTCP_VERSION_MASK (0x0F)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #define MPTCP_CAP_CHECKSUM_REQD BIT(7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #define MPTCP_CAP_EXTENSIBILITY BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) #define MPTCP_CAP_HMAC_SHA256 BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) #define MPTCP_CAP_FLAG_MASK (0x3F)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) /* MPTCP DSS flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) #define MPTCP_DSS_DATA_FIN BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #define MPTCP_DSS_DSN64 BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) #define MPTCP_DSS_HAS_MAP BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) #define MPTCP_DSS_ACK64 BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) #define MPTCP_DSS_HAS_ACK BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) #define MPTCP_DSS_FLAG_MASK (0x1F)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) /* MPTCP ADD_ADDR flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) #define MPTCP_ADDR_ECHO BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) #define MPTCP_ADDR_IPVERSION_4 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) #define MPTCP_ADDR_IPVERSION_6 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) /* MPTCP socket flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) #define MPTCP_DATA_READY 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) #define MPTCP_SEND_SPACE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) #define MPTCP_WORK_RTX 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) #define MPTCP_WORK_EOF 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) #define MPTCP_FALLBACK_DONE 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #define MPTCP_WORK_CLOSE_SUBFLOW 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) struct mptcp_options_received {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) u64 sndr_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) u64 rcvr_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) u64 data_ack;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) u64 data_seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) u32 subflow_seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) u16 data_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) u16 mp_capable : 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) mp_join : 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) dss : 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) add_addr : 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) rm_addr : 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) family : 4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) echo : 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) backup : 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) u32 token;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) u32 nonce;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) u64 thmac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) u8 hmac[20];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) u8 join_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) u8 use_map:1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) dsn64:1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) data_fin:1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) use_ack:1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) ack64:1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) mpc_map:1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) __unused:2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) u8 addr_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) u8 rm_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) struct in_addr addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) #if IS_ENABLED(CONFIG_MPTCP_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) struct in6_addr addr6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) u64 ahmac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) u16 port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) static inline __be32 mptcp_option(u8 subopt, u8 len, u8 nib, u8 field)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) return htonl((TCPOPT_MPTCP << 24) | (len << 16) | (subopt << 12) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) ((nib & 0xF) << 8) | field);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) struct mptcp_addr_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) sa_family_t family;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) __be16 port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) u8 id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) u8 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) int ifindex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) struct in_addr addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) #if IS_ENABLED(CONFIG_MPTCP_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) struct in6_addr addr6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) enum mptcp_pm_status {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) MPTCP_PM_ADD_ADDR_RECEIVED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) MPTCP_PM_RM_ADDR_RECEIVED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) MPTCP_PM_ESTABLISHED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) MPTCP_PM_SUBFLOW_ESTABLISHED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) struct mptcp_pm_data {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) struct mptcp_addr_info local;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) struct mptcp_addr_info remote;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) struct list_head anno_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) spinlock_t lock; /*protects the whole PM data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) bool add_addr_signal;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) bool rm_addr_signal;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) bool server_side;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) bool work_pending;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) bool accept_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) bool accept_subflow;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) bool add_addr_echo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) u8 add_addr_signaled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) u8 add_addr_accepted;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) u8 local_addr_used;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) u8 subflows;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) u8 add_addr_signal_max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) u8 add_addr_accept_max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) u8 local_addr_max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) u8 subflows_max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) u8 status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) u8 rm_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) struct mptcp_data_frag {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) u64 data_seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) int data_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) int offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) int overhead;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) struct page *page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) /* MPTCP connection sock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) struct mptcp_sock {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) /* inet_connection_sock must be the first member */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) struct inet_connection_sock sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) u64 local_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) u64 remote_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) u64 write_seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) u64 ack_seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) u64 rcv_data_fin_seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) struct sock *last_snd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) int snd_burst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) atomic64_t snd_una;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) unsigned long timer_ival;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) u32 token;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) bool can_ack;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) bool fully_established;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) bool rcv_data_fin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) bool snd_data_fin_enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) bool use_64bit_ack; /* Set when we received a 64-bit DSN */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) spinlock_t join_list_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) struct work_struct work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) struct sk_buff *ooo_last_skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) struct rb_root out_of_order_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) struct list_head conn_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) struct list_head rtx_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) struct list_head join_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) struct skb_ext *cached_ext; /* for the next sendmsg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) struct socket *subflow; /* outgoing connect/listener/!mp_capable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) struct sock *first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) struct mptcp_pm_data pm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) u32 space; /* bytes copied in last measurement window */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) u32 copied; /* bytes copied in this measurement window */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) u64 time; /* start time of measurement window */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) u64 rtt_us; /* last maximum rtt of subflows */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) } rcvq_space;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) #define mptcp_for_each_subflow(__msk, __subflow) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) list_for_each_entry(__subflow, &((__msk)->conn_list), node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) static inline struct mptcp_sock *mptcp_sk(const struct sock *sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) return (struct mptcp_sock *)sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) static inline struct mptcp_data_frag *mptcp_rtx_tail(const struct sock *sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) struct mptcp_sock *msk = mptcp_sk(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) if (list_empty(&msk->rtx_queue))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) return list_last_entry(&msk->rtx_queue, struct mptcp_data_frag, list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) static inline struct mptcp_data_frag *mptcp_rtx_head(const struct sock *sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) struct mptcp_sock *msk = mptcp_sk(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) return list_first_entry_or_null(&msk->rtx_queue, struct mptcp_data_frag, list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) struct mptcp_subflow_request_sock {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) struct tcp_request_sock sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) u16 mp_capable : 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) mp_join : 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) backup : 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) u8 local_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) u8 remote_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) u64 local_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) u64 idsn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) u32 token;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) u32 ssn_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) u64 thmac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) u32 local_nonce;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) u32 remote_nonce;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) struct mptcp_sock *msk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) struct hlist_nulls_node token_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) static inline struct mptcp_subflow_request_sock *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) mptcp_subflow_rsk(const struct request_sock *rsk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) return (struct mptcp_subflow_request_sock *)rsk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) enum mptcp_data_avail {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) MPTCP_SUBFLOW_NODATA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) MPTCP_SUBFLOW_DATA_AVAIL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) MPTCP_SUBFLOW_OOO_DATA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) /* MPTCP subflow context */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) struct mptcp_subflow_context {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) struct list_head node;/* conn_list of subflows */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) u64 local_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) u64 remote_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) u64 idsn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) u64 map_seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) u32 snd_isn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) u32 token;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) u32 rel_write_seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) u32 map_subflow_seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) u32 ssn_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) u32 map_data_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) u32 request_mptcp : 1, /* send MP_CAPABLE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) request_join : 1, /* send MP_JOIN */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) request_bkup : 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) mp_capable : 1, /* remote is MPTCP capable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) mp_join : 1, /* remote is JOINing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) fully_established : 1, /* path validated */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) pm_notified : 1, /* PM hook called for established status */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) conn_finished : 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) map_valid : 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) mpc_map : 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) backup : 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) rx_eof : 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) can_ack : 1; /* only after processing the remote a key */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) enum mptcp_data_avail data_avail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) u32 remote_nonce;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) u64 thmac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) u32 local_nonce;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) u32 remote_token;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) u8 hmac[MPTCPOPT_HMAC_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) u8 local_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) u8 remote_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) struct sock *tcp_sock; /* tcp sk backpointer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) struct sock *conn; /* parent mptcp_sock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) const struct inet_connection_sock_af_ops *icsk_af_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) void (*tcp_data_ready)(struct sock *sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) void (*tcp_state_change)(struct sock *sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) void (*tcp_write_space)(struct sock *sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) struct rcu_head rcu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) static inline struct mptcp_subflow_context *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) mptcp_subflow_ctx(const struct sock *sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) struct inet_connection_sock *icsk = inet_csk(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) /* Use RCU on icsk_ulp_data only for sock diag code */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) return (__force struct mptcp_subflow_context *)icsk->icsk_ulp_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) static inline struct sock *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) return subflow->tcp_sock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) static inline u64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) mptcp_subflow_get_map_offset(const struct mptcp_subflow_context *subflow)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) return tcp_sk(mptcp_subflow_tcp_sock(subflow))->copied_seq -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) subflow->ssn_offset -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) subflow->map_subflow_seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) static inline u64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) mptcp_subflow_get_mapped_dsn(const struct mptcp_subflow_context *subflow)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) return subflow->map_seq + mptcp_subflow_get_map_offset(subflow);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) int mptcp_is_enabled(struct net *net);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) void mptcp_subflow_fully_established(struct mptcp_subflow_context *subflow,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) struct mptcp_options_received *mp_opt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) bool mptcp_subflow_data_available(struct sock *sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) void __init mptcp_subflow_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) void mptcp_subflow_shutdown(struct sock *sk, struct sock *ssk, int how);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) void __mptcp_close_ssk(struct sock *sk, struct sock *ssk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) struct mptcp_subflow_context *subflow,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) long timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) void mptcp_subflow_reset(struct sock *ssk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) /* called with sk socket lock held */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_addr_info *loc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) const struct mptcp_addr_info *remote);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) int mptcp_subflow_create_socket(struct sock *sk, struct socket **new_sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) static inline void mptcp_subflow_tcp_fallback(struct sock *sk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) struct mptcp_subflow_context *ctx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) sk->sk_data_ready = ctx->tcp_data_ready;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) sk->sk_state_change = ctx->tcp_state_change;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) sk->sk_write_space = ctx->tcp_write_space;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) inet_csk(sk)->icsk_af_ops = ctx->icsk_af_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) void __init mptcp_proto_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) #if IS_ENABLED(CONFIG_MPTCP_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) int __init mptcp_proto_v6_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) struct sock *mptcp_sk_clone(const struct sock *sk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) const struct mptcp_options_received *mp_opt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) struct request_sock *req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) void mptcp_get_options(const struct sk_buff *skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) struct mptcp_options_received *mp_opt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) void mptcp_finish_connect(struct sock *sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) static inline bool mptcp_is_fully_established(struct sock *sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) return inet_sk_state_load(sk) == TCP_ESTABLISHED &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) READ_ONCE(mptcp_sk(sk)->fully_established);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) void mptcp_rcv_space_init(struct mptcp_sock *msk, const struct sock *ssk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) void mptcp_data_ready(struct sock *sk, struct sock *ssk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) bool mptcp_finish_join(struct sock *sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) void mptcp_data_acked(struct sock *sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) void mptcp_subflow_eof(struct sock *sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) 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 413) void mptcp_destroy_common(struct mptcp_sock *msk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) void __init mptcp_token_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) static inline void mptcp_token_init_request(struct request_sock *req)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) mptcp_subflow_rsk(req)->token_node.pprev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) int mptcp_token_new_request(struct request_sock *req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) void mptcp_token_destroy_request(struct request_sock *req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) int mptcp_token_new_connect(struct sock *sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) void mptcp_token_accept(struct mptcp_subflow_request_sock *r,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) struct mptcp_sock *msk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) bool mptcp_token_exists(u32 token);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) struct mptcp_sock *mptcp_token_get_sock(struct net *net, u32 token);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) struct mptcp_sock *mptcp_token_iter_next(const struct net *net, long *s_slot,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) long *s_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) void mptcp_token_destroy(struct mptcp_sock *msk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) void mptcp_crypto_key_sha(u64 key, u32 *token, u64 *idsn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) void mptcp_crypto_hmac_sha(u64 key1, u64 key2, u8 *msg, int len, void *hmac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) void __init mptcp_pm_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) void mptcp_pm_data_init(struct mptcp_sock *msk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) void mptcp_pm_new_connection(struct mptcp_sock *msk, int server_side);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) void mptcp_pm_fully_established(struct mptcp_sock *msk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) bool mptcp_pm_allow_new_subflow(struct mptcp_sock *msk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) void mptcp_pm_connection_closed(struct mptcp_sock *msk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) void mptcp_pm_subflow_established(struct mptcp_sock *msk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) struct mptcp_subflow_context *subflow);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) void mptcp_pm_subflow_closed(struct mptcp_sock *msk, u8 id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) void mptcp_pm_add_addr_received(struct mptcp_sock *msk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) const struct mptcp_addr_info *addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) void mptcp_pm_rm_addr_received(struct mptcp_sock *msk, u8 rm_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) void mptcp_pm_free_anno_list(struct mptcp_sock *msk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) struct mptcp_pm_add_entry *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) mptcp_pm_del_add_timer(struct mptcp_sock *msk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) struct mptcp_addr_info *addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) int mptcp_pm_announce_addr(struct mptcp_sock *msk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) const struct mptcp_addr_info *addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) bool echo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) int mptcp_pm_remove_addr(struct mptcp_sock *msk, u8 local_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) int mptcp_pm_remove_subflow(struct mptcp_sock *msk, u8 local_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) static inline bool mptcp_pm_should_add_signal(struct mptcp_sock *msk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) return READ_ONCE(msk->pm.add_addr_signal);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) static inline bool mptcp_pm_should_rm_signal(struct mptcp_sock *msk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) return READ_ONCE(msk->pm.rm_addr_signal);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) static inline unsigned int mptcp_add_addr_len(int family, bool echo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) if (family == AF_INET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) return echo ? TCPOLEN_MPTCP_ADD_ADDR_BASE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) : TCPOLEN_MPTCP_ADD_ADDR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) return echo ? TCPOLEN_MPTCP_ADD_ADDR6_BASE : TCPOLEN_MPTCP_ADD_ADDR6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) struct mptcp_addr_info *saddr, bool *echo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) u8 *rm_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) void __init mptcp_pm_nl_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) void mptcp_pm_nl_data_init(struct mptcp_sock *msk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) void mptcp_pm_nl_fully_established(struct mptcp_sock *msk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) void mptcp_pm_nl_subflow_established(struct mptcp_sock *msk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) void mptcp_pm_nl_rm_addr_received(struct mptcp_sock *msk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) void mptcp_pm_nl_rm_subflow_received(struct mptcp_sock *msk, u8 rm_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) static inline struct mptcp_ext *mptcp_get_ext(struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) return (struct mptcp_ext *)skb_ext_find(skb, SKB_EXT_MPTCP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) static inline bool before64(__u64 seq1, __u64 seq2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) return (__s64)(seq1 - seq2) < 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) #define after64(seq2, seq1) before64(seq1, seq2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) void mptcp_diag_subflow_init(struct tcp_ulp_ops *ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) static inline bool __mptcp_check_fallback(const struct mptcp_sock *msk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) return test_bit(MPTCP_FALLBACK_DONE, &msk->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) static inline bool mptcp_check_fallback(const struct sock *sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) struct mptcp_sock *msk = mptcp_sk(subflow->conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) return __mptcp_check_fallback(msk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) static inline void __mptcp_do_fallback(struct mptcp_sock *msk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) if (test_bit(MPTCP_FALLBACK_DONE, &msk->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) pr_debug("TCP fallback already done (msk=%p)", msk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) set_bit(MPTCP_FALLBACK_DONE, &msk->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) static inline void mptcp_do_fallback(struct sock *sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) struct mptcp_sock *msk = mptcp_sk(subflow->conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) __mptcp_do_fallback(msk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) #define pr_fallback(a) pr_debug("%s:fallback to TCP (msk=%p)", __func__, a)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) static inline bool subflow_simultaneous_connect(struct sock *sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) struct sock *parent = subflow->conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) return sk->sk_state == TCP_ESTABLISHED &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) !mptcp_sk(parent)->pm.server_side &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) !subflow->conn_finished;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) #ifdef CONFIG_SYN_COOKIES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) void subflow_init_req_cookie_join_save(const struct mptcp_subflow_request_sock *subflow_req,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) struct sk_buff *skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) bool mptcp_token_join_cookie_init_state(struct mptcp_subflow_request_sock *subflow_req,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) struct sk_buff *skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) void __init mptcp_join_cookie_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) static inline void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) subflow_init_req_cookie_join_save(const struct mptcp_subflow_request_sock *subflow_req,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) struct sk_buff *skb) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) static inline bool
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) mptcp_token_join_cookie_init_state(struct mptcp_subflow_request_sock *subflow_req,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) static inline void mptcp_join_cookie_init(void) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) #endif /* __MPTCP_PROTOCOL_H */