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