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#include <linux/types.h>
45#include <linux/list.h>
46#include <linux/socket.h>
47#include <linux/ip.h>
48#include <linux/time.h>
49#include <linux/slab.h>
50#include <net/ip.h>
51#include <net/icmp.h>
52#include <net/snmp.h>
53#include <net/sock.h>
54#include <net/xfrm.h>
55#include <net/sctp/sctp.h>
56#include <net/sctp/sm.h>
57#include <net/sctp/checksum.h>
58#include <net/net_namespace.h>
59
60
61static int sctp_rcv_ootb(struct sk_buff *);
62static struct sctp_association *__sctp_rcv_lookup(struct net *net,
63 struct sk_buff *skb,
64 const union sctp_addr *paddr,
65 const union sctp_addr *laddr,
66 struct sctp_transport **transportp);
67static struct sctp_endpoint *__sctp_rcv_lookup_endpoint(struct net *net,
68 const union sctp_addr *laddr);
69static struct sctp_association *__sctp_lookup_association(
70 struct net *net,
71 const union sctp_addr *local,
72 const union sctp_addr *peer,
73 struct sctp_transport **pt);
74
75static int sctp_add_backlog(struct sock *sk, struct sk_buff *skb);
76
77
78
79static inline int sctp_rcv_checksum(struct net *net, struct sk_buff *skb)
80{
81 struct sctphdr *sh = sctp_hdr(skb);
82 __le32 cmp = sh->checksum;
83 __le32 val = sctp_compute_cksum(skb, 0);
84
85 if (val != cmp) {
86
87 __SCTP_INC_STATS(net, SCTP_MIB_CHECKSUMERRORS);
88 return -1;
89 }
90 return 0;
91}
92
93
94
95
96int sctp_rcv(struct sk_buff *skb)
97{
98 struct sock *sk;
99 struct sctp_association *asoc;
100 struct sctp_endpoint *ep = NULL;
101 struct sctp_ep_common *rcvr;
102 struct sctp_transport *transport = NULL;
103 struct sctp_chunk *chunk;
104 union sctp_addr src;
105 union sctp_addr dest;
106 int family;
107 struct sctp_af *af;
108 struct net *net = dev_net(skb->dev);
109
110 if (skb->pkt_type != PACKET_HOST)
111 goto discard_it;
112
113 __SCTP_INC_STATS(net, SCTP_MIB_INSCTPPACKS);
114
115
116
117
118 if (skb->len < sizeof(struct sctphdr) + sizeof(struct sctp_chunkhdr) +
119 skb_transport_offset(skb))
120 goto discard_it;
121
122
123
124
125
126 if ((!(skb_shinfo(skb)->gso_type & SKB_GSO_SCTP) &&
127 skb_linearize(skb)) ||
128 !pskb_may_pull(skb, sizeof(struct sctphdr)))
129 goto discard_it;
130
131
132 __skb_pull(skb, skb_transport_offset(skb));
133
134 skb->csum_valid = 0;
135 if (skb_csum_unnecessary(skb))
136 __skb_decr_checksum_unnecessary(skb);
137 else if (!sctp_checksum_disable &&
138 !(skb_shinfo(skb)->gso_type & SKB_GSO_SCTP) &&
139 sctp_rcv_checksum(net, skb) < 0)
140 goto discard_it;
141 skb->csum_valid = 1;
142
143 __skb_pull(skb, sizeof(struct sctphdr));
144
145 family = ipver2af(ip_hdr(skb)->version);
146 af = sctp_get_af_specific(family);
147 if (unlikely(!af))
148 goto discard_it;
149 SCTP_INPUT_CB(skb)->af = af;
150
151
152 af->from_skb(&src, skb, 1);
153 af->from_skb(&dest, skb, 0);
154
155
156
157
158
159
160
161
162
163
164
165
166 if (!af->addr_valid(&src, NULL, skb) ||
167 !af->addr_valid(&dest, NULL, skb))
168 goto discard_it;
169
170 asoc = __sctp_rcv_lookup(net, skb, &src, &dest, &transport);
171
172 if (!asoc)
173 ep = __sctp_rcv_lookup_endpoint(net, &dest);
174
175
176 rcvr = asoc ? &asoc->base : &ep->base;
177 sk = rcvr->sk;
178
179
180
181
182
183 if (sk->sk_bound_dev_if && (sk->sk_bound_dev_if != af->skb_iif(skb))) {
184 if (transport) {
185 sctp_transport_put(transport);
186 asoc = NULL;
187 transport = NULL;
188 } else {
189 sctp_endpoint_put(ep);
190 ep = NULL;
191 }
192 sk = net->sctp.ctl_sock;
193 ep = sctp_sk(sk)->ep;
194 sctp_endpoint_hold(ep);
195 rcvr = &ep->base;
196 }
197
198
199
200
201
202
203
204
205
206 if (!asoc) {
207 if (sctp_rcv_ootb(skb)) {
208 __SCTP_INC_STATS(net, SCTP_MIB_OUTOFBLUES);
209 goto discard_release;
210 }
211 }
212
213 if (!xfrm_policy_check(sk, XFRM_POLICY_IN, skb, family))
214 goto discard_release;
215 nf_reset(skb);
216
217 if (sk_filter(sk, skb))
218 goto discard_release;
219
220
221 chunk = sctp_chunkify(skb, asoc, sk, GFP_ATOMIC);
222 if (!chunk)
223 goto discard_release;
224 SCTP_INPUT_CB(skb)->chunk = chunk;
225
226
227 chunk->rcvr = rcvr;
228
229
230 chunk->sctp_hdr = sctp_hdr(skb);
231
232
233 sctp_init_addrs(chunk, &src, &dest);
234
235
236 chunk->transport = transport;
237
238
239
240
241
242 bh_lock_sock(sk);
243
244 if (sk != rcvr->sk) {
245
246
247
248
249
250
251
252 bh_unlock_sock(sk);
253 sk = rcvr->sk;
254 bh_lock_sock(sk);
255 }
256
257 if (sock_owned_by_user(sk)) {
258 if (sctp_add_backlog(sk, skb)) {
259 bh_unlock_sock(sk);
260 sctp_chunk_free(chunk);
261 skb = NULL;
262 goto discard_release;
263 }
264 __SCTP_INC_STATS(net, SCTP_MIB_IN_PKT_BACKLOG);
265 } else {
266 __SCTP_INC_STATS(net, SCTP_MIB_IN_PKT_SOFTIRQ);
267 sctp_inq_push(&chunk->rcvr->inqueue, chunk);
268 }
269
270 bh_unlock_sock(sk);
271
272
273 if (transport)
274 sctp_transport_put(transport);
275 else
276 sctp_endpoint_put(ep);
277
278 return 0;
279
280discard_it:
281 __SCTP_INC_STATS(net, SCTP_MIB_IN_PKT_DISCARDS);
282 kfree_skb(skb);
283 return 0;
284
285discard_release:
286
287 if (transport)
288 sctp_transport_put(transport);
289 else
290 sctp_endpoint_put(ep);
291
292 goto discard_it;
293}
294
295
296
297
298
299
300int sctp_backlog_rcv(struct sock *sk, struct sk_buff *skb)
301{
302 struct sctp_chunk *chunk = SCTP_INPUT_CB(skb)->chunk;
303 struct sctp_inq *inqueue = &chunk->rcvr->inqueue;
304 struct sctp_transport *t = chunk->transport;
305 struct sctp_ep_common *rcvr = NULL;
306 int backloged = 0;
307
308 rcvr = chunk->rcvr;
309
310
311
312
313
314 if (rcvr->dead) {
315 sctp_chunk_free(chunk);
316 goto done;
317 }
318
319 if (unlikely(rcvr->sk != sk)) {
320
321
322
323
324
325
326
327
328
329
330
331 sk = rcvr->sk;
332 local_bh_disable();
333 bh_lock_sock(sk);
334
335 if (sock_owned_by_user(sk)) {
336 if (sk_add_backlog(sk, skb, sk->sk_rcvbuf))
337 sctp_chunk_free(chunk);
338 else
339 backloged = 1;
340 } else
341 sctp_inq_push(inqueue, chunk);
342
343 bh_unlock_sock(sk);
344 local_bh_enable();
345
346
347 if (backloged)
348 return 0;
349 } else {
350 sctp_inq_push(inqueue, chunk);
351 }
352
353done:
354
355 if (SCTP_EP_TYPE_ASSOCIATION == rcvr->type)
356 sctp_transport_put(t);
357 else if (SCTP_EP_TYPE_SOCKET == rcvr->type)
358 sctp_endpoint_put(sctp_ep(rcvr));
359 else
360 BUG();
361
362 return 0;
363}
364
365static int sctp_add_backlog(struct sock *sk, struct sk_buff *skb)
366{
367 struct sctp_chunk *chunk = SCTP_INPUT_CB(skb)->chunk;
368 struct sctp_transport *t = chunk->transport;
369 struct sctp_ep_common *rcvr = chunk->rcvr;
370 int ret;
371
372 ret = sk_add_backlog(sk, skb, sk->sk_rcvbuf);
373 if (!ret) {
374
375
376
377
378 if (SCTP_EP_TYPE_ASSOCIATION == rcvr->type)
379 sctp_transport_hold(t);
380 else if (SCTP_EP_TYPE_SOCKET == rcvr->type)
381 sctp_endpoint_hold(sctp_ep(rcvr));
382 else
383 BUG();
384 }
385 return ret;
386
387}
388
389
390void sctp_icmp_frag_needed(struct sock *sk, struct sctp_association *asoc,
391 struct sctp_transport *t, __u32 pmtu)
392{
393 if (!t || (t->pathmtu <= pmtu))
394 return;
395
396 if (sock_owned_by_user(sk)) {
397 asoc->pmtu_pending = 1;
398 t->pmtu_pending = 1;
399 return;
400 }
401
402 if (t->param_flags & SPP_PMTUD_ENABLE) {
403
404 sctp_transport_update_pmtu(t, pmtu);
405
406
407 sctp_assoc_sync_pmtu(asoc);
408 }
409
410
411
412
413
414
415
416 sctp_retransmit(&asoc->outqueue, t, SCTP_RTXR_PMTUD);
417}
418
419void sctp_icmp_redirect(struct sock *sk, struct sctp_transport *t,
420 struct sk_buff *skb)
421{
422 struct dst_entry *dst;
423
424 if (sock_owned_by_user(sk) || !t)
425 return;
426 dst = sctp_transport_dst_check(t);
427 if (dst)
428 dst->ops->redirect(dst, sk, skb);
429}
430
431
432
433
434
435
436
437
438
439
440
441
442void sctp_icmp_proto_unreachable(struct sock *sk,
443 struct sctp_association *asoc,
444 struct sctp_transport *t)
445{
446 if (sock_owned_by_user(sk)) {
447 if (timer_pending(&t->proto_unreach_timer))
448 return;
449 else {
450 if (!mod_timer(&t->proto_unreach_timer,
451 jiffies + (HZ/20)))
452 sctp_association_hold(asoc);
453 }
454 } else {
455 struct net *net = sock_net(sk);
456
457 pr_debug("%s: unrecognized next header type "
458 "encountered!\n", __func__);
459
460 if (del_timer(&t->proto_unreach_timer))
461 sctp_association_put(asoc);
462
463 sctp_do_sm(net, SCTP_EVENT_T_OTHER,
464 SCTP_ST_OTHER(SCTP_EVENT_ICMP_PROTO_UNREACH),
465 asoc->state, asoc->ep, asoc, t,
466 GFP_ATOMIC);
467 }
468}
469
470
471struct sock *sctp_err_lookup(struct net *net, int family, struct sk_buff *skb,
472 struct sctphdr *sctphdr,
473 struct sctp_association **app,
474 struct sctp_transport **tpp)
475{
476 struct sctp_init_chunk *chunkhdr, _chunkhdr;
477 union sctp_addr saddr;
478 union sctp_addr daddr;
479 struct sctp_af *af;
480 struct sock *sk = NULL;
481 struct sctp_association *asoc;
482 struct sctp_transport *transport = NULL;
483 __u32 vtag = ntohl(sctphdr->vtag);
484
485 *app = NULL; *tpp = NULL;
486
487 af = sctp_get_af_specific(family);
488 if (unlikely(!af)) {
489 return NULL;
490 }
491
492
493 af->from_skb(&saddr, skb, 1);
494 af->from_skb(&daddr, skb, 0);
495
496
497
498
499 asoc = __sctp_lookup_association(net, &saddr, &daddr, &transport);
500 if (!asoc)
501 return NULL;
502
503 sk = asoc->base.sk;
504
505
506
507
508
509
510
511
512
513
514
515
516
517 if (vtag == 0) {
518
519 chunkhdr = skb_header_pointer(skb, skb_transport_offset(skb) +
520 sizeof(struct sctphdr),
521 sizeof(struct sctp_chunkhdr) +
522 sizeof(__be32), &_chunkhdr);
523 if (!chunkhdr ||
524 chunkhdr->chunk_hdr.type != SCTP_CID_INIT ||
525 ntohl(chunkhdr->init_hdr.init_tag) != asoc->c.my_vtag)
526 goto out;
527
528 } else if (vtag != asoc->c.peer_vtag) {
529 goto out;
530 }
531
532 bh_lock_sock(sk);
533
534
535
536
537 if (sock_owned_by_user(sk))
538 __NET_INC_STATS(net, LINUX_MIB_LOCKDROPPEDICMPS);
539
540 *app = asoc;
541 *tpp = transport;
542 return sk;
543
544out:
545 sctp_transport_put(transport);
546 return NULL;
547}
548
549
550void sctp_err_finish(struct sock *sk, struct sctp_transport *t)
551{
552 bh_unlock_sock(sk);
553 sctp_transport_put(t);
554}
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571void sctp_v4_err(struct sk_buff *skb, __u32 info)
572{
573 const struct iphdr *iph = (const struct iphdr *)skb->data;
574 const int ihlen = iph->ihl * 4;
575 const int type = icmp_hdr(skb)->type;
576 const int code = icmp_hdr(skb)->code;
577 struct sock *sk;
578 struct sctp_association *asoc = NULL;
579 struct sctp_transport *transport;
580 struct inet_sock *inet;
581 __u16 saveip, savesctp;
582 int err;
583 struct net *net = dev_net(skb->dev);
584
585
586 saveip = skb->network_header;
587 savesctp = skb->transport_header;
588 skb_reset_network_header(skb);
589 skb_set_transport_header(skb, ihlen);
590 sk = sctp_err_lookup(net, AF_INET, skb, sctp_hdr(skb), &asoc, &transport);
591
592 skb->network_header = saveip;
593 skb->transport_header = savesctp;
594 if (!sk) {
595 __ICMP_INC_STATS(net, ICMP_MIB_INERRORS);
596 return;
597 }
598
599
600
601
602 switch (type) {
603 case ICMP_PARAMETERPROB:
604 err = EPROTO;
605 break;
606 case ICMP_DEST_UNREACH:
607 if (code > NR_ICMP_UNREACH)
608 goto out_unlock;
609
610
611 if (ICMP_FRAG_NEEDED == code) {
612 sctp_icmp_frag_needed(sk, asoc, transport,
613 SCTP_TRUNC4(info));
614 goto out_unlock;
615 } else {
616 if (ICMP_PROT_UNREACH == code) {
617 sctp_icmp_proto_unreachable(sk, asoc,
618 transport);
619 goto out_unlock;
620 }
621 }
622 err = icmp_err_convert[code].errno;
623 break;
624 case ICMP_TIME_EXCEEDED:
625
626
627
628 if (ICMP_EXC_FRAGTIME == code)
629 goto out_unlock;
630
631 err = EHOSTUNREACH;
632 break;
633 case ICMP_REDIRECT:
634 sctp_icmp_redirect(sk, transport, skb);
635
636 default:
637 goto out_unlock;
638 }
639
640 inet = inet_sk(sk);
641 if (!sock_owned_by_user(sk) && inet->recverr) {
642 sk->sk_err = err;
643 sk->sk_error_report(sk);
644 } else {
645 sk->sk_err_soft = err;
646 }
647
648out_unlock:
649 sctp_err_finish(sk, transport);
650}
651
652
653
654
655
656
657
658
659
660
661
662
663
664static int sctp_rcv_ootb(struct sk_buff *skb)
665{
666 struct sctp_chunkhdr *ch, _ch;
667 int ch_end, offset = 0;
668
669
670 do {
671
672 if (offset + sizeof(_ch) > skb->len)
673 break;
674
675 ch = skb_header_pointer(skb, offset, sizeof(*ch), &_ch);
676
677
678 if (ntohs(ch->length) < sizeof(_ch))
679 break;
680
681 ch_end = offset + SCTP_PAD4(ntohs(ch->length));
682 if (ch_end > skb->len)
683 break;
684
685
686
687
688
689 if (SCTP_CID_ABORT == ch->type)
690 goto discard;
691
692
693
694
695
696 if (SCTP_CID_SHUTDOWN_COMPLETE == ch->type)
697 goto discard;
698
699
700
701
702
703
704 if (SCTP_CID_INIT == ch->type && (void *)ch != skb->data)
705 goto discard;
706
707 offset = ch_end;
708 } while (ch_end < skb->len);
709
710 return 0;
711
712discard:
713 return 1;
714}
715
716
717static void __sctp_hash_endpoint(struct sctp_endpoint *ep)
718{
719 struct net *net = sock_net(ep->base.sk);
720 struct sctp_ep_common *epb;
721 struct sctp_hashbucket *head;
722
723 epb = &ep->base;
724
725 epb->hashent = sctp_ep_hashfn(net, epb->bind_addr.port);
726 head = &sctp_ep_hashtable[epb->hashent];
727
728 write_lock(&head->lock);
729 hlist_add_head(&epb->node, &head->chain);
730 write_unlock(&head->lock);
731}
732
733
734void sctp_hash_endpoint(struct sctp_endpoint *ep)
735{
736 local_bh_disable();
737 __sctp_hash_endpoint(ep);
738 local_bh_enable();
739}
740
741
742static void __sctp_unhash_endpoint(struct sctp_endpoint *ep)
743{
744 struct net *net = sock_net(ep->base.sk);
745 struct sctp_hashbucket *head;
746 struct sctp_ep_common *epb;
747
748 epb = &ep->base;
749
750 epb->hashent = sctp_ep_hashfn(net, epb->bind_addr.port);
751
752 head = &sctp_ep_hashtable[epb->hashent];
753
754 write_lock(&head->lock);
755 hlist_del_init(&epb->node);
756 write_unlock(&head->lock);
757}
758
759
760void sctp_unhash_endpoint(struct sctp_endpoint *ep)
761{
762 local_bh_disable();
763 __sctp_unhash_endpoint(ep);
764 local_bh_enable();
765}
766
767
768static struct sctp_endpoint *__sctp_rcv_lookup_endpoint(struct net *net,
769 const union sctp_addr *laddr)
770{
771 struct sctp_hashbucket *head;
772 struct sctp_ep_common *epb;
773 struct sctp_endpoint *ep;
774 int hash;
775
776 hash = sctp_ep_hashfn(net, ntohs(laddr->v4.sin_port));
777 head = &sctp_ep_hashtable[hash];
778 read_lock(&head->lock);
779 sctp_for_each_hentry(epb, &head->chain) {
780 ep = sctp_ep(epb);
781 if (sctp_endpoint_is_match(ep, net, laddr))
782 goto hit;
783 }
784
785 ep = sctp_sk(net->sctp.ctl_sock)->ep;
786
787hit:
788 sctp_endpoint_hold(ep);
789 read_unlock(&head->lock);
790 return ep;
791}
792
793
794struct sctp_hash_cmp_arg {
795 const union sctp_addr *paddr;
796 const struct net *net;
797 __be16 lport;
798};
799
800static inline int sctp_hash_cmp(struct rhashtable_compare_arg *arg,
801 const void *ptr)
802{
803 struct sctp_transport *t = (struct sctp_transport *)ptr;
804 const struct sctp_hash_cmp_arg *x = arg->key;
805 int err = 1;
806
807 if (!sctp_cmp_addr_exact(&t->ipaddr, x->paddr))
808 return err;
809 if (!sctp_transport_hold(t))
810 return err;
811
812 if (!net_eq(sock_net(t->asoc->base.sk), x->net))
813 goto out;
814 if (x->lport != htons(t->asoc->base.bind_addr.port))
815 goto out;
816
817 err = 0;
818out:
819 sctp_transport_put(t);
820 return err;
821}
822
823static inline __u32 sctp_hash_obj(const void *data, u32 len, u32 seed)
824{
825 const struct sctp_transport *t = data;
826 const union sctp_addr *paddr = &t->ipaddr;
827 const struct net *net = sock_net(t->asoc->base.sk);
828 __be16 lport = htons(t->asoc->base.bind_addr.port);
829 __u32 addr;
830
831 if (paddr->sa.sa_family == AF_INET6)
832 addr = jhash(&paddr->v6.sin6_addr, 16, seed);
833 else
834 addr = (__force __u32)paddr->v4.sin_addr.s_addr;
835
836 return jhash_3words(addr, ((__force __u32)paddr->v4.sin_port) << 16 |
837 (__force __u32)lport, net_hash_mix(net), seed);
838}
839
840static inline __u32 sctp_hash_key(const void *data, u32 len, u32 seed)
841{
842 const struct sctp_hash_cmp_arg *x = data;
843 const union sctp_addr *paddr = x->paddr;
844 const struct net *net = x->net;
845 __be16 lport = x->lport;
846 __u32 addr;
847
848 if (paddr->sa.sa_family == AF_INET6)
849 addr = jhash(&paddr->v6.sin6_addr, 16, seed);
850 else
851 addr = (__force __u32)paddr->v4.sin_addr.s_addr;
852
853 return jhash_3words(addr, ((__force __u32)paddr->v4.sin_port) << 16 |
854 (__force __u32)lport, net_hash_mix(net), seed);
855}
856
857static const struct rhashtable_params sctp_hash_params = {
858 .head_offset = offsetof(struct sctp_transport, node),
859 .hashfn = sctp_hash_key,
860 .obj_hashfn = sctp_hash_obj,
861 .obj_cmpfn = sctp_hash_cmp,
862 .automatic_shrinking = true,
863};
864
865int sctp_transport_hashtable_init(void)
866{
867 return rhltable_init(&sctp_transport_hashtable, &sctp_hash_params);
868}
869
870void sctp_transport_hashtable_destroy(void)
871{
872 rhltable_destroy(&sctp_transport_hashtable);
873}
874
875int sctp_hash_transport(struct sctp_transport *t)
876{
877 struct sctp_transport *transport;
878 struct rhlist_head *tmp, *list;
879 struct sctp_hash_cmp_arg arg;
880 int err;
881
882 if (t->asoc->temp)
883 return 0;
884
885 arg.net = sock_net(t->asoc->base.sk);
886 arg.paddr = &t->ipaddr;
887 arg.lport = htons(t->asoc->base.bind_addr.port);
888
889 rcu_read_lock();
890 list = rhltable_lookup(&sctp_transport_hashtable, &arg,
891 sctp_hash_params);
892
893 rhl_for_each_entry_rcu(transport, tmp, list, node)
894 if (transport->asoc->ep == t->asoc->ep) {
895 rcu_read_unlock();
896 err = -EEXIST;
897 goto out;
898 }
899 rcu_read_unlock();
900
901 err = rhltable_insert_key(&sctp_transport_hashtable, &arg,
902 &t->node, sctp_hash_params);
903
904out:
905 if (err)
906 pr_err_once("insert transport fail, errno %d\n", err);
907
908 return err;
909}
910
911void sctp_unhash_transport(struct sctp_transport *t)
912{
913 if (t->asoc->temp)
914 return;
915
916 rhltable_remove(&sctp_transport_hashtable, &t->node,
917 sctp_hash_params);
918}
919
920
921struct sctp_transport *sctp_addrs_lookup_transport(
922 struct net *net,
923 const union sctp_addr *laddr,
924 const union sctp_addr *paddr)
925{
926 struct rhlist_head *tmp, *list;
927 struct sctp_transport *t;
928 struct sctp_hash_cmp_arg arg = {
929 .paddr = paddr,
930 .net = net,
931 .lport = laddr->v4.sin_port,
932 };
933
934 list = rhltable_lookup(&sctp_transport_hashtable, &arg,
935 sctp_hash_params);
936
937 rhl_for_each_entry_rcu(t, tmp, list, node) {
938 if (!sctp_transport_hold(t))
939 continue;
940
941 if (sctp_bind_addr_match(&t->asoc->base.bind_addr,
942 laddr, sctp_sk(t->asoc->base.sk)))
943 return t;
944 sctp_transport_put(t);
945 }
946
947 return NULL;
948}
949
950
951struct sctp_transport *sctp_epaddr_lookup_transport(
952 const struct sctp_endpoint *ep,
953 const union sctp_addr *paddr)
954{
955 struct net *net = sock_net(ep->base.sk);
956 struct rhlist_head *tmp, *list;
957 struct sctp_transport *t;
958 struct sctp_hash_cmp_arg arg = {
959 .paddr = paddr,
960 .net = net,
961 .lport = htons(ep->base.bind_addr.port),
962 };
963
964 list = rhltable_lookup(&sctp_transport_hashtable, &arg,
965 sctp_hash_params);
966
967 rhl_for_each_entry_rcu(t, tmp, list, node)
968 if (ep == t->asoc->ep)
969 return t;
970
971 return NULL;
972}
973
974
975static struct sctp_association *__sctp_lookup_association(
976 struct net *net,
977 const union sctp_addr *local,
978 const union sctp_addr *peer,
979 struct sctp_transport **pt)
980{
981 struct sctp_transport *t;
982 struct sctp_association *asoc = NULL;
983
984 t = sctp_addrs_lookup_transport(net, local, peer);
985 if (!t)
986 goto out;
987
988 asoc = t->asoc;
989 *pt = t;
990
991out:
992 return asoc;
993}
994
995
996static
997struct sctp_association *sctp_lookup_association(struct net *net,
998 const union sctp_addr *laddr,
999 const union sctp_addr *paddr,
1000 struct sctp_transport **transportp)
1001{
1002 struct sctp_association *asoc;
1003
1004 rcu_read_lock();
1005 asoc = __sctp_lookup_association(net, laddr, paddr, transportp);
1006 rcu_read_unlock();
1007
1008 return asoc;
1009}
1010
1011
1012int sctp_has_association(struct net *net,
1013 const union sctp_addr *laddr,
1014 const union sctp_addr *paddr)
1015{
1016 struct sctp_association *asoc;
1017 struct sctp_transport *transport;
1018
1019 if ((asoc = sctp_lookup_association(net, laddr, paddr, &transport))) {
1020 sctp_transport_put(transport);
1021 return 1;
1022 }
1023
1024 return 0;
1025}
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045static struct sctp_association *__sctp_rcv_init_lookup(struct net *net,
1046 struct sk_buff *skb,
1047 const union sctp_addr *laddr, struct sctp_transport **transportp)
1048{
1049 struct sctp_association *asoc;
1050 union sctp_addr addr;
1051 union sctp_addr *paddr = &addr;
1052 struct sctphdr *sh = sctp_hdr(skb);
1053 union sctp_params params;
1054 struct sctp_init_chunk *init;
1055 struct sctp_af *af;
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073 init = (struct sctp_init_chunk *)skb->data;
1074
1075
1076 sctp_walk_params(params, init, init_hdr.params) {
1077
1078
1079 af = sctp_get_af_specific(param_type2af(params.p->type));
1080 if (!af)
1081 continue;
1082
1083 af->from_addr_param(paddr, params.addr, sh->source, 0);
1084
1085 asoc = __sctp_lookup_association(net, laddr, paddr, transportp);
1086 if (asoc)
1087 return asoc;
1088 }
1089
1090 return NULL;
1091}
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107static struct sctp_association *__sctp_rcv_asconf_lookup(
1108 struct net *net,
1109 struct sctp_chunkhdr *ch,
1110 const union sctp_addr *laddr,
1111 __be16 peer_port,
1112 struct sctp_transport **transportp)
1113{
1114 struct sctp_addip_chunk *asconf = (struct sctp_addip_chunk *)ch;
1115 struct sctp_af *af;
1116 union sctp_addr_param *param;
1117 union sctp_addr paddr;
1118
1119
1120 param = (union sctp_addr_param *)(asconf + 1);
1121
1122 af = sctp_get_af_specific(param_type2af(param->p.type));
1123 if (unlikely(!af))
1124 return NULL;
1125
1126 af->from_addr_param(&paddr, param, peer_port, 0);
1127
1128 return __sctp_lookup_association(net, laddr, &paddr, transportp);
1129}
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141static struct sctp_association *__sctp_rcv_walk_lookup(struct net *net,
1142 struct sk_buff *skb,
1143 const union sctp_addr *laddr,
1144 struct sctp_transport **transportp)
1145{
1146 struct sctp_association *asoc = NULL;
1147 struct sctp_chunkhdr *ch;
1148 int have_auth = 0;
1149 unsigned int chunk_num = 1;
1150 __u8 *ch_end;
1151
1152
1153
1154
1155 ch = (struct sctp_chunkhdr *)skb->data;
1156 do {
1157
1158 if (ntohs(ch->length) < sizeof(*ch))
1159 break;
1160
1161 ch_end = ((__u8 *)ch) + SCTP_PAD4(ntohs(ch->length));
1162 if (ch_end > skb_tail_pointer(skb))
1163 break;
1164
1165 switch (ch->type) {
1166 case SCTP_CID_AUTH:
1167 have_auth = chunk_num;
1168 break;
1169
1170 case SCTP_CID_COOKIE_ECHO:
1171
1172
1173
1174
1175
1176
1177
1178 if (have_auth == 1 && chunk_num == 2)
1179 return NULL;
1180 break;
1181
1182 case SCTP_CID_ASCONF:
1183 if (have_auth || net->sctp.addip_noauth)
1184 asoc = __sctp_rcv_asconf_lookup(
1185 net, ch, laddr,
1186 sctp_hdr(skb)->source,
1187 transportp);
1188 default:
1189 break;
1190 }
1191
1192 if (asoc)
1193 break;
1194
1195 ch = (struct sctp_chunkhdr *)ch_end;
1196 chunk_num++;
1197 } while (ch_end < skb_tail_pointer(skb));
1198
1199 return asoc;
1200}
1201
1202
1203
1204
1205
1206
1207
1208static struct sctp_association *__sctp_rcv_lookup_harder(struct net *net,
1209 struct sk_buff *skb,
1210 const union sctp_addr *laddr,
1211 struct sctp_transport **transportp)
1212{
1213 struct sctp_chunkhdr *ch;
1214
1215
1216
1217
1218
1219
1220 if ((skb_shinfo(skb)->gso_type & SKB_GSO_SCTP) == SKB_GSO_SCTP)
1221 return NULL;
1222
1223 ch = (struct sctp_chunkhdr *)skb->data;
1224
1225
1226
1227
1228
1229
1230 if (SCTP_PAD4(ntohs(ch->length)) > skb->len)
1231 return NULL;
1232
1233
1234 if (ch->type == SCTP_CID_INIT || ch->type == SCTP_CID_INIT_ACK)
1235 return __sctp_rcv_init_lookup(net, skb, laddr, transportp);
1236
1237 return __sctp_rcv_walk_lookup(net, skb, laddr, transportp);
1238}
1239
1240
1241static struct sctp_association *__sctp_rcv_lookup(struct net *net,
1242 struct sk_buff *skb,
1243 const union sctp_addr *paddr,
1244 const union sctp_addr *laddr,
1245 struct sctp_transport **transportp)
1246{
1247 struct sctp_association *asoc;
1248
1249 asoc = __sctp_lookup_association(net, laddr, paddr, transportp);
1250 if (asoc)
1251 goto out;
1252
1253
1254
1255
1256
1257 asoc = __sctp_rcv_lookup_harder(net, skb, laddr, transportp);
1258 if (asoc)
1259 goto out;
1260
1261 if (paddr->sa.sa_family == AF_INET)
1262 pr_debug("sctp: asoc not found for src:%pI4:%d dst:%pI4:%d\n",
1263 &laddr->v4.sin_addr, ntohs(laddr->v4.sin_port),
1264 &paddr->v4.sin_addr, ntohs(paddr->v4.sin_port));
1265 else
1266 pr_debug("sctp: asoc not found for src:%pI6:%d dst:%pI6:%d\n",
1267 &laddr->v6.sin6_addr, ntohs(laddr->v6.sin6_port),
1268 &paddr->v6.sin6_addr, ntohs(paddr->v6.sin6_port));
1269
1270out:
1271 return asoc;
1272}
1273