1 /* SPDX-License-Identifier: GPL-2.0 */
4 * Copyright (c) 2017 - 2019, Intel Corporation.
7 #ifndef __MPTCP_PROTOCOL_H
8 #define __MPTCP_PROTOCOL_H
10 #include <linux/random.h>
12 #include <net/inet_connection_sock.h>
14 #define MPTCP_SUPPORTED_VERSION 1
16 /* MPTCP option bits */
17 #define OPTION_MPTCP_MPC_SYN BIT(0)
18 #define OPTION_MPTCP_MPC_SYNACK BIT(1)
19 #define OPTION_MPTCP_MPC_ACK BIT(2)
21 /* MPTCP option subtypes */
22 #define MPTCPOPT_MP_CAPABLE 0
23 #define MPTCPOPT_MP_JOIN 1
24 #define MPTCPOPT_DSS 2
25 #define MPTCPOPT_ADD_ADDR 3
26 #define MPTCPOPT_RM_ADDR 4
27 #define MPTCPOPT_MP_PRIO 5
28 #define MPTCPOPT_MP_FAIL 6
29 #define MPTCPOPT_MP_FASTCLOSE 7
31 /* MPTCP suboption lengths */
32 #define TCPOLEN_MPTCP_MPC_SYN 4
33 #define TCPOLEN_MPTCP_MPC_SYNACK 12
34 #define TCPOLEN_MPTCP_MPC_ACK 20
35 #define TCPOLEN_MPTCP_MPC_ACK_DATA 22
36 #define TCPOLEN_MPTCP_DSS_BASE 4
37 #define TCPOLEN_MPTCP_DSS_ACK32 4
38 #define TCPOLEN_MPTCP_DSS_ACK64 8
39 #define TCPOLEN_MPTCP_DSS_MAP32 10
40 #define TCPOLEN_MPTCP_DSS_MAP64 14
41 #define TCPOLEN_MPTCP_DSS_CHECKSUM 2
43 /* MPTCP MP_CAPABLE flags */
44 #define MPTCP_VERSION_MASK (0x0F)
45 #define MPTCP_CAP_CHECKSUM_REQD BIT(7)
46 #define MPTCP_CAP_EXTENSIBILITY BIT(6)
47 #define MPTCP_CAP_HMAC_SHA256 BIT(0)
48 #define MPTCP_CAP_FLAG_MASK (0x3F)
51 #define MPTCP_DSS_DATA_FIN BIT(4)
52 #define MPTCP_DSS_DSN64 BIT(3)
53 #define MPTCP_DSS_HAS_MAP BIT(2)
54 #define MPTCP_DSS_ACK64 BIT(1)
55 #define MPTCP_DSS_HAS_ACK BIT(0)
56 #define MPTCP_DSS_FLAG_MASK (0x1F)
58 /* MPTCP socket flags */
59 #define MPTCP_DATA_READY BIT(0)
60 #define MPTCP_SEND_SPACE BIT(1)
62 /* MPTCP connection sock */
64 /* inet_connection_sock must be the first member */
65 struct inet_connection_sock sk
;
73 struct list_head conn_list
;
74 struct skb_ext
*cached_ext
; /* for the next sendmsg */
75 struct socket
*subflow
; /* outgoing connect/listener/!mp_capable */
79 #define mptcp_for_each_subflow(__msk, __subflow) \
80 list_for_each_entry(__subflow, &((__msk)->conn_list), node)
82 static inline struct mptcp_sock
*mptcp_sk(const struct sock
*sk
)
84 return (struct mptcp_sock
*)sk
;
87 struct mptcp_subflow_request_sock
{
88 struct tcp_request_sock sk
;
100 static inline struct mptcp_subflow_request_sock
*
101 mptcp_subflow_rsk(const struct request_sock
*rsk
)
103 return (struct mptcp_subflow_request_sock
*)rsk
;
106 /* MPTCP subflow context */
107 struct mptcp_subflow_context
{
108 struct list_head node
;/* conn_list of subflows */
119 u32 request_mptcp
: 1, /* send MP_CAPABLE */
120 mp_capable
: 1, /* remote is MPTCP capable */
121 fourth_ack
: 1, /* send initial DSS */
127 can_ack
: 1; /* only after processing the remote a key */
129 struct sock
*tcp_sock
; /* tcp sk backpointer */
130 struct sock
*conn
; /* parent mptcp_sock */
131 const struct inet_connection_sock_af_ops
*icsk_af_ops
;
132 void (*tcp_data_ready
)(struct sock
*sk
);
133 void (*tcp_state_change
)(struct sock
*sk
);
134 void (*tcp_write_space
)(struct sock
*sk
);
139 static inline struct mptcp_subflow_context
*
140 mptcp_subflow_ctx(const struct sock
*sk
)
142 struct inet_connection_sock
*icsk
= inet_csk(sk
);
144 /* Use RCU on icsk_ulp_data only for sock diag code */
145 return (__force
struct mptcp_subflow_context
*)icsk
->icsk_ulp_data
;
148 static inline struct sock
*
149 mptcp_subflow_tcp_sock(const struct mptcp_subflow_context
*subflow
)
151 return subflow
->tcp_sock
;
155 mptcp_subflow_get_map_offset(const struct mptcp_subflow_context
*subflow
)
157 return tcp_sk(mptcp_subflow_tcp_sock(subflow
))->copied_seq
-
158 subflow
->ssn_offset
-
159 subflow
->map_subflow_seq
;
163 mptcp_subflow_get_mapped_dsn(const struct mptcp_subflow_context
*subflow
)
165 return subflow
->map_seq
+ mptcp_subflow_get_map_offset(subflow
);
168 int mptcp_is_enabled(struct net
*net
);
169 bool mptcp_subflow_data_available(struct sock
*sk
);
170 void mptcp_subflow_init(void);
171 int mptcp_subflow_create_socket(struct sock
*sk
, struct socket
**new_sock
);
173 static inline void mptcp_subflow_tcp_fallback(struct sock
*sk
,
174 struct mptcp_subflow_context
*ctx
)
176 sk
->sk_data_ready
= ctx
->tcp_data_ready
;
177 sk
->sk_state_change
= ctx
->tcp_state_change
;
178 sk
->sk_write_space
= ctx
->tcp_write_space
;
180 inet_csk(sk
)->icsk_af_ops
= ctx
->icsk_af_ops
;
183 extern const struct inet_connection_sock_af_ops ipv4_specific
;
184 #if IS_ENABLED(CONFIG_MPTCP_IPV6)
185 extern const struct inet_connection_sock_af_ops ipv6_specific
;
188 void mptcp_proto_init(void);
189 #if IS_ENABLED(CONFIG_MPTCP_IPV6)
190 int mptcp_proto_v6_init(void);
193 struct mptcp_read_arg
{
197 int mptcp_read_actor(read_descriptor_t
*desc
, struct sk_buff
*skb
,
198 unsigned int offset
, size_t len
);
200 void mptcp_get_options(const struct sk_buff
*skb
,
201 struct tcp_options_received
*opt_rx
);
203 void mptcp_finish_connect(struct sock
*sk
);
205 int mptcp_token_new_request(struct request_sock
*req
);
206 void mptcp_token_destroy_request(u32 token
);
207 int mptcp_token_new_connect(struct sock
*sk
);
208 int mptcp_token_new_accept(u32 token
);
209 void mptcp_token_update_accept(struct sock
*sk
, struct sock
*conn
);
210 void mptcp_token_destroy(u32 token
);
212 void mptcp_crypto_key_sha(u64 key
, u32
*token
, u64
*idsn
);
213 static inline void mptcp_crypto_key_gen_sha(u64
*key
, u32
*token
, u64
*idsn
)
215 /* we might consider a faster version that computes the key as a
216 * hash of some information available in the MPTCP socket. Use
217 * random data at the moment, as it's probably the safest option
218 * in case multiple sockets are opened in different namespaces at
221 get_random_bytes(key
, sizeof(u64
));
222 mptcp_crypto_key_sha(*key
, token
, idsn
);
225 void mptcp_crypto_hmac_sha(u64 key1
, u64 key2
, u32 nonce1
, u32 nonce2
,
228 static inline struct mptcp_ext
*mptcp_get_ext(struct sk_buff
*skb
)
230 return (struct mptcp_ext
*)skb_ext_find(skb
, SKB_EXT_MPTCP
);
233 static inline bool before64(__u64 seq1
, __u64 seq2
)
235 return (__s64
)(seq1
- seq2
) < 0;
238 #define after64(seq2, seq1) before64(seq1, seq2)
240 #endif /* __MPTCP_PROTOCOL_H */