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