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