1 /* SCTP kernel reference Implementation
2  * (C) Copyright IBM Corp. 2001, 2004
3  * Copyright (c) 1999-2000 Cisco, Inc.
4  * Copyright (c) 1999-2001 Motorola, Inc.
5  * Copyright (c) 2001 Intel Corp.
6  * Copyright (c) 2001 Nokia, Inc.
7  * Copyright (c) 2001 La Monte H.P. Yarroll
8  *
9  * This file is part of the SCTP kernel reference Implementation
10  *
11  * Various protocol defined structures.
12  *
13  * The SCTP reference implementation is free software;
14  * you can redistribute it and/or modify it under the terms of
15  * the GNU General Public License as published by
16  * the Free Software Foundation; either version 2, or (at your option)
17  * any later version.
18  *
19  * The SCTP reference implementation is distributed in the hope that it
20  * will be useful, but WITHOUT ANY WARRANTY; without even the implied
21  *                 ************************
22  * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
23  * See the GNU General Public License for more details.
24  *
25  * You should have received a copy of the GNU General Public License
26  * along with GNU CC; see the file COPYING.  If not, write to
27  * the Free Software Foundation, 59 Temple Place - Suite 330,
28  * Boston, MA 02111-1307, USA.
29  *
30  * Please send any bug reports or fixes you make to the
31  * email address(es):
32  *    lksctp developers <lksctp-developerst@lists.sourceforge.net>
33  *
34  * Or submit a bug report through the following website:
35  *    http://www.sf.net/projects/lksctp
36  *
37  * Written or modified by:
38  *    La Monte H.P. Yarroll <piggy@acm.org>
39  *    Karl Knutson <karl@athena.chicago.il.us>
40  *    Jon Grimm <jgrimm@us.ibm.com>
41  *    Xingang Guo <xingang.guo@intel.com>
42  *    randall@sctp.chicago.il.us
43  *    kmorneau@cisco.com
44  *    qxie1@email.mot.com
45  *    Sridhar Samudrala <sri@us.ibm.com>
46  *    Kevin Gao <kevin.gao@intel.com>
47  *
48  * Any bugs reported given to us we will try to fix... any fixes shared will
49  * be incorporated into the next SCTP release.
50  */
51 #ifndef __LINUX_SCTP_H__
52 #define __LINUX_SCTP_H__
53 
54 #include <linux/in.h>		/* We need in_addr.  */
55 #include <linux/in6.h>		/* We need in6_addr.  */
56 
57 
58 /* Section 3.1.  SCTP Common Header Format */
59 typedef struct sctphdr {
60 	__u16 source;
61 	__u16 dest;
62 	__u32 vtag;
63 	__u32 checksum;
64 } __attribute__((packed)) sctp_sctphdr_t;
65 
66 /* Section 3.2.  Chunk Field Descriptions. */
67 typedef struct sctp_chunkhdr {
68 	__u8 type;
69 	__u8 flags;
70 	__u16 length;
71 } __attribute__((packed)) sctp_chunkhdr_t;
72 
73 
74 /* Section 3.2.  Chunk Type Values.
75  * [Chunk Type] identifies the type of information contained in the Chunk
76  * Value field. It takes a value from 0 to 254. The value of 255 is
77  * reserved for future use as an extension field.
78  */
79 typedef enum {
80 	SCTP_CID_DATA			= 0,
81         SCTP_CID_INIT			= 1,
82         SCTP_CID_INIT_ACK		= 2,
83         SCTP_CID_SACK			= 3,
84         SCTP_CID_HEARTBEAT		= 4,
85         SCTP_CID_HEARTBEAT_ACK		= 5,
86         SCTP_CID_ABORT			= 6,
87         SCTP_CID_SHUTDOWN		= 7,
88         SCTP_CID_SHUTDOWN_ACK		= 8,
89         SCTP_CID_ERROR			= 9,
90         SCTP_CID_COOKIE_ECHO		= 10,
91         SCTP_CID_COOKIE_ACK	        = 11,
92         SCTP_CID_ECN_ECNE		= 12,
93         SCTP_CID_ECN_CWR		= 13,
94         SCTP_CID_SHUTDOWN_COMPLETE	= 14,
95 
96 	/* PR-SCTP Sec 3.2 */
97 	SCTP_CID_FWD_TSN		= 0xC0,
98 
99 	/* Use hex, as defined in ADDIP sec. 3.1 */
100 	SCTP_CID_ASCONF			= 0xC1,
101 	SCTP_CID_ASCONF_ACK		= 0x80,
102 } sctp_cid_t; /* enum */
103 
104 
105 /* Section 3.2
106  *  Chunk Types are encoded such that the highest-order two bits specify
107  *  the action that must be taken if the processing endpoint does not
108  *  recognize the Chunk Type.
109  */
110 typedef enum {
111 	SCTP_CID_ACTION_DISCARD     = 0x00,
112 	SCTP_CID_ACTION_DISCARD_ERR = 0x40,
113 	SCTP_CID_ACTION_SKIP        = 0x80,
114 	SCTP_CID_ACTION_SKIP_ERR    = 0xc0,
115 } sctp_cid_action_t;
116 
117 enum { SCTP_CID_ACTION_MASK = 0xc0, };
118 
119 /* This flag is used in Chunk Flags for ABORT and SHUTDOWN COMPLETE.
120  *
121  * 3.3.7 Abort Association (ABORT) (6):
122  *    The T bit is set to 0 if the sender had a TCB that it destroyed.
123  *    If the sender did not have a TCB it should set this bit to 1.
124  */
125 enum { SCTP_CHUNK_FLAG_T = 0x01 };
126 
127 /*
128  *  Set the T bit
129  *
130  *      0                   1                   2                   3
131  *      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
132  *     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
133  *     |   Type = 14   |Reserved     |T|      Length = 4               |
134  *     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
135  *
136  * Chunk Flags: 8 bits
137  *
138  *   Reserved:  7 bits
139  *     Set to 0 on transmit and ignored on receipt.
140  *
141  *   T bit:  1 bit
142  *     The T bit is set to 0 if the sender had a TCB that it destroyed. If
143  *     the sender did NOT have a TCB it should set this bit to 1.
144  *
145  * Note: Special rules apply to this chunk for verification, please
146  * see Section 8.5.1 for details.
147  */
148 
149 #define sctp_test_T_bit(c)    ((c)->chunk_hdr->flags & SCTP_CHUNK_FLAG_T)
150 
151 /* RFC 2960
152  * Section 3.2.1 Optional/Variable-length Parmaeter Format.
153  */
154 
155 typedef struct sctp_paramhdr {
156 	__u16 type;
157 	__u16 length;
158 } __attribute__((packed)) sctp_paramhdr_t;
159 
160 typedef enum {
161 
162 	/* RFC 2960 Section 3.3.5 */
163 	SCTP_PARAM_HEARTBEAT_INFO		= __constant_htons(1),
164 	/* RFC 2960 Section 3.3.2.1 */
165 	SCTP_PARAM_IPV4_ADDRESS			= __constant_htons(5),
166 	SCTP_PARAM_IPV6_ADDRESS			= __constant_htons(6),
167 	SCTP_PARAM_STATE_COOKIE			= __constant_htons(7),
168 	SCTP_PARAM_UNRECOGNIZED_PARAMETERS	= __constant_htons(8),
169 	SCTP_PARAM_COOKIE_PRESERVATIVE		= __constant_htons(9),
170 	SCTP_PARAM_HOST_NAME_ADDRESS		= __constant_htons(11),
171 	SCTP_PARAM_SUPPORTED_ADDRESS_TYPES	= __constant_htons(12),
172 	SCTP_PARAM_ECN_CAPABLE			= __constant_htons(0x8000),
173 
174 	/* PR-SCTP Sec 3.1 */
175 	SCTP_PARAM_FWD_TSN_SUPPORT	= __constant_htons(0xc000),
176 
177 	/* Add-IP Extension. Section 3.2 */
178 	SCTP_PARAM_ADD_IP		= __constant_htons(0xc001),
179 	SCTP_PARAM_DEL_IP		= __constant_htons(0xc002),
180 	SCTP_PARAM_ERR_CAUSE		= __constant_htons(0xc003),
181 	SCTP_PARAM_SET_PRIMARY		= __constant_htons(0xc004),
182 	SCTP_PARAM_SUCCESS_REPORT	= __constant_htons(0xc005),
183 	SCTP_PARAM_ADAPTION_LAYER_IND   = __constant_htons(0xc006),
184 
185 } sctp_param_t; /* enum */
186 
187 
188 /* RFC 2960 Section 3.2.1
189  *  The Parameter Types are encoded such that the highest-order two bits
190  *  specify the action that must be taken if the processing endpoint does
191  *  not recognize the Parameter Type.
192  *
193  */
194 typedef enum {
195 	SCTP_PARAM_ACTION_DISCARD     = __constant_htons(0x0000),
196 	SCTP_PARAM_ACTION_DISCARD_ERR = __constant_htons(0x4000),
197 	SCTP_PARAM_ACTION_SKIP        = __constant_htons(0x8000),
198 	SCTP_PARAM_ACTION_SKIP_ERR    = __constant_htons(0xc000),
199 } sctp_param_action_t;
200 
201 enum { SCTP_PARAM_ACTION_MASK = __constant_htons(0xc000), };
202 
203 /* RFC 2960 Section 3.3.1 Payload Data (DATA) (0) */
204 
205 typedef struct sctp_datahdr {
206 	__u32 tsn;
207 	__u16 stream;
208 	__u16 ssn;
209 	__u32 ppid;
210 	__u8  payload[0];
211 } __attribute__((packed)) sctp_datahdr_t;
212 
213 typedef struct sctp_data_chunk {
214         sctp_chunkhdr_t chunk_hdr;
215         sctp_datahdr_t  data_hdr;
216 } __attribute__((packed)) sctp_data_chunk_t;
217 
218 /* DATA Chuck Specific Flags */
219 enum {
220 	SCTP_DATA_MIDDLE_FRAG	= 0x00,
221 	SCTP_DATA_LAST_FRAG	= 0x01,
222 	SCTP_DATA_FIRST_FRAG	= 0x02,
223 	SCTP_DATA_NOT_FRAG	= 0x03,
224 	SCTP_DATA_UNORDERED	= 0x04,
225 };
226 enum { SCTP_DATA_FRAG_MASK = 0x03, };
227 
228 
229 /* RFC 2960 Section 3.3.2 Initiation (INIT) (1)
230  *
231  *  This chunk is used to initiate a SCTP association between two
232  *  endpoints.
233  */
234 typedef struct sctp_inithdr {
235 	__u32 init_tag;
236 	__u32 a_rwnd;
237 	__u16 num_outbound_streams;
238 	__u16 num_inbound_streams;
239 	__u32 initial_tsn;
240 	__u8  params[0];
241 } __attribute__((packed)) sctp_inithdr_t;
242 
243 typedef struct sctp_init_chunk {
244 	sctp_chunkhdr_t chunk_hdr;
245 	sctp_inithdr_t init_hdr;
246 } __attribute__((packed)) sctp_init_chunk_t;
247 
248 
249 /* Section 3.3.2.1. IPv4 Address Parameter (5) */
250 typedef struct sctp_ipv4addr_param {
251 	sctp_paramhdr_t param_hdr;
252 	struct in_addr  addr;
253 } __attribute__((packed)) sctp_ipv4addr_param_t;
254 
255 /* Section 3.3.2.1. IPv6 Address Parameter (6) */
256 typedef struct sctp_ipv6addr_param {
257 	sctp_paramhdr_t param_hdr;
258 	struct in6_addr addr;
259 } __attribute__((packed)) sctp_ipv6addr_param_t;
260 
261 /* Section 3.3.2.1 Cookie Preservative (9) */
262 typedef struct sctp_cookie_preserve_param {
263 	sctp_paramhdr_t param_hdr;
264 	uint32_t        lifespan_increment;
265 } __attribute__((packed)) sctp_cookie_preserve_param_t;
266 
267 /* Section 3.3.2.1 Host Name Address (11) */
268 typedef struct sctp_hostname_param {
269 	sctp_paramhdr_t param_hdr;
270 	uint8_t hostname[0];
271 } __attribute__((packed)) sctp_hostname_param_t;
272 
273 /* Section 3.3.2.1 Supported Address Types (12) */
274 typedef struct sctp_supported_addrs_param {
275 	sctp_paramhdr_t param_hdr;
276 	uint16_t types[0];
277 } __attribute__((packed)) sctp_supported_addrs_param_t;
278 
279 /* Appendix A. ECN Capable (32768) */
280 typedef struct sctp_ecn_capable_param {
281 	sctp_paramhdr_t param_hdr;
282 } __attribute__((packed)) sctp_ecn_capable_param_t;
283 
284 /* ADDIP Section 3.2.6 Adaption Layer Indication */
285 typedef struct sctp_adaption_ind_param {
286 	struct sctp_paramhdr param_hdr;
287 	__u32 adaption_ind;
288 } __attribute__((packed)) sctp_adaption_ind_param_t;
289 
290 /* RFC 2960.  Section 3.3.3 Initiation Acknowledgement (INIT ACK) (2):
291  *   The INIT ACK chunk is used to acknowledge the initiation of an SCTP
292  *   association.
293  */
294 typedef sctp_init_chunk_t sctp_initack_chunk_t;
295 
296 /* Section 3.3.3.1 State Cookie (7) */
297 typedef struct sctp_cookie_param {
298 	sctp_paramhdr_t p;
299 	__u8 body[0];
300 } __attribute__((packed)) sctp_cookie_param_t;
301 
302 /* Section 3.3.3.1 Unrecognized Parameters (8) */
303 typedef struct sctp_unrecognized_param {
304 	sctp_paramhdr_t param_hdr;
305 	sctp_paramhdr_t unrecognized;
306 } __attribute__((packed)) sctp_unrecognized_param_t;
307 
308 
309 
310 /*
311  * 3.3.4 Selective Acknowledgement (SACK) (3):
312  *
313  *  This chunk is sent to the peer endpoint to acknowledge received DATA
314  *  chunks and to inform the peer endpoint of gaps in the received
315  *  subsequences of DATA chunks as represented by their TSNs.
316  */
317 
318 typedef struct sctp_gap_ack_block {
319 	__u16 start;
320 	__u16 end;
321 } __attribute__((packed)) sctp_gap_ack_block_t;
322 
323 typedef uint32_t sctp_dup_tsn_t;
324 
325 typedef union {
326 	sctp_gap_ack_block_t	gab;
327         sctp_dup_tsn_t		dup;
328 } sctp_sack_variable_t;
329 
330 typedef struct sctp_sackhdr {
331 	__u32 cum_tsn_ack;
332 	__u32 a_rwnd;
333 	__u16 num_gap_ack_blocks;
334 	__u16 num_dup_tsns;
335 	sctp_sack_variable_t variable[0];
336 } __attribute__((packed)) sctp_sackhdr_t;
337 
338 typedef struct sctp_sack_chunk {
339 	sctp_chunkhdr_t chunk_hdr;
340 	sctp_sackhdr_t sack_hdr;
341 } __attribute__((packed)) sctp_sack_chunk_t;
342 
343 
344 /* RFC 2960.  Section 3.3.5 Heartbeat Request (HEARTBEAT) (4):
345  *
346  *  An endpoint should send this chunk to its peer endpoint to probe the
347  *  reachability of a particular destination transport address defined in
348  *  the present association.
349  */
350 
351 typedef struct sctp_heartbeathdr {
352 	sctp_paramhdr_t info;
353 } __attribute__((packed)) sctp_heartbeathdr_t;
354 
355 typedef struct sctp_heartbeat_chunk {
356 	sctp_chunkhdr_t chunk_hdr;
357 	sctp_heartbeathdr_t hb_hdr;
358 } __attribute__((packed)) sctp_heartbeat_chunk_t;
359 
360 
361 /* For the abort and shutdown ACK we must carry the init tag in the
362  * common header. Just the common header is all that is needed with a
363  * chunk descriptor.
364  */
365 typedef struct sctp_abort_chunk {
366         sctp_chunkhdr_t uh;
367 } __attribute__((packed)) sctp_abort_chunk_t;
368 
369 
370 /* For the graceful shutdown we must carry the tag (in common header)
371  * and the highest consecutive acking value.
372  */
373 typedef struct sctp_shutdownhdr {
374 	__u32 cum_tsn_ack;
375 } __attribute__((packed)) sctp_shutdownhdr_t;
376 
377 struct sctp_shutdown_chunk_t {
378         sctp_chunkhdr_t    chunk_hdr;
379         sctp_shutdownhdr_t shutdown_hdr;
380 } __attribute__ ((packed));
381 
382 /* RFC 2960.  Section 3.3.10 Operation Error (ERROR) (9) */
383 
384 typedef struct sctp_errhdr {
385 	__u16 cause;
386 	__u16 length;
387 	__u8  variable[0];
388 } __attribute__((packed)) sctp_errhdr_t;
389 
390 typedef struct sctp_operr_chunk {
391         sctp_chunkhdr_t chunk_hdr;
392 	sctp_errhdr_t   err_hdr;
393 } __attribute__((packed)) sctp_operr_chunk_t;
394 
395 /* RFC 2960 3.3.10 - Operation Error
396  *
397  * Cause Code: 16 bits (unsigned integer)
398  *
399  *     Defines the type of error conditions being reported.
400  *    Cause Code
401  *     Value           Cause Code
402  *     ---------      ----------------
403  *      1              Invalid Stream Identifier
404  *      2              Missing Mandatory Parameter
405  *      3              Stale Cookie Error
406  *      4              Out of Resource
407  *      5              Unresolvable Address
408  *      6              Unrecognized Chunk Type
409  *      7              Invalid Mandatory Parameter
410  *      8              Unrecognized Parameters
411  *      9              No User Data
412  *     10              Cookie Received While Shutting Down
413  */
414 typedef enum {
415 
416 	SCTP_ERROR_NO_ERROR	   = __constant_htons(0x00),
417 	SCTP_ERROR_INV_STRM	   = __constant_htons(0x01),
418 	SCTP_ERROR_MISS_PARAM 	   = __constant_htons(0x02),
419 	SCTP_ERROR_STALE_COOKIE	   = __constant_htons(0x03),
420 	SCTP_ERROR_NO_RESOURCE 	   = __constant_htons(0x04),
421 	SCTP_ERROR_DNS_FAILED      = __constant_htons(0x05),
422 	SCTP_ERROR_UNKNOWN_CHUNK   = __constant_htons(0x06),
423 	SCTP_ERROR_INV_PARAM       = __constant_htons(0x07),
424 	SCTP_ERROR_UNKNOWN_PARAM   = __constant_htons(0x08),
425 	SCTP_ERROR_NO_DATA         = __constant_htons(0x09),
426 	SCTP_ERROR_COOKIE_IN_SHUTDOWN = __constant_htons(0x0a),
427 
428 
429 	/* SCTP Implementation Guide:
430 	 *  11  Restart of an association with new addresses
431 	 *  12  User Initiated Abort
432 	 *  13  Protocol Violation
433 	 */
434 
435 	SCTP_ERROR_RESTART         = __constant_htons(0x0b),
436 	SCTP_ERROR_USER_ABORT      = __constant_htons(0x0c),
437 	SCTP_ERROR_PROTO_VIOLATION = __constant_htons(0x0d),
438 
439 	/* ADDIP Section 3.3  New Error Causes
440 	 *
441 	 * Four new Error Causes are added to the SCTP Operational Errors,
442 	 * primarily for use in the ASCONF-ACK chunk.
443 	 *
444 	 * Value          Cause Code
445 	 * ---------      ----------------
446 	 * 0x0100          Request to Delete Last Remaining IP Address.
447 	 * 0x0101          Operation Refused Due to Resource Shortage.
448 	 * 0x0102          Request to Delete Source IP Address.
449 	 * 0x0103          Association Aborted due to illegal ASCONF-ACK
450 	 * 0x0104          Request refused - no authorization.
451 	 */
452 	SCTP_ERROR_DEL_LAST_IP	= __constant_htons(0x0100),
453 	SCTP_ERROR_RSRC_LOW	= __constant_htons(0x0101),
454 	SCTP_ERROR_DEL_SRC_IP	= __constant_htons(0x0102),
455 	SCTP_ERROR_ASCONF_ACK   = __constant_htons(0x0103),
456 	SCTP_ERROR_REQ_REFUSED	= __constant_htons(0x0104)
457 } sctp_error_t;
458 
459 
460 
461 /* RFC 2960.  Appendix A.  Explicit Congestion Notification.
462  *   Explicit Congestion Notification Echo (ECNE) (12)
463  */
464 typedef struct sctp_ecnehdr {
465 	__u32 lowest_tsn;
466 } sctp_ecnehdr_t;
467 
468 typedef struct sctp_ecne_chunk {
469 	sctp_chunkhdr_t chunk_hdr;
470 	sctp_ecnehdr_t ence_hdr;
471 } __attribute__((packed)) sctp_ecne_chunk_t;
472 
473 /* RFC 2960.  Appendix A.  Explicit Congestion Notification.
474  *   Congestion Window Reduced (CWR) (13)
475  */
476 typedef struct sctp_cwrhdr {
477 	__u32 lowest_tsn;
478 } sctp_cwrhdr_t;
479 
480 typedef struct sctp_cwr_chunk {
481 	sctp_chunkhdr_t chunk_hdr;
482 	sctp_cwrhdr_t cwr_hdr;
483 } __attribute__((packed)) sctp_cwr_chunk_t;
484 
485 /* PR-SCTP
486  * 3.2 Forward Cumulative TSN Chunk Definition (FORWARD TSN)
487  *
488  * Forward Cumulative TSN chunk has the following format:
489  *
490  *        0                   1                   2                   3
491  *        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
492  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
493  *      |   Type = 192  |  Flags = 0x00 |        Length = Variable      |
494  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
495  *      |                      New Cumulative TSN                       |
496  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
497  *      |         Stream-1              |       Stream Sequence-1       |
498  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
499  *      \                                                               /
500  *      /                                                               \
501  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
502  *      |         Stream-N              |       Stream Sequence-N       |
503  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
504  *
505  *      Chunk Flags:
506  *
507  *        Set to all zeros on transmit and ignored on receipt.
508  *
509  *      New Cumulative TSN: 32 bit u_int
510  *
511  *       This indicates the new cumulative TSN to the data receiver. Upon
512  *       the reception of this value, the data receiver MUST consider
513  *       any missing TSNs earlier than or equal to this value as received
514  *       and stop reporting them as gaps in any subsequent SACKs.
515  *
516  *      Stream-N: 16 bit u_int
517  *
518  *       This field holds a stream number that was skipped by this
519  *       FWD-TSN.
520  *
521  *      Stream Sequence-N: 16 bit u_int
522  *       This field holds the sequence number associated with the stream
523  *       that was skipped. The stream sequence field holds the largest stream
524  *       sequence number in this stream being skipped.  The receiver of
525  *       the FWD-TSN's can use the Stream-N and Stream Sequence-N fields
526  *       to enable delivery of any stranded TSN's that remain on the stream
527  *       re-ordering queues. This field MUST NOT report TSN's corresponding
528  *       to DATA chunk that are marked as unordered. For ordered DATA
529  *       chunks this field MUST be filled in.
530  */
531 struct sctp_fwdtsn_skip {
532 	__u16 stream;
533 	__u16 ssn;
534 } __attribute__((packed));
535 
536 struct sctp_fwdtsn_hdr {
537 	__u32 new_cum_tsn;
538 	struct sctp_fwdtsn_skip skip[0];
539 } __attribute((packed));
540 
541 struct sctp_fwdtsn_chunk {
542 	struct sctp_chunkhdr chunk_hdr;
543 	struct sctp_fwdtsn_hdr fwdtsn_hdr;
544 } __attribute((packed));
545 
546 
547 /* ADDIP
548  * Section 3.1.1 Address Configuration Change Chunk (ASCONF)
549  *
550  * 	Serial Number: 32 bits (unsigned integer)
551  *	This value represents a Serial Number for the ASCONF Chunk. The
552  *	valid range of Serial Number is from 0 to 2^32-1.
553  *	Serial Numbers wrap back to 0 after reaching 2^32 -1.
554  *
555  *	Address Parameter: 8 or 20 bytes (depending on type)
556  *	The address is an address of the sender of the ASCONF chunk,
557  *	the address MUST be considered part of the association by the
558  *	peer endpoint. This field may be used by the receiver of the
559  *	ASCONF to help in finding the association. This parameter MUST
560  *	be present in every ASCONF message i.e. it is a mandatory TLV
561  *	parameter.
562  *
563  *	ASCONF Parameter: TLV format
564  *	Each Address configuration change is represented by a TLV
565  *	parameter as defined in Section 3.2. One or more requests may
566  *	be present in an ASCONF Chunk.
567  *
568  * Section 3.1.2 Address Configuration Acknowledgement Chunk (ASCONF-ACK)
569  *
570  *	Serial Number: 32 bits (unsigned integer)
571  *	This value represents the Serial Number for the received ASCONF
572  *	Chunk that is acknowledged by this chunk. This value is copied
573  *	from the received ASCONF Chunk.
574  *
575  *	ASCONF Parameter Response: TLV format
576  *	The ASCONF Parameter Response is used in the ASCONF-ACK to
577  *	report status of ASCONF processing.
578  */
579 typedef struct sctp_addip_param {
580 	sctp_paramhdr_t	param_hdr;
581 	__u32		crr_id;
582 } __attribute__((packed)) sctp_addip_param_t;
583 
584 typedef struct sctp_addiphdr {
585 	__u32	serial;
586 	__u8	params[0];
587 } __attribute__((packed)) sctp_addiphdr_t;
588 
589 typedef struct sctp_addip_chunk {
590 	sctp_chunkhdr_t chunk_hdr;
591 	sctp_addiphdr_t addip_hdr;
592 } __attribute__((packed)) sctp_addip_chunk_t;
593 
594 #endif /* __LINUX_SCTP_H__ */
595