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