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