1/*
2 * Copyright (c) 2012-2017 Apple Inc. All rights reserved.
3 *
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
14 *
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
17 *
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
25 *
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27 */
28
29#ifndef _NETINET_MPTCP_H_
30#define _NETINET_MPTCP_H_
31
32#ifdef BSD_KERNEL_PRIVATE
33
34#include <machine/endian.h>
35
36#include <libkern/crypto/sha1.h>
37
38#if BYTE_ORDER == BIG_ENDIAN
39#define mptcp_hton64(x) (x)
40#define mptcp_ntoh64(x) (x)
41#else /* LITTLE_ENDIAN */
42#define mptcp_hton64(x) __DARWIN_OSSwapInt64(x)
43#define mptcp_ntoh64(x) __DARWIN_OSSwapInt64(x)
44#endif
45#include <netinet/mptcp_var.h>
46
47/* Preferred MPTCP version to use when version discovery info is incomplete */
48extern int mptcp_preferred_version;
49
50/*
51 * MPTCP Option Subtype Field values
52 */
53#define MPO_CAPABLE 0x0
54#define MPO_JOIN 0x1
55#define MPO_DSS 0x2
56#define MPO_ADD_ADDR 0x3
57#define MPO_REMOVE_ADDR 0x4
58#define MPO_PRIO 0x5
59#define MPO_FAIL 0x6
60#define MPO_FASTCLOSE 0x7
61
62/* MPTCP Protocol version */
63#define MPTCP_VERSION_0 0x0
64#define MPTCP_VERSION_1 0x1
65
66/*
67 * MPTCP MP_CAPABLE TCP Option definitions
68 *
69 * Used to establish an MPTCP connection and first subflow.
70 */
71struct mptcp_mpcapable_opt_common {
72 uint8_t mmco_kind;
73 uint8_t mmco_len;
74#if BYTE_ORDER == LITTLE_ENDIAN
75 uint8_t mmco_version:4,
76 mmco_subtype:4;
77#else /* BIG_ENDIAN */
78 uint8_t mmco_subtype:4,
79 mmco_version:4;
80#endif
81#define MPCAP_PROPOSAL_SBIT 0x01 /* SHA1 (v0) or SHA256 (v1) Algorithm */
82#define MPCAP_GBIT 0x02 /* must be 0 */
83#define MPCAP_FBIT 0x04 /* must be 0 */
84#define MPCAP_EBIT 0x08 /* must be 0 */
85#define MPCAP_DBIT 0x10 /* must be 0 */
86#define MPCAP_UNICAST_IPBIT 0x20 /* Should MPTCP only use ADD_ADDR IPs for new subflows */
87#define MPCAP_BBIT 0x40 /* Extensibility bit, must be 0 */
88#define MPCAP_CHECKSUM_CBIT 0x80 /* DSS Checksum bit */
89 uint8_t mmco_flags;
90} __attribute__((__packed__));
91
92struct mptcp_mpcapable_opt_rsp {
93 struct mptcp_mpcapable_opt_common mmc_common;
94 mptcp_key_t mmc_localkey;
95} __attribute__((__packed__));
96
97struct mptcp_mpcapable_opt_rsp1 {
98 struct mptcp_mpcapable_opt_common mmc_common;
99 mptcp_key_t mmc_localkey;
100 mptcp_key_t mmc_remotekey;
101} __attribute__((__packed__));
102
103struct mptcp_mpcapable_opt_rsp2 {
104 struct mptcp_mpcapable_opt_rsp1 mmc_rsp1;
105 uint16_t data_len;
106 uint16_t csum;
107} __attribute__((__packed__));
108
109/*
110 * MPTCP MP_JOIN TCP Option definitions
111 *
112 * Used to add subflows to an existing MP_CAPABLE connection.
113 */
114
115/* MP_JOIN Option for SYN */
116struct mptcp_mpjoin_opt_req {
117 uint8_t mmjo_kind;
118 uint8_t mmjo_len;
119#define MPTCP_BACKUP 0x1
120 uint8_t mmjo_subtype_bkp;
121 uint8_t mmjo_addr_id;
122 uint32_t mmjo_peer_token;
123 uint32_t mmjo_rand;
124} __attribute__((__packed__));
125
126/* MP_JOIN Option for SYN/ACK */
127struct mptcp_mpjoin_opt_rsp {
128 uint8_t mmjo_kind;
129 uint8_t mmjo_len;
130#define MPTCP_BACKUP 0x1
131 uint8_t mmjo_subtype_bkp;
132 uint8_t mmjo_addr_id;
133 uint64_t mmjo_mac; /* Truncated message auth code */
134 uint32_t mmjo_rand;
135} __attribute__((__packed__));
136
137/* MP_Join Option for ACK */
138struct mptcp_mpjoin_opt_rsp2 {
139 uint8_t mmjo_kind;
140 uint8_t mmjo_len;
141#if BYTE_ORDER == LITTLE_ENDIAN
142 uint8_t mmjo_reserved1:4,
143 mmjo_subtype:4;
144#else /* BIG_ENDIAN */
145 uint8_t mmjo_subtype:4,
146 mmjo_reserved1:4;
147#endif
148 uint8_t mmjo_reserved2;
149 uint8_t mmjo_mac[HMAC_TRUNCATED_ACK]; /* This is 160 bits HMAC per RFC */
150} __attribute__((__packed__));
151
152/* Remove Address Option */
153struct mptcp_remaddr_opt {
154 uint8_t mr_kind;
155 uint8_t mr_len;
156#if BYTE_ORDER == LITTLE_ENDIAN
157 uint8_t mr_rest:4,
158 mr_subtype:4;
159#else /* BIG_ENDIAN */
160 uint8_t mr_subtype:4,
161 mr_rest:4;
162#endif
163 uint8_t mr_addr_id;
164} __attribute__((__packed__));
165
166/*
167 * MPTCP Data Sequence Signal (DSS) TCP Options
168 *
169 * Used to map subflow sequence space to MPTCP data sequence space.
170 * Used to send Data ACKs
171 */
172
173/*
174 * DSS Option variants coded as flags in the DSS option flags field
175 */
176#define MDSS_A 0x01 /* Data ACK present if set */
177#define MDSS_a 0x02 /* 64-bit Data ACK present if set */
178#define MDSS_M 0x04 /* Data Sequence Number present if set */
179#define MDSS_m 0x08 /* 64-bit Data Sequence Number present if set */
180#define MDSS_F 0x10 /* Data FIN present */
181
182/* DSS fields common to all DSS option variants */
183struct mptcp_dss_copt {
184 uint8_t mdss_kind;
185 uint8_t mdss_len;
186#if BYTE_ORDER == LITTLE_ENDIAN
187 uint8_t mdss_reserved1:4,
188 mdss_subtype:4;
189#else /* BIG_ENDIAN */
190 uint8_t mdss_subtype:4,
191 mdss_reserved1:4;
192#endif
193 uint8_t mdss_flags;
194}__attribute__((__packed__));
195
196/* 32-bit DSS option */
197struct mptcp_dsn_opt {
198 struct mptcp_dss_copt mdss_copt;
199 uint32_t mdss_dsn; /* Data Sequence Number */
200 uint32_t mdss_subflow_seqn; /* Relative Subflow Seq Num */
201 uint16_t mdss_data_len; /* Data Length */
202 /* uint16_t mdss_xsum; */ /* Data checksum - optional */
203}__attribute__((__packed__));
204
205/* 64-bit DSS option */
206struct mptcp_dsn64_opt {
207 struct mptcp_dss_copt mdss_copt;
208 uint64_t mdss_dsn; /* Data Sequence Number */
209 uint32_t mdss_subflow_seqn; /* Relative Subflow Seq Num */
210 uint16_t mdss_data_len; /* Data Length */
211 /* uint16_t mdss_xsum; */ /* Data checksum - optional */
212}__attribute__((__packed__));
213
214/* 32-bit DSS Data ACK option */
215struct mptcp_data_ack_opt {
216 struct mptcp_dss_copt mdss_copt;
217 uint32_t mdss_ack;
218}__attribute__((__packed__));
219
220/* 64-bit DSS Data ACK option */
221struct mptcp_data_ack64_opt {
222 struct mptcp_dss_copt mdss_copt;
223 uint64_t mdss_ack;
224}__attribute__((__packed__));
225
226/* 32-bit DSS+Data ACK option */
227struct mptcp_dss_ack_opt {
228 struct mptcp_dss_copt mdss_copt;
229 uint32_t mdss_ack; /* Data ACK */
230 uint32_t mdss_dsn; /* Data Sequence Number */
231 uint32_t mdss_subflow_seqn; /* Relative Subflow Seq Num */
232 uint16_t mdss_data_len; /* Data Length */
233 /* uint16_t mdss_xsum; */ /* Data checksum - optional */
234}__attribute__((__packed__));
235
236/* 64-bit DSS+Data ACK option */
237struct mptcp_dss64_ack64_opt {
238 struct mptcp_dss_copt mdss_copt;
239 uint64_t mdss_ack; /* Data ACK */
240 uint64_t mdss_dsn; /* Data Sequence Number */
241 uint32_t mdss_subflow_seqn; /* Relative Subflow Seq Num */
242 uint16_t mdss_data_len; /* Data Length */
243 /* uint16_t mdss_xsum; */ /* Data checksum - optional */
244}__attribute__((__packed__));
245
246/* DSS+Data ACK mixed option variants */
247struct mptcp_dss32_ack64_opt {
248 struct mptcp_dss_copt mdss_copt;
249 uint64_t mdss_ack; /* Data ACK */
250 uint32_t mdss_dsn; /* Data Sequence Number */
251 uint32_t mdss_subflow_seqn; /* Relative Subflow Seq Num */
252 uint16_t mdss_data_len; /* Data Length */
253 /* uint16_t mdss_xsum; */ /* Data checksum - optional */
254}__attribute__((__packed__));
255
256struct mptcp_dss64_ack32_opt {
257 struct mptcp_dss_copt mdss_copt;
258 uint32_t mdss_ack; /* Data ACK */
259 uint64_t mdss_dsn; /* Data Sequence Number */
260 uint32_t mdss_subflow_seqn; /* Relative Subflow Seq Num */
261 uint16_t mdss_data_len; /* Data Length */
262 /* uint16_t mdss_xsum; */ /* Data checksum - optional */
263}__attribute__((__packed__));
264
265
266/*
267 * MPTCP Fast Close Option
268 *
269 * MPTCP connection is aborted if the FastClose option is received.
270 * In future, we may send this option if a MPTCP socket level abort
271 * API is supported.
272 */
273struct mptcp_fastclose_opt {
274 uint8_t mfast_kind;
275 uint8_t mfast_len;
276#if BYTE_ORDER == LITTLE_ENDIAN
277 uint8_t mfast_reserved:4,
278 mfast_subtype:4;
279#else /* BIG_ENDIAN */
280 uint8_t mfast_subtype:4,
281 mfast_reserved:4;
282#endif
283 uint8_t mfast_reserved1;
284 uint64_t mfast_key; /* Option receiver's key */
285}__attribute__((__packed__));
286
287/*
288 * MPTCP MP_FAIL Option
289 *
290 * When DSS checksum is ON, and checksum fails, remote peer may send
291 * this option to indicate the failure. Likewise, we may send this
292 * option.
293 */
294struct mptcp_mpfail_opt {
295 uint8_t mfail_kind;
296 uint8_t mfail_len;
297#if BYTE_ORDER == LITTLE_ENDIAN
298 uint8_t mfail_reserved:4,
299 mfail_subtype:4;
300#else /* BIG_ENDIAN */
301 uint8_t mfail_subtype:4,
302 mfail_reserved:4;
303#endif
304 uint8_t mfail_reserved1:8;
305 uint64_t mfail_dsn;
306}__attribute__((__packed__));
307
308struct mptcp_add_addr_opt {
309 uint8_t maddr_kind;
310 uint8_t maddr_len;
311#if BYTE_ORDER == LITTLE_ENDIAN
312 uint8_t maddr_flags:4,
313 maddr_subtype:4;
314#else /* BIG_ENDIAN */
315 uint8_t maddr_subtype:4,
316 maddr_flags:4;
317#endif
318 uint8_t maddr_addrid;
319 union {
320 struct {
321 struct in_addr maddr_addrv4;
322 uint32_t maddr_pad[3];
323 };
324
325 struct {
326 struct in6_addr maddr_addrv6;
327 };
328 } maddr_u;
329}__attribute__((__packed__));
330
331struct mptcp_add_addr_hmac_msg_v4 {
332 uint8_t maddr_addrid;
333 struct in_addr maddr_addr;
334 uint16_t maddr_port;
335}__attribute__((__packed__));
336
337struct mptcp_add_addr_hmac_msg_v6 {
338 uint8_t maddr_addrid;
339 struct in6_addr maddr_addr;
340 uint16_t maddr_port;
341}__attribute__((__packed__));
342
343
344#define MPTCP_V0_ADD_ADDR_IPV4 4
345#define MPTCP_V0_ADD_ADDR_IPV6 6
346#define MPTCP_V1_ADD_ADDR_ECHO 0x1
347
348#define MPTCP_V0_ADD_ADDR_OPT_LEN_V4 8
349#define MPTCP_V0_ADD_ADDR_OPT_LEN_V6 20
350#define MPTCP_V1_ADD_ADDR_OPT_LEN_V4 16
351#define MPTCP_V1_ADD_ADDR_OPT_LEN_V6 28
352#define MPTCP_V1_ADD_ADDR_ECHO_OPT_LEN_V4 8
353#define MPTCP_V1_ADD_ADDR_ECHO_OPT_LEN_V6 20
354/*
355 * MPTCP MP_PRIO Option
356 *
357 * When a subflow becomes unusable (due to bad radio coverage) or
358 * it is the costlier path or it is not the preferred path, the receiver may
359 * use this option to let the sender know of its path preference.
360 */
361
362/* Option to change priority of some other subflow(s) using addr_id */
363struct mptcp_mpprio_addr_opt {
364 uint8_t mpprio_kind;
365 uint8_t mpprio_len;
366#define MPTCP_MPPRIO_BKP 0x1
367#if BYTE_ORDER == LITTLE_ENDIAN
368 uint8_t mpprio_flags:4,
369 mpprio_subtype:4;
370#else /* BIG_ENDIAN */
371 uint8_t mpprio_subtype:4,
372 mpprio_flags:4;
373#endif
374 uint8_t mpprio_addrid;
375}__attribute__((__packed__));
376
377#endif /* BSD_KERNEL_PRIVATE */
378
379#endif /* _NETINET_MPTCP_H_ */
380