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