1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35#ifndef __LINUX_SCTP_H__
36#define __LINUX_SCTP_H__
37
38#include <linux/in.h>
39#include <linux/in6.h>
40#include <linux/skbuff.h>
41
42#include <uapi/linux/sctp.h>
43
44
45struct sctphdr {
46 __be16 source;
47 __be16 dest;
48 __be32 vtag;
49 __le32 checksum;
50};
51
52static inline struct sctphdr *sctp_hdr(const struct sk_buff *skb)
53{
54 return (struct sctphdr *)skb_transport_header(skb);
55}
56
57
58struct sctp_chunkhdr {
59 __u8 type;
60 __u8 flags;
61 __be16 length;
62};
63
64
65
66
67
68
69
70enum sctp_cid {
71 SCTP_CID_DATA = 0,
72 SCTP_CID_INIT = 1,
73 SCTP_CID_INIT_ACK = 2,
74 SCTP_CID_SACK = 3,
75 SCTP_CID_HEARTBEAT = 4,
76 SCTP_CID_HEARTBEAT_ACK = 5,
77 SCTP_CID_ABORT = 6,
78 SCTP_CID_SHUTDOWN = 7,
79 SCTP_CID_SHUTDOWN_ACK = 8,
80 SCTP_CID_ERROR = 9,
81 SCTP_CID_COOKIE_ECHO = 10,
82 SCTP_CID_COOKIE_ACK = 11,
83 SCTP_CID_ECN_ECNE = 12,
84 SCTP_CID_ECN_CWR = 13,
85 SCTP_CID_SHUTDOWN_COMPLETE = 14,
86
87
88 SCTP_CID_AUTH = 0x0F,
89
90
91 SCTP_CID_I_DATA = 0x40,
92
93
94 SCTP_CID_FWD_TSN = 0xC0,
95
96
97 SCTP_CID_ASCONF = 0xC1,
98 SCTP_CID_I_FWD_TSN = 0xC2,
99 SCTP_CID_ASCONF_ACK = 0x80,
100 SCTP_CID_RECONF = 0x82,
101};
102
103
104
105
106
107
108
109enum {
110 SCTP_CID_ACTION_DISCARD = 0x00,
111 SCTP_CID_ACTION_DISCARD_ERR = 0x40,
112 SCTP_CID_ACTION_SKIP = 0x80,
113 SCTP_CID_ACTION_SKIP_ERR = 0xc0,
114};
115
116enum { SCTP_CID_ACTION_MASK = 0xc0, };
117
118
119
120
121
122
123
124enum { SCTP_CHUNK_FLAG_T = 0x01 };
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148#define sctp_test_T_bit(c) ((c)->chunk_hdr->flags & SCTP_CHUNK_FLAG_T)
149
150
151
152
153
154struct sctp_paramhdr {
155 __be16 type;
156 __be16 length;
157};
158
159enum sctp_param {
160
161
162 SCTP_PARAM_HEARTBEAT_INFO = cpu_to_be16(1),
163
164 SCTP_PARAM_IPV4_ADDRESS = cpu_to_be16(5),
165 SCTP_PARAM_IPV6_ADDRESS = cpu_to_be16(6),
166 SCTP_PARAM_STATE_COOKIE = cpu_to_be16(7),
167 SCTP_PARAM_UNRECOGNIZED_PARAMETERS = cpu_to_be16(8),
168 SCTP_PARAM_COOKIE_PRESERVATIVE = cpu_to_be16(9),
169 SCTP_PARAM_HOST_NAME_ADDRESS = cpu_to_be16(11),
170 SCTP_PARAM_SUPPORTED_ADDRESS_TYPES = cpu_to_be16(12),
171 SCTP_PARAM_ECN_CAPABLE = cpu_to_be16(0x8000),
172
173
174 SCTP_PARAM_RANDOM = cpu_to_be16(0x8002),
175 SCTP_PARAM_CHUNKS = cpu_to_be16(0x8003),
176 SCTP_PARAM_HMAC_ALGO = cpu_to_be16(0x8004),
177
178
179 SCTP_PARAM_SUPPORTED_EXT = cpu_to_be16(0x8008),
180
181
182 SCTP_PARAM_FWD_TSN_SUPPORT = cpu_to_be16(0xc000),
183
184
185 SCTP_PARAM_ADD_IP = cpu_to_be16(0xc001),
186 SCTP_PARAM_DEL_IP = cpu_to_be16(0xc002),
187 SCTP_PARAM_ERR_CAUSE = cpu_to_be16(0xc003),
188 SCTP_PARAM_SET_PRIMARY = cpu_to_be16(0xc004),
189 SCTP_PARAM_SUCCESS_REPORT = cpu_to_be16(0xc005),
190 SCTP_PARAM_ADAPTATION_LAYER_IND = cpu_to_be16(0xc006),
191
192
193 SCTP_PARAM_RESET_OUT_REQUEST = cpu_to_be16(0x000d),
194 SCTP_PARAM_RESET_IN_REQUEST = cpu_to_be16(0x000e),
195 SCTP_PARAM_RESET_TSN_REQUEST = cpu_to_be16(0x000f),
196 SCTP_PARAM_RESET_RESPONSE = cpu_to_be16(0x0010),
197 SCTP_PARAM_RESET_ADD_OUT_STREAMS = cpu_to_be16(0x0011),
198 SCTP_PARAM_RESET_ADD_IN_STREAMS = cpu_to_be16(0x0012),
199};
200
201
202
203
204
205
206
207
208enum {
209 SCTP_PARAM_ACTION_DISCARD = cpu_to_be16(0x0000),
210 SCTP_PARAM_ACTION_DISCARD_ERR = cpu_to_be16(0x4000),
211 SCTP_PARAM_ACTION_SKIP = cpu_to_be16(0x8000),
212 SCTP_PARAM_ACTION_SKIP_ERR = cpu_to_be16(0xc000),
213};
214
215enum { SCTP_PARAM_ACTION_MASK = cpu_to_be16(0xc000), };
216
217
218
219struct sctp_datahdr {
220 __be32 tsn;
221 __be16 stream;
222 __be16 ssn;
223 __u32 ppid;
224 __u8 payload[];
225};
226
227struct sctp_data_chunk {
228 struct sctp_chunkhdr chunk_hdr;
229 struct sctp_datahdr data_hdr;
230};
231
232struct sctp_idatahdr {
233 __be32 tsn;
234 __be16 stream;
235 __be16 reserved;
236 __be32 mid;
237 union {
238 __u32 ppid;
239 __be32 fsn;
240 };
241 __u8 payload[0];
242};
243
244struct sctp_idata_chunk {
245 struct sctp_chunkhdr chunk_hdr;
246 struct sctp_idatahdr data_hdr;
247};
248
249
250enum {
251 SCTP_DATA_MIDDLE_FRAG = 0x00,
252 SCTP_DATA_LAST_FRAG = 0x01,
253 SCTP_DATA_FIRST_FRAG = 0x02,
254 SCTP_DATA_NOT_FRAG = 0x03,
255 SCTP_DATA_UNORDERED = 0x04,
256 SCTP_DATA_SACK_IMM = 0x08,
257};
258enum { SCTP_DATA_FRAG_MASK = 0x03, };
259
260
261
262
263
264
265
266struct sctp_inithdr {
267 __be32 init_tag;
268 __be32 a_rwnd;
269 __be16 num_outbound_streams;
270 __be16 num_inbound_streams;
271 __be32 initial_tsn;
272 __u8 params[];
273};
274
275struct sctp_init_chunk {
276 struct sctp_chunkhdr chunk_hdr;
277 struct sctp_inithdr init_hdr;
278};
279
280
281
282struct sctp_ipv4addr_param {
283 struct sctp_paramhdr param_hdr;
284 struct in_addr addr;
285};
286
287
288struct sctp_ipv6addr_param {
289 struct sctp_paramhdr param_hdr;
290 struct in6_addr addr;
291};
292
293
294struct sctp_cookie_preserve_param {
295 struct sctp_paramhdr param_hdr;
296 __be32 lifespan_increment;
297};
298
299
300struct sctp_hostname_param {
301 struct sctp_paramhdr param_hdr;
302 uint8_t hostname[];
303};
304
305
306struct sctp_supported_addrs_param {
307 struct sctp_paramhdr param_hdr;
308 __be16 types[];
309};
310
311
312struct sctp_adaptation_ind_param {
313 struct sctp_paramhdr param_hdr;
314 __be32 adaptation_ind;
315};
316
317
318struct sctp_supported_ext_param {
319 struct sctp_paramhdr param_hdr;
320 __u8 chunks[];
321};
322
323
324struct sctp_random_param {
325 struct sctp_paramhdr param_hdr;
326 __u8 random_val[];
327};
328
329
330struct sctp_chunks_param {
331 struct sctp_paramhdr param_hdr;
332 __u8 chunks[];
333};
334
335
336struct sctp_hmac_algo_param {
337 struct sctp_paramhdr param_hdr;
338 __be16 hmac_ids[];
339};
340
341
342
343
344
345struct sctp_initack_chunk {
346 struct sctp_chunkhdr chunk_hdr;
347 struct sctp_inithdr init_hdr;
348};
349
350
351struct sctp_cookie_param {
352 struct sctp_paramhdr p;
353 __u8 body[];
354};
355
356
357struct sctp_unrecognized_param {
358 struct sctp_paramhdr param_hdr;
359 struct sctp_paramhdr unrecognized;
360};
361
362
363
364
365
366
367
368
369
370
371
372struct sctp_gap_ack_block {
373 __be16 start;
374 __be16 end;
375};
376
377union sctp_sack_variable {
378 struct sctp_gap_ack_block gab;
379 __be32 dup;
380};
381
382struct sctp_sackhdr {
383 __be32 cum_tsn_ack;
384 __be32 a_rwnd;
385 __be16 num_gap_ack_blocks;
386 __be16 num_dup_tsns;
387 union sctp_sack_variable variable[];
388};
389
390struct sctp_sack_chunk {
391 struct sctp_chunkhdr chunk_hdr;
392 struct sctp_sackhdr sack_hdr;
393};
394
395
396
397
398
399
400
401
402
403struct sctp_heartbeathdr {
404 struct sctp_paramhdr info;
405};
406
407struct sctp_heartbeat_chunk {
408 struct sctp_chunkhdr chunk_hdr;
409 struct sctp_heartbeathdr hb_hdr;
410};
411
412
413
414
415
416
417struct sctp_abort_chunk {
418 struct sctp_chunkhdr uh;
419};
420
421
422
423
424
425struct sctp_shutdownhdr {
426 __be32 cum_tsn_ack;
427};
428
429struct sctp_shutdown_chunk {
430 struct sctp_chunkhdr chunk_hdr;
431 struct sctp_shutdownhdr shutdown_hdr;
432};
433
434
435
436struct sctp_errhdr {
437 __be16 cause;
438 __be16 length;
439 __u8 variable[];
440};
441
442struct sctp_operr_chunk {
443 struct sctp_chunkhdr chunk_hdr;
444 struct sctp_errhdr err_hdr;
445};
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466enum sctp_error {
467
468 SCTP_ERROR_NO_ERROR = cpu_to_be16(0x00),
469 SCTP_ERROR_INV_STRM = cpu_to_be16(0x01),
470 SCTP_ERROR_MISS_PARAM = cpu_to_be16(0x02),
471 SCTP_ERROR_STALE_COOKIE = cpu_to_be16(0x03),
472 SCTP_ERROR_NO_RESOURCE = cpu_to_be16(0x04),
473 SCTP_ERROR_DNS_FAILED = cpu_to_be16(0x05),
474 SCTP_ERROR_UNKNOWN_CHUNK = cpu_to_be16(0x06),
475 SCTP_ERROR_INV_PARAM = cpu_to_be16(0x07),
476 SCTP_ERROR_UNKNOWN_PARAM = cpu_to_be16(0x08),
477 SCTP_ERROR_NO_DATA = cpu_to_be16(0x09),
478 SCTP_ERROR_COOKIE_IN_SHUTDOWN = cpu_to_be16(0x0a),
479
480
481
482
483
484
485
486
487
488 SCTP_ERROR_RESTART = cpu_to_be16(0x0b),
489 SCTP_ERROR_USER_ABORT = cpu_to_be16(0x0c),
490 SCTP_ERROR_PROTO_VIOLATION = cpu_to_be16(0x0d),
491 SCTP_ERROR_NEW_ENCAP_PORT = cpu_to_be16(0x0e),
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506 SCTP_ERROR_DEL_LAST_IP = cpu_to_be16(0x00A0),
507 SCTP_ERROR_RSRC_LOW = cpu_to_be16(0x00A1),
508 SCTP_ERROR_DEL_SRC_IP = cpu_to_be16(0x00A2),
509 SCTP_ERROR_ASCONF_ACK = cpu_to_be16(0x00A3),
510 SCTP_ERROR_REQ_REFUSED = cpu_to_be16(0x00A4),
511
512
513
514
515
516
517
518
519
520
521
522 SCTP_ERROR_UNSUP_HMAC = cpu_to_be16(0x0105)
523};
524
525
526
527
528
529
530struct sctp_ecnehdr {
531 __be32 lowest_tsn;
532};
533
534struct sctp_ecne_chunk {
535 struct sctp_chunkhdr chunk_hdr;
536 struct sctp_ecnehdr ence_hdr;
537};
538
539
540
541
542struct sctp_cwrhdr {
543 __be32 lowest_tsn;
544};
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592struct sctp_fwdtsn_skip {
593 __be16 stream;
594 __be16 ssn;
595};
596
597struct sctp_fwdtsn_hdr {
598 __be32 new_cum_tsn;
599 struct sctp_fwdtsn_skip skip[];
600};
601
602struct sctp_fwdtsn_chunk {
603 struct sctp_chunkhdr chunk_hdr;
604 struct sctp_fwdtsn_hdr fwdtsn_hdr;
605};
606
607struct sctp_ifwdtsn_skip {
608 __be16 stream;
609 __u8 reserved;
610 __u8 flags;
611 __be32 mid;
612};
613
614struct sctp_ifwdtsn_hdr {
615 __be32 new_cum_tsn;
616 struct sctp_ifwdtsn_skip skip[];
617};
618
619struct sctp_ifwdtsn_chunk {
620 struct sctp_chunkhdr chunk_hdr;
621 struct sctp_ifwdtsn_hdr fwdtsn_hdr;
622};
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656struct sctp_addip_param {
657 struct sctp_paramhdr param_hdr;
658 __be32 crr_id;
659};
660
661struct sctp_addiphdr {
662 __be32 serial;
663 __u8 params[];
664};
665
666struct sctp_addip_chunk {
667 struct sctp_chunkhdr chunk_hdr;
668 struct sctp_addiphdr addip_hdr;
669};
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720struct sctp_authhdr {
721 __be16 shkey_id;
722 __be16 hmac_id;
723 __u8 hmac[];
724};
725
726struct sctp_auth_chunk {
727 struct sctp_chunkhdr chunk_hdr;
728 struct sctp_authhdr auth_hdr;
729};
730
731struct sctp_infox {
732 struct sctp_info *sctpinfo;
733 struct sctp_association *asoc;
734};
735
736struct sctp_reconf_chunk {
737 struct sctp_chunkhdr chunk_hdr;
738 __u8 params[];
739};
740
741struct sctp_strreset_outreq {
742 struct sctp_paramhdr param_hdr;
743 __be32 request_seq;
744 __be32 response_seq;
745 __be32 send_reset_at_tsn;
746 __be16 list_of_streams[];
747};
748
749struct sctp_strreset_inreq {
750 struct sctp_paramhdr param_hdr;
751 __be32 request_seq;
752 __be16 list_of_streams[];
753};
754
755struct sctp_strreset_tsnreq {
756 struct sctp_paramhdr param_hdr;
757 __be32 request_seq;
758};
759
760struct sctp_strreset_addstrm {
761 struct sctp_paramhdr param_hdr;
762 __be32 request_seq;
763 __be16 number_of_streams;
764 __be16 reserved;
765};
766
767enum {
768 SCTP_STRRESET_NOTHING_TO_DO = 0x00,
769 SCTP_STRRESET_PERFORMED = 0x01,
770 SCTP_STRRESET_DENIED = 0x02,
771 SCTP_STRRESET_ERR_WRONG_SSN = 0x03,
772 SCTP_STRRESET_ERR_IN_PROGRESS = 0x04,
773 SCTP_STRRESET_ERR_BAD_SEQNO = 0x05,
774 SCTP_STRRESET_IN_PROGRESS = 0x06,
775};
776
777struct sctp_strreset_resp {
778 struct sctp_paramhdr param_hdr;
779 __be32 response_seq;
780 __be32 result;
781};
782
783struct sctp_strreset_resptsn {
784 struct sctp_paramhdr param_hdr;
785 __be32 response_seq;
786 __be32 result;
787 __be32 senders_next_tsn;
788 __be32 receivers_next_tsn;
789};
790
791enum {
792 SCTP_DSCP_SET_MASK = 0x1,
793 SCTP_DSCP_VAL_MASK = 0xfc,
794 SCTP_FLOWLABEL_SET_MASK = 0x100000,
795 SCTP_FLOWLABEL_VAL_MASK = 0xfffff
796};
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811struct sctp_new_encap_port_hdr {
812 __be16 cur_port;
813 __be16 new_port;
814};
815
816#endif
817