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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
54
55#include <linux/types.h>
56#include <linux/kernel.h>
57#include <linux/ip.h>
58#include <linux/ipv6.h>
59#include <linux/net.h>
60#include <linux/inet.h>
61#include <linux/scatterlist.h>
62#include <linux/crypto.h>
63#include <linux/slab.h>
64#include <net/sock.h>
65
66#include <linux/skbuff.h>
67#include <linux/random.h>
68#include <net/sctp/sctp.h>
69#include <net/sctp/sm.h>
70
71SCTP_STATIC
72struct sctp_chunk *sctp_make_chunk(const struct sctp_association *asoc,
73 __u8 type, __u8 flags, int paylen);
74static sctp_cookie_param_t *sctp_pack_cookie(const struct sctp_endpoint *ep,
75 const struct sctp_association *asoc,
76 const struct sctp_chunk *init_chunk,
77 int *cookie_len,
78 const __u8 *raw_addrs, int addrs_len);
79static int sctp_process_param(struct sctp_association *asoc,
80 union sctp_params param,
81 const union sctp_addr *peer_addr,
82 gfp_t gfp);
83static void *sctp_addto_param(struct sctp_chunk *chunk, int len,
84 const void *data);
85
86
87int sctp_chunk_iif(const struct sctp_chunk *chunk)
88{
89 struct sctp_af *af;
90 int iif = 0;
91
92 af = sctp_get_af_specific(ipver2af(ip_hdr(chunk->skb)->version));
93 if (af)
94 iif = af->skb_iif(chunk->skb);
95
96 return iif;
97}
98
99
100
101
102
103
104static const struct sctp_paramhdr ecap_param = {
105 SCTP_PARAM_ECN_CAPABLE,
106 cpu_to_be16(sizeof(struct sctp_paramhdr)),
107};
108static const struct sctp_paramhdr prsctp_param = {
109 SCTP_PARAM_FWD_TSN_SUPPORT,
110 cpu_to_be16(sizeof(struct sctp_paramhdr)),
111};
112
113
114
115
116
117void sctp_init_cause(struct sctp_chunk *chunk, __be16 cause_code,
118 size_t paylen)
119{
120 sctp_errhdr_t err;
121 __u16 len;
122
123
124 err.cause = cause_code;
125 len = sizeof(sctp_errhdr_t) + paylen;
126 err.length = htons(len);
127 chunk->subh.err_hdr = sctp_addto_chunk(chunk, sizeof(sctp_errhdr_t), &err);
128}
129
130
131
132
133
134
135int sctp_init_cause_fixed(struct sctp_chunk *chunk, __be16 cause_code,
136 size_t paylen)
137{
138 sctp_errhdr_t err;
139 __u16 len;
140
141
142 err.cause = cause_code;
143 len = sizeof(sctp_errhdr_t) + paylen;
144 err.length = htons(len);
145
146 if (skb_tailroom(chunk->skb) < len)
147 return -ENOSPC;
148 chunk->subh.err_hdr = sctp_addto_chunk_fixed(chunk,
149 sizeof(sctp_errhdr_t),
150 &err);
151 return 0;
152}
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197struct sctp_chunk *sctp_make_init(const struct sctp_association *asoc,
198 const struct sctp_bind_addr *bp,
199 gfp_t gfp, int vparam_len)
200{
201 sctp_inithdr_t init;
202 union sctp_params addrs;
203 size_t chunksize;
204 struct sctp_chunk *retval = NULL;
205 int num_types, addrs_len = 0;
206 struct sctp_sock *sp;
207 sctp_supported_addrs_param_t sat;
208 __be16 types[2];
209 sctp_adaptation_ind_param_t aiparam;
210 sctp_supported_ext_param_t ext_param;
211 int num_ext = 0;
212 __u8 extensions[3];
213 sctp_paramhdr_t *auth_chunks = NULL,
214 *auth_hmacs = NULL;
215
216
217
218
219
220
221 retval = NULL;
222
223
224 addrs = sctp_bind_addrs_to_raw(bp, &addrs_len, gfp);
225
226 init.init_tag = htonl(asoc->c.my_vtag);
227 init.a_rwnd = htonl(asoc->rwnd);
228 init.num_outbound_streams = htons(asoc->c.sinit_num_ostreams);
229 init.num_inbound_streams = htons(asoc->c.sinit_max_instreams);
230 init.initial_tsn = htonl(asoc->c.initial_tsn);
231
232
233 sp = sctp_sk(asoc->base.sk);
234 num_types = sp->pf->supported_addrs(sp, types);
235
236 chunksize = sizeof(init) + addrs_len;
237 chunksize += WORD_ROUND(SCTP_SAT_LEN(num_types));
238 chunksize += sizeof(ecap_param);
239
240 if (sctp_prsctp_enable)
241 chunksize += sizeof(prsctp_param);
242
243
244
245
246
247
248 if (sctp_addip_enable) {
249 extensions[num_ext] = SCTP_CID_ASCONF;
250 extensions[num_ext+1] = SCTP_CID_ASCONF_ACK;
251 num_ext += 2;
252 }
253
254 if (sp->adaptation_ind)
255 chunksize += sizeof(aiparam);
256
257 chunksize += vparam_len;
258
259
260 if (sctp_auth_enable) {
261
262 chunksize += sizeof(asoc->c.auth_random);
263
264
265 auth_hmacs = (sctp_paramhdr_t *)asoc->c.auth_hmacs;
266 if (auth_hmacs->length)
267 chunksize += WORD_ROUND(ntohs(auth_hmacs->length));
268 else
269 auth_hmacs = NULL;
270
271
272 auth_chunks = (sctp_paramhdr_t *)asoc->c.auth_chunks;
273 if (auth_chunks->length)
274 chunksize += WORD_ROUND(ntohs(auth_chunks->length));
275 else
276 auth_chunks = NULL;
277
278 extensions[num_ext] = SCTP_CID_AUTH;
279 num_ext += 1;
280 }
281
282
283 if (num_ext)
284 chunksize += WORD_ROUND(sizeof(sctp_supported_ext_param_t) +
285 num_ext);
286
287
288
289
290
291
292
293
294
295
296
297
298
299 retval = sctp_make_chunk(asoc, SCTP_CID_INIT, 0, chunksize);
300 if (!retval)
301 goto nodata;
302
303 retval->subh.init_hdr =
304 sctp_addto_chunk(retval, sizeof(init), &init);
305 retval->param_hdr.v =
306 sctp_addto_chunk(retval, addrs_len, addrs.v);
307
308
309
310
311
312
313
314
315 sat.param_hdr.type = SCTP_PARAM_SUPPORTED_ADDRESS_TYPES;
316 sat.param_hdr.length = htons(SCTP_SAT_LEN(num_types));
317 sctp_addto_chunk(retval, sizeof(sat), &sat);
318 sctp_addto_chunk(retval, num_types * sizeof(__u16), &types);
319
320 sctp_addto_chunk(retval, sizeof(ecap_param), &ecap_param);
321
322
323
324
325 if (num_ext) {
326 ext_param.param_hdr.type = SCTP_PARAM_SUPPORTED_EXT;
327 ext_param.param_hdr.length =
328 htons(sizeof(sctp_supported_ext_param_t) + num_ext);
329 sctp_addto_chunk(retval, sizeof(sctp_supported_ext_param_t),
330 &ext_param);
331 sctp_addto_param(retval, num_ext, extensions);
332 }
333
334 if (sctp_prsctp_enable)
335 sctp_addto_chunk(retval, sizeof(prsctp_param), &prsctp_param);
336
337 if (sp->adaptation_ind) {
338 aiparam.param_hdr.type = SCTP_PARAM_ADAPTATION_LAYER_IND;
339 aiparam.param_hdr.length = htons(sizeof(aiparam));
340 aiparam.adaptation_ind = htonl(sp->adaptation_ind);
341 sctp_addto_chunk(retval, sizeof(aiparam), &aiparam);
342 }
343
344
345 if (sctp_auth_enable) {
346 sctp_addto_chunk(retval, sizeof(asoc->c.auth_random),
347 asoc->c.auth_random);
348 if (auth_hmacs)
349 sctp_addto_chunk(retval, ntohs(auth_hmacs->length),
350 auth_hmacs);
351 if (auth_chunks)
352 sctp_addto_chunk(retval, ntohs(auth_chunks->length),
353 auth_chunks);
354 }
355nodata:
356 kfree(addrs.v);
357 return retval;
358}
359
360struct sctp_chunk *sctp_make_init_ack(const struct sctp_association *asoc,
361 const struct sctp_chunk *chunk,
362 gfp_t gfp, int unkparam_len)
363{
364 sctp_inithdr_t initack;
365 struct sctp_chunk *retval;
366 union sctp_params addrs;
367 struct sctp_sock *sp;
368 int addrs_len;
369 sctp_cookie_param_t *cookie;
370 int cookie_len;
371 size_t chunksize;
372 sctp_adaptation_ind_param_t aiparam;
373 sctp_supported_ext_param_t ext_param;
374 int num_ext = 0;
375 __u8 extensions[3];
376 sctp_paramhdr_t *auth_chunks = NULL,
377 *auth_hmacs = NULL,
378 *auth_random = NULL;
379
380 retval = NULL;
381
382
383 addrs = sctp_bind_addrs_to_raw(&asoc->base.bind_addr, &addrs_len, gfp);
384
385 initack.init_tag = htonl(asoc->c.my_vtag);
386 initack.a_rwnd = htonl(asoc->rwnd);
387 initack.num_outbound_streams = htons(asoc->c.sinit_num_ostreams);
388 initack.num_inbound_streams = htons(asoc->c.sinit_max_instreams);
389 initack.initial_tsn = htonl(asoc->c.initial_tsn);
390
391
392
393
394 cookie = sctp_pack_cookie(asoc->ep, asoc, chunk, &cookie_len,
395 addrs.v, addrs_len);
396 if (!cookie)
397 goto nomem_cookie;
398
399
400
401
402 sp = sctp_sk(asoc->base.sk);
403 chunksize = sizeof(initack) + addrs_len + cookie_len + unkparam_len;
404
405
406 if (asoc->peer.ecn_capable)
407 chunksize += sizeof(ecap_param);
408
409 if (asoc->peer.prsctp_capable)
410 chunksize += sizeof(prsctp_param);
411
412 if (asoc->peer.asconf_capable) {
413 extensions[num_ext] = SCTP_CID_ASCONF;
414 extensions[num_ext+1] = SCTP_CID_ASCONF_ACK;
415 num_ext += 2;
416 }
417
418 if (sp->adaptation_ind)
419 chunksize += sizeof(aiparam);
420
421 if (asoc->peer.auth_capable) {
422 auth_random = (sctp_paramhdr_t *)asoc->c.auth_random;
423 chunksize += ntohs(auth_random->length);
424
425 auth_hmacs = (sctp_paramhdr_t *)asoc->c.auth_hmacs;
426 if (auth_hmacs->length)
427 chunksize += WORD_ROUND(ntohs(auth_hmacs->length));
428 else
429 auth_hmacs = NULL;
430
431 auth_chunks = (sctp_paramhdr_t *)asoc->c.auth_chunks;
432 if (auth_chunks->length)
433 chunksize += WORD_ROUND(ntohs(auth_chunks->length));
434 else
435 auth_chunks = NULL;
436
437 extensions[num_ext] = SCTP_CID_AUTH;
438 num_ext += 1;
439 }
440
441 if (num_ext)
442 chunksize += WORD_ROUND(sizeof(sctp_supported_ext_param_t) +
443 num_ext);
444
445
446 retval = sctp_make_chunk(asoc, SCTP_CID_INIT_ACK, 0, chunksize);
447 if (!retval)
448 goto nomem_chunk;
449
450
451
452
453
454
455
456
457
458
459 retval->transport = chunk->transport;
460
461 retval->subh.init_hdr =
462 sctp_addto_chunk(retval, sizeof(initack), &initack);
463 retval->param_hdr.v = sctp_addto_chunk(retval, addrs_len, addrs.v);
464 sctp_addto_chunk(retval, cookie_len, cookie);
465 if (asoc->peer.ecn_capable)
466 sctp_addto_chunk(retval, sizeof(ecap_param), &ecap_param);
467 if (num_ext) {
468 ext_param.param_hdr.type = SCTP_PARAM_SUPPORTED_EXT;
469 ext_param.param_hdr.length =
470 htons(sizeof(sctp_supported_ext_param_t) + num_ext);
471 sctp_addto_chunk(retval, sizeof(sctp_supported_ext_param_t),
472 &ext_param);
473 sctp_addto_param(retval, num_ext, extensions);
474 }
475 if (asoc->peer.prsctp_capable)
476 sctp_addto_chunk(retval, sizeof(prsctp_param), &prsctp_param);
477
478 if (sp->adaptation_ind) {
479 aiparam.param_hdr.type = SCTP_PARAM_ADAPTATION_LAYER_IND;
480 aiparam.param_hdr.length = htons(sizeof(aiparam));
481 aiparam.adaptation_ind = htonl(sp->adaptation_ind);
482 sctp_addto_chunk(retval, sizeof(aiparam), &aiparam);
483 }
484
485 if (asoc->peer.auth_capable) {
486 sctp_addto_chunk(retval, ntohs(auth_random->length),
487 auth_random);
488 if (auth_hmacs)
489 sctp_addto_chunk(retval, ntohs(auth_hmacs->length),
490 auth_hmacs);
491 if (auth_chunks)
492 sctp_addto_chunk(retval, ntohs(auth_chunks->length),
493 auth_chunks);
494 }
495
496
497 retval->asoc = (struct sctp_association *) asoc;
498
499nomem_chunk:
500 kfree(cookie);
501nomem_cookie:
502 kfree(addrs.v);
503 return retval;
504}
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540struct sctp_chunk *sctp_make_cookie_echo(const struct sctp_association *asoc,
541 const struct sctp_chunk *chunk)
542{
543 struct sctp_chunk *retval;
544 void *cookie;
545 int cookie_len;
546
547 cookie = asoc->peer.cookie;
548 cookie_len = asoc->peer.cookie_len;
549
550
551 retval = sctp_make_chunk(asoc, SCTP_CID_COOKIE_ECHO, 0, cookie_len);
552 if (!retval)
553 goto nodata;
554 retval->subh.cookie_hdr =
555 sctp_addto_chunk(retval, cookie_len, cookie);
556
557
558
559
560
561
562
563
564
565
566 if (chunk)
567 retval->transport = chunk->transport;
568
569nodata:
570 return retval;
571}
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591struct sctp_chunk *sctp_make_cookie_ack(const struct sctp_association *asoc,
592 const struct sctp_chunk *chunk)
593{
594 struct sctp_chunk *retval;
595
596 retval = sctp_make_chunk(asoc, SCTP_CID_COOKIE_ACK, 0, 0);
597
598
599
600
601
602
603
604
605
606
607 if (retval && chunk)
608 retval->transport = chunk->transport;
609
610 return retval;
611}
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636struct sctp_chunk *sctp_make_cwr(const struct sctp_association *asoc,
637 const __u32 lowest_tsn,
638 const struct sctp_chunk *chunk)
639{
640 struct sctp_chunk *retval;
641 sctp_cwrhdr_t cwr;
642
643 cwr.lowest_tsn = htonl(lowest_tsn);
644 retval = sctp_make_chunk(asoc, SCTP_CID_ECN_CWR, 0,
645 sizeof(sctp_cwrhdr_t));
646
647 if (!retval)
648 goto nodata;
649
650 retval->subh.ecn_cwr_hdr =
651 sctp_addto_chunk(retval, sizeof(cwr), &cwr);
652
653
654
655
656
657
658
659
660
661
662
663 if (chunk)
664 retval->transport = chunk->transport;
665
666nodata:
667 return retval;
668}
669
670
671struct sctp_chunk *sctp_make_ecne(const struct sctp_association *asoc,
672 const __u32 lowest_tsn)
673{
674 struct sctp_chunk *retval;
675 sctp_ecnehdr_t ecne;
676
677 ecne.lowest_tsn = htonl(lowest_tsn);
678 retval = sctp_make_chunk(asoc, SCTP_CID_ECN_ECNE, 0,
679 sizeof(sctp_ecnehdr_t));
680 if (!retval)
681 goto nodata;
682 retval->subh.ecne_hdr =
683 sctp_addto_chunk(retval, sizeof(ecne), &ecne);
684
685nodata:
686 return retval;
687}
688
689
690
691
692struct sctp_chunk *sctp_make_datafrag_empty(struct sctp_association *asoc,
693 const struct sctp_sndrcvinfo *sinfo,
694 int data_len, __u8 flags, __u16 ssn)
695{
696 struct sctp_chunk *retval;
697 struct sctp_datahdr dp;
698 int chunk_len;
699
700
701
702
703 dp.tsn = 0;
704 dp.stream = htons(sinfo->sinfo_stream);
705 dp.ppid = sinfo->sinfo_ppid;
706
707
708 if (sinfo->sinfo_flags & SCTP_UNORDERED) {
709 flags |= SCTP_DATA_UNORDERED;
710 dp.ssn = 0;
711 } else
712 dp.ssn = htons(ssn);
713
714 chunk_len = sizeof(dp) + data_len;
715 retval = sctp_make_chunk(asoc, SCTP_CID_DATA, flags, chunk_len);
716 if (!retval)
717 goto nodata;
718
719 retval->subh.data_hdr = sctp_addto_chunk(retval, sizeof(dp), &dp);
720 memcpy(&retval->sinfo, sinfo, sizeof(struct sctp_sndrcvinfo));
721
722nodata:
723 return retval;
724}
725
726
727
728
729
730struct sctp_chunk *sctp_make_sack(const struct sctp_association *asoc)
731{
732 struct sctp_chunk *retval;
733 struct sctp_sackhdr sack;
734 int len;
735 __u32 ctsn;
736 __u16 num_gabs, num_dup_tsns;
737 struct sctp_association *aptr = (struct sctp_association *)asoc;
738 struct sctp_tsnmap *map = (struct sctp_tsnmap *)&asoc->peer.tsn_map;
739 struct sctp_gap_ack_block gabs[SCTP_MAX_GABS];
740 struct sctp_transport *trans;
741
742 memset(gabs, 0, sizeof(gabs));
743 ctsn = sctp_tsnmap_get_ctsn(map);
744 SCTP_DEBUG_PRINTK("sackCTSNAck sent: 0x%x.\n", ctsn);
745
746
747 num_gabs = sctp_tsnmap_num_gabs(map, gabs);
748 num_dup_tsns = sctp_tsnmap_num_dups(map);
749
750
751 sack.cum_tsn_ack = htonl(ctsn);
752 sack.a_rwnd = htonl(asoc->a_rwnd);
753 sack.num_gap_ack_blocks = htons(num_gabs);
754 sack.num_dup_tsns = htons(num_dup_tsns);
755
756 len = sizeof(sack)
757 + sizeof(struct sctp_gap_ack_block) * num_gabs
758 + sizeof(__u32) * num_dup_tsns;
759
760
761 retval = sctp_make_chunk(asoc, SCTP_CID_SACK, 0, len);
762 if (!retval)
763 goto nodata;
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795 retval->transport = asoc->peer.last_data_from;
796
797 retval->subh.sack_hdr =
798 sctp_addto_chunk(retval, sizeof(sack), &sack);
799
800
801 if (num_gabs)
802 sctp_addto_chunk(retval, sizeof(__u32) * num_gabs,
803 gabs);
804
805
806 if (num_dup_tsns)
807 sctp_addto_chunk(retval, sizeof(__u32) * num_dup_tsns,
808 sctp_tsnmap_get_dups(map));
809
810
811
812
813
814
815
816
817
818 if (++aptr->peer.sack_generation == 0) {
819 list_for_each_entry(trans, &asoc->peer.transport_addr_list,
820 transports)
821 trans->sack_generation = 0;
822 aptr->peer.sack_generation = 1;
823 }
824nodata:
825 return retval;
826}
827
828
829struct sctp_chunk *sctp_make_shutdown(const struct sctp_association *asoc,
830 const struct sctp_chunk *chunk)
831{
832 struct sctp_chunk *retval;
833 sctp_shutdownhdr_t shut;
834 __u32 ctsn;
835
836 ctsn = sctp_tsnmap_get_ctsn(&asoc->peer.tsn_map);
837 shut.cum_tsn_ack = htonl(ctsn);
838
839 retval = sctp_make_chunk(asoc, SCTP_CID_SHUTDOWN, 0,
840 sizeof(sctp_shutdownhdr_t));
841 if (!retval)
842 goto nodata;
843
844 retval->subh.shutdown_hdr =
845 sctp_addto_chunk(retval, sizeof(shut), &shut);
846
847 if (chunk)
848 retval->transport = chunk->transport;
849nodata:
850 return retval;
851}
852
853struct sctp_chunk *sctp_make_shutdown_ack(const struct sctp_association *asoc,
854 const struct sctp_chunk *chunk)
855{
856 struct sctp_chunk *retval;
857
858 retval = sctp_make_chunk(asoc, SCTP_CID_SHUTDOWN_ACK, 0, 0);
859
860
861
862
863
864
865
866
867
868
869 if (retval && chunk)
870 retval->transport = chunk->transport;
871
872 return retval;
873}
874
875struct sctp_chunk *sctp_make_shutdown_complete(
876 const struct sctp_association *asoc,
877 const struct sctp_chunk *chunk)
878{
879 struct sctp_chunk *retval;
880 __u8 flags = 0;
881
882
883
884
885 flags |= asoc ? 0 : SCTP_CHUNK_FLAG_T;
886
887 retval = sctp_make_chunk(asoc, SCTP_CID_SHUTDOWN_COMPLETE, flags, 0);
888
889
890
891
892
893
894
895
896
897
898
899 if (retval && chunk)
900 retval->transport = chunk->transport;
901
902 return retval;
903}
904
905
906
907
908struct sctp_chunk *sctp_make_abort(const struct sctp_association *asoc,
909 const struct sctp_chunk *chunk,
910 const size_t hint)
911{
912 struct sctp_chunk *retval;
913 __u8 flags = 0;
914
915
916
917
918 if (!asoc) {
919 if (chunk && chunk->chunk_hdr &&
920 chunk->chunk_hdr->type == SCTP_CID_INIT)
921 flags = 0;
922 else
923 flags = SCTP_CHUNK_FLAG_T;
924 }
925
926 retval = sctp_make_chunk(asoc, SCTP_CID_ABORT, flags, hint);
927
928
929
930
931
932
933
934
935
936
937 if (retval && chunk)
938 retval->transport = chunk->transport;
939
940 return retval;
941}
942
943
944struct sctp_chunk *sctp_make_abort_no_data(
945 const struct sctp_association *asoc,
946 const struct sctp_chunk *chunk, __u32 tsn)
947{
948 struct sctp_chunk *retval;
949 __be32 payload;
950
951 retval = sctp_make_abort(asoc, chunk, sizeof(sctp_errhdr_t)
952 + sizeof(tsn));
953
954 if (!retval)
955 goto no_mem;
956
957
958 payload = htonl(tsn);
959 sctp_init_cause(retval, SCTP_ERROR_NO_DATA, sizeof(payload));
960 sctp_addto_chunk(retval, sizeof(payload), (const void *)&payload);
961
962
963
964
965
966
967
968
969
970
971 if (chunk)
972 retval->transport = chunk->transport;
973
974no_mem:
975 return retval;
976}
977
978
979struct sctp_chunk *sctp_make_abort_user(const struct sctp_association *asoc,
980 const struct msghdr *msg,
981 size_t paylen)
982{
983 struct sctp_chunk *retval;
984 void *payload = NULL;
985 int err;
986
987 retval = sctp_make_abort(asoc, NULL, sizeof(sctp_errhdr_t) + paylen);
988 if (!retval)
989 goto err_chunk;
990
991 if (paylen) {
992
993 payload = kmalloc(paylen, GFP_KERNEL);
994 if (!payload)
995 goto err_payload;
996
997 err = memcpy_fromiovec(payload, msg->msg_iov, paylen);
998 if (err < 0)
999 goto err_copy;
1000 }
1001
1002 sctp_init_cause(retval, SCTP_ERROR_USER_ABORT, paylen);
1003 sctp_addto_chunk(retval, paylen, payload);
1004
1005 if (paylen)
1006 kfree(payload);
1007
1008 return retval;
1009
1010err_copy:
1011 kfree(payload);
1012err_payload:
1013 sctp_chunk_free(retval);
1014 retval = NULL;
1015err_chunk:
1016 return retval;
1017}
1018
1019
1020
1021
1022static void *sctp_addto_param(struct sctp_chunk *chunk, int len,
1023 const void *data)
1024{
1025 void *target;
1026 int chunklen = ntohs(chunk->chunk_hdr->length);
1027
1028 target = skb_put(chunk->skb, len);
1029
1030 if (data)
1031 memcpy(target, data, len);
1032 else
1033 memset(target, 0, len);
1034
1035
1036 chunk->chunk_hdr->length = htons(chunklen + len);
1037 chunk->chunk_end = skb_tail_pointer(chunk->skb);
1038
1039 return target;
1040}
1041
1042
1043struct sctp_chunk *sctp_make_abort_violation(
1044 const struct sctp_association *asoc,
1045 const struct sctp_chunk *chunk,
1046 const __u8 *payload,
1047 const size_t paylen)
1048{
1049 struct sctp_chunk *retval;
1050 struct sctp_paramhdr phdr;
1051
1052 retval = sctp_make_abort(asoc, chunk, sizeof(sctp_errhdr_t) + paylen
1053 + sizeof(sctp_paramhdr_t));
1054 if (!retval)
1055 goto end;
1056
1057 sctp_init_cause(retval, SCTP_ERROR_PROTO_VIOLATION, paylen
1058 + sizeof(sctp_paramhdr_t));
1059
1060 phdr.type = htons(chunk->chunk_hdr->type);
1061 phdr.length = chunk->chunk_hdr->length;
1062 sctp_addto_chunk(retval, paylen, payload);
1063 sctp_addto_param(retval, sizeof(sctp_paramhdr_t), &phdr);
1064
1065end:
1066 return retval;
1067}
1068
1069struct sctp_chunk *sctp_make_violation_paramlen(
1070 const struct sctp_association *asoc,
1071 const struct sctp_chunk *chunk,
1072 struct sctp_paramhdr *param)
1073{
1074 struct sctp_chunk *retval;
1075 static const char error[] = "The following parameter had invalid length:";
1076 size_t payload_len = sizeof(error) + sizeof(sctp_errhdr_t) +
1077 sizeof(sctp_paramhdr_t);
1078
1079 retval = sctp_make_abort(asoc, chunk, payload_len);
1080 if (!retval)
1081 goto nodata;
1082
1083 sctp_init_cause(retval, SCTP_ERROR_PROTO_VIOLATION,
1084 sizeof(error) + sizeof(sctp_paramhdr_t));
1085 sctp_addto_chunk(retval, sizeof(error), error);
1086 sctp_addto_param(retval, sizeof(sctp_paramhdr_t), param);
1087
1088nodata:
1089 return retval;
1090}
1091
1092
1093struct sctp_chunk *sctp_make_heartbeat(const struct sctp_association *asoc,
1094 const struct sctp_transport *transport)
1095{
1096 struct sctp_chunk *retval;
1097 sctp_sender_hb_info_t hbinfo;
1098
1099 retval = sctp_make_chunk(asoc, SCTP_CID_HEARTBEAT, 0, sizeof(hbinfo));
1100
1101 if (!retval)
1102 goto nodata;
1103
1104 hbinfo.param_hdr.type = SCTP_PARAM_HEARTBEAT_INFO;
1105 hbinfo.param_hdr.length = htons(sizeof(sctp_sender_hb_info_t));
1106 hbinfo.daddr = transport->ipaddr;
1107 hbinfo.sent_at = jiffies;
1108 hbinfo.hb_nonce = transport->hb_nonce;
1109
1110
1111
1112
1113 retval->transport = (struct sctp_transport *) transport;
1114 retval->subh.hbs_hdr = sctp_addto_chunk(retval, sizeof(hbinfo),
1115 &hbinfo);
1116
1117nodata:
1118 return retval;
1119}
1120
1121struct sctp_chunk *sctp_make_heartbeat_ack(const struct sctp_association *asoc,
1122 const struct sctp_chunk *chunk,
1123 const void *payload, const size_t paylen)
1124{
1125 struct sctp_chunk *retval;
1126
1127 retval = sctp_make_chunk(asoc, SCTP_CID_HEARTBEAT_ACK, 0, paylen);
1128 if (!retval)
1129 goto nodata;
1130
1131 retval->subh.hbs_hdr = sctp_addto_chunk(retval, paylen, payload);
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142 if (chunk)
1143 retval->transport = chunk->transport;
1144
1145nodata:
1146 return retval;
1147}
1148
1149
1150
1151
1152static struct sctp_chunk *sctp_make_op_error_space(
1153 const struct sctp_association *asoc,
1154 const struct sctp_chunk *chunk,
1155 size_t size)
1156{
1157 struct sctp_chunk *retval;
1158
1159 retval = sctp_make_chunk(asoc, SCTP_CID_ERROR, 0,
1160 sizeof(sctp_errhdr_t) + size);
1161 if (!retval)
1162 goto nodata;
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172 if (chunk)
1173 retval->transport = chunk->transport;
1174
1175nodata:
1176 return retval;
1177}
1178
1179
1180
1181
1182
1183
1184
1185static inline struct sctp_chunk *sctp_make_op_error_fixed(
1186 const struct sctp_association *asoc,
1187 const struct sctp_chunk *chunk)
1188{
1189 size_t size = asoc ? asoc->pathmtu : 0;
1190
1191 if (!size)
1192 size = SCTP_DEFAULT_MAXSEGMENT;
1193
1194 return sctp_make_op_error_space(asoc, chunk, size);
1195}
1196
1197
1198struct sctp_chunk *sctp_make_op_error(const struct sctp_association *asoc,
1199 const struct sctp_chunk *chunk,
1200 __be16 cause_code, const void *payload,
1201 size_t paylen, size_t reserve_tail)
1202{
1203 struct sctp_chunk *retval;
1204
1205 retval = sctp_make_op_error_space(asoc, chunk, paylen + reserve_tail);
1206 if (!retval)
1207 goto nodata;
1208
1209 sctp_init_cause(retval, cause_code, paylen + reserve_tail);
1210 sctp_addto_chunk(retval, paylen, payload);
1211 if (reserve_tail)
1212 sctp_addto_param(retval, reserve_tail, NULL);
1213
1214nodata:
1215 return retval;
1216}
1217
1218struct sctp_chunk *sctp_make_auth(const struct sctp_association *asoc)
1219{
1220 struct sctp_chunk *retval;
1221 struct sctp_hmac *hmac_desc;
1222 struct sctp_authhdr auth_hdr;
1223 __u8 *hmac;
1224
1225
1226 hmac_desc = sctp_auth_asoc_get_hmac(asoc);
1227 if (unlikely(!hmac_desc))
1228 return NULL;
1229
1230 retval = sctp_make_chunk(asoc, SCTP_CID_AUTH, 0,
1231 hmac_desc->hmac_len + sizeof(sctp_authhdr_t));
1232 if (!retval)
1233 return NULL;
1234
1235 auth_hdr.hmac_id = htons(hmac_desc->hmac_id);
1236 auth_hdr.shkey_id = htons(asoc->active_key_id);
1237
1238 retval->subh.auth_hdr = sctp_addto_chunk(retval, sizeof(sctp_authhdr_t),
1239 &auth_hdr);
1240
1241 hmac = skb_put(retval->skb, hmac_desc->hmac_len);
1242 memset(hmac, 0, hmac_desc->hmac_len);
1243
1244
1245 retval->chunk_hdr->length =
1246 htons(ntohs(retval->chunk_hdr->length) + hmac_desc->hmac_len);
1247 retval->chunk_end = skb_tail_pointer(retval->skb);
1248
1249 return retval;
1250}
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260struct sctp_chunk *sctp_chunkify(struct sk_buff *skb,
1261 const struct sctp_association *asoc,
1262 struct sock *sk)
1263{
1264 struct sctp_chunk *retval;
1265
1266 retval = kmem_cache_zalloc(sctp_chunk_cachep, GFP_ATOMIC);
1267
1268 if (!retval)
1269 goto nodata;
1270
1271 if (!sk) {
1272 SCTP_DEBUG_PRINTK("chunkifying skb %p w/o an sk\n", skb);
1273 }
1274
1275 INIT_LIST_HEAD(&retval->list);
1276 retval->skb = skb;
1277 retval->asoc = (struct sctp_association *)asoc;
1278 retval->has_tsn = 0;
1279 retval->has_ssn = 0;
1280 retval->rtt_in_progress = 0;
1281 retval->sent_at = 0;
1282 retval->singleton = 1;
1283 retval->end_of_packet = 0;
1284 retval->ecn_ce_done = 0;
1285 retval->pdiscard = 0;
1286
1287
1288
1289
1290
1291
1292
1293 retval->tsn_missing_report = 0;
1294 retval->tsn_gap_acked = 0;
1295 retval->fast_retransmit = SCTP_CAN_FRTX;
1296
1297
1298
1299
1300 retval->msg = NULL;
1301
1302
1303 INIT_LIST_HEAD(&retval->transmitted_list);
1304 INIT_LIST_HEAD(&retval->frag_list);
1305 SCTP_DBG_OBJCNT_INC(chunk);
1306 atomic_set(&retval->refcnt, 1);
1307
1308nodata:
1309 return retval;
1310}
1311
1312
1313void sctp_init_addrs(struct sctp_chunk *chunk, union sctp_addr *src,
1314 union sctp_addr *dest)
1315{
1316 memcpy(&chunk->source, src, sizeof(union sctp_addr));
1317 memcpy(&chunk->dest, dest, sizeof(union sctp_addr));
1318}
1319
1320
1321const union sctp_addr *sctp_source(const struct sctp_chunk *chunk)
1322{
1323
1324 if (chunk->transport) {
1325 return &chunk->transport->ipaddr;
1326 } else {
1327
1328 return &chunk->source;
1329 }
1330}
1331
1332
1333
1334
1335SCTP_STATIC
1336struct sctp_chunk *sctp_make_chunk(const struct sctp_association *asoc,
1337 __u8 type, __u8 flags, int paylen)
1338{
1339 struct sctp_chunk *retval;
1340 sctp_chunkhdr_t *chunk_hdr;
1341 struct sk_buff *skb;
1342 struct sock *sk;
1343
1344
1345 skb = alloc_skb(WORD_ROUND(sizeof(sctp_chunkhdr_t) + paylen),
1346 GFP_ATOMIC);
1347 if (!skb)
1348 goto nodata;
1349
1350
1351 chunk_hdr = (sctp_chunkhdr_t *)skb_put(skb, sizeof(sctp_chunkhdr_t));
1352 chunk_hdr->type = type;
1353 chunk_hdr->flags = flags;
1354 chunk_hdr->length = htons(sizeof(sctp_chunkhdr_t));
1355
1356 sk = asoc ? asoc->base.sk : NULL;
1357 retval = sctp_chunkify(skb, asoc, sk);
1358 if (!retval) {
1359 kfree_skb(skb);
1360 goto nodata;
1361 }
1362
1363 retval->chunk_hdr = chunk_hdr;
1364 retval->chunk_end = ((__u8 *)chunk_hdr) + sizeof(struct sctp_chunkhdr);
1365
1366
1367 if (sctp_auth_send_cid(type, asoc))
1368 retval->auth = 1;
1369
1370
1371 skb->sk = sk;
1372
1373 return retval;
1374nodata:
1375 return NULL;
1376}
1377
1378
1379
1380static void sctp_chunk_destroy(struct sctp_chunk *chunk)
1381{
1382 BUG_ON(!list_empty(&chunk->list));
1383 list_del_init(&chunk->transmitted_list);
1384
1385
1386 dev_kfree_skb(chunk->skb);
1387
1388 SCTP_DBG_OBJCNT_DEC(chunk);
1389 kmem_cache_free(sctp_chunk_cachep, chunk);
1390}
1391
1392
1393void sctp_chunk_free(struct sctp_chunk *chunk)
1394{
1395
1396 if (chunk->msg)
1397 sctp_datamsg_put(chunk->msg);
1398
1399 sctp_chunk_put(chunk);
1400}
1401
1402
1403void sctp_chunk_hold(struct sctp_chunk *ch)
1404{
1405 atomic_inc(&ch->refcnt);
1406}
1407
1408
1409void sctp_chunk_put(struct sctp_chunk *ch)
1410{
1411 if (atomic_dec_and_test(&ch->refcnt))
1412 sctp_chunk_destroy(ch);
1413}
1414
1415
1416
1417
1418void *sctp_addto_chunk(struct sctp_chunk *chunk, int len, const void *data)
1419{
1420 void *target;
1421 void *padding;
1422 int chunklen = ntohs(chunk->chunk_hdr->length);
1423 int padlen = WORD_ROUND(chunklen) - chunklen;
1424
1425 padding = skb_put(chunk->skb, padlen);
1426 target = skb_put(chunk->skb, len);
1427
1428 memset(padding, 0, padlen);
1429 memcpy(target, data, len);
1430
1431
1432 chunk->chunk_hdr->length = htons(chunklen + padlen + len);
1433 chunk->chunk_end = skb_tail_pointer(chunk->skb);
1434
1435 return target;
1436}
1437
1438
1439
1440
1441void *sctp_addto_chunk_fixed(struct sctp_chunk *chunk,
1442 int len, const void *data)
1443{
1444 if (skb_tailroom(chunk->skb) >= len)
1445 return sctp_addto_chunk(chunk, len, data);
1446 else
1447 return NULL;
1448}
1449
1450
1451
1452
1453
1454int sctp_user_addto_chunk(struct sctp_chunk *chunk, int off, int len,
1455 struct iovec *data)
1456{
1457 __u8 *target;
1458 int err = 0;
1459
1460
1461 target = skb_put(chunk->skb, len);
1462
1463
1464 if ((err = memcpy_fromiovecend(target, data, off, len)))
1465 goto out;
1466
1467
1468 chunk->chunk_hdr->length =
1469 htons(ntohs(chunk->chunk_hdr->length) + len);
1470 chunk->chunk_end = skb_tail_pointer(chunk->skb);
1471
1472out:
1473 return err;
1474}
1475
1476
1477
1478
1479void sctp_chunk_assign_ssn(struct sctp_chunk *chunk)
1480{
1481 struct sctp_datamsg *msg;
1482 struct sctp_chunk *lchunk;
1483 struct sctp_stream *stream;
1484 __u16 ssn;
1485 __u16 sid;
1486
1487 if (chunk->has_ssn)
1488 return;
1489
1490
1491 sid = ntohs(chunk->subh.data_hdr->stream);
1492 stream = &chunk->asoc->ssnmap->out;
1493
1494
1495
1496
1497 msg = chunk->msg;
1498 list_for_each_entry(lchunk, &msg->chunks, frag_list) {
1499 if (lchunk->chunk_hdr->flags & SCTP_DATA_UNORDERED) {
1500 ssn = 0;
1501 } else {
1502 if (lchunk->chunk_hdr->flags & SCTP_DATA_LAST_FRAG)
1503 ssn = sctp_ssn_next(stream, sid);
1504 else
1505 ssn = sctp_ssn_peek(stream, sid);
1506 }
1507
1508 lchunk->subh.data_hdr->ssn = htons(ssn);
1509 lchunk->has_ssn = 1;
1510 }
1511}
1512
1513
1514
1515
1516void sctp_chunk_assign_tsn(struct sctp_chunk *chunk)
1517{
1518 if (!chunk->has_tsn) {
1519
1520
1521
1522 chunk->subh.data_hdr->tsn =
1523 htonl(sctp_association_get_next_tsn(chunk->asoc));
1524 chunk->has_tsn = 1;
1525 }
1526}
1527
1528
1529struct sctp_association *sctp_make_temp_asoc(const struct sctp_endpoint *ep,
1530 struct sctp_chunk *chunk,
1531 gfp_t gfp)
1532{
1533 struct sctp_association *asoc;
1534 struct sk_buff *skb;
1535 sctp_scope_t scope;
1536 struct sctp_af *af;
1537
1538
1539 scope = sctp_scope(sctp_source(chunk));
1540 asoc = sctp_association_new(ep, ep->base.sk, scope, gfp);
1541 if (!asoc)
1542 goto nodata;
1543 asoc->temp = 1;
1544 skb = chunk->skb;
1545
1546 af = sctp_get_af_specific(ipver2af(ip_hdr(skb)->version));
1547 if (unlikely(!af))
1548 goto fail;
1549 af->from_skb(&asoc->c.peer_addr, skb, 1);
1550nodata:
1551 return asoc;
1552
1553fail:
1554 sctp_association_free(asoc);
1555 return NULL;
1556}
1557
1558
1559
1560
1561static sctp_cookie_param_t *sctp_pack_cookie(const struct sctp_endpoint *ep,
1562 const struct sctp_association *asoc,
1563 const struct sctp_chunk *init_chunk,
1564 int *cookie_len,
1565 const __u8 *raw_addrs, int addrs_len)
1566{
1567 sctp_cookie_param_t *retval;
1568 struct sctp_signed_cookie *cookie;
1569 struct scatterlist sg;
1570 int headersize, bodysize;
1571 unsigned int keylen;
1572 char *key;
1573
1574
1575
1576
1577 headersize = sizeof(sctp_paramhdr_t) +
1578 (sizeof(struct sctp_signed_cookie) -
1579 sizeof(struct sctp_cookie));
1580 bodysize = sizeof(struct sctp_cookie)
1581 + ntohs(init_chunk->chunk_hdr->length) + addrs_len;
1582
1583
1584
1585
1586 if (bodysize % SCTP_COOKIE_MULTIPLE)
1587 bodysize += SCTP_COOKIE_MULTIPLE
1588 - (bodysize % SCTP_COOKIE_MULTIPLE);
1589 *cookie_len = headersize + bodysize;
1590
1591
1592
1593
1594 retval = kzalloc(*cookie_len, GFP_ATOMIC);
1595 if (!retval)
1596 goto nodata;
1597
1598 cookie = (struct sctp_signed_cookie *) retval->body;
1599
1600
1601 retval->p.type = SCTP_PARAM_STATE_COOKIE;
1602 retval->p.length = htons(*cookie_len);
1603
1604
1605 cookie->c = asoc->c;
1606
1607 cookie->c.raw_addr_list_len = addrs_len;
1608
1609
1610 cookie->c.prsctp_capable = asoc->peer.prsctp_capable;
1611
1612
1613 cookie->c.adaptation_ind = asoc->peer.adaptation_ind;
1614
1615
1616 do_gettimeofday(&cookie->c.expiration);
1617 TIMEVAL_ADD(asoc->cookie_life, cookie->c.expiration);
1618
1619
1620 memcpy(&cookie->c.peer_init[0], init_chunk->chunk_hdr,
1621 ntohs(init_chunk->chunk_hdr->length));
1622
1623
1624 memcpy((__u8 *)&cookie->c.peer_init[0] +
1625 ntohs(init_chunk->chunk_hdr->length), raw_addrs, addrs_len);
1626
1627 if (sctp_sk(ep->base.sk)->hmac) {
1628 struct hash_desc desc;
1629
1630
1631 sg_init_one(&sg, &cookie->c, bodysize);
1632 keylen = SCTP_SECRET_SIZE;
1633 key = (char *)ep->secret_key[ep->current_key];
1634 desc.tfm = sctp_sk(ep->base.sk)->hmac;
1635 desc.flags = 0;
1636
1637 if (crypto_hash_setkey(desc.tfm, key, keylen) ||
1638 crypto_hash_digest(&desc, &sg, bodysize, cookie->signature))
1639 goto free_cookie;
1640 }
1641
1642 return retval;
1643
1644free_cookie:
1645 kfree(retval);
1646nodata:
1647 *cookie_len = 0;
1648 return NULL;
1649}
1650
1651
1652struct sctp_association *sctp_unpack_cookie(
1653 const struct sctp_endpoint *ep,
1654 const struct sctp_association *asoc,
1655 struct sctp_chunk *chunk, gfp_t gfp,
1656 int *error, struct sctp_chunk **errp)
1657{
1658 struct sctp_association *retval = NULL;
1659 struct sctp_signed_cookie *cookie;
1660 struct sctp_cookie *bear_cookie;
1661 int headersize, bodysize, fixed_size;
1662 __u8 *digest = ep->digest;
1663 struct scatterlist sg;
1664 unsigned int keylen, len;
1665 char *key;
1666 sctp_scope_t scope;
1667 struct sk_buff *skb = chunk->skb;
1668 struct timeval tv;
1669 struct hash_desc desc;
1670
1671
1672
1673
1674 headersize = sizeof(sctp_chunkhdr_t) +
1675 (sizeof(struct sctp_signed_cookie) -
1676 sizeof(struct sctp_cookie));
1677 bodysize = ntohs(chunk->chunk_hdr->length) - headersize;
1678 fixed_size = headersize + sizeof(struct sctp_cookie);
1679
1680
1681
1682
1683
1684 len = ntohs(chunk->chunk_hdr->length);
1685 if (len < fixed_size + sizeof(struct sctp_chunkhdr))
1686 goto malformed;
1687
1688
1689 if (bodysize % SCTP_COOKIE_MULTIPLE)
1690 goto malformed;
1691
1692
1693 cookie = chunk->subh.cookie_hdr;
1694 bear_cookie = &cookie->c;
1695
1696 if (!sctp_sk(ep->base.sk)->hmac)
1697 goto no_hmac;
1698
1699
1700 keylen = SCTP_SECRET_SIZE;
1701 sg_init_one(&sg, bear_cookie, bodysize);
1702 key = (char *)ep->secret_key[ep->current_key];
1703 desc.tfm = sctp_sk(ep->base.sk)->hmac;
1704 desc.flags = 0;
1705
1706 memset(digest, 0x00, SCTP_SIGNATURE_SIZE);
1707 if (crypto_hash_setkey(desc.tfm, key, keylen) ||
1708 crypto_hash_digest(&desc, &sg, bodysize, digest)) {
1709 *error = -SCTP_IERROR_NOMEM;
1710 goto fail;
1711 }
1712
1713 if (memcmp(digest, cookie->signature, SCTP_SIGNATURE_SIZE)) {
1714
1715 key = (char *)ep->secret_key[ep->last_key];
1716 memset(digest, 0x00, SCTP_SIGNATURE_SIZE);
1717 if (crypto_hash_setkey(desc.tfm, key, keylen) ||
1718 crypto_hash_digest(&desc, &sg, bodysize, digest)) {
1719 *error = -SCTP_IERROR_NOMEM;
1720 goto fail;
1721 }
1722
1723 if (memcmp(digest, cookie->signature, SCTP_SIGNATURE_SIZE)) {
1724
1725 *error = -SCTP_IERROR_BAD_SIG;
1726 goto fail;
1727 }
1728 }
1729
1730no_hmac:
1731
1732
1733
1734
1735
1736
1737
1738 if (ntohl(chunk->sctp_hdr->vtag) != bear_cookie->my_vtag) {
1739 *error = -SCTP_IERROR_BAD_TAG;
1740 goto fail;
1741 }
1742
1743 if (chunk->sctp_hdr->source != bear_cookie->peer_addr.v4.sin_port ||
1744 ntohs(chunk->sctp_hdr->dest) != bear_cookie->my_port) {
1745 *error = -SCTP_IERROR_BAD_PORTS;
1746 goto fail;
1747 }
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757 if (sock_flag(ep->base.sk, SOCK_TIMESTAMP))
1758 skb_get_timestamp(skb, &tv);
1759 else
1760 do_gettimeofday(&tv);
1761
1762 if (!asoc && tv_lt(bear_cookie->expiration, tv)) {
1763
1764
1765
1766
1767
1768
1769
1770
1771 len = ntohs(chunk->chunk_hdr->length);
1772 *errp = sctp_make_op_error_space(asoc, chunk, len);
1773 if (*errp) {
1774 suseconds_t usecs = (tv.tv_sec -
1775 bear_cookie->expiration.tv_sec) * 1000000L +
1776 tv.tv_usec - bear_cookie->expiration.tv_usec;
1777 __be32 n = htonl(usecs);
1778
1779 sctp_init_cause(*errp, SCTP_ERROR_STALE_COOKIE,
1780 sizeof(n));
1781 sctp_addto_chunk(*errp, sizeof(n), &n);
1782 *error = -SCTP_IERROR_STALE_COOKIE;
1783 } else
1784 *error = -SCTP_IERROR_NOMEM;
1785
1786 goto fail;
1787 }
1788
1789
1790 scope = sctp_scope(sctp_source(chunk));
1791 retval = sctp_association_new(ep, ep->base.sk, scope, gfp);
1792 if (!retval) {
1793 *error = -SCTP_IERROR_NOMEM;
1794 goto fail;
1795 }
1796
1797
1798 retval->peer.port = ntohs(chunk->sctp_hdr->source);
1799
1800
1801 memcpy(&retval->c, bear_cookie, sizeof(*bear_cookie));
1802
1803 if (sctp_assoc_set_bind_addr_from_cookie(retval, bear_cookie,
1804 GFP_ATOMIC) < 0) {
1805 *error = -SCTP_IERROR_NOMEM;
1806 goto fail;
1807 }
1808
1809
1810 if (list_empty(&retval->base.bind_addr.address_list)) {
1811 sctp_add_bind_addr(&retval->base.bind_addr, &chunk->dest,
1812 SCTP_ADDR_SRC, GFP_ATOMIC);
1813 }
1814
1815 retval->next_tsn = retval->c.initial_tsn;
1816 retval->ctsn_ack_point = retval->next_tsn - 1;
1817 retval->addip_serial = retval->c.initial_tsn;
1818 retval->adv_peer_ack_point = retval->ctsn_ack_point;
1819 retval->peer.prsctp_capable = retval->c.prsctp_capable;
1820 retval->peer.adaptation_ind = retval->c.adaptation_ind;
1821
1822
1823 return retval;
1824
1825fail:
1826 if (retval)
1827 sctp_association_free(retval);
1828
1829 return NULL;
1830
1831malformed:
1832
1833
1834
1835 *error = -SCTP_IERROR_MALFORMED;
1836 goto fail;
1837}
1838
1839
1840
1841
1842
1843struct __sctp_missing {
1844 __be32 num_missing;
1845 __be16 type;
1846} __packed;
1847
1848
1849
1850
1851static int sctp_process_missing_param(const struct sctp_association *asoc,
1852 sctp_param_t paramtype,
1853 struct sctp_chunk *chunk,
1854 struct sctp_chunk **errp)
1855{
1856 struct __sctp_missing report;
1857 __u16 len;
1858
1859 len = WORD_ROUND(sizeof(report));
1860
1861
1862
1863
1864 if (!*errp)
1865 *errp = sctp_make_op_error_space(asoc, chunk, len);
1866
1867 if (*errp) {
1868 report.num_missing = htonl(1);
1869 report.type = paramtype;
1870 sctp_init_cause(*errp, SCTP_ERROR_MISS_PARAM,
1871 sizeof(report));
1872 sctp_addto_chunk(*errp, sizeof(report), &report);
1873 }
1874
1875
1876 return 0;
1877}
1878
1879
1880static int sctp_process_inv_mandatory(const struct sctp_association *asoc,
1881 struct sctp_chunk *chunk,
1882 struct sctp_chunk **errp)
1883{
1884
1885
1886 if (!*errp)
1887 *errp = sctp_make_op_error_space(asoc, chunk, 0);
1888
1889 if (*errp)
1890 sctp_init_cause(*errp, SCTP_ERROR_INV_PARAM, 0);
1891
1892
1893 return 0;
1894}
1895
1896static int sctp_process_inv_paramlength(const struct sctp_association *asoc,
1897 struct sctp_paramhdr *param,
1898 const struct sctp_chunk *chunk,
1899 struct sctp_chunk **errp)
1900{
1901
1902
1903
1904 if (*errp)
1905 sctp_chunk_free(*errp);
1906
1907
1908 *errp = sctp_make_violation_paramlen(asoc, chunk, param);
1909
1910 return 0;
1911}
1912
1913
1914
1915
1916
1917static int sctp_process_hn_param(const struct sctp_association *asoc,
1918 union sctp_params param,
1919 struct sctp_chunk *chunk,
1920 struct sctp_chunk **errp)
1921{
1922 __u16 len = ntohs(param.p->length);
1923
1924
1925
1926
1927
1928
1929 if (*errp)
1930 sctp_chunk_free(*errp);
1931
1932 *errp = sctp_make_op_error_space(asoc, chunk, len);
1933
1934 if (*errp) {
1935 sctp_init_cause(*errp, SCTP_ERROR_DNS_FAILED, len);
1936 sctp_addto_chunk(*errp, len, param.v);
1937 }
1938
1939
1940 return 0;
1941}
1942
1943static int sctp_verify_ext_param(union sctp_params param)
1944{
1945 __u16 num_ext = ntohs(param.p->length) - sizeof(sctp_paramhdr_t);
1946 int have_auth = 0;
1947 int have_asconf = 0;
1948 int i;
1949
1950 for (i = 0; i < num_ext; i++) {
1951 switch (param.ext->chunks[i]) {
1952 case SCTP_CID_AUTH:
1953 have_auth = 1;
1954 break;
1955 case SCTP_CID_ASCONF:
1956 case SCTP_CID_ASCONF_ACK:
1957 have_asconf = 1;
1958 break;
1959 }
1960 }
1961
1962
1963
1964
1965
1966
1967 if (sctp_addip_noauth)
1968 return 1;
1969
1970 if (sctp_addip_enable && !have_auth && have_asconf)
1971 return 0;
1972
1973 return 1;
1974}
1975
1976static void sctp_process_ext_param(struct sctp_association *asoc,
1977 union sctp_params param)
1978{
1979 __u16 num_ext = ntohs(param.p->length) - sizeof(sctp_paramhdr_t);
1980 int i;
1981
1982 for (i = 0; i < num_ext; i++) {
1983 switch (param.ext->chunks[i]) {
1984 case SCTP_CID_FWD_TSN:
1985 if (sctp_prsctp_enable &&
1986 !asoc->peer.prsctp_capable)
1987 asoc->peer.prsctp_capable = 1;
1988 break;
1989 case SCTP_CID_AUTH:
1990
1991
1992
1993 if (sctp_auth_enable)
1994 asoc->peer.auth_capable = 1;
1995 break;
1996 case SCTP_CID_ASCONF:
1997 case SCTP_CID_ASCONF_ACK:
1998 if (sctp_addip_enable)
1999 asoc->peer.asconf_capable = 1;
2000 break;
2001 default:
2002 break;
2003 }
2004 }
2005}
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032static sctp_ierror_t sctp_process_unk_param(const struct sctp_association *asoc,
2033 union sctp_params param,
2034 struct sctp_chunk *chunk,
2035 struct sctp_chunk **errp)
2036{
2037 int retval = SCTP_IERROR_NO_ERROR;
2038
2039 switch (param.p->type & SCTP_PARAM_ACTION_MASK) {
2040 case SCTP_PARAM_ACTION_DISCARD:
2041 retval = SCTP_IERROR_ERROR;
2042 break;
2043 case SCTP_PARAM_ACTION_SKIP:
2044 break;
2045 case SCTP_PARAM_ACTION_DISCARD_ERR:
2046 retval = SCTP_IERROR_ERROR;
2047
2048 case SCTP_PARAM_ACTION_SKIP_ERR:
2049
2050
2051
2052 if (NULL == *errp)
2053 *errp = sctp_make_op_error_fixed(asoc, chunk);
2054
2055 if (*errp) {
2056 if (!sctp_init_cause_fixed(*errp, SCTP_ERROR_UNKNOWN_PARAM,
2057 WORD_ROUND(ntohs(param.p->length))))
2058 sctp_addto_chunk_fixed(*errp,
2059 WORD_ROUND(ntohs(param.p->length)),
2060 param.v);
2061 } else {
2062
2063
2064
2065
2066
2067 retval = SCTP_IERROR_NOMEM;
2068 }
2069 break;
2070 default:
2071 break;
2072 }
2073
2074 return retval;
2075}
2076
2077
2078
2079
2080
2081
2082
2083
2084static sctp_ierror_t sctp_verify_param(const struct sctp_association *asoc,
2085 union sctp_params param,
2086 sctp_cid_t cid,
2087 struct sctp_chunk *chunk,
2088 struct sctp_chunk **err_chunk)
2089{
2090 struct sctp_hmac_algo_param *hmacs;
2091 int retval = SCTP_IERROR_NO_ERROR;
2092 __u16 n_elt, id = 0;
2093 int i;
2094
2095
2096
2097
2098
2099
2100 switch (param.p->type) {
2101 case SCTP_PARAM_IPV4_ADDRESS:
2102 case SCTP_PARAM_IPV6_ADDRESS:
2103 case SCTP_PARAM_COOKIE_PRESERVATIVE:
2104 case SCTP_PARAM_SUPPORTED_ADDRESS_TYPES:
2105 case SCTP_PARAM_STATE_COOKIE:
2106 case SCTP_PARAM_HEARTBEAT_INFO:
2107 case SCTP_PARAM_UNRECOGNIZED_PARAMETERS:
2108 case SCTP_PARAM_ECN_CAPABLE:
2109 case SCTP_PARAM_ADAPTATION_LAYER_IND:
2110 break;
2111
2112 case SCTP_PARAM_SUPPORTED_EXT:
2113 if (!sctp_verify_ext_param(param))
2114 return SCTP_IERROR_ABORT;
2115 break;
2116
2117 case SCTP_PARAM_SET_PRIMARY:
2118 if (sctp_addip_enable)
2119 break;
2120 goto fallthrough;
2121
2122 case SCTP_PARAM_HOST_NAME_ADDRESS:
2123
2124 sctp_process_hn_param(asoc, param, chunk, err_chunk);
2125 retval = SCTP_IERROR_ABORT;
2126 break;
2127
2128 case SCTP_PARAM_FWD_TSN_SUPPORT:
2129 if (sctp_prsctp_enable)
2130 break;
2131 goto fallthrough;
2132
2133 case SCTP_PARAM_RANDOM:
2134 if (!sctp_auth_enable)
2135 goto fallthrough;
2136
2137
2138
2139
2140
2141
2142 if (SCTP_AUTH_RANDOM_LENGTH !=
2143 ntohs(param.p->length) - sizeof(sctp_paramhdr_t)) {
2144 sctp_process_inv_paramlength(asoc, param.p,
2145 chunk, err_chunk);
2146 retval = SCTP_IERROR_ABORT;
2147 }
2148 break;
2149
2150 case SCTP_PARAM_CHUNKS:
2151 if (!sctp_auth_enable)
2152 goto fallthrough;
2153
2154
2155
2156
2157
2158
2159 if (260 < ntohs(param.p->length)) {
2160 sctp_process_inv_paramlength(asoc, param.p,
2161 chunk, err_chunk);
2162 retval = SCTP_IERROR_ABORT;
2163 }
2164 break;
2165
2166 case SCTP_PARAM_HMAC_ALGO:
2167 if (!sctp_auth_enable)
2168 goto fallthrough;
2169
2170 hmacs = (struct sctp_hmac_algo_param *)param.p;
2171 n_elt = (ntohs(param.p->length) - sizeof(sctp_paramhdr_t)) >> 1;
2172
2173
2174
2175
2176
2177 for (i = 0; i < n_elt; i++) {
2178 id = ntohs(hmacs->hmac_ids[i]);
2179
2180 if (id == SCTP_AUTH_HMAC_ID_SHA1)
2181 break;
2182 }
2183
2184 if (id != SCTP_AUTH_HMAC_ID_SHA1) {
2185 sctp_process_inv_paramlength(asoc, param.p, chunk,
2186 err_chunk);
2187 retval = SCTP_IERROR_ABORT;
2188 }
2189 break;
2190fallthrough:
2191 default:
2192 SCTP_DEBUG_PRINTK("Unrecognized param: %d for chunk %d.\n",
2193 ntohs(param.p->type), cid);
2194 retval = sctp_process_unk_param(asoc, param, chunk, err_chunk);
2195 break;
2196 }
2197 return retval;
2198}
2199
2200
2201int sctp_verify_init(const struct sctp_association *asoc,
2202 sctp_cid_t cid,
2203 sctp_init_chunk_t *peer_init,
2204 struct sctp_chunk *chunk,
2205 struct sctp_chunk **errp)
2206{
2207 union sctp_params param;
2208 int has_cookie = 0;
2209 int result;
2210
2211
2212 if ((0 == peer_init->init_hdr.num_outbound_streams) ||
2213 (0 == peer_init->init_hdr.num_inbound_streams) ||
2214 (0 == peer_init->init_hdr.init_tag) ||
2215 (SCTP_DEFAULT_MINWINDOW > ntohl(peer_init->init_hdr.a_rwnd))) {
2216
2217 return sctp_process_inv_mandatory(asoc, chunk, errp);
2218 }
2219
2220
2221 sctp_walk_params(param, peer_init, init_hdr.params) {
2222
2223 if (SCTP_PARAM_STATE_COOKIE == param.p->type)
2224 has_cookie = 1;
2225
2226 }
2227
2228
2229
2230
2231
2232
2233
2234
2235 if (param.v != (void*)chunk->chunk_end)
2236 return sctp_process_inv_paramlength(asoc, param.p, chunk, errp);
2237
2238
2239
2240
2241 if ((SCTP_CID_INIT_ACK == cid) && !has_cookie)
2242 return sctp_process_missing_param(asoc, SCTP_PARAM_STATE_COOKIE,
2243 chunk, errp);
2244
2245
2246 sctp_walk_params(param, peer_init, init_hdr.params) {
2247
2248 result = sctp_verify_param(asoc, param, cid, chunk, errp);
2249 switch (result) {
2250 case SCTP_IERROR_ABORT:
2251 case SCTP_IERROR_NOMEM:
2252 return 0;
2253 case SCTP_IERROR_ERROR:
2254 return 1;
2255 case SCTP_IERROR_NO_ERROR:
2256 default:
2257 break;
2258 }
2259
2260 }
2261
2262 return 1;
2263}
2264
2265
2266
2267
2268
2269int sctp_process_init(struct sctp_association *asoc, struct sctp_chunk *chunk,
2270 const union sctp_addr *peer_addr,
2271 sctp_init_chunk_t *peer_init, gfp_t gfp)
2272{
2273 union sctp_params param;
2274 struct sctp_transport *transport;
2275 struct list_head *pos, *temp;
2276 struct sctp_af *af;
2277 union sctp_addr addr;
2278 char *cookie;
2279 int src_match = 0;
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291 if(!sctp_assoc_add_peer(asoc, peer_addr, gfp, SCTP_ACTIVE))
2292 goto nomem;
2293
2294 if (sctp_cmp_addr_exact(sctp_source(chunk), peer_addr))
2295 src_match = 1;
2296
2297
2298 sctp_walk_params(param, peer_init, init_hdr.params) {
2299 if (!src_match && (param.p->type == SCTP_PARAM_IPV4_ADDRESS ||
2300 param.p->type == SCTP_PARAM_IPV6_ADDRESS)) {
2301 af = sctp_get_af_specific(param_type2af(param.p->type));
2302 af->from_addr_param(&addr, param.addr,
2303 chunk->sctp_hdr->source, 0);
2304 if (sctp_cmp_addr_exact(sctp_source(chunk), &addr))
2305 src_match = 1;
2306 }
2307
2308 if (!sctp_process_param(asoc, param, peer_addr, gfp))
2309 goto clean_up;
2310 }
2311
2312
2313 if (!src_match)
2314 goto clean_up;
2315
2316
2317
2318
2319 if (asoc->peer.auth_capable && (!asoc->peer.peer_random ||
2320 !asoc->peer.peer_hmacs))
2321 asoc->peer.auth_capable = 0;
2322
2323
2324
2325
2326
2327
2328
2329 if (!sctp_addip_noauth &&
2330 (asoc->peer.asconf_capable && !asoc->peer.auth_capable)) {
2331 asoc->peer.addip_disabled_mask |= (SCTP_PARAM_ADD_IP |
2332 SCTP_PARAM_DEL_IP |
2333 SCTP_PARAM_SET_PRIMARY);
2334 asoc->peer.asconf_capable = 0;
2335 goto clean_up;
2336 }
2337
2338
2339 list_for_each_safe(pos, temp, &asoc->peer.transport_addr_list) {
2340 transport = list_entry(pos, struct sctp_transport, transports);
2341 if (transport->state == SCTP_UNKNOWN) {
2342 sctp_assoc_rm_peer(asoc, transport);
2343 }
2344 }
2345
2346
2347
2348
2349 asoc->peer.i.init_tag =
2350 ntohl(peer_init->init_hdr.init_tag);
2351 asoc->peer.i.a_rwnd =
2352 ntohl(peer_init->init_hdr.a_rwnd);
2353 asoc->peer.i.num_outbound_streams =
2354 ntohs(peer_init->init_hdr.num_outbound_streams);
2355 asoc->peer.i.num_inbound_streams =
2356 ntohs(peer_init->init_hdr.num_inbound_streams);
2357 asoc->peer.i.initial_tsn =
2358 ntohl(peer_init->init_hdr.initial_tsn);
2359
2360
2361
2362
2363 if (asoc->c.sinit_num_ostreams >
2364 ntohs(peer_init->init_hdr.num_inbound_streams)) {
2365 asoc->c.sinit_num_ostreams =
2366 ntohs(peer_init->init_hdr.num_inbound_streams);
2367 }
2368
2369 if (asoc->c.sinit_max_instreams >
2370 ntohs(peer_init->init_hdr.num_outbound_streams)) {
2371 asoc->c.sinit_max_instreams =
2372 ntohs(peer_init->init_hdr.num_outbound_streams);
2373 }
2374
2375
2376 asoc->c.peer_vtag = asoc->peer.i.init_tag;
2377
2378
2379 asoc->peer.rwnd = asoc->peer.i.a_rwnd;
2380
2381
2382 cookie = asoc->peer.cookie;
2383 if (cookie) {
2384 asoc->peer.cookie = kmemdup(cookie, asoc->peer.cookie_len, gfp);
2385 if (!asoc->peer.cookie)
2386 goto clean_up;
2387 }
2388
2389
2390
2391
2392
2393 list_for_each_entry(transport, &asoc->peer.transport_addr_list,
2394 transports) {
2395 transport->ssthresh = asoc->peer.i.a_rwnd;
2396 }
2397
2398
2399 if (!sctp_tsnmap_init(&asoc->peer.tsn_map, SCTP_TSN_MAP_INITIAL,
2400 asoc->peer.i.initial_tsn, gfp))
2401 goto clean_up;
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414 if (!asoc->temp) {
2415 int error;
2416
2417 asoc->ssnmap = sctp_ssnmap_new(asoc->c.sinit_max_instreams,
2418 asoc->c.sinit_num_ostreams, gfp);
2419 if (!asoc->ssnmap)
2420 goto clean_up;
2421
2422 error = sctp_assoc_set_id(asoc, gfp);
2423 if (error)
2424 goto clean_up;
2425 }
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437 asoc->peer.addip_serial = asoc->peer.i.initial_tsn - 1;
2438 return 1;
2439
2440clean_up:
2441
2442 list_for_each_safe(pos, temp, &asoc->peer.transport_addr_list) {
2443 transport = list_entry(pos, struct sctp_transport, transports);
2444 if (transport->state != SCTP_ACTIVE)
2445 sctp_assoc_rm_peer(asoc, transport);
2446 }
2447
2448nomem:
2449 return 0;
2450}
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464static int sctp_process_param(struct sctp_association *asoc,
2465 union sctp_params param,
2466 const union sctp_addr *peer_addr,
2467 gfp_t gfp)
2468{
2469 union sctp_addr addr;
2470 int i;
2471 __u16 sat;
2472 int retval = 1;
2473 sctp_scope_t scope;
2474 time_t stale;
2475 struct sctp_af *af;
2476 union sctp_addr_param *addr_param;
2477 struct sctp_transport *t;
2478
2479
2480
2481
2482
2483 switch (param.p->type) {
2484 case SCTP_PARAM_IPV6_ADDRESS:
2485 if (PF_INET6 != asoc->base.sk->sk_family)
2486 break;
2487 goto do_addr_param;
2488
2489 case SCTP_PARAM_IPV4_ADDRESS:
2490
2491 if (ipv6_only_sock(asoc->base.sk))
2492 break;
2493do_addr_param:
2494 af = sctp_get_af_specific(param_type2af(param.p->type));
2495 af->from_addr_param(&addr, param.addr, htons(asoc->peer.port), 0);
2496 scope = sctp_scope(peer_addr);
2497 if (sctp_in_scope(&addr, scope))
2498 if (!sctp_assoc_add_peer(asoc, &addr, gfp, SCTP_UNCONFIRMED))
2499 return 0;
2500 break;
2501
2502 case SCTP_PARAM_COOKIE_PRESERVATIVE:
2503 if (!sctp_cookie_preserve_enable)
2504 break;
2505
2506 stale = ntohl(param.life->lifespan_increment);
2507
2508
2509
2510
2511 asoc->cookie_life.tv_sec += stale / 1000;
2512 asoc->cookie_life.tv_usec += (stale % 1000) * 1000;
2513 break;
2514
2515 case SCTP_PARAM_HOST_NAME_ADDRESS:
2516 SCTP_DEBUG_PRINTK("unimplemented SCTP_HOST_NAME_ADDRESS\n");
2517 break;
2518
2519 case SCTP_PARAM_SUPPORTED_ADDRESS_TYPES:
2520
2521
2522
2523 asoc->peer.ipv4_address = 0;
2524 asoc->peer.ipv6_address = 0;
2525
2526
2527
2528
2529 if (peer_addr->sa.sa_family == AF_INET6)
2530 asoc->peer.ipv6_address = 1;
2531 else if (peer_addr->sa.sa_family == AF_INET)
2532 asoc->peer.ipv4_address = 1;
2533
2534
2535 sat = ntohs(param.p->length) - sizeof(sctp_paramhdr_t);
2536 if (sat)
2537 sat /= sizeof(__u16);
2538
2539 for (i = 0; i < sat; ++i) {
2540 switch (param.sat->types[i]) {
2541 case SCTP_PARAM_IPV4_ADDRESS:
2542 asoc->peer.ipv4_address = 1;
2543 break;
2544
2545 case SCTP_PARAM_IPV6_ADDRESS:
2546 if (PF_INET6 == asoc->base.sk->sk_family)
2547 asoc->peer.ipv6_address = 1;
2548 break;
2549
2550 case SCTP_PARAM_HOST_NAME_ADDRESS:
2551 asoc->peer.hostname_address = 1;
2552 break;
2553
2554 default:
2555 break;
2556 }
2557 }
2558 break;
2559
2560 case SCTP_PARAM_STATE_COOKIE:
2561 asoc->peer.cookie_len =
2562 ntohs(param.p->length) - sizeof(sctp_paramhdr_t);
2563 asoc->peer.cookie = param.cookie->body;
2564 break;
2565
2566 case SCTP_PARAM_HEARTBEAT_INFO:
2567
2568 break;
2569
2570 case SCTP_PARAM_UNRECOGNIZED_PARAMETERS:
2571
2572 break;
2573
2574 case SCTP_PARAM_ECN_CAPABLE:
2575 asoc->peer.ecn_capable = 1;
2576 break;
2577
2578 case SCTP_PARAM_ADAPTATION_LAYER_IND:
2579 asoc->peer.adaptation_ind = ntohl(param.aind->adaptation_ind);
2580 break;
2581
2582 case SCTP_PARAM_SET_PRIMARY:
2583 if (!sctp_addip_enable)
2584 goto fall_through;
2585
2586 addr_param = param.v + sizeof(sctp_addip_param_t);
2587
2588 af = sctp_get_af_specific(param_type2af(param.p->type));
2589 af->from_addr_param(&addr, addr_param,
2590 htons(asoc->peer.port), 0);
2591
2592
2593
2594
2595 if (!af->addr_valid(&addr, NULL, NULL))
2596 break;
2597
2598 t = sctp_assoc_lookup_paddr(asoc, &addr);
2599 if (!t)
2600 break;
2601
2602 sctp_assoc_set_primary(asoc, t);
2603 break;
2604
2605 case SCTP_PARAM_SUPPORTED_EXT:
2606 sctp_process_ext_param(asoc, param);
2607 break;
2608
2609 case SCTP_PARAM_FWD_TSN_SUPPORT:
2610 if (sctp_prsctp_enable) {
2611 asoc->peer.prsctp_capable = 1;
2612 break;
2613 }
2614
2615 goto fall_through;
2616
2617 case SCTP_PARAM_RANDOM:
2618 if (!sctp_auth_enable)
2619 goto fall_through;
2620
2621
2622 asoc->peer.peer_random = kmemdup(param.p,
2623 ntohs(param.p->length), gfp);
2624 if (!asoc->peer.peer_random) {
2625 retval = 0;
2626 break;
2627 }
2628 break;
2629
2630 case SCTP_PARAM_HMAC_ALGO:
2631 if (!sctp_auth_enable)
2632 goto fall_through;
2633
2634
2635 asoc->peer.peer_hmacs = kmemdup(param.p,
2636 ntohs(param.p->length), gfp);
2637 if (!asoc->peer.peer_hmacs) {
2638 retval = 0;
2639 break;
2640 }
2641
2642
2643 sctp_auth_asoc_set_default_hmac(asoc, param.hmac_algo);
2644 break;
2645
2646 case SCTP_PARAM_CHUNKS:
2647 if (!sctp_auth_enable)
2648 goto fall_through;
2649
2650 asoc->peer.peer_chunks = kmemdup(param.p,
2651 ntohs(param.p->length), gfp);
2652 if (!asoc->peer.peer_chunks)
2653 retval = 0;
2654 break;
2655fall_through:
2656 default:
2657
2658
2659
2660
2661
2662 SCTP_DEBUG_PRINTK("Ignoring param: %d for association %p.\n",
2663 ntohs(param.p->type), asoc);
2664 break;
2665 }
2666
2667 return retval;
2668}
2669
2670
2671__u32 sctp_generate_tag(const struct sctp_endpoint *ep)
2672{
2673
2674
2675
2676 __u32 x;
2677
2678 do {
2679 get_random_bytes(&x, sizeof(__u32));
2680 } while (x == 0);
2681
2682 return x;
2683}
2684
2685
2686__u32 sctp_generate_tsn(const struct sctp_endpoint *ep)
2687{
2688 __u32 retval;
2689
2690 get_random_bytes(&retval, sizeof(__u32));
2691 return retval;
2692}
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716static struct sctp_chunk *sctp_make_asconf(struct sctp_association *asoc,
2717 union sctp_addr *addr,
2718 int vparam_len)
2719{
2720 sctp_addiphdr_t asconf;
2721 struct sctp_chunk *retval;
2722 int length = sizeof(asconf) + vparam_len;
2723 union sctp_addr_param addrparam;
2724 int addrlen;
2725 struct sctp_af *af = sctp_get_af_specific(addr->v4.sin_family);
2726
2727 addrlen = af->to_addr_param(addr, &addrparam);
2728 if (!addrlen)
2729 return NULL;
2730 length += addrlen;
2731
2732
2733 retval = sctp_make_chunk(asoc, SCTP_CID_ASCONF, 0, length);
2734 if (!retval)
2735 return NULL;
2736
2737 asconf.serial = htonl(asoc->addip_serial++);
2738
2739 retval->subh.addip_hdr =
2740 sctp_addto_chunk(retval, sizeof(asconf), &asconf);
2741 retval->param_hdr.v =
2742 sctp_addto_chunk(retval, addrlen, &addrparam);
2743
2744 return retval;
2745}
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771struct sctp_chunk *sctp_make_asconf_update_ip(struct sctp_association *asoc,
2772 union sctp_addr *laddr,
2773 struct sockaddr *addrs,
2774 int addrcnt,
2775 __be16 flags)
2776{
2777 sctp_addip_param_t param;
2778 struct sctp_chunk *retval;
2779 union sctp_addr_param addr_param;
2780 union sctp_addr *addr;
2781 void *addr_buf;
2782 struct sctp_af *af;
2783 int paramlen = sizeof(param);
2784 int addr_param_len = 0;
2785 int totallen = 0;
2786 int i;
2787 int del_pickup = 0;
2788
2789
2790 addr_buf = addrs;
2791 for (i = 0; i < addrcnt; i++) {
2792 addr = addr_buf;
2793 af = sctp_get_af_specific(addr->v4.sin_family);
2794 addr_param_len = af->to_addr_param(addr, &addr_param);
2795
2796 totallen += paramlen;
2797 totallen += addr_param_len;
2798
2799 addr_buf += af->sockaddr_len;
2800 if (asoc->asconf_addr_del_pending && !del_pickup) {
2801
2802 totallen += paramlen;
2803 totallen += addr_param_len;
2804 del_pickup = 1;
2805 SCTP_DEBUG_PRINTK("mkasconf_update_ip: picked same-scope del_pending addr, totallen for all addresses is %d\n", totallen);
2806 }
2807 }
2808
2809
2810 retval = sctp_make_asconf(asoc, laddr, totallen);
2811 if (!retval)
2812 return NULL;
2813
2814
2815 addr_buf = addrs;
2816 for (i = 0; i < addrcnt; i++) {
2817 addr = addr_buf;
2818 af = sctp_get_af_specific(addr->v4.sin_family);
2819 addr_param_len = af->to_addr_param(addr, &addr_param);
2820 param.param_hdr.type = flags;
2821 param.param_hdr.length = htons(paramlen + addr_param_len);
2822 param.crr_id = i;
2823
2824 sctp_addto_chunk(retval, paramlen, ¶m);
2825 sctp_addto_chunk(retval, addr_param_len, &addr_param);
2826
2827 addr_buf += af->sockaddr_len;
2828 }
2829 if (flags == SCTP_PARAM_ADD_IP && del_pickup) {
2830 addr = asoc->asconf_addr_del_pending;
2831 af = sctp_get_af_specific(addr->v4.sin_family);
2832 addr_param_len = af->to_addr_param(addr, &addr_param);
2833 param.param_hdr.type = SCTP_PARAM_DEL_IP;
2834 param.param_hdr.length = htons(paramlen + addr_param_len);
2835 param.crr_id = i;
2836
2837 sctp_addto_chunk(retval, paramlen, ¶m);
2838 sctp_addto_chunk(retval, addr_param_len, &addr_param);
2839 }
2840 return retval;
2841}
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857struct sctp_chunk *sctp_make_asconf_set_prim(struct sctp_association *asoc,
2858 union sctp_addr *addr)
2859{
2860 sctp_addip_param_t param;
2861 struct sctp_chunk *retval;
2862 int len = sizeof(param);
2863 union sctp_addr_param addrparam;
2864 int addrlen;
2865 struct sctp_af *af = sctp_get_af_specific(addr->v4.sin_family);
2866
2867 addrlen = af->to_addr_param(addr, &addrparam);
2868 if (!addrlen)
2869 return NULL;
2870 len += addrlen;
2871
2872
2873 retval = sctp_make_asconf(asoc, addr, len);
2874 if (!retval)
2875 return NULL;
2876
2877 param.param_hdr.type = SCTP_PARAM_SET_PRIMARY;
2878 param.param_hdr.length = htons(len);
2879 param.crr_id = 0;
2880
2881 sctp_addto_chunk(retval, sizeof(param), ¶m);
2882 sctp_addto_chunk(retval, addrlen, &addrparam);
2883
2884 return retval;
2885}
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906static struct sctp_chunk *sctp_make_asconf_ack(const struct sctp_association *asoc,
2907 __u32 serial, int vparam_len)
2908{
2909 sctp_addiphdr_t asconf;
2910 struct sctp_chunk *retval;
2911 int length = sizeof(asconf) + vparam_len;
2912
2913
2914 retval = sctp_make_chunk(asoc, SCTP_CID_ASCONF_ACK, 0, length);
2915 if (!retval)
2916 return NULL;
2917
2918 asconf.serial = htonl(serial);
2919
2920 retval->subh.addip_hdr =
2921 sctp_addto_chunk(retval, sizeof(asconf), &asconf);
2922
2923 return retval;
2924}
2925
2926
2927static void sctp_add_asconf_response(struct sctp_chunk *chunk, __be32 crr_id,
2928 __be16 err_code, sctp_addip_param_t *asconf_param)
2929{
2930 sctp_addip_param_t ack_param;
2931 sctp_errhdr_t err_param;
2932 int asconf_param_len = 0;
2933 int err_param_len = 0;
2934 __be16 response_type;
2935
2936 if (SCTP_ERROR_NO_ERROR == err_code) {
2937 response_type = SCTP_PARAM_SUCCESS_REPORT;
2938 } else {
2939 response_type = SCTP_PARAM_ERR_CAUSE;
2940 err_param_len = sizeof(err_param);
2941 if (asconf_param)
2942 asconf_param_len =
2943 ntohs(asconf_param->param_hdr.length);
2944 }
2945
2946
2947 ack_param.param_hdr.type = response_type;
2948 ack_param.param_hdr.length = htons(sizeof(ack_param) +
2949 err_param_len +
2950 asconf_param_len);
2951 ack_param.crr_id = crr_id;
2952 sctp_addto_chunk(chunk, sizeof(ack_param), &ack_param);
2953
2954 if (SCTP_ERROR_NO_ERROR == err_code)
2955 return;
2956
2957
2958 err_param.cause = err_code;
2959 err_param.length = htons(err_param_len + asconf_param_len);
2960 sctp_addto_chunk(chunk, err_param_len, &err_param);
2961
2962
2963 if (asconf_param)
2964 sctp_addto_chunk(chunk, asconf_param_len, asconf_param);
2965}
2966
2967
2968static __be16 sctp_process_asconf_param(struct sctp_association *asoc,
2969 struct sctp_chunk *asconf,
2970 sctp_addip_param_t *asconf_param)
2971{
2972 struct sctp_transport *peer;
2973 struct sctp_af *af;
2974 union sctp_addr addr;
2975 union sctp_addr_param *addr_param;
2976
2977 addr_param = (void *)asconf_param + sizeof(sctp_addip_param_t);
2978
2979 if (asconf_param->param_hdr.type != SCTP_PARAM_ADD_IP &&
2980 asconf_param->param_hdr.type != SCTP_PARAM_DEL_IP &&
2981 asconf_param->param_hdr.type != SCTP_PARAM_SET_PRIMARY)
2982 return SCTP_ERROR_UNKNOWN_PARAM;
2983
2984 switch (addr_param->p.type) {
2985 case SCTP_PARAM_IPV6_ADDRESS:
2986 if (!asoc->peer.ipv6_address)
2987 return SCTP_ERROR_DNS_FAILED;
2988 break;
2989 case SCTP_PARAM_IPV4_ADDRESS:
2990 if (!asoc->peer.ipv4_address)
2991 return SCTP_ERROR_DNS_FAILED;
2992 break;
2993 default:
2994 return SCTP_ERROR_DNS_FAILED;
2995 }
2996
2997 af = sctp_get_af_specific(param_type2af(addr_param->p.type));
2998 if (unlikely(!af))
2999 return SCTP_ERROR_DNS_FAILED;
3000
3001 af->from_addr_param(&addr, addr_param, htons(asoc->peer.port), 0);
3002
3003
3004
3005
3006
3007
3008 if (!af->is_any(&addr) && !af->addr_valid(&addr, NULL, asconf->skb))
3009 return SCTP_ERROR_DNS_FAILED;
3010
3011 switch (asconf_param->param_hdr.type) {
3012 case SCTP_PARAM_ADD_IP:
3013
3014
3015
3016
3017 if (af->is_any(&addr))
3018 memcpy(&addr, &asconf->source, sizeof(addr));
3019
3020
3021
3022
3023
3024
3025
3026
3027 peer = sctp_assoc_add_peer(asoc, &addr, GFP_ATOMIC, SCTP_UNCONFIRMED);
3028 if (!peer)
3029 return SCTP_ERROR_RSRC_LOW;
3030
3031
3032 if (!mod_timer(&peer->hb_timer, sctp_transport_timeout(peer)))
3033 sctp_transport_hold(peer);
3034 asoc->new_transport = peer;
3035 break;
3036 case SCTP_PARAM_DEL_IP:
3037
3038
3039
3040
3041
3042 if (asoc->peer.transport_count == 1)
3043 return SCTP_ERROR_DEL_LAST_IP;
3044
3045
3046
3047
3048
3049
3050
3051
3052 if (sctp_cmp_addr_exact(&asconf->source, &addr))
3053 return SCTP_ERROR_DEL_SRC_IP;
3054
3055
3056
3057
3058
3059
3060 if (af->is_any(&addr)) {
3061 sctp_assoc_set_primary(asoc, asconf->transport);
3062 sctp_assoc_del_nonprimary_peers(asoc,
3063 asconf->transport);
3064 } else
3065 sctp_assoc_del_peer(asoc, &addr);
3066 break;
3067 case SCTP_PARAM_SET_PRIMARY:
3068
3069
3070
3071
3072
3073 if (af->is_any(&addr))
3074 memcpy(&addr.v4, sctp_source(asconf), sizeof(addr));
3075
3076 peer = sctp_assoc_lookup_paddr(asoc, &addr);
3077 if (!peer)
3078 return SCTP_ERROR_DNS_FAILED;
3079
3080 sctp_assoc_set_primary(asoc, peer);
3081 break;
3082 }
3083
3084 return SCTP_ERROR_NO_ERROR;
3085}
3086
3087
3088int sctp_verify_asconf(const struct sctp_association *asoc,
3089 struct sctp_paramhdr *param_hdr, void *chunk_end,
3090 struct sctp_paramhdr **errp) {
3091 sctp_addip_param_t *asconf_param;
3092 union sctp_params param;
3093 int length, plen;
3094
3095 param.v = (sctp_paramhdr_t *) param_hdr;
3096 while (param.v <= chunk_end - sizeof(sctp_paramhdr_t)) {
3097 length = ntohs(param.p->length);
3098 *errp = param.p;
3099
3100 if (param.v > chunk_end - length ||
3101 length < sizeof(sctp_paramhdr_t))
3102 return 0;
3103
3104 switch (param.p->type) {
3105 case SCTP_PARAM_ADD_IP:
3106 case SCTP_PARAM_DEL_IP:
3107 case SCTP_PARAM_SET_PRIMARY:
3108 asconf_param = (sctp_addip_param_t *)param.v;
3109 plen = ntohs(asconf_param->param_hdr.length);
3110 if (plen < sizeof(sctp_addip_param_t) +
3111 sizeof(sctp_paramhdr_t))
3112 return 0;
3113 break;
3114 case SCTP_PARAM_SUCCESS_REPORT:
3115 case SCTP_PARAM_ADAPTATION_LAYER_IND:
3116 if (length != sizeof(sctp_addip_param_t))
3117 return 0;
3118
3119 break;
3120 default:
3121 break;
3122 }
3123
3124 param.v += WORD_ROUND(length);
3125 }
3126
3127 if (param.v != chunk_end)
3128 return 0;
3129
3130 return 1;
3131}
3132
3133
3134
3135
3136struct sctp_chunk *sctp_process_asconf(struct sctp_association *asoc,
3137 struct sctp_chunk *asconf)
3138{
3139 sctp_addiphdr_t *hdr;
3140 union sctp_addr_param *addr_param;
3141 sctp_addip_param_t *asconf_param;
3142 struct sctp_chunk *asconf_ack;
3143
3144 __be16 err_code;
3145 int length = 0;
3146 int chunk_len;
3147 __u32 serial;
3148 int all_param_pass = 1;
3149
3150 chunk_len = ntohs(asconf->chunk_hdr->length) - sizeof(sctp_chunkhdr_t);
3151 hdr = (sctp_addiphdr_t *)asconf->skb->data;
3152 serial = ntohl(hdr->serial);
3153
3154
3155 length = sizeof(sctp_addiphdr_t);
3156 addr_param = (union sctp_addr_param *)(asconf->skb->data + length);
3157 chunk_len -= length;
3158
3159
3160
3161
3162 length = ntohs(addr_param->p.length);
3163 asconf_param = (void *)addr_param + length;
3164 chunk_len -= length;
3165
3166
3167
3168
3169
3170
3171 asconf_ack = sctp_make_asconf_ack(asoc, serial, chunk_len * 4);
3172 if (!asconf_ack)
3173 goto done;
3174
3175
3176 while (chunk_len > 0) {
3177 err_code = sctp_process_asconf_param(asoc, asconf,
3178 asconf_param);
3179
3180
3181
3182
3183
3184
3185
3186 if (SCTP_ERROR_NO_ERROR != err_code)
3187 all_param_pass = 0;
3188
3189 if (!all_param_pass)
3190 sctp_add_asconf_response(asconf_ack,
3191 asconf_param->crr_id, err_code,
3192 asconf_param);
3193
3194
3195
3196
3197
3198
3199 if (SCTP_ERROR_RSRC_LOW == err_code)
3200 goto done;
3201
3202
3203 length = ntohs(asconf_param->param_hdr.length);
3204 asconf_param = (void *)asconf_param + length;
3205 chunk_len -= length;
3206 }
3207
3208done:
3209 asoc->peer.addip_serial++;
3210
3211
3212
3213
3214 if (asconf_ack) {
3215 sctp_chunk_hold(asconf_ack);
3216 list_add_tail(&asconf_ack->transmitted_list,
3217 &asoc->asconf_ack_list);
3218 }
3219
3220 return asconf_ack;
3221}
3222
3223
3224static void sctp_asconf_param_success(struct sctp_association *asoc,
3225 sctp_addip_param_t *asconf_param)
3226{
3227 struct sctp_af *af;
3228 union sctp_addr addr;
3229 struct sctp_bind_addr *bp = &asoc->base.bind_addr;
3230 union sctp_addr_param *addr_param;
3231 struct sctp_transport *transport;
3232 struct sctp_sockaddr_entry *saddr;
3233
3234 addr_param = (void *)asconf_param + sizeof(sctp_addip_param_t);
3235
3236
3237 af = sctp_get_af_specific(param_type2af(addr_param->p.type));
3238 af->from_addr_param(&addr, addr_param, htons(bp->port), 0);
3239
3240 switch (asconf_param->param_hdr.type) {
3241 case SCTP_PARAM_ADD_IP:
3242
3243
3244
3245 local_bh_disable();
3246 list_for_each_entry(saddr, &bp->address_list, list) {
3247 if (sctp_cmp_addr_exact(&saddr->a, &addr))
3248 saddr->state = SCTP_ADDR_SRC;
3249 }
3250 local_bh_enable();
3251 list_for_each_entry(transport, &asoc->peer.transport_addr_list,
3252 transports) {
3253 dst_release(transport->dst);
3254 transport->dst = NULL;
3255 }
3256 break;
3257 case SCTP_PARAM_DEL_IP:
3258 local_bh_disable();
3259 sctp_del_bind_addr(bp, &addr);
3260 if (asoc->asconf_addr_del_pending != NULL &&
3261 sctp_cmp_addr_exact(asoc->asconf_addr_del_pending, &addr)) {
3262 kfree(asoc->asconf_addr_del_pending);
3263 asoc->asconf_addr_del_pending = NULL;
3264 }
3265 local_bh_enable();
3266 list_for_each_entry(transport, &asoc->peer.transport_addr_list,
3267 transports) {
3268 dst_release(transport->dst);
3269 transport->dst = NULL;
3270 }
3271 break;
3272 default:
3273 break;
3274 }
3275}
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286static __be16 sctp_get_asconf_response(struct sctp_chunk *asconf_ack,
3287 sctp_addip_param_t *asconf_param,
3288 int no_err)
3289{
3290 sctp_addip_param_t *asconf_ack_param;
3291 sctp_errhdr_t *err_param;
3292 int length;
3293 int asconf_ack_len;
3294 __be16 err_code;
3295
3296 if (no_err)
3297 err_code = SCTP_ERROR_NO_ERROR;
3298 else
3299 err_code = SCTP_ERROR_REQ_REFUSED;
3300
3301 asconf_ack_len = ntohs(asconf_ack->chunk_hdr->length) -
3302 sizeof(sctp_chunkhdr_t);
3303
3304
3305
3306
3307 length = sizeof(sctp_addiphdr_t);
3308 asconf_ack_param = (sctp_addip_param_t *)(asconf_ack->skb->data +
3309 length);
3310 asconf_ack_len -= length;
3311
3312 while (asconf_ack_len > 0) {
3313 if (asconf_ack_param->crr_id == asconf_param->crr_id) {
3314 switch(asconf_ack_param->param_hdr.type) {
3315 case SCTP_PARAM_SUCCESS_REPORT:
3316 return SCTP_ERROR_NO_ERROR;
3317 case SCTP_PARAM_ERR_CAUSE:
3318 length = sizeof(sctp_addip_param_t);
3319 err_param = (void *)asconf_ack_param + length;
3320 asconf_ack_len -= length;
3321 if (asconf_ack_len > 0)
3322 return err_param->cause;
3323 else
3324 return SCTP_ERROR_INV_PARAM;
3325 break;
3326 default:
3327 return SCTP_ERROR_INV_PARAM;
3328 }
3329 }
3330
3331 length = ntohs(asconf_ack_param->param_hdr.length);
3332 asconf_ack_param = (void *)asconf_ack_param + length;
3333 asconf_ack_len -= length;
3334 }
3335
3336 return err_code;
3337}
3338
3339
3340int sctp_process_asconf_ack(struct sctp_association *asoc,
3341 struct sctp_chunk *asconf_ack)
3342{
3343 struct sctp_chunk *asconf = asoc->addip_last_asconf;
3344 union sctp_addr_param *addr_param;
3345 sctp_addip_param_t *asconf_param;
3346 int length = 0;
3347 int asconf_len = asconf->skb->len;
3348 int all_param_pass = 0;
3349 int no_err = 1;
3350 int retval = 0;
3351 __be16 err_code = SCTP_ERROR_NO_ERROR;
3352
3353
3354
3355
3356 length = sizeof(sctp_addip_chunk_t);
3357 addr_param = (union sctp_addr_param *)(asconf->skb->data + length);
3358 asconf_len -= length;
3359
3360
3361
3362
3363 length = ntohs(addr_param->p.length);
3364 asconf_param = (void *)addr_param + length;
3365 asconf_len -= length;
3366
3367
3368
3369
3370
3371
3372 if (asconf_ack->skb->len == sizeof(sctp_addiphdr_t))
3373 all_param_pass = 1;
3374
3375
3376 while (asconf_len > 0) {
3377 if (all_param_pass)
3378 err_code = SCTP_ERROR_NO_ERROR;
3379 else {
3380 err_code = sctp_get_asconf_response(asconf_ack,
3381 asconf_param,
3382 no_err);
3383 if (no_err && (SCTP_ERROR_NO_ERROR != err_code))
3384 no_err = 0;
3385 }
3386
3387 switch (err_code) {
3388 case SCTP_ERROR_NO_ERROR:
3389 sctp_asconf_param_success(asoc, asconf_param);
3390 break;
3391
3392 case SCTP_ERROR_RSRC_LOW:
3393 retval = 1;
3394 break;
3395
3396 case SCTP_ERROR_UNKNOWN_PARAM:
3397
3398
3399
3400 asoc->peer.addip_disabled_mask |=
3401 asconf_param->param_hdr.type;
3402 break;
3403
3404 case SCTP_ERROR_REQ_REFUSED:
3405 case SCTP_ERROR_DEL_LAST_IP:
3406 case SCTP_ERROR_DEL_SRC_IP:
3407 default:
3408 break;
3409 }
3410
3411
3412
3413
3414 length = ntohs(asconf_param->param_hdr.length);
3415 asconf_param = (void *)asconf_param + length;
3416 asconf_len -= length;
3417 }
3418
3419 if (no_err && asoc->src_out_of_asoc_ok) {
3420 asoc->src_out_of_asoc_ok = 0;
3421 sctp_transport_immediate_rtx(asoc->peer.primary_path);
3422 }
3423
3424
3425 list_del_init(&asconf->transmitted_list);
3426 sctp_chunk_free(asconf);
3427 asoc->addip_last_asconf = NULL;
3428
3429 return retval;
3430}
3431
3432
3433struct sctp_chunk *sctp_make_fwdtsn(const struct sctp_association *asoc,
3434 __u32 new_cum_tsn, size_t nstreams,
3435 struct sctp_fwdtsn_skip *skiplist)
3436{
3437 struct sctp_chunk *retval = NULL;
3438 struct sctp_fwdtsn_hdr ftsn_hdr;
3439 struct sctp_fwdtsn_skip skip;
3440 size_t hint;
3441 int i;
3442
3443 hint = (nstreams + 1) * sizeof(__u32);
3444
3445 retval = sctp_make_chunk(asoc, SCTP_CID_FWD_TSN, 0, hint);
3446
3447 if (!retval)
3448 return NULL;
3449
3450 ftsn_hdr.new_cum_tsn = htonl(new_cum_tsn);
3451 retval->subh.fwdtsn_hdr =
3452 sctp_addto_chunk(retval, sizeof(ftsn_hdr), &ftsn_hdr);
3453
3454 for (i = 0; i < nstreams; i++) {
3455 skip.stream = skiplist[i].stream;
3456 skip.ssn = skiplist[i].ssn;
3457 sctp_addto_chunk(retval, sizeof(skip), &skip);
3458 }
3459
3460 return retval;
3461}
3462