Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
sctp.h
Go to the documentation of this file.
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  * This SCTP 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  * This SCTP 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 <[email protected]>
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 <[email protected]>
39  * Karl Knutson <[email protected]>
40  * Jon Grimm <[email protected]>
41  * Xingang Guo <[email protected]>
45  * Sridhar Samudrala <[email protected]>
46  * Kevin Gao <[email protected]>
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 {
65 
66 #ifdef __KERNEL__
67 #include <linux/skbuff.h>
68 
69 static inline struct sctphdr *sctp_hdr(const struct sk_buff *skb)
70 {
71  return (struct sctphdr *)skb_transport_header(skb);
72 }
73 #endif
74 
75 /* Section 3.2. Chunk Field Descriptions. */
76 typedef struct sctp_chunkhdr {
81 
82 
83 /* Section 3.2. Chunk Type Values.
84  * [Chunk Type] identifies the type of information contained in the Chunk
85  * Value field. It takes a value from 0 to 254. The value of 255 is
86  * reserved for future use as an extension field.
87  */
88 typedef enum {
104 
105  /* AUTH Extension Section 4.1 */
107 
108  /* PR-SCTP Sec 3.2 */
110 
111  /* Use hex, as defined in ADDIP sec. 3.1 */
114 } sctp_cid_t; /* enum */
115 
116 
117 /* Section 3.2
118  * Chunk Types are encoded such that the highest-order two bits specify
119  * the action that must be taken if the processing endpoint does not
120  * recognize the Chunk Type.
121  */
122 typedef enum {
128 
129 enum { SCTP_CID_ACTION_MASK = 0xc0, };
130 
131 /* This flag is used in Chunk Flags for ABORT and SHUTDOWN COMPLETE.
132  *
133  * 3.3.7 Abort Association (ABORT) (6):
134  * The T bit is set to 0 if the sender had a TCB that it destroyed.
135  * If the sender did not have a TCB it should set this bit to 1.
136  */
137 enum { SCTP_CHUNK_FLAG_T = 0x01 };
138 
139 /*
140  * Set the T bit
141  *
142  * 0 1 2 3
143  * 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
144  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
145  * | Type = 14 |Reserved |T| Length = 4 |
146  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
147  *
148  * Chunk Flags: 8 bits
149  *
150  * Reserved: 7 bits
151  * Set to 0 on transmit and ignored on receipt.
152  *
153  * T bit: 1 bit
154  * The T bit is set to 0 if the sender had a TCB that it destroyed. If
155  * the sender did NOT have a TCB it should set this bit to 1.
156  *
157  * Note: Special rules apply to this chunk for verification, please
158  * see Section 8.5.1 for details.
159  */
160 
161 #define sctp_test_T_bit(c) ((c)->chunk_hdr->flags & SCTP_CHUNK_FLAG_T)
162 
163 /* RFC 2960
164  * Section 3.2.1 Optional/Variable-length Parmaeter Format.
165  */
166 
167 typedef struct sctp_paramhdr {
171 
172 typedef enum {
173 
174  /* RFC 2960 Section 3.3.5 */
176  /* RFC 2960 Section 3.3.2.1 */
185 
186  /* AUTH Extension Section 3 */
190 
191  /* Add-IP: Supported Extensions, Section 4.2 */
193 
194  /* PR-SCTP Sec 3.1 */
196 
197  /* Add-IP Extension. Section 3.2 */
204 
205 } sctp_param_t; /* enum */
206 
207 
208 /* RFC 2960 Section 3.2.1
209  * The Parameter Types are encoded such that the highest-order two bits
210  * specify the action that must be taken if the processing endpoint does
211  * not recognize the Parameter Type.
212  *
213  */
214 typedef enum {
220 
222 
223 /* RFC 2960 Section 3.3.1 Payload Data (DATA) (0) */
224 
225 typedef struct sctp_datahdr {
232 
233 typedef struct sctp_data_chunk {
234  sctp_chunkhdr_t chunk_hdr;
235  sctp_datahdr_t data_hdr;
237 
238 /* DATA Chuck Specific Flags */
239 enum {
246 };
247 enum { SCTP_DATA_FRAG_MASK = 0x03, };
248 
249 
250 /* RFC 2960 Section 3.3.2 Initiation (INIT) (1)
251  *
252  * This chunk is used to initiate a SCTP association between two
253  * endpoints.
254  */
255 typedef struct sctp_inithdr {
263 
264 typedef struct sctp_init_chunk {
265  sctp_chunkhdr_t chunk_hdr;
266  sctp_inithdr_t init_hdr;
268 
269 
270 /* Section 3.3.2.1. IPv4 Address Parameter (5) */
271 typedef struct sctp_ipv4addr_param {
272  sctp_paramhdr_t param_hdr;
273  struct in_addr addr;
275 
276 /* Section 3.3.2.1. IPv6 Address Parameter (6) */
277 typedef struct sctp_ipv6addr_param {
278  sctp_paramhdr_t param_hdr;
279  struct in6_addr addr;
281 
282 /* Section 3.3.2.1 Cookie Preservative (9) */
284  sctp_paramhdr_t param_hdr;
287 
288 /* Section 3.3.2.1 Host Name Address (11) */
289 typedef struct sctp_hostname_param {
290  sctp_paramhdr_t param_hdr;
293 
294 /* Section 3.3.2.1 Supported Address Types (12) */
296  sctp_paramhdr_t param_hdr;
299 
300 /* Appendix A. ECN Capable (32768) */
301 typedef struct sctp_ecn_capable_param {
302  sctp_paramhdr_t param_hdr;
304 
305 /* ADDIP Section 3.2.6 Adaptation Layer Indication */
310 
311 /* ADDIP Section 4.2.7 Supported Extensions Parameter */
312 typedef struct sctp_supported_ext_param {
316 
317 /* AUTH Section 3.1 Random */
318 typedef struct sctp_random_param {
319  sctp_paramhdr_t param_hdr;
322 
323 /* AUTH Section 3.2 Chunk List */
324 typedef struct sctp_chunks_param {
325  sctp_paramhdr_t param_hdr;
328 
329 /* AUTH Section 3.3 HMAC Algorithm */
330 typedef struct sctp_hmac_algo_param {
331  sctp_paramhdr_t param_hdr;
334 
335 /* RFC 2960. Section 3.3.3 Initiation Acknowledgement (INIT ACK) (2):
336  * The INIT ACK chunk is used to acknowledge the initiation of an SCTP
337  * association.
338  */
339 typedef sctp_init_chunk_t sctp_initack_chunk_t;
340 
341 /* Section 3.3.3.1 State Cookie (7) */
342 typedef struct sctp_cookie_param {
343  sctp_paramhdr_t p;
344  __u8 body[0];
346 
347 /* Section 3.3.3.1 Unrecognized Parameters (8) */
348 typedef struct sctp_unrecognized_param {
349  sctp_paramhdr_t param_hdr;
350  sctp_paramhdr_t unrecognized;
352 
353 
354 
355 /*
356  * 3.3.4 Selective Acknowledgement (SACK) (3):
357  *
358  * This chunk is sent to the peer endpoint to acknowledge received DATA
359  * chunks and to inform the peer endpoint of gaps in the received
360  * subsequences of DATA chunks as represented by their TSNs.
361  */
362 
363 typedef struct sctp_gap_ack_block {
367 
369 
370 typedef union {
371  sctp_gap_ack_block_t gab;
374 
375 typedef struct sctp_sackhdr {
382 
383 typedef struct sctp_sack_chunk {
384  sctp_chunkhdr_t chunk_hdr;
385  sctp_sackhdr_t sack_hdr;
387 
388 
389 /* RFC 2960. Section 3.3.5 Heartbeat Request (HEARTBEAT) (4):
390  *
391  * An endpoint should send this chunk to its peer endpoint to probe the
392  * reachability of a particular destination transport address defined in
393  * the present association.
394  */
395 
396 typedef struct sctp_heartbeathdr {
397  sctp_paramhdr_t info;
399 
400 typedef struct sctp_heartbeat_chunk {
401  sctp_chunkhdr_t chunk_hdr;
402  sctp_heartbeathdr_t hb_hdr;
404 
405 
406 /* For the abort and shutdown ACK we must carry the init tag in the
407  * common header. Just the common header is all that is needed with a
408  * chunk descriptor.
409  */
410 typedef struct sctp_abort_chunk {
411  sctp_chunkhdr_t uh;
413 
414 
415 /* For the graceful shutdown we must carry the tag (in common header)
416  * and the highest consecutive acking value.
417  */
418 typedef struct sctp_shutdownhdr {
421 
423  sctp_chunkhdr_t chunk_hdr;
424  sctp_shutdownhdr_t shutdown_hdr;
425 } __packed;
426 
427 /* RFC 2960. Section 3.3.10 Operation Error (ERROR) (9) */
428 
429 typedef struct sctp_errhdr {
434 
435 typedef struct sctp_operr_chunk {
436  sctp_chunkhdr_t chunk_hdr;
437  sctp_errhdr_t err_hdr;
439 
440 /* RFC 2960 3.3.10 - Operation Error
441  *
442  * Cause Code: 16 bits (unsigned integer)
443  *
444  * Defines the type of error conditions being reported.
445  * Cause Code
446  * Value Cause Code
447  * --------- ----------------
448  * 1 Invalid Stream Identifier
449  * 2 Missing Mandatory Parameter
450  * 3 Stale Cookie Error
451  * 4 Out of Resource
452  * 5 Unresolvable Address
453  * 6 Unrecognized Chunk Type
454  * 7 Invalid Mandatory Parameter
455  * 8 Unrecognized Parameters
456  * 9 No User Data
457  * 10 Cookie Received While Shutting Down
458  */
459 typedef enum {
460 
472 
473 
474  /* SCTP Implementation Guide:
475  * 11 Restart of an association with new addresses
476  * 12 User Initiated Abort
477  * 13 Protocol Violation
478  */
479 
483 
484  /* ADDIP Section 3.3 New Error Causes
485  *
486  * Four new Error Causes are added to the SCTP Operational Errors,
487  * primarily for use in the ASCONF-ACK chunk.
488  *
489  * Value Cause Code
490  * --------- ----------------
491  * 0x00A0 Request to Delete Last Remaining IP Address.
492  * 0x00A1 Operation Refused Due to Resource Shortage.
493  * 0x00A2 Request to Delete Source IP Address.
494  * 0x00A3 Association Aborted due to illegal ASCONF-ACK
495  * 0x00A4 Request refused - no authorization.
496  */
502 
503  /* AUTH Section 4. New Error Cause
504  *
505  * This section defines a new error cause that will be sent if an AUTH
506  * chunk is received with an unsupported HMAC identifier.
507  * illustrates the new error cause.
508  *
509  * Cause Code Error Cause Name
510  * --------------------------------------------------------------
511  * 0x0105 Unsupported HMAC Identifier
512  */
514 } sctp_error_t;
515 
516 
517 
518 /* RFC 2960. Appendix A. Explicit Congestion Notification.
519  * Explicit Congestion Notification Echo (ECNE) (12)
520  */
521 typedef struct sctp_ecnehdr {
524 
525 typedef struct sctp_ecne_chunk {
526  sctp_chunkhdr_t chunk_hdr;
529 
530 /* RFC 2960. Appendix A. Explicit Congestion Notification.
531  * Congestion Window Reduced (CWR) (13)
532  */
533 typedef struct sctp_cwrhdr {
535 } sctp_cwrhdr_t;
536 
537 typedef struct sctp_cwr_chunk {
538  sctp_chunkhdr_t chunk_hdr;
541 
542 /* PR-SCTP
543  * 3.2 Forward Cumulative TSN Chunk Definition (FORWARD TSN)
544  *
545  * Forward Cumulative TSN chunk has the following format:
546  *
547  * 0 1 2 3
548  * 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
549  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
550  * | Type = 192 | Flags = 0x00 | Length = Variable |
551  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
552  * | New Cumulative TSN |
553  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
554  * | Stream-1 | Stream Sequence-1 |
555  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
556  * \ /
557  * / \
558  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
559  * | Stream-N | Stream Sequence-N |
560  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
561  *
562  * Chunk Flags:
563  *
564  * Set to all zeros on transmit and ignored on receipt.
565  *
566  * New Cumulative TSN: 32 bit u_int
567  *
568  * This indicates the new cumulative TSN to the data receiver. Upon
569  * the reception of this value, the data receiver MUST consider
570  * any missing TSNs earlier than or equal to this value as received
571  * and stop reporting them as gaps in any subsequent SACKs.
572  *
573  * Stream-N: 16 bit u_int
574  *
575  * This field holds a stream number that was skipped by this
576  * FWD-TSN.
577  *
578  * Stream Sequence-N: 16 bit u_int
579  * This field holds the sequence number associated with the stream
580  * that was skipped. The stream sequence field holds the largest stream
581  * sequence number in this stream being skipped. The receiver of
582  * the FWD-TSN's can use the Stream-N and Stream Sequence-N fields
583  * to enable delivery of any stranded TSN's that remain on the stream
584  * re-ordering queues. This field MUST NOT report TSN's corresponding
585  * to DATA chunk that are marked as unordered. For ordered DATA
586  * chunks this field MUST be filled in.
587  */
591 } __packed;
592 
596 } __packed;
597 
601 } __packed;
602 
603 
604 /* ADDIP
605  * Section 3.1.1 Address Configuration Change Chunk (ASCONF)
606  *
607  * Serial Number: 32 bits (unsigned integer)
608  * This value represents a Serial Number for the ASCONF Chunk. The
609  * valid range of Serial Number is from 0 to 2^32-1.
610  * Serial Numbers wrap back to 0 after reaching 2^32 -1.
611  *
612  * Address Parameter: 8 or 20 bytes (depending on type)
613  * The address is an address of the sender of the ASCONF chunk,
614  * the address MUST be considered part of the association by the
615  * peer endpoint. This field may be used by the receiver of the
616  * ASCONF to help in finding the association. This parameter MUST
617  * be present in every ASCONF message i.e. it is a mandatory TLV
618  * parameter.
619  *
620  * ASCONF Parameter: TLV format
621  * Each Address configuration change is represented by a TLV
622  * parameter as defined in Section 3.2. One or more requests may
623  * be present in an ASCONF Chunk.
624  *
625  * Section 3.1.2 Address Configuration Acknowledgement Chunk (ASCONF-ACK)
626  *
627  * Serial Number: 32 bits (unsigned integer)
628  * This value represents the Serial Number for the received ASCONF
629  * Chunk that is acknowledged by this chunk. This value is copied
630  * from the received ASCONF Chunk.
631  *
632  * ASCONF Parameter Response: TLV format
633  * The ASCONF Parameter Response is used in the ASCONF-ACK to
634  * report status of ASCONF processing.
635  */
636 typedef struct sctp_addip_param {
637  sctp_paramhdr_t param_hdr;
640 
641 typedef struct sctp_addiphdr {
645 
646 typedef struct sctp_addip_chunk {
647  sctp_chunkhdr_t chunk_hdr;
648  sctp_addiphdr_t addip_hdr;
650 
651 /* AUTH
652  * Section 4.1 Authentication Chunk (AUTH)
653  *
654  * This chunk is used to hold the result of the HMAC calculation.
655  *
656  * 0 1 2 3
657  * 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
658  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
659  * | Type = 0x0F | Flags=0 | Length |
660  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
661  * | Shared Key Identifier | HMAC Identifier |
662  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
663  * | |
664  * \ HMAC /
665  * / \
666  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
667  *
668  * Type: 1 byte (unsigned integer)
669  * This value MUST be set to 0x0F for all AUTH-chunks.
670  *
671  * Flags: 1 byte (unsigned integer)
672  * Set to zero on transmit and ignored on receipt.
673  *
674  * Length: 2 bytes (unsigned integer)
675  * This value holds the length of the HMAC in bytes plus 8.
676  *
677  * Shared Key Identifier: 2 bytes (unsigned integer)
678  * This value describes which endpoint pair shared key is used.
679  *
680  * HMAC Identifier: 2 bytes (unsigned integer)
681  * This value describes which message digest is being used. Table 2
682  * shows the currently defined values.
683  *
684  * The following Table 2 shows the currently defined values for HMAC
685  * identifiers.
686  *
687  * +-----------------+--------------------------+
688  * | HMAC Identifier | Message Digest Algorithm |
689  * +-----------------+--------------------------+
690  * | 0 | Reserved |
691  * | 1 | SHA-1 defined in [8] |
692  * | 2 | Reserved |
693  * | 3 | SHA-256 defined in [8] |
694  * +-----------------+--------------------------+
695  *
696  *
697  * HMAC: n bytes (unsigned integer) This hold the result of the HMAC
698  * calculation.
699  */
700 typedef struct sctp_authhdr {
703  __u8 hmac[0];
705 
706 typedef struct sctp_auth_chunk {
707  sctp_chunkhdr_t chunk_hdr;
708  sctp_authhdr_t auth_hdr;
710 
711 #endif /* __LINUX_SCTP_H__ */