1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
45
46#include <linux/types.h>
47#include <linux/fcntl.h>
48#include <linux/poll.h>
49#include <linux/init.h>
50
51#include <linux/slab.h>
52#include <linux/in.h>
53#include <net/ipv6.h>
54#include <net/sctp/sctp.h>
55#include <net/sctp/sm.h>
56
57
58static void sctp_select_active_and_retran_path(struct sctp_association *asoc);
59static void sctp_assoc_bh_rcv(struct work_struct *work);
60static void sctp_assoc_free_asconf_acks(struct sctp_association *asoc);
61static void sctp_assoc_free_asconf_queue(struct sctp_association *asoc);
62
63
64
65
66static struct sctp_association *sctp_association_init(
67 struct sctp_association *asoc,
68 const struct sctp_endpoint *ep,
69 const struct sock *sk,
70 enum sctp_scope scope, gfp_t gfp)
71{
72 struct net *net = sock_net(sk);
73 struct sctp_sock *sp;
74 struct sctp_paramhdr *p;
75 int i;
76
77
78 sp = sctp_sk((struct sock *)sk);
79
80
81 asoc->ep = (struct sctp_endpoint *)ep;
82 asoc->base.sk = (struct sock *)sk;
83
84 sctp_endpoint_hold(asoc->ep);
85 sock_hold(asoc->base.sk);
86
87
88 asoc->base.type = SCTP_EP_TYPE_ASSOCIATION;
89
90
91 refcount_set(&asoc->base.refcnt, 1);
92
93
94 sctp_bind_addr_init(&asoc->base.bind_addr, ep->base.bind_addr.port);
95
96 asoc->state = SCTP_STATE_CLOSED;
97 asoc->cookie_life = ms_to_ktime(sp->assocparams.sasoc_cookie_life);
98 asoc->user_frag = sp->user_frag;
99
100
101
102
103 asoc->max_retrans = sp->assocparams.sasoc_asocmaxrxt;
104 asoc->pf_retrans = net->sctp.pf_retrans;
105
106 asoc->rto_initial = msecs_to_jiffies(sp->rtoinfo.srto_initial);
107 asoc->rto_max = msecs_to_jiffies(sp->rtoinfo.srto_max);
108 asoc->rto_min = msecs_to_jiffies(sp->rtoinfo.srto_min);
109
110
111
112
113 asoc->hbinterval = msecs_to_jiffies(sp->hbinterval);
114
115
116 asoc->pathmaxrxt = sp->pathmaxrxt;
117
118
119 asoc->pathmtu = sp->pathmtu;
120
121
122 asoc->sackdelay = msecs_to_jiffies(sp->sackdelay);
123 asoc->sackfreq = sp->sackfreq;
124
125
126
127
128 asoc->param_flags = sp->param_flags;
129
130
131
132
133 asoc->max_burst = sp->max_burst;
134
135
136 asoc->timeouts[SCTP_EVENT_TIMEOUT_T1_COOKIE] = asoc->rto_initial;
137 asoc->timeouts[SCTP_EVENT_TIMEOUT_T1_INIT] = asoc->rto_initial;
138 asoc->timeouts[SCTP_EVENT_TIMEOUT_T2_SHUTDOWN] = asoc->rto_initial;
139
140
141
142
143
144 asoc->timeouts[SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD]
145 = 5 * asoc->rto_max;
146
147 asoc->timeouts[SCTP_EVENT_TIMEOUT_SACK] = asoc->sackdelay;
148 asoc->timeouts[SCTP_EVENT_TIMEOUT_AUTOCLOSE] = sp->autoclose * HZ;
149
150
151 for (i = SCTP_EVENT_TIMEOUT_NONE; i < SCTP_NUM_TIMEOUT_TYPES; ++i)
152 setup_timer(&asoc->timers[i], sctp_timer_events[i],
153 (unsigned long)asoc);
154
155
156
157
158
159 asoc->c.sinit_max_instreams = sp->initmsg.sinit_max_instreams;
160 asoc->c.sinit_num_ostreams = sp->initmsg.sinit_num_ostreams;
161 asoc->max_init_attempts = sp->initmsg.sinit_max_attempts;
162
163 asoc->max_init_timeo =
164 msecs_to_jiffies(sp->initmsg.sinit_max_init_timeo);
165
166
167
168
169
170
171 if ((sk->sk_rcvbuf/2) < SCTP_DEFAULT_MINWINDOW)
172 asoc->rwnd = SCTP_DEFAULT_MINWINDOW;
173 else
174 asoc->rwnd = sk->sk_rcvbuf/2;
175
176 asoc->a_rwnd = asoc->rwnd;
177
178
179 asoc->peer.rwnd = SCTP_DEFAULT_MAXWINDOW;
180
181
182 atomic_set(&asoc->rmem_alloc, 0);
183
184 init_waitqueue_head(&asoc->wait);
185
186 asoc->c.my_vtag = sctp_generate_tag(ep);
187 asoc->c.my_port = ep->base.bind_addr.port;
188
189 asoc->c.initial_tsn = sctp_generate_tsn(ep);
190
191 asoc->next_tsn = asoc->c.initial_tsn;
192
193 asoc->ctsn_ack_point = asoc->next_tsn - 1;
194 asoc->adv_peer_ack_point = asoc->ctsn_ack_point;
195 asoc->highest_sacked = asoc->ctsn_ack_point;
196 asoc->last_cwr_tsn = asoc->ctsn_ack_point;
197
198
199
200
201
202
203
204
205
206
207
208 asoc->addip_serial = asoc->c.initial_tsn;
209 asoc->strreset_outseq = asoc->c.initial_tsn;
210
211 INIT_LIST_HEAD(&asoc->addip_chunk_list);
212 INIT_LIST_HEAD(&asoc->asconf_ack_list);
213
214
215 INIT_LIST_HEAD(&asoc->peer.transport_addr_list);
216
217
218
219
220
221
222
223
224
225
226
227
228 asoc->peer.sack_needed = 1;
229 asoc->peer.sack_generation = 1;
230
231
232
233
234
235
236 if (net->sctp.addip_noauth)
237 asoc->peer.asconf_capable = 1;
238
239
240 sctp_inq_init(&asoc->base.inqueue);
241 sctp_inq_set_th_handler(&asoc->base.inqueue, sctp_assoc_bh_rcv);
242
243
244 sctp_outq_init(asoc, &asoc->outqueue);
245
246 if (!sctp_ulpq_init(&asoc->ulpq, asoc))
247 goto fail_init;
248
249 if (sctp_stream_init(&asoc->stream, asoc->c.sinit_num_ostreams,
250 0, gfp))
251 goto fail_init;
252
253
254
255
256 asoc->peer.ipv4_address = 1;
257 if (asoc->base.sk->sk_family == PF_INET6)
258 asoc->peer.ipv6_address = 1;
259 INIT_LIST_HEAD(&asoc->asocs);
260
261 asoc->default_stream = sp->default_stream;
262 asoc->default_ppid = sp->default_ppid;
263 asoc->default_flags = sp->default_flags;
264 asoc->default_context = sp->default_context;
265 asoc->default_timetolive = sp->default_timetolive;
266 asoc->default_rcv_context = sp->default_rcv_context;
267
268
269 INIT_LIST_HEAD(&asoc->endpoint_shared_keys);
270 if (sctp_auth_asoc_copy_shkeys(ep, asoc, gfp))
271 goto stream_free;
272
273 asoc->active_key_id = ep->active_key_id;
274 asoc->prsctp_enable = ep->prsctp_enable;
275 asoc->reconf_enable = ep->reconf_enable;
276 asoc->strreset_enable = ep->strreset_enable;
277
278
279 if (ep->auth_hmacs_list)
280 memcpy(asoc->c.auth_hmacs, ep->auth_hmacs_list,
281 ntohs(ep->auth_hmacs_list->param_hdr.length));
282 if (ep->auth_chunk_list)
283 memcpy(asoc->c.auth_chunks, ep->auth_chunk_list,
284 ntohs(ep->auth_chunk_list->param_hdr.length));
285
286
287 p = (struct sctp_paramhdr *)asoc->c.auth_random;
288 p->type = SCTP_PARAM_RANDOM;
289 p->length = htons(sizeof(*p) + SCTP_AUTH_RANDOM_LENGTH);
290 get_random_bytes(p+1, SCTP_AUTH_RANDOM_LENGTH);
291
292 return asoc;
293
294stream_free:
295 sctp_stream_free(&asoc->stream);
296fail_init:
297 sock_put(asoc->base.sk);
298 sctp_endpoint_put(asoc->ep);
299 return NULL;
300}
301
302
303struct sctp_association *sctp_association_new(const struct sctp_endpoint *ep,
304 const struct sock *sk,
305 enum sctp_scope scope, gfp_t gfp)
306{
307 struct sctp_association *asoc;
308
309 asoc = kzalloc(sizeof(*asoc), gfp);
310 if (!asoc)
311 goto fail;
312
313 if (!sctp_association_init(asoc, ep, sk, scope, gfp))
314 goto fail_init;
315
316 SCTP_DBG_OBJCNT_INC(assoc);
317
318 pr_debug("Created asoc %p\n", asoc);
319
320 return asoc;
321
322fail_init:
323 kfree(asoc);
324fail:
325 return NULL;
326}
327
328
329
330
331void sctp_association_free(struct sctp_association *asoc)
332{
333 struct sock *sk = asoc->base.sk;
334 struct sctp_transport *transport;
335 struct list_head *pos, *temp;
336 int i;
337
338
339
340
341 if (!list_empty(&asoc->asocs)) {
342 list_del(&asoc->asocs);
343
344
345
346
347 if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING))
348 sk->sk_ack_backlog--;
349 }
350
351
352
353
354 asoc->base.dead = true;
355
356
357 sctp_outq_free(&asoc->outqueue);
358
359
360 sctp_ulpq_free(&asoc->ulpq);
361
362
363 sctp_inq_free(&asoc->base.inqueue);
364
365 sctp_tsnmap_free(&asoc->peer.tsn_map);
366
367
368 sctp_stream_free(&asoc->stream);
369
370 if (asoc->strreset_chunk)
371 sctp_chunk_free(asoc->strreset_chunk);
372
373
374 sctp_bind_addr_free(&asoc->base.bind_addr);
375
376
377
378
379
380
381 for (i = SCTP_EVENT_TIMEOUT_NONE; i < SCTP_NUM_TIMEOUT_TYPES; ++i) {
382 if (del_timer(&asoc->timers[i]))
383 sctp_association_put(asoc);
384 }
385
386
387 kfree(asoc->peer.cookie);
388 kfree(asoc->peer.peer_random);
389 kfree(asoc->peer.peer_chunks);
390 kfree(asoc->peer.peer_hmacs);
391
392
393 list_for_each_safe(pos, temp, &asoc->peer.transport_addr_list) {
394 transport = list_entry(pos, struct sctp_transport, transports);
395 list_del_rcu(pos);
396 sctp_unhash_transport(transport);
397 sctp_transport_free(transport);
398 }
399
400 asoc->peer.transport_count = 0;
401
402 sctp_asconf_queue_teardown(asoc);
403
404
405 kfree(asoc->asconf_addr_del_pending);
406
407
408 sctp_auth_destroy_keys(&asoc->endpoint_shared_keys);
409
410
411 sctp_auth_key_put(asoc->asoc_shared_key);
412
413 sctp_association_put(asoc);
414}
415
416
417static void sctp_association_destroy(struct sctp_association *asoc)
418{
419 if (unlikely(!asoc->base.dead)) {
420 WARN(1, "Attempt to destroy undead association %p!\n", asoc);
421 return;
422 }
423
424 sctp_endpoint_put(asoc->ep);
425 sock_put(asoc->base.sk);
426
427 if (asoc->assoc_id != 0) {
428 spin_lock_bh(&sctp_assocs_id_lock);
429 idr_remove(&sctp_assocs_id, asoc->assoc_id);
430 spin_unlock_bh(&sctp_assocs_id_lock);
431 }
432
433 WARN_ON(atomic_read(&asoc->rmem_alloc));
434
435 kfree(asoc);
436 SCTP_DBG_OBJCNT_DEC(assoc);
437}
438
439
440void sctp_assoc_set_primary(struct sctp_association *asoc,
441 struct sctp_transport *transport)
442{
443 int changeover = 0;
444
445
446
447
448 if (asoc->peer.primary_path != NULL &&
449 asoc->peer.primary_path != transport)
450 changeover = 1 ;
451
452 asoc->peer.primary_path = transport;
453
454
455 memcpy(&asoc->peer.primary_addr, &transport->ipaddr,
456 sizeof(union sctp_addr));
457
458
459
460
461 if ((transport->state == SCTP_ACTIVE) ||
462 (transport->state == SCTP_UNKNOWN))
463 asoc->peer.active_path = transport;
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479 if (!asoc->outqueue.outstanding_bytes && !asoc->outqueue.out_qlen)
480 return;
481
482 if (transport->cacc.changeover_active)
483 transport->cacc.cycling_changeover = changeover;
484
485
486
487
488 transport->cacc.changeover_active = changeover;
489
490
491
492
493 transport->cacc.next_tsn_at_change = asoc->next_tsn;
494}
495
496
497void sctp_assoc_rm_peer(struct sctp_association *asoc,
498 struct sctp_transport *peer)
499{
500 struct list_head *pos;
501 struct sctp_transport *transport;
502
503 pr_debug("%s: association:%p addr:%pISpc\n",
504 __func__, asoc, &peer->ipaddr.sa);
505
506
507
508
509 if (asoc->peer.retran_path == peer)
510 sctp_assoc_update_retran_path(asoc);
511
512
513 list_del_rcu(&peer->transports);
514
515 sctp_unhash_transport(peer);
516
517
518 pos = asoc->peer.transport_addr_list.next;
519 transport = list_entry(pos, struct sctp_transport, transports);
520
521
522 if (asoc->peer.primary_path == peer)
523 sctp_assoc_set_primary(asoc, transport);
524 if (asoc->peer.active_path == peer)
525 asoc->peer.active_path = transport;
526 if (asoc->peer.retran_path == peer)
527 asoc->peer.retran_path = transport;
528 if (asoc->peer.last_data_from == peer)
529 asoc->peer.last_data_from = transport;
530
531 if (asoc->strreset_chunk &&
532 asoc->strreset_chunk->transport == peer) {
533 asoc->strreset_chunk->transport = transport;
534 sctp_transport_reset_reconf_timer(transport);
535 }
536
537
538
539
540
541
542 if (asoc->init_last_sent_to == peer)
543 asoc->init_last_sent_to = NULL;
544
545
546
547
548
549
550 if (asoc->shutdown_last_sent_to == peer)
551 asoc->shutdown_last_sent_to = NULL;
552
553
554
555
556 if (asoc->addip_last_asconf &&
557 asoc->addip_last_asconf->transport == peer)
558 asoc->addip_last_asconf->transport = NULL;
559
560
561
562
563 if (!list_empty(&peer->transmitted)) {
564 struct sctp_transport *active = asoc->peer.active_path;
565 struct sctp_chunk *ch;
566
567
568 list_for_each_entry(ch, &peer->transmitted,
569 transmitted_list) {
570 ch->transport = NULL;
571 ch->rtt_in_progress = 0;
572 }
573
574 list_splice_tail_init(&peer->transmitted,
575 &active->transmitted);
576
577
578
579
580
581 if (!timer_pending(&active->T3_rtx_timer))
582 if (!mod_timer(&active->T3_rtx_timer,
583 jiffies + active->rto))
584 sctp_transport_hold(active);
585 }
586
587 asoc->peer.transport_count--;
588
589 sctp_transport_free(peer);
590}
591
592
593struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *asoc,
594 const union sctp_addr *addr,
595 const gfp_t gfp,
596 const int peer_state)
597{
598 struct net *net = sock_net(asoc->base.sk);
599 struct sctp_transport *peer;
600 struct sctp_sock *sp;
601 unsigned short port;
602
603 sp = sctp_sk(asoc->base.sk);
604
605
606 port = ntohs(addr->v4.sin_port);
607
608 pr_debug("%s: association:%p addr:%pISpc state:%d\n", __func__,
609 asoc, &addr->sa, peer_state);
610
611
612 if (0 == asoc->peer.port)
613 asoc->peer.port = port;
614
615
616 peer = sctp_assoc_lookup_paddr(asoc, addr);
617 if (peer) {
618
619
620
621
622 if (peer->state == SCTP_UNKNOWN) {
623 peer->state = SCTP_ACTIVE;
624 }
625 return peer;
626 }
627
628 peer = sctp_transport_new(net, addr, gfp);
629 if (!peer)
630 return NULL;
631
632 sctp_transport_set_owner(peer, asoc);
633
634
635
636
637 peer->hbinterval = asoc->hbinterval;
638
639
640 peer->pathmaxrxt = asoc->pathmaxrxt;
641
642
643 peer->pf_retrans = asoc->pf_retrans;
644
645
646
647
648 peer->sackdelay = asoc->sackdelay;
649 peer->sackfreq = asoc->sackfreq;
650
651
652
653
654 peer->param_flags = asoc->param_flags;
655
656 sctp_transport_route(peer, NULL, sp);
657
658
659 if (peer->param_flags & SPP_PMTUD_DISABLE) {
660 if (asoc->pathmtu)
661 peer->pathmtu = asoc->pathmtu;
662 else
663 peer->pathmtu = SCTP_DEFAULT_MAXSEGMENT;
664 }
665
666
667
668
669
670
671 if (asoc->pathmtu)
672 asoc->pathmtu = min_t(int, peer->pathmtu, asoc->pathmtu);
673 else
674 asoc->pathmtu = peer->pathmtu;
675
676 pr_debug("%s: association:%p PMTU set to %d\n", __func__, asoc,
677 asoc->pathmtu);
678
679 peer->pmtu_pending = 0;
680
681 asoc->frag_point = sctp_frag_point(asoc, asoc->pathmtu);
682
683
684
685
686 sctp_packet_init(&peer->packet, peer, asoc->base.bind_addr.port,
687 asoc->peer.port);
688
689
690
691
692
693
694
695
696
697
698
699 peer->cwnd = min(4*asoc->pathmtu, max_t(__u32, 2*asoc->pathmtu, 4380));
700
701
702
703
704
705 peer->ssthresh = SCTP_DEFAULT_MAXWINDOW;
706
707 peer->partial_bytes_acked = 0;
708 peer->flight_size = 0;
709 peer->burst_limited = 0;
710
711
712 peer->rto = asoc->rto_initial;
713 sctp_max_rto(asoc, peer);
714
715
716 peer->state = peer_state;
717
718
719 if (sctp_hash_transport(peer)) {
720 sctp_transport_free(peer);
721 return NULL;
722 }
723
724
725 list_add_tail_rcu(&peer->transports, &asoc->peer.transport_addr_list);
726 asoc->peer.transport_count++;
727
728
729 if (!asoc->peer.primary_path) {
730 sctp_assoc_set_primary(asoc, peer);
731 asoc->peer.retran_path = peer;
732 }
733
734 if (asoc->peer.active_path == asoc->peer.retran_path &&
735 peer->state != SCTP_UNCONFIRMED) {
736 asoc->peer.retran_path = peer;
737 }
738
739 return peer;
740}
741
742
743void sctp_assoc_del_peer(struct sctp_association *asoc,
744 const union sctp_addr *addr)
745{
746 struct list_head *pos;
747 struct list_head *temp;
748 struct sctp_transport *transport;
749
750 list_for_each_safe(pos, temp, &asoc->peer.transport_addr_list) {
751 transport = list_entry(pos, struct sctp_transport, transports);
752 if (sctp_cmp_addr_exact(addr, &transport->ipaddr)) {
753
754 sctp_assoc_rm_peer(asoc, transport);
755 break;
756 }
757 }
758}
759
760
761struct sctp_transport *sctp_assoc_lookup_paddr(
762 const struct sctp_association *asoc,
763 const union sctp_addr *address)
764{
765 struct sctp_transport *t;
766
767
768
769 list_for_each_entry(t, &asoc->peer.transport_addr_list,
770 transports) {
771 if (sctp_cmp_addr_exact(address, &t->ipaddr))
772 return t;
773 }
774
775 return NULL;
776}
777
778
779void sctp_assoc_del_nonprimary_peers(struct sctp_association *asoc,
780 struct sctp_transport *primary)
781{
782 struct sctp_transport *temp;
783 struct sctp_transport *t;
784
785 list_for_each_entry_safe(t, temp, &asoc->peer.transport_addr_list,
786 transports) {
787
788 if (t != primary)
789 sctp_assoc_rm_peer(asoc, t);
790 }
791}
792
793
794
795
796
797void sctp_assoc_control_transport(struct sctp_association *asoc,
798 struct sctp_transport *transport,
799 enum sctp_transport_cmd command,
800 sctp_sn_error_t error)
801{
802 struct sctp_ulpevent *event;
803 struct sockaddr_storage addr;
804 int spc_state = 0;
805 bool ulp_notify = true;
806
807
808 switch (command) {
809 case SCTP_TRANSPORT_UP:
810
811
812
813
814 if (SCTP_UNCONFIRMED == transport->state &&
815 SCTP_HEARTBEAT_SUCCESS == error)
816 spc_state = SCTP_ADDR_CONFIRMED;
817 else
818 spc_state = SCTP_ADDR_AVAILABLE;
819
820
821
822
823 if (transport->state == SCTP_PF) {
824 ulp_notify = false;
825 transport->cwnd = asoc->pathmtu;
826 }
827 transport->state = SCTP_ACTIVE;
828 break;
829
830 case SCTP_TRANSPORT_DOWN:
831
832
833
834
835 if (transport->state != SCTP_UNCONFIRMED)
836 transport->state = SCTP_INACTIVE;
837 else {
838 sctp_transport_dst_release(transport);
839 ulp_notify = false;
840 }
841
842 spc_state = SCTP_ADDR_UNREACHABLE;
843 break;
844
845 case SCTP_TRANSPORT_PF:
846 transport->state = SCTP_PF;
847 ulp_notify = false;
848 break;
849
850 default:
851 return;
852 }
853
854
855
856
857 if (ulp_notify) {
858 memset(&addr, 0, sizeof(struct sockaddr_storage));
859 memcpy(&addr, &transport->ipaddr,
860 transport->af_specific->sockaddr_len);
861
862 event = sctp_ulpevent_make_peer_addr_change(asoc, &addr,
863 0, spc_state, error, GFP_ATOMIC);
864 if (event)
865 sctp_ulpq_tail_event(&asoc->ulpq, event);
866 }
867
868
869 sctp_select_active_and_retran_path(asoc);
870}
871
872
873void sctp_association_hold(struct sctp_association *asoc)
874{
875 refcount_inc(&asoc->base.refcnt);
876}
877
878
879
880
881void sctp_association_put(struct sctp_association *asoc)
882{
883 if (refcount_dec_and_test(&asoc->base.refcnt))
884 sctp_association_destroy(asoc);
885}
886
887
888
889
890__u32 sctp_association_get_next_tsn(struct sctp_association *asoc)
891{
892
893
894
895
896
897 __u32 retval = asoc->next_tsn;
898 asoc->next_tsn++;
899 asoc->unack_data++;
900
901 return retval;
902}
903
904
905
906
907int sctp_cmp_addr_exact(const union sctp_addr *ss1,
908 const union sctp_addr *ss2)
909{
910 struct sctp_af *af;
911
912 af = sctp_get_af_specific(ss1->sa.sa_family);
913 if (unlikely(!af))
914 return 0;
915
916 return af->cmp_addr(ss1, ss2);
917}
918
919
920
921
922
923struct sctp_chunk *sctp_get_ecne_prepend(struct sctp_association *asoc)
924{
925 if (!asoc->need_ecne)
926 return NULL;
927
928
929
930
931 return sctp_make_ecne(asoc, asoc->last_ecne_tsn);
932}
933
934
935
936
937struct sctp_transport *sctp_assoc_lookup_tsn(struct sctp_association *asoc,
938 __u32 tsn)
939{
940 struct sctp_transport *active;
941 struct sctp_transport *match;
942 struct sctp_transport *transport;
943 struct sctp_chunk *chunk;
944 __be32 key = htonl(tsn);
945
946 match = NULL;
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963 active = asoc->peer.active_path;
964
965 list_for_each_entry(chunk, &active->transmitted,
966 transmitted_list) {
967
968 if (key == chunk->subh.data_hdr->tsn) {
969 match = active;
970 goto out;
971 }
972 }
973
974
975 list_for_each_entry(transport, &asoc->peer.transport_addr_list,
976 transports) {
977
978 if (transport == active)
979 continue;
980 list_for_each_entry(chunk, &transport->transmitted,
981 transmitted_list) {
982 if (key == chunk->subh.data_hdr->tsn) {
983 match = transport;
984 goto out;
985 }
986 }
987 }
988out:
989 return match;
990}
991
992
993struct sctp_transport *sctp_assoc_is_match(struct sctp_association *asoc,
994 struct net *net,
995 const union sctp_addr *laddr,
996 const union sctp_addr *paddr)
997{
998 struct sctp_transport *transport;
999
1000 if ((htons(asoc->base.bind_addr.port) == laddr->v4.sin_port) &&
1001 (htons(asoc->peer.port) == paddr->v4.sin_port) &&
1002 net_eq(sock_net(asoc->base.sk), net)) {
1003 transport = sctp_assoc_lookup_paddr(asoc, paddr);
1004 if (!transport)
1005 goto out;
1006
1007 if (sctp_bind_addr_match(&asoc->base.bind_addr, laddr,
1008 sctp_sk(asoc->base.sk)))
1009 goto out;
1010 }
1011 transport = NULL;
1012
1013out:
1014 return transport;
1015}
1016
1017
1018static void sctp_assoc_bh_rcv(struct work_struct *work)
1019{
1020 struct sctp_association *asoc =
1021 container_of(work, struct sctp_association,
1022 base.inqueue.immediate);
1023 struct net *net = sock_net(asoc->base.sk);
1024 union sctp_subtype subtype;
1025 struct sctp_endpoint *ep;
1026 struct sctp_chunk *chunk;
1027 struct sctp_inq *inqueue;
1028 int state;
1029 int error = 0;
1030
1031
1032 ep = asoc->ep;
1033
1034 inqueue = &asoc->base.inqueue;
1035 sctp_association_hold(asoc);
1036 while (NULL != (chunk = sctp_inq_pop(inqueue))) {
1037 state = asoc->state;
1038 subtype = SCTP_ST_CHUNK(chunk->chunk_hdr->type);
1039
1040
1041
1042
1043
1044
1045
1046
1047 if (sctp_auth_recv_cid(subtype.chunk, asoc) && !chunk->auth)
1048 continue;
1049
1050
1051
1052
1053 if (sctp_chunk_is_data(chunk))
1054 asoc->peer.last_data_from = chunk->transport;
1055 else {
1056 SCTP_INC_STATS(net, SCTP_MIB_INCTRLCHUNKS);
1057 asoc->stats.ictrlchunks++;
1058 if (chunk->chunk_hdr->type == SCTP_CID_SACK)
1059 asoc->stats.isacks++;
1060 }
1061
1062 if (chunk->transport)
1063 chunk->transport->last_time_heard = ktime_get();
1064
1065
1066 error = sctp_do_sm(net, SCTP_EVENT_T_CHUNK, subtype,
1067 state, ep, asoc, chunk, GFP_ATOMIC);
1068
1069
1070
1071
1072 if (asoc->base.dead)
1073 break;
1074
1075
1076 if (error && chunk)
1077 chunk->pdiscard = 1;
1078 }
1079 sctp_association_put(asoc);
1080}
1081
1082
1083void sctp_assoc_migrate(struct sctp_association *assoc, struct sock *newsk)
1084{
1085 struct sctp_sock *newsp = sctp_sk(newsk);
1086 struct sock *oldsk = assoc->base.sk;
1087
1088
1089
1090
1091 list_del_init(&assoc->asocs);
1092
1093
1094 if (sctp_style(oldsk, TCP))
1095 oldsk->sk_ack_backlog--;
1096
1097
1098 sctp_endpoint_put(assoc->ep);
1099 sock_put(assoc->base.sk);
1100
1101
1102 assoc->ep = newsp->ep;
1103 sctp_endpoint_hold(assoc->ep);
1104
1105
1106 assoc->base.sk = newsk;
1107 sock_hold(assoc->base.sk);
1108
1109
1110 sctp_endpoint_add_asoc(newsp->ep, assoc);
1111}
1112
1113
1114int sctp_assoc_update(struct sctp_association *asoc,
1115 struct sctp_association *new)
1116{
1117 struct sctp_transport *trans;
1118 struct list_head *pos, *temp;
1119
1120
1121 asoc->c = new->c;
1122 asoc->peer.rwnd = new->peer.rwnd;
1123 asoc->peer.sack_needed = new->peer.sack_needed;
1124 asoc->peer.auth_capable = new->peer.auth_capable;
1125 asoc->peer.i = new->peer.i;
1126
1127 if (!sctp_tsnmap_init(&asoc->peer.tsn_map, SCTP_TSN_MAP_INITIAL,
1128 asoc->peer.i.initial_tsn, GFP_ATOMIC))
1129 return -ENOMEM;
1130
1131
1132 list_for_each_safe(pos, temp, &asoc->peer.transport_addr_list) {
1133 trans = list_entry(pos, struct sctp_transport, transports);
1134 if (!sctp_assoc_lookup_paddr(new, &trans->ipaddr)) {
1135 sctp_assoc_rm_peer(asoc, trans);
1136 continue;
1137 }
1138
1139 if (asoc->state >= SCTP_STATE_ESTABLISHED)
1140 sctp_transport_reset(trans);
1141 }
1142
1143
1144
1145
1146
1147
1148 if (asoc->state >= SCTP_STATE_ESTABLISHED) {
1149 asoc->next_tsn = new->next_tsn;
1150 asoc->ctsn_ack_point = new->ctsn_ack_point;
1151 asoc->adv_peer_ack_point = new->adv_peer_ack_point;
1152
1153
1154
1155
1156 sctp_stream_clear(&asoc->stream);
1157
1158
1159
1160
1161
1162 sctp_ulpq_flush(&asoc->ulpq);
1163
1164
1165
1166
1167
1168 asoc->overall_error_count = 0;
1169
1170 } else {
1171
1172 list_for_each_entry(trans, &new->peer.transport_addr_list,
1173 transports)
1174 if (!sctp_assoc_lookup_paddr(asoc, &trans->ipaddr) &&
1175 !sctp_assoc_add_peer(asoc, &trans->ipaddr,
1176 GFP_ATOMIC, trans->state))
1177 return -ENOMEM;
1178
1179 asoc->ctsn_ack_point = asoc->next_tsn - 1;
1180 asoc->adv_peer_ack_point = asoc->ctsn_ack_point;
1181
1182 if (sctp_state(asoc, COOKIE_WAIT))
1183 sctp_stream_update(&asoc->stream, &new->stream);
1184
1185
1186 if (sctp_assoc_set_id(asoc, GFP_ATOMIC))
1187 return -ENOMEM;
1188 }
1189
1190
1191
1192
1193 kfree(asoc->peer.peer_random);
1194 asoc->peer.peer_random = new->peer.peer_random;
1195 new->peer.peer_random = NULL;
1196
1197 kfree(asoc->peer.peer_chunks);
1198 asoc->peer.peer_chunks = new->peer.peer_chunks;
1199 new->peer.peer_chunks = NULL;
1200
1201 kfree(asoc->peer.peer_hmacs);
1202 asoc->peer.peer_hmacs = new->peer.peer_hmacs;
1203 new->peer.peer_hmacs = NULL;
1204
1205 return sctp_auth_asoc_init_active_key(asoc, GFP_ATOMIC);
1206}
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236static u8 sctp_trans_score(const struct sctp_transport *trans)
1237{
1238 switch (trans->state) {
1239 case SCTP_ACTIVE:
1240 return 3;
1241 case SCTP_UNKNOWN:
1242 return 2;
1243 case SCTP_PF:
1244 return 1;
1245 default:
1246 return 0;
1247 }
1248}
1249
1250static struct sctp_transport *sctp_trans_elect_tie(struct sctp_transport *trans1,
1251 struct sctp_transport *trans2)
1252{
1253 if (trans1->error_count > trans2->error_count) {
1254 return trans2;
1255 } else if (trans1->error_count == trans2->error_count &&
1256 ktime_after(trans2->last_time_heard,
1257 trans1->last_time_heard)) {
1258 return trans2;
1259 } else {
1260 return trans1;
1261 }
1262}
1263
1264static struct sctp_transport *sctp_trans_elect_best(struct sctp_transport *curr,
1265 struct sctp_transport *best)
1266{
1267 u8 score_curr, score_best;
1268
1269 if (best == NULL || curr == best)
1270 return curr;
1271
1272 score_curr = sctp_trans_score(curr);
1273 score_best = sctp_trans_score(best);
1274
1275
1276
1277
1278
1279 if (score_curr > score_best)
1280 return curr;
1281 else if (score_curr == score_best)
1282 return sctp_trans_elect_tie(best, curr);
1283 else
1284 return best;
1285}
1286
1287void sctp_assoc_update_retran_path(struct sctp_association *asoc)
1288{
1289 struct sctp_transport *trans = asoc->peer.retran_path;
1290 struct sctp_transport *trans_next = NULL;
1291
1292
1293 if (asoc->peer.transport_count == 1)
1294 return;
1295
1296
1297
1298 if (asoc->peer.active_path == asoc->peer.retran_path &&
1299 asoc->peer.active_path->state == SCTP_ACTIVE)
1300 return;
1301
1302
1303 for (trans = list_next_entry(trans, transports); 1;
1304 trans = list_next_entry(trans, transports)) {
1305
1306 if (&trans->transports == &asoc->peer.transport_addr_list)
1307 continue;
1308 if (trans->state == SCTP_UNCONFIRMED)
1309 continue;
1310 trans_next = sctp_trans_elect_best(trans, trans_next);
1311
1312 if (trans_next->state == SCTP_ACTIVE)
1313 break;
1314
1315 if (trans == asoc->peer.retran_path)
1316 break;
1317 }
1318
1319 asoc->peer.retran_path = trans_next;
1320
1321 pr_debug("%s: association:%p updated new path to addr:%pISpc\n",
1322 __func__, asoc, &asoc->peer.retran_path->ipaddr.sa);
1323}
1324
1325static void sctp_select_active_and_retran_path(struct sctp_association *asoc)
1326{
1327 struct sctp_transport *trans, *trans_pri = NULL, *trans_sec = NULL;
1328 struct sctp_transport *trans_pf = NULL;
1329
1330
1331 list_for_each_entry(trans, &asoc->peer.transport_addr_list,
1332 transports) {
1333
1334 if (trans->state == SCTP_INACTIVE ||
1335 trans->state == SCTP_UNCONFIRMED)
1336 continue;
1337
1338
1339
1340 if (trans->state == SCTP_PF) {
1341 trans_pf = sctp_trans_elect_best(trans, trans_pf);
1342 continue;
1343 }
1344
1345 if (trans_pri == NULL ||
1346 ktime_after(trans->last_time_heard,
1347 trans_pri->last_time_heard)) {
1348 trans_sec = trans_pri;
1349 trans_pri = trans;
1350 } else if (trans_sec == NULL ||
1351 ktime_after(trans->last_time_heard,
1352 trans_sec->last_time_heard)) {
1353 trans_sec = trans;
1354 }
1355 }
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365 if ((asoc->peer.primary_path->state == SCTP_ACTIVE ||
1366 asoc->peer.primary_path->state == SCTP_UNKNOWN) &&
1367 asoc->peer.primary_path != trans_pri) {
1368 trans_sec = trans_pri;
1369 trans_pri = asoc->peer.primary_path;
1370 }
1371
1372
1373
1374
1375
1376 if (trans_sec == NULL)
1377 trans_sec = trans_pri;
1378
1379
1380
1381
1382 if (trans_pri == NULL) {
1383 trans_pri = sctp_trans_elect_best(asoc->peer.active_path, trans_pf);
1384 trans_sec = trans_pri;
1385 }
1386
1387
1388 asoc->peer.active_path = trans_pri;
1389 asoc->peer.retran_path = trans_sec;
1390}
1391
1392struct sctp_transport *
1393sctp_assoc_choose_alter_transport(struct sctp_association *asoc,
1394 struct sctp_transport *last_sent_to)
1395{
1396
1397
1398
1399
1400 if (last_sent_to == NULL) {
1401 return asoc->peer.active_path;
1402 } else {
1403 if (last_sent_to == asoc->peer.retran_path)
1404 sctp_assoc_update_retran_path(asoc);
1405
1406 return asoc->peer.retran_path;
1407 }
1408}
1409
1410
1411
1412
1413void sctp_assoc_sync_pmtu(struct sctp_association *asoc)
1414{
1415 struct sctp_transport *t;
1416 __u32 pmtu = 0;
1417
1418 if (!asoc)
1419 return;
1420
1421
1422 list_for_each_entry(t, &asoc->peer.transport_addr_list,
1423 transports) {
1424 if (t->pmtu_pending && t->dst) {
1425 sctp_transport_update_pmtu(
1426 t, SCTP_TRUNC4(dst_mtu(t->dst)));
1427 t->pmtu_pending = 0;
1428 }
1429 if (!pmtu || (t->pathmtu < pmtu))
1430 pmtu = t->pathmtu;
1431 }
1432
1433 if (pmtu) {
1434 asoc->pathmtu = pmtu;
1435 asoc->frag_point = sctp_frag_point(asoc, pmtu);
1436 }
1437
1438 pr_debug("%s: asoc:%p, pmtu:%d, frag_point:%d\n", __func__, asoc,
1439 asoc->pathmtu, asoc->frag_point);
1440}
1441
1442
1443static inline bool sctp_peer_needs_update(struct sctp_association *asoc)
1444{
1445 struct net *net = sock_net(asoc->base.sk);
1446 switch (asoc->state) {
1447 case SCTP_STATE_ESTABLISHED:
1448 case SCTP_STATE_SHUTDOWN_PENDING:
1449 case SCTP_STATE_SHUTDOWN_RECEIVED:
1450 case SCTP_STATE_SHUTDOWN_SENT:
1451 if ((asoc->rwnd > asoc->a_rwnd) &&
1452 ((asoc->rwnd - asoc->a_rwnd) >= max_t(__u32,
1453 (asoc->base.sk->sk_rcvbuf >> net->sctp.rwnd_upd_shift),
1454 asoc->pathmtu)))
1455 return true;
1456 break;
1457 default:
1458 break;
1459 }
1460 return false;
1461}
1462
1463
1464void sctp_assoc_rwnd_increase(struct sctp_association *asoc, unsigned int len)
1465{
1466 struct sctp_chunk *sack;
1467 struct timer_list *timer;
1468
1469 if (asoc->rwnd_over) {
1470 if (asoc->rwnd_over >= len) {
1471 asoc->rwnd_over -= len;
1472 } else {
1473 asoc->rwnd += (len - asoc->rwnd_over);
1474 asoc->rwnd_over = 0;
1475 }
1476 } else {
1477 asoc->rwnd += len;
1478 }
1479
1480
1481
1482
1483
1484
1485 if (asoc->rwnd_press) {
1486 int change = min(asoc->pathmtu, asoc->rwnd_press);
1487 asoc->rwnd += change;
1488 asoc->rwnd_press -= change;
1489 }
1490
1491 pr_debug("%s: asoc:%p rwnd increased by %d to (%u, %u) - %u\n",
1492 __func__, asoc, len, asoc->rwnd, asoc->rwnd_over,
1493 asoc->a_rwnd);
1494
1495
1496
1497
1498
1499
1500 if (sctp_peer_needs_update(asoc)) {
1501 asoc->a_rwnd = asoc->rwnd;
1502
1503 pr_debug("%s: sending window update SACK- asoc:%p rwnd:%u "
1504 "a_rwnd:%u\n", __func__, asoc, asoc->rwnd,
1505 asoc->a_rwnd);
1506
1507 sack = sctp_make_sack(asoc);
1508 if (!sack)
1509 return;
1510
1511 asoc->peer.sack_needed = 0;
1512
1513 sctp_outq_tail(&asoc->outqueue, sack, GFP_ATOMIC);
1514
1515
1516 timer = &asoc->timers[SCTP_EVENT_TIMEOUT_SACK];
1517 if (del_timer(timer))
1518 sctp_association_put(asoc);
1519 }
1520}
1521
1522
1523void sctp_assoc_rwnd_decrease(struct sctp_association *asoc, unsigned int len)
1524{
1525 int rx_count;
1526 int over = 0;
1527
1528 if (unlikely(!asoc->rwnd || asoc->rwnd_over))
1529 pr_debug("%s: association:%p has asoc->rwnd:%u, "
1530 "asoc->rwnd_over:%u!\n", __func__, asoc,
1531 asoc->rwnd, asoc->rwnd_over);
1532
1533 if (asoc->ep->rcvbuf_policy)
1534 rx_count = atomic_read(&asoc->rmem_alloc);
1535 else
1536 rx_count = atomic_read(&asoc->base.sk->sk_rmem_alloc);
1537
1538
1539
1540
1541
1542
1543 if (rx_count >= asoc->base.sk->sk_rcvbuf)
1544 over = 1;
1545
1546 if (asoc->rwnd >= len) {
1547 asoc->rwnd -= len;
1548 if (over) {
1549 asoc->rwnd_press += asoc->rwnd;
1550 asoc->rwnd = 0;
1551 }
1552 } else {
1553 asoc->rwnd_over += len - asoc->rwnd;
1554 asoc->rwnd = 0;
1555 }
1556
1557 pr_debug("%s: asoc:%p rwnd decreased by %d to (%u, %u, %u)\n",
1558 __func__, asoc, len, asoc->rwnd, asoc->rwnd_over,
1559 asoc->rwnd_press);
1560}
1561
1562
1563
1564
1565int sctp_assoc_set_bind_addr_from_ep(struct sctp_association *asoc,
1566 enum sctp_scope scope, gfp_t gfp)
1567{
1568 int flags;
1569
1570
1571
1572
1573 flags = (PF_INET6 == asoc->base.sk->sk_family) ? SCTP_ADDR6_ALLOWED : 0;
1574 if (asoc->peer.ipv4_address)
1575 flags |= SCTP_ADDR4_PEERSUPP;
1576 if (asoc->peer.ipv6_address)
1577 flags |= SCTP_ADDR6_PEERSUPP;
1578
1579 return sctp_bind_addr_copy(sock_net(asoc->base.sk),
1580 &asoc->base.bind_addr,
1581 &asoc->ep->base.bind_addr,
1582 scope, gfp, flags);
1583}
1584
1585
1586int sctp_assoc_set_bind_addr_from_cookie(struct sctp_association *asoc,
1587 struct sctp_cookie *cookie,
1588 gfp_t gfp)
1589{
1590 int var_size2 = ntohs(cookie->peer_init->chunk_hdr.length);
1591 int var_size3 = cookie->raw_addr_list_len;
1592 __u8 *raw = (__u8 *)cookie->peer_init + var_size2;
1593
1594 return sctp_raw_to_bind_addrs(&asoc->base.bind_addr, raw, var_size3,
1595 asoc->ep->base.bind_addr.port, gfp);
1596}
1597
1598
1599int sctp_assoc_lookup_laddr(struct sctp_association *asoc,
1600 const union sctp_addr *laddr)
1601{
1602 int found = 0;
1603
1604 if ((asoc->base.bind_addr.port == ntohs(laddr->v4.sin_port)) &&
1605 sctp_bind_addr_match(&asoc->base.bind_addr, laddr,
1606 sctp_sk(asoc->base.sk)))
1607 found = 1;
1608
1609 return found;
1610}
1611
1612
1613int sctp_assoc_set_id(struct sctp_association *asoc, gfp_t gfp)
1614{
1615 bool preload = gfpflags_allow_blocking(gfp);
1616 int ret;
1617
1618
1619 if (asoc->assoc_id)
1620 return 0;
1621
1622 if (preload)
1623 idr_preload(gfp);
1624 spin_lock_bh(&sctp_assocs_id_lock);
1625
1626 ret = idr_alloc_cyclic(&sctp_assocs_id, asoc, 1, 0, GFP_NOWAIT);
1627 spin_unlock_bh(&sctp_assocs_id_lock);
1628 if (preload)
1629 idr_preload_end();
1630 if (ret < 0)
1631 return ret;
1632
1633 asoc->assoc_id = (sctp_assoc_t)ret;
1634 return 0;
1635}
1636
1637
1638static void sctp_assoc_free_asconf_queue(struct sctp_association *asoc)
1639{
1640 struct sctp_chunk *asconf;
1641 struct sctp_chunk *tmp;
1642
1643 list_for_each_entry_safe(asconf, tmp, &asoc->addip_chunk_list, list) {
1644 list_del_init(&asconf->list);
1645 sctp_chunk_free(asconf);
1646 }
1647}
1648
1649
1650static void sctp_assoc_free_asconf_acks(struct sctp_association *asoc)
1651{
1652 struct sctp_chunk *ack;
1653 struct sctp_chunk *tmp;
1654
1655 list_for_each_entry_safe(ack, tmp, &asoc->asconf_ack_list,
1656 transmitted_list) {
1657 list_del_init(&ack->transmitted_list);
1658 sctp_chunk_free(ack);
1659 }
1660}
1661
1662
1663void sctp_assoc_clean_asconf_ack_cache(const struct sctp_association *asoc)
1664{
1665 struct sctp_chunk *ack;
1666 struct sctp_chunk *tmp;
1667
1668
1669
1670
1671 list_for_each_entry_safe(ack, tmp, &asoc->asconf_ack_list,
1672 transmitted_list) {
1673 if (ack->subh.addip_hdr->serial ==
1674 htonl(asoc->peer.addip_serial))
1675 break;
1676
1677 list_del_init(&ack->transmitted_list);
1678 sctp_chunk_free(ack);
1679 }
1680}
1681
1682
1683struct sctp_chunk *sctp_assoc_lookup_asconf_ack(
1684 const struct sctp_association *asoc,
1685 __be32 serial)
1686{
1687 struct sctp_chunk *ack;
1688
1689
1690
1691
1692 list_for_each_entry(ack, &asoc->asconf_ack_list, transmitted_list) {
1693 if (sctp_chunk_pending(ack))
1694 continue;
1695 if (ack->subh.addip_hdr->serial == serial) {
1696 sctp_chunk_hold(ack);
1697 return ack;
1698 }
1699 }
1700
1701 return NULL;
1702}
1703
1704void sctp_asconf_queue_teardown(struct sctp_association *asoc)
1705{
1706
1707 sctp_assoc_free_asconf_acks(asoc);
1708
1709
1710 sctp_assoc_free_asconf_queue(asoc);
1711
1712
1713 if (asoc->addip_last_asconf)
1714 sctp_chunk_free(asoc->addip_last_asconf);
1715}
1716