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