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