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#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
32
33#include <crypto/hash.h>
34#include <linux/types.h>
35#include <linux/kernel.h>
36#include <linux/ip.h>
37#include <linux/ipv6.h>
38#include <linux/net.h>
39#include <linux/inet.h>
40#include <linux/scatterlist.h>
41#include <linux/slab.h>
42#include <net/sock.h>
43
44#include <linux/skbuff.h>
45#include <linux/random.h>
46#include <net/sctp/sctp.h>
47#include <net/sctp/sm.h>
48
49static struct sctp_chunk *sctp_make_control(const struct sctp_association *asoc,
50 __u8 type, __u8 flags, int paylen,
51 gfp_t gfp);
52static struct sctp_chunk *sctp_make_data(const struct sctp_association *asoc,
53 __u8 flags, int paylen, gfp_t gfp);
54static struct sctp_chunk *_sctp_make_chunk(const struct sctp_association *asoc,
55 __u8 type, __u8 flags, int paylen,
56 gfp_t gfp);
57static struct sctp_cookie_param *sctp_pack_cookie(
58 const struct sctp_endpoint *ep,
59 const struct sctp_association *asoc,
60 const struct sctp_chunk *init_chunk,
61 int *cookie_len,
62 const __u8 *raw_addrs, int addrs_len);
63static int sctp_process_param(struct sctp_association *asoc,
64 union sctp_params param,
65 const union sctp_addr *peer_addr,
66 gfp_t gfp);
67static void *sctp_addto_param(struct sctp_chunk *chunk, int len,
68 const void *data);
69
70
71static void sctp_control_release_owner(struct sk_buff *skb)
72{
73 struct sctp_chunk *chunk = skb_shinfo(skb)->destructor_arg;
74
75 if (chunk->shkey) {
76 struct sctp_shared_key *shkey = chunk->shkey;
77 struct sctp_association *asoc = chunk->asoc;
78
79
80
81
82
83 if (shkey->deactivated && !list_empty(&shkey->key_list) &&
84 refcount_read(&shkey->refcnt) == 2) {
85 struct sctp_ulpevent *ev;
86
87 ev = sctp_ulpevent_make_authkey(asoc, shkey->key_id,
88 SCTP_AUTH_FREE_KEY,
89 GFP_KERNEL);
90 if (ev)
91 asoc->stream.si->enqueue_event(&asoc->ulpq, ev);
92 }
93 sctp_auth_shkey_release(chunk->shkey);
94 }
95}
96
97static void sctp_control_set_owner_w(struct sctp_chunk *chunk)
98{
99 struct sctp_association *asoc = chunk->asoc;
100 struct sk_buff *skb = chunk->skb;
101
102
103
104
105
106
107
108
109 if (chunk->auth) {
110 chunk->shkey = asoc->shkey;
111 sctp_auth_shkey_hold(chunk->shkey);
112 }
113 skb->sk = asoc ? asoc->base.sk : NULL;
114 skb_shinfo(skb)->destructor_arg = chunk;
115 skb->destructor = sctp_control_release_owner;
116}
117
118
119int sctp_chunk_iif(const struct sctp_chunk *chunk)
120{
121 struct sk_buff *skb = chunk->skb;
122
123 return SCTP_INPUT_CB(skb)->af->skb_iif(skb);
124}
125
126
127
128
129
130
131static const struct sctp_paramhdr ecap_param = {
132 SCTP_PARAM_ECN_CAPABLE,
133 cpu_to_be16(sizeof(struct sctp_paramhdr)),
134};
135static const struct sctp_paramhdr prsctp_param = {
136 SCTP_PARAM_FWD_TSN_SUPPORT,
137 cpu_to_be16(sizeof(struct sctp_paramhdr)),
138};
139
140
141
142
143int sctp_init_cause(struct sctp_chunk *chunk, __be16 cause_code,
144 size_t paylen)
145{
146 struct sctp_errhdr err;
147 __u16 len;
148
149
150 err.cause = cause_code;
151 len = sizeof(err) + paylen;
152 err.length = htons(len);
153
154 if (skb_tailroom(chunk->skb) < len)
155 return -ENOSPC;
156
157 chunk->subh.err_hdr = sctp_addto_chunk(chunk, sizeof(err), &err);
158
159 return 0;
160}
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206struct sctp_chunk *sctp_make_init(const struct sctp_association *asoc,
207 const struct sctp_bind_addr *bp,
208 gfp_t gfp, int vparam_len)
209{
210 struct net *net = sock_net(asoc->base.sk);
211 struct sctp_supported_ext_param ext_param;
212 struct sctp_adaptation_ind_param aiparam;
213 struct sctp_paramhdr *auth_chunks = NULL;
214 struct sctp_paramhdr *auth_hmacs = NULL;
215 struct sctp_supported_addrs_param sat;
216 struct sctp_endpoint *ep = asoc->ep;
217 struct sctp_chunk *retval = NULL;
218 int num_types, addrs_len = 0;
219 struct sctp_inithdr init;
220 union sctp_params addrs;
221 struct sctp_sock *sp;
222 __u8 extensions[5];
223 size_t chunksize;
224 __be16 types[2];
225 int num_ext = 0;
226
227
228
229
230
231
232
233
234 addrs = sctp_bind_addrs_to_raw(bp, &addrs_len, gfp);
235
236 init.init_tag = htonl(asoc->c.my_vtag);
237 init.a_rwnd = htonl(asoc->rwnd);
238 init.num_outbound_streams = htons(asoc->c.sinit_num_ostreams);
239 init.num_inbound_streams = htons(asoc->c.sinit_max_instreams);
240 init.initial_tsn = htonl(asoc->c.initial_tsn);
241
242
243 sp = sctp_sk(asoc->base.sk);
244 num_types = sp->pf->supported_addrs(sp, types);
245
246 chunksize = sizeof(init) + addrs_len;
247 chunksize += SCTP_PAD4(SCTP_SAT_LEN(num_types));
248 chunksize += sizeof(ecap_param);
249
250 if (asoc->ep->prsctp_enable)
251 chunksize += sizeof(prsctp_param);
252
253
254
255
256
257
258 if (net->sctp.addip_enable) {
259 extensions[num_ext] = SCTP_CID_ASCONF;
260 extensions[num_ext+1] = SCTP_CID_ASCONF_ACK;
261 num_ext += 2;
262 }
263
264 if (asoc->ep->reconf_enable) {
265 extensions[num_ext] = SCTP_CID_RECONF;
266 num_ext += 1;
267 }
268
269 if (sp->adaptation_ind)
270 chunksize += sizeof(aiparam);
271
272 if (asoc->ep->intl_enable) {
273 extensions[num_ext] = SCTP_CID_I_DATA;
274 num_ext += 1;
275 }
276
277 chunksize += vparam_len;
278
279
280 if (ep->auth_enable) {
281
282 chunksize += sizeof(asoc->c.auth_random);
283
284
285 auth_hmacs = (struct sctp_paramhdr *)asoc->c.auth_hmacs;
286 if (auth_hmacs->length)
287 chunksize += SCTP_PAD4(ntohs(auth_hmacs->length));
288 else
289 auth_hmacs = NULL;
290
291
292 auth_chunks = (struct sctp_paramhdr *)asoc->c.auth_chunks;
293 if (auth_chunks->length)
294 chunksize += SCTP_PAD4(ntohs(auth_chunks->length));
295 else
296 auth_chunks = NULL;
297
298 extensions[num_ext] = SCTP_CID_AUTH;
299 num_ext += 1;
300 }
301
302
303 if (num_ext)
304 chunksize += SCTP_PAD4(sizeof(ext_param) + 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 = htons(sizeof(ext_param) + num_ext);
347 sctp_addto_chunk(retval, sizeof(ext_param), &ext_param);
348 sctp_addto_param(retval, num_ext, extensions);
349 }
350
351 if (asoc->ep->prsctp_enable)
352 sctp_addto_chunk(retval, sizeof(prsctp_param), &prsctp_param);
353
354 if (sp->adaptation_ind) {
355 aiparam.param_hdr.type = SCTP_PARAM_ADAPTATION_LAYER_IND;
356 aiparam.param_hdr.length = htons(sizeof(aiparam));
357 aiparam.adaptation_ind = htonl(sp->adaptation_ind);
358 sctp_addto_chunk(retval, sizeof(aiparam), &aiparam);
359 }
360
361
362 if (ep->auth_enable) {
363 sctp_addto_chunk(retval, sizeof(asoc->c.auth_random),
364 asoc->c.auth_random);
365 if (auth_hmacs)
366 sctp_addto_chunk(retval, ntohs(auth_hmacs->length),
367 auth_hmacs);
368 if (auth_chunks)
369 sctp_addto_chunk(retval, ntohs(auth_chunks->length),
370 auth_chunks);
371 }
372nodata:
373 kfree(addrs.v);
374 return retval;
375}
376
377struct sctp_chunk *sctp_make_init_ack(const struct sctp_association *asoc,
378 const struct sctp_chunk *chunk,
379 gfp_t gfp, int unkparam_len)
380{
381 struct sctp_supported_ext_param ext_param;
382 struct sctp_adaptation_ind_param aiparam;
383 struct sctp_paramhdr *auth_chunks = NULL;
384 struct sctp_paramhdr *auth_random = NULL;
385 struct sctp_paramhdr *auth_hmacs = NULL;
386 struct sctp_chunk *retval = NULL;
387 struct sctp_cookie_param *cookie;
388 struct sctp_inithdr initack;
389 union sctp_params addrs;
390 struct sctp_sock *sp;
391 __u8 extensions[5];
392 size_t chunksize;
393 int num_ext = 0;
394 int cookie_len;
395 int addrs_len;
396
397
398 addrs = sctp_bind_addrs_to_raw(&asoc->base.bind_addr, &addrs_len, gfp);
399
400 initack.init_tag = htonl(asoc->c.my_vtag);
401 initack.a_rwnd = htonl(asoc->rwnd);
402 initack.num_outbound_streams = htons(asoc->c.sinit_num_ostreams);
403 initack.num_inbound_streams = htons(asoc->c.sinit_max_instreams);
404 initack.initial_tsn = htonl(asoc->c.initial_tsn);
405
406
407
408
409 cookie = sctp_pack_cookie(asoc->ep, asoc, chunk, &cookie_len,
410 addrs.v, addrs_len);
411 if (!cookie)
412 goto nomem_cookie;
413
414
415
416
417 sp = sctp_sk(asoc->base.sk);
418 chunksize = sizeof(initack) + addrs_len + cookie_len + unkparam_len;
419
420
421 if (asoc->peer.ecn_capable)
422 chunksize += sizeof(ecap_param);
423
424 if (asoc->peer.prsctp_capable)
425 chunksize += sizeof(prsctp_param);
426
427 if (asoc->peer.asconf_capable) {
428 extensions[num_ext] = SCTP_CID_ASCONF;
429 extensions[num_ext+1] = SCTP_CID_ASCONF_ACK;
430 num_ext += 2;
431 }
432
433 if (asoc->peer.reconf_capable) {
434 extensions[num_ext] = SCTP_CID_RECONF;
435 num_ext += 1;
436 }
437
438 if (sp->adaptation_ind)
439 chunksize += sizeof(aiparam);
440
441 if (asoc->peer.intl_capable) {
442 extensions[num_ext] = SCTP_CID_I_DATA;
443 num_ext += 1;
444 }
445
446 if (asoc->peer.auth_capable) {
447 auth_random = (struct sctp_paramhdr *)asoc->c.auth_random;
448 chunksize += ntohs(auth_random->length);
449
450 auth_hmacs = (struct sctp_paramhdr *)asoc->c.auth_hmacs;
451 if (auth_hmacs->length)
452 chunksize += SCTP_PAD4(ntohs(auth_hmacs->length));
453 else
454 auth_hmacs = NULL;
455
456 auth_chunks = (struct sctp_paramhdr *)asoc->c.auth_chunks;
457 if (auth_chunks->length)
458 chunksize += SCTP_PAD4(ntohs(auth_chunks->length));
459 else
460 auth_chunks = NULL;
461
462 extensions[num_ext] = SCTP_CID_AUTH;
463 num_ext += 1;
464 }
465
466 if (num_ext)
467 chunksize += SCTP_PAD4(sizeof(ext_param) + 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 if (chunk->transport)
484 retval->transport =
485 sctp_assoc_lookup_paddr(asoc,
486 &chunk->transport->ipaddr);
487
488 retval->subh.init_hdr =
489 sctp_addto_chunk(retval, sizeof(initack), &initack);
490 retval->param_hdr.v = sctp_addto_chunk(retval, addrs_len, addrs.v);
491 sctp_addto_chunk(retval, cookie_len, cookie);
492 if (asoc->peer.ecn_capable)
493 sctp_addto_chunk(retval, sizeof(ecap_param), &ecap_param);
494 if (num_ext) {
495 ext_param.param_hdr.type = SCTP_PARAM_SUPPORTED_EXT;
496 ext_param.param_hdr.length = htons(sizeof(ext_param) + num_ext);
497 sctp_addto_chunk(retval, sizeof(ext_param), &ext_param);
498 sctp_addto_param(retval, num_ext, extensions);
499 }
500 if (asoc->peer.prsctp_capable)
501 sctp_addto_chunk(retval, sizeof(prsctp_param), &prsctp_param);
502
503 if (sp->adaptation_ind) {
504 aiparam.param_hdr.type = SCTP_PARAM_ADAPTATION_LAYER_IND;
505 aiparam.param_hdr.length = htons(sizeof(aiparam));
506 aiparam.adaptation_ind = htonl(sp->adaptation_ind);
507 sctp_addto_chunk(retval, sizeof(aiparam), &aiparam);
508 }
509
510 if (asoc->peer.auth_capable) {
511 sctp_addto_chunk(retval, ntohs(auth_random->length),
512 auth_random);
513 if (auth_hmacs)
514 sctp_addto_chunk(retval, ntohs(auth_hmacs->length),
515 auth_hmacs);
516 if (auth_chunks)
517 sctp_addto_chunk(retval, ntohs(auth_chunks->length),
518 auth_chunks);
519 }
520
521
522 retval->asoc = (struct sctp_association *) asoc;
523
524nomem_chunk:
525 kfree(cookie);
526nomem_cookie:
527 kfree(addrs.v);
528 return retval;
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
564
565struct sctp_chunk *sctp_make_cookie_echo(const struct sctp_association *asoc,
566 const struct sctp_chunk *chunk)
567{
568 struct sctp_chunk *retval;
569 int cookie_len;
570 void *cookie;
571
572 cookie = asoc->peer.cookie;
573 cookie_len = asoc->peer.cookie_len;
574
575
576 retval = sctp_make_control(asoc, SCTP_CID_COOKIE_ECHO, 0,
577 cookie_len, GFP_ATOMIC);
578 if (!retval)
579 goto nodata;
580 retval->subh.cookie_hdr =
581 sctp_addto_chunk(retval, cookie_len, cookie);
582
583
584
585
586
587
588
589
590
591
592 if (chunk)
593 retval->transport = chunk->transport;
594
595nodata:
596 return retval;
597}
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617struct sctp_chunk *sctp_make_cookie_ack(const struct sctp_association *asoc,
618 const struct sctp_chunk *chunk)
619{
620 struct sctp_chunk *retval;
621
622 retval = sctp_make_control(asoc, SCTP_CID_COOKIE_ACK, 0, 0, GFP_ATOMIC);
623
624
625
626
627
628
629
630
631
632
633 if (retval && chunk && chunk->transport)
634 retval->transport =
635 sctp_assoc_lookup_paddr(asoc,
636 &chunk->transport->ipaddr);
637
638 return retval;
639}
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664struct sctp_chunk *sctp_make_cwr(const struct sctp_association *asoc,
665 const __u32 lowest_tsn,
666 const struct sctp_chunk *chunk)
667{
668 struct sctp_chunk *retval;
669 struct sctp_cwrhdr cwr;
670
671 cwr.lowest_tsn = htonl(lowest_tsn);
672 retval = sctp_make_control(asoc, SCTP_CID_ECN_CWR, 0,
673 sizeof(cwr), GFP_ATOMIC);
674
675 if (!retval)
676 goto nodata;
677
678 retval->subh.ecn_cwr_hdr =
679 sctp_addto_chunk(retval, sizeof(cwr), &cwr);
680
681
682
683
684
685
686
687
688
689
690
691 if (chunk)
692 retval->transport = chunk->transport;
693
694nodata:
695 return retval;
696}
697
698
699struct sctp_chunk *sctp_make_ecne(const struct sctp_association *asoc,
700 const __u32 lowest_tsn)
701{
702 struct sctp_chunk *retval;
703 struct sctp_ecnehdr ecne;
704
705 ecne.lowest_tsn = htonl(lowest_tsn);
706 retval = sctp_make_control(asoc, SCTP_CID_ECN_ECNE, 0,
707 sizeof(ecne), GFP_ATOMIC);
708 if (!retval)
709 goto nodata;
710 retval->subh.ecne_hdr =
711 sctp_addto_chunk(retval, sizeof(ecne), &ecne);
712
713nodata:
714 return retval;
715}
716
717
718
719
720struct sctp_chunk *sctp_make_datafrag_empty(const struct sctp_association *asoc,
721 const struct sctp_sndrcvinfo *sinfo,
722 int len, __u8 flags, gfp_t gfp)
723{
724 struct sctp_chunk *retval;
725 struct sctp_datahdr dp;
726
727
728
729
730 memset(&dp, 0, sizeof(dp));
731 dp.ppid = sinfo->sinfo_ppid;
732 dp.stream = htons(sinfo->sinfo_stream);
733
734
735 if (sinfo->sinfo_flags & SCTP_UNORDERED)
736 flags |= SCTP_DATA_UNORDERED;
737
738 retval = sctp_make_data(asoc, flags, sizeof(dp) + len, gfp);
739 if (!retval)
740 return NULL;
741
742 retval->subh.data_hdr = sctp_addto_chunk(retval, sizeof(dp), &dp);
743 memcpy(&retval->sinfo, sinfo, sizeof(struct sctp_sndrcvinfo));
744
745 return retval;
746}
747
748
749
750
751
752struct sctp_chunk *sctp_make_sack(struct sctp_association *asoc)
753{
754 struct sctp_tsnmap *map = (struct sctp_tsnmap *)&asoc->peer.tsn_map;
755 struct sctp_gap_ack_block gabs[SCTP_MAX_GABS];
756 __u16 num_gabs, num_dup_tsns;
757 struct sctp_transport *trans;
758 struct sctp_chunk *retval;
759 struct sctp_sackhdr sack;
760 __u32 ctsn;
761 int len;
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 asoc->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 (++asoc->peer.sack_generation == 0) {
842 list_for_each_entry(trans, &asoc->peer.transport_addr_list,
843 transports)
844 trans->sack_generation = 0;
845 asoc->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_shutdownhdr shut;
856 struct sctp_chunk *retval;
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(shut), 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,
973 __u32 tsn)
974{
975 struct sctp_chunk *retval;
976 __be32 payload;
977
978 retval = sctp_make_abort(asoc, chunk,
979 sizeof(struct sctp_errhdr) + sizeof(tsn));
980
981 if (!retval)
982 goto no_mem;
983
984
985 payload = htonl(tsn);
986 sctp_init_cause(retval, SCTP_ERROR_NO_DATA, sizeof(payload));
987 sctp_addto_chunk(retval, sizeof(payload), (const void *)&payload);
988
989
990
991
992
993
994
995
996
997
998 if (chunk)
999 retval->transport = chunk->transport;
1000
1001no_mem:
1002 return retval;
1003}
1004
1005
1006struct sctp_chunk *sctp_make_abort_user(const struct sctp_association *asoc,
1007 struct msghdr *msg,
1008 size_t paylen)
1009{
1010 struct sctp_chunk *retval;
1011 void *payload = NULL;
1012 int err;
1013
1014 retval = sctp_make_abort(asoc, NULL,
1015 sizeof(struct sctp_errhdr) + paylen);
1016 if (!retval)
1017 goto err_chunk;
1018
1019 if (paylen) {
1020
1021 payload = kmalloc(paylen, GFP_KERNEL);
1022 if (!payload)
1023 goto err_payload;
1024
1025 err = memcpy_from_msg(payload, msg, paylen);
1026 if (err < 0)
1027 goto err_copy;
1028 }
1029
1030 sctp_init_cause(retval, SCTP_ERROR_USER_ABORT, paylen);
1031 sctp_addto_chunk(retval, paylen, payload);
1032
1033 if (paylen)
1034 kfree(payload);
1035
1036 return retval;
1037
1038err_copy:
1039 kfree(payload);
1040err_payload:
1041 sctp_chunk_free(retval);
1042 retval = NULL;
1043err_chunk:
1044 return retval;
1045}
1046
1047
1048
1049
1050static void *sctp_addto_param(struct sctp_chunk *chunk, int len,
1051 const void *data)
1052{
1053 int chunklen = ntohs(chunk->chunk_hdr->length);
1054 void *target;
1055
1056 target = skb_put(chunk->skb, len);
1057
1058 if (data)
1059 memcpy(target, data, len);
1060 else
1061 memset(target, 0, len);
1062
1063
1064 chunk->chunk_hdr->length = htons(chunklen + len);
1065 chunk->chunk_end = skb_tail_pointer(chunk->skb);
1066
1067 return target;
1068}
1069
1070
1071struct sctp_chunk *sctp_make_abort_violation(
1072 const struct sctp_association *asoc,
1073 const struct sctp_chunk *chunk,
1074 const __u8 *payload,
1075 const size_t paylen)
1076{
1077 struct sctp_chunk *retval;
1078 struct sctp_paramhdr phdr;
1079
1080 retval = sctp_make_abort(asoc, chunk, sizeof(struct sctp_errhdr) +
1081 paylen + sizeof(phdr));
1082 if (!retval)
1083 goto end;
1084
1085 sctp_init_cause(retval, SCTP_ERROR_PROTO_VIOLATION, paylen +
1086 sizeof(phdr));
1087
1088 phdr.type = htons(chunk->chunk_hdr->type);
1089 phdr.length = chunk->chunk_hdr->length;
1090 sctp_addto_chunk(retval, paylen, payload);
1091 sctp_addto_param(retval, sizeof(phdr), &phdr);
1092
1093end:
1094 return retval;
1095}
1096
1097struct sctp_chunk *sctp_make_violation_paramlen(
1098 const struct sctp_association *asoc,
1099 const struct sctp_chunk *chunk,
1100 struct sctp_paramhdr *param)
1101{
1102 static const char error[] = "The following parameter had invalid length:";
1103 size_t payload_len = sizeof(error) + sizeof(struct sctp_errhdr) +
1104 sizeof(*param);
1105 struct sctp_chunk *retval;
1106
1107 retval = sctp_make_abort(asoc, chunk, payload_len);
1108 if (!retval)
1109 goto nodata;
1110
1111 sctp_init_cause(retval, SCTP_ERROR_PROTO_VIOLATION,
1112 sizeof(error) + sizeof(*param));
1113 sctp_addto_chunk(retval, sizeof(error), error);
1114 sctp_addto_param(retval, sizeof(*param), param);
1115
1116nodata:
1117 return retval;
1118}
1119
1120struct sctp_chunk *sctp_make_violation_max_retrans(
1121 const struct sctp_association *asoc,
1122 const struct sctp_chunk *chunk)
1123{
1124 static const char error[] = "Association exceeded its max_retrans count";
1125 size_t payload_len = sizeof(error) + sizeof(struct sctp_errhdr);
1126 struct sctp_chunk *retval;
1127
1128 retval = sctp_make_abort(asoc, chunk, payload_len);
1129 if (!retval)
1130 goto nodata;
1131
1132 sctp_init_cause(retval, SCTP_ERROR_PROTO_VIOLATION, sizeof(error));
1133 sctp_addto_chunk(retval, sizeof(error), error);
1134
1135nodata:
1136 return retval;
1137}
1138
1139
1140struct sctp_chunk *sctp_make_heartbeat(const struct sctp_association *asoc,
1141 const struct sctp_transport *transport)
1142{
1143 struct sctp_sender_hb_info hbinfo;
1144 struct sctp_chunk *retval;
1145
1146 retval = sctp_make_control(asoc, SCTP_CID_HEARTBEAT, 0,
1147 sizeof(hbinfo), GFP_ATOMIC);
1148
1149 if (!retval)
1150 goto nodata;
1151
1152 hbinfo.param_hdr.type = SCTP_PARAM_HEARTBEAT_INFO;
1153 hbinfo.param_hdr.length = htons(sizeof(hbinfo));
1154 hbinfo.daddr = transport->ipaddr;
1155 hbinfo.sent_at = jiffies;
1156 hbinfo.hb_nonce = transport->hb_nonce;
1157
1158
1159
1160
1161 retval->transport = (struct sctp_transport *) transport;
1162 retval->subh.hbs_hdr = sctp_addto_chunk(retval, sizeof(hbinfo),
1163 &hbinfo);
1164
1165nodata:
1166 return retval;
1167}
1168
1169struct sctp_chunk *sctp_make_heartbeat_ack(const struct sctp_association *asoc,
1170 const struct sctp_chunk *chunk,
1171 const void *payload,
1172 const size_t paylen)
1173{
1174 struct sctp_chunk *retval;
1175
1176 retval = sctp_make_control(asoc, SCTP_CID_HEARTBEAT_ACK, 0, paylen,
1177 GFP_ATOMIC);
1178 if (!retval)
1179 goto nodata;
1180
1181 retval->subh.hbs_hdr = sctp_addto_chunk(retval, paylen, payload);
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192 if (chunk)
1193 retval->transport = chunk->transport;
1194
1195nodata:
1196 return retval;
1197}
1198
1199
1200
1201
1202static struct sctp_chunk *sctp_make_op_error_space(
1203 const struct sctp_association *asoc,
1204 const struct sctp_chunk *chunk,
1205 size_t size)
1206{
1207 struct sctp_chunk *retval;
1208
1209 retval = sctp_make_control(asoc, SCTP_CID_ERROR, 0,
1210 sizeof(struct sctp_errhdr) + size,
1211 GFP_ATOMIC);
1212 if (!retval)
1213 goto nodata;
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223 if (chunk)
1224 retval->transport = chunk->transport;
1225
1226nodata:
1227 return retval;
1228}
1229
1230
1231
1232
1233
1234
1235
1236
1237static inline struct sctp_chunk *sctp_make_op_error_limited(
1238 const struct sctp_association *asoc,
1239 const struct sctp_chunk *chunk)
1240{
1241 size_t size = SCTP_DEFAULT_MAXSEGMENT;
1242 struct sctp_sock *sp = NULL;
1243
1244 if (asoc) {
1245 size = min_t(size_t, size, asoc->pathmtu);
1246 sp = sctp_sk(asoc->base.sk);
1247 }
1248
1249 size = sctp_mtu_payload(sp, size, sizeof(struct sctp_errhdr));
1250
1251 return sctp_make_op_error_space(asoc, chunk, size);
1252}
1253
1254
1255struct sctp_chunk *sctp_make_op_error(const struct sctp_association *asoc,
1256 const struct sctp_chunk *chunk,
1257 __be16 cause_code, const void *payload,
1258 size_t paylen, size_t reserve_tail)
1259{
1260 struct sctp_chunk *retval;
1261
1262 retval = sctp_make_op_error_space(asoc, chunk, paylen + reserve_tail);
1263 if (!retval)
1264 goto nodata;
1265
1266 sctp_init_cause(retval, cause_code, paylen + reserve_tail);
1267 sctp_addto_chunk(retval, paylen, payload);
1268 if (reserve_tail)
1269 sctp_addto_param(retval, reserve_tail, NULL);
1270
1271nodata:
1272 return retval;
1273}
1274
1275struct sctp_chunk *sctp_make_auth(const struct sctp_association *asoc,
1276 __u16 key_id)
1277{
1278 struct sctp_authhdr auth_hdr;
1279 struct sctp_hmac *hmac_desc;
1280 struct sctp_chunk *retval;
1281
1282
1283 hmac_desc = sctp_auth_asoc_get_hmac(asoc);
1284 if (unlikely(!hmac_desc))
1285 return NULL;
1286
1287 retval = sctp_make_control(asoc, SCTP_CID_AUTH, 0,
1288 hmac_desc->hmac_len + sizeof(auth_hdr),
1289 GFP_ATOMIC);
1290 if (!retval)
1291 return NULL;
1292
1293 auth_hdr.hmac_id = htons(hmac_desc->hmac_id);
1294 auth_hdr.shkey_id = htons(key_id);
1295
1296 retval->subh.auth_hdr = sctp_addto_chunk(retval, sizeof(auth_hdr),
1297 &auth_hdr);
1298
1299 skb_put_zero(retval->skb, hmac_desc->hmac_len);
1300
1301
1302 retval->chunk_hdr->length =
1303 htons(ntohs(retval->chunk_hdr->length) + hmac_desc->hmac_len);
1304 retval->chunk_end = skb_tail_pointer(retval->skb);
1305
1306 return retval;
1307}
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324struct sctp_chunk *sctp_chunkify(struct sk_buff *skb,
1325 const struct sctp_association *asoc,
1326 struct sock *sk, gfp_t gfp)
1327{
1328 struct sctp_chunk *retval;
1329
1330 retval = kmem_cache_zalloc(sctp_chunk_cachep, gfp);
1331
1332 if (!retval)
1333 goto nodata;
1334 if (!sk)
1335 pr_debug("%s: chunkifying skb:%p w/o an sk\n", __func__, skb);
1336
1337 INIT_LIST_HEAD(&retval->list);
1338 retval->skb = skb;
1339 retval->asoc = (struct sctp_association *)asoc;
1340 retval->singleton = 1;
1341
1342 retval->fast_retransmit = SCTP_CAN_FRTX;
1343
1344
1345 INIT_LIST_HEAD(&retval->transmitted_list);
1346 INIT_LIST_HEAD(&retval->frag_list);
1347 SCTP_DBG_OBJCNT_INC(chunk);
1348 refcount_set(&retval->refcnt, 1);
1349
1350nodata:
1351 return retval;
1352}
1353
1354
1355void sctp_init_addrs(struct sctp_chunk *chunk, union sctp_addr *src,
1356 union sctp_addr *dest)
1357{
1358 memcpy(&chunk->source, src, sizeof(union sctp_addr));
1359 memcpy(&chunk->dest, dest, sizeof(union sctp_addr));
1360}
1361
1362
1363const union sctp_addr *sctp_source(const struct sctp_chunk *chunk)
1364{
1365
1366 if (chunk->transport) {
1367 return &chunk->transport->ipaddr;
1368 } else {
1369
1370 return &chunk->source;
1371 }
1372}
1373
1374
1375
1376
1377static struct sctp_chunk *_sctp_make_chunk(const struct sctp_association *asoc,
1378 __u8 type, __u8 flags, int paylen,
1379 gfp_t gfp)
1380{
1381 struct sctp_chunkhdr *chunk_hdr;
1382 struct sctp_chunk *retval;
1383 struct sk_buff *skb;
1384 struct sock *sk;
1385 int chunklen;
1386
1387 chunklen = SCTP_PAD4(sizeof(*chunk_hdr) + paylen);
1388 if (chunklen > SCTP_MAX_CHUNK_LEN)
1389 goto nodata;
1390
1391
1392 skb = alloc_skb(chunklen, gfp);
1393 if (!skb)
1394 goto nodata;
1395
1396
1397 chunk_hdr = (struct sctp_chunkhdr *)skb_put(skb, sizeof(*chunk_hdr));
1398 chunk_hdr->type = type;
1399 chunk_hdr->flags = flags;
1400 chunk_hdr->length = htons(sizeof(*chunk_hdr));
1401
1402 sk = asoc ? asoc->base.sk : NULL;
1403 retval = sctp_chunkify(skb, asoc, sk, gfp);
1404 if (!retval) {
1405 kfree_skb(skb);
1406 goto nodata;
1407 }
1408
1409 retval->chunk_hdr = chunk_hdr;
1410 retval->chunk_end = ((__u8 *)chunk_hdr) + sizeof(*chunk_hdr);
1411
1412
1413 if (sctp_auth_send_cid(type, asoc))
1414 retval->auth = 1;
1415
1416 return retval;
1417nodata:
1418 return NULL;
1419}
1420
1421static struct sctp_chunk *sctp_make_data(const struct sctp_association *asoc,
1422 __u8 flags, int paylen, gfp_t gfp)
1423{
1424 return _sctp_make_chunk(asoc, SCTP_CID_DATA, flags, paylen, gfp);
1425}
1426
1427struct sctp_chunk *sctp_make_idata(const struct sctp_association *asoc,
1428 __u8 flags, int paylen, gfp_t gfp)
1429{
1430 return _sctp_make_chunk(asoc, SCTP_CID_I_DATA, flags, paylen, gfp);
1431}
1432
1433static struct sctp_chunk *sctp_make_control(const struct sctp_association *asoc,
1434 __u8 type, __u8 flags, int paylen,
1435 gfp_t gfp)
1436{
1437 struct sctp_chunk *chunk;
1438
1439 chunk = _sctp_make_chunk(asoc, type, flags, paylen, gfp);
1440 if (chunk)
1441 sctp_control_set_owner_w(chunk);
1442
1443 return chunk;
1444}
1445
1446
1447static void sctp_chunk_destroy(struct sctp_chunk *chunk)
1448{
1449 BUG_ON(!list_empty(&chunk->list));
1450 list_del_init(&chunk->transmitted_list);
1451
1452 consume_skb(chunk->skb);
1453 consume_skb(chunk->auth_chunk);
1454
1455 SCTP_DBG_OBJCNT_DEC(chunk);
1456 kmem_cache_free(sctp_chunk_cachep, chunk);
1457}
1458
1459
1460void sctp_chunk_free(struct sctp_chunk *chunk)
1461{
1462
1463 if (chunk->msg)
1464 sctp_datamsg_put(chunk->msg);
1465
1466 sctp_chunk_put(chunk);
1467}
1468
1469
1470void sctp_chunk_hold(struct sctp_chunk *ch)
1471{
1472 refcount_inc(&ch->refcnt);
1473}
1474
1475
1476void sctp_chunk_put(struct sctp_chunk *ch)
1477{
1478 if (refcount_dec_and_test(&ch->refcnt))
1479 sctp_chunk_destroy(ch);
1480}
1481
1482
1483
1484
1485void *sctp_addto_chunk(struct sctp_chunk *chunk, int len, const void *data)
1486{
1487 int chunklen = ntohs(chunk->chunk_hdr->length);
1488 int padlen = SCTP_PAD4(chunklen) - chunklen;
1489 void *target;
1490
1491 skb_put_zero(chunk->skb, padlen);
1492 target = skb_put_data(chunk->skb, data, len);
1493
1494
1495 chunk->chunk_hdr->length = htons(chunklen + padlen + len);
1496 chunk->chunk_end = skb_tail_pointer(chunk->skb);
1497
1498 return target;
1499}
1500
1501
1502
1503
1504
1505int sctp_user_addto_chunk(struct sctp_chunk *chunk, int len,
1506 struct iov_iter *from)
1507{
1508 void *target;
1509
1510
1511 target = skb_put(chunk->skb, len);
1512
1513
1514 if (!copy_from_iter_full(target, len, from))
1515 return -EFAULT;
1516
1517
1518 chunk->chunk_hdr->length =
1519 htons(ntohs(chunk->chunk_hdr->length) + len);
1520 chunk->chunk_end = skb_tail_pointer(chunk->skb);
1521
1522 return 0;
1523}
1524
1525
1526
1527
1528void sctp_chunk_assign_ssn(struct sctp_chunk *chunk)
1529{
1530 struct sctp_stream *stream;
1531 struct sctp_chunk *lchunk;
1532 struct sctp_datamsg *msg;
1533 __u16 ssn, sid;
1534
1535 if (chunk->has_ssn)
1536 return;
1537
1538
1539 sid = ntohs(chunk->subh.data_hdr->stream);
1540 stream = &chunk->asoc->stream;
1541
1542
1543
1544
1545 msg = chunk->msg;
1546 list_for_each_entry(lchunk, &msg->chunks, frag_list) {
1547 if (lchunk->chunk_hdr->flags & SCTP_DATA_UNORDERED) {
1548 ssn = 0;
1549 } else {
1550 if (lchunk->chunk_hdr->flags & SCTP_DATA_LAST_FRAG)
1551 ssn = sctp_ssn_next(stream, out, sid);
1552 else
1553 ssn = sctp_ssn_peek(stream, out, sid);
1554 }
1555
1556 lchunk->subh.data_hdr->ssn = htons(ssn);
1557 lchunk->has_ssn = 1;
1558 }
1559}
1560
1561
1562
1563
1564void sctp_chunk_assign_tsn(struct sctp_chunk *chunk)
1565{
1566 if (!chunk->has_tsn) {
1567
1568
1569
1570 chunk->subh.data_hdr->tsn =
1571 htonl(sctp_association_get_next_tsn(chunk->asoc));
1572 chunk->has_tsn = 1;
1573 }
1574}
1575
1576
1577struct sctp_association *sctp_make_temp_asoc(const struct sctp_endpoint *ep,
1578 struct sctp_chunk *chunk,
1579 gfp_t gfp)
1580{
1581 struct sctp_association *asoc;
1582 enum sctp_scope scope;
1583 struct sk_buff *skb;
1584
1585
1586 scope = sctp_scope(sctp_source(chunk));
1587 asoc = sctp_association_new(ep, ep->base.sk, scope, gfp);
1588 if (!asoc)
1589 goto nodata;
1590 asoc->temp = 1;
1591 skb = chunk->skb;
1592
1593 SCTP_INPUT_CB(skb)->af->from_skb(&asoc->c.peer_addr, skb, 1);
1594
1595nodata:
1596 return asoc;
1597}
1598
1599
1600
1601
1602static struct sctp_cookie_param *sctp_pack_cookie(
1603 const struct sctp_endpoint *ep,
1604 const struct sctp_association *asoc,
1605 const struct sctp_chunk *init_chunk,
1606 int *cookie_len, const __u8 *raw_addrs,
1607 int addrs_len)
1608{
1609 struct sctp_signed_cookie *cookie;
1610 struct sctp_cookie_param *retval;
1611 int headersize, bodysize;
1612
1613
1614
1615
1616 headersize = sizeof(struct sctp_paramhdr) +
1617 (sizeof(struct sctp_signed_cookie) -
1618 sizeof(struct sctp_cookie));
1619 bodysize = sizeof(struct sctp_cookie)
1620 + ntohs(init_chunk->chunk_hdr->length) + addrs_len;
1621
1622
1623
1624
1625 if (bodysize % SCTP_COOKIE_MULTIPLE)
1626 bodysize += SCTP_COOKIE_MULTIPLE
1627 - (bodysize % SCTP_COOKIE_MULTIPLE);
1628 *cookie_len = headersize + bodysize;
1629
1630
1631
1632
1633 retval = kzalloc(*cookie_len, GFP_ATOMIC);
1634 if (!retval)
1635 goto nodata;
1636
1637 cookie = (struct sctp_signed_cookie *) retval->body;
1638
1639
1640 retval->p.type = SCTP_PARAM_STATE_COOKIE;
1641 retval->p.length = htons(*cookie_len);
1642
1643
1644 cookie->c = asoc->c;
1645
1646 cookie->c.raw_addr_list_len = addrs_len;
1647
1648
1649 cookie->c.prsctp_capable = asoc->peer.prsctp_capable;
1650
1651
1652 cookie->c.adaptation_ind = asoc->peer.adaptation_ind;
1653
1654
1655 cookie->c.expiration = ktime_add(asoc->cookie_life,
1656 ktime_get_real());
1657
1658
1659 memcpy(&cookie->c.peer_init[0], init_chunk->chunk_hdr,
1660 ntohs(init_chunk->chunk_hdr->length));
1661
1662
1663 memcpy((__u8 *)&cookie->c.peer_init[0] +
1664 ntohs(init_chunk->chunk_hdr->length), raw_addrs, addrs_len);
1665
1666 if (sctp_sk(ep->base.sk)->hmac) {
1667 SHASH_DESC_ON_STACK(desc, sctp_sk(ep->base.sk)->hmac);
1668 int err;
1669
1670
1671 desc->tfm = sctp_sk(ep->base.sk)->hmac;
1672
1673 err = crypto_shash_setkey(desc->tfm, ep->secret_key,
1674 sizeof(ep->secret_key)) ?:
1675 crypto_shash_digest(desc, (u8 *)&cookie->c, bodysize,
1676 cookie->signature);
1677 shash_desc_zero(desc);
1678 if (err)
1679 goto free_cookie;
1680 }
1681
1682 return retval;
1683
1684free_cookie:
1685 kfree(retval);
1686nodata:
1687 *cookie_len = 0;
1688 return NULL;
1689}
1690
1691
1692struct sctp_association *sctp_unpack_cookie(
1693 const struct sctp_endpoint *ep,
1694 const struct sctp_association *asoc,
1695 struct sctp_chunk *chunk, gfp_t gfp,
1696 int *error, struct sctp_chunk **errp)
1697{
1698 struct sctp_association *retval = NULL;
1699 int headersize, bodysize, fixed_size;
1700 struct sctp_signed_cookie *cookie;
1701 struct sk_buff *skb = chunk->skb;
1702 struct sctp_cookie *bear_cookie;
1703 __u8 *digest = ep->digest;
1704 enum sctp_scope scope;
1705 unsigned int len;
1706 ktime_t kt;
1707
1708
1709
1710
1711 headersize = sizeof(struct sctp_chunkhdr) +
1712 (sizeof(struct sctp_signed_cookie) -
1713 sizeof(struct sctp_cookie));
1714 bodysize = ntohs(chunk->chunk_hdr->length) - headersize;
1715 fixed_size = headersize + sizeof(struct sctp_cookie);
1716
1717
1718
1719
1720
1721 len = ntohs(chunk->chunk_hdr->length);
1722 if (len < fixed_size + sizeof(struct sctp_chunkhdr))
1723 goto malformed;
1724
1725
1726 if (bodysize % SCTP_COOKIE_MULTIPLE)
1727 goto malformed;
1728
1729
1730 cookie = chunk->subh.cookie_hdr;
1731 bear_cookie = &cookie->c;
1732
1733 if (!sctp_sk(ep->base.sk)->hmac)
1734 goto no_hmac;
1735
1736
1737 {
1738 SHASH_DESC_ON_STACK(desc, sctp_sk(ep->base.sk)->hmac);
1739 int err;
1740
1741 desc->tfm = sctp_sk(ep->base.sk)->hmac;
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 suseconds_t usecs = ktime_to_us(ktime_sub(kt, bear_cookie->expiration));
1794 __be32 n = htonl(usecs);
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804 *errp = sctp_make_op_error(asoc, chunk,
1805 SCTP_ERROR_STALE_COOKIE, &n,
1806 sizeof(n), 0);
1807 if (*errp)
1808 *error = -SCTP_IERROR_STALE_COOKIE;
1809 else
1810 *error = -SCTP_IERROR_NOMEM;
1811
1812 goto fail;
1813 }
1814
1815
1816 scope = sctp_scope(sctp_source(chunk));
1817 retval = sctp_association_new(ep, ep->base.sk, scope, gfp);
1818 if (!retval) {
1819 *error = -SCTP_IERROR_NOMEM;
1820 goto fail;
1821 }
1822
1823
1824 retval->peer.port = ntohs(chunk->sctp_hdr->source);
1825
1826
1827 memcpy(&retval->c, bear_cookie, sizeof(*bear_cookie));
1828
1829 if (sctp_assoc_set_bind_addr_from_cookie(retval, bear_cookie,
1830 GFP_ATOMIC) < 0) {
1831 *error = -SCTP_IERROR_NOMEM;
1832 goto fail;
1833 }
1834
1835
1836 if (list_empty(&retval->base.bind_addr.address_list)) {
1837 sctp_add_bind_addr(&retval->base.bind_addr, &chunk->dest,
1838 sizeof(chunk->dest), SCTP_ADDR_SRC,
1839 GFP_ATOMIC);
1840 }
1841
1842 retval->next_tsn = retval->c.initial_tsn;
1843 retval->ctsn_ack_point = retval->next_tsn - 1;
1844 retval->addip_serial = retval->c.initial_tsn;
1845 retval->strreset_outseq = retval->c.initial_tsn;
1846 retval->adv_peer_ack_point = retval->ctsn_ack_point;
1847 retval->peer.prsctp_capable = retval->c.prsctp_capable;
1848 retval->peer.adaptation_ind = retval->c.adaptation_ind;
1849
1850
1851 return retval;
1852
1853fail:
1854 if (retval)
1855 sctp_association_free(retval);
1856
1857 return NULL;
1858
1859malformed:
1860
1861
1862
1863 *error = -SCTP_IERROR_MALFORMED;
1864 goto fail;
1865}
1866
1867
1868
1869
1870
1871struct __sctp_missing {
1872 __be32 num_missing;
1873 __be16 type;
1874} __packed;
1875
1876
1877
1878
1879static int sctp_process_missing_param(const struct sctp_association *asoc,
1880 enum sctp_param paramtype,
1881 struct sctp_chunk *chunk,
1882 struct sctp_chunk **errp)
1883{
1884 struct __sctp_missing report;
1885 __u16 len;
1886
1887 len = SCTP_PAD4(sizeof(report));
1888
1889
1890
1891
1892 if (!*errp)
1893 *errp = sctp_make_op_error_space(asoc, chunk, len);
1894
1895 if (*errp) {
1896 report.num_missing = htonl(1);
1897 report.type = paramtype;
1898 sctp_init_cause(*errp, SCTP_ERROR_MISS_PARAM,
1899 sizeof(report));
1900 sctp_addto_chunk(*errp, sizeof(report), &report);
1901 }
1902
1903
1904 return 0;
1905}
1906
1907
1908static int sctp_process_inv_mandatory(const struct sctp_association *asoc,
1909 struct sctp_chunk *chunk,
1910 struct sctp_chunk **errp)
1911{
1912
1913
1914 if (!*errp)
1915 *errp = sctp_make_op_error_space(asoc, chunk, 0);
1916
1917 if (*errp)
1918 sctp_init_cause(*errp, SCTP_ERROR_INV_PARAM, 0);
1919
1920
1921 return 0;
1922}
1923
1924static int sctp_process_inv_paramlength(const struct sctp_association *asoc,
1925 struct sctp_paramhdr *param,
1926 const struct sctp_chunk *chunk,
1927 struct sctp_chunk **errp)
1928{
1929
1930
1931
1932 if (*errp)
1933 sctp_chunk_free(*errp);
1934
1935
1936 *errp = sctp_make_violation_paramlen(asoc, chunk, param);
1937
1938 return 0;
1939}
1940
1941
1942
1943
1944
1945static int sctp_process_hn_param(const struct sctp_association *asoc,
1946 union sctp_params param,
1947 struct sctp_chunk *chunk,
1948 struct sctp_chunk **errp)
1949{
1950 __u16 len = ntohs(param.p->length);
1951
1952
1953
1954
1955
1956
1957 if (*errp)
1958 sctp_chunk_free(*errp);
1959
1960 *errp = sctp_make_op_error(asoc, chunk, SCTP_ERROR_DNS_FAILED,
1961 param.v, len, 0);
1962
1963
1964 return 0;
1965}
1966
1967static int sctp_verify_ext_param(struct net *net, union sctp_params param)
1968{
1969 __u16 num_ext = ntohs(param.p->length) - sizeof(struct sctp_paramhdr);
1970 int have_asconf = 0;
1971 int have_auth = 0;
1972 int i;
1973
1974 for (i = 0; i < num_ext; i++) {
1975 switch (param.ext->chunks[i]) {
1976 case SCTP_CID_AUTH:
1977 have_auth = 1;
1978 break;
1979 case SCTP_CID_ASCONF:
1980 case SCTP_CID_ASCONF_ACK:
1981 have_asconf = 1;
1982 break;
1983 }
1984 }
1985
1986
1987
1988
1989
1990
1991 if (net->sctp.addip_noauth)
1992 return 1;
1993
1994 if (net->sctp.addip_enable && !have_auth && have_asconf)
1995 return 0;
1996
1997 return 1;
1998}
1999
2000static void sctp_process_ext_param(struct sctp_association *asoc,
2001 union sctp_params param)
2002{
2003 __u16 num_ext = ntohs(param.p->length) - sizeof(struct sctp_paramhdr);
2004 struct net *net = sock_net(asoc->base.sk);
2005 int i;
2006
2007 for (i = 0; i < num_ext; i++) {
2008 switch (param.ext->chunks[i]) {
2009 case SCTP_CID_RECONF:
2010 if (asoc->ep->reconf_enable)
2011 asoc->peer.reconf_capable = 1;
2012 break;
2013 case SCTP_CID_FWD_TSN:
2014 if (asoc->ep->prsctp_enable)
2015 asoc->peer.prsctp_capable = 1;
2016 break;
2017 case SCTP_CID_AUTH:
2018
2019
2020
2021 if (asoc->ep->auth_enable)
2022 asoc->peer.auth_capable = 1;
2023 break;
2024 case SCTP_CID_ASCONF:
2025 case SCTP_CID_ASCONF_ACK:
2026 if (net->sctp.addip_enable)
2027 asoc->peer.asconf_capable = 1;
2028 break;
2029 case SCTP_CID_I_DATA:
2030 if (asoc->ep->intl_enable)
2031 asoc->peer.intl_capable = 1;
2032 break;
2033 default:
2034 break;
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
2061
2062
2063
2064static enum sctp_ierror sctp_process_unk_param(
2065 const struct sctp_association *asoc,
2066 union sctp_params param,
2067 struct sctp_chunk *chunk,
2068 struct sctp_chunk **errp)
2069{
2070 int retval = SCTP_IERROR_NO_ERROR;
2071
2072 switch (param.p->type & SCTP_PARAM_ACTION_MASK) {
2073 case SCTP_PARAM_ACTION_DISCARD:
2074 retval = SCTP_IERROR_ERROR;
2075 break;
2076 case SCTP_PARAM_ACTION_SKIP:
2077 break;
2078 case SCTP_PARAM_ACTION_DISCARD_ERR:
2079 retval = SCTP_IERROR_ERROR;
2080
2081 case SCTP_PARAM_ACTION_SKIP_ERR:
2082
2083
2084
2085 if (!*errp) {
2086 *errp = sctp_make_op_error_limited(asoc, chunk);
2087 if (!*errp) {
2088
2089
2090
2091
2092
2093 retval = SCTP_IERROR_NOMEM;
2094 break;
2095 }
2096 }
2097
2098 if (!sctp_init_cause(*errp, SCTP_ERROR_UNKNOWN_PARAM,
2099 ntohs(param.p->length)))
2100 sctp_addto_chunk(*errp, ntohs(param.p->length),
2101 param.v);
2102 break;
2103 default:
2104 break;
2105 }
2106
2107 return retval;
2108}
2109
2110
2111
2112
2113
2114
2115
2116
2117static enum sctp_ierror sctp_verify_param(struct net *net,
2118 const struct sctp_endpoint *ep,
2119 const struct sctp_association *asoc,
2120 union sctp_params param,
2121 enum sctp_cid cid,
2122 struct sctp_chunk *chunk,
2123 struct sctp_chunk **err_chunk)
2124{
2125 struct sctp_hmac_algo_param *hmacs;
2126 int retval = SCTP_IERROR_NO_ERROR;
2127 __u16 n_elt, id = 0;
2128 int i;
2129
2130
2131
2132
2133
2134
2135 switch (param.p->type) {
2136 case SCTP_PARAM_IPV4_ADDRESS:
2137 case SCTP_PARAM_IPV6_ADDRESS:
2138 case SCTP_PARAM_COOKIE_PRESERVATIVE:
2139 case SCTP_PARAM_SUPPORTED_ADDRESS_TYPES:
2140 case SCTP_PARAM_STATE_COOKIE:
2141 case SCTP_PARAM_HEARTBEAT_INFO:
2142 case SCTP_PARAM_UNRECOGNIZED_PARAMETERS:
2143 case SCTP_PARAM_ECN_CAPABLE:
2144 case SCTP_PARAM_ADAPTATION_LAYER_IND:
2145 break;
2146
2147 case SCTP_PARAM_SUPPORTED_EXT:
2148 if (!sctp_verify_ext_param(net, param))
2149 return SCTP_IERROR_ABORT;
2150 break;
2151
2152 case SCTP_PARAM_SET_PRIMARY:
2153 if (net->sctp.addip_enable)
2154 break;
2155 goto fallthrough;
2156
2157 case SCTP_PARAM_HOST_NAME_ADDRESS:
2158
2159 sctp_process_hn_param(asoc, param, chunk, err_chunk);
2160 retval = SCTP_IERROR_ABORT;
2161 break;
2162
2163 case SCTP_PARAM_FWD_TSN_SUPPORT:
2164 if (ep->prsctp_enable)
2165 break;
2166 goto fallthrough;
2167
2168 case SCTP_PARAM_RANDOM:
2169 if (!ep->auth_enable)
2170 goto fallthrough;
2171
2172
2173
2174
2175
2176
2177 if (SCTP_AUTH_RANDOM_LENGTH != ntohs(param.p->length) -
2178 sizeof(struct sctp_paramhdr)) {
2179 sctp_process_inv_paramlength(asoc, param.p,
2180 chunk, err_chunk);
2181 retval = SCTP_IERROR_ABORT;
2182 }
2183 break;
2184
2185 case SCTP_PARAM_CHUNKS:
2186 if (!ep->auth_enable)
2187 goto fallthrough;
2188
2189
2190
2191
2192
2193
2194 if (260 < ntohs(param.p->length)) {
2195 sctp_process_inv_paramlength(asoc, param.p,
2196 chunk, err_chunk);
2197 retval = SCTP_IERROR_ABORT;
2198 }
2199 break;
2200
2201 case SCTP_PARAM_HMAC_ALGO:
2202 if (!ep->auth_enable)
2203 goto fallthrough;
2204
2205 hmacs = (struct sctp_hmac_algo_param *)param.p;
2206 n_elt = (ntohs(param.p->length) -
2207 sizeof(struct sctp_paramhdr)) >> 1;
2208
2209
2210
2211
2212
2213 for (i = 0; i < n_elt; i++) {
2214 id = ntohs(hmacs->hmac_ids[i]);
2215
2216 if (id == SCTP_AUTH_HMAC_ID_SHA1)
2217 break;
2218 }
2219
2220 if (id != SCTP_AUTH_HMAC_ID_SHA1) {
2221 sctp_process_inv_paramlength(asoc, param.p, chunk,
2222 err_chunk);
2223 retval = SCTP_IERROR_ABORT;
2224 }
2225 break;
2226fallthrough:
2227 default:
2228 pr_debug("%s: unrecognized param:%d for chunk:%d\n",
2229 __func__, ntohs(param.p->type), cid);
2230
2231 retval = sctp_process_unk_param(asoc, param, chunk, err_chunk);
2232 break;
2233 }
2234 return retval;
2235}
2236
2237
2238int sctp_verify_init(struct net *net, const struct sctp_endpoint *ep,
2239 const struct sctp_association *asoc, enum sctp_cid cid,
2240 struct sctp_init_chunk *peer_init,
2241 struct sctp_chunk *chunk, struct sctp_chunk **errp)
2242{
2243 union sctp_params param;
2244 bool has_cookie = false;
2245 int result;
2246
2247
2248
2249
2250
2251 if (peer_init->init_hdr.num_outbound_streams == 0 ||
2252 peer_init->init_hdr.num_inbound_streams == 0 ||
2253 peer_init->init_hdr.init_tag == 0 ||
2254 ntohl(peer_init->init_hdr.a_rwnd) < SCTP_DEFAULT_MINWINDOW)
2255 return sctp_process_inv_mandatory(asoc, chunk, errp);
2256
2257 sctp_walk_params(param, peer_init, init_hdr.params) {
2258 if (param.p->type == SCTP_PARAM_STATE_COOKIE)
2259 has_cookie = true;
2260 }
2261
2262
2263
2264
2265
2266
2267
2268
2269 if (param.v != (void *)chunk->chunk_end)
2270 return sctp_process_inv_paramlength(asoc, param.p, chunk, errp);
2271
2272
2273
2274
2275 if ((SCTP_CID_INIT_ACK == cid) && !has_cookie)
2276 return sctp_process_missing_param(asoc, SCTP_PARAM_STATE_COOKIE,
2277 chunk, errp);
2278
2279
2280 sctp_walk_params(param, peer_init, init_hdr.params) {
2281 result = sctp_verify_param(net, ep, asoc, param, cid,
2282 chunk, errp);
2283 switch (result) {
2284 case SCTP_IERROR_ABORT:
2285 case SCTP_IERROR_NOMEM:
2286 return 0;
2287 case SCTP_IERROR_ERROR:
2288 return 1;
2289 case SCTP_IERROR_NO_ERROR:
2290 default:
2291 break;
2292 }
2293
2294 }
2295
2296 return 1;
2297}
2298
2299
2300
2301
2302
2303int sctp_process_init(struct sctp_association *asoc, struct sctp_chunk *chunk,
2304 const union sctp_addr *peer_addr,
2305 struct sctp_init_chunk *peer_init, gfp_t gfp)
2306{
2307 struct net *net = sock_net(asoc->base.sk);
2308 struct sctp_transport *transport;
2309 struct list_head *pos, *temp;
2310 union sctp_params param;
2311 union sctp_addr addr;
2312 struct sctp_af *af;
2313 int src_match = 0;
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325 if (!sctp_assoc_add_peer(asoc, peer_addr, gfp, SCTP_ACTIVE))
2326 goto nomem;
2327
2328 if (sctp_cmp_addr_exact(sctp_source(chunk), peer_addr))
2329 src_match = 1;
2330
2331
2332 sctp_walk_params(param, peer_init, init_hdr.params) {
2333 if (!src_match && (param.p->type == SCTP_PARAM_IPV4_ADDRESS ||
2334 param.p->type == SCTP_PARAM_IPV6_ADDRESS)) {
2335 af = sctp_get_af_specific(param_type2af(param.p->type));
2336 af->from_addr_param(&addr, param.addr,
2337 chunk->sctp_hdr->source, 0);
2338 if (sctp_cmp_addr_exact(sctp_source(chunk), &addr))
2339 src_match = 1;
2340 }
2341
2342 if (!sctp_process_param(asoc, param, peer_addr, gfp))
2343 goto clean_up;
2344 }
2345
2346
2347 if (!src_match)
2348 goto clean_up;
2349
2350
2351
2352
2353 if (asoc->peer.auth_capable && (!asoc->peer.peer_random ||
2354 !asoc->peer.peer_hmacs))
2355 asoc->peer.auth_capable = 0;
2356
2357
2358
2359
2360
2361
2362
2363 if (!net->sctp.addip_noauth &&
2364 (asoc->peer.asconf_capable && !asoc->peer.auth_capable)) {
2365 asoc->peer.addip_disabled_mask |= (SCTP_PARAM_ADD_IP |
2366 SCTP_PARAM_DEL_IP |
2367 SCTP_PARAM_SET_PRIMARY);
2368 asoc->peer.asconf_capable = 0;
2369 goto clean_up;
2370 }
2371
2372
2373 list_for_each_safe(pos, temp, &asoc->peer.transport_addr_list) {
2374 transport = list_entry(pos, struct sctp_transport, transports);
2375 if (transport->state == SCTP_UNKNOWN) {
2376 sctp_assoc_rm_peer(asoc, transport);
2377 }
2378 }
2379
2380
2381
2382
2383 asoc->peer.i.init_tag =
2384 ntohl(peer_init->init_hdr.init_tag);
2385 asoc->peer.i.a_rwnd =
2386 ntohl(peer_init->init_hdr.a_rwnd);
2387 asoc->peer.i.num_outbound_streams =
2388 ntohs(peer_init->init_hdr.num_outbound_streams);
2389 asoc->peer.i.num_inbound_streams =
2390 ntohs(peer_init->init_hdr.num_inbound_streams);
2391 asoc->peer.i.initial_tsn =
2392 ntohl(peer_init->init_hdr.initial_tsn);
2393
2394 asoc->strreset_inseq = asoc->peer.i.initial_tsn;
2395
2396
2397
2398
2399 if (asoc->c.sinit_num_ostreams >
2400 ntohs(peer_init->init_hdr.num_inbound_streams)) {
2401 asoc->c.sinit_num_ostreams =
2402 ntohs(peer_init->init_hdr.num_inbound_streams);
2403 }
2404
2405 if (asoc->c.sinit_max_instreams >
2406 ntohs(peer_init->init_hdr.num_outbound_streams)) {
2407 asoc->c.sinit_max_instreams =
2408 ntohs(peer_init->init_hdr.num_outbound_streams);
2409 }
2410
2411
2412 asoc->c.peer_vtag = asoc->peer.i.init_tag;
2413
2414
2415 asoc->peer.rwnd = asoc->peer.i.a_rwnd;
2416
2417
2418
2419
2420
2421 list_for_each_entry(transport, &asoc->peer.transport_addr_list,
2422 transports) {
2423 transport->ssthresh = asoc->peer.i.a_rwnd;
2424 }
2425
2426
2427 if (!sctp_tsnmap_init(&asoc->peer.tsn_map, SCTP_TSN_MAP_INITIAL,
2428 asoc->peer.i.initial_tsn, gfp))
2429 goto clean_up;
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439 if (sctp_stream_init(&asoc->stream, asoc->c.sinit_num_ostreams,
2440 asoc->c.sinit_max_instreams, gfp))
2441 goto clean_up;
2442
2443
2444 sctp_assoc_update_frag_point(asoc);
2445
2446 if (!asoc->temp && sctp_assoc_set_id(asoc, gfp))
2447 goto clean_up;
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459 asoc->peer.addip_serial = asoc->peer.i.initial_tsn - 1;
2460 return 1;
2461
2462clean_up:
2463
2464 list_for_each_safe(pos, temp, &asoc->peer.transport_addr_list) {
2465 transport = list_entry(pos, struct sctp_transport, transports);
2466 if (transport->state != SCTP_ACTIVE)
2467 sctp_assoc_rm_peer(asoc, transport);
2468 }
2469
2470nomem:
2471 return 0;
2472}
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486static int sctp_process_param(struct sctp_association *asoc,
2487 union sctp_params param,
2488 const union sctp_addr *peer_addr,
2489 gfp_t gfp)
2490{
2491 struct net *net = sock_net(asoc->base.sk);
2492 struct sctp_endpoint *ep = asoc->ep;
2493 union sctp_addr_param *addr_param;
2494 struct sctp_transport *t;
2495 enum sctp_scope scope;
2496 union sctp_addr addr;
2497 struct sctp_af *af;
2498 int retval = 1, i;
2499 u32 stale;
2500 __u16 sat;
2501
2502
2503
2504
2505
2506 switch (param.p->type) {
2507 case SCTP_PARAM_IPV6_ADDRESS:
2508 if (PF_INET6 != asoc->base.sk->sk_family)
2509 break;
2510 goto do_addr_param;
2511
2512 case SCTP_PARAM_IPV4_ADDRESS:
2513
2514 if (ipv6_only_sock(asoc->base.sk))
2515 break;
2516do_addr_param:
2517 af = sctp_get_af_specific(param_type2af(param.p->type));
2518 af->from_addr_param(&addr, param.addr, htons(asoc->peer.port), 0);
2519 scope = sctp_scope(peer_addr);
2520 if (sctp_in_scope(net, &addr, scope))
2521 if (!sctp_assoc_add_peer(asoc, &addr, gfp, SCTP_UNCONFIRMED))
2522 return 0;
2523 break;
2524
2525 case SCTP_PARAM_COOKIE_PRESERVATIVE:
2526 if (!net->sctp.cookie_preserve_enable)
2527 break;
2528
2529 stale = ntohl(param.life->lifespan_increment);
2530
2531
2532
2533
2534 asoc->cookie_life = ktime_add_ms(asoc->cookie_life, stale);
2535 break;
2536
2537 case SCTP_PARAM_HOST_NAME_ADDRESS:
2538 pr_debug("%s: unimplemented SCTP_HOST_NAME_ADDRESS\n", __func__);
2539 break;
2540
2541 case SCTP_PARAM_SUPPORTED_ADDRESS_TYPES:
2542
2543
2544
2545 asoc->peer.ipv4_address = 0;
2546 asoc->peer.ipv6_address = 0;
2547
2548
2549
2550
2551 if (peer_addr->sa.sa_family == AF_INET6)
2552 asoc->peer.ipv6_address = 1;
2553 else if (peer_addr->sa.sa_family == AF_INET)
2554 asoc->peer.ipv4_address = 1;
2555
2556
2557 sat = ntohs(param.p->length) - sizeof(struct sctp_paramhdr);
2558 if (sat)
2559 sat /= sizeof(__u16);
2560
2561 for (i = 0; i < sat; ++i) {
2562 switch (param.sat->types[i]) {
2563 case SCTP_PARAM_IPV4_ADDRESS:
2564 asoc->peer.ipv4_address = 1;
2565 break;
2566
2567 case SCTP_PARAM_IPV6_ADDRESS:
2568 if (PF_INET6 == asoc->base.sk->sk_family)
2569 asoc->peer.ipv6_address = 1;
2570 break;
2571
2572 case SCTP_PARAM_HOST_NAME_ADDRESS:
2573 asoc->peer.hostname_address = 1;
2574 break;
2575
2576 default:
2577 break;
2578 }
2579 }
2580 break;
2581
2582 case SCTP_PARAM_STATE_COOKIE:
2583 asoc->peer.cookie_len =
2584 ntohs(param.p->length) - sizeof(struct sctp_paramhdr);
2585 kfree(asoc->peer.cookie);
2586 asoc->peer.cookie = kmemdup(param.cookie->body, asoc->peer.cookie_len, gfp);
2587 if (!asoc->peer.cookie)
2588 retval = 0;
2589 break;
2590
2591 case SCTP_PARAM_HEARTBEAT_INFO:
2592
2593 break;
2594
2595 case SCTP_PARAM_UNRECOGNIZED_PARAMETERS:
2596
2597 break;
2598
2599 case SCTP_PARAM_ECN_CAPABLE:
2600 asoc->peer.ecn_capable = 1;
2601 break;
2602
2603 case SCTP_PARAM_ADAPTATION_LAYER_IND:
2604 asoc->peer.adaptation_ind = ntohl(param.aind->adaptation_ind);
2605 break;
2606
2607 case SCTP_PARAM_SET_PRIMARY:
2608 if (!net->sctp.addip_enable)
2609 goto fall_through;
2610
2611 addr_param = param.v + sizeof(struct sctp_addip_param);
2612
2613 af = sctp_get_af_specific(param_type2af(addr_param->p.type));
2614 if (af == NULL)
2615 break;
2616
2617 af->from_addr_param(&addr, addr_param,
2618 htons(asoc->peer.port), 0);
2619
2620
2621
2622
2623 if (!af->addr_valid(&addr, NULL, NULL))
2624 break;
2625
2626 t = sctp_assoc_lookup_paddr(asoc, &addr);
2627 if (!t)
2628 break;
2629
2630 sctp_assoc_set_primary(asoc, t);
2631 break;
2632
2633 case SCTP_PARAM_SUPPORTED_EXT:
2634 sctp_process_ext_param(asoc, param);
2635 break;
2636
2637 case SCTP_PARAM_FWD_TSN_SUPPORT:
2638 if (asoc->ep->prsctp_enable) {
2639 asoc->peer.prsctp_capable = 1;
2640 break;
2641 }
2642
2643 goto fall_through;
2644
2645 case SCTP_PARAM_RANDOM:
2646 if (!ep->auth_enable)
2647 goto fall_through;
2648
2649
2650 kfree(asoc->peer.peer_random);
2651 asoc->peer.peer_random = kmemdup(param.p,
2652 ntohs(param.p->length), gfp);
2653 if (!asoc->peer.peer_random) {
2654 retval = 0;
2655 break;
2656 }
2657 break;
2658
2659 case SCTP_PARAM_HMAC_ALGO:
2660 if (!ep->auth_enable)
2661 goto fall_through;
2662
2663
2664 kfree(asoc->peer.peer_hmacs);
2665 asoc->peer.peer_hmacs = kmemdup(param.p,
2666 ntohs(param.p->length), gfp);
2667 if (!asoc->peer.peer_hmacs) {
2668 retval = 0;
2669 break;
2670 }
2671
2672
2673 sctp_auth_asoc_set_default_hmac(asoc, param.hmac_algo);
2674 break;
2675
2676 case SCTP_PARAM_CHUNKS:
2677 if (!ep->auth_enable)
2678 goto fall_through;
2679
2680 kfree(asoc->peer.peer_chunks);
2681 asoc->peer.peer_chunks = kmemdup(param.p,
2682 ntohs(param.p->length), gfp);
2683 if (!asoc->peer.peer_chunks)
2684 retval = 0;
2685 break;
2686fall_through:
2687 default:
2688
2689
2690
2691
2692
2693 pr_debug("%s: ignoring param:%d for association:%p.\n",
2694 __func__, ntohs(param.p->type), asoc);
2695 break;
2696 }
2697
2698 return retval;
2699}
2700
2701
2702__u32 sctp_generate_tag(const struct sctp_endpoint *ep)
2703{
2704
2705
2706
2707 __u32 x;
2708
2709 do {
2710 get_random_bytes(&x, sizeof(__u32));
2711 } while (x == 0);
2712
2713 return x;
2714}
2715
2716
2717__u32 sctp_generate_tsn(const struct sctp_endpoint *ep)
2718{
2719 __u32 retval;
2720
2721 get_random_bytes(&retval, sizeof(__u32));
2722 return retval;
2723}
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747static struct sctp_chunk *sctp_make_asconf(struct sctp_association *asoc,
2748 union sctp_addr *addr,
2749 int vparam_len)
2750{
2751 struct sctp_addiphdr asconf;
2752 struct sctp_chunk *retval;
2753 int length = sizeof(asconf) + vparam_len;
2754 union sctp_addr_param addrparam;
2755 int addrlen;
2756 struct sctp_af *af = sctp_get_af_specific(addr->v4.sin_family);
2757
2758 addrlen = af->to_addr_param(addr, &addrparam);
2759 if (!addrlen)
2760 return NULL;
2761 length += addrlen;
2762
2763
2764 retval = sctp_make_control(asoc, SCTP_CID_ASCONF, 0, length,
2765 GFP_ATOMIC);
2766 if (!retval)
2767 return NULL;
2768
2769 asconf.serial = htonl(asoc->addip_serial++);
2770
2771 retval->subh.addip_hdr =
2772 sctp_addto_chunk(retval, sizeof(asconf), &asconf);
2773 retval->param_hdr.v =
2774 sctp_addto_chunk(retval, addrlen, &addrparam);
2775
2776 return retval;
2777}
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803struct sctp_chunk *sctp_make_asconf_update_ip(struct sctp_association *asoc,
2804 union sctp_addr *laddr,
2805 struct sockaddr *addrs,
2806 int addrcnt, __be16 flags)
2807{
2808 union sctp_addr_param addr_param;
2809 struct sctp_addip_param param;
2810 int paramlen = sizeof(param);
2811 struct sctp_chunk *retval;
2812 int addr_param_len = 0;
2813 union sctp_addr *addr;
2814 int totallen = 0, i;
2815 int del_pickup = 0;
2816 struct sctp_af *af;
2817 void *addr_buf;
2818
2819
2820 addr_buf = addrs;
2821 for (i = 0; i < addrcnt; i++) {
2822 addr = addr_buf;
2823 af = sctp_get_af_specific(addr->v4.sin_family);
2824 addr_param_len = af->to_addr_param(addr, &addr_param);
2825
2826 totallen += paramlen;
2827 totallen += addr_param_len;
2828
2829 addr_buf += af->sockaddr_len;
2830 if (asoc->asconf_addr_del_pending && !del_pickup) {
2831
2832 totallen += paramlen;
2833 totallen += addr_param_len;
2834 del_pickup = 1;
2835
2836 pr_debug("%s: picked same-scope del_pending addr, "
2837 "totallen for all addresses is %d\n",
2838 __func__, totallen);
2839 }
2840 }
2841
2842
2843 retval = sctp_make_asconf(asoc, laddr, totallen);
2844 if (!retval)
2845 return NULL;
2846
2847
2848 addr_buf = addrs;
2849 for (i = 0; i < addrcnt; i++) {
2850 addr = addr_buf;
2851 af = sctp_get_af_specific(addr->v4.sin_family);
2852 addr_param_len = af->to_addr_param(addr, &addr_param);
2853 param.param_hdr.type = flags;
2854 param.param_hdr.length = htons(paramlen + addr_param_len);
2855 param.crr_id = htonl(i);
2856
2857 sctp_addto_chunk(retval, paramlen, ¶m);
2858 sctp_addto_chunk(retval, addr_param_len, &addr_param);
2859
2860 addr_buf += af->sockaddr_len;
2861 }
2862 if (flags == SCTP_PARAM_ADD_IP && del_pickup) {
2863 addr = asoc->asconf_addr_del_pending;
2864 af = sctp_get_af_specific(addr->v4.sin_family);
2865 addr_param_len = af->to_addr_param(addr, &addr_param);
2866 param.param_hdr.type = SCTP_PARAM_DEL_IP;
2867 param.param_hdr.length = htons(paramlen + addr_param_len);
2868 param.crr_id = htonl(i);
2869
2870 sctp_addto_chunk(retval, paramlen, ¶m);
2871 sctp_addto_chunk(retval, addr_param_len, &addr_param);
2872 }
2873 return retval;
2874}
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890struct sctp_chunk *sctp_make_asconf_set_prim(struct sctp_association *asoc,
2891 union sctp_addr *addr)
2892{
2893 struct sctp_af *af = sctp_get_af_specific(addr->v4.sin_family);
2894 union sctp_addr_param addrparam;
2895 struct sctp_addip_param param;
2896 struct sctp_chunk *retval;
2897 int len = sizeof(param);
2898 int addrlen;
2899
2900 addrlen = af->to_addr_param(addr, &addrparam);
2901 if (!addrlen)
2902 return NULL;
2903 len += addrlen;
2904
2905
2906 retval = sctp_make_asconf(asoc, addr, len);
2907 if (!retval)
2908 return NULL;
2909
2910 param.param_hdr.type = SCTP_PARAM_SET_PRIMARY;
2911 param.param_hdr.length = htons(len);
2912 param.crr_id = 0;
2913
2914 sctp_addto_chunk(retval, sizeof(param), ¶m);
2915 sctp_addto_chunk(retval, addrlen, &addrparam);
2916
2917 return retval;
2918}
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939static struct sctp_chunk *sctp_make_asconf_ack(const struct sctp_association *asoc,
2940 __u32 serial, int vparam_len)
2941{
2942 struct sctp_addiphdr asconf;
2943 struct sctp_chunk *retval;
2944 int length = sizeof(asconf) + vparam_len;
2945
2946
2947 retval = sctp_make_control(asoc, SCTP_CID_ASCONF_ACK, 0, length,
2948 GFP_ATOMIC);
2949 if (!retval)
2950 return NULL;
2951
2952 asconf.serial = htonl(serial);
2953
2954 retval->subh.addip_hdr =
2955 sctp_addto_chunk(retval, sizeof(asconf), &asconf);
2956
2957 return retval;
2958}
2959
2960
2961static void sctp_add_asconf_response(struct sctp_chunk *chunk, __be32 crr_id,
2962 __be16 err_code,
2963 struct sctp_addip_param *asconf_param)
2964{
2965 struct sctp_addip_param ack_param;
2966 struct sctp_errhdr err_param;
2967 int asconf_param_len = 0;
2968 int err_param_len = 0;
2969 __be16 response_type;
2970
2971 if (SCTP_ERROR_NO_ERROR == err_code) {
2972 response_type = SCTP_PARAM_SUCCESS_REPORT;
2973 } else {
2974 response_type = SCTP_PARAM_ERR_CAUSE;
2975 err_param_len = sizeof(err_param);
2976 if (asconf_param)
2977 asconf_param_len =
2978 ntohs(asconf_param->param_hdr.length);
2979 }
2980
2981
2982 ack_param.param_hdr.type = response_type;
2983 ack_param.param_hdr.length = htons(sizeof(ack_param) +
2984 err_param_len +
2985 asconf_param_len);
2986 ack_param.crr_id = crr_id;
2987 sctp_addto_chunk(chunk, sizeof(ack_param), &ack_param);
2988
2989 if (SCTP_ERROR_NO_ERROR == err_code)
2990 return;
2991
2992
2993 err_param.cause = err_code;
2994 err_param.length = htons(err_param_len + asconf_param_len);
2995 sctp_addto_chunk(chunk, err_param_len, &err_param);
2996
2997
2998 if (asconf_param)
2999 sctp_addto_chunk(chunk, asconf_param_len, asconf_param);
3000}
3001
3002
3003static __be16 sctp_process_asconf_param(struct sctp_association *asoc,
3004 struct sctp_chunk *asconf,
3005 struct sctp_addip_param *asconf_param)
3006{
3007 union sctp_addr_param *addr_param;
3008 struct sctp_transport *peer;
3009 union sctp_addr addr;
3010 struct sctp_af *af;
3011
3012 addr_param = (void *)asconf_param + sizeof(*asconf_param);
3013
3014 if (asconf_param->param_hdr.type != SCTP_PARAM_ADD_IP &&
3015 asconf_param->param_hdr.type != SCTP_PARAM_DEL_IP &&
3016 asconf_param->param_hdr.type != SCTP_PARAM_SET_PRIMARY)
3017 return SCTP_ERROR_UNKNOWN_PARAM;
3018
3019 switch (addr_param->p.type) {
3020 case SCTP_PARAM_IPV6_ADDRESS:
3021 if (!asoc->peer.ipv6_address)
3022 return SCTP_ERROR_DNS_FAILED;
3023 break;
3024 case SCTP_PARAM_IPV4_ADDRESS:
3025 if (!asoc->peer.ipv4_address)
3026 return SCTP_ERROR_DNS_FAILED;
3027 break;
3028 default:
3029 return SCTP_ERROR_DNS_FAILED;
3030 }
3031
3032 af = sctp_get_af_specific(param_type2af(addr_param->p.type));
3033 if (unlikely(!af))
3034 return SCTP_ERROR_DNS_FAILED;
3035
3036 af->from_addr_param(&addr, addr_param, htons(asoc->peer.port), 0);
3037
3038
3039
3040
3041
3042
3043 if (!af->is_any(&addr) && !af->addr_valid(&addr, NULL, asconf->skb))
3044 return SCTP_ERROR_DNS_FAILED;
3045
3046 switch (asconf_param->param_hdr.type) {
3047 case SCTP_PARAM_ADD_IP:
3048
3049
3050
3051
3052 if (af->is_any(&addr))
3053 memcpy(&addr, &asconf->source, sizeof(addr));
3054
3055 if (security_sctp_bind_connect(asoc->ep->base.sk,
3056 SCTP_PARAM_ADD_IP,
3057 (struct sockaddr *)&addr,
3058 af->sockaddr_len))
3059 return SCTP_ERROR_REQ_REFUSED;
3060
3061
3062
3063
3064
3065
3066
3067
3068 peer = sctp_assoc_add_peer(asoc, &addr, GFP_ATOMIC, SCTP_UNCONFIRMED);
3069 if (!peer)
3070 return SCTP_ERROR_RSRC_LOW;
3071
3072
3073 sctp_transport_reset_hb_timer(peer);
3074 asoc->new_transport = peer;
3075 break;
3076 case SCTP_PARAM_DEL_IP:
3077
3078
3079
3080
3081
3082 if (asoc->peer.transport_count == 1)
3083 return SCTP_ERROR_DEL_LAST_IP;
3084
3085
3086
3087
3088
3089
3090
3091
3092 if (sctp_cmp_addr_exact(&asconf->source, &addr))
3093 return SCTP_ERROR_DEL_SRC_IP;
3094
3095
3096
3097
3098
3099
3100 if (af->is_any(&addr)) {
3101 sctp_assoc_set_primary(asoc, asconf->transport);
3102 sctp_assoc_del_nonprimary_peers(asoc,
3103 asconf->transport);
3104 return SCTP_ERROR_NO_ERROR;
3105 }
3106
3107
3108
3109
3110
3111
3112 peer = sctp_assoc_lookup_paddr(asoc, &addr);
3113 if (!peer)
3114 return SCTP_ERROR_DNS_FAILED;
3115
3116 sctp_assoc_rm_peer(asoc, peer);
3117 break;
3118 case SCTP_PARAM_SET_PRIMARY:
3119
3120
3121
3122
3123
3124 if (af->is_any(&addr))
3125 memcpy(&addr.v4, sctp_source(asconf), sizeof(addr));
3126
3127 if (security_sctp_bind_connect(asoc->ep->base.sk,
3128 SCTP_PARAM_SET_PRIMARY,
3129 (struct sockaddr *)&addr,
3130 af->sockaddr_len))
3131 return SCTP_ERROR_REQ_REFUSED;
3132
3133 peer = sctp_assoc_lookup_paddr(asoc, &addr);
3134 if (!peer)
3135 return SCTP_ERROR_DNS_FAILED;
3136
3137 sctp_assoc_set_primary(asoc, peer);
3138 break;
3139 }
3140
3141 return SCTP_ERROR_NO_ERROR;
3142}
3143
3144
3145bool sctp_verify_asconf(const struct sctp_association *asoc,
3146 struct sctp_chunk *chunk, bool addr_param_needed,
3147 struct sctp_paramhdr **errp)
3148{
3149 struct sctp_addip_chunk *addip;
3150 bool addr_param_seen = false;
3151 union sctp_params param;
3152
3153 addip = (struct sctp_addip_chunk *)chunk->chunk_hdr;
3154 sctp_walk_params(param, addip, addip_hdr.params) {
3155 size_t length = ntohs(param.p->length);
3156
3157 *errp = param.p;
3158 switch (param.p->type) {
3159 case SCTP_PARAM_ERR_CAUSE:
3160 break;
3161 case SCTP_PARAM_IPV4_ADDRESS:
3162 if (length != sizeof(struct sctp_ipv4addr_param))
3163 return false;
3164
3165
3166
3167 if (param.v != addip->addip_hdr.params)
3168 return false;
3169 addr_param_seen = true;
3170 break;
3171 case SCTP_PARAM_IPV6_ADDRESS:
3172 if (length != sizeof(struct sctp_ipv6addr_param))
3173 return false;
3174 if (param.v != addip->addip_hdr.params)
3175 return false;
3176 addr_param_seen = true;
3177 break;
3178 case SCTP_PARAM_ADD_IP:
3179 case SCTP_PARAM_DEL_IP:
3180 case SCTP_PARAM_SET_PRIMARY:
3181
3182 if (addr_param_needed && !addr_param_seen)
3183 return false;
3184 length = ntohs(param.addip->param_hdr.length);
3185 if (length < sizeof(struct sctp_addip_param) +
3186 sizeof(**errp))
3187 return false;
3188 break;
3189 case SCTP_PARAM_SUCCESS_REPORT:
3190 case SCTP_PARAM_ADAPTATION_LAYER_IND:
3191 if (length != sizeof(struct sctp_addip_param))
3192 return false;
3193 break;
3194 default:
3195
3196 return false;
3197 }
3198 }
3199
3200
3201 if (addr_param_needed && !addr_param_seen)
3202 return false;
3203 if (!addr_param_needed && addr_param_seen)
3204 return false;
3205 if (param.v != chunk->chunk_end)
3206 return false;
3207
3208 return true;
3209}
3210
3211
3212
3213
3214struct sctp_chunk *sctp_process_asconf(struct sctp_association *asoc,
3215 struct sctp_chunk *asconf)
3216{
3217 union sctp_addr_param *addr_param;
3218 struct sctp_addip_chunk *addip;
3219 struct sctp_chunk *asconf_ack;
3220 bool all_param_pass = true;
3221 struct sctp_addiphdr *hdr;
3222 int length = 0, chunk_len;
3223 union sctp_params param;
3224 __be16 err_code;
3225 __u32 serial;
3226
3227 addip = (struct sctp_addip_chunk *)asconf->chunk_hdr;
3228 chunk_len = ntohs(asconf->chunk_hdr->length) -
3229 sizeof(struct sctp_chunkhdr);
3230 hdr = (struct sctp_addiphdr *)asconf->skb->data;
3231 serial = ntohl(hdr->serial);
3232
3233
3234 length = sizeof(*hdr);
3235 addr_param = (union sctp_addr_param *)(asconf->skb->data + length);
3236 chunk_len -= length;
3237
3238
3239
3240
3241 length = ntohs(addr_param->p.length);
3242 chunk_len -= length;
3243
3244
3245
3246
3247
3248
3249 asconf_ack = sctp_make_asconf_ack(asoc, serial, chunk_len * 4);
3250 if (!asconf_ack)
3251 goto done;
3252
3253
3254 sctp_walk_params(param, addip, addip_hdr.params) {
3255
3256 if (param.p->type == SCTP_PARAM_IPV4_ADDRESS ||
3257 param.p->type == SCTP_PARAM_IPV6_ADDRESS)
3258 continue;
3259
3260 err_code = sctp_process_asconf_param(asoc, asconf,
3261 param.addip);
3262
3263
3264
3265
3266
3267
3268
3269 if (err_code != SCTP_ERROR_NO_ERROR)
3270 all_param_pass = false;
3271 if (!all_param_pass)
3272 sctp_add_asconf_response(asconf_ack, param.addip->crr_id,
3273 err_code, param.addip);
3274
3275
3276
3277
3278
3279
3280 if (err_code == SCTP_ERROR_RSRC_LOW)
3281 goto done;
3282 }
3283done:
3284 asoc->peer.addip_serial++;
3285
3286
3287
3288
3289 if (asconf_ack) {
3290 sctp_chunk_hold(asconf_ack);
3291 list_add_tail(&asconf_ack->transmitted_list,
3292 &asoc->asconf_ack_list);
3293 }
3294
3295 return asconf_ack;
3296}
3297
3298
3299static void sctp_asconf_param_success(struct sctp_association *asoc,
3300 struct sctp_addip_param *asconf_param)
3301{
3302 struct sctp_bind_addr *bp = &asoc->base.bind_addr;
3303 union sctp_addr_param *addr_param;
3304 struct sctp_sockaddr_entry *saddr;
3305 struct sctp_transport *transport;
3306 union sctp_addr addr;
3307 struct sctp_af *af;
3308
3309 addr_param = (void *)asconf_param + sizeof(*asconf_param);
3310
3311
3312 af = sctp_get_af_specific(param_type2af(addr_param->p.type));
3313 af->from_addr_param(&addr, addr_param, htons(bp->port), 0);
3314
3315 switch (asconf_param->param_hdr.type) {
3316 case SCTP_PARAM_ADD_IP:
3317
3318
3319
3320 local_bh_disable();
3321 list_for_each_entry(saddr, &bp->address_list, list) {
3322 if (sctp_cmp_addr_exact(&saddr->a, &addr))
3323 saddr->state = SCTP_ADDR_SRC;
3324 }
3325 local_bh_enable();
3326 list_for_each_entry(transport, &asoc->peer.transport_addr_list,
3327 transports) {
3328 sctp_transport_dst_release(transport);
3329 }
3330 break;
3331 case SCTP_PARAM_DEL_IP:
3332 local_bh_disable();
3333 sctp_del_bind_addr(bp, &addr);
3334 if (asoc->asconf_addr_del_pending != NULL &&
3335 sctp_cmp_addr_exact(asoc->asconf_addr_del_pending, &addr)) {
3336 kfree(asoc->asconf_addr_del_pending);
3337 asoc->asconf_addr_del_pending = NULL;
3338 }
3339 local_bh_enable();
3340 list_for_each_entry(transport, &asoc->peer.transport_addr_list,
3341 transports) {
3342 sctp_transport_dst_release(transport);
3343 }
3344 break;
3345 default:
3346 break;
3347 }
3348}
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359static __be16 sctp_get_asconf_response(struct sctp_chunk *asconf_ack,
3360 struct sctp_addip_param *asconf_param,
3361 int no_err)
3362{
3363 struct sctp_addip_param *asconf_ack_param;
3364 struct sctp_errhdr *err_param;
3365 int asconf_ack_len;
3366 __be16 err_code;
3367 int length;
3368
3369 if (no_err)
3370 err_code = SCTP_ERROR_NO_ERROR;
3371 else
3372 err_code = SCTP_ERROR_REQ_REFUSED;
3373
3374 asconf_ack_len = ntohs(asconf_ack->chunk_hdr->length) -
3375 sizeof(struct sctp_chunkhdr);
3376
3377
3378
3379
3380 length = sizeof(struct sctp_addiphdr);
3381 asconf_ack_param = (struct sctp_addip_param *)(asconf_ack->skb->data +
3382 length);
3383 asconf_ack_len -= length;
3384
3385 while (asconf_ack_len > 0) {
3386 if (asconf_ack_param->crr_id == asconf_param->crr_id) {
3387 switch (asconf_ack_param->param_hdr.type) {
3388 case SCTP_PARAM_SUCCESS_REPORT:
3389 return SCTP_ERROR_NO_ERROR;
3390 case SCTP_PARAM_ERR_CAUSE:
3391 length = sizeof(*asconf_ack_param);
3392 err_param = (void *)asconf_ack_param + length;
3393 asconf_ack_len -= length;
3394 if (asconf_ack_len > 0)
3395 return err_param->cause;
3396 else
3397 return SCTP_ERROR_INV_PARAM;
3398 break;
3399 default:
3400 return SCTP_ERROR_INV_PARAM;
3401 }
3402 }
3403
3404 length = ntohs(asconf_ack_param->param_hdr.length);
3405 asconf_ack_param = (void *)asconf_ack_param + length;
3406 asconf_ack_len -= length;
3407 }
3408
3409 return err_code;
3410}
3411
3412
3413int sctp_process_asconf_ack(struct sctp_association *asoc,
3414 struct sctp_chunk *asconf_ack)
3415{
3416 struct sctp_chunk *asconf = asoc->addip_last_asconf;
3417 struct sctp_addip_param *asconf_param;
3418 __be16 err_code = SCTP_ERROR_NO_ERROR;
3419 union sctp_addr_param *addr_param;
3420 int asconf_len = asconf->skb->len;
3421 int all_param_pass = 0;
3422 int length = 0;
3423 int no_err = 1;
3424 int retval = 0;
3425
3426
3427
3428
3429 length = sizeof(struct sctp_addip_chunk);
3430 addr_param = (union sctp_addr_param *)(asconf->skb->data + length);
3431 asconf_len -= length;
3432
3433
3434
3435
3436 length = ntohs(addr_param->p.length);
3437 asconf_param = (void *)addr_param + length;
3438 asconf_len -= length;
3439
3440
3441
3442
3443
3444
3445 if (asconf_ack->skb->len == sizeof(struct sctp_addiphdr))
3446 all_param_pass = 1;
3447
3448
3449 while (asconf_len > 0) {
3450 if (all_param_pass)
3451 err_code = SCTP_ERROR_NO_ERROR;
3452 else {
3453 err_code = sctp_get_asconf_response(asconf_ack,
3454 asconf_param,
3455 no_err);
3456 if (no_err && (SCTP_ERROR_NO_ERROR != err_code))
3457 no_err = 0;
3458 }
3459
3460 switch (err_code) {
3461 case SCTP_ERROR_NO_ERROR:
3462 sctp_asconf_param_success(asoc, asconf_param);
3463 break;
3464
3465 case SCTP_ERROR_RSRC_LOW:
3466 retval = 1;
3467 break;
3468
3469 case SCTP_ERROR_UNKNOWN_PARAM:
3470
3471
3472
3473 asoc->peer.addip_disabled_mask |=
3474 asconf_param->param_hdr.type;
3475 break;
3476
3477 case SCTP_ERROR_REQ_REFUSED:
3478 case SCTP_ERROR_DEL_LAST_IP:
3479 case SCTP_ERROR_DEL_SRC_IP:
3480 default:
3481 break;
3482 }
3483
3484
3485
3486
3487 length = ntohs(asconf_param->param_hdr.length);
3488 asconf_param = (void *)asconf_param + length;
3489 asconf_len -= length;
3490 }
3491
3492 if (no_err && asoc->src_out_of_asoc_ok) {
3493 asoc->src_out_of_asoc_ok = 0;
3494 sctp_transport_immediate_rtx(asoc->peer.primary_path);
3495 }
3496
3497
3498 list_del_init(&asconf->transmitted_list);
3499 sctp_chunk_free(asconf);
3500 asoc->addip_last_asconf = NULL;
3501
3502 return retval;
3503}
3504
3505
3506struct sctp_chunk *sctp_make_fwdtsn(const struct sctp_association *asoc,
3507 __u32 new_cum_tsn, size_t nstreams,
3508 struct sctp_fwdtsn_skip *skiplist)
3509{
3510 struct sctp_chunk *retval = NULL;
3511 struct sctp_fwdtsn_hdr ftsn_hdr;
3512 struct sctp_fwdtsn_skip skip;
3513 size_t hint;
3514 int i;
3515
3516 hint = (nstreams + 1) * sizeof(__u32);
3517
3518 retval = sctp_make_control(asoc, SCTP_CID_FWD_TSN, 0, hint, GFP_ATOMIC);
3519
3520 if (!retval)
3521 return NULL;
3522
3523 ftsn_hdr.new_cum_tsn = htonl(new_cum_tsn);
3524 retval->subh.fwdtsn_hdr =
3525 sctp_addto_chunk(retval, sizeof(ftsn_hdr), &ftsn_hdr);
3526
3527 for (i = 0; i < nstreams; i++) {
3528 skip.stream = skiplist[i].stream;
3529 skip.ssn = skiplist[i].ssn;
3530 sctp_addto_chunk(retval, sizeof(skip), &skip);
3531 }
3532
3533 return retval;
3534}
3535
3536struct sctp_chunk *sctp_make_ifwdtsn(const struct sctp_association *asoc,
3537 __u32 new_cum_tsn, size_t nstreams,
3538 struct sctp_ifwdtsn_skip *skiplist)
3539{
3540 struct sctp_chunk *retval = NULL;
3541 struct sctp_ifwdtsn_hdr ftsn_hdr;
3542 size_t hint;
3543
3544 hint = (nstreams + 1) * sizeof(__u32);
3545
3546 retval = sctp_make_control(asoc, SCTP_CID_I_FWD_TSN, 0, hint,
3547 GFP_ATOMIC);
3548 if (!retval)
3549 return NULL;
3550
3551 ftsn_hdr.new_cum_tsn = htonl(new_cum_tsn);
3552 retval->subh.ifwdtsn_hdr =
3553 sctp_addto_chunk(retval, sizeof(ftsn_hdr), &ftsn_hdr);
3554
3555 sctp_addto_chunk(retval, nstreams * sizeof(skiplist[0]), skiplist);
3556
3557 return retval;
3558}
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575static struct sctp_chunk *sctp_make_reconf(const struct sctp_association *asoc,
3576 int length)
3577{
3578 struct sctp_reconf_chunk *reconf;
3579 struct sctp_chunk *retval;
3580
3581 retval = sctp_make_control(asoc, SCTP_CID_RECONF, 0, length,
3582 GFP_ATOMIC);
3583 if (!retval)
3584 return NULL;
3585
3586 reconf = (struct sctp_reconf_chunk *)retval->chunk_hdr;
3587 retval->param_hdr.v = reconf->params;
3588
3589 return retval;
3590}
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626struct sctp_chunk *sctp_make_strreset_req(
3627 const struct sctp_association *asoc,
3628 __u16 stream_num, __be16 *stream_list,
3629 bool out, bool in)
3630{
3631 __u16 stream_len = stream_num * sizeof(__u16);
3632 struct sctp_strreset_outreq outreq;
3633 struct sctp_strreset_inreq inreq;
3634 struct sctp_chunk *retval;
3635 __u16 outlen, inlen;
3636
3637 outlen = (sizeof(outreq) + stream_len) * out;
3638 inlen = (sizeof(inreq) + stream_len) * in;
3639
3640 retval = sctp_make_reconf(asoc, outlen + inlen);
3641 if (!retval)
3642 return NULL;
3643
3644 if (outlen) {
3645 outreq.param_hdr.type = SCTP_PARAM_RESET_OUT_REQUEST;
3646 outreq.param_hdr.length = htons(outlen);
3647 outreq.request_seq = htonl(asoc->strreset_outseq);
3648 outreq.response_seq = htonl(asoc->strreset_inseq - 1);
3649 outreq.send_reset_at_tsn = htonl(asoc->next_tsn - 1);
3650
3651 sctp_addto_chunk(retval, sizeof(outreq), &outreq);
3652
3653 if (stream_len)
3654 sctp_addto_chunk(retval, stream_len, stream_list);
3655 }
3656
3657 if (inlen) {
3658 inreq.param_hdr.type = SCTP_PARAM_RESET_IN_REQUEST;
3659 inreq.param_hdr.length = htons(inlen);
3660 inreq.request_seq = htonl(asoc->strreset_outseq + out);
3661
3662 sctp_addto_chunk(retval, sizeof(inreq), &inreq);
3663
3664 if (stream_len)
3665 sctp_addto_chunk(retval, stream_len, stream_list);
3666 }
3667
3668 return retval;
3669}
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680struct sctp_chunk *sctp_make_strreset_tsnreq(
3681 const struct sctp_association *asoc)
3682{
3683 struct sctp_strreset_tsnreq tsnreq;
3684 __u16 length = sizeof(tsnreq);
3685 struct sctp_chunk *retval;
3686
3687 retval = sctp_make_reconf(asoc, length);
3688 if (!retval)
3689 return NULL;
3690
3691 tsnreq.param_hdr.type = SCTP_PARAM_RESET_TSN_REQUEST;
3692 tsnreq.param_hdr.length = htons(length);
3693 tsnreq.request_seq = htonl(asoc->strreset_outseq);
3694
3695 sctp_addto_chunk(retval, sizeof(tsnreq), &tsnreq);
3696
3697 return retval;
3698}
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711struct sctp_chunk *sctp_make_strreset_addstrm(
3712 const struct sctp_association *asoc,
3713 __u16 out, __u16 in)
3714{
3715 struct sctp_strreset_addstrm addstrm;
3716 __u16 size = sizeof(addstrm);
3717 struct sctp_chunk *retval;
3718
3719 retval = sctp_make_reconf(asoc, (!!out + !!in) * size);
3720 if (!retval)
3721 return NULL;
3722
3723 if (out) {
3724 addstrm.param_hdr.type = SCTP_PARAM_RESET_ADD_OUT_STREAMS;
3725 addstrm.param_hdr.length = htons(size);
3726 addstrm.number_of_streams = htons(out);
3727 addstrm.request_seq = htonl(asoc->strreset_outseq);
3728 addstrm.reserved = 0;
3729
3730 sctp_addto_chunk(retval, size, &addstrm);
3731 }
3732
3733 if (in) {
3734 addstrm.param_hdr.type = SCTP_PARAM_RESET_ADD_IN_STREAMS;
3735 addstrm.param_hdr.length = htons(size);
3736 addstrm.number_of_streams = htons(in);
3737 addstrm.request_seq = htonl(asoc->strreset_outseq + !!out);
3738 addstrm.reserved = 0;
3739
3740 sctp_addto_chunk(retval, size, &addstrm);
3741 }
3742
3743 return retval;
3744}
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757struct sctp_chunk *sctp_make_strreset_resp(const struct sctp_association *asoc,
3758 __u32 result, __u32 sn)
3759{
3760 struct sctp_strreset_resp resp;
3761 __u16 length = sizeof(resp);
3762 struct sctp_chunk *retval;
3763
3764 retval = sctp_make_reconf(asoc, length);
3765 if (!retval)
3766 return NULL;
3767
3768 resp.param_hdr.type = SCTP_PARAM_RESET_RESPONSE;
3769 resp.param_hdr.length = htons(length);
3770 resp.response_seq = htonl(sn);
3771 resp.result = htonl(result);
3772
3773 sctp_addto_chunk(retval, sizeof(resp), &resp);
3774
3775 return retval;
3776}
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793struct sctp_chunk *sctp_make_strreset_tsnresp(struct sctp_association *asoc,
3794 __u32 result, __u32 sn,
3795 __u32 sender_tsn,
3796 __u32 receiver_tsn)
3797{
3798 struct sctp_strreset_resptsn tsnresp;
3799 __u16 length = sizeof(tsnresp);
3800 struct sctp_chunk *retval;
3801
3802 retval = sctp_make_reconf(asoc, length);
3803 if (!retval)
3804 return NULL;
3805
3806 tsnresp.param_hdr.type = SCTP_PARAM_RESET_RESPONSE;
3807 tsnresp.param_hdr.length = htons(length);
3808
3809 tsnresp.response_seq = htonl(sn);
3810 tsnresp.result = htonl(result);
3811 tsnresp.senders_next_tsn = htonl(sender_tsn);
3812 tsnresp.receivers_next_tsn = htonl(receiver_tsn);
3813
3814 sctp_addto_chunk(retval, sizeof(tsnresp), &tsnresp);
3815
3816 return retval;
3817}
3818
3819bool sctp_verify_reconf(const struct sctp_association *asoc,
3820 struct sctp_chunk *chunk,
3821 struct sctp_paramhdr **errp)
3822{
3823 struct sctp_reconf_chunk *hdr;
3824 union sctp_params param;
3825 __be16 last = 0;
3826 __u16 cnt = 0;
3827
3828 hdr = (struct sctp_reconf_chunk *)chunk->chunk_hdr;
3829 sctp_walk_params(param, hdr, params) {
3830 __u16 length = ntohs(param.p->length);
3831
3832 *errp = param.p;
3833 if (cnt++ > 2)
3834 return false;
3835 switch (param.p->type) {
3836 case SCTP_PARAM_RESET_OUT_REQUEST:
3837 if (length < sizeof(struct sctp_strreset_outreq) ||
3838 (last && last != SCTP_PARAM_RESET_RESPONSE &&
3839 last != SCTP_PARAM_RESET_IN_REQUEST))
3840 return false;
3841 break;
3842 case SCTP_PARAM_RESET_IN_REQUEST:
3843 if (length < sizeof(struct sctp_strreset_inreq) ||
3844 (last && last != SCTP_PARAM_RESET_OUT_REQUEST))
3845 return false;
3846 break;
3847 case SCTP_PARAM_RESET_RESPONSE:
3848 if ((length != sizeof(struct sctp_strreset_resp) &&
3849 length != sizeof(struct sctp_strreset_resptsn)) ||
3850 (last && last != SCTP_PARAM_RESET_RESPONSE &&
3851 last != SCTP_PARAM_RESET_OUT_REQUEST))
3852 return false;
3853 break;
3854 case SCTP_PARAM_RESET_TSN_REQUEST:
3855 if (length !=
3856 sizeof(struct sctp_strreset_tsnreq) || last)
3857 return false;
3858 break;
3859 case SCTP_PARAM_RESET_ADD_IN_STREAMS:
3860 if (length != sizeof(struct sctp_strreset_addstrm) ||
3861 (last && last != SCTP_PARAM_RESET_ADD_OUT_STREAMS))
3862 return false;
3863 break;
3864 case SCTP_PARAM_RESET_ADD_OUT_STREAMS:
3865 if (length != sizeof(struct sctp_strreset_addstrm) ||
3866 (last && last != SCTP_PARAM_RESET_ADD_IN_STREAMS))
3867 return false;
3868 break;
3869 default:
3870 return false;
3871 }
3872
3873 last = param.p->type;
3874 }
3875
3876 return true;
3877}
3878