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