ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / include / linux / sctp.h
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
285
286 /* RFC 2960.  Section 3.3.3 Initiation Acknowledgement (INIT ACK) (2):
287  *   The INIT ACK chunk is used to acknowledge the initiation of an SCTP
288  *   association.
289  */
290 typedef sctp_init_chunk_t sctp_initack_chunk_t;
291
292 /* Section 3.3.3.1 State Cookie (7) */
293 typedef struct sctp_cookie_param {
294         sctp_paramhdr_t p;
295         __u8 body[0];
296 } __attribute__((packed)) sctp_cookie_param_t;
297
298 /* Section 3.3.3.1 Unrecognized Parameters (8) */
299 typedef struct sctp_unrecognized_param {
300         sctp_paramhdr_t param_hdr;
301         sctp_paramhdr_t unrecognized;
302 } __attribute__((packed)) sctp_unrecognized_param_t;
303
304
305
306 /*
307  * 3.3.4 Selective Acknowledgement (SACK) (3):
308  *
309  *  This chunk is sent to the peer endpoint to acknowledge received DATA
310  *  chunks and to inform the peer endpoint of gaps in the received
311  *  subsequences of DATA chunks as represented by their TSNs.
312  */
313
314 typedef struct sctp_gap_ack_block {
315         __u16 start;
316         __u16 end;
317 } __attribute__((packed)) sctp_gap_ack_block_t;
318
319 typedef uint32_t sctp_dup_tsn_t;
320
321 typedef union {
322         sctp_gap_ack_block_t    gab;
323         sctp_dup_tsn_t          dup;
324 } sctp_sack_variable_t;
325
326 typedef struct sctp_sackhdr {
327         __u32 cum_tsn_ack;
328         __u32 a_rwnd;
329         __u16 num_gap_ack_blocks;
330         __u16 num_dup_tsns;
331         sctp_sack_variable_t variable[0];
332 } __attribute__((packed)) sctp_sackhdr_t;
333
334 typedef struct sctp_sack_chunk {
335         sctp_chunkhdr_t chunk_hdr;
336         sctp_sackhdr_t sack_hdr;
337 } __attribute__((packed)) sctp_sack_chunk_t;
338
339
340 /* RFC 2960.  Section 3.3.5 Heartbeat Request (HEARTBEAT) (4):
341  *
342  *  An endpoint should send this chunk to its peer endpoint to probe the
343  *  reachability of a particular destination transport address defined in
344  *  the present association.
345  */
346
347 typedef struct sctp_heartbeathdr {
348         sctp_paramhdr_t info;
349 } __attribute__((packed)) sctp_heartbeathdr_t;
350
351 typedef struct sctp_heartbeat_chunk {
352         sctp_chunkhdr_t chunk_hdr;
353         sctp_heartbeathdr_t hb_hdr;
354 } __attribute__((packed)) sctp_heartbeat_chunk_t;
355
356
357 /* For the abort and shutdown ACK we must carry the init tag in the
358  * common header. Just the common header is all that is needed with a
359  * chunk descriptor.
360  */
361 typedef struct sctp_abort_chunk {
362         sctp_chunkhdr_t uh;
363 } __attribute__((packed)) sctp_abort_chunkt_t;
364
365
366 /* For the graceful shutdown we must carry the tag (in common header)
367  * and the highest consecutive acking value.
368  */
369 typedef struct sctp_shutdownhdr {
370         __u32 cum_tsn_ack;
371 } __attribute__((packed)) sctp_shutdownhdr_t;
372
373 struct sctp_shutdown_chunk_t {
374         sctp_chunkhdr_t    chunk_hdr;
375         sctp_shutdownhdr_t shutdown_hdr;
376 } __attribute__ ((packed));
377
378 /* RFC 2960.  Section 3.3.10 Operation Error (ERROR) (9) */
379
380 typedef struct sctp_errhdr {
381         __u16 cause;
382         __u16 length;
383         __u8  variable[0];
384 } __attribute__((packed)) sctp_errhdr_t;
385
386 typedef struct sctp_operr_chunk {
387         sctp_chunkhdr_t chunk_hdr;
388         sctp_errhdr_t   err_hdr;
389 } __attribute__((packed)) sctp_operr_chunk_t;
390
391 /* RFC 2960 3.3.10 - Operation Error
392  *
393  * Cause Code: 16 bits (unsigned integer)
394  *
395  *     Defines the type of error conditions being reported.
396  *    Cause Code
397  *     Value           Cause Code
398  *     ---------      ----------------
399  *      1              Invalid Stream Identifier
400  *      2              Missing Mandatory Parameter
401  *      3              Stale Cookie Error
402  *      4              Out of Resource
403  *      5              Unresolvable Address
404  *      6              Unrecognized Chunk Type
405  *      7              Invalid Mandatory Parameter
406  *      8              Unrecognized Parameters
407  *      9              No User Data
408  *     10              Cookie Received While Shutting Down
409  */
410 typedef enum {
411
412         SCTP_ERROR_NO_ERROR        = __constant_htons(0x00),
413         SCTP_ERROR_INV_STRM        = __constant_htons(0x01),
414         SCTP_ERROR_MISS_PARAM      = __constant_htons(0x02),
415         SCTP_ERROR_STALE_COOKIE    = __constant_htons(0x03),
416         SCTP_ERROR_NO_RESOURCE     = __constant_htons(0x04),
417         SCTP_ERROR_DNS_FAILED      = __constant_htons(0x05),
418         SCTP_ERROR_UNKNOWN_CHUNK   = __constant_htons(0x06),
419         SCTP_ERROR_INV_PARAM       = __constant_htons(0x07),
420         SCTP_ERROR_UNKNOWN_PARAM   = __constant_htons(0x08),
421         SCTP_ERROR_NO_DATA         = __constant_htons(0x09),
422         SCTP_ERROR_COOKIE_IN_SHUTDOWN = __constant_htons(0x0a),
423
424
425         /* SCTP Implementation Guide:
426          *  11  Restart of an association with new addresses
427          *  12  User Initiated Abort
428          *  13  Protocol Violation
429          */
430
431         SCTP_ERROR_RESTART         = __constant_htons(0x0b),
432         SCTP_ERROR_USER_ABORT      = __constant_htons(0x0c),
433         SCTP_ERROR_PROTO_VIOLATION = __constant_htons(0x0d),
434
435         /* ADDIP Section 3.3  New Error Causes
436          *
437          * Four new Error Causes are added to the SCTP Operational Errors,
438          * primarily for use in the ASCONF-ACK chunk.
439          *
440          * Value          Cause Code
441          * ---------      ----------------
442          * 0x0100          Request to Delete Last Remaining IP Address.
443          * 0x0101          Operation Refused Due to Resource Shortage.
444          * 0x0102          Request to Delete Source IP Address.
445          * 0x0103          Association Aborted due to illegal ASCONF-ACK
446          * 0x0104          Request refused - no authorization.
447          */
448         SCTP_ERROR_DEL_LAST_IP  = __constant_htons(0x0100),
449         SCTP_ERROR_RSRC_LOW     = __constant_htons(0x0101),
450         SCTP_ERROR_DEL_SRC_IP   = __constant_htons(0x0102),
451         SCTP_ERROR_ASCONF_ACK   = __constant_htons(0x0103),
452         SCTP_ERROR_REQ_REFUSED  = __constant_htons(0x0104)
453 } sctp_error_t;
454
455
456
457 /* RFC 2960.  Appendix A.  Explicit Congestion Notification.
458  *   Explicit Congestion Notification Echo (ECNE) (12)
459  */
460 typedef struct sctp_ecnehdr {
461         __u32 lowest_tsn;
462 } sctp_ecnehdr_t;
463
464 typedef struct sctp_ecne_chunk {
465         sctp_chunkhdr_t chunk_hdr;
466         sctp_ecnehdr_t ence_hdr;
467 } __attribute__((packed)) sctp_ecne_chunk_t;
468
469 /* RFC 2960.  Appendix A.  Explicit Congestion Notification.
470  *   Congestion Window Reduced (CWR) (13)
471  */
472 typedef struct sctp_cwrhdr {
473         __u32 lowest_tsn;
474 } sctp_cwrhdr_t;
475
476 typedef struct sctp_cwr_chunk {
477         sctp_chunkhdr_t chunk_hdr;
478         sctp_cwrhdr_t cwr_hdr;
479 } __attribute__((packed)) sctp_cwr_chunk_t;
480
481 /* PR-SCTP
482  * 3.2 Forward Cumulative TSN Chunk Definition (FORWARD TSN)
483  *
484  * Forward Cumulative TSN chunk has the following format:
485  *
486  *        0                   1                   2                   3
487  *        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
488  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
489  *      |   Type = 192  |  Flags = 0x00 |        Length = Variable      |
490  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
491  *      |                      New Cumulative TSN                       |
492  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
493  *      |         Stream-1              |       Stream Sequence-1       |
494  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
495  *      \                                                               /
496  *      /                                                               \
497  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
498  *      |         Stream-N              |       Stream Sequence-N       |
499  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
500  *
501  *      Chunk Flags:
502  *
503  *        Set to all zeros on transmit and ignored on receipt.
504  *
505  *      New Cumulative TSN: 32 bit u_int
506  *
507  *       This indicates the new cumulative TSN to the data receiver. Upon
508  *       the reception of this value, the data receiver MUST consider
509  *       any missing TSNs earlier than or equal to this value as received
510  *       and stop reporting them as gaps in any subsequent SACKs.
511  *
512  *      Stream-N: 16 bit u_int
513  *
514  *       This field holds a stream number that was skipped by this
515  *       FWD-TSN.
516  *
517  *      Stream Sequence-N: 16 bit u_int
518  *       This field holds the sequence number associated with the stream
519  *       that was skipped. The stream sequence field holds the largest stream
520  *       sequence number in this stream being skipped.  The receiver of
521  *       the FWD-TSN's can use the Stream-N and Stream Sequence-N fields
522  *       to enable delivery of any stranded TSN's that remain on the stream
523  *       re-ordering queues. This field MUST NOT report TSN's corresponding
524  *       to DATA chunk that are marked as unordered. For ordered DATA
525  *       chunks this field MUST be filled in.
526  */
527 struct sctp_fwdtsn_skip {
528         __u16 stream;
529         __u16 ssn;
530 } __attribute__((packed));
531
532 struct sctp_fwdtsn_hdr {
533         __u32 new_cum_tsn;
534         struct sctp_fwdtsn_skip skip[0];
535 } __attribute((packed));
536
537 struct sctp_fwdtsn_chunk {
538         struct sctp_chunkhdr chunk_hdr;
539         struct sctp_fwdtsn_hdr fwdtsn_hdr;
540 } __attribute((packed));
541
542
543 /* ADDIP
544  * Section 3.1.1 Address Configuration Change Chunk (ASCONF)
545  *
546  *      Serial Number: 32 bits (unsigned integer)
547  *      This value represents a Serial Number for the ASCONF Chunk. The
548  *      valid range of Serial Number is from 0 to 2^32-1.
549  *      Serial Numbers wrap back to 0 after reaching 2^32 -1.
550  *
551  *      Address Parameter: 8 or 20 bytes (depending on type)
552  *      The address is an address of the sender of the ASCONF chunk,
553  *      the address MUST be considered part of the association by the
554  *      peer endpoint. This field may be used by the receiver of the 
555  *      ASCONF to help in finding the association. This parameter MUST
556  *      be present in every ASCONF message i.e. it is a mandatory TLV
557  *      parameter.
558  *
559  *      ASCONF Parameter: TLV format
560  *      Each Address configuration change is represented by a TLV
561  *      parameter as defined in Section 3.2. One or more requests may
562  *      be present in an ASCONF Chunk.
563  *
564  * Section 3.1.2 Address Configuration Acknowledgement Chunk (ASCONF-ACK)
565  * 
566  *      Serial Number: 32 bits (unsigned integer)
567  *      This value represents the Serial Number for the received ASCONF
568  *      Chunk that is acknowledged by this chunk. This value is copied
569  *      from the received ASCONF Chunk. 
570  *
571  *      ASCONF Parameter Response: TLV format
572  *      The ASCONF Parameter Response is used in the ASCONF-ACK to
573  *      report status of ASCONF processing.
574  */
575 typedef struct sctp_addip_param {
576         sctp_paramhdr_t param_hdr;
577         __u32           crr_id; 
578 } __attribute__((packed)) sctp_addip_param_t;
579
580 typedef struct sctp_addiphdr {
581         __u32   serial;
582         __u8    params[0];
583 } __attribute__((packed)) sctp_addiphdr_t;
584
585 typedef struct sctp_addip_chunk {
586         sctp_chunkhdr_t chunk_hdr;
587         sctp_addiphdr_t addip_hdr;
588 } __attribute__((packed)) sctp_addip_chunk_t;
589
590 #endif /* __LINUX_SCTP_H__ */