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 bool is_gso = skb_is_gso(skb) && skb_is_gso_sctp(skb);
110
111 if (skb->pkt_type != PACKET_HOST)
112 goto discard_it;
113
114 __SCTP_INC_STATS(net, SCTP_MIB_INSCTPPACKS);
115
116
117
118
119 if (skb->len < sizeof(struct sctphdr) + sizeof(struct sctp_chunkhdr) +
120 skb_transport_offset(skb))
121 goto discard_it;
122
123
124
125
126
127 if ((!is_gso && 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 !is_gso &&
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
405
406
407 return;
408
409
410
411
412
413 if (!sctp_transport_update_pmtu(t, pmtu))
414 return;
415
416
417 sctp_assoc_sync_pmtu(asoc);
418
419
420 sctp_retransmit(&asoc->outqueue, t, SCTP_RTXR_PMTUD);
421}
422
423void sctp_icmp_redirect(struct sock *sk, struct sctp_transport *t,
424 struct sk_buff *skb)
425{
426 struct dst_entry *dst;
427
428 if (sock_owned_by_user(sk) || !t)
429 return;
430 dst = sctp_transport_dst_check(t);
431 if (dst)
432 dst->ops->redirect(dst, sk, skb);
433}
434
435
436
437
438
439
440
441
442
443
444
445
446void sctp_icmp_proto_unreachable(struct sock *sk,
447 struct sctp_association *asoc,
448 struct sctp_transport *t)
449{
450 if (sock_owned_by_user(sk)) {
451 if (timer_pending(&t->proto_unreach_timer))
452 return;
453 else {
454 if (!mod_timer(&t->proto_unreach_timer,
455 jiffies + (HZ/20)))
456 sctp_association_hold(asoc);
457 }
458 } else {
459 struct net *net = sock_net(sk);
460
461 pr_debug("%s: unrecognized next header type "
462 "encountered!\n", __func__);
463
464 if (del_timer(&t->proto_unreach_timer))
465 sctp_association_put(asoc);
466
467 sctp_do_sm(net, SCTP_EVENT_T_OTHER,
468 SCTP_ST_OTHER(SCTP_EVENT_ICMP_PROTO_UNREACH),
469 asoc->state, asoc->ep, asoc, t,
470 GFP_ATOMIC);
471 }
472}
473
474
475struct sock *sctp_err_lookup(struct net *net, int family, struct sk_buff *skb,
476 struct sctphdr *sctphdr,
477 struct sctp_association **app,
478 struct sctp_transport **tpp)
479{
480 struct sctp_init_chunk *chunkhdr, _chunkhdr;
481 union sctp_addr saddr;
482 union sctp_addr daddr;
483 struct sctp_af *af;
484 struct sock *sk = NULL;
485 struct sctp_association *asoc;
486 struct sctp_transport *transport = NULL;
487 __u32 vtag = ntohl(sctphdr->vtag);
488
489 *app = NULL; *tpp = NULL;
490
491 af = sctp_get_af_specific(family);
492 if (unlikely(!af)) {
493 return NULL;
494 }
495
496
497 af->from_skb(&saddr, skb, 1);
498 af->from_skb(&daddr, skb, 0);
499
500
501
502
503 asoc = __sctp_lookup_association(net, &saddr, &daddr, &transport);
504 if (!asoc)
505 return NULL;
506
507 sk = asoc->base.sk;
508
509
510
511
512
513
514
515
516
517
518
519
520
521 if (vtag == 0) {
522
523 chunkhdr = skb_header_pointer(skb, skb_transport_offset(skb) +
524 sizeof(struct sctphdr),
525 sizeof(struct sctp_chunkhdr) +
526 sizeof(__be32), &_chunkhdr);
527 if (!chunkhdr ||
528 chunkhdr->chunk_hdr.type != SCTP_CID_INIT ||
529 ntohl(chunkhdr->init_hdr.init_tag) != asoc->c.my_vtag)
530 goto out;
531
532 } else if (vtag != asoc->c.peer_vtag) {
533 goto out;
534 }
535
536 bh_lock_sock(sk);
537
538
539
540
541 if (sock_owned_by_user(sk))
542 __NET_INC_STATS(net, LINUX_MIB_LOCKDROPPEDICMPS);
543
544 *app = asoc;
545 *tpp = transport;
546 return sk;
547
548out:
549 sctp_transport_put(transport);
550 return NULL;
551}
552
553
554void sctp_err_finish(struct sock *sk, struct sctp_transport *t)
555{
556 bh_unlock_sock(sk);
557 sctp_transport_put(t);
558}
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575void sctp_v4_err(struct sk_buff *skb, __u32 info)
576{
577 const struct iphdr *iph = (const struct iphdr *)skb->data;
578 const int ihlen = iph->ihl * 4;
579 const int type = icmp_hdr(skb)->type;
580 const int code = icmp_hdr(skb)->code;
581 struct sock *sk;
582 struct sctp_association *asoc = NULL;
583 struct sctp_transport *transport;
584 struct inet_sock *inet;
585 __u16 saveip, savesctp;
586 int err;
587 struct net *net = dev_net(skb->dev);
588
589
590 saveip = skb->network_header;
591 savesctp = skb->transport_header;
592 skb_reset_network_header(skb);
593 skb_set_transport_header(skb, ihlen);
594 sk = sctp_err_lookup(net, AF_INET, skb, sctp_hdr(skb), &asoc, &transport);
595
596 skb->network_header = saveip;
597 skb->transport_header = savesctp;
598 if (!sk) {
599 __ICMP_INC_STATS(net, ICMP_MIB_INERRORS);
600 return;
601 }
602
603
604
605
606 switch (type) {
607 case ICMP_PARAMETERPROB:
608 err = EPROTO;
609 break;
610 case ICMP_DEST_UNREACH:
611 if (code > NR_ICMP_UNREACH)
612 goto out_unlock;
613
614
615 if (ICMP_FRAG_NEEDED == code) {
616 sctp_icmp_frag_needed(sk, asoc, transport,
617 SCTP_TRUNC4(info));
618 goto out_unlock;
619 } else {
620 if (ICMP_PROT_UNREACH == code) {
621 sctp_icmp_proto_unreachable(sk, asoc,
622 transport);
623 goto out_unlock;
624 }
625 }
626 err = icmp_err_convert[code].errno;
627 break;
628 case ICMP_TIME_EXCEEDED:
629
630
631
632 if (ICMP_EXC_FRAGTIME == code)
633 goto out_unlock;
634
635 err = EHOSTUNREACH;
636 break;
637 case ICMP_REDIRECT:
638 sctp_icmp_redirect(sk, transport, skb);
639
640 default:
641 goto out_unlock;
642 }
643
644 inet = inet_sk(sk);
645 if (!sock_owned_by_user(sk) && inet->recverr) {
646 sk->sk_err = err;
647 sk->sk_error_report(sk);
648 } else {
649 sk->sk_err_soft = err;
650 }
651
652out_unlock:
653 sctp_err_finish(sk, transport);
654}
655
656
657
658
659
660
661
662
663
664
665
666
667
668static int sctp_rcv_ootb(struct sk_buff *skb)
669{
670 struct sctp_chunkhdr *ch, _ch;
671 int ch_end, offset = 0;
672
673
674 do {
675
676 if (offset + sizeof(_ch) > skb->len)
677 break;
678
679 ch = skb_header_pointer(skb, offset, sizeof(*ch), &_ch);
680
681
682 if (ntohs(ch->length) < sizeof(_ch))
683 break;
684
685 ch_end = offset + SCTP_PAD4(ntohs(ch->length));
686 if (ch_end > skb->len)
687 break;
688
689
690
691
692
693 if (SCTP_CID_ABORT == ch->type)
694 goto discard;
695
696
697
698
699
700 if (SCTP_CID_SHUTDOWN_COMPLETE == ch->type)
701 goto discard;
702
703
704
705
706
707
708 if (SCTP_CID_INIT == ch->type && (void *)ch != skb->data)
709 goto discard;
710
711 offset = ch_end;
712 } while (ch_end < skb->len);
713
714 return 0;
715
716discard:
717 return 1;
718}
719
720
721static void __sctp_hash_endpoint(struct sctp_endpoint *ep)
722{
723 struct net *net = sock_net(ep->base.sk);
724 struct sctp_ep_common *epb;
725 struct sctp_hashbucket *head;
726
727 epb = &ep->base;
728
729 epb->hashent = sctp_ep_hashfn(net, epb->bind_addr.port);
730 head = &sctp_ep_hashtable[epb->hashent];
731
732 write_lock(&head->lock);
733 hlist_add_head(&epb->node, &head->chain);
734 write_unlock(&head->lock);
735}
736
737
738void sctp_hash_endpoint(struct sctp_endpoint *ep)
739{
740 local_bh_disable();
741 __sctp_hash_endpoint(ep);
742 local_bh_enable();
743}
744
745
746static void __sctp_unhash_endpoint(struct sctp_endpoint *ep)
747{
748 struct net *net = sock_net(ep->base.sk);
749 struct sctp_hashbucket *head;
750 struct sctp_ep_common *epb;
751
752 epb = &ep->base;
753
754 epb->hashent = sctp_ep_hashfn(net, epb->bind_addr.port);
755
756 head = &sctp_ep_hashtable[epb->hashent];
757
758 write_lock(&head->lock);
759 hlist_del_init(&epb->node);
760 write_unlock(&head->lock);
761}
762
763
764void sctp_unhash_endpoint(struct sctp_endpoint *ep)
765{
766 local_bh_disable();
767 __sctp_unhash_endpoint(ep);
768 local_bh_enable();
769}
770
771
772static struct sctp_endpoint *__sctp_rcv_lookup_endpoint(struct net *net,
773 const union sctp_addr *laddr)
774{
775 struct sctp_hashbucket *head;
776 struct sctp_ep_common *epb;
777 struct sctp_endpoint *ep;
778 int hash;
779
780 hash = sctp_ep_hashfn(net, ntohs(laddr->v4.sin_port));
781 head = &sctp_ep_hashtable[hash];
782 read_lock(&head->lock);
783 sctp_for_each_hentry(epb, &head->chain) {
784 ep = sctp_ep(epb);
785 if (sctp_endpoint_is_match(ep, net, laddr))
786 goto hit;
787 }
788
789 ep = sctp_sk(net->sctp.ctl_sock)->ep;
790
791hit:
792 sctp_endpoint_hold(ep);
793 read_unlock(&head->lock);
794 return ep;
795}
796
797
798struct sctp_hash_cmp_arg {
799 const union sctp_addr *paddr;
800 const struct net *net;
801 __be16 lport;
802};
803
804static inline int sctp_hash_cmp(struct rhashtable_compare_arg *arg,
805 const void *ptr)
806{
807 struct sctp_transport *t = (struct sctp_transport *)ptr;
808 const struct sctp_hash_cmp_arg *x = arg->key;
809 int err = 1;
810
811 if (!sctp_cmp_addr_exact(&t->ipaddr, x->paddr))
812 return err;
813 if (!sctp_transport_hold(t))
814 return err;
815
816 if (!net_eq(sock_net(t->asoc->base.sk), x->net))
817 goto out;
818 if (x->lport != htons(t->asoc->base.bind_addr.port))
819 goto out;
820
821 err = 0;
822out:
823 sctp_transport_put(t);
824 return err;
825}
826
827static inline __u32 sctp_hash_obj(const void *data, u32 len, u32 seed)
828{
829 const struct sctp_transport *t = data;
830 const union sctp_addr *paddr = &t->ipaddr;
831 const struct net *net = sock_net(t->asoc->base.sk);
832 __be16 lport = htons(t->asoc->base.bind_addr.port);
833 __u32 addr;
834
835 if (paddr->sa.sa_family == AF_INET6)
836 addr = jhash(&paddr->v6.sin6_addr, 16, seed);
837 else
838 addr = (__force __u32)paddr->v4.sin_addr.s_addr;
839
840 return jhash_3words(addr, ((__force __u32)paddr->v4.sin_port) << 16 |
841 (__force __u32)lport, net_hash_mix(net), seed);
842}
843
844static inline __u32 sctp_hash_key(const void *data, u32 len, u32 seed)
845{
846 const struct sctp_hash_cmp_arg *x = data;
847 const union sctp_addr *paddr = x->paddr;
848 const struct net *net = x->net;
849 __be16 lport = x->lport;
850 __u32 addr;
851
852 if (paddr->sa.sa_family == AF_INET6)
853 addr = jhash(&paddr->v6.sin6_addr, 16, seed);
854 else
855 addr = (__force __u32)paddr->v4.sin_addr.s_addr;
856
857 return jhash_3words(addr, ((__force __u32)paddr->v4.sin_port) << 16 |
858 (__force __u32)lport, net_hash_mix(net), seed);
859}
860
861static const struct rhashtable_params sctp_hash_params = {
862 .head_offset = offsetof(struct sctp_transport, node),
863 .hashfn = sctp_hash_key,
864 .obj_hashfn = sctp_hash_obj,
865 .obj_cmpfn = sctp_hash_cmp,
866 .automatic_shrinking = true,
867};
868
869int sctp_transport_hashtable_init(void)
870{
871 return rhltable_init(&sctp_transport_hashtable, &sctp_hash_params);
872}
873
874void sctp_transport_hashtable_destroy(void)
875{
876 rhltable_destroy(&sctp_transport_hashtable);
877}
878
879int sctp_hash_transport(struct sctp_transport *t)
880{
881 struct sctp_transport *transport;
882 struct rhlist_head *tmp, *list;
883 struct sctp_hash_cmp_arg arg;
884 int err;
885
886 if (t->asoc->temp)
887 return 0;
888
889 arg.net = sock_net(t->asoc->base.sk);
890 arg.paddr = &t->ipaddr;
891 arg.lport = htons(t->asoc->base.bind_addr.port);
892
893 rcu_read_lock();
894 list = rhltable_lookup(&sctp_transport_hashtable, &arg,
895 sctp_hash_params);
896
897 rhl_for_each_entry_rcu(transport, tmp, list, node)
898 if (transport->asoc->ep == t->asoc->ep) {
899 rcu_read_unlock();
900 return -EEXIST;
901 }
902 rcu_read_unlock();
903
904 err = rhltable_insert_key(&sctp_transport_hashtable, &arg,
905 &t->node, sctp_hash_params);
906 if (err)
907 pr_err_once("insert transport fail, errno %d\n", err);
908
909 return err;
910}
911
912void sctp_unhash_transport(struct sctp_transport *t)
913{
914 if (t->asoc->temp)
915 return;
916
917 rhltable_remove(&sctp_transport_hashtable, &t->node,
918 sctp_hash_params);
919}
920
921
922struct sctp_transport *sctp_addrs_lookup_transport(
923 struct net *net,
924 const union sctp_addr *laddr,
925 const union sctp_addr *paddr)
926{
927 struct rhlist_head *tmp, *list;
928 struct sctp_transport *t;
929 struct sctp_hash_cmp_arg arg = {
930 .paddr = paddr,
931 .net = net,
932 .lport = laddr->v4.sin_port,
933 };
934
935 list = rhltable_lookup(&sctp_transport_hashtable, &arg,
936 sctp_hash_params);
937
938 rhl_for_each_entry_rcu(t, tmp, list, node) {
939 if (!sctp_transport_hold(t))
940 continue;
941
942 if (sctp_bind_addr_match(&t->asoc->base.bind_addr,
943 laddr, sctp_sk(t->asoc->base.sk)))
944 return t;
945 sctp_transport_put(t);
946 }
947
948 return NULL;
949}
950
951
952struct sctp_transport *sctp_epaddr_lookup_transport(
953 const struct sctp_endpoint *ep,
954 const union sctp_addr *paddr)
955{
956 struct net *net = sock_net(ep->base.sk);
957 struct rhlist_head *tmp, *list;
958 struct sctp_transport *t;
959 struct sctp_hash_cmp_arg arg = {
960 .paddr = paddr,
961 .net = net,
962 .lport = htons(ep->base.bind_addr.port),
963 };
964
965 list = rhltable_lookup(&sctp_transport_hashtable, &arg,
966 sctp_hash_params);
967
968 rhl_for_each_entry_rcu(t, tmp, list, node)
969 if (ep == t->asoc->ep)
970 return t;
971
972 return NULL;
973}
974
975
976static struct sctp_association *__sctp_lookup_association(
977 struct net *net,
978 const union sctp_addr *local,
979 const union sctp_addr *peer,
980 struct sctp_transport **pt)
981{
982 struct sctp_transport *t;
983 struct sctp_association *asoc = NULL;
984
985 t = sctp_addrs_lookup_transport(net, local, peer);
986 if (!t)
987 goto out;
988
989 asoc = t->asoc;
990 *pt = t;
991
992out:
993 return asoc;
994}
995
996
997static
998struct sctp_association *sctp_lookup_association(struct net *net,
999 const union sctp_addr *laddr,
1000 const union sctp_addr *paddr,
1001 struct sctp_transport **transportp)
1002{
1003 struct sctp_association *asoc;
1004
1005 rcu_read_lock();
1006 asoc = __sctp_lookup_association(net, laddr, paddr, transportp);
1007 rcu_read_unlock();
1008
1009 return asoc;
1010}
1011
1012
1013bool sctp_has_association(struct net *net,
1014 const union sctp_addr *laddr,
1015 const union sctp_addr *paddr)
1016{
1017 struct sctp_transport *transport;
1018
1019 if (sctp_lookup_association(net, laddr, paddr, &transport)) {
1020 sctp_transport_put(transport);
1021 return true;
1022 }
1023
1024 return false;
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_is_gso(skb) && skb_is_gso_sctp(skb))
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