| 1 |
|
| 2 | |
| 3 | *
|
| 4 | * Copyright (c) 2017 - 2019, Intel Corporation.
|
| 5 |
|
| 6 |
|
| 7 | #ifndef __MPTCP_PROTOCOL_H
|
| 8 | #define __MPTCP_PROTOCOL_H
|
| 9 |
|
| 10 | #include <linux/random.h>
|
| 11 | #include <net/tcp.h>
|
| 12 | #include <net/inet_connection_sock.h>
|
| 13 | #include <uapi/linux/mptcp.h>
|
| 14 | #include <net/genetlink.h>
|
| 15 | #include <net/rstreason.h>
|
| 16 |
|
| 17 | #define MPTCP_SUPPORTED_VERSION 1
|
| 18 |
|
| 19 |
|
| 20 | #define OPTION_MPTCP_MPC_SYN BIT(0)
|
| 21 | #define OPTION_MPTCP_MPC_SYNACK BIT(1)
|
| 22 | #define OPTION_MPTCP_MPC_ACK BIT(2)
|
| 23 | #define OPTION_MPTCP_MPJ_SYN BIT(3)
|
| 24 | #define OPTION_MPTCP_MPJ_SYNACK BIT(4)
|
| 25 | #define OPTION_MPTCP_MPJ_ACK BIT(5)
|
| 26 | #define OPTION_MPTCP_ADD_ADDR BIT(6)
|
| 27 | #define OPTION_MPTCP_RM_ADDR BIT(7)
|
| 28 | #define OPTION_MPTCP_FASTCLOSE BIT(8)
|
| 29 | #define OPTION_MPTCP_PRIO BIT(9)
|
| 30 | #define OPTION_MPTCP_RST BIT(10)
|
| 31 | #define OPTION_MPTCP_DSS BIT(11)
|
| 32 | #define OPTION_MPTCP_FAIL BIT(12)
|
| 33 |
|
| 34 | #define OPTION_MPTCP_CSUMREQD BIT(13)
|
| 35 |
|
| 36 | #define OPTIONS_MPTCP_MPC (OPTION_MPTCP_MPC_SYN | OPTION_MPTCP_MPC_SYNACK | \
|
| 37 | OPTION_MPTCP_MPC_ACK)
|
| 38 | #define OPTIONS_MPTCP_MPJ (OPTION_MPTCP_MPJ_SYN | OPTION_MPTCP_MPJ_SYNACK | \
|
| 39 | OPTION_MPTCP_MPJ_ACK)
|
| 40 | #define OPTIONS_MPTCP_DSS (OPTION_MPTCP_DSS | OPTION_MPTCP_CSUMREQD)
|
| 41 |
|
| 42 |
|
| 43 | #define MPTCPOPT_MP_CAPABLE 0
|
| 44 | #define MPTCPOPT_MP_JOIN 1
|
| 45 | #define MPTCPOPT_DSS 2
|
| 46 | #define MPTCPOPT_ADD_ADDR 3
|
| 47 | #define MPTCPOPT_RM_ADDR 4
|
| 48 | #define MPTCPOPT_MP_PRIO 5
|
| 49 | #define MPTCPOPT_MP_FAIL 6
|
| 50 | #define MPTCPOPT_MP_FASTCLOSE 7
|
| 51 | #define MPTCPOPT_RST 8
|
| 52 |
|
| 53 |
|
| 54 | #define TCPOLEN_MPTCP_MPC_SYN 4
|
| 55 | #define TCPOLEN_MPTCP_MPC_SYNACK 12
|
| 56 | #define TCPOLEN_MPTCP_MPC_ACK 20
|
| 57 | #define TCPOLEN_MPTCP_MPC_ACK_DATA 22
|
| 58 | #define TCPOLEN_MPTCP_MPJ_SYN 12
|
| 59 | #define TCPOLEN_MPTCP_MPJ_SYNACK 16
|
| 60 | #define TCPOLEN_MPTCP_MPJ_ACK 24
|
| 61 | #define TCPOLEN_MPTCP_DSS_BASE 4
|
| 62 | #define TCPOLEN_MPTCP_DSS_ACK32 4
|
| 63 | #define TCPOLEN_MPTCP_DSS_ACK64 8
|
| 64 | #define TCPOLEN_MPTCP_DSS_MAP32 10
|
| 65 | #define TCPOLEN_MPTCP_DSS_MAP64 14
|
| 66 | #define TCPOLEN_MPTCP_DSS_CHECKSUM 2
|
| 67 | #define TCPOLEN_MPTCP_ADD_ADDR 16
|
| 68 | #define TCPOLEN_MPTCP_ADD_ADDR_PORT 18
|
| 69 | #define TCPOLEN_MPTCP_ADD_ADDR_BASE 8
|
| 70 | #define TCPOLEN_MPTCP_ADD_ADDR_BASE_PORT 10
|
| 71 | #define TCPOLEN_MPTCP_ADD_ADDR6 28
|
| 72 | #define TCPOLEN_MPTCP_ADD_ADDR6_PORT 30
|
| 73 | #define TCPOLEN_MPTCP_ADD_ADDR6_BASE 20
|
| 74 | #define TCPOLEN_MPTCP_ADD_ADDR6_BASE_PORT 22
|
| 75 | #define TCPOLEN_MPTCP_PORT_LEN 2
|
| 76 | #define TCPOLEN_MPTCP_PORT_ALIGN 2
|
| 77 | #define TCPOLEN_MPTCP_RM_ADDR_BASE 3
|
| 78 | #define TCPOLEN_MPTCP_PRIO 3
|
| 79 | #define TCPOLEN_MPTCP_PRIO_ALIGN 4
|
| 80 | #define TCPOLEN_MPTCP_FASTCLOSE 12
|
| 81 | #define TCPOLEN_MPTCP_RST 4
|
| 82 | #define TCPOLEN_MPTCP_FAIL 12
|
| 83 |
|
| 84 | #define TCPOLEN_MPTCP_MPC_ACK_DATA_CSUM (TCPOLEN_MPTCP_DSS_CHECKSUM + TCPOLEN_MPTCP_MPC_ACK_DATA)
|
| 85 |
|
| 86 |
|
| 87 | #define MPTCPOPT_BACKUP BIT(0)
|
| 88 | #define MPTCPOPT_THMAC_LEN 8
|
| 89 |
|
| 90 |
|
| 91 | #define MPTCP_VERSION_MASK (0x0F)
|
| 92 | #define MPTCP_CAP_CHECKSUM_REQD BIT(7)
|
| 93 | #define MPTCP_CAP_EXTENSIBILITY BIT(6)
|
| 94 | #define MPTCP_CAP_DENY_JOIN_ID0 BIT(5)
|
| 95 | #define MPTCP_CAP_HMAC_SHA256 BIT(0)
|
| 96 | #define MPTCP_CAP_FLAG_MASK (0x1F)
|
| 97 |
|
| 98 |
|
| 99 | #define MPTCP_DSS_DATA_FIN BIT(4)
|
| 100 | #define MPTCP_DSS_DSN64 BIT(3)
|
| 101 | #define MPTCP_DSS_HAS_MAP BIT(2)
|
| 102 | #define MPTCP_DSS_ACK64 BIT(1)
|
| 103 | #define MPTCP_DSS_HAS_ACK BIT(0)
|
| 104 | #define MPTCP_DSS_FLAG_MASK (0x1F)
|
| 105 |
|
| 106 |
|
| 107 | #define MPTCP_ADDR_ECHO BIT(0)
|
| 108 |
|
| 109 |
|
| 110 | #define MPTCP_PRIO_BKUP BIT(0)
|
| 111 |
|
| 112 |
|
| 113 | #define MPTCP_RST_TRANSIENT BIT(0)
|
| 114 |
|
| 115 |
|
| 116 | #define MPTCP_WORK_RTX 1
|
| 117 | #define MPTCP_FALLBACK_DONE 2
|
| 118 | #define MPTCP_WORK_CLOSE_SUBFLOW 3
|
| 119 | #define MPTCP_RTX_ENABLED 4
|
| 120 |
|
| 121 |
|
| 122 | #define MPTCP_PUSH_PENDING 1
|
| 123 | #define MPTCP_CLEAN_UNA 2
|
| 124 | #define MPTCP_ERROR_REPORT 3
|
| 125 | #define MPTCP_RETRANSMIT 4
|
| 126 | #define MPTCP_FLUSH_JOIN_LIST 5
|
| 127 | #define MPTCP_SYNC_STATE 6
|
| 128 | #define MPTCP_SYNC_SNDBUF 7
|
| 129 |
|
| 130 | struct mptcp_skb_cb {
|
| 131 | u64 map_seq;
|
| 132 | u64 end_seq;
|
| 133 | u32 offset;
|
| 134 | u8 has_rxtstamp;
|
| 135 | u8 cant_coalesce;
|
| 136 | };
|
| 137 |
|
| 138 | #define MPTCP_SKB_CB(__skb) ((struct mptcp_skb_cb *)&((__skb)->cb[0]))
|
| 139 |
|
| 140 | static inline bool before64(__u64 seq1, __u64 seq2)
|
| 141 | {
|
| 142 | return (__s64)(seq1 - seq2) < 0;
|
| 143 | }
|
| 144 |
|
| 145 | #define after64(seq2, seq1) before64(seq1, seq2)
|
| 146 |
|
| 147 | struct mptcp_options_received {
|
| 148 | u64 sndr_key;
|
| 149 | u64 rcvr_key;
|
| 150 | u64 data_ack;
|
| 151 | u64 data_seq;
|
| 152 | u32 subflow_seq;
|
| 153 | u16 data_len;
|
| 154 | __sum16 csum;
|
| 155 | struct_group(status,
|
| 156 | u16 suboptions;
|
| 157 | u16 use_map:1,
|
| 158 | dsn64:1,
|
| 159 | data_fin:1,
|
| 160 | use_ack:1,
|
| 161 | ack64:1,
|
| 162 | mpc_map:1,
|
| 163 | reset_reason:4,
|
| 164 | reset_transient:1,
|
| 165 | echo:1,
|
| 166 | backup:1,
|
| 167 | deny_join_id0:1,
|
| 168 | __unused:2;
|
| 169 | );
|
| 170 | u8 join_id;
|
| 171 | u32 token;
|
| 172 | u32 nonce;
|
| 173 | u64 thmac;
|
| 174 | u8 hmac[MPTCPOPT_HMAC_LEN];
|
| 175 | struct mptcp_addr_info addr;
|
| 176 | struct mptcp_rm_list rm_list;
|
| 177 | u64 ahmac;
|
| 178 | u64 fail_seq;
|
| 179 | };
|
| 180 |
|
| 181 | static inline __be32 mptcp_option(u8 subopt, u8 len, u8 nib, u8 field)
|
| 182 | {
|
| 183 | return htonl((TCPOPT_MPTCP << 24) | (len << 16) | (subopt << 12) |
|
| 184 | ((nib & 0xF) << 8) | field);
|
| 185 | }
|
| 186 |
|
| 187 | enum mptcp_pm_status {
|
| 188 | MPTCP_PM_ADD_ADDR_RECEIVED,
|
| 189 | MPTCP_PM_ADD_ADDR_SEND_ACK,
|
| 190 | MPTCP_PM_RM_ADDR_RECEIVED,
|
| 191 | MPTCP_PM_ESTABLISHED,
|
| 192 | MPTCP_PM_SUBFLOW_ESTABLISHED,
|
| 193 | MPTCP_PM_ALREADY_ESTABLISHED,
|
| 194 | MPTCP_PM_MPC_ENDPOINT_ACCOUNTED, |
| 195 | * accounted int id_avail_bitmap
|
| 196 |
|
| 197 | MPTCP_PM_DESTROYING,
|
| 198 | };
|
| 199 |
|
| 200 | enum mptcp_pm_type {
|
| 201 | MPTCP_PM_TYPE_KERNEL = 0,
|
| 202 | MPTCP_PM_TYPE_USERSPACE,
|
| 203 |
|
| 204 | __MPTCP_PM_TYPE_NR,
|
| 205 | __MPTCP_PM_TYPE_MAX = __MPTCP_PM_TYPE_NR - 1,
|
| 206 | };
|
| 207 |
|
| 208 |
|
| 209 | #define MPTCP_PM_WORK_MASK ((1 << MPTCP_PM_ALREADY_ESTABLISHED) - 1)
|
| 210 |
|
| 211 | enum mptcp_addr_signal_status {
|
| 212 | MPTCP_ADD_ADDR_SIGNAL,
|
| 213 | MPTCP_ADD_ADDR_ECHO,
|
| 214 | MPTCP_RM_ADDR_SIGNAL,
|
| 215 | };
|
| 216 |
|
| 217 |
|
| 218 | #define MPTCP_PM_MAX_ADDR_ID U8_MAX
|
| 219 |
|
| 220 | struct mptcp_pm_data {
|
| 221 | struct mptcp_addr_info local;
|
| 222 | struct mptcp_addr_info remote;
|
| 223 | struct list_head anno_list;
|
| 224 | struct list_head userspace_pm_local_addr_list;
|
| 225 |
|
| 226 | spinlock_t lock;
|
| 227 |
|
| 228 | struct_group(reset,
|
| 229 |
|
| 230 | u8 addr_signal;
|
| 231 | bool server_side;
|
| 232 | bool work_pending;
|
| 233 | bool accept_addr;
|
| 234 | bool accept_subflow;
|
| 235 | bool remote_deny_join_id0;
|
| 236 | u8 add_addr_signaled;
|
| 237 | u8 add_addr_accepted;
|
| 238 | u8 local_addr_used;
|
| 239 | u8 pm_type;
|
| 240 | u8 extra_subflows;
|
| 241 | u8 status;
|
| 242 |
|
| 243 | );
|
| 244 |
|
| 245 | DECLARE_BITMAP(id_avail_bitmap, MPTCP_PM_MAX_ADDR_ID + 1);
|
| 246 | struct mptcp_rm_list rm_list_tx;
|
| 247 | struct mptcp_rm_list rm_list_rx;
|
| 248 | };
|
| 249 |
|
| 250 | struct mptcp_pm_local {
|
| 251 | struct mptcp_addr_info addr;
|
| 252 | u32 flags;
|
| 253 | int ifindex;
|
| 254 | };
|
| 255 |
|
| 256 | struct mptcp_pm_addr_entry {
|
| 257 | struct list_head list;
|
| 258 | struct mptcp_addr_info addr;
|
| 259 | u32 flags;
|
| 260 | int ifindex;
|
| 261 | struct socket *lsk;
|
| 262 | };
|
| 263 |
|
| 264 | struct mptcp_data_frag {
|
| 265 | struct list_head list;
|
| 266 | u64 data_seq;
|
| 267 | u16 data_len;
|
| 268 | u16 offset;
|
| 269 | u8 overhead;
|
| 270 | u8 eor;
|
| 271 | u16 already_sent;
|
| 272 | struct page *page;
|
| 273 | };
|
| 274 |
|
| 275 | |
| 276 | * close event and as big as possible to avoid being fouled by biased large
|
| 277 | * samples due to peer sending data on a different subflow WRT to the incoming
|
| 278 | * ack.
|
| 279 |
|
| 280 | #define MPTCP_RTT_SAMPLES 5
|
| 281 |
|
| 282 |
|
| 283 | struct mptcp_sock {
|
| 284 |
|
| 285 | struct inet_connection_sock sk;
|
| 286 | u64 local_key; |
| 287 | * lockless access read
|
| 288 |
|
| 289 | u64 remote_key;
|
| 290 | u64 write_seq;
|
| 291 | u64 bytes_sent;
|
| 292 | u64 snd_nxt;
|
| 293 | u64 bytes_received;
|
| 294 | u64 ack_seq;
|
| 295 | atomic64_t rcv_wnd_sent;
|
| 296 | u64 rcv_data_fin_seq;
|
| 297 | u64 bytes_retrans;
|
| 298 | u64 bytes_consumed;
|
| 299 | int snd_burst;
|
| 300 | int old_wspace;
|
| 301 | u64 recovery_snd_nxt; |
| 302 | * recovery related fields are under data_lock
|
| 303 | * protection
|
| 304 |
|
| 305 | u64 bytes_acked;
|
| 306 | u64 snd_una;
|
| 307 | u64 wnd_end;
|
| 308 | u32 last_data_sent;
|
| 309 | u32 last_data_recv;
|
| 310 | u32 last_ack_recv;
|
| 311 | unsigned long timer_ival;
|
| 312 | u32 token;
|
| 313 | unsigned long flags;
|
| 314 | unsigned long cb_flags;
|
| 315 | bool recovery;
|
| 316 | bool can_ack;
|
| 317 | bool fully_established;
|
| 318 | bool rcv_data_fin;
|
| 319 | bool snd_data_fin_enable;
|
| 320 | bool rcv_fastclose;
|
| 321 | bool use_64bit_ack;
|
| 322 | bool csum_enabled;
|
| 323 | bool allow_infinite_fallback;
|
| 324 | u8 pending_state; |
| 325 | * protected by the msk data lock
|
| 326 |
|
| 327 | u8 mpc_endpoint_id;
|
| 328 | u8 recvmsg_inq:1,
|
| 329 | cork:1,
|
| 330 | nodelay:1,
|
| 331 | fastopening:1,
|
| 332 | in_accept_queue:1,
|
| 333 | free_first:1,
|
| 334 | rcvspace_init:1,
|
| 335 | fastclosing:1;
|
| 336 | u32 notsent_lowat;
|
| 337 | int keepalive_cnt;
|
| 338 | int keepalive_idle;
|
| 339 | int keepalive_intvl;
|
| 340 | int maxseg;
|
| 341 | struct work_struct work;
|
| 342 | struct sk_buff *ooo_last_skb;
|
| 343 | struct rb_root out_of_order_queue;
|
| 344 | struct list_head conn_list;
|
| 345 | struct list_head rtx_queue;
|
| 346 | struct mptcp_data_frag *first_pending;
|
| 347 | struct list_head join_list;
|
| 348 | struct sock *first; |
| 349 | * ONCE annotation, the subflow outside the socket
|
| 350 | * lock as such sock is freed after close().
|
| 351 |
|
| 352 | struct mptcp_pm_data pm;
|
| 353 | struct mptcp_sched_ops *sched;
|
| 354 |
|
| 355 |
|
| 356 | struct {
|
| 357 | u32 samples[MPTCP_RTT_SAMPLES];
|
| 358 | u32 next_sample;
|
| 359 | } rcv_rtt_est;
|
| 360 |
|
| 361 | struct {
|
| 362 | int space;
|
| 363 | int copied;
|
| 364 | u64 time;
|
| 365 | } rcvq_space;
|
| 366 | u8 scaling_ratio;
|
| 367 | bool allow_subflows;
|
| 368 |
|
| 369 | u32 subflow_id;
|
| 370 | u32 setsockopt_seq;
|
| 371 | char ca_name[TCP_CA_NAME_MAX];
|
| 372 |
|
| 373 | spinlock_t fallback_lock; |
| 374 | * allow_infinite_fallback and
|
| 375 | * allow_join
|
| 376 |
|
| 377 |
|
| 378 | struct list_head backlog_list;
|
| 379 | u32 backlog_len;
|
| 380 | u32 backlog_unaccounted;
|
| 381 | };
|
| 382 |
|
| 383 | #define mptcp_data_lock(sk) spin_lock_bh(&(sk)->sk_lock.slock)
|
| 384 | #define mptcp_data_unlock(sk) spin_unlock_bh(&(sk)->sk_lock.slock)
|
| 385 |
|
| 386 | #define mptcp_for_each_subflow(__msk, __subflow) \
|
| 387 | list_for_each_entry(__subflow, &((__msk)->conn_list), node)
|
| 388 | #define mptcp_for_each_subflow_safe(__msk, __subflow, __tmp) \
|
| 389 | list_for_each_entry_safe(__subflow, __tmp, &((__msk)->conn_list), node)
|
| 390 | #define mptcp_next_subflow(__msk, __subflow) \
|
| 391 | list_next_entry_circular(__subflow, &((__msk)->conn_list), node)
|
| 392 |
|
| 393 | extern struct genl_family mptcp_genl_family;
|
| 394 |
|
| 395 | static inline void msk_owned_by_me(const struct mptcp_sock *msk)
|
| 396 | {
|
| 397 | sock_owned_by_me((const struct sock *)msk);
|
| 398 | }
|
| 399 |
|
| 400 | #ifdef CONFIG_DEBUG_NET
|
| 401 |
|
| 402 | #undef tcp_sk
|
| 403 | #define tcp_sk(ptr) ({ \
|
| 404 | typeof(ptr) _ptr = (ptr); \
|
| 405 | WARN_ON(_ptr->sk_protocol != IPPROTO_TCP); \
|
| 406 | container_of_const(_ptr, struct tcp_sock, inet_conn.icsk_inet.sk); \
|
| 407 | })
|
| 408 | #define mptcp_sk(ptr) ({ \
|
| 409 | typeof(ptr) _ptr = (ptr); \
|
| 410 | WARN_ON(_ptr->sk_protocol != IPPROTO_MPTCP); \
|
| 411 | container_of_const(_ptr, struct mptcp_sock, sk.icsk_inet.sk); \
|
| 412 | })
|
| 413 |
|
| 414 | #else
|
| 415 | #define mptcp_sk(ptr) container_of_const(ptr, struct mptcp_sock, sk.icsk_inet.sk)
|
| 416 | #endif
|
| 417 |
|
| 418 | static inline int mptcp_win_from_space(const struct sock *sk, int space)
|
| 419 | {
|
| 420 | return __tcp_win_from_space(mptcp_sk(sk)->scaling_ratio, space);
|
| 421 | }
|
| 422 |
|
| 423 | static inline int mptcp_space_from_win(const struct sock *sk, int win)
|
| 424 | {
|
| 425 | return __tcp_space_from_win(mptcp_sk(sk)->scaling_ratio, win);
|
| 426 | }
|
| 427 |
|
| 428 | static inline int __mptcp_space(const struct sock *sk)
|
| 429 | {
|
| 430 | return mptcp_win_from_space(sk, READ_ONCE(sk->sk_rcvbuf) -
|
| 431 | READ_ONCE(mptcp_sk(sk)->backlog_len) -
|
| 432 | sk_rmem_alloc_get(sk));
|
| 433 | }
|
| 434 |
|
| 435 | static inline struct mptcp_data_frag *mptcp_send_head(const struct sock *sk)
|
| 436 | {
|
| 437 | const struct mptcp_sock *msk = mptcp_sk(sk);
|
| 438 |
|
| 439 | return msk->first_pending;
|
| 440 | }
|
| 441 |
|
| 442 | static inline void mptcp_init_rtt_est(struct mptcp_sock *msk)
|
| 443 | {
|
| 444 | int i;
|
| 445 |
|
| 446 | for (i = 0; i < MPTCP_RTT_SAMPLES; ++i)
|
| 447 | msk->rcv_rtt_est.samples[i] = U32_MAX;
|
| 448 | msk->rcv_rtt_est.next_sample = 0;
|
| 449 | msk->scaling_ratio = TCP_DEFAULT_SCALING_RATIO;
|
| 450 | }
|
| 451 |
|
| 452 | static inline u32 mptcp_rtt_us_est(const struct mptcp_sock *msk)
|
| 453 | {
|
| 454 | u32 rtt_us = READ_ONCE(msk->rcv_rtt_est.samples[0]);
|
| 455 | int i;
|
| 456 |
|
| 457 |
|
| 458 | for (i = 1; i < MPTCP_RTT_SAMPLES; ++i)
|
| 459 | rtt_us = min(rtt_us, READ_ONCE(msk->rcv_rtt_est.samples[i]));
|
| 460 | return rtt_us;
|
| 461 | }
|
| 462 |
|
| 463 | static inline struct mptcp_data_frag *mptcp_send_next(struct sock *sk)
|
| 464 | {
|
| 465 | struct mptcp_sock *msk = mptcp_sk(sk);
|
| 466 | struct mptcp_data_frag *cur;
|
| 467 |
|
| 468 | cur = msk->first_pending;
|
| 469 | return list_is_last(&cur->list, &msk->rtx_queue) ? NULL :
|
| 470 | list_next_entry(cur, list);
|
| 471 | }
|
| 472 |
|
| 473 | static inline struct mptcp_data_frag *mptcp_pending_tail(const struct sock *sk)
|
| 474 | {
|
| 475 | const struct mptcp_sock *msk = mptcp_sk(sk);
|
| 476 |
|
| 477 | if (!msk->first_pending)
|
| 478 | return NULL;
|
| 479 |
|
| 480 | if (WARN_ON_ONCE(list_empty(&msk->rtx_queue)))
|
| 481 | return NULL;
|
| 482 |
|
| 483 | return list_last_entry(&msk->rtx_queue, struct mptcp_data_frag, list);
|
| 484 | }
|
| 485 |
|
| 486 | static inline struct mptcp_data_frag *mptcp_rtx_head(struct sock *sk)
|
| 487 | {
|
| 488 | struct mptcp_sock *msk = mptcp_sk(sk);
|
| 489 |
|
| 490 | if (msk->snd_una == msk->snd_nxt)
|
| 491 | return NULL;
|
| 492 |
|
| 493 | return list_first_entry_or_null(&msk->rtx_queue, struct mptcp_data_frag, list);
|
| 494 | }
|
| 495 |
|
| 496 | struct csum_pseudo_header {
|
| 497 | __be64 data_seq;
|
| 498 | __be32 subflow_seq;
|
| 499 | __be16 data_len;
|
| 500 | __sum16 csum;
|
| 501 | };
|
| 502 |
|
| 503 | struct mptcp_subflow_request_sock {
|
| 504 | struct tcp_request_sock sk;
|
| 505 | u16 mp_capable : 1,
|
| 506 | mp_join : 1,
|
| 507 | backup : 1,
|
| 508 | request_bkup : 1,
|
| 509 | csum_reqd : 1,
|
| 510 | allow_join_id0 : 1;
|
| 511 | u8 local_id;
|
| 512 | u8 remote_id;
|
| 513 | u64 local_key;
|
| 514 | u64 idsn;
|
| 515 | u32 token;
|
| 516 | u32 ssn_offset;
|
| 517 | u64 thmac;
|
| 518 | u32 local_nonce;
|
| 519 | u32 remote_nonce;
|
| 520 | struct mptcp_sock *msk;
|
| 521 | struct hlist_nulls_node token_node;
|
| 522 | };
|
| 523 |
|
| 524 | static inline struct mptcp_subflow_request_sock *
|
| 525 | mptcp_subflow_rsk(const struct request_sock *rsk)
|
| 526 | {
|
| 527 | return (struct mptcp_subflow_request_sock *)rsk;
|
| 528 | }
|
| 529 |
|
| 530 | struct mptcp_delegated_action {
|
| 531 | struct napi_struct napi;
|
| 532 | local_lock_t bh_lock;
|
| 533 | struct list_head head;
|
| 534 | };
|
| 535 |
|
| 536 | DECLARE_PER_CPU(struct mptcp_delegated_action, mptcp_delegated_actions);
|
| 537 |
|
| 538 | #define MPTCP_DELEGATE_SCHEDULED 0
|
| 539 | #define MPTCP_DELEGATE_SEND 1
|
| 540 | #define MPTCP_DELEGATE_ACK 2
|
| 541 | #define MPTCP_DELEGATE_SNDBUF 3
|
| 542 |
|
| 543 | #define MPTCP_DELEGATE_ACTIONS_MASK (~BIT(MPTCP_DELEGATE_SCHEDULED))
|
| 544 |
|
| 545 | struct mptcp_subflow_context {
|
| 546 | struct list_head node;
|
| 547 |
|
| 548 | struct_group(reset,
|
| 549 |
|
| 550 | unsigned long avg_pacing_rate;
|
| 551 | u64 local_key;
|
| 552 | u64 remote_key;
|
| 553 | u64 idsn;
|
| 554 | u64 map_seq;
|
| 555 | u64 rcv_wnd_sent;
|
| 556 | u32 snd_isn;
|
| 557 | u32 token;
|
| 558 | u32 rel_write_seq;
|
| 559 | u32 map_subflow_seq;
|
| 560 | u32 ssn_offset;
|
| 561 | u32 map_data_len;
|
| 562 | __wsum map_data_csum;
|
| 563 | u32 map_csum_len;
|
| 564 | u32 prev_rtt_seq;
|
| 565 | u32 request_mptcp : 1,
|
| 566 | request_join : 1,
|
| 567 | request_bkup : 1,
|
| 568 | mp_capable : 1,
|
| 569 | mp_join : 1,
|
| 570 | pm_notified : 1,
|
| 571 | conn_finished : 1,
|
| 572 | map_valid : 1,
|
| 573 | map_csum_reqd : 1,
|
| 574 | map_data_fin : 1,
|
| 575 | mpc_map : 1,
|
| 576 | backup : 1,
|
| 577 | send_mp_prio : 1,
|
| 578 | send_mp_fail : 1,
|
| 579 | send_fastclose : 1,
|
| 580 | send_infinite_map : 1,
|
| 581 | remote_key_valid : 1,
|
| 582 | disposable : 1,
|
| 583 | closing : 1,
|
| 584 | valid_csum_seen : 1,
|
| 585 | is_mptfo : 1,
|
| 586 | close_event_done : 1,
|
| 587 | mpc_drop : 1,
|
| 588 | resetting : 1,
|
| 589 | __unused : 8;
|
| 590 | bool data_avail;
|
| 591 | bool scheduled;
|
| 592 | bool pm_listener;
|
| 593 | bool fully_established;
|
| 594 | u32 lent_mem_frag;
|
| 595 | u32 remote_nonce;
|
| 596 | u64 thmac;
|
| 597 | u32 local_nonce;
|
| 598 | u32 remote_token;
|
| 599 | union {
|
| 600 | u8 hmac[MPTCPOPT_HMAC_LEN];
|
| 601 | u64 iasn;
|
| 602 | };
|
| 603 | s16 local_id;
|
| 604 | u8 remote_id;
|
| 605 | u8 reset_seen:1;
|
| 606 | u8 reset_transient:1;
|
| 607 | u8 reset_reason:4;
|
| 608 | u8 stale_count;
|
| 609 | u8 stale; |
| 610 | * if set the subflow is unable to snd/rcv
|
| 611 | * data, the schedule should skip it
|
| 612 |
|
| 613 |
|
| 614 | u32 subflow_id;
|
| 615 |
|
| 616 | long delegated_status;
|
| 617 | unsigned long fail_tout;
|
| 618 |
|
| 619 | );
|
| 620 |
|
| 621 | struct list_head delegated_node;
|
| 622 |
|
| 623 | u32 setsockopt_seq;
|
| 624 | u32 stale_rcv_tstamp;
|
| 625 | int cached_sndbuf; |
| 626 | * protected by the msk socket lock
|
| 627 |
|
| 628 |
|
| 629 | struct sock *tcp_sock;
|
| 630 | struct sock *conn;
|
| 631 | const struct inet_connection_sock_af_ops *icsk_af_ops;
|
| 632 | void (*tcp_state_change)(struct sock *sk);
|
| 633 | void (*tcp_error_report)(struct sock *sk);
|
| 634 |
|
| 635 | struct rcu_head rcu;
|
| 636 | };
|
| 637 |
|
| 638 | static inline struct mptcp_subflow_context *
|
| 639 | mptcp_subflow_ctx(const struct sock *sk)
|
| 640 | {
|
| 641 | const struct inet_connection_sock *icsk = inet_csk(sk);
|
| 642 |
|
| 643 |
|
| 644 | return (__force struct mptcp_subflow_context *)icsk->icsk_ulp_data;
|
| 645 | }
|
| 646 |
|
| 647 | static inline struct sock *
|
| 648 | mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow)
|
| 649 | {
|
| 650 | return subflow->tcp_sock;
|
| 651 | }
|
| 652 |
|
| 653 | static inline void
|
| 654 | mptcp_subflow_ctx_reset(struct mptcp_subflow_context *subflow)
|
| 655 | {
|
| 656 | memset(&subflow->reset, 0, sizeof(subflow->reset));
|
| 657 | subflow->request_mptcp = 1;
|
| 658 | WRITE_ONCE(subflow->local_id, -1);
|
| 659 | }
|
| 660 |
|
| 661 |
|
| 662 | static inline enum sk_rst_reason
|
| 663 | sk_rst_convert_mptcp_reason(u32 reason)
|
| 664 | {
|
| 665 | switch (reason) {
|
| 666 | case MPTCP_RST_EUNSPEC:
|
| 667 | return SK_RST_REASON_MPTCP_RST_EUNSPEC;
|
| 668 | case MPTCP_RST_EMPTCP:
|
| 669 | return SK_RST_REASON_MPTCP_RST_EMPTCP;
|
| 670 | case MPTCP_RST_ERESOURCE:
|
| 671 | return SK_RST_REASON_MPTCP_RST_ERESOURCE;
|
| 672 | case MPTCP_RST_EPROHIBIT:
|
| 673 | return SK_RST_REASON_MPTCP_RST_EPROHIBIT;
|
| 674 | case MPTCP_RST_EWQ2BIG:
|
| 675 | return SK_RST_REASON_MPTCP_RST_EWQ2BIG;
|
| 676 | case MPTCP_RST_EBADPERF:
|
| 677 | return SK_RST_REASON_MPTCP_RST_EBADPERF;
|
| 678 | case MPTCP_RST_EMIDDLEBOX:
|
| 679 | return SK_RST_REASON_MPTCP_RST_EMIDDLEBOX;
|
| 680 | default:
|
| 681 | |
| 682 | * in MPTCP layer
|
| 683 |
|
| 684 | return SK_RST_REASON_ERROR;
|
| 685 | }
|
| 686 | }
|
| 687 |
|
| 688 | static inline void
|
| 689 | mptcp_send_active_reset_reason(struct sock *sk)
|
| 690 | {
|
| 691 | struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
|
| 692 | enum sk_rst_reason reason;
|
| 693 |
|
| 694 | reason = sk_rst_convert_mptcp_reason(subflow->reset_reason);
|
| 695 | tcp_send_active_reset(sk, reason);
|
| 696 | }
|
| 697 |
|
| 698 | |
| 699 | * To be paired with a previous mptcp_subflow_lend_fwdmem() before freeing
|
| 700 | * the skb or setting the skb ownership.
|
| 701 |
|
| 702 | static inline void mptcp_borrow_fwdmem(struct sock *sk, struct sk_buff *skb)
|
| 703 | {
|
| 704 | struct sock *ssk = skb->sk;
|
| 705 |
|
| 706 | |
| 707 | * closed, mptcp_close_ssk() already released the ssk rcv memory.
|
| 708 |
|
| 709 | DEBUG_NET_WARN_ON_ONCE(skb->destructor);
|
| 710 | sk_forward_alloc_add(sk, skb->truesize);
|
| 711 | if (!ssk)
|
| 712 | return;
|
| 713 |
|
| 714 | atomic_sub(skb->truesize, &ssk->sk_rmem_alloc);
|
| 715 | skb->sk = NULL;
|
| 716 | }
|
| 717 |
|
| 718 | static inline void
|
| 719 | __mptcp_subflow_lend_fwdmem(struct mptcp_subflow_context *subflow, int size)
|
| 720 | {
|
| 721 | int frag = (subflow->lent_mem_frag + size) & (PAGE_SIZE - 1);
|
| 722 |
|
| 723 | subflow->lent_mem_frag = frag;
|
| 724 | }
|
| 725 |
|
| 726 | static inline void
|
| 727 | mptcp_subflow_lend_fwdmem(struct mptcp_subflow_context *subflow,
|
| 728 | struct sk_buff *skb)
|
| 729 | {
|
| 730 | __mptcp_subflow_lend_fwdmem(subflow, skb->truesize);
|
| 731 | skb->destructor = NULL;
|
| 732 | }
|
| 733 |
|
| 734 | static inline u64
|
| 735 | mptcp_subflow_get_map_offset(const struct mptcp_subflow_context *subflow)
|
| 736 | {
|
| 737 | return tcp_sk(mptcp_subflow_tcp_sock(subflow))->copied_seq -
|
| 738 | subflow->ssn_offset -
|
| 739 | subflow->map_subflow_seq;
|
| 740 | }
|
| 741 |
|
| 742 | static inline u64
|
| 743 | mptcp_subflow_get_mapped_dsn(const struct mptcp_subflow_context *subflow)
|
| 744 | {
|
| 745 | return subflow->map_seq + mptcp_subflow_get_map_offset(subflow);
|
| 746 | }
|
| 747 |
|
| 748 | void mptcp_subflow_process_delegated(struct sock *ssk, long actions);
|
| 749 |
|
| 750 | static inline void mptcp_subflow_delegate(struct mptcp_subflow_context *subflow, int action)
|
| 751 | {
|
| 752 | long old, set_bits = BIT(MPTCP_DELEGATE_SCHEDULED) | BIT(action);
|
| 753 | struct mptcp_delegated_action *delegated;
|
| 754 | bool schedule;
|
| 755 |
|
| 756 |
|
| 757 | lockdep_assert_in_softirq();
|
| 758 |
|
| 759 | |
| 760 | * mptcp_napi_poll(), and ensures the below list check sees list
|
| 761 | * updates done prior to delegated status bits changes
|
| 762 |
|
| 763 | old = set_mask_bits(&subflow->delegated_status, 0, set_bits);
|
| 764 | if (!(old & BIT(MPTCP_DELEGATE_SCHEDULED))) {
|
| 765 | if (WARN_ON_ONCE(!list_empty(&subflow->delegated_node)))
|
| 766 | return;
|
| 767 |
|
| 768 | local_lock_nested_bh(&mptcp_delegated_actions.bh_lock);
|
| 769 | delegated = this_cpu_ptr(&mptcp_delegated_actions);
|
| 770 | schedule = list_empty(&delegated->head);
|
| 771 | list_add_tail(&subflow->delegated_node, &delegated->head);
|
| 772 | local_unlock_nested_bh(&mptcp_delegated_actions.bh_lock);
|
| 773 | sock_hold(mptcp_subflow_tcp_sock(subflow));
|
| 774 | if (schedule)
|
| 775 | napi_schedule(&delegated->napi);
|
| 776 | }
|
| 777 | }
|
| 778 |
|
| 779 | static inline struct mptcp_subflow_context *
|
| 780 | mptcp_subflow_delegated_next(struct mptcp_delegated_action *delegated)
|
| 781 | {
|
| 782 | struct mptcp_subflow_context *ret;
|
| 783 |
|
| 784 | local_lock_nested_bh(&mptcp_delegated_actions.bh_lock);
|
| 785 | if (list_empty(&delegated->head)) {
|
| 786 | local_unlock_nested_bh(&mptcp_delegated_actions.bh_lock);
|
| 787 | return NULL;
|
| 788 | }
|
| 789 |
|
| 790 | ret = list_first_entry(&delegated->head, struct mptcp_subflow_context, delegated_node);
|
| 791 | list_del_init(&ret->delegated_node);
|
| 792 | local_unlock_nested_bh(&mptcp_delegated_actions.bh_lock);
|
| 793 | return ret;
|
| 794 | }
|
| 795 |
|
| 796 | void __mptcp_inherit_memcg(struct sock *sk, struct sock *ssk, gfp_t gfp);
|
| 797 | void __mptcp_inherit_cgrp_data(struct sock *sk, struct sock *ssk);
|
| 798 |
|
| 799 | int mptcp_is_enabled(const struct net *net);
|
| 800 | unsigned int mptcp_get_add_addr_timeout(const struct net *net);
|
| 801 | int mptcp_is_checksum_enabled(const struct net *net);
|
| 802 | int mptcp_allow_join_id0(const struct net *net);
|
| 803 | unsigned int mptcp_stale_loss_cnt(const struct net *net);
|
| 804 | unsigned int mptcp_close_timeout(const struct sock *sk);
|
| 805 | int mptcp_get_pm_type(const struct net *net);
|
| 806 | const char *mptcp_get_path_manager(const struct net *net);
|
| 807 | const char *mptcp_get_scheduler(const struct net *net);
|
| 808 | unsigned int mptcp_add_addr_v6_port_drop_ts(const struct net *net);
|
| 809 |
|
| 810 | void mptcp_active_disable(struct sock *sk);
|
| 811 | bool mptcp_active_should_disable(struct sock *ssk);
|
| 812 | void mptcp_active_enable(struct sock *sk);
|
| 813 |
|
| 814 | void mptcp_get_available_schedulers(char *buf, size_t maxlen);
|
| 815 | void __mptcp_subflow_fully_established(struct mptcp_sock *msk,
|
| 816 | struct mptcp_subflow_context *subflow,
|
| 817 | const struct mptcp_options_received *mp_opt);
|
| 818 | bool __mptcp_retransmit_pending_data(struct sock *sk);
|
| 819 | void mptcp_check_and_set_pending(struct sock *sk);
|
| 820 | void __mptcp_push_pending(struct sock *sk, unsigned int flags);
|
| 821 | bool mptcp_subflow_data_available(struct sock *sk);
|
| 822 | void __init mptcp_subflow_init(void);
|
| 823 | void mptcp_subflow_shutdown(struct sock *sk, struct sock *ssk, int how);
|
| 824 | void mptcp_close_ssk(struct sock *sk, struct sock *ssk,
|
| 825 | struct mptcp_subflow_context *subflow);
|
| 826 | void __mptcp_subflow_send_ack(struct sock *ssk);
|
| 827 | void mptcp_subflow_reset(struct sock *ssk);
|
| 828 | void mptcp_subflow_queue_clean(struct sock *sk, struct sock *ssk);
|
| 829 | void mptcp_sock_graft(struct sock *sk, struct socket *parent);
|
| 830 | struct sock *__mptcp_nmpc_sk(struct mptcp_sock *msk);
|
| 831 | bool __mptcp_close(struct sock *sk, long timeout);
|
| 832 | void mptcp_cancel_work(struct sock *sk);
|
| 833 | void __mptcp_unaccepted_force_close(struct sock *sk);
|
| 834 | void mptcp_set_state(struct sock *sk, int state);
|
| 835 |
|
| 836 | bool mptcp_addresses_equal(const struct mptcp_addr_info *a,
|
| 837 | const struct mptcp_addr_info *b, bool use_port);
|
| 838 | void mptcp_local_address(const struct sock_common *skc,
|
| 839 | struct mptcp_addr_info *addr);
|
| 840 | void mptcp_remote_address(const struct sock_common *skc,
|
| 841 | struct mptcp_addr_info *addr);
|
| 842 |
|
| 843 |
|
| 844 | int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_pm_local *local,
|
| 845 | const struct mptcp_addr_info *remote);
|
| 846 | int mptcp_subflow_create_socket(struct sock *sk, unsigned short family,
|
| 847 | struct socket **new_sock);
|
| 848 | void mptcp_info2sockaddr(const struct mptcp_addr_info *info,
|
| 849 | struct sockaddr_storage *addr,
|
| 850 | unsigned short family);
|
| 851 | struct mptcp_sched_ops *mptcp_sched_find(const char *name);
|
| 852 | int mptcp_validate_scheduler(struct mptcp_sched_ops *sched);
|
| 853 | int mptcp_register_scheduler(struct mptcp_sched_ops *sched);
|
| 854 | void mptcp_unregister_scheduler(struct mptcp_sched_ops *sched);
|
| 855 | void mptcp_sched_init(void);
|
| 856 | int mptcp_init_sched(struct mptcp_sock *msk,
|
| 857 | struct mptcp_sched_ops *sched);
|
| 858 | void mptcp_release_sched(struct mptcp_sock *msk);
|
| 859 | void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subflow,
|
| 860 | bool scheduled);
|
| 861 | struct sock *mptcp_subflow_get_send(struct mptcp_sock *msk);
|
| 862 | struct sock *mptcp_subflow_get_retrans(struct mptcp_sock *msk);
|
| 863 | int mptcp_sched_get_send(struct mptcp_sock *msk);
|
| 864 | int mptcp_sched_get_retrans(struct mptcp_sock *msk);
|
| 865 |
|
| 866 | static inline u64 mptcp_data_avail(const struct mptcp_sock *msk)
|
| 867 | {
|
| 868 | return READ_ONCE(msk->bytes_received) - READ_ONCE(msk->bytes_consumed);
|
| 869 | }
|
| 870 |
|
| 871 | static inline bool mptcp_epollin_ready(const struct sock *sk)
|
| 872 | {
|
| 873 | u64 data_avail = mptcp_data_avail(mptcp_sk(sk));
|
| 874 |
|
| 875 | if (!data_avail)
|
| 876 | return false;
|
| 877 |
|
| 878 | |
| 879 | * as it can always coalesce them
|
| 880 |
|
| 881 | return (data_avail >= sk->sk_rcvlowat) ||
|
| 882 | tcp_under_memory_pressure(sk);
|
| 883 | }
|
| 884 |
|
| 885 | int mptcp_set_rcvlowat(struct sock *sk, int val);
|
| 886 |
|
| 887 | static inline bool __tcp_can_send(const struct sock *ssk)
|
| 888 | {
|
| 889 |
|
| 890 | return ((1 << inet_sk_state_load(ssk)) & (TCPF_ESTABLISHED | TCPF_CLOSE_WAIT));
|
| 891 | }
|
| 892 |
|
| 893 | static inline bool __mptcp_subflow_active(struct mptcp_subflow_context *subflow)
|
| 894 | {
|
| 895 |
|
| 896 | if (subflow->request_join && !READ_ONCE(subflow->fully_established))
|
| 897 | return false;
|
| 898 |
|
| 899 | return __tcp_can_send(mptcp_subflow_tcp_sock(subflow));
|
| 900 | }
|
| 901 |
|
| 902 | void mptcp_subflow_set_active(struct mptcp_subflow_context *subflow);
|
| 903 |
|
| 904 | bool mptcp_subflow_active(struct mptcp_subflow_context *subflow);
|
| 905 |
|
| 906 | void mptcp_subflow_drop_ctx(struct sock *ssk);
|
| 907 |
|
| 908 | static inline void mptcp_subflow_tcp_fallback(struct sock *sk,
|
| 909 | struct mptcp_subflow_context *ctx)
|
| 910 | {
|
| 911 | sk->sk_data_ready = sock_def_readable;
|
| 912 | sk->sk_state_change = ctx->tcp_state_change;
|
| 913 | sk->sk_write_space = sk_stream_write_space;
|
| 914 | sk->sk_error_report = ctx->tcp_error_report;
|
| 915 |
|
| 916 | inet_csk(sk)->icsk_af_ops = ctx->icsk_af_ops;
|
| 917 | }
|
| 918 |
|
| 919 | void __init mptcp_proto_init(void);
|
| 920 | #if IS_ENABLED(CONFIG_MPTCP_IPV6)
|
| 921 | int __init mptcp_proto_v6_init(void);
|
| 922 | void __init mptcp_subflow_v6_init(void);
|
| 923 | #endif
|
| 924 |
|
| 925 | struct sock *mptcp_sk_clone_init(const struct sock *sk,
|
| 926 | const struct mptcp_options_received *mp_opt,
|
| 927 | struct sock *ssk,
|
| 928 | struct request_sock *req);
|
| 929 | void mptcp_get_options(const struct sk_buff *skb,
|
| 930 | struct mptcp_options_received *mp_opt);
|
| 931 |
|
| 932 | void mptcp_finish_connect(struct sock *sk);
|
| 933 | void __mptcp_sync_state(struct sock *sk, int state);
|
| 934 | void mptcp_reset_tout_timer(struct mptcp_sock *msk, unsigned long fail_tout);
|
| 935 |
|
| 936 | static inline void mptcp_stop_tout_timer(struct sock *sk)
|
| 937 | {
|
| 938 | if (!inet_csk(sk)->icsk_mtup.probe_timestamp)
|
| 939 | return;
|
| 940 |
|
| 941 | sk_stop_timer(sk, &inet_csk(sk)->mptcp_tout_timer);
|
| 942 | inet_csk(sk)->icsk_mtup.probe_timestamp = 0;
|
| 943 | }
|
| 944 |
|
| 945 | static inline void mptcp_set_close_tout(struct sock *sk, unsigned long tout)
|
| 946 | {
|
| 947 |
|
| 948 | inet_csk(sk)->icsk_mtup.probe_timestamp = tout ? : 1;
|
| 949 | }
|
| 950 |
|
| 951 | static inline void mptcp_start_tout_timer(struct sock *sk)
|
| 952 | {
|
| 953 | mptcp_set_close_tout(sk, tcp_jiffies32);
|
| 954 | mptcp_reset_tout_timer(mptcp_sk(sk), 0);
|
| 955 | }
|
| 956 |
|
| 957 | static inline bool mptcp_is_fully_established(struct sock *sk)
|
| 958 | {
|
| 959 | return inet_sk_state_load(sk) == TCP_ESTABLISHED &&
|
| 960 | READ_ONCE(mptcp_sk(sk)->fully_established);
|
| 961 | }
|
| 962 |
|
| 963 | static inline u64 mptcp_stamp(void)
|
| 964 | {
|
| 965 | return div_u64(tcp_clock_ns(), NSEC_PER_USEC);
|
| 966 | }
|
| 967 |
|
| 968 | void mptcp_data_ready(struct sock *sk, struct sock *ssk);
|
| 969 | bool mptcp_finish_join(struct sock *sk);
|
| 970 | bool mptcp_schedule_work(struct sock *sk);
|
| 971 | int mptcp_setsockopt(struct sock *sk, int level, int optname,
|
| 972 | sockptr_t optval, unsigned int optlen);
|
| 973 | int mptcp_getsockopt(struct sock *sk, int level, int optname,
|
| 974 | char __user *optval, int __user *option);
|
| 975 |
|
| 976 | u64 __mptcp_expand_seq(u64 old_seq, u64 cur_seq);
|
| 977 | static inline u64 mptcp_expand_seq(u64 old_seq, u64 cur_seq, bool use_64bit)
|
| 978 | {
|
| 979 | if (use_64bit)
|
| 980 | return cur_seq;
|
| 981 |
|
| 982 | return __mptcp_expand_seq(old_seq, cur_seq);
|
| 983 | }
|
| 984 | void __mptcp_check_push(struct sock *sk, struct sock *ssk);
|
| 985 | void __mptcp_data_acked(struct sock *sk);
|
| 986 | void __mptcp_error_report(struct sock *sk);
|
| 987 | bool mptcp_update_rcv_data_fin(struct mptcp_sock *msk, u64 data_fin_seq, bool use_64bit);
|
| 988 | static inline bool mptcp_data_fin_enabled(const struct mptcp_sock *msk)
|
| 989 | {
|
| 990 | return READ_ONCE(msk->snd_data_fin_enable) &&
|
| 991 | READ_ONCE(msk->write_seq) == READ_ONCE(msk->snd_nxt);
|
| 992 | }
|
| 993 |
|
| 994 | static inline u32 mptcp_notsent_lowat(const struct sock *sk)
|
| 995 | {
|
| 996 | struct net *net = sock_net(sk);
|
| 997 | u32 val;
|
| 998 |
|
| 999 | val = READ_ONCE(mptcp_sk(sk)->notsent_lowat);
|
| 1000 | return val ?: READ_ONCE(net->ipv4.sysctl_tcp_notsent_lowat);
|
| 1001 | }
|
| 1002 |
|
| 1003 | static inline bool mptcp_stream_memory_free(const struct sock *sk, int wake)
|
| 1004 | {
|
| 1005 | const struct mptcp_sock *msk = mptcp_sk(sk);
|
| 1006 | u32 notsent_bytes;
|
| 1007 |
|
| 1008 | notsent_bytes = READ_ONCE(msk->write_seq) - READ_ONCE(msk->snd_nxt);
|
| 1009 | return (notsent_bytes << wake) < mptcp_notsent_lowat(sk);
|
| 1010 | }
|
| 1011 |
|
| 1012 | static inline bool __mptcp_stream_is_writeable(const struct sock *sk, int wake)
|
| 1013 | {
|
| 1014 | return mptcp_stream_memory_free(sk, wake) &&
|
| 1015 | __sk_stream_is_writeable(sk, wake);
|
| 1016 | }
|
| 1017 |
|
| 1018 | static inline void mptcp_write_space(struct sock *sk)
|
| 1019 | {
|
| 1020 |
|
| 1021 | smp_mb();
|
| 1022 | if (mptcp_stream_memory_free(sk, 1))
|
| 1023 | INDIRECT_CALL_1(sk->sk_write_space, sk_stream_write_space, sk);
|
| 1024 | }
|
| 1025 |
|
| 1026 | static inline void __mptcp_sync_sndbuf(struct sock *sk)
|
| 1027 | {
|
| 1028 | struct mptcp_subflow_context *subflow;
|
| 1029 | int ssk_sndbuf, new_sndbuf;
|
| 1030 |
|
| 1031 | if (sk->sk_userlocks & SOCK_SNDBUF_LOCK)
|
| 1032 | return;
|
| 1033 |
|
| 1034 | new_sndbuf = READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_wmem[0]);
|
| 1035 | mptcp_for_each_subflow(mptcp_sk(sk), subflow) {
|
| 1036 | ssk_sndbuf = READ_ONCE(mptcp_subflow_tcp_sock(subflow)->sk_sndbuf);
|
| 1037 |
|
| 1038 | subflow->cached_sndbuf = ssk_sndbuf;
|
| 1039 | new_sndbuf += ssk_sndbuf;
|
| 1040 | }
|
| 1041 |
|
| 1042 |
|
| 1043 | WRITE_ONCE(sk->sk_sndbuf, new_sndbuf);
|
| 1044 | mptcp_write_space(sk);
|
| 1045 | }
|
| 1046 |
|
| 1047 | |
| 1048 | * possibly under BH
|
| 1049 |
|
| 1050 | static inline void __mptcp_propagate_sndbuf(struct sock *sk, struct sock *ssk)
|
| 1051 | {
|
| 1052 | struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
|
| 1053 |
|
| 1054 | if (READ_ONCE(ssk->sk_sndbuf) != subflow->cached_sndbuf)
|
| 1055 | __mptcp_sync_sndbuf(sk);
|
| 1056 | }
|
| 1057 |
|
| 1058 | |
| 1059 | * BH context. Additionally this can be called under the msk data lock,
|
| 1060 | * so we can't acquire such lock here: let the delegate action acquires
|
| 1061 | * the needed locks in suitable order.
|
| 1062 |
|
| 1063 | static inline void mptcp_propagate_sndbuf(struct sock *sk, struct sock *ssk)
|
| 1064 | {
|
| 1065 | struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
|
| 1066 |
|
| 1067 | if (likely(READ_ONCE(ssk->sk_sndbuf) == subflow->cached_sndbuf))
|
| 1068 | return;
|
| 1069 |
|
| 1070 | local_bh_disable();
|
| 1071 | mptcp_subflow_delegate(subflow, MPTCP_DELEGATE_SNDBUF);
|
| 1072 | local_bh_enable();
|
| 1073 | }
|
| 1074 |
|
| 1075 | #define MPTCP_TOKEN_MAX_RETRIES 4
|
| 1076 |
|
| 1077 | void __init mptcp_token_init(void);
|
| 1078 | static inline void mptcp_token_init_request(struct request_sock *req)
|
| 1079 | {
|
| 1080 | mptcp_subflow_rsk(req)->token_node.pprev = NULL;
|
| 1081 | }
|
| 1082 |
|
| 1083 | int mptcp_token_new_request(struct request_sock *req);
|
| 1084 | void mptcp_token_destroy_request(struct request_sock *req);
|
| 1085 | int mptcp_token_new_connect(struct sock *ssk);
|
| 1086 | void mptcp_token_accept(struct mptcp_subflow_request_sock *r,
|
| 1087 | struct mptcp_sock *msk);
|
| 1088 | bool mptcp_token_exists(u32 token);
|
| 1089 | struct mptcp_sock *mptcp_token_get_sock(struct net *net, u32 token);
|
| 1090 | struct mptcp_sock *mptcp_token_iter_next(const struct net *net, long *s_slot,
|
| 1091 | long *s_num);
|
| 1092 | void mptcp_token_destroy(struct mptcp_sock *msk);
|
| 1093 |
|
| 1094 | void mptcp_crypto_key_sha(u64 key, u32 *token, u64 *idsn);
|
| 1095 |
|
| 1096 | void mptcp_crypto_hmac_sha(u64 key1, u64 key2, u8 *msg, int len, void *hmac);
|
| 1097 | __sum16 __mptcp_make_csum(u64 data_seq, u32 subflow_seq, u16 data_len, __wsum sum);
|
| 1098 |
|
| 1099 | void __init mptcp_pm_init(void);
|
| 1100 | void mptcp_pm_data_init(struct mptcp_sock *msk);
|
| 1101 | void mptcp_pm_data_reset(struct mptcp_sock *msk);
|
| 1102 | void mptcp_pm_destroy(struct mptcp_sock *msk);
|
| 1103 | int mptcp_pm_parse_addr(struct nlattr *attr, struct genl_info *info,
|
| 1104 | struct mptcp_addr_info *addr);
|
| 1105 | int mptcp_pm_parse_entry(struct nlattr *attr, struct genl_info *info,
|
| 1106 | bool require_family,
|
| 1107 | struct mptcp_pm_addr_entry *entry);
|
| 1108 | bool mptcp_pm_addr_families_match(const struct sock *sk,
|
| 1109 | const struct mptcp_addr_info *loc,
|
| 1110 | const struct mptcp_addr_info *rem);
|
| 1111 | void mptcp_pm_chk_stale(const struct mptcp_sock *msk);
|
| 1112 | void mptcp_pm_new_connection(struct mptcp_sock *msk, const struct sock *ssk, int server_side);
|
| 1113 | void mptcp_pm_fully_established(struct mptcp_sock *msk, const struct sock *ssk);
|
| 1114 | bool mptcp_pm_allow_new_subflow(struct mptcp_sock *msk);
|
| 1115 | void mptcp_pm_connection_closed(struct mptcp_sock *msk);
|
| 1116 | void mptcp_pm_subflow_established(struct mptcp_sock *msk);
|
| 1117 | bool mptcp_pm_nl_check_work_pending(struct mptcp_sock *msk);
|
| 1118 | void mptcp_pm_subflow_check_next(struct mptcp_sock *msk,
|
| 1119 | const struct mptcp_subflow_context *subflow);
|
| 1120 | void mptcp_pm_add_addr_received(const struct sock *ssk,
|
| 1121 | const struct mptcp_addr_info *addr);
|
| 1122 | void mptcp_pm_add_addr_echoed(struct mptcp_sock *msk,
|
| 1123 | const struct mptcp_addr_info *addr);
|
| 1124 | void mptcp_pm_send_ack(struct mptcp_sock *msk,
|
| 1125 | struct mptcp_subflow_context *subflow,
|
| 1126 | bool prio, bool backup);
|
| 1127 | void mptcp_pm_addr_send_ack(struct mptcp_sock *msk);
|
| 1128 | void mptcp_pm_nl_rm_addr(struct mptcp_sock *msk, u8 rm_id);
|
| 1129 | void mptcp_pm_rm_subflow(struct mptcp_sock *msk,
|
| 1130 | const struct mptcp_rm_list *rm_list);
|
| 1131 | void mptcp_pm_rm_addr_received(struct mptcp_sock *msk,
|
| 1132 | const struct mptcp_rm_list *rm_list);
|
| 1133 | void mptcp_pm_mp_prio_received(struct sock *sk, u8 bkup);
|
| 1134 | void mptcp_pm_mp_fail_received(struct sock *sk, u64 fail_seq);
|
| 1135 | int mptcp_pm_mp_prio_send_ack(struct mptcp_sock *msk,
|
| 1136 | struct mptcp_addr_info *addr,
|
| 1137 | struct mptcp_addr_info *rem,
|
| 1138 | u8 bkup);
|
| 1139 | bool mptcp_pm_announced_alloc(struct mptcp_sock *msk,
|
| 1140 | const struct mptcp_addr_info *addr);
|
| 1141 | bool mptcp_pm_announced_remove(struct mptcp_sock *msk,
|
| 1142 | const struct mptcp_addr_info *addr);
|
| 1143 | bool mptcp_pm_announced_has_ssk(struct mptcp_sock *msk, const struct sock *ssk);
|
| 1144 | bool mptcp_pm_has_subflow_saddr(const struct mptcp_sock *msk,
|
| 1145 | const struct mptcp_addr_info *saddr);
|
| 1146 | int mptcp_pm_nl_set_flags(struct mptcp_pm_addr_entry *local,
|
| 1147 | struct genl_info *info);
|
| 1148 | int mptcp_userspace_pm_set_flags(struct mptcp_pm_addr_entry *local,
|
| 1149 | struct genl_info *info);
|
| 1150 | int mptcp_pm_announce_addr(struct mptcp_sock *msk,
|
| 1151 | const struct mptcp_addr_info *addr,
|
| 1152 | bool echo);
|
| 1153 | int mptcp_pm_remove_addr(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_list);
|
| 1154 |
|
| 1155 |
|
| 1156 | extern struct mptcp_pm_ops mptcp_pm_kernel;
|
| 1157 |
|
| 1158 | struct mptcp_pm_ops *mptcp_pm_find(const char *name);
|
| 1159 | int mptcp_pm_register(struct mptcp_pm_ops *pm_ops);
|
| 1160 | void mptcp_pm_unregister(struct mptcp_pm_ops *pm_ops);
|
| 1161 | int mptcp_pm_validate(struct mptcp_pm_ops *pm_ops);
|
| 1162 | void mptcp_pm_get_available(char *buf, size_t maxlen);
|
| 1163 |
|
| 1164 | void mptcp_userspace_pm_free_local_addr_list(struct mptcp_sock *msk);
|
| 1165 |
|
| 1166 | void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk,
|
| 1167 | const struct sock *ssk, gfp_t gfp);
|
| 1168 | void mptcp_event_addr_announced(const struct sock *ssk, const struct mptcp_addr_info *info);
|
| 1169 | void mptcp_event_addr_removed(const struct mptcp_sock *msk, u8 id);
|
| 1170 | void mptcp_event_pm_listener(const struct sock *ssk,
|
| 1171 | enum mptcp_event_type event);
|
| 1172 | bool mptcp_userspace_pm_active(const struct mptcp_sock *msk);
|
| 1173 |
|
| 1174 | void mptcp_fastopen_subflow_synack_set_params(struct mptcp_subflow_context *subflow,
|
| 1175 | struct request_sock *req);
|
| 1176 | int mptcp_pm_genl_fill_addr(struct sk_buff *msg,
|
| 1177 | struct netlink_callback *cb,
|
| 1178 | struct mptcp_pm_addr_entry *entry);
|
| 1179 |
|
| 1180 | static inline bool mptcp_pm_should_add_signal(struct mptcp_sock *msk)
|
| 1181 | {
|
| 1182 | return READ_ONCE(msk->pm.addr_signal) &
|
| 1183 | (BIT(MPTCP_ADD_ADDR_SIGNAL) | BIT(MPTCP_ADD_ADDR_ECHO));
|
| 1184 | }
|
| 1185 |
|
| 1186 | static inline bool mptcp_pm_should_add_signal_addr(struct mptcp_sock *msk)
|
| 1187 | {
|
| 1188 | return READ_ONCE(msk->pm.addr_signal) & BIT(MPTCP_ADD_ADDR_SIGNAL);
|
| 1189 | }
|
| 1190 |
|
| 1191 | static inline bool mptcp_pm_should_add_signal_echo(struct mptcp_sock *msk)
|
| 1192 | {
|
| 1193 | return READ_ONCE(msk->pm.addr_signal) & BIT(MPTCP_ADD_ADDR_ECHO);
|
| 1194 | }
|
| 1195 |
|
| 1196 | static inline bool mptcp_pm_should_rm_signal(struct mptcp_sock *msk)
|
| 1197 | {
|
| 1198 | return READ_ONCE(msk->pm.addr_signal) & BIT(MPTCP_RM_ADDR_SIGNAL);
|
| 1199 | }
|
| 1200 |
|
| 1201 | static inline bool mptcp_pm_is_userspace(const struct mptcp_sock *msk)
|
| 1202 | {
|
| 1203 | return READ_ONCE(msk->pm.pm_type) == MPTCP_PM_TYPE_USERSPACE;
|
| 1204 | }
|
| 1205 |
|
| 1206 | static inline bool mptcp_pm_is_kernel(const struct mptcp_sock *msk)
|
| 1207 | {
|
| 1208 | return READ_ONCE(msk->pm.pm_type) == MPTCP_PM_TYPE_KERNEL;
|
| 1209 | }
|
| 1210 |
|
| 1211 | bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, int *size, int remaining,
|
| 1212 | struct mptcp_addr_info *addr, bool *echo,
|
| 1213 | bool *drop_ts);
|
| 1214 | bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
|
| 1215 | struct mptcp_rm_list *rm_list, int *len);
|
| 1216 | int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);
|
| 1217 | int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk,
|
| 1218 | struct mptcp_pm_addr_entry *skc);
|
| 1219 | int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
|
| 1220 | struct mptcp_pm_addr_entry *skc);
|
| 1221 | bool mptcp_pm_is_backup(struct mptcp_sock *msk, struct sock_common *skc);
|
| 1222 | bool mptcp_pm_nl_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc);
|
| 1223 | bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc);
|
| 1224 | int mptcp_pm_nl_dump_addr(struct sk_buff *msg,
|
| 1225 | struct netlink_callback *cb);
|
| 1226 | int mptcp_userspace_pm_dump_addr(struct sk_buff *msg,
|
| 1227 | struct netlink_callback *cb);
|
| 1228 | int mptcp_pm_nl_get_addr(u8 id, struct mptcp_pm_addr_entry *addr,
|
| 1229 | struct genl_info *info);
|
| 1230 | int mptcp_userspace_pm_get_addr(u8 id, struct mptcp_pm_addr_entry *addr,
|
| 1231 | struct genl_info *info);
|
| 1232 |
|
| 1233 | static inline u8 subflow_get_local_id(const struct mptcp_subflow_context *subflow)
|
| 1234 | {
|
| 1235 | int local_id = READ_ONCE(subflow->local_id);
|
| 1236 |
|
| 1237 | if (local_id < 0)
|
| 1238 | return 0;
|
| 1239 | return local_id;
|
| 1240 | }
|
| 1241 |
|
| 1242 | void __init mptcp_pm_kernel_register(void);
|
| 1243 | void __init mptcp_pm_userspace_register(void);
|
| 1244 | void __init mptcp_pm_nl_init(void);
|
| 1245 | void mptcp_pm_worker(struct mptcp_sock *msk);
|
| 1246 | void __mptcp_pm_kernel_worker(struct mptcp_sock *msk);
|
| 1247 | u8 mptcp_pm_get_endp_signal_max(const struct mptcp_sock *msk);
|
| 1248 | u8 mptcp_pm_get_endp_subflow_max(const struct mptcp_sock *msk);
|
| 1249 | u8 mptcp_pm_get_endp_laminar_max(const struct mptcp_sock *msk);
|
| 1250 | u8 mptcp_pm_get_endp_fullmesh_max(const struct mptcp_sock *msk);
|
| 1251 | u8 mptcp_pm_get_limit_add_addr_accepted(const struct mptcp_sock *msk);
|
| 1252 | u8 mptcp_pm_get_limit_extra_subflows(const struct mptcp_sock *msk);
|
| 1253 |
|
| 1254 |
|
| 1255 | static inline void __mptcp_pm_close_subflow(struct mptcp_sock *msk)
|
| 1256 | {
|
| 1257 | if (!WARN_ON_ONCE(msk->pm.extra_subflows == 0) &&
|
| 1258 | --msk->pm.extra_subflows < mptcp_pm_get_limit_extra_subflows(msk))
|
| 1259 | WRITE_ONCE(msk->pm.accept_subflow, true);
|
| 1260 | }
|
| 1261 |
|
| 1262 | static inline void mptcp_pm_close_subflow(struct mptcp_sock *msk)
|
| 1263 | {
|
| 1264 | spin_lock_bh(&msk->pm.lock);
|
| 1265 | __mptcp_pm_close_subflow(msk);
|
| 1266 | spin_unlock_bh(&msk->pm.lock);
|
| 1267 | }
|
| 1268 |
|
| 1269 | static inline bool mptcp_pm_add_addr_c_flag_case(struct mptcp_sock *msk)
|
| 1270 | {
|
| 1271 | return READ_ONCE(msk->pm.remote_deny_join_id0) &&
|
| 1272 | msk->pm.local_addr_used == 0 &&
|
| 1273 | mptcp_pm_get_limit_add_addr_accepted(msk) == 0 &&
|
| 1274 | msk->pm.extra_subflows < mptcp_pm_get_limit_extra_subflows(msk);
|
| 1275 | }
|
| 1276 |
|
| 1277 | void mptcp_sockopt_sync_locked(struct mptcp_sock *msk, struct sock *ssk);
|
| 1278 |
|
| 1279 | static inline struct mptcp_ext *mptcp_get_ext(const struct sk_buff *skb)
|
| 1280 | {
|
| 1281 | return (struct mptcp_ext *)skb_ext_find(skb, SKB_EXT_MPTCP);
|
| 1282 | }
|
| 1283 |
|
| 1284 | void mptcp_diag_subflow_init(struct tcp_ulp_ops *ops);
|
| 1285 |
|
| 1286 | static inline bool __mptcp_check_fallback(const struct mptcp_sock *msk)
|
| 1287 | {
|
| 1288 | return test_bit(MPTCP_FALLBACK_DONE, &msk->flags);
|
| 1289 | }
|
| 1290 |
|
| 1291 | static inline bool mptcp_check_fallback(const struct sock *sk)
|
| 1292 | {
|
| 1293 | struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
|
| 1294 | struct mptcp_sock *msk = mptcp_sk(subflow->conn);
|
| 1295 |
|
| 1296 | return __mptcp_check_fallback(msk);
|
| 1297 | }
|
| 1298 |
|
| 1299 | static inline bool __mptcp_has_initial_subflow(const struct mptcp_sock *msk)
|
| 1300 | {
|
| 1301 | struct sock *ssk = READ_ONCE(msk->first);
|
| 1302 |
|
| 1303 | return ssk && ((1 << inet_sk_state_load(ssk)) &
|
| 1304 | (TCPF_ESTABLISHED | TCPF_SYN_SENT |
|
| 1305 | TCPF_SYN_RECV | TCPF_LISTEN));
|
| 1306 | }
|
| 1307 |
|
| 1308 | bool __mptcp_try_fallback(struct mptcp_sock *msk, int fb_mib);
|
| 1309 |
|
| 1310 | static inline bool mptcp_try_fallback(struct sock *ssk, int fb_mib)
|
| 1311 | {
|
| 1312 | struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
|
| 1313 | struct sock *sk = subflow->conn;
|
| 1314 | struct mptcp_sock *msk;
|
| 1315 |
|
| 1316 | msk = mptcp_sk(sk);
|
| 1317 | if (!__mptcp_try_fallback(msk, fb_mib))
|
| 1318 | return false;
|
| 1319 | if (READ_ONCE(msk->snd_data_fin_enable) && !(ssk->sk_shutdown & SEND_SHUTDOWN)) {
|
| 1320 | gfp_t saved_allocation = ssk->sk_allocation;
|
| 1321 |
|
| 1322 | |
| 1323 | * fin allocation
|
| 1324 |
|
| 1325 | ssk->sk_allocation = GFP_ATOMIC;
|
| 1326 | ssk->sk_shutdown |= SEND_SHUTDOWN;
|
| 1327 | tcp_shutdown(ssk, SEND_SHUTDOWN);
|
| 1328 | ssk->sk_allocation = saved_allocation;
|
| 1329 | }
|
| 1330 | return true;
|
| 1331 | }
|
| 1332 |
|
| 1333 | static inline void mptcp_early_fallback(struct mptcp_sock *msk,
|
| 1334 | struct mptcp_subflow_context *subflow,
|
| 1335 | int fb_mib)
|
| 1336 | {
|
| 1337 | subflow->request_mptcp = 0;
|
| 1338 | WARN_ON_ONCE(!__mptcp_try_fallback(msk, fb_mib));
|
| 1339 | }
|
| 1340 |
|
| 1341 | static inline bool mptcp_check_infinite_map(struct sk_buff *skb)
|
| 1342 | {
|
| 1343 | struct mptcp_ext *mpext;
|
| 1344 |
|
| 1345 | mpext = skb ? mptcp_get_ext(skb) : NULL;
|
| 1346 | if (mpext && mpext->infinite_map)
|
| 1347 | return true;
|
| 1348 |
|
| 1349 | return false;
|
| 1350 | }
|
| 1351 |
|
| 1352 | static inline bool is_active_ssk(struct mptcp_subflow_context *subflow)
|
| 1353 | {
|
| 1354 | return (subflow->request_mptcp || subflow->request_join);
|
| 1355 | }
|
| 1356 |
|
| 1357 | static inline bool subflow_simultaneous_connect(struct sock *sk)
|
| 1358 | {
|
| 1359 | struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
|
| 1360 |
|
| 1361 |
|
| 1362 | return sk->sk_state == TCP_SYN_RECV && is_active_ssk(subflow);
|
| 1363 | }
|
| 1364 |
|
| 1365 | #ifdef CONFIG_SYN_COOKIES
|
| 1366 | void subflow_init_req_cookie_join_save(const struct mptcp_subflow_request_sock *subflow_req,
|
| 1367 | struct sk_buff *skb);
|
| 1368 | bool mptcp_token_join_cookie_init_state(struct mptcp_subflow_request_sock *subflow_req,
|
| 1369 | struct sk_buff *skb);
|
| 1370 | void __init mptcp_join_cookie_init(void);
|
| 1371 | #else
|
| 1372 | static inline void
|
| 1373 | subflow_init_req_cookie_join_save(const struct mptcp_subflow_request_sock *subflow_req,
|
| 1374 | struct sk_buff *skb) {}
|
| 1375 | static inline bool
|
| 1376 | mptcp_token_join_cookie_init_state(struct mptcp_subflow_request_sock *subflow_req,
|
| 1377 | struct sk_buff *skb)
|
| 1378 | {
|
| 1379 | return false;
|
| 1380 | }
|
| 1381 |
|
| 1382 | static inline void mptcp_join_cookie_init(void) {}
|
| 1383 | #endif
|
| 1384 |
|
| 1385 | #endif
|