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#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
39
40#include <crypto/hash.h>
41#include <linux/types.h>
42#include <linux/kernel.h>
43#include <linux/wait.h>
44#include <linux/time.h>
45#include <linux/sched/signal.h>
46#include <linux/ip.h>
47#include <linux/capability.h>
48#include <linux/fcntl.h>
49#include <linux/poll.h>
50#include <linux/init.h>
51#include <linux/slab.h>
52#include <linux/file.h>
53#include <linux/compat.h>
54#include <linux/rhashtable.h>
55
56#include <net/ip.h>
57#include <net/icmp.h>
58#include <net/route.h>
59#include <net/ipv6.h>
60#include <net/inet_common.h>
61#include <net/busy_poll.h>
62
63#include <linux/socket.h>
64#include <linux/export.h>
65#include <net/sock.h>
66#include <net/sctp/sctp.h>
67#include <net/sctp/sm.h>
68#include <net/sctp/stream_sched.h>
69
70
71static bool sctp_writeable(struct sock *sk);
72static void sctp_wfree(struct sk_buff *skb);
73static int sctp_wait_for_sndbuf(struct sctp_association *asoc, long *timeo_p,
74 size_t msg_len);
75static int sctp_wait_for_packet(struct sock *sk, int *err, long *timeo_p);
76static int sctp_wait_for_connect(struct sctp_association *, long *timeo_p);
77static int sctp_wait_for_accept(struct sock *sk, long timeo);
78static void sctp_wait_for_close(struct sock *sk, long timeo);
79static void sctp_destruct_sock(struct sock *sk);
80static struct sctp_af *sctp_sockaddr_af(struct sctp_sock *opt,
81 union sctp_addr *addr, int len);
82static int sctp_bindx_add(struct sock *, struct sockaddr *, int);
83static int sctp_bindx_rem(struct sock *, struct sockaddr *, int);
84static int sctp_send_asconf_add_ip(struct sock *, struct sockaddr *, int);
85static int sctp_send_asconf_del_ip(struct sock *, struct sockaddr *, int);
86static int sctp_send_asconf(struct sctp_association *asoc,
87 struct sctp_chunk *chunk);
88static int sctp_do_bind(struct sock *, union sctp_addr *, int);
89static int sctp_autobind(struct sock *sk);
90static int sctp_sock_migrate(struct sock *oldsk, struct sock *newsk,
91 struct sctp_association *assoc,
92 enum sctp_socket_type type);
93
94static unsigned long sctp_memory_pressure;
95static atomic_long_t sctp_memory_allocated;
96struct percpu_counter sctp_sockets_allocated;
97
98static void sctp_enter_memory_pressure(struct sock *sk)
99{
100 sctp_memory_pressure = 1;
101}
102
103
104
105static inline int sctp_wspace(struct sctp_association *asoc)
106{
107 struct sock *sk = asoc->base.sk;
108
109 return asoc->ep->sndbuf_policy ? sk->sk_sndbuf - asoc->sndbuf_used
110 : sk_stream_wspace(sk);
111}
112
113
114
115
116
117
118
119
120
121
122static inline void sctp_set_owner_w(struct sctp_chunk *chunk)
123{
124 struct sctp_association *asoc = chunk->asoc;
125 struct sock *sk = asoc->base.sk;
126
127
128 sctp_association_hold(asoc);
129
130 if (chunk->shkey)
131 sctp_auth_shkey_hold(chunk->shkey);
132
133 skb_set_owner_w(chunk->skb, sk);
134
135 chunk->skb->destructor = sctp_wfree;
136
137 skb_shinfo(chunk->skb)->destructor_arg = chunk;
138
139 refcount_add(sizeof(struct sctp_chunk), &sk->sk_wmem_alloc);
140 asoc->sndbuf_used += chunk->skb->truesize + sizeof(struct sctp_chunk);
141 sk->sk_wmem_queued += chunk->skb->truesize + sizeof(struct sctp_chunk);
142 sk_mem_charge(sk, chunk->skb->truesize);
143}
144
145static void sctp_clear_owner_w(struct sctp_chunk *chunk)
146{
147 skb_orphan(chunk->skb);
148}
149
150static void sctp_for_each_tx_datachunk(struct sctp_association *asoc,
151 void (*cb)(struct sctp_chunk *))
152
153{
154 struct sctp_outq *q = &asoc->outqueue;
155 struct sctp_transport *t;
156 struct sctp_chunk *chunk;
157
158 list_for_each_entry(t, &asoc->peer.transport_addr_list, transports)
159 list_for_each_entry(chunk, &t->transmitted, transmitted_list)
160 cb(chunk);
161
162 list_for_each_entry(chunk, &q->retransmit, transmitted_list)
163 cb(chunk);
164
165 list_for_each_entry(chunk, &q->sacked, transmitted_list)
166 cb(chunk);
167
168 list_for_each_entry(chunk, &q->abandoned, transmitted_list)
169 cb(chunk);
170
171 list_for_each_entry(chunk, &q->out_chunk_list, list)
172 cb(chunk);
173}
174
175static void sctp_for_each_rx_skb(struct sctp_association *asoc, struct sock *sk,
176 void (*cb)(struct sk_buff *, struct sock *))
177
178{
179 struct sk_buff *skb, *tmp;
180
181 sctp_skb_for_each(skb, &asoc->ulpq.lobby, tmp)
182 cb(skb, sk);
183
184 sctp_skb_for_each(skb, &asoc->ulpq.reasm, tmp)
185 cb(skb, sk);
186
187 sctp_skb_for_each(skb, &asoc->ulpq.reasm_uo, tmp)
188 cb(skb, sk);
189}
190
191
192static inline int sctp_verify_addr(struct sock *sk, union sctp_addr *addr,
193 int len)
194{
195 struct sctp_af *af;
196
197
198 af = sctp_sockaddr_af(sctp_sk(sk), addr, len);
199 if (!af)
200 return -EINVAL;
201
202
203 if (!af->addr_valid(addr, sctp_sk(sk), NULL))
204 return -EINVAL;
205
206 if (!sctp_sk(sk)->pf->send_verify(sctp_sk(sk), (addr)))
207 return -EINVAL;
208
209 return 0;
210}
211
212
213
214
215struct sctp_association *sctp_id2assoc(struct sock *sk, sctp_assoc_t id)
216{
217 struct sctp_association *asoc = NULL;
218
219
220 if (!sctp_style(sk, UDP)) {
221
222
223
224
225 if (!sctp_sstate(sk, ESTABLISHED) && !sctp_sstate(sk, CLOSING))
226 return NULL;
227
228
229 if (!list_empty(&sctp_sk(sk)->ep->asocs))
230 asoc = list_entry(sctp_sk(sk)->ep->asocs.next,
231 struct sctp_association, asocs);
232 return asoc;
233 }
234
235
236 if (id <= SCTP_ALL_ASSOC)
237 return NULL;
238
239 spin_lock_bh(&sctp_assocs_id_lock);
240 asoc = (struct sctp_association *)idr_find(&sctp_assocs_id, (int)id);
241 if (asoc && (asoc->base.sk != sk || asoc->base.dead))
242 asoc = NULL;
243 spin_unlock_bh(&sctp_assocs_id_lock);
244
245 return asoc;
246}
247
248
249
250
251
252static struct sctp_transport *sctp_addr_id2transport(struct sock *sk,
253 struct sockaddr_storage *addr,
254 sctp_assoc_t id)
255{
256 struct sctp_association *addr_asoc = NULL, *id_asoc = NULL;
257 struct sctp_af *af = sctp_get_af_specific(addr->ss_family);
258 union sctp_addr *laddr = (union sctp_addr *)addr;
259 struct sctp_transport *transport;
260
261 if (!af || sctp_verify_addr(sk, laddr, af->sockaddr_len))
262 return NULL;
263
264 addr_asoc = sctp_endpoint_lookup_assoc(sctp_sk(sk)->ep,
265 laddr,
266 &transport);
267
268 if (!addr_asoc)
269 return NULL;
270
271 id_asoc = sctp_id2assoc(sk, id);
272 if (id_asoc && (id_asoc != addr_asoc))
273 return NULL;
274
275 sctp_get_pf_specific(sk->sk_family)->addr_to_user(sctp_sk(sk),
276 (union sctp_addr *)addr);
277
278 return transport;
279}
280
281
282
283
284
285
286
287
288
289
290
291static int sctp_bind(struct sock *sk, struct sockaddr *addr, int addr_len)
292{
293 int retval = 0;
294
295 lock_sock(sk);
296
297 pr_debug("%s: sk:%p, addr:%p, addr_len:%d\n", __func__, sk,
298 addr, addr_len);
299
300
301 if (!sctp_sk(sk)->ep->base.bind_addr.port)
302 retval = sctp_do_bind(sk, (union sctp_addr *)addr,
303 addr_len);
304 else
305 retval = -EINVAL;
306
307 release_sock(sk);
308
309 return retval;
310}
311
312static int sctp_get_port_local(struct sock *, union sctp_addr *);
313
314
315static struct sctp_af *sctp_sockaddr_af(struct sctp_sock *opt,
316 union sctp_addr *addr, int len)
317{
318 struct sctp_af *af;
319
320
321 if (len < sizeof (struct sockaddr))
322 return NULL;
323
324 if (!opt->pf->af_supported(addr->sa.sa_family, opt))
325 return NULL;
326
327 if (addr->sa.sa_family == AF_INET6) {
328 if (len < SIN6_LEN_RFC2133)
329 return NULL;
330
331 if (ipv6_addr_v4mapped(&addr->v6.sin6_addr) &&
332 !opt->pf->af_supported(AF_INET, opt))
333 return NULL;
334 }
335
336
337 af = sctp_get_af_specific(addr->sa.sa_family);
338
339 if (len < af->sockaddr_len)
340 return NULL;
341
342 return af;
343}
344
345
346static int sctp_do_bind(struct sock *sk, union sctp_addr *addr, int len)
347{
348 struct net *net = sock_net(sk);
349 struct sctp_sock *sp = sctp_sk(sk);
350 struct sctp_endpoint *ep = sp->ep;
351 struct sctp_bind_addr *bp = &ep->base.bind_addr;
352 struct sctp_af *af;
353 unsigned short snum;
354 int ret = 0;
355
356
357 af = sctp_sockaddr_af(sp, addr, len);
358 if (!af) {
359 pr_debug("%s: sk:%p, newaddr:%p, len:%d EINVAL\n",
360 __func__, sk, addr, len);
361 return -EINVAL;
362 }
363
364 snum = ntohs(addr->v4.sin_port);
365
366 pr_debug("%s: sk:%p, new addr:%pISc, port:%d, new port:%d, len:%d\n",
367 __func__, sk, &addr->sa, bp->port, snum, len);
368
369
370 if (!sp->pf->bind_verify(sp, addr))
371 return -EADDRNOTAVAIL;
372
373
374
375
376
377 if (bp->port) {
378 if (!snum)
379 snum = bp->port;
380 else if (snum != bp->port) {
381 pr_debug("%s: new port %d doesn't match existing port "
382 "%d\n", __func__, snum, bp->port);
383 return -EINVAL;
384 }
385 }
386
387 if (snum && snum < inet_prot_sock(net) &&
388 !ns_capable(net->user_ns, CAP_NET_BIND_SERVICE))
389 return -EACCES;
390
391
392
393
394 if (sctp_bind_addr_match(bp, addr, sp))
395 return -EINVAL;
396
397
398
399
400
401 addr->v4.sin_port = htons(snum);
402 if (sctp_get_port_local(sk, addr))
403 return -EADDRINUSE;
404
405
406 if (!bp->port)
407 bp->port = inet_sk(sk)->inet_num;
408
409
410
411
412 ret = sctp_add_bind_addr(bp, addr, af->sockaddr_len,
413 SCTP_ADDR_SRC, GFP_ATOMIC);
414
415 if (ret) {
416 sctp_put_port(sk);
417 return ret;
418 }
419
420 inet_sk(sk)->inet_sport = htons(inet_sk(sk)->inet_num);
421 sp->pf->to_sk_saddr(addr, sk);
422
423 return ret;
424}
425
426
427
428
429
430
431
432
433
434
435
436static int sctp_send_asconf(struct sctp_association *asoc,
437 struct sctp_chunk *chunk)
438{
439 struct net *net = sock_net(asoc->base.sk);
440 int retval = 0;
441
442
443
444
445 if (asoc->addip_last_asconf) {
446 list_add_tail(&chunk->list, &asoc->addip_chunk_list);
447 goto out;
448 }
449
450
451 sctp_chunk_hold(chunk);
452 retval = sctp_primitive_ASCONF(net, asoc, chunk);
453 if (retval)
454 sctp_chunk_free(chunk);
455 else
456 asoc->addip_last_asconf = chunk;
457
458out:
459 return retval;
460}
461
462
463
464
465
466
467
468
469
470
471
472
473
474static int sctp_bindx_add(struct sock *sk, struct sockaddr *addrs, int addrcnt)
475{
476 int cnt;
477 int retval = 0;
478 void *addr_buf;
479 struct sockaddr *sa_addr;
480 struct sctp_af *af;
481
482 pr_debug("%s: sk:%p, addrs:%p, addrcnt:%d\n", __func__, sk,
483 addrs, addrcnt);
484
485 addr_buf = addrs;
486 for (cnt = 0; cnt < addrcnt; cnt++) {
487
488
489
490 sa_addr = addr_buf;
491 af = sctp_get_af_specific(sa_addr->sa_family);
492 if (!af) {
493 retval = -EINVAL;
494 goto err_bindx_add;
495 }
496
497 retval = sctp_do_bind(sk, (union sctp_addr *)sa_addr,
498 af->sockaddr_len);
499
500 addr_buf += af->sockaddr_len;
501
502err_bindx_add:
503 if (retval < 0) {
504
505 if (cnt > 0)
506 sctp_bindx_rem(sk, addrs, cnt);
507 return retval;
508 }
509 }
510
511 return retval;
512}
513
514
515
516
517
518
519
520
521
522
523
524static int sctp_send_asconf_add_ip(struct sock *sk,
525 struct sockaddr *addrs,
526 int addrcnt)
527{
528 struct sctp_sock *sp;
529 struct sctp_endpoint *ep;
530 struct sctp_association *asoc;
531 struct sctp_bind_addr *bp;
532 struct sctp_chunk *chunk;
533 struct sctp_sockaddr_entry *laddr;
534 union sctp_addr *addr;
535 union sctp_addr saveaddr;
536 void *addr_buf;
537 struct sctp_af *af;
538 struct list_head *p;
539 int i;
540 int retval = 0;
541
542 sp = sctp_sk(sk);
543 ep = sp->ep;
544
545 if (!ep->asconf_enable)
546 return retval;
547
548 pr_debug("%s: sk:%p, addrs:%p, addrcnt:%d\n",
549 __func__, sk, addrs, addrcnt);
550
551 list_for_each_entry(asoc, &ep->asocs, asocs) {
552 if (!asoc->peer.asconf_capable)
553 continue;
554
555 if (asoc->peer.addip_disabled_mask & SCTP_PARAM_ADD_IP)
556 continue;
557
558 if (!sctp_state(asoc, ESTABLISHED))
559 continue;
560
561
562
563
564
565
566 addr_buf = addrs;
567 for (i = 0; i < addrcnt; i++) {
568 addr = addr_buf;
569 af = sctp_get_af_specific(addr->v4.sin_family);
570 if (!af) {
571 retval = -EINVAL;
572 goto out;
573 }
574
575 if (sctp_assoc_lookup_laddr(asoc, addr))
576 break;
577
578 addr_buf += af->sockaddr_len;
579 }
580 if (i < addrcnt)
581 continue;
582
583
584
585
586 bp = &asoc->base.bind_addr;
587 p = bp->address_list.next;
588 laddr = list_entry(p, struct sctp_sockaddr_entry, list);
589 chunk = sctp_make_asconf_update_ip(asoc, &laddr->a, addrs,
590 addrcnt, SCTP_PARAM_ADD_IP);
591 if (!chunk) {
592 retval = -ENOMEM;
593 goto out;
594 }
595
596
597
598
599 addr_buf = addrs;
600 for (i = 0; i < addrcnt; i++) {
601 addr = addr_buf;
602 af = sctp_get_af_specific(addr->v4.sin_family);
603 memcpy(&saveaddr, addr, af->sockaddr_len);
604 retval = sctp_add_bind_addr(bp, &saveaddr,
605 sizeof(saveaddr),
606 SCTP_ADDR_NEW, GFP_ATOMIC);
607 addr_buf += af->sockaddr_len;
608 }
609 if (asoc->src_out_of_asoc_ok) {
610 struct sctp_transport *trans;
611
612 list_for_each_entry(trans,
613 &asoc->peer.transport_addr_list, transports) {
614 trans->cwnd = min(4*asoc->pathmtu, max_t(__u32,
615 2*asoc->pathmtu, 4380));
616 trans->ssthresh = asoc->peer.i.a_rwnd;
617 trans->rto = asoc->rto_initial;
618 sctp_max_rto(asoc, trans);
619 trans->rtt = trans->srtt = trans->rttvar = 0;
620
621 sctp_transport_route(trans, NULL,
622 sctp_sk(asoc->base.sk));
623 }
624 }
625 retval = sctp_send_asconf(asoc, chunk);
626 }
627
628out:
629 return retval;
630}
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647static int sctp_bindx_rem(struct sock *sk, struct sockaddr *addrs, int addrcnt)
648{
649 struct sctp_sock *sp = sctp_sk(sk);
650 struct sctp_endpoint *ep = sp->ep;
651 int cnt;
652 struct sctp_bind_addr *bp = &ep->base.bind_addr;
653 int retval = 0;
654 void *addr_buf;
655 union sctp_addr *sa_addr;
656 struct sctp_af *af;
657
658 pr_debug("%s: sk:%p, addrs:%p, addrcnt:%d\n",
659 __func__, sk, addrs, addrcnt);
660
661 addr_buf = addrs;
662 for (cnt = 0; cnt < addrcnt; cnt++) {
663
664
665
666
667 if (list_empty(&bp->address_list) ||
668 (sctp_list_single_entry(&bp->address_list))) {
669 retval = -EBUSY;
670 goto err_bindx_rem;
671 }
672
673 sa_addr = addr_buf;
674 af = sctp_get_af_specific(sa_addr->sa.sa_family);
675 if (!af) {
676 retval = -EINVAL;
677 goto err_bindx_rem;
678 }
679
680 if (!af->addr_valid(sa_addr, sp, NULL)) {
681 retval = -EADDRNOTAVAIL;
682 goto err_bindx_rem;
683 }
684
685 if (sa_addr->v4.sin_port &&
686 sa_addr->v4.sin_port != htons(bp->port)) {
687 retval = -EINVAL;
688 goto err_bindx_rem;
689 }
690
691 if (!sa_addr->v4.sin_port)
692 sa_addr->v4.sin_port = htons(bp->port);
693
694
695
696
697
698
699
700
701 retval = sctp_del_bind_addr(bp, sa_addr);
702
703 addr_buf += af->sockaddr_len;
704err_bindx_rem:
705 if (retval < 0) {
706
707 if (cnt > 0)
708 sctp_bindx_add(sk, addrs, cnt);
709 return retval;
710 }
711 }
712
713 return retval;
714}
715
716
717
718
719
720
721
722
723
724
725
726static int sctp_send_asconf_del_ip(struct sock *sk,
727 struct sockaddr *addrs,
728 int addrcnt)
729{
730 struct sctp_sock *sp;
731 struct sctp_endpoint *ep;
732 struct sctp_association *asoc;
733 struct sctp_transport *transport;
734 struct sctp_bind_addr *bp;
735 struct sctp_chunk *chunk;
736 union sctp_addr *laddr;
737 void *addr_buf;
738 struct sctp_af *af;
739 struct sctp_sockaddr_entry *saddr;
740 int i;
741 int retval = 0;
742 int stored = 0;
743
744 chunk = NULL;
745 sp = sctp_sk(sk);
746 ep = sp->ep;
747
748 if (!ep->asconf_enable)
749 return retval;
750
751 pr_debug("%s: sk:%p, addrs:%p, addrcnt:%d\n",
752 __func__, sk, addrs, addrcnt);
753
754 list_for_each_entry(asoc, &ep->asocs, asocs) {
755
756 if (!asoc->peer.asconf_capable)
757 continue;
758
759 if (asoc->peer.addip_disabled_mask & SCTP_PARAM_DEL_IP)
760 continue;
761
762 if (!sctp_state(asoc, ESTABLISHED))
763 continue;
764
765
766
767
768
769
770 addr_buf = addrs;
771 for (i = 0; i < addrcnt; i++) {
772 laddr = addr_buf;
773 af = sctp_get_af_specific(laddr->v4.sin_family);
774 if (!af) {
775 retval = -EINVAL;
776 goto out;
777 }
778
779 if (!sctp_assoc_lookup_laddr(asoc, laddr))
780 break;
781
782 addr_buf += af->sockaddr_len;
783 }
784 if (i < addrcnt)
785 continue;
786
787
788
789
790
791
792 bp = &asoc->base.bind_addr;
793 laddr = sctp_find_unmatch_addr(bp, (union sctp_addr *)addrs,
794 addrcnt, sp);
795 if ((laddr == NULL) && (addrcnt == 1)) {
796 if (asoc->asconf_addr_del_pending)
797 continue;
798 asoc->asconf_addr_del_pending =
799 kzalloc(sizeof(union sctp_addr), GFP_ATOMIC);
800 if (asoc->asconf_addr_del_pending == NULL) {
801 retval = -ENOMEM;
802 goto out;
803 }
804 asoc->asconf_addr_del_pending->sa.sa_family =
805 addrs->sa_family;
806 asoc->asconf_addr_del_pending->v4.sin_port =
807 htons(bp->port);
808 if (addrs->sa_family == AF_INET) {
809 struct sockaddr_in *sin;
810
811 sin = (struct sockaddr_in *)addrs;
812 asoc->asconf_addr_del_pending->v4.sin_addr.s_addr = sin->sin_addr.s_addr;
813 } else if (addrs->sa_family == AF_INET6) {
814 struct sockaddr_in6 *sin6;
815
816 sin6 = (struct sockaddr_in6 *)addrs;
817 asoc->asconf_addr_del_pending->v6.sin6_addr = sin6->sin6_addr;
818 }
819
820 pr_debug("%s: keep the last address asoc:%p %pISc at %p\n",
821 __func__, asoc, &asoc->asconf_addr_del_pending->sa,
822 asoc->asconf_addr_del_pending);
823
824 asoc->src_out_of_asoc_ok = 1;
825 stored = 1;
826 goto skip_mkasconf;
827 }
828
829 if (laddr == NULL)
830 return -EINVAL;
831
832
833
834
835
836 chunk = sctp_make_asconf_update_ip(asoc, laddr, addrs, addrcnt,
837 SCTP_PARAM_DEL_IP);
838 if (!chunk) {
839 retval = -ENOMEM;
840 goto out;
841 }
842
843skip_mkasconf:
844
845
846
847 addr_buf = addrs;
848 for (i = 0; i < addrcnt; i++) {
849 laddr = addr_buf;
850 af = sctp_get_af_specific(laddr->v4.sin_family);
851 list_for_each_entry(saddr, &bp->address_list, list) {
852 if (sctp_cmp_addr_exact(&saddr->a, laddr))
853 saddr->state = SCTP_ADDR_DEL;
854 }
855 addr_buf += af->sockaddr_len;
856 }
857
858
859
860
861
862 list_for_each_entry(transport, &asoc->peer.transport_addr_list,
863 transports) {
864 sctp_transport_route(transport, NULL,
865 sctp_sk(asoc->base.sk));
866 }
867
868 if (stored)
869
870 continue;
871 retval = sctp_send_asconf(asoc, chunk);
872 }
873out:
874 return retval;
875}
876
877
878int sctp_asconf_mgmt(struct sctp_sock *sp, struct sctp_sockaddr_entry *addrw)
879{
880 struct sock *sk = sctp_opt2sk(sp);
881 union sctp_addr *addr;
882 struct sctp_af *af;
883
884
885 addr = &addrw->a;
886 addr->v4.sin_port = htons(sp->ep->base.bind_addr.port);
887 af = sctp_get_af_specific(addr->sa.sa_family);
888 if (!af)
889 return -EINVAL;
890 if (sctp_verify_addr(sk, addr, af->sockaddr_len))
891 return -EINVAL;
892
893 if (addrw->state == SCTP_ADDR_NEW)
894 return sctp_send_asconf_add_ip(sk, (struct sockaddr *)addr, 1);
895 else
896 return sctp_send_asconf_del_ip(sk, (struct sockaddr *)addr, 1);
897}
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968static int sctp_setsockopt_bindx(struct sock *sk,
969 struct sockaddr __user *addrs,
970 int addrs_size, int op)
971{
972 struct sockaddr *kaddrs;
973 int err;
974 int addrcnt = 0;
975 int walk_size = 0;
976 struct sockaddr *sa_addr;
977 void *addr_buf;
978 struct sctp_af *af;
979
980 pr_debug("%s: sk:%p addrs:%p addrs_size:%d opt:%d\n",
981 __func__, sk, addrs, addrs_size, op);
982
983 if (unlikely(addrs_size <= 0))
984 return -EINVAL;
985
986 kaddrs = memdup_user(addrs, addrs_size);
987 if (IS_ERR(kaddrs))
988 return PTR_ERR(kaddrs);
989
990
991 addr_buf = kaddrs;
992 while (walk_size < addrs_size) {
993 if (walk_size + sizeof(sa_family_t) > addrs_size) {
994 kfree(kaddrs);
995 return -EINVAL;
996 }
997
998 sa_addr = addr_buf;
999 af = sctp_get_af_specific(sa_addr->sa_family);
1000
1001
1002
1003
1004 if (!af || (walk_size + af->sockaddr_len) > addrs_size) {
1005 kfree(kaddrs);
1006 return -EINVAL;
1007 }
1008 addrcnt++;
1009 addr_buf += af->sockaddr_len;
1010 walk_size += af->sockaddr_len;
1011 }
1012
1013
1014 switch (op) {
1015 case SCTP_BINDX_ADD_ADDR:
1016
1017 err = security_sctp_bind_connect(sk, SCTP_SOCKOPT_BINDX_ADD,
1018 (struct sockaddr *)kaddrs,
1019 addrs_size);
1020 if (err)
1021 goto out;
1022 err = sctp_bindx_add(sk, kaddrs, addrcnt);
1023 if (err)
1024 goto out;
1025 err = sctp_send_asconf_add_ip(sk, kaddrs, addrcnt);
1026 break;
1027
1028 case SCTP_BINDX_REM_ADDR:
1029 err = sctp_bindx_rem(sk, kaddrs, addrcnt);
1030 if (err)
1031 goto out;
1032 err = sctp_send_asconf_del_ip(sk, kaddrs, addrcnt);
1033 break;
1034
1035 default:
1036 err = -EINVAL;
1037 break;
1038 }
1039
1040out:
1041 kfree(kaddrs);
1042
1043 return err;
1044}
1045
1046static int sctp_connect_new_asoc(struct sctp_endpoint *ep,
1047 const union sctp_addr *daddr,
1048 const struct sctp_initmsg *init,
1049 struct sctp_transport **tp)
1050{
1051 struct sctp_association *asoc;
1052 struct sock *sk = ep->base.sk;
1053 struct net *net = sock_net(sk);
1054 enum sctp_scope scope;
1055 int err;
1056
1057 if (sctp_endpoint_is_peeled_off(ep, daddr))
1058 return -EADDRNOTAVAIL;
1059
1060 if (!ep->base.bind_addr.port) {
1061 if (sctp_autobind(sk))
1062 return -EAGAIN;
1063 } else {
1064 if (ep->base.bind_addr.port < inet_prot_sock(net) &&
1065 !ns_capable(net->user_ns, CAP_NET_BIND_SERVICE))
1066 return -EACCES;
1067 }
1068
1069 scope = sctp_scope(daddr);
1070 asoc = sctp_association_new(ep, sk, scope, GFP_KERNEL);
1071 if (!asoc)
1072 return -ENOMEM;
1073
1074 err = sctp_assoc_set_bind_addr_from_ep(asoc, scope, GFP_KERNEL);
1075 if (err < 0)
1076 goto free;
1077
1078 *tp = sctp_assoc_add_peer(asoc, daddr, GFP_KERNEL, SCTP_UNKNOWN);
1079 if (!*tp) {
1080 err = -ENOMEM;
1081 goto free;
1082 }
1083
1084 if (!init)
1085 return 0;
1086
1087 if (init->sinit_num_ostreams) {
1088 __u16 outcnt = init->sinit_num_ostreams;
1089
1090 asoc->c.sinit_num_ostreams = outcnt;
1091
1092 err = sctp_stream_init(&asoc->stream, outcnt, 0, GFP_KERNEL);
1093 if (err)
1094 goto free;
1095 }
1096
1097 if (init->sinit_max_instreams)
1098 asoc->c.sinit_max_instreams = init->sinit_max_instreams;
1099
1100 if (init->sinit_max_attempts)
1101 asoc->max_init_attempts = init->sinit_max_attempts;
1102
1103 if (init->sinit_max_init_timeo)
1104 asoc->max_init_timeo =
1105 msecs_to_jiffies(init->sinit_max_init_timeo);
1106
1107 return 0;
1108free:
1109 sctp_association_free(asoc);
1110 return err;
1111}
1112
1113static int sctp_connect_add_peer(struct sctp_association *asoc,
1114 union sctp_addr *daddr, int addr_len)
1115{
1116 struct sctp_endpoint *ep = asoc->ep;
1117 struct sctp_association *old;
1118 struct sctp_transport *t;
1119 int err;
1120
1121 err = sctp_verify_addr(ep->base.sk, daddr, addr_len);
1122 if (err)
1123 return err;
1124
1125 old = sctp_endpoint_lookup_assoc(ep, daddr, &t);
1126 if (old && old != asoc)
1127 return old->state >= SCTP_STATE_ESTABLISHED ? -EISCONN
1128 : -EALREADY;
1129
1130 if (sctp_endpoint_is_peeled_off(ep, daddr))
1131 return -EADDRNOTAVAIL;
1132
1133 t = sctp_assoc_add_peer(asoc, daddr, GFP_KERNEL, SCTP_UNKNOWN);
1134 if (!t)
1135 return -ENOMEM;
1136
1137 return 0;
1138}
1139
1140
1141
1142
1143
1144
1145static int __sctp_connect(struct sock *sk, struct sockaddr *kaddrs,
1146 int addrs_size, int flags, sctp_assoc_t *assoc_id)
1147{
1148 struct sctp_sock *sp = sctp_sk(sk);
1149 struct sctp_endpoint *ep = sp->ep;
1150 struct sctp_transport *transport;
1151 struct sctp_association *asoc;
1152 void *addr_buf = kaddrs;
1153 union sctp_addr *daddr;
1154 struct sctp_af *af;
1155 int walk_size, err;
1156 long timeo;
1157
1158 if (sctp_sstate(sk, ESTABLISHED) || sctp_sstate(sk, CLOSING) ||
1159 (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING)))
1160 return -EISCONN;
1161
1162 daddr = addr_buf;
1163 af = sctp_get_af_specific(daddr->sa.sa_family);
1164 if (!af || af->sockaddr_len > addrs_size)
1165 return -EINVAL;
1166
1167 err = sctp_verify_addr(sk, daddr, af->sockaddr_len);
1168 if (err)
1169 return err;
1170
1171 asoc = sctp_endpoint_lookup_assoc(ep, daddr, &transport);
1172 if (asoc)
1173 return asoc->state >= SCTP_STATE_ESTABLISHED ? -EISCONN
1174 : -EALREADY;
1175
1176 err = sctp_connect_new_asoc(ep, daddr, NULL, &transport);
1177 if (err)
1178 return err;
1179 asoc = transport->asoc;
1180
1181 addr_buf += af->sockaddr_len;
1182 walk_size = af->sockaddr_len;
1183 while (walk_size < addrs_size) {
1184 err = -EINVAL;
1185 if (walk_size + sizeof(sa_family_t) > addrs_size)
1186 goto out_free;
1187
1188 daddr = addr_buf;
1189 af = sctp_get_af_specific(daddr->sa.sa_family);
1190 if (!af || af->sockaddr_len + walk_size > addrs_size)
1191 goto out_free;
1192
1193 if (asoc->peer.port != ntohs(daddr->v4.sin_port))
1194 goto out_free;
1195
1196 err = sctp_connect_add_peer(asoc, daddr, af->sockaddr_len);
1197 if (err)
1198 goto out_free;
1199
1200 addr_buf += af->sockaddr_len;
1201 walk_size += af->sockaddr_len;
1202 }
1203
1204
1205
1206
1207 if (assoc_id) {
1208 err = sctp_assoc_set_id(asoc, GFP_KERNEL);
1209 if (err < 0)
1210 goto out_free;
1211 }
1212
1213 err = sctp_primitive_ASSOCIATE(sock_net(sk), asoc, NULL);
1214 if (err < 0)
1215 goto out_free;
1216
1217
1218 inet_sk(sk)->inet_dport = htons(asoc->peer.port);
1219 sp->pf->to_sk_daddr(daddr, sk);
1220 sk->sk_err = 0;
1221
1222 if (assoc_id)
1223 *assoc_id = asoc->assoc_id;
1224
1225 timeo = sock_sndtimeo(sk, flags & O_NONBLOCK);
1226 return sctp_wait_for_connect(asoc, &timeo);
1227
1228out_free:
1229 pr_debug("%s: took out_free path with asoc:%p kaddrs:%p err:%d\n",
1230 __func__, asoc, kaddrs, err);
1231 sctp_association_free(asoc);
1232 return err;
1233}
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290static int __sctp_setsockopt_connectx(struct sock *sk,
1291 struct sockaddr __user *addrs,
1292 int addrs_size,
1293 sctp_assoc_t *assoc_id)
1294{
1295 struct sockaddr *kaddrs;
1296 int err = 0, flags = 0;
1297
1298 pr_debug("%s: sk:%p addrs:%p addrs_size:%d\n",
1299 __func__, sk, addrs, addrs_size);
1300
1301
1302 if (unlikely(addrs_size < sizeof(sa_family_t)))
1303 return -EINVAL;
1304
1305 kaddrs = memdup_user(addrs, addrs_size);
1306 if (IS_ERR(kaddrs))
1307 return PTR_ERR(kaddrs);
1308
1309
1310 err = security_sctp_bind_connect(sk, SCTP_SOCKOPT_CONNECTX,
1311 (struct sockaddr *)kaddrs,
1312 addrs_size);
1313 if (err)
1314 goto out_free;
1315
1316
1317
1318
1319 if (sk->sk_socket->file)
1320 flags = sk->sk_socket->file->f_flags;
1321
1322 err = __sctp_connect(sk, kaddrs, addrs_size, flags, assoc_id);
1323
1324out_free:
1325 kfree(kaddrs);
1326
1327 return err;
1328}
1329
1330
1331
1332
1333
1334static int sctp_setsockopt_connectx_old(struct sock *sk,
1335 struct sockaddr __user *addrs,
1336 int addrs_size)
1337{
1338 return __sctp_setsockopt_connectx(sk, addrs, addrs_size, NULL);
1339}
1340
1341
1342
1343
1344
1345
1346
1347static int sctp_setsockopt_connectx(struct sock *sk,
1348 struct sockaddr __user *addrs,
1349 int addrs_size)
1350{
1351 sctp_assoc_t assoc_id = 0;
1352 int err = 0;
1353
1354 err = __sctp_setsockopt_connectx(sk, addrs, addrs_size, &assoc_id);
1355
1356 if (err)
1357 return err;
1358 else
1359 return assoc_id;
1360}
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370#ifdef CONFIG_COMPAT
1371struct compat_sctp_getaddrs_old {
1372 sctp_assoc_t assoc_id;
1373 s32 addr_num;
1374 compat_uptr_t addrs;
1375};
1376#endif
1377
1378static int sctp_getsockopt_connectx3(struct sock *sk, int len,
1379 char __user *optval,
1380 int __user *optlen)
1381{
1382 struct sctp_getaddrs_old param;
1383 sctp_assoc_t assoc_id = 0;
1384 int err = 0;
1385
1386#ifdef CONFIG_COMPAT
1387 if (in_compat_syscall()) {
1388 struct compat_sctp_getaddrs_old param32;
1389
1390 if (len < sizeof(param32))
1391 return -EINVAL;
1392 if (copy_from_user(¶m32, optval, sizeof(param32)))
1393 return -EFAULT;
1394
1395 param.assoc_id = param32.assoc_id;
1396 param.addr_num = param32.addr_num;
1397 param.addrs = compat_ptr(param32.addrs);
1398 } else
1399#endif
1400 {
1401 if (len < sizeof(param))
1402 return -EINVAL;
1403 if (copy_from_user(¶m, optval, sizeof(param)))
1404 return -EFAULT;
1405 }
1406
1407 err = __sctp_setsockopt_connectx(sk, (struct sockaddr __user *)
1408 param.addrs, param.addr_num,
1409 &assoc_id);
1410 if (err == 0 || err == -EINPROGRESS) {
1411 if (copy_to_user(optval, &assoc_id, sizeof(assoc_id)))
1412 return -EFAULT;
1413 if (put_user(sizeof(assoc_id), optlen))
1414 return -EFAULT;
1415 }
1416
1417 return err;
1418}
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470static void sctp_close(struct sock *sk, long timeout)
1471{
1472 struct net *net = sock_net(sk);
1473 struct sctp_endpoint *ep;
1474 struct sctp_association *asoc;
1475 struct list_head *pos, *temp;
1476 unsigned int data_was_unread;
1477
1478 pr_debug("%s: sk:%p, timeout:%ld\n", __func__, sk, timeout);
1479
1480 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
1481 sk->sk_shutdown = SHUTDOWN_MASK;
1482 inet_sk_set_state(sk, SCTP_SS_CLOSING);
1483
1484 ep = sctp_sk(sk)->ep;
1485
1486
1487 data_was_unread = sctp_queue_purge_ulpevents(&sk->sk_receive_queue);
1488 data_was_unread += sctp_queue_purge_ulpevents(&sctp_sk(sk)->pd_lobby);
1489
1490
1491 list_for_each_safe(pos, temp, &ep->asocs) {
1492 asoc = list_entry(pos, struct sctp_association, asocs);
1493
1494 if (sctp_style(sk, TCP)) {
1495
1496
1497
1498
1499
1500 if (sctp_state(asoc, CLOSED)) {
1501 sctp_association_free(asoc);
1502 continue;
1503 }
1504 }
1505
1506 if (data_was_unread || !skb_queue_empty(&asoc->ulpq.lobby) ||
1507 !skb_queue_empty(&asoc->ulpq.reasm) ||
1508 !skb_queue_empty(&asoc->ulpq.reasm_uo) ||
1509 (sock_flag(sk, SOCK_LINGER) && !sk->sk_lingertime)) {
1510 struct sctp_chunk *chunk;
1511
1512 chunk = sctp_make_abort_user(asoc, NULL, 0);
1513 sctp_primitive_ABORT(net, asoc, chunk);
1514 } else
1515 sctp_primitive_SHUTDOWN(net, asoc, NULL);
1516 }
1517
1518
1519 if (sctp_style(sk, TCP) && timeout)
1520 sctp_wait_for_close(sk, timeout);
1521
1522
1523 release_sock(sk);
1524
1525
1526
1527
1528
1529
1530 spin_lock_bh(&net->sctp.addr_wq_lock);
1531 bh_lock_sock_nested(sk);
1532
1533
1534
1535
1536 sock_hold(sk);
1537 sk_common_release(sk);
1538
1539 bh_unlock_sock(sk);
1540 spin_unlock_bh(&net->sctp.addr_wq_lock);
1541
1542 sock_put(sk);
1543
1544 SCTP_DBG_OBJCNT_DEC(sock);
1545}
1546
1547
1548static int sctp_error(struct sock *sk, int flags, int err)
1549{
1550 if (err == -EPIPE)
1551 err = sock_error(sk) ? : -EPIPE;
1552 if (err == -EPIPE && !(flags & MSG_NOSIGNAL))
1553 send_sig(SIGPIPE, current, 0);
1554 return err;
1555}
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580static int sctp_msghdr_parse(const struct msghdr *msg,
1581 struct sctp_cmsgs *cmsgs);
1582
1583static int sctp_sendmsg_parse(struct sock *sk, struct sctp_cmsgs *cmsgs,
1584 struct sctp_sndrcvinfo *srinfo,
1585 const struct msghdr *msg, size_t msg_len)
1586{
1587 __u16 sflags;
1588 int err;
1589
1590 if (sctp_sstate(sk, LISTENING) && sctp_style(sk, TCP))
1591 return -EPIPE;
1592
1593 if (msg_len > sk->sk_sndbuf)
1594 return -EMSGSIZE;
1595
1596 memset(cmsgs, 0, sizeof(*cmsgs));
1597 err = sctp_msghdr_parse(msg, cmsgs);
1598 if (err) {
1599 pr_debug("%s: msghdr parse err:%x\n", __func__, err);
1600 return err;
1601 }
1602
1603 memset(srinfo, 0, sizeof(*srinfo));
1604 if (cmsgs->srinfo) {
1605 srinfo->sinfo_stream = cmsgs->srinfo->sinfo_stream;
1606 srinfo->sinfo_flags = cmsgs->srinfo->sinfo_flags;
1607 srinfo->sinfo_ppid = cmsgs->srinfo->sinfo_ppid;
1608 srinfo->sinfo_context = cmsgs->srinfo->sinfo_context;
1609 srinfo->sinfo_assoc_id = cmsgs->srinfo->sinfo_assoc_id;
1610 srinfo->sinfo_timetolive = cmsgs->srinfo->sinfo_timetolive;
1611 }
1612
1613 if (cmsgs->sinfo) {
1614 srinfo->sinfo_stream = cmsgs->sinfo->snd_sid;
1615 srinfo->sinfo_flags = cmsgs->sinfo->snd_flags;
1616 srinfo->sinfo_ppid = cmsgs->sinfo->snd_ppid;
1617 srinfo->sinfo_context = cmsgs->sinfo->snd_context;
1618 srinfo->sinfo_assoc_id = cmsgs->sinfo->snd_assoc_id;
1619 }
1620
1621 if (cmsgs->prinfo) {
1622 srinfo->sinfo_timetolive = cmsgs->prinfo->pr_value;
1623 SCTP_PR_SET_POLICY(srinfo->sinfo_flags,
1624 cmsgs->prinfo->pr_policy);
1625 }
1626
1627 sflags = srinfo->sinfo_flags;
1628 if (!sflags && msg_len)
1629 return 0;
1630
1631 if (sctp_style(sk, TCP) && (sflags & (SCTP_EOF | SCTP_ABORT)))
1632 return -EINVAL;
1633
1634 if (((sflags & SCTP_EOF) && msg_len > 0) ||
1635 (!(sflags & (SCTP_EOF | SCTP_ABORT)) && msg_len == 0))
1636 return -EINVAL;
1637
1638 if ((sflags & SCTP_ADDR_OVER) && !msg->msg_name)
1639 return -EINVAL;
1640
1641 return 0;
1642}
1643
1644static int sctp_sendmsg_new_asoc(struct sock *sk, __u16 sflags,
1645 struct sctp_cmsgs *cmsgs,
1646 union sctp_addr *daddr,
1647 struct sctp_transport **tp)
1648{
1649 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
1650 struct sctp_association *asoc;
1651 struct cmsghdr *cmsg;
1652 __be32 flowinfo = 0;
1653 struct sctp_af *af;
1654 int err;
1655
1656 *tp = NULL;
1657
1658 if (sflags & (SCTP_EOF | SCTP_ABORT))
1659 return -EINVAL;
1660
1661 if (sctp_style(sk, TCP) && (sctp_sstate(sk, ESTABLISHED) ||
1662 sctp_sstate(sk, CLOSING)))
1663 return -EADDRNOTAVAIL;
1664
1665
1666
1667
1668
1669
1670
1671 af = sctp_get_af_specific(daddr->sa.sa_family);
1672 if (!af)
1673 return -EINVAL;
1674 err = security_sctp_bind_connect(sk, SCTP_SENDMSG_CONNECT,
1675 (struct sockaddr *)daddr,
1676 af->sockaddr_len);
1677 if (err < 0)
1678 return err;
1679
1680 err = sctp_connect_new_asoc(ep, daddr, cmsgs->init, tp);
1681 if (err)
1682 return err;
1683 asoc = (*tp)->asoc;
1684
1685 if (!cmsgs->addrs_msg)
1686 return 0;
1687
1688 if (daddr->sa.sa_family == AF_INET6)
1689 flowinfo = daddr->v6.sin6_flowinfo;
1690
1691
1692 for_each_cmsghdr(cmsg, cmsgs->addrs_msg) {
1693 union sctp_addr _daddr;
1694 int dlen;
1695
1696 if (cmsg->cmsg_level != IPPROTO_SCTP ||
1697 (cmsg->cmsg_type != SCTP_DSTADDRV4 &&
1698 cmsg->cmsg_type != SCTP_DSTADDRV6))
1699 continue;
1700
1701 daddr = &_daddr;
1702 memset(daddr, 0, sizeof(*daddr));
1703 dlen = cmsg->cmsg_len - sizeof(struct cmsghdr);
1704 if (cmsg->cmsg_type == SCTP_DSTADDRV4) {
1705 if (dlen < sizeof(struct in_addr)) {
1706 err = -EINVAL;
1707 goto free;
1708 }
1709
1710 dlen = sizeof(struct in_addr);
1711 daddr->v4.sin_family = AF_INET;
1712 daddr->v4.sin_port = htons(asoc->peer.port);
1713 memcpy(&daddr->v4.sin_addr, CMSG_DATA(cmsg), dlen);
1714 } else {
1715 if (dlen < sizeof(struct in6_addr)) {
1716 err = -EINVAL;
1717 goto free;
1718 }
1719
1720 dlen = sizeof(struct in6_addr);
1721 daddr->v6.sin6_flowinfo = flowinfo;
1722 daddr->v6.sin6_family = AF_INET6;
1723 daddr->v6.sin6_port = htons(asoc->peer.port);
1724 memcpy(&daddr->v6.sin6_addr, CMSG_DATA(cmsg), dlen);
1725 }
1726
1727 err = sctp_connect_add_peer(asoc, daddr, sizeof(*daddr));
1728 if (err)
1729 goto free;
1730 }
1731
1732 return 0;
1733
1734free:
1735 sctp_association_free(asoc);
1736 return err;
1737}
1738
1739static int sctp_sendmsg_check_sflags(struct sctp_association *asoc,
1740 __u16 sflags, struct msghdr *msg,
1741 size_t msg_len)
1742{
1743 struct sock *sk = asoc->base.sk;
1744 struct net *net = sock_net(sk);
1745
1746 if (sctp_state(asoc, CLOSED) && sctp_style(sk, TCP))
1747 return -EPIPE;
1748
1749 if ((sflags & SCTP_SENDALL) && sctp_style(sk, UDP) &&
1750 !sctp_state(asoc, ESTABLISHED))
1751 return 0;
1752
1753 if (sflags & SCTP_EOF) {
1754 pr_debug("%s: shutting down association:%p\n", __func__, asoc);
1755 sctp_primitive_SHUTDOWN(net, asoc, NULL);
1756
1757 return 0;
1758 }
1759
1760 if (sflags & SCTP_ABORT) {
1761 struct sctp_chunk *chunk;
1762
1763 chunk = sctp_make_abort_user(asoc, msg, msg_len);
1764 if (!chunk)
1765 return -ENOMEM;
1766
1767 pr_debug("%s: aborting association:%p\n", __func__, asoc);
1768 sctp_primitive_ABORT(net, asoc, chunk);
1769 iov_iter_revert(&msg->msg_iter, msg_len);
1770
1771 return 0;
1772 }
1773
1774 return 1;
1775}
1776
1777static int sctp_sendmsg_to_asoc(struct sctp_association *asoc,
1778 struct msghdr *msg, size_t msg_len,
1779 struct sctp_transport *transport,
1780 struct sctp_sndrcvinfo *sinfo)
1781{
1782 struct sock *sk = asoc->base.sk;
1783 struct sctp_sock *sp = sctp_sk(sk);
1784 struct net *net = sock_net(sk);
1785 struct sctp_datamsg *datamsg;
1786 bool wait_connect = false;
1787 struct sctp_chunk *chunk;
1788 long timeo;
1789 int err;
1790
1791 if (sinfo->sinfo_stream >= asoc->stream.outcnt) {
1792 err = -EINVAL;
1793 goto err;
1794 }
1795
1796 if (unlikely(!SCTP_SO(&asoc->stream, sinfo->sinfo_stream)->ext)) {
1797 err = sctp_stream_init_ext(&asoc->stream, sinfo->sinfo_stream);
1798 if (err)
1799 goto err;
1800 }
1801
1802 if (sp->disable_fragments && msg_len > asoc->frag_point) {
1803 err = -EMSGSIZE;
1804 goto err;
1805 }
1806
1807 if (asoc->pmtu_pending) {
1808 if (sp->param_flags & SPP_PMTUD_ENABLE)
1809 sctp_assoc_sync_pmtu(asoc);
1810 asoc->pmtu_pending = 0;
1811 }
1812
1813 if (sctp_wspace(asoc) < (int)msg_len)
1814 sctp_prsctp_prune(asoc, sinfo, msg_len - sctp_wspace(asoc));
1815
1816 if (sk_under_memory_pressure(sk))
1817 sk_mem_reclaim(sk);
1818
1819 if (sctp_wspace(asoc) <= 0 || !sk_wmem_schedule(sk, msg_len)) {
1820 timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT);
1821 err = sctp_wait_for_sndbuf(asoc, &timeo, msg_len);
1822 if (err)
1823 goto err;
1824 }
1825
1826 if (sctp_state(asoc, CLOSED)) {
1827 err = sctp_primitive_ASSOCIATE(net, asoc, NULL);
1828 if (err)
1829 goto err;
1830
1831 if (asoc->ep->intl_enable) {
1832 timeo = sock_sndtimeo(sk, 0);
1833 err = sctp_wait_for_connect(asoc, &timeo);
1834 if (err) {
1835 err = -ESRCH;
1836 goto err;
1837 }
1838 } else {
1839 wait_connect = true;
1840 }
1841
1842 pr_debug("%s: we associated primitively\n", __func__);
1843 }
1844
1845 datamsg = sctp_datamsg_from_user(asoc, sinfo, &msg->msg_iter);
1846 if (IS_ERR(datamsg)) {
1847 err = PTR_ERR(datamsg);
1848 goto err;
1849 }
1850
1851 asoc->force_delay = !!(msg->msg_flags & MSG_MORE);
1852
1853 list_for_each_entry(chunk, &datamsg->chunks, frag_list) {
1854 sctp_chunk_hold(chunk);
1855 sctp_set_owner_w(chunk);
1856 chunk->transport = transport;
1857 }
1858
1859 err = sctp_primitive_SEND(net, asoc, datamsg);
1860 if (err) {
1861 sctp_datamsg_free(datamsg);
1862 goto err;
1863 }
1864
1865 pr_debug("%s: we sent primitively\n", __func__);
1866
1867 sctp_datamsg_put(datamsg);
1868
1869 if (unlikely(wait_connect)) {
1870 timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT);
1871 sctp_wait_for_connect(asoc, &timeo);
1872 }
1873
1874 err = msg_len;
1875
1876err:
1877 return err;
1878}
1879
1880static union sctp_addr *sctp_sendmsg_get_daddr(struct sock *sk,
1881 const struct msghdr *msg,
1882 struct sctp_cmsgs *cmsgs)
1883{
1884 union sctp_addr *daddr = NULL;
1885 int err;
1886
1887 if (!sctp_style(sk, UDP_HIGH_BANDWIDTH) && msg->msg_name) {
1888 int len = msg->msg_namelen;
1889
1890 if (len > sizeof(*daddr))
1891 len = sizeof(*daddr);
1892
1893 daddr = (union sctp_addr *)msg->msg_name;
1894
1895 err = sctp_verify_addr(sk, daddr, len);
1896 if (err)
1897 return ERR_PTR(err);
1898 }
1899
1900 return daddr;
1901}
1902
1903static void sctp_sendmsg_update_sinfo(struct sctp_association *asoc,
1904 struct sctp_sndrcvinfo *sinfo,
1905 struct sctp_cmsgs *cmsgs)
1906{
1907 if (!cmsgs->srinfo && !cmsgs->sinfo) {
1908 sinfo->sinfo_stream = asoc->default_stream;
1909 sinfo->sinfo_ppid = asoc->default_ppid;
1910 sinfo->sinfo_context = asoc->default_context;
1911 sinfo->sinfo_assoc_id = sctp_assoc2id(asoc);
1912
1913 if (!cmsgs->prinfo)
1914 sinfo->sinfo_flags = asoc->default_flags;
1915 }
1916
1917 if (!cmsgs->srinfo && !cmsgs->prinfo)
1918 sinfo->sinfo_timetolive = asoc->default_timetolive;
1919
1920 if (cmsgs->authinfo) {
1921
1922
1923
1924 sinfo->sinfo_tsn = 1;
1925 sinfo->sinfo_ssn = cmsgs->authinfo->auth_keynumber;
1926 }
1927}
1928
1929static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len)
1930{
1931 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
1932 struct sctp_transport *transport = NULL;
1933 struct sctp_sndrcvinfo _sinfo, *sinfo;
1934 struct sctp_association *asoc, *tmp;
1935 struct sctp_cmsgs cmsgs;
1936 union sctp_addr *daddr;
1937 bool new = false;
1938 __u16 sflags;
1939 int err;
1940
1941
1942 err = sctp_sendmsg_parse(sk, &cmsgs, &_sinfo, msg, msg_len);
1943 if (err)
1944 goto out;
1945
1946 sinfo = &_sinfo;
1947 sflags = sinfo->sinfo_flags;
1948
1949
1950 daddr = sctp_sendmsg_get_daddr(sk, msg, &cmsgs);
1951 if (IS_ERR(daddr)) {
1952 err = PTR_ERR(daddr);
1953 goto out;
1954 }
1955
1956 lock_sock(sk);
1957
1958
1959 if ((sflags & SCTP_SENDALL) && sctp_style(sk, UDP)) {
1960 list_for_each_entry_safe(asoc, tmp, &ep->asocs, asocs) {
1961 err = sctp_sendmsg_check_sflags(asoc, sflags, msg,
1962 msg_len);
1963 if (err == 0)
1964 continue;
1965 if (err < 0)
1966 goto out_unlock;
1967
1968 sctp_sendmsg_update_sinfo(asoc, sinfo, &cmsgs);
1969
1970 err = sctp_sendmsg_to_asoc(asoc, msg, msg_len,
1971 NULL, sinfo);
1972 if (err < 0)
1973 goto out_unlock;
1974
1975 iov_iter_revert(&msg->msg_iter, err);
1976 }
1977
1978 goto out_unlock;
1979 }
1980
1981
1982 if (daddr) {
1983 asoc = sctp_endpoint_lookup_assoc(ep, daddr, &transport);
1984 if (asoc) {
1985 err = sctp_sendmsg_check_sflags(asoc, sflags, msg,
1986 msg_len);
1987 if (err <= 0)
1988 goto out_unlock;
1989 } else {
1990 err = sctp_sendmsg_new_asoc(sk, sflags, &cmsgs, daddr,
1991 &transport);
1992 if (err)
1993 goto out_unlock;
1994
1995 asoc = transport->asoc;
1996 new = true;
1997 }
1998
1999 if (!sctp_style(sk, TCP) && !(sflags & SCTP_ADDR_OVER))
2000 transport = NULL;
2001 } else {
2002 asoc = sctp_id2assoc(sk, sinfo->sinfo_assoc_id);
2003 if (!asoc) {
2004 err = -EPIPE;
2005 goto out_unlock;
2006 }
2007
2008 err = sctp_sendmsg_check_sflags(asoc, sflags, msg, msg_len);
2009 if (err <= 0)
2010 goto out_unlock;
2011 }
2012
2013
2014 sctp_sendmsg_update_sinfo(asoc, sinfo, &cmsgs);
2015
2016
2017 err = sctp_sendmsg_to_asoc(asoc, msg, msg_len, transport, sinfo);
2018 if (err < 0 && err != -ESRCH && new)
2019 sctp_association_free(asoc);
2020
2021out_unlock:
2022 release_sock(sk);
2023out:
2024 return sctp_error(sk, msg->msg_flags, err);
2025}
2026
2027
2028
2029
2030
2031
2032
2033
2034static int sctp_skb_pull(struct sk_buff *skb, int len)
2035{
2036 struct sk_buff *list;
2037 int skb_len = skb_headlen(skb);
2038 int rlen;
2039
2040 if (len <= skb_len) {
2041 __skb_pull(skb, len);
2042 return 0;
2043 }
2044 len -= skb_len;
2045 __skb_pull(skb, skb_len);
2046
2047 skb_walk_frags(skb, list) {
2048 rlen = sctp_skb_pull(list, len);
2049 skb->len -= (len-rlen);
2050 skb->data_len -= (len-rlen);
2051
2052 if (!rlen)
2053 return 0;
2054
2055 len = rlen;
2056 }
2057
2058 return len;
2059}
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076static int sctp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
2077 int noblock, int flags, int *addr_len)
2078{
2079 struct sctp_ulpevent *event = NULL;
2080 struct sctp_sock *sp = sctp_sk(sk);
2081 struct sk_buff *skb, *head_skb;
2082 int copied;
2083 int err = 0;
2084 int skb_len;
2085
2086 pr_debug("%s: sk:%p, msghdr:%p, len:%zd, noblock:%d, flags:0x%x, "
2087 "addr_len:%p)\n", __func__, sk, msg, len, noblock, flags,
2088 addr_len);
2089
2090 lock_sock(sk);
2091
2092 if (sctp_style(sk, TCP) && !sctp_sstate(sk, ESTABLISHED) &&
2093 !sctp_sstate(sk, CLOSING) && !sctp_sstate(sk, CLOSED)) {
2094 err = -ENOTCONN;
2095 goto out;
2096 }
2097
2098 skb = sctp_skb_recv_datagram(sk, flags, noblock, &err);
2099 if (!skb)
2100 goto out;
2101
2102
2103
2104
2105 skb_len = skb->len;
2106
2107 copied = skb_len;
2108 if (copied > len)
2109 copied = len;
2110
2111 err = skb_copy_datagram_msg(skb, 0, msg, copied);
2112
2113 event = sctp_skb2event(skb);
2114
2115 if (err)
2116 goto out_free;
2117
2118 if (event->chunk && event->chunk->head_skb)
2119 head_skb = event->chunk->head_skb;
2120 else
2121 head_skb = skb;
2122 sock_recv_ts_and_drops(msg, sk, head_skb);
2123 if (sctp_ulpevent_is_notification(event)) {
2124 msg->msg_flags |= MSG_NOTIFICATION;
2125 sp->pf->event_msgname(event, msg->msg_name, addr_len);
2126 } else {
2127 sp->pf->skb_msgname(head_skb, msg->msg_name, addr_len);
2128 }
2129
2130
2131 if (sp->recvnxtinfo)
2132 sctp_ulpevent_read_nxtinfo(event, msg, sk);
2133
2134 if (sp->recvrcvinfo)
2135 sctp_ulpevent_read_rcvinfo(event, msg);
2136
2137 if (sctp_ulpevent_type_enabled(sp->subscribe, SCTP_DATA_IO_EVENT))
2138 sctp_ulpevent_read_sndrcvinfo(event, msg);
2139
2140 err = copied;
2141
2142
2143
2144
2145
2146 if (skb_len > copied) {
2147 msg->msg_flags &= ~MSG_EOR;
2148 if (flags & MSG_PEEK)
2149 goto out_free;
2150 sctp_skb_pull(skb, copied);
2151 skb_queue_head(&sk->sk_receive_queue, skb);
2152
2153
2154
2155
2156
2157 if (!sctp_ulpevent_is_notification(event))
2158 sctp_assoc_rwnd_increase(event->asoc, copied);
2159 goto out;
2160 } else if ((event->msg_flags & MSG_NOTIFICATION) ||
2161 (event->msg_flags & MSG_EOR))
2162 msg->msg_flags |= MSG_EOR;
2163 else
2164 msg->msg_flags &= ~MSG_EOR;
2165
2166out_free:
2167 if (flags & MSG_PEEK) {
2168
2169
2170
2171 kfree_skb(skb);
2172 } else {
2173
2174
2175
2176
2177 sctp_ulpevent_free(event);
2178 }
2179out:
2180 release_sock(sk);
2181 return err;
2182}
2183
2184
2185
2186
2187
2188
2189
2190
2191static int sctp_setsockopt_disable_fragments(struct sock *sk,
2192 char __user *optval,
2193 unsigned int optlen)
2194{
2195 int val;
2196
2197 if (optlen < sizeof(int))
2198 return -EINVAL;
2199
2200 if (get_user(val, (int __user *)optval))
2201 return -EFAULT;
2202
2203 sctp_sk(sk)->disable_fragments = (val == 0) ? 0 : 1;
2204
2205 return 0;
2206}
2207
2208static int sctp_setsockopt_events(struct sock *sk, char __user *optval,
2209 unsigned int optlen)
2210{
2211 struct sctp_event_subscribe subscribe;
2212 __u8 *sn_type = (__u8 *)&subscribe;
2213 struct sctp_sock *sp = sctp_sk(sk);
2214 struct sctp_association *asoc;
2215 int i;
2216
2217 if (optlen > sizeof(struct sctp_event_subscribe))
2218 return -EINVAL;
2219
2220 if (copy_from_user(&subscribe, optval, optlen))
2221 return -EFAULT;
2222
2223 for (i = 0; i < optlen; i++)
2224 sctp_ulpevent_type_set(&sp->subscribe, SCTP_SN_TYPE_BASE + i,
2225 sn_type[i]);
2226
2227 list_for_each_entry(asoc, &sp->ep->asocs, asocs)
2228 asoc->subscribe = sctp_sk(sk)->subscribe;
2229
2230
2231
2232
2233
2234 if (sctp_ulpevent_type_enabled(sp->subscribe, SCTP_SENDER_DRY_EVENT)) {
2235 struct sctp_ulpevent *event;
2236
2237 asoc = sctp_id2assoc(sk, 0);
2238 if (asoc && sctp_outq_is_empty(&asoc->outqueue)) {
2239 event = sctp_ulpevent_make_sender_dry_event(asoc,
2240 GFP_USER | __GFP_NOWARN);
2241 if (!event)
2242 return -ENOMEM;
2243
2244 asoc->stream.si->enqueue_event(&asoc->ulpq, event);
2245 }
2246 }
2247
2248 return 0;
2249}
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262static int sctp_setsockopt_autoclose(struct sock *sk, char __user *optval,
2263 unsigned int optlen)
2264{
2265 struct sctp_sock *sp = sctp_sk(sk);
2266 struct net *net = sock_net(sk);
2267
2268
2269 if (sctp_style(sk, TCP))
2270 return -EOPNOTSUPP;
2271 if (optlen != sizeof(int))
2272 return -EINVAL;
2273 if (copy_from_user(&sp->autoclose, optval, optlen))
2274 return -EFAULT;
2275
2276 if (sp->autoclose > net->sctp.max_autoclose)
2277 sp->autoclose = net->sctp.max_autoclose;
2278
2279 return 0;
2280}
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420static int sctp_apply_peer_addr_params(struct sctp_paddrparams *params,
2421 struct sctp_transport *trans,
2422 struct sctp_association *asoc,
2423 struct sctp_sock *sp,
2424 int hb_change,
2425 int pmtud_change,
2426 int sackdelay_change)
2427{
2428 int error;
2429
2430 if (params->spp_flags & SPP_HB_DEMAND && trans) {
2431 struct net *net = sock_net(trans->asoc->base.sk);
2432
2433 error = sctp_primitive_REQUESTHEARTBEAT(net, trans->asoc, trans);
2434 if (error)
2435 return error;
2436 }
2437
2438
2439
2440
2441
2442 if (params->spp_flags & SPP_HB_ENABLE) {
2443
2444
2445
2446
2447
2448 if (params->spp_flags & SPP_HB_TIME_IS_ZERO)
2449 params->spp_hbinterval = 0;
2450
2451 if (params->spp_hbinterval ||
2452 (params->spp_flags & SPP_HB_TIME_IS_ZERO)) {
2453 if (trans) {
2454 trans->hbinterval =
2455 msecs_to_jiffies(params->spp_hbinterval);
2456 } else if (asoc) {
2457 asoc->hbinterval =
2458 msecs_to_jiffies(params->spp_hbinterval);
2459 } else {
2460 sp->hbinterval = params->spp_hbinterval;
2461 }
2462 }
2463 }
2464
2465 if (hb_change) {
2466 if (trans) {
2467 trans->param_flags =
2468 (trans->param_flags & ~SPP_HB) | hb_change;
2469 } else if (asoc) {
2470 asoc->param_flags =
2471 (asoc->param_flags & ~SPP_HB) | hb_change;
2472 } else {
2473 sp->param_flags =
2474 (sp->param_flags & ~SPP_HB) | hb_change;
2475 }
2476 }
2477
2478
2479
2480
2481
2482
2483 if ((params->spp_flags & SPP_PMTUD_DISABLE) && params->spp_pathmtu) {
2484 if (trans) {
2485 trans->pathmtu = params->spp_pathmtu;
2486 sctp_assoc_sync_pmtu(asoc);
2487 } else if (asoc) {
2488 sctp_assoc_set_pmtu(asoc, params->spp_pathmtu);
2489 } else {
2490 sp->pathmtu = params->spp_pathmtu;
2491 }
2492 }
2493
2494 if (pmtud_change) {
2495 if (trans) {
2496 int update = (trans->param_flags & SPP_PMTUD_DISABLE) &&
2497 (params->spp_flags & SPP_PMTUD_ENABLE);
2498 trans->param_flags =
2499 (trans->param_flags & ~SPP_PMTUD) | pmtud_change;
2500 if (update) {
2501 sctp_transport_pmtu(trans, sctp_opt2sk(sp));
2502 sctp_assoc_sync_pmtu(asoc);
2503 }
2504 } else if (asoc) {
2505 asoc->param_flags =
2506 (asoc->param_flags & ~SPP_PMTUD) | pmtud_change;
2507 } else {
2508 sp->param_flags =
2509 (sp->param_flags & ~SPP_PMTUD) | pmtud_change;
2510 }
2511 }
2512
2513
2514
2515
2516
2517 if ((params->spp_flags & SPP_SACKDELAY_ENABLE) && params->spp_sackdelay) {
2518 if (trans) {
2519 trans->sackdelay =
2520 msecs_to_jiffies(params->spp_sackdelay);
2521 } else if (asoc) {
2522 asoc->sackdelay =
2523 msecs_to_jiffies(params->spp_sackdelay);
2524 } else {
2525 sp->sackdelay = params->spp_sackdelay;
2526 }
2527 }
2528
2529 if (sackdelay_change) {
2530 if (trans) {
2531 trans->param_flags =
2532 (trans->param_flags & ~SPP_SACKDELAY) |
2533 sackdelay_change;
2534 } else if (asoc) {
2535 asoc->param_flags =
2536 (asoc->param_flags & ~SPP_SACKDELAY) |
2537 sackdelay_change;
2538 } else {
2539 sp->param_flags =
2540 (sp->param_flags & ~SPP_SACKDELAY) |
2541 sackdelay_change;
2542 }
2543 }
2544
2545
2546
2547
2548 if (params->spp_pathmaxrxt) {
2549 if (trans) {
2550 trans->pathmaxrxt = params->spp_pathmaxrxt;
2551 } else if (asoc) {
2552 asoc->pathmaxrxt = params->spp_pathmaxrxt;
2553 } else {
2554 sp->pathmaxrxt = params->spp_pathmaxrxt;
2555 }
2556 }
2557
2558 if (params->spp_flags & SPP_IPV6_FLOWLABEL) {
2559 if (trans) {
2560 if (trans->ipaddr.sa.sa_family == AF_INET6) {
2561 trans->flowlabel = params->spp_ipv6_flowlabel &
2562 SCTP_FLOWLABEL_VAL_MASK;
2563 trans->flowlabel |= SCTP_FLOWLABEL_SET_MASK;
2564 }
2565 } else if (asoc) {
2566 struct sctp_transport *t;
2567
2568 list_for_each_entry(t, &asoc->peer.transport_addr_list,
2569 transports) {
2570 if (t->ipaddr.sa.sa_family != AF_INET6)
2571 continue;
2572 t->flowlabel = params->spp_ipv6_flowlabel &
2573 SCTP_FLOWLABEL_VAL_MASK;
2574 t->flowlabel |= SCTP_FLOWLABEL_SET_MASK;
2575 }
2576 asoc->flowlabel = params->spp_ipv6_flowlabel &
2577 SCTP_FLOWLABEL_VAL_MASK;
2578 asoc->flowlabel |= SCTP_FLOWLABEL_SET_MASK;
2579 } else if (sctp_opt2sk(sp)->sk_family == AF_INET6) {
2580 sp->flowlabel = params->spp_ipv6_flowlabel &
2581 SCTP_FLOWLABEL_VAL_MASK;
2582 sp->flowlabel |= SCTP_FLOWLABEL_SET_MASK;
2583 }
2584 }
2585
2586 if (params->spp_flags & SPP_DSCP) {
2587 if (trans) {
2588 trans->dscp = params->spp_dscp & SCTP_DSCP_VAL_MASK;
2589 trans->dscp |= SCTP_DSCP_SET_MASK;
2590 } else if (asoc) {
2591 struct sctp_transport *t;
2592
2593 list_for_each_entry(t, &asoc->peer.transport_addr_list,
2594 transports) {
2595 t->dscp = params->spp_dscp &
2596 SCTP_DSCP_VAL_MASK;
2597 t->dscp |= SCTP_DSCP_SET_MASK;
2598 }
2599 asoc->dscp = params->spp_dscp & SCTP_DSCP_VAL_MASK;
2600 asoc->dscp |= SCTP_DSCP_SET_MASK;
2601 } else {
2602 sp->dscp = params->spp_dscp & SCTP_DSCP_VAL_MASK;
2603 sp->dscp |= SCTP_DSCP_SET_MASK;
2604 }
2605 }
2606
2607 return 0;
2608}
2609
2610static int sctp_setsockopt_peer_addr_params(struct sock *sk,
2611 char __user *optval,
2612 unsigned int optlen)
2613{
2614 struct sctp_paddrparams params;
2615 struct sctp_transport *trans = NULL;
2616 struct sctp_association *asoc = NULL;
2617 struct sctp_sock *sp = sctp_sk(sk);
2618 int error;
2619 int hb_change, pmtud_change, sackdelay_change;
2620
2621 if (optlen == sizeof(params)) {
2622 if (copy_from_user(¶ms, optval, optlen))
2623 return -EFAULT;
2624 } else if (optlen == ALIGN(offsetof(struct sctp_paddrparams,
2625 spp_ipv6_flowlabel), 4)) {
2626 if (copy_from_user(¶ms, optval, optlen))
2627 return -EFAULT;
2628 if (params.spp_flags & (SPP_DSCP | SPP_IPV6_FLOWLABEL))
2629 return -EINVAL;
2630 } else {
2631 return -EINVAL;
2632 }
2633
2634
2635 hb_change = params.spp_flags & SPP_HB;
2636 pmtud_change = params.spp_flags & SPP_PMTUD;
2637 sackdelay_change = params.spp_flags & SPP_SACKDELAY;
2638
2639 if (hb_change == SPP_HB ||
2640 pmtud_change == SPP_PMTUD ||
2641 sackdelay_change == SPP_SACKDELAY ||
2642 params.spp_sackdelay > 500 ||
2643 (params.spp_pathmtu &&
2644 params.spp_pathmtu < SCTP_DEFAULT_MINSEGMENT))
2645 return -EINVAL;
2646
2647
2648
2649
2650 if (!sctp_is_any(sk, (union sctp_addr *)¶ms.spp_address)) {
2651 trans = sctp_addr_id2transport(sk, ¶ms.spp_address,
2652 params.spp_assoc_id);
2653 if (!trans)
2654 return -EINVAL;
2655 }
2656
2657
2658
2659
2660
2661 asoc = sctp_id2assoc(sk, params.spp_assoc_id);
2662 if (!asoc && params.spp_assoc_id != SCTP_FUTURE_ASSOC &&
2663 sctp_style(sk, UDP))
2664 return -EINVAL;
2665
2666
2667
2668
2669 if (params.spp_flags & SPP_HB_DEMAND && !trans && !asoc)
2670 return -EINVAL;
2671
2672
2673 error = sctp_apply_peer_addr_params(¶ms, trans, asoc, sp,
2674 hb_change, pmtud_change,
2675 sackdelay_change);
2676
2677 if (error)
2678 return error;
2679
2680
2681
2682
2683 if (!trans && asoc) {
2684 list_for_each_entry(trans, &asoc->peer.transport_addr_list,
2685 transports) {
2686 sctp_apply_peer_addr_params(¶ms, trans, asoc, sp,
2687 hb_change, pmtud_change,
2688 sackdelay_change);
2689 }
2690 }
2691
2692 return 0;
2693}
2694
2695static inline __u32 sctp_spp_sackdelay_enable(__u32 param_flags)
2696{
2697 return (param_flags & ~SPP_SACKDELAY) | SPP_SACKDELAY_ENABLE;
2698}
2699
2700static inline __u32 sctp_spp_sackdelay_disable(__u32 param_flags)
2701{
2702 return (param_flags & ~SPP_SACKDELAY) | SPP_SACKDELAY_DISABLE;
2703}
2704
2705static void sctp_apply_asoc_delayed_ack(struct sctp_sack_info *params,
2706 struct sctp_association *asoc)
2707{
2708 struct sctp_transport *trans;
2709
2710 if (params->sack_delay) {
2711 asoc->sackdelay = msecs_to_jiffies(params->sack_delay);
2712 asoc->param_flags =
2713 sctp_spp_sackdelay_enable(asoc->param_flags);
2714 }
2715 if (params->sack_freq == 1) {
2716 asoc->param_flags =
2717 sctp_spp_sackdelay_disable(asoc->param_flags);
2718 } else if (params->sack_freq > 1) {
2719 asoc->sackfreq = params->sack_freq;
2720 asoc->param_flags =
2721 sctp_spp_sackdelay_enable(asoc->param_flags);
2722 }
2723
2724 list_for_each_entry(trans, &asoc->peer.transport_addr_list,
2725 transports) {
2726 if (params->sack_delay) {
2727 trans->sackdelay = msecs_to_jiffies(params->sack_delay);
2728 trans->param_flags =
2729 sctp_spp_sackdelay_enable(trans->param_flags);
2730 }
2731 if (params->sack_freq == 1) {
2732 trans->param_flags =
2733 sctp_spp_sackdelay_disable(trans->param_flags);
2734 } else if (params->sack_freq > 1) {
2735 trans->sackfreq = params->sack_freq;
2736 trans->param_flags =
2737 sctp_spp_sackdelay_enable(trans->param_flags);
2738 }
2739 }
2740}
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778static int sctp_setsockopt_delayed_ack(struct sock *sk,
2779 char __user *optval, unsigned int optlen)
2780{
2781 struct sctp_sock *sp = sctp_sk(sk);
2782 struct sctp_association *asoc;
2783 struct sctp_sack_info params;
2784
2785 if (optlen == sizeof(struct sctp_sack_info)) {
2786 if (copy_from_user(¶ms, optval, optlen))
2787 return -EFAULT;
2788
2789 if (params.sack_delay == 0 && params.sack_freq == 0)
2790 return 0;
2791 } else if (optlen == sizeof(struct sctp_assoc_value)) {
2792 pr_warn_ratelimited(DEPRECATED
2793 "%s (pid %d) "
2794 "Use of struct sctp_assoc_value in delayed_ack socket option.\n"
2795 "Use struct sctp_sack_info instead\n",
2796 current->comm, task_pid_nr(current));
2797 if (copy_from_user(¶ms, optval, optlen))
2798 return -EFAULT;
2799
2800 if (params.sack_delay == 0)
2801 params.sack_freq = 1;
2802 else
2803 params.sack_freq = 0;
2804 } else
2805 return -EINVAL;
2806
2807
2808 if (params.sack_delay > 500)
2809 return -EINVAL;
2810
2811
2812
2813
2814
2815 asoc = sctp_id2assoc(sk, params.sack_assoc_id);
2816 if (!asoc && params.sack_assoc_id > SCTP_ALL_ASSOC &&
2817 sctp_style(sk, UDP))
2818 return -EINVAL;
2819
2820 if (asoc) {
2821 sctp_apply_asoc_delayed_ack(¶ms, asoc);
2822
2823 return 0;
2824 }
2825
2826 if (sctp_style(sk, TCP))
2827 params.sack_assoc_id = SCTP_FUTURE_ASSOC;
2828
2829 if (params.sack_assoc_id == SCTP_FUTURE_ASSOC ||
2830 params.sack_assoc_id == SCTP_ALL_ASSOC) {
2831 if (params.sack_delay) {
2832 sp->sackdelay = params.sack_delay;
2833 sp->param_flags =
2834 sctp_spp_sackdelay_enable(sp->param_flags);
2835 }
2836 if (params.sack_freq == 1) {
2837 sp->param_flags =
2838 sctp_spp_sackdelay_disable(sp->param_flags);
2839 } else if (params.sack_freq > 1) {
2840 sp->sackfreq = params.sack_freq;
2841 sp->param_flags =
2842 sctp_spp_sackdelay_enable(sp->param_flags);
2843 }
2844 }
2845
2846 if (params.sack_assoc_id == SCTP_CURRENT_ASSOC ||
2847 params.sack_assoc_id == SCTP_ALL_ASSOC)
2848 list_for_each_entry(asoc, &sp->ep->asocs, asocs)
2849 sctp_apply_asoc_delayed_ack(¶ms, asoc);
2850
2851 return 0;
2852}
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865static int sctp_setsockopt_initmsg(struct sock *sk, char __user *optval, unsigned int optlen)
2866{
2867 struct sctp_initmsg sinit;
2868 struct sctp_sock *sp = sctp_sk(sk);
2869
2870 if (optlen != sizeof(struct sctp_initmsg))
2871 return -EINVAL;
2872 if (copy_from_user(&sinit, optval, optlen))
2873 return -EFAULT;
2874
2875 if (sinit.sinit_num_ostreams)
2876 sp->initmsg.sinit_num_ostreams = sinit.sinit_num_ostreams;
2877 if (sinit.sinit_max_instreams)
2878 sp->initmsg.sinit_max_instreams = sinit.sinit_max_instreams;
2879 if (sinit.sinit_max_attempts)
2880 sp->initmsg.sinit_max_attempts = sinit.sinit_max_attempts;
2881 if (sinit.sinit_max_init_timeo)
2882 sp->initmsg.sinit_max_init_timeo = sinit.sinit_max_init_timeo;
2883
2884 return 0;
2885}
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901static int sctp_setsockopt_default_send_param(struct sock *sk,
2902 char __user *optval,
2903 unsigned int optlen)
2904{
2905 struct sctp_sock *sp = sctp_sk(sk);
2906 struct sctp_association *asoc;
2907 struct sctp_sndrcvinfo info;
2908
2909 if (optlen != sizeof(info))
2910 return -EINVAL;
2911 if (copy_from_user(&info, optval, optlen))
2912 return -EFAULT;
2913 if (info.sinfo_flags &
2914 ~(SCTP_UNORDERED | SCTP_ADDR_OVER |
2915 SCTP_ABORT | SCTP_EOF))
2916 return -EINVAL;
2917
2918 asoc = sctp_id2assoc(sk, info.sinfo_assoc_id);
2919 if (!asoc && info.sinfo_assoc_id > SCTP_ALL_ASSOC &&
2920 sctp_style(sk, UDP))
2921 return -EINVAL;
2922
2923 if (asoc) {
2924 asoc->default_stream = info.sinfo_stream;
2925 asoc->default_flags = info.sinfo_flags;
2926 asoc->default_ppid = info.sinfo_ppid;
2927 asoc->default_context = info.sinfo_context;
2928 asoc->default_timetolive = info.sinfo_timetolive;
2929
2930 return 0;
2931 }
2932
2933 if (sctp_style(sk, TCP))
2934 info.sinfo_assoc_id = SCTP_FUTURE_ASSOC;
2935
2936 if (info.sinfo_assoc_id == SCTP_FUTURE_ASSOC ||
2937 info.sinfo_assoc_id == SCTP_ALL_ASSOC) {
2938 sp->default_stream = info.sinfo_stream;
2939 sp->default_flags = info.sinfo_flags;
2940 sp->default_ppid = info.sinfo_ppid;
2941 sp->default_context = info.sinfo_context;
2942 sp->default_timetolive = info.sinfo_timetolive;
2943 }
2944
2945 if (info.sinfo_assoc_id == SCTP_CURRENT_ASSOC ||
2946 info.sinfo_assoc_id == SCTP_ALL_ASSOC) {
2947 list_for_each_entry(asoc, &sp->ep->asocs, asocs) {
2948 asoc->default_stream = info.sinfo_stream;
2949 asoc->default_flags = info.sinfo_flags;
2950 asoc->default_ppid = info.sinfo_ppid;
2951 asoc->default_context = info.sinfo_context;
2952 asoc->default_timetolive = info.sinfo_timetolive;
2953 }
2954 }
2955
2956 return 0;
2957}
2958
2959
2960
2961
2962static int sctp_setsockopt_default_sndinfo(struct sock *sk,
2963 char __user *optval,
2964 unsigned int optlen)
2965{
2966 struct sctp_sock *sp = sctp_sk(sk);
2967 struct sctp_association *asoc;
2968 struct sctp_sndinfo info;
2969
2970 if (optlen != sizeof(info))
2971 return -EINVAL;
2972 if (copy_from_user(&info, optval, optlen))
2973 return -EFAULT;
2974 if (info.snd_flags &
2975 ~(SCTP_UNORDERED | SCTP_ADDR_OVER |
2976 SCTP_ABORT | SCTP_EOF))
2977 return -EINVAL;
2978
2979 asoc = sctp_id2assoc(sk, info.snd_assoc_id);
2980 if (!asoc && info.snd_assoc_id > SCTP_ALL_ASSOC &&
2981 sctp_style(sk, UDP))
2982 return -EINVAL;
2983
2984 if (asoc) {
2985 asoc->default_stream = info.snd_sid;
2986 asoc->default_flags = info.snd_flags;
2987 asoc->default_ppid = info.snd_ppid;
2988 asoc->default_context = info.snd_context;
2989
2990 return 0;
2991 }
2992
2993 if (sctp_style(sk, TCP))
2994 info.snd_assoc_id = SCTP_FUTURE_ASSOC;
2995
2996 if (info.snd_assoc_id == SCTP_FUTURE_ASSOC ||
2997 info.snd_assoc_id == SCTP_ALL_ASSOC) {
2998 sp->default_stream = info.snd_sid;
2999 sp->default_flags = info.snd_flags;
3000 sp->default_ppid = info.snd_ppid;
3001 sp->default_context = info.snd_context;
3002 }
3003
3004 if (info.snd_assoc_id == SCTP_CURRENT_ASSOC ||
3005 info.snd_assoc_id == SCTP_ALL_ASSOC) {
3006 list_for_each_entry(asoc, &sp->ep->asocs, asocs) {
3007 asoc->default_stream = info.snd_sid;
3008 asoc->default_flags = info.snd_flags;
3009 asoc->default_ppid = info.snd_ppid;
3010 asoc->default_context = info.snd_context;
3011 }
3012 }
3013
3014 return 0;
3015}
3016
3017
3018
3019
3020
3021
3022
3023static int sctp_setsockopt_primary_addr(struct sock *sk, char __user *optval,
3024 unsigned int optlen)
3025{
3026 struct sctp_prim prim;
3027 struct sctp_transport *trans;
3028 struct sctp_af *af;
3029 int err;
3030
3031 if (optlen != sizeof(struct sctp_prim))
3032 return -EINVAL;
3033
3034 if (copy_from_user(&prim, optval, sizeof(struct sctp_prim)))
3035 return -EFAULT;
3036
3037
3038 af = sctp_get_af_specific(prim.ssp_addr.ss_family);
3039 if (!af)
3040 return -EINVAL;
3041
3042 err = security_sctp_bind_connect(sk, SCTP_PRIMARY_ADDR,
3043 (struct sockaddr *)&prim.ssp_addr,
3044 af->sockaddr_len);
3045 if (err)
3046 return err;
3047
3048 trans = sctp_addr_id2transport(sk, &prim.ssp_addr, prim.ssp_assoc_id);
3049 if (!trans)
3050 return -EINVAL;
3051
3052 sctp_assoc_set_primary(trans->asoc, trans);
3053
3054 return 0;
3055}
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065static int sctp_setsockopt_nodelay(struct sock *sk, char __user *optval,
3066 unsigned int optlen)
3067{
3068 int val;
3069
3070 if (optlen < sizeof(int))
3071 return -EINVAL;
3072 if (get_user(val, (int __user *)optval))
3073 return -EFAULT;
3074
3075 sctp_sk(sk)->nodelay = (val == 0) ? 0 : 1;
3076 return 0;
3077}
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091static int sctp_setsockopt_rtoinfo(struct sock *sk, char __user *optval, unsigned int optlen)
3092{
3093 struct sctp_rtoinfo rtoinfo;
3094 struct sctp_association *asoc;
3095 unsigned long rto_min, rto_max;
3096 struct sctp_sock *sp = sctp_sk(sk);
3097
3098 if (optlen != sizeof (struct sctp_rtoinfo))
3099 return -EINVAL;
3100
3101 if (copy_from_user(&rtoinfo, optval, optlen))
3102 return -EFAULT;
3103
3104 asoc = sctp_id2assoc(sk, rtoinfo.srto_assoc_id);
3105
3106
3107 if (!asoc && rtoinfo.srto_assoc_id != SCTP_FUTURE_ASSOC &&
3108 sctp_style(sk, UDP))
3109 return -EINVAL;
3110
3111 rto_max = rtoinfo.srto_max;
3112 rto_min = rtoinfo.srto_min;
3113
3114 if (rto_max)
3115 rto_max = asoc ? msecs_to_jiffies(rto_max) : rto_max;
3116 else
3117 rto_max = asoc ? asoc->rto_max : sp->rtoinfo.srto_max;
3118
3119 if (rto_min)
3120 rto_min = asoc ? msecs_to_jiffies(rto_min) : rto_min;
3121 else
3122 rto_min = asoc ? asoc->rto_min : sp->rtoinfo.srto_min;
3123
3124 if (rto_min > rto_max)
3125 return -EINVAL;
3126
3127 if (asoc) {
3128 if (rtoinfo.srto_initial != 0)
3129 asoc->rto_initial =
3130 msecs_to_jiffies(rtoinfo.srto_initial);
3131 asoc->rto_max = rto_max;
3132 asoc->rto_min = rto_min;
3133 } else {
3134
3135
3136
3137 if (rtoinfo.srto_initial != 0)
3138 sp->rtoinfo.srto_initial = rtoinfo.srto_initial;
3139 sp->rtoinfo.srto_max = rto_max;
3140 sp->rtoinfo.srto_min = rto_min;
3141 }
3142
3143 return 0;
3144}
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157static int sctp_setsockopt_associnfo(struct sock *sk, char __user *optval, unsigned int optlen)
3158{
3159
3160 struct sctp_assocparams assocparams;
3161 struct sctp_association *asoc;
3162
3163 if (optlen != sizeof(struct sctp_assocparams))
3164 return -EINVAL;
3165 if (copy_from_user(&assocparams, optval, optlen))
3166 return -EFAULT;
3167
3168 asoc = sctp_id2assoc(sk, assocparams.sasoc_assoc_id);
3169
3170 if (!asoc && assocparams.sasoc_assoc_id != SCTP_FUTURE_ASSOC &&
3171 sctp_style(sk, UDP))
3172 return -EINVAL;
3173
3174
3175 if (asoc) {
3176 if (assocparams.sasoc_asocmaxrxt != 0) {
3177 __u32 path_sum = 0;
3178 int paths = 0;
3179 struct sctp_transport *peer_addr;
3180
3181 list_for_each_entry(peer_addr, &asoc->peer.transport_addr_list,
3182 transports) {
3183 path_sum += peer_addr->pathmaxrxt;
3184 paths++;
3185 }
3186
3187
3188
3189
3190
3191
3192 if (paths > 1 &&
3193 assocparams.sasoc_asocmaxrxt > path_sum)
3194 return -EINVAL;
3195
3196 asoc->max_retrans = assocparams.sasoc_asocmaxrxt;
3197 }
3198
3199 if (assocparams.sasoc_cookie_life != 0)
3200 asoc->cookie_life = ms_to_ktime(assocparams.sasoc_cookie_life);
3201 } else {
3202
3203 struct sctp_sock *sp = sctp_sk(sk);
3204
3205 if (assocparams.sasoc_asocmaxrxt != 0)
3206 sp->assocparams.sasoc_asocmaxrxt =
3207 assocparams.sasoc_asocmaxrxt;
3208 if (assocparams.sasoc_cookie_life != 0)
3209 sp->assocparams.sasoc_cookie_life =
3210 assocparams.sasoc_cookie_life;
3211 }
3212 return 0;
3213}
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225static int sctp_setsockopt_mappedv4(struct sock *sk, char __user *optval, unsigned int optlen)
3226{
3227 int val;
3228 struct sctp_sock *sp = sctp_sk(sk);
3229
3230 if (optlen < sizeof(int))
3231 return -EINVAL;
3232 if (get_user(val, (int __user *)optval))
3233 return -EFAULT;
3234 if (val)
3235 sp->v4mapped = 1;
3236 else
3237 sp->v4mapped = 0;
3238
3239 return 0;
3240}
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269static int sctp_setsockopt_maxseg(struct sock *sk, char __user *optval, unsigned int optlen)
3270{
3271 struct sctp_sock *sp = sctp_sk(sk);
3272 struct sctp_assoc_value params;
3273 struct sctp_association *asoc;
3274 int val;
3275
3276 if (optlen == sizeof(int)) {
3277 pr_warn_ratelimited(DEPRECATED
3278 "%s (pid %d) "
3279 "Use of int in maxseg socket option.\n"
3280 "Use struct sctp_assoc_value instead\n",
3281 current->comm, task_pid_nr(current));
3282 if (copy_from_user(&val, optval, optlen))
3283 return -EFAULT;
3284 params.assoc_id = SCTP_FUTURE_ASSOC;
3285 } else if (optlen == sizeof(struct sctp_assoc_value)) {
3286 if (copy_from_user(¶ms, optval, optlen))
3287 return -EFAULT;
3288 val = params.assoc_value;
3289 } else {
3290 return -EINVAL;
3291 }
3292
3293 asoc = sctp_id2assoc(sk, params.assoc_id);
3294 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
3295 sctp_style(sk, UDP))
3296 return -EINVAL;
3297
3298 if (val) {
3299 int min_len, max_len;
3300 __u16 datasize = asoc ? sctp_datachk_len(&asoc->stream) :
3301 sizeof(struct sctp_data_chunk);
3302
3303 min_len = sctp_min_frag_point(sp, datasize);
3304 max_len = SCTP_MAX_CHUNK_LEN - datasize;
3305
3306 if (val < min_len || val > max_len)
3307 return -EINVAL;
3308 }
3309
3310 if (asoc) {
3311 asoc->user_frag = val;
3312 sctp_assoc_update_frag_point(asoc);
3313 } else {
3314 sp->user_frag = val;
3315 }
3316
3317 return 0;
3318}
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329static int sctp_setsockopt_peer_primary_addr(struct sock *sk, char __user *optval,
3330 unsigned int optlen)
3331{
3332 struct sctp_sock *sp;
3333 struct sctp_association *asoc = NULL;
3334 struct sctp_setpeerprim prim;
3335 struct sctp_chunk *chunk;
3336 struct sctp_af *af;
3337 int err;
3338
3339 sp = sctp_sk(sk);
3340
3341 if (!sp->ep->asconf_enable)
3342 return -EPERM;
3343
3344 if (optlen != sizeof(struct sctp_setpeerprim))
3345 return -EINVAL;
3346
3347 if (copy_from_user(&prim, optval, optlen))
3348 return -EFAULT;
3349
3350 asoc = sctp_id2assoc(sk, prim.sspp_assoc_id);
3351 if (!asoc)
3352 return -EINVAL;
3353
3354 if (!asoc->peer.asconf_capable)
3355 return -EPERM;
3356
3357 if (asoc->peer.addip_disabled_mask & SCTP_PARAM_SET_PRIMARY)
3358 return -EPERM;
3359
3360 if (!sctp_state(asoc, ESTABLISHED))
3361 return -ENOTCONN;
3362
3363 af = sctp_get_af_specific(prim.sspp_addr.ss_family);
3364 if (!af)
3365 return -EINVAL;
3366
3367 if (!af->addr_valid((union sctp_addr *)&prim.sspp_addr, sp, NULL))
3368 return -EADDRNOTAVAIL;
3369
3370 if (!sctp_assoc_lookup_laddr(asoc, (union sctp_addr *)&prim.sspp_addr))
3371 return -EADDRNOTAVAIL;
3372
3373
3374 err = security_sctp_bind_connect(sk, SCTP_SET_PEER_PRIMARY_ADDR,
3375 (struct sockaddr *)&prim.sspp_addr,
3376 af->sockaddr_len);
3377 if (err)
3378 return err;
3379
3380
3381 chunk = sctp_make_asconf_set_prim(asoc,
3382 (union sctp_addr *)&prim.sspp_addr);
3383 if (!chunk)
3384 return -ENOMEM;
3385
3386 err = sctp_send_asconf(asoc, chunk);
3387
3388 pr_debug("%s: we set peer primary addr primitively\n", __func__);
3389
3390 return err;
3391}
3392
3393static int sctp_setsockopt_adaptation_layer(struct sock *sk, char __user *optval,
3394 unsigned int optlen)
3395{
3396 struct sctp_setadaptation adaptation;
3397
3398 if (optlen != sizeof(struct sctp_setadaptation))
3399 return -EINVAL;
3400 if (copy_from_user(&adaptation, optval, optlen))
3401 return -EFAULT;
3402
3403 sctp_sk(sk)->adaptation_ind = adaptation.ssb_adaptation_ind;
3404
3405 return 0;
3406}
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422static int sctp_setsockopt_context(struct sock *sk, char __user *optval,
3423 unsigned int optlen)
3424{
3425 struct sctp_sock *sp = sctp_sk(sk);
3426 struct sctp_assoc_value params;
3427 struct sctp_association *asoc;
3428
3429 if (optlen != sizeof(struct sctp_assoc_value))
3430 return -EINVAL;
3431 if (copy_from_user(¶ms, optval, optlen))
3432 return -EFAULT;
3433
3434 asoc = sctp_id2assoc(sk, params.assoc_id);
3435 if (!asoc && params.assoc_id > SCTP_ALL_ASSOC &&
3436 sctp_style(sk, UDP))
3437 return -EINVAL;
3438
3439 if (asoc) {
3440 asoc->default_rcv_context = params.assoc_value;
3441
3442 return 0;
3443 }
3444
3445 if (sctp_style(sk, TCP))
3446 params.assoc_id = SCTP_FUTURE_ASSOC;
3447
3448 if (params.assoc_id == SCTP_FUTURE_ASSOC ||
3449 params.assoc_id == SCTP_ALL_ASSOC)
3450 sp->default_rcv_context = params.assoc_value;
3451
3452 if (params.assoc_id == SCTP_CURRENT_ASSOC ||
3453 params.assoc_id == SCTP_ALL_ASSOC)
3454 list_for_each_entry(asoc, &sp->ep->asocs, asocs)
3455 asoc->default_rcv_context = params.assoc_value;
3456
3457 return 0;
3458}
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484static int sctp_setsockopt_fragment_interleave(struct sock *sk,
3485 char __user *optval,
3486 unsigned int optlen)
3487{
3488 int val;
3489
3490 if (optlen != sizeof(int))
3491 return -EINVAL;
3492 if (get_user(val, (int __user *)optval))
3493 return -EFAULT;
3494
3495 sctp_sk(sk)->frag_interleave = !!val;
3496
3497 if (!sctp_sk(sk)->frag_interleave)
3498 sctp_sk(sk)->ep->intl_enable = 0;
3499
3500 return 0;
3501}
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520static int sctp_setsockopt_partial_delivery_point(struct sock *sk,
3521 char __user *optval,
3522 unsigned int optlen)
3523{
3524 u32 val;
3525
3526 if (optlen != sizeof(u32))
3527 return -EINVAL;
3528 if (get_user(val, (int __user *)optval))
3529 return -EFAULT;
3530
3531
3532
3533
3534 if (val > (sk->sk_rcvbuf >> 1))
3535 return -EINVAL;
3536
3537 sctp_sk(sk)->pd_point = val;
3538
3539 return 0;
3540}
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553static int sctp_setsockopt_maxburst(struct sock *sk,
3554 char __user *optval,
3555 unsigned int optlen)
3556{
3557 struct sctp_sock *sp = sctp_sk(sk);
3558 struct sctp_assoc_value params;
3559 struct sctp_association *asoc;
3560
3561 if (optlen == sizeof(int)) {
3562 pr_warn_ratelimited(DEPRECATED
3563 "%s (pid %d) "
3564 "Use of int in max_burst socket option deprecated.\n"
3565 "Use struct sctp_assoc_value instead\n",
3566 current->comm, task_pid_nr(current));
3567 if (copy_from_user(¶ms.assoc_value, optval, optlen))
3568 return -EFAULT;
3569 params.assoc_id = SCTP_FUTURE_ASSOC;
3570 } else if (optlen == sizeof(struct sctp_assoc_value)) {
3571 if (copy_from_user(¶ms, optval, optlen))
3572 return -EFAULT;
3573 } else
3574 return -EINVAL;
3575
3576 asoc = sctp_id2assoc(sk, params.assoc_id);
3577 if (!asoc && params.assoc_id > SCTP_ALL_ASSOC &&
3578 sctp_style(sk, UDP))
3579 return -EINVAL;
3580
3581 if (asoc) {
3582 asoc->max_burst = params.assoc_value;
3583
3584 return 0;
3585 }
3586
3587 if (sctp_style(sk, TCP))
3588 params.assoc_id = SCTP_FUTURE_ASSOC;
3589
3590 if (params.assoc_id == SCTP_FUTURE_ASSOC ||
3591 params.assoc_id == SCTP_ALL_ASSOC)
3592 sp->max_burst = params.assoc_value;
3593
3594 if (params.assoc_id == SCTP_CURRENT_ASSOC ||
3595 params.assoc_id == SCTP_ALL_ASSOC)
3596 list_for_each_entry(asoc, &sp->ep->asocs, asocs)
3597 asoc->max_burst = params.assoc_value;
3598
3599 return 0;
3600}
3601
3602
3603
3604
3605
3606
3607
3608
3609static int sctp_setsockopt_auth_chunk(struct sock *sk,
3610 char __user *optval,
3611 unsigned int optlen)
3612{
3613 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
3614 struct sctp_authchunk val;
3615
3616 if (!ep->auth_enable)
3617 return -EACCES;
3618
3619 if (optlen != sizeof(struct sctp_authchunk))
3620 return -EINVAL;
3621 if (copy_from_user(&val, optval, optlen))
3622 return -EFAULT;
3623
3624 switch (val.sauth_chunk) {
3625 case SCTP_CID_INIT:
3626 case SCTP_CID_INIT_ACK:
3627 case SCTP_CID_SHUTDOWN_COMPLETE:
3628 case SCTP_CID_AUTH:
3629 return -EINVAL;
3630 }
3631
3632
3633 return sctp_auth_ep_add_chunkid(ep, val.sauth_chunk);
3634}
3635
3636
3637
3638
3639
3640
3641
3642static int sctp_setsockopt_hmac_ident(struct sock *sk,
3643 char __user *optval,
3644 unsigned int optlen)
3645{
3646 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
3647 struct sctp_hmacalgo *hmacs;
3648 u32 idents;
3649 int err;
3650
3651 if (!ep->auth_enable)
3652 return -EACCES;
3653
3654 if (optlen < sizeof(struct sctp_hmacalgo))
3655 return -EINVAL;
3656 optlen = min_t(unsigned int, optlen, sizeof(struct sctp_hmacalgo) +
3657 SCTP_AUTH_NUM_HMACS * sizeof(u16));
3658
3659 hmacs = memdup_user(optval, optlen);
3660 if (IS_ERR(hmacs))
3661 return PTR_ERR(hmacs);
3662
3663 idents = hmacs->shmac_num_idents;
3664 if (idents == 0 || idents > SCTP_AUTH_NUM_HMACS ||
3665 (idents * sizeof(u16)) > (optlen - sizeof(struct sctp_hmacalgo))) {
3666 err = -EINVAL;
3667 goto out;
3668 }
3669
3670 err = sctp_auth_ep_set_hmacs(ep, hmacs);
3671out:
3672 kfree(hmacs);
3673 return err;
3674}
3675
3676
3677
3678
3679
3680
3681
3682static int sctp_setsockopt_auth_key(struct sock *sk,
3683 char __user *optval,
3684 unsigned int optlen)
3685{
3686 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
3687 struct sctp_authkey *authkey;
3688 struct sctp_association *asoc;
3689 int ret = -EINVAL;
3690
3691 if (optlen <= sizeof(struct sctp_authkey))
3692 return -EINVAL;
3693
3694
3695
3696 optlen = min_t(unsigned int, optlen, USHRT_MAX + sizeof(*authkey));
3697
3698 authkey = memdup_user(optval, optlen);
3699 if (IS_ERR(authkey))
3700 return PTR_ERR(authkey);
3701
3702 if (authkey->sca_keylength > optlen - sizeof(*authkey))
3703 goto out;
3704
3705 asoc = sctp_id2assoc(sk, authkey->sca_assoc_id);
3706 if (!asoc && authkey->sca_assoc_id > SCTP_ALL_ASSOC &&
3707 sctp_style(sk, UDP))
3708 goto out;
3709
3710 if (asoc) {
3711 ret = sctp_auth_set_key(ep, asoc, authkey);
3712 goto out;
3713 }
3714
3715 if (sctp_style(sk, TCP))
3716 authkey->sca_assoc_id = SCTP_FUTURE_ASSOC;
3717
3718 if (authkey->sca_assoc_id == SCTP_FUTURE_ASSOC ||
3719 authkey->sca_assoc_id == SCTP_ALL_ASSOC) {
3720 ret = sctp_auth_set_key(ep, asoc, authkey);
3721 if (ret)
3722 goto out;
3723 }
3724
3725 ret = 0;
3726
3727 if (authkey->sca_assoc_id == SCTP_CURRENT_ASSOC ||
3728 authkey->sca_assoc_id == SCTP_ALL_ASSOC) {
3729 list_for_each_entry(asoc, &ep->asocs, asocs) {
3730 int res = sctp_auth_set_key(ep, asoc, authkey);
3731
3732 if (res && !ret)
3733 ret = res;
3734 }
3735 }
3736
3737out:
3738 kzfree(authkey);
3739 return ret;
3740}
3741
3742
3743
3744
3745
3746
3747
3748static int sctp_setsockopt_active_key(struct sock *sk,
3749 char __user *optval,
3750 unsigned int optlen)
3751{
3752 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
3753 struct sctp_association *asoc;
3754 struct sctp_authkeyid val;
3755 int ret = 0;
3756
3757 if (optlen != sizeof(struct sctp_authkeyid))
3758 return -EINVAL;
3759 if (copy_from_user(&val, optval, optlen))
3760 return -EFAULT;
3761
3762 asoc = sctp_id2assoc(sk, val.scact_assoc_id);
3763 if (!asoc && val.scact_assoc_id > SCTP_ALL_ASSOC &&
3764 sctp_style(sk, UDP))
3765 return -EINVAL;
3766
3767 if (asoc)
3768 return sctp_auth_set_active_key(ep, asoc, val.scact_keynumber);
3769
3770 if (sctp_style(sk, TCP))
3771 val.scact_assoc_id = SCTP_FUTURE_ASSOC;
3772
3773 if (val.scact_assoc_id == SCTP_FUTURE_ASSOC ||
3774 val.scact_assoc_id == SCTP_ALL_ASSOC) {
3775 ret = sctp_auth_set_active_key(ep, asoc, val.scact_keynumber);
3776 if (ret)
3777 return ret;
3778 }
3779
3780 if (val.scact_assoc_id == SCTP_CURRENT_ASSOC ||
3781 val.scact_assoc_id == SCTP_ALL_ASSOC) {
3782 list_for_each_entry(asoc, &ep->asocs, asocs) {
3783 int res = sctp_auth_set_active_key(ep, asoc,
3784 val.scact_keynumber);
3785
3786 if (res && !ret)
3787 ret = res;
3788 }
3789 }
3790
3791 return ret;
3792}
3793
3794
3795
3796
3797
3798
3799static int sctp_setsockopt_del_key(struct sock *sk,
3800 char __user *optval,
3801 unsigned int optlen)
3802{
3803 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
3804 struct sctp_association *asoc;
3805 struct sctp_authkeyid val;
3806 int ret = 0;
3807
3808 if (optlen != sizeof(struct sctp_authkeyid))
3809 return -EINVAL;
3810 if (copy_from_user(&val, optval, optlen))
3811 return -EFAULT;
3812
3813 asoc = sctp_id2assoc(sk, val.scact_assoc_id);
3814 if (!asoc && val.scact_assoc_id > SCTP_ALL_ASSOC &&
3815 sctp_style(sk, UDP))
3816 return -EINVAL;
3817
3818 if (asoc)
3819 return sctp_auth_del_key_id(ep, asoc, val.scact_keynumber);
3820
3821 if (sctp_style(sk, TCP))
3822 val.scact_assoc_id = SCTP_FUTURE_ASSOC;
3823
3824 if (val.scact_assoc_id == SCTP_FUTURE_ASSOC ||
3825 val.scact_assoc_id == SCTP_ALL_ASSOC) {
3826 ret = sctp_auth_del_key_id(ep, asoc, val.scact_keynumber);
3827 if (ret)
3828 return ret;
3829 }
3830
3831 if (val.scact_assoc_id == SCTP_CURRENT_ASSOC ||
3832 val.scact_assoc_id == SCTP_ALL_ASSOC) {
3833 list_for_each_entry(asoc, &ep->asocs, asocs) {
3834 int res = sctp_auth_del_key_id(ep, asoc,
3835 val.scact_keynumber);
3836
3837 if (res && !ret)
3838 ret = res;
3839 }
3840 }
3841
3842 return ret;
3843}
3844
3845
3846
3847
3848
3849
3850static int sctp_setsockopt_deactivate_key(struct sock *sk, char __user *optval,
3851 unsigned int optlen)
3852{
3853 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
3854 struct sctp_association *asoc;
3855 struct sctp_authkeyid val;
3856 int ret = 0;
3857
3858 if (optlen != sizeof(struct sctp_authkeyid))
3859 return -EINVAL;
3860 if (copy_from_user(&val, optval, optlen))
3861 return -EFAULT;
3862
3863 asoc = sctp_id2assoc(sk, val.scact_assoc_id);
3864 if (!asoc && val.scact_assoc_id > SCTP_ALL_ASSOC &&
3865 sctp_style(sk, UDP))
3866 return -EINVAL;
3867
3868 if (asoc)
3869 return sctp_auth_deact_key_id(ep, asoc, val.scact_keynumber);
3870
3871 if (sctp_style(sk, TCP))
3872 val.scact_assoc_id = SCTP_FUTURE_ASSOC;
3873
3874 if (val.scact_assoc_id == SCTP_FUTURE_ASSOC ||
3875 val.scact_assoc_id == SCTP_ALL_ASSOC) {
3876 ret = sctp_auth_deact_key_id(ep, asoc, val.scact_keynumber);
3877 if (ret)
3878 return ret;
3879 }
3880
3881 if (val.scact_assoc_id == SCTP_CURRENT_ASSOC ||
3882 val.scact_assoc_id == SCTP_ALL_ASSOC) {
3883 list_for_each_entry(asoc, &ep->asocs, asocs) {
3884 int res = sctp_auth_deact_key_id(ep, asoc,
3885 val.scact_keynumber);
3886
3887 if (res && !ret)
3888 ret = res;
3889 }
3890 }
3891
3892 return ret;
3893}
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909static int sctp_setsockopt_auto_asconf(struct sock *sk, char __user *optval,
3910 unsigned int optlen)
3911{
3912 int val;
3913 struct sctp_sock *sp = sctp_sk(sk);
3914
3915 if (optlen < sizeof(int))
3916 return -EINVAL;
3917 if (get_user(val, (int __user *)optval))
3918 return -EFAULT;
3919 if (!sctp_is_ep_boundall(sk) && val)
3920 return -EINVAL;
3921 if ((val && sp->do_auto_asconf) || (!val && !sp->do_auto_asconf))
3922 return 0;
3923
3924 spin_lock_bh(&sock_net(sk)->sctp.addr_wq_lock);
3925 if (val == 0 && sp->do_auto_asconf) {
3926 list_del(&sp->auto_asconf_list);
3927 sp->do_auto_asconf = 0;
3928 } else if (val && !sp->do_auto_asconf) {
3929 list_add_tail(&sp->auto_asconf_list,
3930 &sock_net(sk)->sctp.auto_asconf_splist);
3931 sp->do_auto_asconf = 1;
3932 }
3933 spin_unlock_bh(&sock_net(sk)->sctp.addr_wq_lock);
3934 return 0;
3935}
3936
3937
3938
3939
3940
3941
3942
3943
3944static int sctp_setsockopt_paddr_thresholds(struct sock *sk,
3945 char __user *optval,
3946 unsigned int optlen)
3947{
3948 struct sctp_paddrthlds val;
3949 struct sctp_transport *trans;
3950 struct sctp_association *asoc;
3951
3952 if (optlen < sizeof(struct sctp_paddrthlds))
3953 return -EINVAL;
3954 if (copy_from_user(&val, (struct sctp_paddrthlds __user *)optval,
3955 sizeof(struct sctp_paddrthlds)))
3956 return -EFAULT;
3957
3958 if (!sctp_is_any(sk, (const union sctp_addr *)&val.spt_address)) {
3959 trans = sctp_addr_id2transport(sk, &val.spt_address,
3960 val.spt_assoc_id);
3961 if (!trans)
3962 return -ENOENT;
3963
3964 if (val.spt_pathmaxrxt)
3965 trans->pathmaxrxt = val.spt_pathmaxrxt;
3966 trans->pf_retrans = val.spt_pathpfthld;
3967
3968 return 0;
3969 }
3970
3971 asoc = sctp_id2assoc(sk, val.spt_assoc_id);
3972 if (!asoc && val.spt_assoc_id != SCTP_FUTURE_ASSOC &&
3973 sctp_style(sk, UDP))
3974 return -EINVAL;
3975
3976 if (asoc) {
3977 list_for_each_entry(trans, &asoc->peer.transport_addr_list,
3978 transports) {
3979 if (val.spt_pathmaxrxt)
3980 trans->pathmaxrxt = val.spt_pathmaxrxt;
3981 trans->pf_retrans = val.spt_pathpfthld;
3982 }
3983
3984 if (val.spt_pathmaxrxt)
3985 asoc->pathmaxrxt = val.spt_pathmaxrxt;
3986 asoc->pf_retrans = val.spt_pathpfthld;
3987 } else {
3988 struct sctp_sock *sp = sctp_sk(sk);
3989
3990 if (val.spt_pathmaxrxt)
3991 sp->pathmaxrxt = val.spt_pathmaxrxt;
3992 sp->pf_retrans = val.spt_pathpfthld;
3993 }
3994
3995 return 0;
3996}
3997
3998static int sctp_setsockopt_recvrcvinfo(struct sock *sk,
3999 char __user *optval,
4000 unsigned int optlen)
4001{
4002 int val;
4003
4004 if (optlen < sizeof(int))
4005 return -EINVAL;
4006 if (get_user(val, (int __user *) optval))
4007 return -EFAULT;
4008
4009 sctp_sk(sk)->recvrcvinfo = (val == 0) ? 0 : 1;
4010
4011 return 0;
4012}
4013
4014static int sctp_setsockopt_recvnxtinfo(struct sock *sk,
4015 char __user *optval,
4016 unsigned int optlen)
4017{
4018 int val;
4019
4020 if (optlen < sizeof(int))
4021 return -EINVAL;
4022 if (get_user(val, (int __user *) optval))
4023 return -EFAULT;
4024
4025 sctp_sk(sk)->recvnxtinfo = (val == 0) ? 0 : 1;
4026
4027 return 0;
4028}
4029
4030static int sctp_setsockopt_pr_supported(struct sock *sk,
4031 char __user *optval,
4032 unsigned int optlen)
4033{
4034 struct sctp_assoc_value params;
4035 struct sctp_association *asoc;
4036
4037 if (optlen != sizeof(params))
4038 return -EINVAL;
4039
4040 if (copy_from_user(¶ms, optval, optlen))
4041 return -EFAULT;
4042
4043 asoc = sctp_id2assoc(sk, params.assoc_id);
4044 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
4045 sctp_style(sk, UDP))
4046 return -EINVAL;
4047
4048 sctp_sk(sk)->ep->prsctp_enable = !!params.assoc_value;
4049
4050 return 0;
4051}
4052
4053static int sctp_setsockopt_default_prinfo(struct sock *sk,
4054 char __user *optval,
4055 unsigned int optlen)
4056{
4057 struct sctp_sock *sp = sctp_sk(sk);
4058 struct sctp_default_prinfo info;
4059 struct sctp_association *asoc;
4060 int retval = -EINVAL;
4061
4062 if (optlen != sizeof(info))
4063 goto out;
4064
4065 if (copy_from_user(&info, optval, sizeof(info))) {
4066 retval = -EFAULT;
4067 goto out;
4068 }
4069
4070 if (info.pr_policy & ~SCTP_PR_SCTP_MASK)
4071 goto out;
4072
4073 if (info.pr_policy == SCTP_PR_SCTP_NONE)
4074 info.pr_value = 0;
4075
4076 asoc = sctp_id2assoc(sk, info.pr_assoc_id);
4077 if (!asoc && info.pr_assoc_id > SCTP_ALL_ASSOC &&
4078 sctp_style(sk, UDP))
4079 goto out;
4080
4081 retval = 0;
4082
4083 if (asoc) {
4084 SCTP_PR_SET_POLICY(asoc->default_flags, info.pr_policy);
4085 asoc->default_timetolive = info.pr_value;
4086 goto out;
4087 }
4088
4089 if (sctp_style(sk, TCP))
4090 info.pr_assoc_id = SCTP_FUTURE_ASSOC;
4091
4092 if (info.pr_assoc_id == SCTP_FUTURE_ASSOC ||
4093 info.pr_assoc_id == SCTP_ALL_ASSOC) {
4094 SCTP_PR_SET_POLICY(sp->default_flags, info.pr_policy);
4095 sp->default_timetolive = info.pr_value;
4096 }
4097
4098 if (info.pr_assoc_id == SCTP_CURRENT_ASSOC ||
4099 info.pr_assoc_id == SCTP_ALL_ASSOC) {
4100 list_for_each_entry(asoc, &sp->ep->asocs, asocs) {
4101 SCTP_PR_SET_POLICY(asoc->default_flags, info.pr_policy);
4102 asoc->default_timetolive = info.pr_value;
4103 }
4104 }
4105
4106out:
4107 return retval;
4108}
4109
4110static int sctp_setsockopt_reconfig_supported(struct sock *sk,
4111 char __user *optval,
4112 unsigned int optlen)
4113{
4114 struct sctp_assoc_value params;
4115 struct sctp_association *asoc;
4116 int retval = -EINVAL;
4117
4118 if (optlen != sizeof(params))
4119 goto out;
4120
4121 if (copy_from_user(¶ms, optval, optlen)) {
4122 retval = -EFAULT;
4123 goto out;
4124 }
4125
4126 asoc = sctp_id2assoc(sk, params.assoc_id);
4127 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
4128 sctp_style(sk, UDP))
4129 goto out;
4130
4131 sctp_sk(sk)->ep->reconf_enable = !!params.assoc_value;
4132
4133 retval = 0;
4134
4135out:
4136 return retval;
4137}
4138
4139static int sctp_setsockopt_enable_strreset(struct sock *sk,
4140 char __user *optval,
4141 unsigned int optlen)
4142{
4143 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
4144 struct sctp_assoc_value params;
4145 struct sctp_association *asoc;
4146 int retval = -EINVAL;
4147
4148 if (optlen != sizeof(params))
4149 goto out;
4150
4151 if (copy_from_user(¶ms, optval, optlen)) {
4152 retval = -EFAULT;
4153 goto out;
4154 }
4155
4156 if (params.assoc_value & (~SCTP_ENABLE_STRRESET_MASK))
4157 goto out;
4158
4159 asoc = sctp_id2assoc(sk, params.assoc_id);
4160 if (!asoc && params.assoc_id > SCTP_ALL_ASSOC &&
4161 sctp_style(sk, UDP))
4162 goto out;
4163
4164 retval = 0;
4165
4166 if (asoc) {
4167 asoc->strreset_enable = params.assoc_value;
4168 goto out;
4169 }
4170
4171 if (sctp_style(sk, TCP))
4172 params.assoc_id = SCTP_FUTURE_ASSOC;
4173
4174 if (params.assoc_id == SCTP_FUTURE_ASSOC ||
4175 params.assoc_id == SCTP_ALL_ASSOC)
4176 ep->strreset_enable = params.assoc_value;
4177
4178 if (params.assoc_id == SCTP_CURRENT_ASSOC ||
4179 params.assoc_id == SCTP_ALL_ASSOC)
4180 list_for_each_entry(asoc, &ep->asocs, asocs)
4181 asoc->strreset_enable = params.assoc_value;
4182
4183out:
4184 return retval;
4185}
4186
4187static int sctp_setsockopt_reset_streams(struct sock *sk,
4188 char __user *optval,
4189 unsigned int optlen)
4190{
4191 struct sctp_reset_streams *params;
4192 struct sctp_association *asoc;
4193 int retval = -EINVAL;
4194
4195 if (optlen < sizeof(*params))
4196 return -EINVAL;
4197
4198 optlen = min_t(unsigned int, optlen, USHRT_MAX +
4199 sizeof(__u16) * sizeof(*params));
4200
4201 params = memdup_user(optval, optlen);
4202 if (IS_ERR(params))
4203 return PTR_ERR(params);
4204
4205 if (params->srs_number_streams * sizeof(__u16) >
4206 optlen - sizeof(*params))
4207 goto out;
4208
4209 asoc = sctp_id2assoc(sk, params->srs_assoc_id);
4210 if (!asoc)
4211 goto out;
4212
4213 retval = sctp_send_reset_streams(asoc, params);
4214
4215out:
4216 kfree(params);
4217 return retval;
4218}
4219
4220static int sctp_setsockopt_reset_assoc(struct sock *sk,
4221 char __user *optval,
4222 unsigned int optlen)
4223{
4224 struct sctp_association *asoc;
4225 sctp_assoc_t associd;
4226 int retval = -EINVAL;
4227
4228 if (optlen != sizeof(associd))
4229 goto out;
4230
4231 if (copy_from_user(&associd, optval, optlen)) {
4232 retval = -EFAULT;
4233 goto out;
4234 }
4235
4236 asoc = sctp_id2assoc(sk, associd);
4237 if (!asoc)
4238 goto out;
4239
4240 retval = sctp_send_reset_assoc(asoc);
4241
4242out:
4243 return retval;
4244}
4245
4246static int sctp_setsockopt_add_streams(struct sock *sk,
4247 char __user *optval,
4248 unsigned int optlen)
4249{
4250 struct sctp_association *asoc;
4251 struct sctp_add_streams params;
4252 int retval = -EINVAL;
4253
4254 if (optlen != sizeof(params))
4255 goto out;
4256
4257 if (copy_from_user(¶ms, optval, optlen)) {
4258 retval = -EFAULT;
4259 goto out;
4260 }
4261
4262 asoc = sctp_id2assoc(sk, params.sas_assoc_id);
4263 if (!asoc)
4264 goto out;
4265
4266 retval = sctp_send_add_streams(asoc, ¶ms);
4267
4268out:
4269 return retval;
4270}
4271
4272static int sctp_setsockopt_scheduler(struct sock *sk,
4273 char __user *optval,
4274 unsigned int optlen)
4275{
4276 struct sctp_sock *sp = sctp_sk(sk);
4277 struct sctp_association *asoc;
4278 struct sctp_assoc_value params;
4279 int retval = 0;
4280
4281 if (optlen < sizeof(params))
4282 return -EINVAL;
4283
4284 optlen = sizeof(params);
4285 if (copy_from_user(¶ms, optval, optlen))
4286 return -EFAULT;
4287
4288 if (params.assoc_value > SCTP_SS_MAX)
4289 return -EINVAL;
4290
4291 asoc = sctp_id2assoc(sk, params.assoc_id);
4292 if (!asoc && params.assoc_id > SCTP_ALL_ASSOC &&
4293 sctp_style(sk, UDP))
4294 return -EINVAL;
4295
4296 if (asoc)
4297 return sctp_sched_set_sched(asoc, params.assoc_value);
4298
4299 if (sctp_style(sk, TCP))
4300 params.assoc_id = SCTP_FUTURE_ASSOC;
4301
4302 if (params.assoc_id == SCTP_FUTURE_ASSOC ||
4303 params.assoc_id == SCTP_ALL_ASSOC)
4304 sp->default_ss = params.assoc_value;
4305
4306 if (params.assoc_id == SCTP_CURRENT_ASSOC ||
4307 params.assoc_id == SCTP_ALL_ASSOC) {
4308 list_for_each_entry(asoc, &sp->ep->asocs, asocs) {
4309 int ret = sctp_sched_set_sched(asoc,
4310 params.assoc_value);
4311
4312 if (ret && !retval)
4313 retval = ret;
4314 }
4315 }
4316
4317 return retval;
4318}
4319
4320static int sctp_setsockopt_scheduler_value(struct sock *sk,
4321 char __user *optval,
4322 unsigned int optlen)
4323{
4324 struct sctp_stream_value params;
4325 struct sctp_association *asoc;
4326 int retval = -EINVAL;
4327
4328 if (optlen < sizeof(params))
4329 goto out;
4330
4331 optlen = sizeof(params);
4332 if (copy_from_user(¶ms, optval, optlen)) {
4333 retval = -EFAULT;
4334 goto out;
4335 }
4336
4337 asoc = sctp_id2assoc(sk, params.assoc_id);
4338 if (!asoc && params.assoc_id != SCTP_CURRENT_ASSOC &&
4339 sctp_style(sk, UDP))
4340 goto out;
4341
4342 if (asoc) {
4343 retval = sctp_sched_set_value(asoc, params.stream_id,
4344 params.stream_value, GFP_KERNEL);
4345 goto out;
4346 }
4347
4348 retval = 0;
4349
4350 list_for_each_entry(asoc, &sctp_sk(sk)->ep->asocs, asocs) {
4351 int ret = sctp_sched_set_value(asoc, params.stream_id,
4352 params.stream_value, GFP_KERNEL);
4353 if (ret && !retval)
4354 retval = ret;
4355 }
4356
4357out:
4358 return retval;
4359}
4360
4361static int sctp_setsockopt_interleaving_supported(struct sock *sk,
4362 char __user *optval,
4363 unsigned int optlen)
4364{
4365 struct sctp_sock *sp = sctp_sk(sk);
4366 struct sctp_assoc_value params;
4367 struct sctp_association *asoc;
4368 int retval = -EINVAL;
4369
4370 if (optlen < sizeof(params))
4371 goto out;
4372
4373 optlen = sizeof(params);
4374 if (copy_from_user(¶ms, optval, optlen)) {
4375 retval = -EFAULT;
4376 goto out;
4377 }
4378
4379 asoc = sctp_id2assoc(sk, params.assoc_id);
4380 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
4381 sctp_style(sk, UDP))
4382 goto out;
4383
4384 if (!sock_net(sk)->sctp.intl_enable || !sp->frag_interleave) {
4385 retval = -EPERM;
4386 goto out;
4387 }
4388
4389 sp->ep->intl_enable = !!params.assoc_value;
4390
4391 retval = 0;
4392
4393out:
4394 return retval;
4395}
4396
4397static int sctp_setsockopt_reuse_port(struct sock *sk, char __user *optval,
4398 unsigned int optlen)
4399{
4400 int val;
4401
4402 if (!sctp_style(sk, TCP))
4403 return -EOPNOTSUPP;
4404
4405 if (sctp_sk(sk)->ep->base.bind_addr.port)
4406 return -EFAULT;
4407
4408 if (optlen < sizeof(int))
4409 return -EINVAL;
4410
4411 if (get_user(val, (int __user *)optval))
4412 return -EFAULT;
4413
4414 sctp_sk(sk)->reuse = !!val;
4415
4416 return 0;
4417}
4418
4419static int sctp_assoc_ulpevent_type_set(struct sctp_event *param,
4420 struct sctp_association *asoc)
4421{
4422 struct sctp_ulpevent *event;
4423
4424 sctp_ulpevent_type_set(&asoc->subscribe, param->se_type, param->se_on);
4425
4426 if (param->se_type == SCTP_SENDER_DRY_EVENT && param->se_on) {
4427 if (sctp_outq_is_empty(&asoc->outqueue)) {
4428 event = sctp_ulpevent_make_sender_dry_event(asoc,
4429 GFP_USER | __GFP_NOWARN);
4430 if (!event)
4431 return -ENOMEM;
4432
4433 asoc->stream.si->enqueue_event(&asoc->ulpq, event);
4434 }
4435 }
4436
4437 return 0;
4438}
4439
4440static int sctp_setsockopt_event(struct sock *sk, char __user *optval,
4441 unsigned int optlen)
4442{
4443 struct sctp_sock *sp = sctp_sk(sk);
4444 struct sctp_association *asoc;
4445 struct sctp_event param;
4446 int retval = 0;
4447
4448 if (optlen < sizeof(param))
4449 return -EINVAL;
4450
4451 optlen = sizeof(param);
4452 if (copy_from_user(¶m, optval, optlen))
4453 return -EFAULT;
4454
4455 if (param.se_type < SCTP_SN_TYPE_BASE ||
4456 param.se_type > SCTP_SN_TYPE_MAX)
4457 return -EINVAL;
4458
4459 asoc = sctp_id2assoc(sk, param.se_assoc_id);
4460 if (!asoc && param.se_assoc_id > SCTP_ALL_ASSOC &&
4461 sctp_style(sk, UDP))
4462 return -EINVAL;
4463
4464 if (asoc)
4465 return sctp_assoc_ulpevent_type_set(¶m, asoc);
4466
4467 if (sctp_style(sk, TCP))
4468 param.se_assoc_id = SCTP_FUTURE_ASSOC;
4469
4470 if (param.se_assoc_id == SCTP_FUTURE_ASSOC ||
4471 param.se_assoc_id == SCTP_ALL_ASSOC)
4472 sctp_ulpevent_type_set(&sp->subscribe,
4473 param.se_type, param.se_on);
4474
4475 if (param.se_assoc_id == SCTP_CURRENT_ASSOC ||
4476 param.se_assoc_id == SCTP_ALL_ASSOC) {
4477 list_for_each_entry(asoc, &sp->ep->asocs, asocs) {
4478 int ret = sctp_assoc_ulpevent_type_set(¶m, asoc);
4479
4480 if (ret && !retval)
4481 retval = ret;
4482 }
4483 }
4484
4485 return retval;
4486}
4487
4488static int sctp_setsockopt_asconf_supported(struct sock *sk,
4489 char __user *optval,
4490 unsigned int optlen)
4491{
4492 struct sctp_assoc_value params;
4493 struct sctp_association *asoc;
4494 struct sctp_endpoint *ep;
4495 int retval = -EINVAL;
4496
4497 if (optlen != sizeof(params))
4498 goto out;
4499
4500 if (copy_from_user(¶ms, optval, optlen)) {
4501 retval = -EFAULT;
4502 goto out;
4503 }
4504
4505 asoc = sctp_id2assoc(sk, params.assoc_id);
4506 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
4507 sctp_style(sk, UDP))
4508 goto out;
4509
4510 ep = sctp_sk(sk)->ep;
4511 ep->asconf_enable = !!params.assoc_value;
4512
4513 if (ep->asconf_enable && ep->auth_enable) {
4514 sctp_auth_ep_add_chunkid(ep, SCTP_CID_ASCONF);
4515 sctp_auth_ep_add_chunkid(ep, SCTP_CID_ASCONF_ACK);
4516 }
4517
4518 retval = 0;
4519
4520out:
4521 return retval;
4522}
4523
4524static int sctp_setsockopt_auth_supported(struct sock *sk,
4525 char __user *optval,
4526 unsigned int optlen)
4527{
4528 struct sctp_assoc_value params;
4529 struct sctp_association *asoc;
4530 struct sctp_endpoint *ep;
4531 int retval = -EINVAL;
4532
4533 if (optlen != sizeof(params))
4534 goto out;
4535
4536 if (copy_from_user(¶ms, optval, optlen)) {
4537 retval = -EFAULT;
4538 goto out;
4539 }
4540
4541 asoc = sctp_id2assoc(sk, params.assoc_id);
4542 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
4543 sctp_style(sk, UDP))
4544 goto out;
4545
4546 ep = sctp_sk(sk)->ep;
4547 if (params.assoc_value) {
4548 retval = sctp_auth_init(ep, GFP_KERNEL);
4549 if (retval)
4550 goto out;
4551 if (ep->asconf_enable) {
4552 sctp_auth_ep_add_chunkid(ep, SCTP_CID_ASCONF);
4553 sctp_auth_ep_add_chunkid(ep, SCTP_CID_ASCONF_ACK);
4554 }
4555 }
4556
4557 ep->auth_enable = !!params.assoc_value;
4558 retval = 0;
4559
4560out:
4561 return retval;
4562}
4563
4564static int sctp_setsockopt_ecn_supported(struct sock *sk,
4565 char __user *optval,
4566 unsigned int optlen)
4567{
4568 struct sctp_assoc_value params;
4569 struct sctp_association *asoc;
4570 int retval = -EINVAL;
4571
4572 if (optlen != sizeof(params))
4573 goto out;
4574
4575 if (copy_from_user(¶ms, optval, optlen)) {
4576 retval = -EFAULT;
4577 goto out;
4578 }
4579
4580 asoc = sctp_id2assoc(sk, params.assoc_id);
4581 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
4582 sctp_style(sk, UDP))
4583 goto out;
4584
4585 sctp_sk(sk)->ep->ecn_enable = !!params.assoc_value;
4586 retval = 0;
4587
4588out:
4589 return retval;
4590}
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611static int sctp_setsockopt(struct sock *sk, int level, int optname,
4612 char __user *optval, unsigned int optlen)
4613{
4614 int retval = 0;
4615
4616 pr_debug("%s: sk:%p, optname:%d\n", __func__, sk, optname);
4617
4618
4619
4620
4621
4622
4623
4624 if (level != SOL_SCTP) {
4625 struct sctp_af *af = sctp_sk(sk)->pf->af;
4626 retval = af->setsockopt(sk, level, optname, optval, optlen);
4627 goto out_nounlock;
4628 }
4629
4630 lock_sock(sk);
4631
4632 switch (optname) {
4633 case SCTP_SOCKOPT_BINDX_ADD:
4634
4635 retval = sctp_setsockopt_bindx(sk, (struct sockaddr __user *)optval,
4636 optlen, SCTP_BINDX_ADD_ADDR);
4637 break;
4638
4639 case SCTP_SOCKOPT_BINDX_REM:
4640
4641 retval = sctp_setsockopt_bindx(sk, (struct sockaddr __user *)optval,
4642 optlen, SCTP_BINDX_REM_ADDR);
4643 break;
4644
4645 case SCTP_SOCKOPT_CONNECTX_OLD:
4646
4647 retval = sctp_setsockopt_connectx_old(sk,
4648 (struct sockaddr __user *)optval,
4649 optlen);
4650 break;
4651
4652 case SCTP_SOCKOPT_CONNECTX:
4653
4654 retval = sctp_setsockopt_connectx(sk,
4655 (struct sockaddr __user *)optval,
4656 optlen);
4657 break;
4658
4659 case SCTP_DISABLE_FRAGMENTS:
4660 retval = sctp_setsockopt_disable_fragments(sk, optval, optlen);
4661 break;
4662
4663 case SCTP_EVENTS:
4664 retval = sctp_setsockopt_events(sk, optval, optlen);
4665 break;
4666
4667 case SCTP_AUTOCLOSE:
4668 retval = sctp_setsockopt_autoclose(sk, optval, optlen);
4669 break;
4670
4671 case SCTP_PEER_ADDR_PARAMS:
4672 retval = sctp_setsockopt_peer_addr_params(sk, optval, optlen);
4673 break;
4674
4675 case SCTP_DELAYED_SACK:
4676 retval = sctp_setsockopt_delayed_ack(sk, optval, optlen);
4677 break;
4678 case SCTP_PARTIAL_DELIVERY_POINT:
4679 retval = sctp_setsockopt_partial_delivery_point(sk, optval, optlen);
4680 break;
4681
4682 case SCTP_INITMSG:
4683 retval = sctp_setsockopt_initmsg(sk, optval, optlen);
4684 break;
4685 case SCTP_DEFAULT_SEND_PARAM:
4686 retval = sctp_setsockopt_default_send_param(sk, optval,
4687 optlen);
4688 break;
4689 case SCTP_DEFAULT_SNDINFO:
4690 retval = sctp_setsockopt_default_sndinfo(sk, optval, optlen);
4691 break;
4692 case SCTP_PRIMARY_ADDR:
4693 retval = sctp_setsockopt_primary_addr(sk, optval, optlen);
4694 break;
4695 case SCTP_SET_PEER_PRIMARY_ADDR:
4696 retval = sctp_setsockopt_peer_primary_addr(sk, optval, optlen);
4697 break;
4698 case SCTP_NODELAY:
4699 retval = sctp_setsockopt_nodelay(sk, optval, optlen);
4700 break;
4701 case SCTP_RTOINFO:
4702 retval = sctp_setsockopt_rtoinfo(sk, optval, optlen);
4703 break;
4704 case SCTP_ASSOCINFO:
4705 retval = sctp_setsockopt_associnfo(sk, optval, optlen);
4706 break;
4707 case SCTP_I_WANT_MAPPED_V4_ADDR:
4708 retval = sctp_setsockopt_mappedv4(sk, optval, optlen);
4709 break;
4710 case SCTP_MAXSEG:
4711 retval = sctp_setsockopt_maxseg(sk, optval, optlen);
4712 break;
4713 case SCTP_ADAPTATION_LAYER:
4714 retval = sctp_setsockopt_adaptation_layer(sk, optval, optlen);
4715 break;
4716 case SCTP_CONTEXT:
4717 retval = sctp_setsockopt_context(sk, optval, optlen);
4718 break;
4719 case SCTP_FRAGMENT_INTERLEAVE:
4720 retval = sctp_setsockopt_fragment_interleave(sk, optval, optlen);
4721 break;
4722 case SCTP_MAX_BURST:
4723 retval = sctp_setsockopt_maxburst(sk, optval, optlen);
4724 break;
4725 case SCTP_AUTH_CHUNK:
4726 retval = sctp_setsockopt_auth_chunk(sk, optval, optlen);
4727 break;
4728 case SCTP_HMAC_IDENT:
4729 retval = sctp_setsockopt_hmac_ident(sk, optval, optlen);
4730 break;
4731 case SCTP_AUTH_KEY:
4732 retval = sctp_setsockopt_auth_key(sk, optval, optlen);
4733 break;
4734 case SCTP_AUTH_ACTIVE_KEY:
4735 retval = sctp_setsockopt_active_key(sk, optval, optlen);
4736 break;
4737 case SCTP_AUTH_DELETE_KEY:
4738 retval = sctp_setsockopt_del_key(sk, optval, optlen);
4739 break;
4740 case SCTP_AUTH_DEACTIVATE_KEY:
4741 retval = sctp_setsockopt_deactivate_key(sk, optval, optlen);
4742 break;
4743 case SCTP_AUTO_ASCONF:
4744 retval = sctp_setsockopt_auto_asconf(sk, optval, optlen);
4745 break;
4746 case SCTP_PEER_ADDR_THLDS:
4747 retval = sctp_setsockopt_paddr_thresholds(sk, optval, optlen);
4748 break;
4749 case SCTP_RECVRCVINFO:
4750 retval = sctp_setsockopt_recvrcvinfo(sk, optval, optlen);
4751 break;
4752 case SCTP_RECVNXTINFO:
4753 retval = sctp_setsockopt_recvnxtinfo(sk, optval, optlen);
4754 break;
4755 case SCTP_PR_SUPPORTED:
4756 retval = sctp_setsockopt_pr_supported(sk, optval, optlen);
4757 break;
4758 case SCTP_DEFAULT_PRINFO:
4759 retval = sctp_setsockopt_default_prinfo(sk, optval, optlen);
4760 break;
4761 case SCTP_RECONFIG_SUPPORTED:
4762 retval = sctp_setsockopt_reconfig_supported(sk, optval, optlen);
4763 break;
4764 case SCTP_ENABLE_STREAM_RESET:
4765 retval = sctp_setsockopt_enable_strreset(sk, optval, optlen);
4766 break;
4767 case SCTP_RESET_STREAMS:
4768 retval = sctp_setsockopt_reset_streams(sk, optval, optlen);
4769 break;
4770 case SCTP_RESET_ASSOC:
4771 retval = sctp_setsockopt_reset_assoc(sk, optval, optlen);
4772 break;
4773 case SCTP_ADD_STREAMS:
4774 retval = sctp_setsockopt_add_streams(sk, optval, optlen);
4775 break;
4776 case SCTP_STREAM_SCHEDULER:
4777 retval = sctp_setsockopt_scheduler(sk, optval, optlen);
4778 break;
4779 case SCTP_STREAM_SCHEDULER_VALUE:
4780 retval = sctp_setsockopt_scheduler_value(sk, optval, optlen);
4781 break;
4782 case SCTP_INTERLEAVING_SUPPORTED:
4783 retval = sctp_setsockopt_interleaving_supported(sk, optval,
4784 optlen);
4785 break;
4786 case SCTP_REUSE_PORT:
4787 retval = sctp_setsockopt_reuse_port(sk, optval, optlen);
4788 break;
4789 case SCTP_EVENT:
4790 retval = sctp_setsockopt_event(sk, optval, optlen);
4791 break;
4792 case SCTP_ASCONF_SUPPORTED:
4793 retval = sctp_setsockopt_asconf_supported(sk, optval, optlen);
4794 break;
4795 case SCTP_AUTH_SUPPORTED:
4796 retval = sctp_setsockopt_auth_supported(sk, optval, optlen);
4797 break;
4798 case SCTP_ECN_SUPPORTED:
4799 retval = sctp_setsockopt_ecn_supported(sk, optval, optlen);
4800 break;
4801 default:
4802 retval = -ENOPROTOOPT;
4803 break;
4804 }
4805
4806 release_sock(sk);
4807
4808out_nounlock:
4809 return retval;
4810}
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828static int sctp_connect(struct sock *sk, struct sockaddr *addr,
4829 int addr_len, int flags)
4830{
4831 struct sctp_af *af;
4832 int err = -EINVAL;
4833
4834 lock_sock(sk);
4835 pr_debug("%s: sk:%p, sockaddr:%p, addr_len:%d\n", __func__, sk,
4836 addr, addr_len);
4837
4838
4839 af = sctp_get_af_specific(addr->sa_family);
4840 if (af && addr_len >= af->sockaddr_len)
4841 err = __sctp_connect(sk, addr, af->sockaddr_len, flags, NULL);
4842
4843 release_sock(sk);
4844 return err;
4845}
4846
4847int sctp_inet_connect(struct socket *sock, struct sockaddr *uaddr,
4848 int addr_len, int flags)
4849{
4850 if (addr_len < sizeof(uaddr->sa_family))
4851 return -EINVAL;
4852
4853 if (uaddr->sa_family == AF_UNSPEC)
4854 return -EOPNOTSUPP;
4855
4856 return sctp_connect(sock->sk, uaddr, addr_len, flags);
4857}
4858
4859
4860static int sctp_disconnect(struct sock *sk, int flags)
4861{
4862 return -EOPNOTSUPP;
4863}
4864
4865
4866
4867
4868
4869
4870
4871
4872static struct sock *sctp_accept(struct sock *sk, int flags, int *err, bool kern)
4873{
4874 struct sctp_sock *sp;
4875 struct sctp_endpoint *ep;
4876 struct sock *newsk = NULL;
4877 struct sctp_association *asoc;
4878 long timeo;
4879 int error = 0;
4880
4881 lock_sock(sk);
4882
4883 sp = sctp_sk(sk);
4884 ep = sp->ep;
4885
4886 if (!sctp_style(sk, TCP)) {
4887 error = -EOPNOTSUPP;
4888 goto out;
4889 }
4890
4891 if (!sctp_sstate(sk, LISTENING)) {
4892 error = -EINVAL;
4893 goto out;
4894 }
4895
4896 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
4897
4898 error = sctp_wait_for_accept(sk, timeo);
4899 if (error)
4900 goto out;
4901
4902
4903
4904
4905 asoc = list_entry(ep->asocs.next, struct sctp_association, asocs);
4906
4907 newsk = sp->pf->create_accept_sk(sk, asoc, kern);
4908 if (!newsk) {
4909 error = -ENOMEM;
4910 goto out;
4911 }
4912
4913
4914
4915
4916 error = sctp_sock_migrate(sk, newsk, asoc, SCTP_SOCKET_TCP);
4917 if (error) {
4918 sk_common_release(newsk);
4919 newsk = NULL;
4920 }
4921
4922out:
4923 release_sock(sk);
4924 *err = error;
4925 return newsk;
4926}
4927
4928
4929static int sctp_ioctl(struct sock *sk, int cmd, unsigned long arg)
4930{
4931 int rc = -ENOTCONN;
4932
4933 lock_sock(sk);
4934
4935
4936
4937
4938
4939 if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING))
4940 goto out;
4941
4942 switch (cmd) {
4943 case SIOCINQ: {
4944 struct sk_buff *skb;
4945 unsigned int amount = 0;
4946
4947 skb = skb_peek(&sk->sk_receive_queue);
4948 if (skb != NULL) {
4949
4950
4951
4952
4953 amount = skb->len;
4954 }
4955 rc = put_user(amount, (int __user *)arg);
4956 break;
4957 }
4958 default:
4959 rc = -ENOIOCTLCMD;
4960 break;
4961 }
4962out:
4963 release_sock(sk);
4964 return rc;
4965}
4966
4967
4968
4969
4970
4971static int sctp_init_sock(struct sock *sk)
4972{
4973 struct net *net = sock_net(sk);
4974 struct sctp_sock *sp;
4975
4976 pr_debug("%s: sk:%p\n", __func__, sk);
4977
4978 sp = sctp_sk(sk);
4979
4980
4981 switch (sk->sk_type) {
4982 case SOCK_SEQPACKET:
4983 sp->type = SCTP_SOCKET_UDP;
4984 break;
4985 case SOCK_STREAM:
4986 sp->type = SCTP_SOCKET_TCP;
4987 break;
4988 default:
4989 return -ESOCKTNOSUPPORT;
4990 }
4991
4992 sk->sk_gso_type = SKB_GSO_SCTP;
4993
4994
4995
4996
4997 sp->default_stream = 0;
4998 sp->default_ppid = 0;
4999 sp->default_flags = 0;
5000 sp->default_context = 0;
5001 sp->default_timetolive = 0;
5002
5003 sp->default_rcv_context = 0;
5004 sp->max_burst = net->sctp.max_burst;
5005
5006 sp->sctp_hmac_alg = net->sctp.sctp_hmac_alg;
5007
5008
5009
5010
5011
5012 sp->initmsg.sinit_num_ostreams = sctp_max_outstreams;
5013 sp->initmsg.sinit_max_instreams = sctp_max_instreams;
5014 sp->initmsg.sinit_max_attempts = net->sctp.max_retrans_init;
5015 sp->initmsg.sinit_max_init_timeo = net->sctp.rto_max;
5016
5017
5018
5019
5020 sp->rtoinfo.srto_initial = net->sctp.rto_initial;
5021 sp->rtoinfo.srto_max = net->sctp.rto_max;
5022 sp->rtoinfo.srto_min = net->sctp.rto_min;
5023
5024
5025
5026
5027 sp->assocparams.sasoc_asocmaxrxt = net->sctp.max_retrans_association;
5028 sp->assocparams.sasoc_number_peer_destinations = 0;
5029 sp->assocparams.sasoc_peer_rwnd = 0;
5030 sp->assocparams.sasoc_local_rwnd = 0;
5031 sp->assocparams.sasoc_cookie_life = net->sctp.valid_cookie_life;
5032
5033
5034
5035
5036 sp->subscribe = 0;
5037
5038
5039
5040
5041 sp->hbinterval = net->sctp.hb_interval;
5042 sp->pathmaxrxt = net->sctp.max_retrans_path;
5043 sp->pf_retrans = net->sctp.pf_retrans;
5044 sp->pathmtu = 0;
5045 sp->sackdelay = net->sctp.sack_timeout;
5046 sp->sackfreq = 2;
5047 sp->param_flags = SPP_HB_ENABLE |
5048 SPP_PMTUD_ENABLE |
5049 SPP_SACKDELAY_ENABLE;
5050 sp->default_ss = SCTP_SS_DEFAULT;
5051
5052
5053
5054
5055 sp->disable_fragments = 0;
5056
5057
5058 sp->nodelay = 0;
5059
5060 sp->recvrcvinfo = 0;
5061 sp->recvnxtinfo = 0;
5062
5063
5064 sp->v4mapped = 1;
5065
5066
5067
5068
5069
5070
5071 sp->autoclose = 0;
5072
5073
5074 sp->user_frag = 0;
5075
5076 sp->adaptation_ind = 0;
5077
5078 sp->pf = sctp_get_pf_specific(sk->sk_family);
5079
5080
5081 atomic_set(&sp->pd_mode, 0);
5082 skb_queue_head_init(&sp->pd_lobby);
5083 sp->frag_interleave = 0;
5084
5085
5086
5087
5088
5089 sp->ep = sctp_endpoint_new(sk, GFP_KERNEL);
5090 if (!sp->ep)
5091 return -ENOMEM;
5092
5093 sp->hmac = NULL;
5094
5095 sk->sk_destruct = sctp_destruct_sock;
5096
5097 SCTP_DBG_OBJCNT_INC(sock);
5098
5099 local_bh_disable();
5100 sk_sockets_allocated_inc(sk);
5101 sock_prot_inuse_add(net, sk->sk_prot, 1);
5102
5103
5104
5105
5106 if (net->sctp.default_auto_asconf) {
5107 spin_lock(&sock_net(sk)->sctp.addr_wq_lock);
5108 list_add_tail(&sp->auto_asconf_list,
5109 &net->sctp.auto_asconf_splist);
5110 sp->do_auto_asconf = 1;
5111 spin_unlock(&sock_net(sk)->sctp.addr_wq_lock);
5112 } else {
5113 sp->do_auto_asconf = 0;
5114 }
5115
5116 local_bh_enable();
5117
5118 return 0;
5119}
5120
5121
5122
5123
5124static void sctp_destroy_sock(struct sock *sk)
5125{
5126 struct sctp_sock *sp;
5127
5128 pr_debug("%s: sk:%p\n", __func__, sk);
5129
5130
5131 sp = sctp_sk(sk);
5132
5133
5134
5135 if (sp->ep == NULL)
5136 return;
5137
5138 if (sp->do_auto_asconf) {
5139 sp->do_auto_asconf = 0;
5140 list_del(&sp->auto_asconf_list);
5141 }
5142 sctp_endpoint_free(sp->ep);
5143 local_bh_disable();
5144 sk_sockets_allocated_dec(sk);
5145 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
5146 local_bh_enable();
5147}
5148
5149
5150static void sctp_destruct_sock(struct sock *sk)
5151{
5152 struct sctp_sock *sp = sctp_sk(sk);
5153
5154
5155 crypto_free_shash(sp->hmac);
5156
5157 inet_sock_destruct(sk);
5158}
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176static void sctp_shutdown(struct sock *sk, int how)
5177{
5178 struct net *net = sock_net(sk);
5179 struct sctp_endpoint *ep;
5180
5181 if (!sctp_style(sk, TCP))
5182 return;
5183
5184 ep = sctp_sk(sk)->ep;
5185 if (how & SEND_SHUTDOWN && !list_empty(&ep->asocs)) {
5186 struct sctp_association *asoc;
5187
5188 inet_sk_set_state(sk, SCTP_SS_CLOSING);
5189 asoc = list_entry(ep->asocs.next,
5190 struct sctp_association, asocs);
5191 sctp_primitive_SHUTDOWN(net, asoc, NULL);
5192 }
5193}
5194
5195int sctp_get_sctp_info(struct sock *sk, struct sctp_association *asoc,
5196 struct sctp_info *info)
5197{
5198 struct sctp_transport *prim;
5199 struct list_head *pos;
5200 int mask;
5201
5202 memset(info, 0, sizeof(*info));
5203 if (!asoc) {
5204 struct sctp_sock *sp = sctp_sk(sk);
5205
5206 info->sctpi_s_autoclose = sp->autoclose;
5207 info->sctpi_s_adaptation_ind = sp->adaptation_ind;
5208 info->sctpi_s_pd_point = sp->pd_point;
5209 info->sctpi_s_nodelay = sp->nodelay;
5210 info->sctpi_s_disable_fragments = sp->disable_fragments;
5211 info->sctpi_s_v4mapped = sp->v4mapped;
5212 info->sctpi_s_frag_interleave = sp->frag_interleave;
5213 info->sctpi_s_type = sp->type;
5214
5215 return 0;
5216 }
5217
5218 info->sctpi_tag = asoc->c.my_vtag;
5219 info->sctpi_state = asoc->state;
5220 info->sctpi_rwnd = asoc->a_rwnd;
5221 info->sctpi_unackdata = asoc->unack_data;
5222 info->sctpi_penddata = sctp_tsnmap_pending(&asoc->peer.tsn_map);
5223 info->sctpi_instrms = asoc->stream.incnt;
5224 info->sctpi_outstrms = asoc->stream.outcnt;
5225 list_for_each(pos, &asoc->base.inqueue.in_chunk_list)
5226 info->sctpi_inqueue++;
5227 list_for_each(pos, &asoc->outqueue.out_chunk_list)
5228 info->sctpi_outqueue++;
5229 info->sctpi_overall_error = asoc->overall_error_count;
5230 info->sctpi_max_burst = asoc->max_burst;
5231 info->sctpi_maxseg = asoc->frag_point;
5232 info->sctpi_peer_rwnd = asoc->peer.rwnd;
5233 info->sctpi_peer_tag = asoc->c.peer_vtag;
5234
5235 mask = asoc->peer.ecn_capable << 1;
5236 mask = (mask | asoc->peer.ipv4_address) << 1;
5237 mask = (mask | asoc->peer.ipv6_address) << 1;
5238 mask = (mask | asoc->peer.hostname_address) << 1;
5239 mask = (mask | asoc->peer.asconf_capable) << 1;
5240 mask = (mask | asoc->peer.prsctp_capable) << 1;
5241 mask = (mask | asoc->peer.auth_capable);
5242 info->sctpi_peer_capable = mask;
5243 mask = asoc->peer.sack_needed << 1;
5244 mask = (mask | asoc->peer.sack_generation) << 1;
5245 mask = (mask | asoc->peer.zero_window_announced);
5246 info->sctpi_peer_sack = mask;
5247
5248 info->sctpi_isacks = asoc->stats.isacks;
5249 info->sctpi_osacks = asoc->stats.osacks;
5250 info->sctpi_opackets = asoc->stats.opackets;
5251 info->sctpi_ipackets = asoc->stats.ipackets;
5252 info->sctpi_rtxchunks = asoc->stats.rtxchunks;
5253 info->sctpi_outofseqtsns = asoc->stats.outofseqtsns;
5254 info->sctpi_idupchunks = asoc->stats.idupchunks;
5255 info->sctpi_gapcnt = asoc->stats.gapcnt;
5256 info->sctpi_ouodchunks = asoc->stats.ouodchunks;
5257 info->sctpi_iuodchunks = asoc->stats.iuodchunks;
5258 info->sctpi_oodchunks = asoc->stats.oodchunks;
5259 info->sctpi_iodchunks = asoc->stats.iodchunks;
5260 info->sctpi_octrlchunks = asoc->stats.octrlchunks;
5261 info->sctpi_ictrlchunks = asoc->stats.ictrlchunks;
5262
5263 prim = asoc->peer.primary_path;
5264 memcpy(&info->sctpi_p_address, &prim->ipaddr, sizeof(prim->ipaddr));
5265 info->sctpi_p_state = prim->state;
5266 info->sctpi_p_cwnd = prim->cwnd;
5267 info->sctpi_p_srtt = prim->srtt;
5268 info->sctpi_p_rto = jiffies_to_msecs(prim->rto);
5269 info->sctpi_p_hbinterval = prim->hbinterval;
5270 info->sctpi_p_pathmaxrxt = prim->pathmaxrxt;
5271 info->sctpi_p_sackdelay = jiffies_to_msecs(prim->sackdelay);
5272 info->sctpi_p_ssthresh = prim->ssthresh;
5273 info->sctpi_p_partial_bytes_acked = prim->partial_bytes_acked;
5274 info->sctpi_p_flight_size = prim->flight_size;
5275 info->sctpi_p_error = prim->error_count;
5276
5277 return 0;
5278}
5279EXPORT_SYMBOL_GPL(sctp_get_sctp_info);
5280
5281
5282void sctp_transport_walk_start(struct rhashtable_iter *iter)
5283{
5284 rhltable_walk_enter(&sctp_transport_hashtable, iter);
5285
5286 rhashtable_walk_start(iter);
5287}
5288
5289void sctp_transport_walk_stop(struct rhashtable_iter *iter)
5290{
5291 rhashtable_walk_stop(iter);
5292 rhashtable_walk_exit(iter);
5293}
5294
5295struct sctp_transport *sctp_transport_get_next(struct net *net,
5296 struct rhashtable_iter *iter)
5297{
5298 struct sctp_transport *t;
5299
5300 t = rhashtable_walk_next(iter);
5301 for (; t; t = rhashtable_walk_next(iter)) {
5302 if (IS_ERR(t)) {
5303 if (PTR_ERR(t) == -EAGAIN)
5304 continue;
5305 break;
5306 }
5307
5308 if (!sctp_transport_hold(t))
5309 continue;
5310
5311 if (net_eq(sock_net(t->asoc->base.sk), net) &&
5312 t->asoc->peer.primary_path == t)
5313 break;
5314
5315 sctp_transport_put(t);
5316 }
5317
5318 return t;
5319}
5320
5321struct sctp_transport *sctp_transport_get_idx(struct net *net,
5322 struct rhashtable_iter *iter,
5323 int pos)
5324{
5325 struct sctp_transport *t;
5326
5327 if (!pos)
5328 return SEQ_START_TOKEN;
5329
5330 while ((t = sctp_transport_get_next(net, iter)) && !IS_ERR(t)) {
5331 if (!--pos)
5332 break;
5333 sctp_transport_put(t);
5334 }
5335
5336 return t;
5337}
5338
5339int sctp_for_each_endpoint(int (*cb)(struct sctp_endpoint *, void *),
5340 void *p) {
5341 int err = 0;
5342 int hash = 0;
5343 struct sctp_ep_common *epb;
5344 struct sctp_hashbucket *head;
5345
5346 for (head = sctp_ep_hashtable; hash < sctp_ep_hashsize;
5347 hash++, head++) {
5348 read_lock_bh(&head->lock);
5349 sctp_for_each_hentry(epb, &head->chain) {
5350 err = cb(sctp_ep(epb), p);
5351 if (err)
5352 break;
5353 }
5354 read_unlock_bh(&head->lock);
5355 }
5356
5357 return err;
5358}
5359EXPORT_SYMBOL_GPL(sctp_for_each_endpoint);
5360
5361int sctp_transport_lookup_process(int (*cb)(struct sctp_transport *, void *),
5362 struct net *net,
5363 const union sctp_addr *laddr,
5364 const union sctp_addr *paddr, void *p)
5365{
5366 struct sctp_transport *transport;
5367 int err;
5368
5369 rcu_read_lock();
5370 transport = sctp_addrs_lookup_transport(net, laddr, paddr);
5371 rcu_read_unlock();
5372 if (!transport)
5373 return -ENOENT;
5374
5375 err = cb(transport, p);
5376 sctp_transport_put(transport);
5377
5378 return err;
5379}
5380EXPORT_SYMBOL_GPL(sctp_transport_lookup_process);
5381
5382int sctp_for_each_transport(int (*cb)(struct sctp_transport *, void *),
5383 int (*cb_done)(struct sctp_transport *, void *),
5384 struct net *net, int *pos, void *p) {
5385 struct rhashtable_iter hti;
5386 struct sctp_transport *tsp;
5387 int ret;
5388
5389again:
5390 ret = 0;
5391 sctp_transport_walk_start(&hti);
5392
5393 tsp = sctp_transport_get_idx(net, &hti, *pos + 1);
5394 for (; !IS_ERR_OR_NULL(tsp); tsp = sctp_transport_get_next(net, &hti)) {
5395 ret = cb(tsp, p);
5396 if (ret)
5397 break;
5398 (*pos)++;
5399 sctp_transport_put(tsp);
5400 }
5401 sctp_transport_walk_stop(&hti);
5402
5403 if (ret) {
5404 if (cb_done && !cb_done(tsp, p)) {
5405 (*pos)++;
5406 sctp_transport_put(tsp);
5407 goto again;
5408 }
5409 sctp_transport_put(tsp);
5410 }
5411
5412 return ret;
5413}
5414EXPORT_SYMBOL_GPL(sctp_for_each_transport);
5415
5416
5417
5418
5419
5420
5421
5422
5423static int sctp_getsockopt_sctp_status(struct sock *sk, int len,
5424 char __user *optval,
5425 int __user *optlen)
5426{
5427 struct sctp_status status;
5428 struct sctp_association *asoc = NULL;
5429 struct sctp_transport *transport;
5430 sctp_assoc_t associd;
5431 int retval = 0;
5432
5433 if (len < sizeof(status)) {
5434 retval = -EINVAL;
5435 goto out;
5436 }
5437
5438 len = sizeof(status);
5439 if (copy_from_user(&status, optval, len)) {
5440 retval = -EFAULT;
5441 goto out;
5442 }
5443
5444 associd = status.sstat_assoc_id;
5445 asoc = sctp_id2assoc(sk, associd);
5446 if (!asoc) {
5447 retval = -EINVAL;
5448 goto out;
5449 }
5450
5451 transport = asoc->peer.primary_path;
5452
5453 status.sstat_assoc_id = sctp_assoc2id(asoc);
5454 status.sstat_state = sctp_assoc_to_state(asoc);
5455 status.sstat_rwnd = asoc->peer.rwnd;
5456 status.sstat_unackdata = asoc->unack_data;
5457
5458 status.sstat_penddata = sctp_tsnmap_pending(&asoc->peer.tsn_map);
5459 status.sstat_instrms = asoc->stream.incnt;
5460 status.sstat_outstrms = asoc->stream.outcnt;
5461 status.sstat_fragmentation_point = asoc->frag_point;
5462 status.sstat_primary.spinfo_assoc_id = sctp_assoc2id(transport->asoc);
5463 memcpy(&status.sstat_primary.spinfo_address, &transport->ipaddr,
5464 transport->af_specific->sockaddr_len);
5465
5466 sctp_get_pf_specific(sk->sk_family)->addr_to_user(sctp_sk(sk),
5467 (union sctp_addr *)&status.sstat_primary.spinfo_address);
5468 status.sstat_primary.spinfo_state = transport->state;
5469 status.sstat_primary.spinfo_cwnd = transport->cwnd;
5470 status.sstat_primary.spinfo_srtt = transport->srtt;
5471 status.sstat_primary.spinfo_rto = jiffies_to_msecs(transport->rto);
5472 status.sstat_primary.spinfo_mtu = transport->pathmtu;
5473
5474 if (status.sstat_primary.spinfo_state == SCTP_UNKNOWN)
5475 status.sstat_primary.spinfo_state = SCTP_ACTIVE;
5476
5477 if (put_user(len, optlen)) {
5478 retval = -EFAULT;
5479 goto out;
5480 }
5481
5482 pr_debug("%s: len:%d, state:%d, rwnd:%d, assoc_id:%d\n",
5483 __func__, len, status.sstat_state, status.sstat_rwnd,
5484 status.sstat_assoc_id);
5485
5486 if (copy_to_user(optval, &status, len)) {
5487 retval = -EFAULT;
5488 goto out;
5489 }
5490
5491out:
5492 return retval;
5493}
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503static int sctp_getsockopt_peer_addr_info(struct sock *sk, int len,
5504 char __user *optval,
5505 int __user *optlen)
5506{
5507 struct sctp_paddrinfo pinfo;
5508 struct sctp_transport *transport;
5509 int retval = 0;
5510
5511 if (len < sizeof(pinfo)) {
5512 retval = -EINVAL;
5513 goto out;
5514 }
5515
5516 len = sizeof(pinfo);
5517 if (copy_from_user(&pinfo, optval, len)) {
5518 retval = -EFAULT;
5519 goto out;
5520 }
5521
5522 transport = sctp_addr_id2transport(sk, &pinfo.spinfo_address,
5523 pinfo.spinfo_assoc_id);
5524 if (!transport)
5525 return -EINVAL;
5526
5527 pinfo.spinfo_assoc_id = sctp_assoc2id(transport->asoc);
5528 pinfo.spinfo_state = transport->state;
5529 pinfo.spinfo_cwnd = transport->cwnd;
5530 pinfo.spinfo_srtt = transport->srtt;
5531 pinfo.spinfo_rto = jiffies_to_msecs(transport->rto);
5532 pinfo.spinfo_mtu = transport->pathmtu;
5533
5534 if (pinfo.spinfo_state == SCTP_UNKNOWN)
5535 pinfo.spinfo_state = SCTP_ACTIVE;
5536
5537 if (put_user(len, optlen)) {
5538 retval = -EFAULT;
5539 goto out;
5540 }
5541
5542 if (copy_to_user(optval, &pinfo, len)) {
5543 retval = -EFAULT;
5544 goto out;
5545 }
5546
5547out:
5548 return retval;
5549}
5550
5551
5552
5553
5554
5555
5556
5557
5558static int sctp_getsockopt_disable_fragments(struct sock *sk, int len,
5559 char __user *optval, int __user *optlen)
5560{
5561 int val;
5562
5563 if (len < sizeof(int))
5564 return -EINVAL;
5565
5566 len = sizeof(int);
5567 val = (sctp_sk(sk)->disable_fragments == 1);
5568 if (put_user(len, optlen))
5569 return -EFAULT;
5570 if (copy_to_user(optval, &val, len))
5571 return -EFAULT;
5572 return 0;
5573}
5574
5575
5576
5577
5578
5579
5580static int sctp_getsockopt_events(struct sock *sk, int len, char __user *optval,
5581 int __user *optlen)
5582{
5583 struct sctp_event_subscribe subscribe;
5584 __u8 *sn_type = (__u8 *)&subscribe;
5585 int i;
5586
5587 if (len == 0)
5588 return -EINVAL;
5589 if (len > sizeof(struct sctp_event_subscribe))
5590 len = sizeof(struct sctp_event_subscribe);
5591 if (put_user(len, optlen))
5592 return -EFAULT;
5593
5594 for (i = 0; i < len; i++)
5595 sn_type[i] = sctp_ulpevent_type_enabled(sctp_sk(sk)->subscribe,
5596 SCTP_SN_TYPE_BASE + i);
5597
5598 if (copy_to_user(optval, &subscribe, len))
5599 return -EFAULT;
5600
5601 return 0;
5602}
5603
5604
5605
5606
5607
5608
5609
5610
5611
5612
5613
5614
5615static int sctp_getsockopt_autoclose(struct sock *sk, int len, char __user *optval, int __user *optlen)
5616{
5617
5618 if (sctp_style(sk, TCP))
5619 return -EOPNOTSUPP;
5620 if (len < sizeof(int))
5621 return -EINVAL;
5622 len = sizeof(int);
5623 if (put_user(len, optlen))
5624 return -EFAULT;
5625 if (put_user(sctp_sk(sk)->autoclose, (int __user *)optval))
5626 return -EFAULT;
5627 return 0;
5628}
5629
5630
5631int sctp_do_peeloff(struct sock *sk, sctp_assoc_t id, struct socket **sockp)
5632{
5633 struct sctp_association *asoc = sctp_id2assoc(sk, id);
5634 struct sctp_sock *sp = sctp_sk(sk);
5635 struct socket *sock;
5636 int err = 0;
5637
5638
5639 if (!net_eq(current->nsproxy->net_ns, sock_net(sk)))
5640 return -EINVAL;
5641
5642 if (!asoc)
5643 return -EINVAL;
5644
5645
5646
5647
5648 if (!sctp_style(sk, UDP))
5649 return -EINVAL;
5650
5651
5652 err = sock_create(sk->sk_family, SOCK_SEQPACKET, IPPROTO_SCTP, &sock);
5653 if (err < 0)
5654 return err;
5655
5656 sctp_copy_sock(sock->sk, sk, asoc);
5657
5658
5659
5660
5661
5662 sp->pf->to_sk_daddr(&asoc->peer.primary_addr, sk);
5663 sp->pf->copy_ip_options(sk, sock->sk);
5664
5665
5666
5667
5668 err = sctp_sock_migrate(sk, sock->sk, asoc,
5669 SCTP_SOCKET_UDP_HIGH_BANDWIDTH);
5670 if (err) {
5671 sock_release(sock);
5672 sock = NULL;
5673 }
5674
5675 *sockp = sock;
5676
5677 return err;
5678}
5679EXPORT_SYMBOL(sctp_do_peeloff);
5680
5681static int sctp_getsockopt_peeloff_common(struct sock *sk, sctp_peeloff_arg_t *peeloff,
5682 struct file **newfile, unsigned flags)
5683{
5684 struct socket *newsock;
5685 int retval;
5686
5687 retval = sctp_do_peeloff(sk, peeloff->associd, &newsock);
5688 if (retval < 0)
5689 goto out;
5690
5691
5692 retval = get_unused_fd_flags(flags & SOCK_CLOEXEC);
5693 if (retval < 0) {
5694 sock_release(newsock);
5695 goto out;
5696 }
5697
5698 *newfile = sock_alloc_file(newsock, 0, NULL);
5699 if (IS_ERR(*newfile)) {
5700 put_unused_fd(retval);
5701 retval = PTR_ERR(*newfile);
5702 *newfile = NULL;
5703 return retval;
5704 }
5705
5706 pr_debug("%s: sk:%p, newsk:%p, sd:%d\n", __func__, sk, newsock->sk,
5707 retval);
5708
5709 peeloff->sd = retval;
5710
5711 if (flags & SOCK_NONBLOCK)
5712 (*newfile)->f_flags |= O_NONBLOCK;
5713out:
5714 return retval;
5715}
5716
5717static int sctp_getsockopt_peeloff(struct sock *sk, int len, char __user *optval, int __user *optlen)
5718{
5719 sctp_peeloff_arg_t peeloff;
5720 struct file *newfile = NULL;
5721 int retval = 0;
5722
5723 if (len < sizeof(sctp_peeloff_arg_t))
5724 return -EINVAL;
5725 len = sizeof(sctp_peeloff_arg_t);
5726 if (copy_from_user(&peeloff, optval, len))
5727 return -EFAULT;
5728
5729 retval = sctp_getsockopt_peeloff_common(sk, &peeloff, &newfile, 0);
5730 if (retval < 0)
5731 goto out;
5732
5733
5734 if (put_user(len, optlen)) {
5735 fput(newfile);
5736 put_unused_fd(retval);
5737 return -EFAULT;
5738 }
5739
5740 if (copy_to_user(optval, &peeloff, len)) {
5741 fput(newfile);
5742 put_unused_fd(retval);
5743 return -EFAULT;
5744 }
5745 fd_install(retval, newfile);
5746out:
5747 return retval;
5748}
5749
5750static int sctp_getsockopt_peeloff_flags(struct sock *sk, int len,
5751 char __user *optval, int __user *optlen)
5752{
5753 sctp_peeloff_flags_arg_t peeloff;
5754 struct file *newfile = NULL;
5755 int retval = 0;
5756
5757 if (len < sizeof(sctp_peeloff_flags_arg_t))
5758 return -EINVAL;
5759 len = sizeof(sctp_peeloff_flags_arg_t);
5760 if (copy_from_user(&peeloff, optval, len))
5761 return -EFAULT;
5762
5763 retval = sctp_getsockopt_peeloff_common(sk, &peeloff.p_arg,
5764 &newfile, peeloff.flags);
5765 if (retval < 0)
5766 goto out;
5767
5768
5769 if (put_user(len, optlen)) {
5770 fput(newfile);
5771 put_unused_fd(retval);
5772 return -EFAULT;
5773 }
5774
5775 if (copy_to_user(optval, &peeloff, len)) {
5776 fput(newfile);
5777 put_unused_fd(retval);
5778 return -EFAULT;
5779 }
5780 fd_install(retval, newfile);
5781out:
5782 return retval;
5783}
5784
5785
5786
5787
5788
5789
5790
5791
5792
5793
5794
5795
5796
5797
5798
5799
5800
5801
5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
5816
5817
5818
5819
5820
5821
5822
5823
5824
5825
5826
5827
5828
5829
5830
5831
5832
5833
5834
5835
5836
5837
5838
5839
5840
5841
5842
5843
5844
5845
5846
5847
5848
5849
5850
5851
5852
5853
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866
5867
5868
5869
5870
5871
5872
5873
5874
5875
5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
5887
5888
5889
5890
5891
5892
5893
5894
5895
5896
5897
5898
5899
5900
5901
5902
5903
5904
5905
5906
5907
5908
5909
5910
5911
5912
5913
5914
5915
5916
5917static int sctp_getsockopt_peer_addr_params(struct sock *sk, int len,
5918 char __user *optval, int __user *optlen)
5919{
5920 struct sctp_paddrparams params;
5921 struct sctp_transport *trans = NULL;
5922 struct sctp_association *asoc = NULL;
5923 struct sctp_sock *sp = sctp_sk(sk);
5924
5925 if (len >= sizeof(params))
5926 len = sizeof(params);
5927 else if (len >= ALIGN(offsetof(struct sctp_paddrparams,
5928 spp_ipv6_flowlabel), 4))
5929 len = ALIGN(offsetof(struct sctp_paddrparams,
5930 spp_ipv6_flowlabel), 4);
5931 else
5932 return -EINVAL;
5933
5934 if (copy_from_user(¶ms, optval, len))
5935 return -EFAULT;
5936
5937
5938
5939
5940 if (!sctp_is_any(sk, (union sctp_addr *)¶ms.spp_address)) {
5941 trans = sctp_addr_id2transport(sk, ¶ms.spp_address,
5942 params.spp_assoc_id);
5943 if (!trans) {
5944 pr_debug("%s: failed no transport\n", __func__);
5945 return -EINVAL;
5946 }
5947 }
5948
5949
5950
5951
5952
5953 asoc = sctp_id2assoc(sk, params.spp_assoc_id);
5954 if (!asoc && params.spp_assoc_id != SCTP_FUTURE_ASSOC &&
5955 sctp_style(sk, UDP)) {
5956 pr_debug("%s: failed no association\n", __func__);
5957 return -EINVAL;
5958 }
5959
5960 if (trans) {
5961
5962 params.spp_hbinterval = jiffies_to_msecs(trans->hbinterval);
5963 params.spp_pathmtu = trans->pathmtu;
5964 params.spp_pathmaxrxt = trans->pathmaxrxt;
5965 params.spp_sackdelay = jiffies_to_msecs(trans->sackdelay);
5966
5967
5968 params.spp_flags = trans->param_flags;
5969 if (trans->flowlabel & SCTP_FLOWLABEL_SET_MASK) {
5970 params.spp_ipv6_flowlabel = trans->flowlabel &
5971 SCTP_FLOWLABEL_VAL_MASK;
5972 params.spp_flags |= SPP_IPV6_FLOWLABEL;
5973 }
5974 if (trans->dscp & SCTP_DSCP_SET_MASK) {
5975 params.spp_dscp = trans->dscp & SCTP_DSCP_VAL_MASK;
5976 params.spp_flags |= SPP_DSCP;
5977 }
5978 } else if (asoc) {
5979
5980 params.spp_hbinterval = jiffies_to_msecs(asoc->hbinterval);
5981 params.spp_pathmtu = asoc->pathmtu;
5982 params.spp_pathmaxrxt = asoc->pathmaxrxt;
5983 params.spp_sackdelay = jiffies_to_msecs(asoc->sackdelay);
5984
5985
5986 params.spp_flags = asoc->param_flags;
5987 if (asoc->flowlabel & SCTP_FLOWLABEL_SET_MASK) {
5988 params.spp_ipv6_flowlabel = asoc->flowlabel &
5989 SCTP_FLOWLABEL_VAL_MASK;
5990 params.spp_flags |= SPP_IPV6_FLOWLABEL;
5991 }
5992 if (asoc->dscp & SCTP_DSCP_SET_MASK) {
5993 params.spp_dscp = asoc->dscp & SCTP_DSCP_VAL_MASK;
5994 params.spp_flags |= SPP_DSCP;
5995 }
5996 } else {
5997
5998 params.spp_hbinterval = sp->hbinterval;
5999 params.spp_pathmtu = sp->pathmtu;
6000 params.spp_sackdelay = sp->sackdelay;
6001 params.spp_pathmaxrxt = sp->pathmaxrxt;
6002
6003
6004 params.spp_flags = sp->param_flags;
6005 if (sp->flowlabel & SCTP_FLOWLABEL_SET_MASK) {
6006 params.spp_ipv6_flowlabel = sp->flowlabel &
6007 SCTP_FLOWLABEL_VAL_MASK;
6008 params.spp_flags |= SPP_IPV6_FLOWLABEL;
6009 }
6010 if (sp->dscp & SCTP_DSCP_SET_MASK) {
6011 params.spp_dscp = sp->dscp & SCTP_DSCP_VAL_MASK;
6012 params.spp_flags |= SPP_DSCP;
6013 }
6014 }
6015
6016 if (copy_to_user(optval, ¶ms, len))
6017 return -EFAULT;
6018
6019 if (put_user(len, optlen))
6020 return -EFAULT;
6021
6022 return 0;
6023}
6024
6025
6026
6027
6028
6029
6030
6031
6032
6033
6034
6035
6036
6037
6038
6039
6040
6041
6042
6043
6044
6045
6046
6047
6048
6049
6050
6051
6052
6053
6054
6055
6056
6057
6058
6059
6060static int sctp_getsockopt_delayed_ack(struct sock *sk, int len,
6061 char __user *optval,
6062 int __user *optlen)
6063{
6064 struct sctp_sack_info params;
6065 struct sctp_association *asoc = NULL;
6066 struct sctp_sock *sp = sctp_sk(sk);
6067
6068 if (len >= sizeof(struct sctp_sack_info)) {
6069 len = sizeof(struct sctp_sack_info);
6070
6071 if (copy_from_user(¶ms, optval, len))
6072 return -EFAULT;
6073 } else if (len == sizeof(struct sctp_assoc_value)) {
6074 pr_warn_ratelimited(DEPRECATED
6075 "%s (pid %d) "
6076 "Use of struct sctp_assoc_value in delayed_ack socket option.\n"
6077 "Use struct sctp_sack_info instead\n",
6078 current->comm, task_pid_nr(current));
6079 if (copy_from_user(¶ms, optval, len))
6080 return -EFAULT;
6081 } else
6082 return -EINVAL;
6083
6084
6085
6086
6087
6088 asoc = sctp_id2assoc(sk, params.sack_assoc_id);
6089 if (!asoc && params.sack_assoc_id != SCTP_FUTURE_ASSOC &&
6090 sctp_style(sk, UDP))
6091 return -EINVAL;
6092
6093 if (asoc) {
6094
6095 if (asoc->param_flags & SPP_SACKDELAY_ENABLE) {
6096 params.sack_delay = jiffies_to_msecs(asoc->sackdelay);
6097 params.sack_freq = asoc->sackfreq;
6098
6099 } else {
6100 params.sack_delay = 0;
6101 params.sack_freq = 1;
6102 }
6103 } else {
6104
6105 if (sp->param_flags & SPP_SACKDELAY_ENABLE) {
6106 params.sack_delay = sp->sackdelay;
6107 params.sack_freq = sp->sackfreq;
6108 } else {
6109 params.sack_delay = 0;
6110 params.sack_freq = 1;
6111 }
6112 }
6113
6114 if (copy_to_user(optval, ¶ms, len))
6115 return -EFAULT;
6116
6117 if (put_user(len, optlen))
6118 return -EFAULT;
6119
6120 return 0;
6121}
6122
6123
6124
6125
6126
6127
6128
6129
6130
6131
6132
6133
6134static int sctp_getsockopt_initmsg(struct sock *sk, int len, char __user *optval, int __user *optlen)
6135{
6136 if (len < sizeof(struct sctp_initmsg))
6137 return -EINVAL;
6138 len = sizeof(struct sctp_initmsg);
6139 if (put_user(len, optlen))
6140 return -EFAULT;
6141 if (copy_to_user(optval, &sctp_sk(sk)->initmsg, len))
6142 return -EFAULT;
6143 return 0;
6144}
6145
6146
6147static int sctp_getsockopt_peer_addrs(struct sock *sk, int len,
6148 char __user *optval, int __user *optlen)
6149{
6150 struct sctp_association *asoc;
6151 int cnt = 0;
6152 struct sctp_getaddrs getaddrs;
6153 struct sctp_transport *from;
6154 void __user *to;
6155 union sctp_addr temp;
6156 struct sctp_sock *sp = sctp_sk(sk);
6157 int addrlen;
6158 size_t space_left;
6159 int bytes_copied;
6160
6161 if (len < sizeof(struct sctp_getaddrs))
6162 return -EINVAL;
6163
6164 if (copy_from_user(&getaddrs, optval, sizeof(struct sctp_getaddrs)))
6165 return -EFAULT;
6166
6167
6168 asoc = sctp_id2assoc(sk, getaddrs.assoc_id);
6169 if (!asoc)
6170 return -EINVAL;
6171
6172 to = optval + offsetof(struct sctp_getaddrs, addrs);
6173 space_left = len - offsetof(struct sctp_getaddrs, addrs);
6174
6175 list_for_each_entry(from, &asoc->peer.transport_addr_list,
6176 transports) {
6177 memcpy(&temp, &from->ipaddr, sizeof(temp));
6178 addrlen = sctp_get_pf_specific(sk->sk_family)
6179 ->addr_to_user(sp, &temp);
6180 if (space_left < addrlen)
6181 return -ENOMEM;
6182 if (copy_to_user(to, &temp, addrlen))
6183 return -EFAULT;
6184 to += addrlen;
6185 cnt++;
6186 space_left -= addrlen;
6187 }
6188
6189 if (put_user(cnt, &((struct sctp_getaddrs __user *)optval)->addr_num))
6190 return -EFAULT;
6191 bytes_copied = ((char __user *)to) - optval;
6192 if (put_user(bytes_copied, optlen))
6193 return -EFAULT;
6194
6195 return 0;
6196}
6197
6198static int sctp_copy_laddrs(struct sock *sk, __u16 port, void *to,
6199 size_t space_left, int *bytes_copied)
6200{
6201 struct sctp_sockaddr_entry *addr;
6202 union sctp_addr temp;
6203 int cnt = 0;
6204 int addrlen;
6205 struct net *net = sock_net(sk);
6206
6207 rcu_read_lock();
6208 list_for_each_entry_rcu(addr, &net->sctp.local_addr_list, list) {
6209 if (!addr->valid)
6210 continue;
6211
6212 if ((PF_INET == sk->sk_family) &&
6213 (AF_INET6 == addr->a.sa.sa_family))
6214 continue;
6215 if ((PF_INET6 == sk->sk_family) &&
6216 inet_v6_ipv6only(sk) &&
6217 (AF_INET == addr->a.sa.sa_family))
6218 continue;
6219 memcpy(&temp, &addr->a, sizeof(temp));
6220 if (!temp.v4.sin_port)
6221 temp.v4.sin_port = htons(port);
6222
6223 addrlen = sctp_get_pf_specific(sk->sk_family)
6224 ->addr_to_user(sctp_sk(sk), &temp);
6225
6226 if (space_left < addrlen) {
6227 cnt = -ENOMEM;
6228 break;
6229 }
6230 memcpy(to, &temp, addrlen);
6231
6232 to += addrlen;
6233 cnt++;
6234 space_left -= addrlen;
6235 *bytes_copied += addrlen;
6236 }
6237 rcu_read_unlock();
6238
6239 return cnt;
6240}
6241
6242
6243static int sctp_getsockopt_local_addrs(struct sock *sk, int len,
6244 char __user *optval, int __user *optlen)
6245{
6246 struct sctp_bind_addr *bp;
6247 struct sctp_association *asoc;
6248 int cnt = 0;
6249 struct sctp_getaddrs getaddrs;
6250 struct sctp_sockaddr_entry *addr;
6251 void __user *to;
6252 union sctp_addr temp;
6253 struct sctp_sock *sp = sctp_sk(sk);
6254 int addrlen;
6255 int err = 0;
6256 size_t space_left;
6257 int bytes_copied = 0;
6258 void *addrs;
6259 void *buf;
6260
6261 if (len < sizeof(struct sctp_getaddrs))
6262 return -EINVAL;
6263
6264 if (copy_from_user(&getaddrs, optval, sizeof(struct sctp_getaddrs)))
6265 return -EFAULT;
6266
6267
6268
6269
6270
6271
6272
6273 if (0 == getaddrs.assoc_id) {
6274 bp = &sctp_sk(sk)->ep->base.bind_addr;
6275 } else {
6276 asoc = sctp_id2assoc(sk, getaddrs.assoc_id);
6277 if (!asoc)
6278 return -EINVAL;
6279 bp = &asoc->base.bind_addr;
6280 }
6281
6282 to = optval + offsetof(struct sctp_getaddrs, addrs);
6283 space_left = len - offsetof(struct sctp_getaddrs, addrs);
6284
6285 addrs = kmalloc(space_left, GFP_USER | __GFP_NOWARN);
6286 if (!addrs)
6287 return -ENOMEM;
6288
6289
6290
6291
6292 if (sctp_list_single_entry(&bp->address_list)) {
6293 addr = list_entry(bp->address_list.next,
6294 struct sctp_sockaddr_entry, list);
6295 if (sctp_is_any(sk, &addr->a)) {
6296 cnt = sctp_copy_laddrs(sk, bp->port, addrs,
6297 space_left, &bytes_copied);
6298 if (cnt < 0) {
6299 err = cnt;
6300 goto out;
6301 }
6302 goto copy_getaddrs;
6303 }
6304 }
6305
6306 buf = addrs;
6307
6308
6309
6310
6311 list_for_each_entry(addr, &bp->address_list, list) {
6312 memcpy(&temp, &addr->a, sizeof(temp));
6313 addrlen = sctp_get_pf_specific(sk->sk_family)
6314 ->addr_to_user(sp, &temp);
6315 if (space_left < addrlen) {
6316 err = -ENOMEM;
6317 goto out;
6318 }
6319 memcpy(buf, &temp, addrlen);
6320 buf += addrlen;
6321 bytes_copied += addrlen;
6322 cnt++;
6323 space_left -= addrlen;
6324 }
6325
6326copy_getaddrs:
6327 if (copy_to_user(to, addrs, bytes_copied)) {
6328 err = -EFAULT;
6329 goto out;
6330 }
6331 if (put_user(cnt, &((struct sctp_getaddrs __user *)optval)->addr_num)) {
6332 err = -EFAULT;
6333 goto out;
6334 }
6335
6336
6337
6338 if (put_user(bytes_copied, optlen))
6339 err = -EFAULT;
6340out:
6341 kfree(addrs);
6342 return err;
6343}
6344
6345
6346
6347
6348
6349
6350
6351static int sctp_getsockopt_primary_addr(struct sock *sk, int len,
6352 char __user *optval, int __user *optlen)
6353{
6354 struct sctp_prim prim;
6355 struct sctp_association *asoc;
6356 struct sctp_sock *sp = sctp_sk(sk);
6357
6358 if (len < sizeof(struct sctp_prim))
6359 return -EINVAL;
6360
6361 len = sizeof(struct sctp_prim);
6362
6363 if (copy_from_user(&prim, optval, len))
6364 return -EFAULT;
6365
6366 asoc = sctp_id2assoc(sk, prim.ssp_assoc_id);
6367 if (!asoc)
6368 return -EINVAL;
6369
6370 if (!asoc->peer.primary_path)
6371 return -ENOTCONN;
6372
6373 memcpy(&prim.ssp_addr, &asoc->peer.primary_path->ipaddr,
6374 asoc->peer.primary_path->af_specific->sockaddr_len);
6375
6376 sctp_get_pf_specific(sk->sk_family)->addr_to_user(sp,
6377 (union sctp_addr *)&prim.ssp_addr);
6378
6379 if (put_user(len, optlen))
6380 return -EFAULT;
6381 if (copy_to_user(optval, &prim, len))
6382 return -EFAULT;
6383
6384 return 0;
6385}
6386
6387
6388
6389
6390
6391
6392
6393static int sctp_getsockopt_adaptation_layer(struct sock *sk, int len,
6394 char __user *optval, int __user *optlen)
6395{
6396 struct sctp_setadaptation adaptation;
6397
6398 if (len < sizeof(struct sctp_setadaptation))
6399 return -EINVAL;
6400
6401 len = sizeof(struct sctp_setadaptation);
6402
6403 adaptation.ssb_adaptation_ind = sctp_sk(sk)->adaptation_ind;
6404
6405 if (put_user(len, optlen))
6406 return -EFAULT;
6407 if (copy_to_user(optval, &adaptation, len))
6408 return -EFAULT;
6409
6410 return 0;
6411}
6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
6427
6428
6429
6430
6431
6432static int sctp_getsockopt_default_send_param(struct sock *sk,
6433 int len, char __user *optval,
6434 int __user *optlen)
6435{
6436 struct sctp_sock *sp = sctp_sk(sk);
6437 struct sctp_association *asoc;
6438 struct sctp_sndrcvinfo info;
6439
6440 if (len < sizeof(info))
6441 return -EINVAL;
6442
6443 len = sizeof(info);
6444
6445 if (copy_from_user(&info, optval, len))
6446 return -EFAULT;
6447
6448 asoc = sctp_id2assoc(sk, info.sinfo_assoc_id);
6449 if (!asoc && info.sinfo_assoc_id != SCTP_FUTURE_ASSOC &&
6450 sctp_style(sk, UDP))
6451 return -EINVAL;
6452
6453 if (asoc) {
6454 info.sinfo_stream = asoc->default_stream;
6455 info.sinfo_flags = asoc->default_flags;
6456 info.sinfo_ppid = asoc->default_ppid;
6457 info.sinfo_context = asoc->default_context;
6458 info.sinfo_timetolive = asoc->default_timetolive;
6459 } else {
6460 info.sinfo_stream = sp->default_stream;
6461 info.sinfo_flags = sp->default_flags;
6462 info.sinfo_ppid = sp->default_ppid;
6463 info.sinfo_context = sp->default_context;
6464 info.sinfo_timetolive = sp->default_timetolive;
6465 }
6466
6467 if (put_user(len, optlen))
6468 return -EFAULT;
6469 if (copy_to_user(optval, &info, len))
6470 return -EFAULT;
6471
6472 return 0;
6473}
6474
6475
6476
6477
6478static int sctp_getsockopt_default_sndinfo(struct sock *sk, int len,
6479 char __user *optval,
6480 int __user *optlen)
6481{
6482 struct sctp_sock *sp = sctp_sk(sk);
6483 struct sctp_association *asoc;
6484 struct sctp_sndinfo info;
6485
6486 if (len < sizeof(info))
6487 return -EINVAL;
6488
6489 len = sizeof(info);
6490
6491 if (copy_from_user(&info, optval, len))
6492 return -EFAULT;
6493
6494 asoc = sctp_id2assoc(sk, info.snd_assoc_id);
6495 if (!asoc && info.snd_assoc_id != SCTP_FUTURE_ASSOC &&
6496 sctp_style(sk, UDP))
6497 return -EINVAL;
6498
6499 if (asoc) {
6500 info.snd_sid = asoc->default_stream;
6501 info.snd_flags = asoc->default_flags;
6502 info.snd_ppid = asoc->default_ppid;
6503 info.snd_context = asoc->default_context;
6504 } else {
6505 info.snd_sid = sp->default_stream;
6506 info.snd_flags = sp->default_flags;
6507 info.snd_ppid = sp->default_ppid;
6508 info.snd_context = sp->default_context;
6509 }
6510
6511 if (put_user(len, optlen))
6512 return -EFAULT;
6513 if (copy_to_user(optval, &info, len))
6514 return -EFAULT;
6515
6516 return 0;
6517}
6518
6519
6520
6521
6522
6523
6524
6525
6526
6527
6528
6529static int sctp_getsockopt_nodelay(struct sock *sk, int len,
6530 char __user *optval, int __user *optlen)
6531{
6532 int val;
6533
6534 if (len < sizeof(int))
6535 return -EINVAL;
6536
6537 len = sizeof(int);
6538 val = (sctp_sk(sk)->nodelay == 1);
6539 if (put_user(len, optlen))
6540 return -EFAULT;
6541 if (copy_to_user(optval, &val, len))
6542 return -EFAULT;
6543 return 0;
6544}
6545
6546
6547
6548
6549
6550
6551
6552
6553
6554
6555
6556
6557
6558static int sctp_getsockopt_rtoinfo(struct sock *sk, int len,
6559 char __user *optval,
6560 int __user *optlen) {
6561 struct sctp_rtoinfo rtoinfo;
6562 struct sctp_association *asoc;
6563
6564 if (len < sizeof (struct sctp_rtoinfo))
6565 return -EINVAL;
6566
6567 len = sizeof(struct sctp_rtoinfo);
6568
6569 if (copy_from_user(&rtoinfo, optval, len))
6570 return -EFAULT;
6571
6572 asoc = sctp_id2assoc(sk, rtoinfo.srto_assoc_id);
6573
6574 if (!asoc && rtoinfo.srto_assoc_id != SCTP_FUTURE_ASSOC &&
6575 sctp_style(sk, UDP))
6576 return -EINVAL;
6577
6578
6579 if (asoc) {
6580 rtoinfo.srto_initial = jiffies_to_msecs(asoc->rto_initial);
6581 rtoinfo.srto_max = jiffies_to_msecs(asoc->rto_max);
6582 rtoinfo.srto_min = jiffies_to_msecs(asoc->rto_min);
6583 } else {
6584
6585 struct sctp_sock *sp = sctp_sk(sk);
6586
6587 rtoinfo.srto_initial = sp->rtoinfo.srto_initial;
6588 rtoinfo.srto_max = sp->rtoinfo.srto_max;
6589 rtoinfo.srto_min = sp->rtoinfo.srto_min;
6590 }
6591
6592 if (put_user(len, optlen))
6593 return -EFAULT;
6594
6595 if (copy_to_user(optval, &rtoinfo, len))
6596 return -EFAULT;
6597
6598 return 0;
6599}
6600
6601
6602
6603
6604
6605
6606
6607
6608
6609
6610
6611
6612static int sctp_getsockopt_associnfo(struct sock *sk, int len,
6613 char __user *optval,
6614 int __user *optlen)
6615{
6616
6617 struct sctp_assocparams assocparams;
6618 struct sctp_association *asoc;
6619 struct list_head *pos;
6620 int cnt = 0;
6621
6622 if (len < sizeof (struct sctp_assocparams))
6623 return -EINVAL;
6624
6625 len = sizeof(struct sctp_assocparams);
6626
6627 if (copy_from_user(&assocparams, optval, len))
6628 return -EFAULT;
6629
6630 asoc = sctp_id2assoc(sk, assocparams.sasoc_assoc_id);
6631
6632 if (!asoc && assocparams.sasoc_assoc_id != SCTP_FUTURE_ASSOC &&
6633 sctp_style(sk, UDP))
6634 return -EINVAL;
6635
6636
6637 if (asoc) {
6638 assocparams.sasoc_asocmaxrxt = asoc->max_retrans;
6639 assocparams.sasoc_peer_rwnd = asoc->peer.rwnd;
6640 assocparams.sasoc_local_rwnd = asoc->a_rwnd;
6641 assocparams.sasoc_cookie_life = ktime_to_ms(asoc->cookie_life);
6642
6643 list_for_each(pos, &asoc->peer.transport_addr_list) {
6644 cnt++;
6645 }
6646
6647 assocparams.sasoc_number_peer_destinations = cnt;
6648 } else {
6649
6650 struct sctp_sock *sp = sctp_sk(sk);
6651
6652 assocparams.sasoc_asocmaxrxt = sp->assocparams.sasoc_asocmaxrxt;
6653 assocparams.sasoc_peer_rwnd = sp->assocparams.sasoc_peer_rwnd;
6654 assocparams.sasoc_local_rwnd = sp->assocparams.sasoc_local_rwnd;
6655 assocparams.sasoc_cookie_life =
6656 sp->assocparams.sasoc_cookie_life;
6657 assocparams.sasoc_number_peer_destinations =
6658 sp->assocparams.
6659 sasoc_number_peer_destinations;
6660 }
6661
6662 if (put_user(len, optlen))
6663 return -EFAULT;
6664
6665 if (copy_to_user(optval, &assocparams, len))
6666 return -EFAULT;
6667
6668 return 0;
6669}
6670
6671
6672
6673
6674
6675
6676
6677
6678
6679
6680
6681static int sctp_getsockopt_mappedv4(struct sock *sk, int len,
6682 char __user *optval, int __user *optlen)
6683{
6684 int val;
6685 struct sctp_sock *sp = sctp_sk(sk);
6686
6687 if (len < sizeof(int))
6688 return -EINVAL;
6689
6690 len = sizeof(int);
6691 val = sp->v4mapped;
6692 if (put_user(len, optlen))
6693 return -EFAULT;
6694 if (copy_to_user(optval, &val, len))
6695 return -EFAULT;
6696
6697 return 0;
6698}
6699
6700
6701
6702
6703
6704static int sctp_getsockopt_context(struct sock *sk, int len,
6705 char __user *optval, int __user *optlen)
6706{
6707 struct sctp_assoc_value params;
6708 struct sctp_association *asoc;
6709
6710 if (len < sizeof(struct sctp_assoc_value))
6711 return -EINVAL;
6712
6713 len = sizeof(struct sctp_assoc_value);
6714
6715 if (copy_from_user(¶ms, optval, len))
6716 return -EFAULT;
6717
6718 asoc = sctp_id2assoc(sk, params.assoc_id);
6719 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
6720 sctp_style(sk, UDP))
6721 return -EINVAL;
6722
6723 params.assoc_value = asoc ? asoc->default_rcv_context
6724 : sctp_sk(sk)->default_rcv_context;
6725
6726 if (put_user(len, optlen))
6727 return -EFAULT;
6728 if (copy_to_user(optval, ¶ms, len))
6729 return -EFAULT;
6730
6731 return 0;
6732}
6733
6734
6735
6736
6737
6738
6739
6740
6741
6742
6743
6744
6745
6746
6747
6748
6749
6750
6751
6752
6753
6754
6755
6756
6757
6758
6759
6760
6761static int sctp_getsockopt_maxseg(struct sock *sk, int len,
6762 char __user *optval, int __user *optlen)
6763{
6764 struct sctp_assoc_value params;
6765 struct sctp_association *asoc;
6766
6767 if (len == sizeof(int)) {
6768 pr_warn_ratelimited(DEPRECATED
6769 "%s (pid %d) "
6770 "Use of int in maxseg socket option.\n"
6771 "Use struct sctp_assoc_value instead\n",
6772 current->comm, task_pid_nr(current));
6773 params.assoc_id = SCTP_FUTURE_ASSOC;
6774 } else if (len >= sizeof(struct sctp_assoc_value)) {
6775 len = sizeof(struct sctp_assoc_value);
6776 if (copy_from_user(¶ms, optval, len))
6777 return -EFAULT;
6778 } else
6779 return -EINVAL;
6780
6781 asoc = sctp_id2assoc(sk, params.assoc_id);
6782 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
6783 sctp_style(sk, UDP))
6784 return -EINVAL;
6785
6786 if (asoc)
6787 params.assoc_value = asoc->frag_point;
6788 else
6789 params.assoc_value = sctp_sk(sk)->user_frag;
6790
6791 if (put_user(len, optlen))
6792 return -EFAULT;
6793 if (len == sizeof(int)) {
6794 if (copy_to_user(optval, ¶ms.assoc_value, len))
6795 return -EFAULT;
6796 } else {
6797 if (copy_to_user(optval, ¶ms, len))
6798 return -EFAULT;
6799 }
6800
6801 return 0;
6802}
6803
6804
6805
6806
6807
6808static int sctp_getsockopt_fragment_interleave(struct sock *sk, int len,
6809 char __user *optval, int __user *optlen)
6810{
6811 int val;
6812
6813 if (len < sizeof(int))
6814 return -EINVAL;
6815
6816 len = sizeof(int);
6817
6818 val = sctp_sk(sk)->frag_interleave;
6819 if (put_user(len, optlen))
6820 return -EFAULT;
6821 if (copy_to_user(optval, &val, len))
6822 return -EFAULT;
6823
6824 return 0;
6825}
6826
6827
6828
6829
6830
6831static int sctp_getsockopt_partial_delivery_point(struct sock *sk, int len,
6832 char __user *optval,
6833 int __user *optlen)
6834{
6835 u32 val;
6836
6837 if (len < sizeof(u32))
6838 return -EINVAL;
6839
6840 len = sizeof(u32);
6841
6842 val = sctp_sk(sk)->pd_point;
6843 if (put_user(len, optlen))
6844 return -EFAULT;
6845 if (copy_to_user(optval, &val, len))
6846 return -EFAULT;
6847
6848 return 0;
6849}
6850
6851
6852
6853
6854
6855static int sctp_getsockopt_maxburst(struct sock *sk, int len,
6856 char __user *optval,
6857 int __user *optlen)
6858{
6859 struct sctp_assoc_value params;
6860 struct sctp_association *asoc;
6861
6862 if (len == sizeof(int)) {
6863 pr_warn_ratelimited(DEPRECATED
6864 "%s (pid %d) "
6865 "Use of int in max_burst socket option.\n"
6866 "Use struct sctp_assoc_value instead\n",
6867 current->comm, task_pid_nr(current));
6868 params.assoc_id = SCTP_FUTURE_ASSOC;
6869 } else if (len >= sizeof(struct sctp_assoc_value)) {
6870 len = sizeof(struct sctp_assoc_value);
6871 if (copy_from_user(¶ms, optval, len))
6872 return -EFAULT;
6873 } else
6874 return -EINVAL;
6875
6876 asoc = sctp_id2assoc(sk, params.assoc_id);
6877 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
6878 sctp_style(sk, UDP))
6879 return -EINVAL;
6880
6881 params.assoc_value = asoc ? asoc->max_burst : sctp_sk(sk)->max_burst;
6882
6883 if (len == sizeof(int)) {
6884 if (copy_to_user(optval, ¶ms.assoc_value, len))
6885 return -EFAULT;
6886 } else {
6887 if (copy_to_user(optval, ¶ms, len))
6888 return -EFAULT;
6889 }
6890
6891 return 0;
6892
6893}
6894
6895static int sctp_getsockopt_hmac_ident(struct sock *sk, int len,
6896 char __user *optval, int __user *optlen)
6897{
6898 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
6899 struct sctp_hmacalgo __user *p = (void __user *)optval;
6900 struct sctp_hmac_algo_param *hmacs;
6901 __u16 data_len = 0;
6902 u32 num_idents;
6903 int i;
6904
6905 if (!ep->auth_enable)
6906 return -EACCES;
6907
6908 hmacs = ep->auth_hmacs_list;
6909 data_len = ntohs(hmacs->param_hdr.length) -
6910 sizeof(struct sctp_paramhdr);
6911
6912 if (len < sizeof(struct sctp_hmacalgo) + data_len)
6913 return -EINVAL;
6914
6915 len = sizeof(struct sctp_hmacalgo) + data_len;
6916 num_idents = data_len / sizeof(u16);
6917
6918 if (put_user(len, optlen))
6919 return -EFAULT;
6920 if (put_user(num_idents, &p->shmac_num_idents))
6921 return -EFAULT;
6922 for (i = 0; i < num_idents; i++) {
6923 __u16 hmacid = ntohs(hmacs->hmac_ids[i]);
6924
6925 if (copy_to_user(&p->shmac_idents[i], &hmacid, sizeof(__u16)))
6926 return -EFAULT;
6927 }
6928 return 0;
6929}
6930
6931static int sctp_getsockopt_active_key(struct sock *sk, int len,
6932 char __user *optval, int __user *optlen)
6933{
6934 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
6935 struct sctp_authkeyid val;
6936 struct sctp_association *asoc;
6937
6938 if (len < sizeof(struct sctp_authkeyid))
6939 return -EINVAL;
6940
6941 len = sizeof(struct sctp_authkeyid);
6942 if (copy_from_user(&val, optval, len))
6943 return -EFAULT;
6944
6945 asoc = sctp_id2assoc(sk, val.scact_assoc_id);
6946 if (!asoc && val.scact_assoc_id && sctp_style(sk, UDP))
6947 return -EINVAL;
6948
6949 if (asoc) {
6950 if (!asoc->peer.auth_capable)
6951 return -EACCES;
6952 val.scact_keynumber = asoc->active_key_id;
6953 } else {
6954 if (!ep->auth_enable)
6955 return -EACCES;
6956 val.scact_keynumber = ep->active_key_id;
6957 }
6958
6959 if (put_user(len, optlen))
6960 return -EFAULT;
6961 if (copy_to_user(optval, &val, len))
6962 return -EFAULT;
6963
6964 return 0;
6965}
6966
6967static int sctp_getsockopt_peer_auth_chunks(struct sock *sk, int len,
6968 char __user *optval, int __user *optlen)
6969{
6970 struct sctp_authchunks __user *p = (void __user *)optval;
6971 struct sctp_authchunks val;
6972 struct sctp_association *asoc;
6973 struct sctp_chunks_param *ch;
6974 u32 num_chunks = 0;
6975 char __user *to;
6976
6977 if (len < sizeof(struct sctp_authchunks))
6978 return -EINVAL;
6979
6980 if (copy_from_user(&val, optval, sizeof(val)))
6981 return -EFAULT;
6982
6983 to = p->gauth_chunks;
6984 asoc = sctp_id2assoc(sk, val.gauth_assoc_id);
6985 if (!asoc)
6986 return -EINVAL;
6987
6988 if (!asoc->peer.auth_capable)
6989 return -EACCES;
6990
6991 ch = asoc->peer.peer_chunks;
6992 if (!ch)
6993 goto num;
6994
6995
6996 num_chunks = ntohs(ch->param_hdr.length) - sizeof(struct sctp_paramhdr);
6997 if (len < num_chunks)
6998 return -EINVAL;
6999
7000 if (copy_to_user(to, ch->chunks, num_chunks))
7001 return -EFAULT;
7002num:
7003 len = sizeof(struct sctp_authchunks) + num_chunks;
7004 if (put_user(len, optlen))
7005 return -EFAULT;
7006 if (put_user(num_chunks, &p->gauth_number_of_chunks))
7007 return -EFAULT;
7008 return 0;
7009}
7010
7011static int sctp_getsockopt_local_auth_chunks(struct sock *sk, int len,
7012 char __user *optval, int __user *optlen)
7013{
7014 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
7015 struct sctp_authchunks __user *p = (void __user *)optval;
7016 struct sctp_authchunks val;
7017 struct sctp_association *asoc;
7018 struct sctp_chunks_param *ch;
7019 u32 num_chunks = 0;
7020 char __user *to;
7021
7022 if (len < sizeof(struct sctp_authchunks))
7023 return -EINVAL;
7024
7025 if (copy_from_user(&val, optval, sizeof(val)))
7026 return -EFAULT;
7027
7028 to = p->gauth_chunks;
7029 asoc = sctp_id2assoc(sk, val.gauth_assoc_id);
7030 if (!asoc && val.gauth_assoc_id != SCTP_FUTURE_ASSOC &&
7031 sctp_style(sk, UDP))
7032 return -EINVAL;
7033
7034 if (asoc) {
7035 if (!asoc->peer.auth_capable)
7036 return -EACCES;
7037 ch = (struct sctp_chunks_param *)asoc->c.auth_chunks;
7038 } else {
7039 if (!ep->auth_enable)
7040 return -EACCES;
7041 ch = ep->auth_chunk_list;
7042 }
7043 if (!ch)
7044 goto num;
7045
7046 num_chunks = ntohs(ch->param_hdr.length) - sizeof(struct sctp_paramhdr);
7047 if (len < sizeof(struct sctp_authchunks) + num_chunks)
7048 return -EINVAL;
7049
7050 if (copy_to_user(to, ch->chunks, num_chunks))
7051 return -EFAULT;
7052num:
7053 len = sizeof(struct sctp_authchunks) + num_chunks;
7054 if (put_user(len, optlen))
7055 return -EFAULT;
7056 if (put_user(num_chunks, &p->gauth_number_of_chunks))
7057 return -EFAULT;
7058
7059 return 0;
7060}
7061
7062
7063
7064
7065
7066
7067static int sctp_getsockopt_assoc_number(struct sock *sk, int len,
7068 char __user *optval, int __user *optlen)
7069{
7070 struct sctp_sock *sp = sctp_sk(sk);
7071 struct sctp_association *asoc;
7072 u32 val = 0;
7073
7074 if (sctp_style(sk, TCP))
7075 return -EOPNOTSUPP;
7076
7077 if (len < sizeof(u32))
7078 return -EINVAL;
7079
7080 len = sizeof(u32);
7081
7082 list_for_each_entry(asoc, &(sp->ep->asocs), asocs) {
7083 val++;
7084 }
7085
7086 if (put_user(len, optlen))
7087 return -EFAULT;
7088 if (copy_to_user(optval, &val, len))
7089 return -EFAULT;
7090
7091 return 0;
7092}
7093
7094
7095
7096
7097
7098static int sctp_getsockopt_auto_asconf(struct sock *sk, int len,
7099 char __user *optval, int __user *optlen)
7100{
7101 int val = 0;
7102
7103 if (len < sizeof(int))
7104 return -EINVAL;
7105
7106 len = sizeof(int);
7107 if (sctp_sk(sk)->do_auto_asconf && sctp_is_ep_boundall(sk))
7108 val = 1;
7109 if (put_user(len, optlen))
7110 return -EFAULT;
7111 if (copy_to_user(optval, &val, len))
7112 return -EFAULT;
7113 return 0;
7114}
7115
7116
7117
7118
7119
7120
7121
7122
7123static int sctp_getsockopt_assoc_ids(struct sock *sk, int len,
7124 char __user *optval, int __user *optlen)
7125{
7126 struct sctp_sock *sp = sctp_sk(sk);
7127 struct sctp_association *asoc;
7128 struct sctp_assoc_ids *ids;
7129 u32 num = 0;
7130
7131 if (sctp_style(sk, TCP))
7132 return -EOPNOTSUPP;
7133
7134 if (len < sizeof(struct sctp_assoc_ids))
7135 return -EINVAL;
7136
7137 list_for_each_entry(asoc, &(sp->ep->asocs), asocs) {
7138 num++;
7139 }
7140
7141 if (len < sizeof(struct sctp_assoc_ids) + sizeof(sctp_assoc_t) * num)
7142 return -EINVAL;
7143
7144 len = sizeof(struct sctp_assoc_ids) + sizeof(sctp_assoc_t) * num;
7145
7146 ids = kmalloc(len, GFP_USER | __GFP_NOWARN);
7147 if (unlikely(!ids))
7148 return -ENOMEM;
7149
7150 ids->gaids_number_of_ids = num;
7151 num = 0;
7152 list_for_each_entry(asoc, &(sp->ep->asocs), asocs) {
7153 ids->gaids_assoc_id[num++] = asoc->assoc_id;
7154 }
7155
7156 if (put_user(len, optlen) || copy_to_user(optval, ids, len)) {
7157 kfree(ids);
7158 return -EFAULT;
7159 }
7160
7161 kfree(ids);
7162 return 0;
7163}
7164
7165
7166
7167
7168
7169
7170
7171
7172static int sctp_getsockopt_paddr_thresholds(struct sock *sk,
7173 char __user *optval,
7174 int len,
7175 int __user *optlen)
7176{
7177 struct sctp_paddrthlds val;
7178 struct sctp_transport *trans;
7179 struct sctp_association *asoc;
7180
7181 if (len < sizeof(struct sctp_paddrthlds))
7182 return -EINVAL;
7183 len = sizeof(struct sctp_paddrthlds);
7184 if (copy_from_user(&val, (struct sctp_paddrthlds __user *)optval, len))
7185 return -EFAULT;
7186
7187 if (!sctp_is_any(sk, (const union sctp_addr *)&val.spt_address)) {
7188 trans = sctp_addr_id2transport(sk, &val.spt_address,
7189 val.spt_assoc_id);
7190 if (!trans)
7191 return -ENOENT;
7192
7193 val.spt_pathmaxrxt = trans->pathmaxrxt;
7194 val.spt_pathpfthld = trans->pf_retrans;
7195
7196 goto out;
7197 }
7198
7199 asoc = sctp_id2assoc(sk, val.spt_assoc_id);
7200 if (!asoc && val.spt_assoc_id != SCTP_FUTURE_ASSOC &&
7201 sctp_style(sk, UDP))
7202 return -EINVAL;
7203
7204 if (asoc) {
7205 val.spt_pathpfthld = asoc->pf_retrans;
7206 val.spt_pathmaxrxt = asoc->pathmaxrxt;
7207 } else {
7208 struct sctp_sock *sp = sctp_sk(sk);
7209
7210 val.spt_pathpfthld = sp->pf_retrans;
7211 val.spt_pathmaxrxt = sp->pathmaxrxt;
7212 }
7213
7214out:
7215 if (put_user(len, optlen) || copy_to_user(optval, &val, len))
7216 return -EFAULT;
7217
7218 return 0;
7219}
7220
7221
7222
7223
7224
7225
7226
7227static int sctp_getsockopt_assoc_stats(struct sock *sk, int len,
7228 char __user *optval,
7229 int __user *optlen)
7230{
7231 struct sctp_assoc_stats sas;
7232 struct sctp_association *asoc = NULL;
7233
7234
7235 if (len < sizeof(sctp_assoc_t))
7236 return -EINVAL;
7237
7238
7239 len = min_t(size_t, len, sizeof(sas));
7240
7241 if (copy_from_user(&sas, optval, len))
7242 return -EFAULT;
7243
7244 asoc = sctp_id2assoc(sk, sas.sas_assoc_id);
7245 if (!asoc)
7246 return -EINVAL;
7247
7248 sas.sas_rtxchunks = asoc->stats.rtxchunks;
7249 sas.sas_gapcnt = asoc->stats.gapcnt;
7250 sas.sas_outofseqtsns = asoc->stats.outofseqtsns;
7251 sas.sas_osacks = asoc->stats.osacks;
7252 sas.sas_isacks = asoc->stats.isacks;
7253 sas.sas_octrlchunks = asoc->stats.octrlchunks;
7254 sas.sas_ictrlchunks = asoc->stats.ictrlchunks;
7255 sas.sas_oodchunks = asoc->stats.oodchunks;
7256 sas.sas_iodchunks = asoc->stats.iodchunks;
7257 sas.sas_ouodchunks = asoc->stats.ouodchunks;
7258 sas.sas_iuodchunks = asoc->stats.iuodchunks;
7259 sas.sas_idupchunks = asoc->stats.idupchunks;
7260 sas.sas_opackets = asoc->stats.opackets;
7261 sas.sas_ipackets = asoc->stats.ipackets;
7262
7263
7264
7265
7266
7267 sas.sas_maxrto = asoc->stats.max_obs_rto;
7268 memcpy(&sas.sas_obs_rto_ipaddr, &asoc->stats.obs_rto_ipaddr,
7269 sizeof(struct sockaddr_storage));
7270
7271
7272 asoc->stats.max_obs_rto = asoc->rto_min;
7273
7274 if (put_user(len, optlen))
7275 return -EFAULT;
7276
7277 pr_debug("%s: len:%d, assoc_id:%d\n", __func__, len, sas.sas_assoc_id);
7278
7279 if (copy_to_user(optval, &sas, len))
7280 return -EFAULT;
7281
7282 return 0;
7283}
7284
7285static int sctp_getsockopt_recvrcvinfo(struct sock *sk, int len,
7286 char __user *optval,
7287 int __user *optlen)
7288{
7289 int val = 0;
7290
7291 if (len < sizeof(int))
7292 return -EINVAL;
7293
7294 len = sizeof(int);
7295 if (sctp_sk(sk)->recvrcvinfo)
7296 val = 1;
7297 if (put_user(len, optlen))
7298 return -EFAULT;
7299 if (copy_to_user(optval, &val, len))
7300 return -EFAULT;
7301
7302 return 0;
7303}
7304
7305static int sctp_getsockopt_recvnxtinfo(struct sock *sk, int len,
7306 char __user *optval,
7307 int __user *optlen)
7308{
7309 int val = 0;
7310
7311 if (len < sizeof(int))
7312 return -EINVAL;
7313
7314 len = sizeof(int);
7315 if (sctp_sk(sk)->recvnxtinfo)
7316 val = 1;
7317 if (put_user(len, optlen))
7318 return -EFAULT;
7319 if (copy_to_user(optval, &val, len))
7320 return -EFAULT;
7321
7322 return 0;
7323}
7324
7325static int sctp_getsockopt_pr_supported(struct sock *sk, int len,
7326 char __user *optval,
7327 int __user *optlen)
7328{
7329 struct sctp_assoc_value params;
7330 struct sctp_association *asoc;
7331 int retval = -EFAULT;
7332
7333 if (len < sizeof(params)) {
7334 retval = -EINVAL;
7335 goto out;
7336 }
7337
7338 len = sizeof(params);
7339 if (copy_from_user(¶ms, optval, len))
7340 goto out;
7341
7342 asoc = sctp_id2assoc(sk, params.assoc_id);
7343 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
7344 sctp_style(sk, UDP)) {
7345 retval = -EINVAL;
7346 goto out;
7347 }
7348
7349 params.assoc_value = asoc ? asoc->peer.prsctp_capable
7350 : sctp_sk(sk)->ep->prsctp_enable;
7351
7352 if (put_user(len, optlen))
7353 goto out;
7354
7355 if (copy_to_user(optval, ¶ms, len))
7356 goto out;
7357
7358 retval = 0;
7359
7360out:
7361 return retval;
7362}
7363
7364static int sctp_getsockopt_default_prinfo(struct sock *sk, int len,
7365 char __user *optval,
7366 int __user *optlen)
7367{
7368 struct sctp_default_prinfo info;
7369 struct sctp_association *asoc;
7370 int retval = -EFAULT;
7371
7372 if (len < sizeof(info)) {
7373 retval = -EINVAL;
7374 goto out;
7375 }
7376
7377 len = sizeof(info);
7378 if (copy_from_user(&info, optval, len))
7379 goto out;
7380
7381 asoc = sctp_id2assoc(sk, info.pr_assoc_id);
7382 if (!asoc && info.pr_assoc_id != SCTP_FUTURE_ASSOC &&
7383 sctp_style(sk, UDP)) {
7384 retval = -EINVAL;
7385 goto out;
7386 }
7387
7388 if (asoc) {
7389 info.pr_policy = SCTP_PR_POLICY(asoc->default_flags);
7390 info.pr_value = asoc->default_timetolive;
7391 } else {
7392 struct sctp_sock *sp = sctp_sk(sk);
7393
7394 info.pr_policy = SCTP_PR_POLICY(sp->default_flags);
7395 info.pr_value = sp->default_timetolive;
7396 }
7397
7398 if (put_user(len, optlen))
7399 goto out;
7400
7401 if (copy_to_user(optval, &info, len))
7402 goto out;
7403
7404 retval = 0;
7405
7406out:
7407 return retval;
7408}
7409
7410static int sctp_getsockopt_pr_assocstatus(struct sock *sk, int len,
7411 char __user *optval,
7412 int __user *optlen)
7413{
7414 struct sctp_prstatus params;
7415 struct sctp_association *asoc;
7416 int policy;
7417 int retval = -EINVAL;
7418
7419 if (len < sizeof(params))
7420 goto out;
7421
7422 len = sizeof(params);
7423 if (copy_from_user(¶ms, optval, len)) {
7424 retval = -EFAULT;
7425 goto out;
7426 }
7427
7428 policy = params.sprstat_policy;
7429 if (!policy || (policy & ~(SCTP_PR_SCTP_MASK | SCTP_PR_SCTP_ALL)) ||
7430 ((policy & SCTP_PR_SCTP_ALL) && (policy & SCTP_PR_SCTP_MASK)))
7431 goto out;
7432
7433 asoc = sctp_id2assoc(sk, params.sprstat_assoc_id);
7434 if (!asoc)
7435 goto out;
7436
7437 if (policy == SCTP_PR_SCTP_ALL) {
7438 params.sprstat_abandoned_unsent = 0;
7439 params.sprstat_abandoned_sent = 0;
7440 for (policy = 0; policy <= SCTP_PR_INDEX(MAX); policy++) {
7441 params.sprstat_abandoned_unsent +=
7442 asoc->abandoned_unsent[policy];
7443 params.sprstat_abandoned_sent +=
7444 asoc->abandoned_sent[policy];
7445 }
7446 } else {
7447 params.sprstat_abandoned_unsent =
7448 asoc->abandoned_unsent[__SCTP_PR_INDEX(policy)];
7449 params.sprstat_abandoned_sent =
7450 asoc->abandoned_sent[__SCTP_PR_INDEX(policy)];
7451 }
7452
7453 if (put_user(len, optlen)) {
7454 retval = -EFAULT;
7455 goto out;
7456 }
7457
7458 if (copy_to_user(optval, ¶ms, len)) {
7459 retval = -EFAULT;
7460 goto out;
7461 }
7462
7463 retval = 0;
7464
7465out:
7466 return retval;
7467}
7468
7469static int sctp_getsockopt_pr_streamstatus(struct sock *sk, int len,
7470 char __user *optval,
7471 int __user *optlen)
7472{
7473 struct sctp_stream_out_ext *streamoute;
7474 struct sctp_association *asoc;
7475 struct sctp_prstatus params;
7476 int retval = -EINVAL;
7477 int policy;
7478
7479 if (len < sizeof(params))
7480 goto out;
7481
7482 len = sizeof(params);
7483 if (copy_from_user(¶ms, optval, len)) {
7484 retval = -EFAULT;
7485 goto out;
7486 }
7487
7488 policy = params.sprstat_policy;
7489 if (!policy || (policy & ~(SCTP_PR_SCTP_MASK | SCTP_PR_SCTP_ALL)) ||
7490 ((policy & SCTP_PR_SCTP_ALL) && (policy & SCTP_PR_SCTP_MASK)))
7491 goto out;
7492
7493 asoc = sctp_id2assoc(sk, params.sprstat_assoc_id);
7494 if (!asoc || params.sprstat_sid >= asoc->stream.outcnt)
7495 goto out;
7496
7497 streamoute = SCTP_SO(&asoc->stream, params.sprstat_sid)->ext;
7498 if (!streamoute) {
7499
7500 params.sprstat_abandoned_unsent = 0;
7501 params.sprstat_abandoned_sent = 0;
7502 retval = 0;
7503 goto out;
7504 }
7505
7506 if (policy == SCTP_PR_SCTP_ALL) {
7507 params.sprstat_abandoned_unsent = 0;
7508 params.sprstat_abandoned_sent = 0;
7509 for (policy = 0; policy <= SCTP_PR_INDEX(MAX); policy++) {
7510 params.sprstat_abandoned_unsent +=
7511 streamoute->abandoned_unsent[policy];
7512 params.sprstat_abandoned_sent +=
7513 streamoute->abandoned_sent[policy];
7514 }
7515 } else {
7516 params.sprstat_abandoned_unsent =
7517 streamoute->abandoned_unsent[__SCTP_PR_INDEX(policy)];
7518 params.sprstat_abandoned_sent =
7519 streamoute->abandoned_sent[__SCTP_PR_INDEX(policy)];
7520 }
7521
7522 if (put_user(len, optlen) || copy_to_user(optval, ¶ms, len)) {
7523 retval = -EFAULT;
7524 goto out;
7525 }
7526
7527 retval = 0;
7528
7529out:
7530 return retval;
7531}
7532
7533static int sctp_getsockopt_reconfig_supported(struct sock *sk, int len,
7534 char __user *optval,
7535 int __user *optlen)
7536{
7537 struct sctp_assoc_value params;
7538 struct sctp_association *asoc;
7539 int retval = -EFAULT;
7540
7541 if (len < sizeof(params)) {
7542 retval = -EINVAL;
7543 goto out;
7544 }
7545
7546 len = sizeof(params);
7547 if (copy_from_user(¶ms, optval, len))
7548 goto out;
7549
7550 asoc = sctp_id2assoc(sk, params.assoc_id);
7551 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
7552 sctp_style(sk, UDP)) {
7553 retval = -EINVAL;
7554 goto out;
7555 }
7556
7557 params.assoc_value = asoc ? asoc->peer.reconf_capable
7558 : sctp_sk(sk)->ep->reconf_enable;
7559
7560 if (put_user(len, optlen))
7561 goto out;
7562
7563 if (copy_to_user(optval, ¶ms, len))
7564 goto out;
7565
7566 retval = 0;
7567
7568out:
7569 return retval;
7570}
7571
7572static int sctp_getsockopt_enable_strreset(struct sock *sk, int len,
7573 char __user *optval,
7574 int __user *optlen)
7575{
7576 struct sctp_assoc_value params;
7577 struct sctp_association *asoc;
7578 int retval = -EFAULT;
7579
7580 if (len < sizeof(params)) {
7581 retval = -EINVAL;
7582 goto out;
7583 }
7584
7585 len = sizeof(params);
7586 if (copy_from_user(¶ms, optval, len))
7587 goto out;
7588
7589 asoc = sctp_id2assoc(sk, params.assoc_id);
7590 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
7591 sctp_style(sk, UDP)) {
7592 retval = -EINVAL;
7593 goto out;
7594 }
7595
7596 params.assoc_value = asoc ? asoc->strreset_enable
7597 : sctp_sk(sk)->ep->strreset_enable;
7598
7599 if (put_user(len, optlen))
7600 goto out;
7601
7602 if (copy_to_user(optval, ¶ms, len))
7603 goto out;
7604
7605 retval = 0;
7606
7607out:
7608 return retval;
7609}
7610
7611static int sctp_getsockopt_scheduler(struct sock *sk, int len,
7612 char __user *optval,
7613 int __user *optlen)
7614{
7615 struct sctp_assoc_value params;
7616 struct sctp_association *asoc;
7617 int retval = -EFAULT;
7618
7619 if (len < sizeof(params)) {
7620 retval = -EINVAL;
7621 goto out;
7622 }
7623
7624 len = sizeof(params);
7625 if (copy_from_user(¶ms, optval, len))
7626 goto out;
7627
7628 asoc = sctp_id2assoc(sk, params.assoc_id);
7629 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
7630 sctp_style(sk, UDP)) {
7631 retval = -EINVAL;
7632 goto out;
7633 }
7634
7635 params.assoc_value = asoc ? sctp_sched_get_sched(asoc)
7636 : sctp_sk(sk)->default_ss;
7637
7638 if (put_user(len, optlen))
7639 goto out;
7640
7641 if (copy_to_user(optval, ¶ms, len))
7642 goto out;
7643
7644 retval = 0;
7645
7646out:
7647 return retval;
7648}
7649
7650static int sctp_getsockopt_scheduler_value(struct sock *sk, int len,
7651 char __user *optval,
7652 int __user *optlen)
7653{
7654 struct sctp_stream_value params;
7655 struct sctp_association *asoc;
7656 int retval = -EFAULT;
7657
7658 if (len < sizeof(params)) {
7659 retval = -EINVAL;
7660 goto out;
7661 }
7662
7663 len = sizeof(params);
7664 if (copy_from_user(¶ms, optval, len))
7665 goto out;
7666
7667 asoc = sctp_id2assoc(sk, params.assoc_id);
7668 if (!asoc) {
7669 retval = -EINVAL;
7670 goto out;
7671 }
7672
7673 retval = sctp_sched_get_value(asoc, params.stream_id,
7674 ¶ms.stream_value);
7675 if (retval)
7676 goto out;
7677
7678 if (put_user(len, optlen)) {
7679 retval = -EFAULT;
7680 goto out;
7681 }
7682
7683 if (copy_to_user(optval, ¶ms, len)) {
7684 retval = -EFAULT;
7685 goto out;
7686 }
7687
7688out:
7689 return retval;
7690}
7691
7692static int sctp_getsockopt_interleaving_supported(struct sock *sk, int len,
7693 char __user *optval,
7694 int __user *optlen)
7695{
7696 struct sctp_assoc_value params;
7697 struct sctp_association *asoc;
7698 int retval = -EFAULT;
7699
7700 if (len < sizeof(params)) {
7701 retval = -EINVAL;
7702 goto out;
7703 }
7704
7705 len = sizeof(params);
7706 if (copy_from_user(¶ms, optval, len))
7707 goto out;
7708
7709 asoc = sctp_id2assoc(sk, params.assoc_id);
7710 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
7711 sctp_style(sk, UDP)) {
7712 retval = -EINVAL;
7713 goto out;
7714 }
7715
7716 params.assoc_value = asoc ? asoc->peer.intl_capable
7717 : sctp_sk(sk)->ep->intl_enable;
7718
7719 if (put_user(len, optlen))
7720 goto out;
7721
7722 if (copy_to_user(optval, ¶ms, len))
7723 goto out;
7724
7725 retval = 0;
7726
7727out:
7728 return retval;
7729}
7730
7731static int sctp_getsockopt_reuse_port(struct sock *sk, int len,
7732 char __user *optval,
7733 int __user *optlen)
7734{
7735 int val;
7736
7737 if (len < sizeof(int))
7738 return -EINVAL;
7739
7740 len = sizeof(int);
7741 val = sctp_sk(sk)->reuse;
7742 if (put_user(len, optlen))
7743 return -EFAULT;
7744
7745 if (copy_to_user(optval, &val, len))
7746 return -EFAULT;
7747
7748 return 0;
7749}
7750
7751static int sctp_getsockopt_event(struct sock *sk, int len, char __user *optval,
7752 int __user *optlen)
7753{
7754 struct sctp_association *asoc;
7755 struct sctp_event param;
7756 __u16 subscribe;
7757
7758 if (len < sizeof(param))
7759 return -EINVAL;
7760
7761 len = sizeof(param);
7762 if (copy_from_user(¶m, optval, len))
7763 return -EFAULT;
7764
7765 if (param.se_type < SCTP_SN_TYPE_BASE ||
7766 param.se_type > SCTP_SN_TYPE_MAX)
7767 return -EINVAL;
7768
7769 asoc = sctp_id2assoc(sk, param.se_assoc_id);
7770 if (!asoc && param.se_assoc_id != SCTP_FUTURE_ASSOC &&
7771 sctp_style(sk, UDP))
7772 return -EINVAL;
7773
7774 subscribe = asoc ? asoc->subscribe : sctp_sk(sk)->subscribe;
7775 param.se_on = sctp_ulpevent_type_enabled(subscribe, param.se_type);
7776
7777 if (put_user(len, optlen))
7778 return -EFAULT;
7779
7780 if (copy_to_user(optval, ¶m, len))
7781 return -EFAULT;
7782
7783 return 0;
7784}
7785
7786static int sctp_getsockopt_asconf_supported(struct sock *sk, int len,
7787 char __user *optval,
7788 int __user *optlen)
7789{
7790 struct sctp_assoc_value params;
7791 struct sctp_association *asoc;
7792 int retval = -EFAULT;
7793
7794 if (len < sizeof(params)) {
7795 retval = -EINVAL;
7796 goto out;
7797 }
7798
7799 len = sizeof(params);
7800 if (copy_from_user(¶ms, optval, len))
7801 goto out;
7802
7803 asoc = sctp_id2assoc(sk, params.assoc_id);
7804 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
7805 sctp_style(sk, UDP)) {
7806 retval = -EINVAL;
7807 goto out;
7808 }
7809
7810 params.assoc_value = asoc ? asoc->peer.asconf_capable
7811 : sctp_sk(sk)->ep->asconf_enable;
7812
7813 if (put_user(len, optlen))
7814 goto out;
7815
7816 if (copy_to_user(optval, ¶ms, len))
7817 goto out;
7818
7819 retval = 0;
7820
7821out:
7822 return retval;
7823}
7824
7825static int sctp_getsockopt_auth_supported(struct sock *sk, int len,
7826 char __user *optval,
7827 int __user *optlen)
7828{
7829 struct sctp_assoc_value params;
7830 struct sctp_association *asoc;
7831 int retval = -EFAULT;
7832
7833 if (len < sizeof(params)) {
7834 retval = -EINVAL;
7835 goto out;
7836 }
7837
7838 len = sizeof(params);
7839 if (copy_from_user(¶ms, optval, len))
7840 goto out;
7841
7842 asoc = sctp_id2assoc(sk, params.assoc_id);
7843 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
7844 sctp_style(sk, UDP)) {
7845 retval = -EINVAL;
7846 goto out;
7847 }
7848
7849 params.assoc_value = asoc ? asoc->peer.auth_capable
7850 : sctp_sk(sk)->ep->auth_enable;
7851
7852 if (put_user(len, optlen))
7853 goto out;
7854
7855 if (copy_to_user(optval, ¶ms, len))
7856 goto out;
7857
7858 retval = 0;
7859
7860out:
7861 return retval;
7862}
7863
7864static int sctp_getsockopt_ecn_supported(struct sock *sk, int len,
7865 char __user *optval,
7866 int __user *optlen)
7867{
7868 struct sctp_assoc_value params;
7869 struct sctp_association *asoc;
7870 int retval = -EFAULT;
7871
7872 if (len < sizeof(params)) {
7873 retval = -EINVAL;
7874 goto out;
7875 }
7876
7877 len = sizeof(params);
7878 if (copy_from_user(¶ms, optval, len))
7879 goto out;
7880
7881 asoc = sctp_id2assoc(sk, params.assoc_id);
7882 if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
7883 sctp_style(sk, UDP)) {
7884 retval = -EINVAL;
7885 goto out;
7886 }
7887
7888 params.assoc_value = asoc ? asoc->peer.ecn_capable
7889 : sctp_sk(sk)->ep->ecn_enable;
7890
7891 if (put_user(len, optlen))
7892 goto out;
7893
7894 if (copy_to_user(optval, ¶ms, len))
7895 goto out;
7896
7897 retval = 0;
7898
7899out:
7900 return retval;
7901}
7902
7903static int sctp_getsockopt(struct sock *sk, int level, int optname,
7904 char __user *optval, int __user *optlen)
7905{
7906 int retval = 0;
7907 int len;
7908
7909 pr_debug("%s: sk:%p, optname:%d\n", __func__, sk, optname);
7910
7911
7912
7913
7914
7915
7916
7917 if (level != SOL_SCTP) {
7918 struct sctp_af *af = sctp_sk(sk)->pf->af;
7919
7920 retval = af->getsockopt(sk, level, optname, optval, optlen);
7921 return retval;
7922 }
7923
7924 if (get_user(len, optlen))
7925 return -EFAULT;
7926
7927 if (len < 0)
7928 return -EINVAL;
7929
7930 lock_sock(sk);
7931
7932 switch (optname) {
7933 case SCTP_STATUS:
7934 retval = sctp_getsockopt_sctp_status(sk, len, optval, optlen);
7935 break;
7936 case SCTP_DISABLE_FRAGMENTS:
7937 retval = sctp_getsockopt_disable_fragments(sk, len, optval,
7938 optlen);
7939 break;
7940 case SCTP_EVENTS:
7941 retval = sctp_getsockopt_events(sk, len, optval, optlen);
7942 break;
7943 case SCTP_AUTOCLOSE:
7944 retval = sctp_getsockopt_autoclose(sk, len, optval, optlen);
7945 break;
7946 case SCTP_SOCKOPT_PEELOFF:
7947 retval = sctp_getsockopt_peeloff(sk, len, optval, optlen);
7948 break;
7949 case SCTP_SOCKOPT_PEELOFF_FLAGS:
7950 retval = sctp_getsockopt_peeloff_flags(sk, len, optval, optlen);
7951 break;
7952 case SCTP_PEER_ADDR_PARAMS:
7953 retval = sctp_getsockopt_peer_addr_params(sk, len, optval,
7954 optlen);
7955 break;
7956 case SCTP_DELAYED_SACK:
7957 retval = sctp_getsockopt_delayed_ack(sk, len, optval,
7958 optlen);
7959 break;
7960 case SCTP_INITMSG:
7961 retval = sctp_getsockopt_initmsg(sk, len, optval, optlen);
7962 break;
7963 case SCTP_GET_PEER_ADDRS:
7964 retval = sctp_getsockopt_peer_addrs(sk, len, optval,
7965 optlen);
7966 break;
7967 case SCTP_GET_LOCAL_ADDRS:
7968 retval = sctp_getsockopt_local_addrs(sk, len, optval,
7969 optlen);
7970 break;
7971 case SCTP_SOCKOPT_CONNECTX3:
7972 retval = sctp_getsockopt_connectx3(sk, len, optval, optlen);
7973 break;
7974 case SCTP_DEFAULT_SEND_PARAM:
7975 retval = sctp_getsockopt_default_send_param(sk, len,
7976 optval, optlen);
7977 break;
7978 case SCTP_DEFAULT_SNDINFO:
7979 retval = sctp_getsockopt_default_sndinfo(sk, len,
7980 optval, optlen);
7981 break;
7982 case SCTP_PRIMARY_ADDR:
7983 retval = sctp_getsockopt_primary_addr(sk, len, optval, optlen);
7984 break;
7985 case SCTP_NODELAY:
7986 retval = sctp_getsockopt_nodelay(sk, len, optval, optlen);
7987 break;
7988 case SCTP_RTOINFO:
7989 retval = sctp_getsockopt_rtoinfo(sk, len, optval, optlen);
7990 break;
7991 case SCTP_ASSOCINFO:
7992 retval = sctp_getsockopt_associnfo(sk, len, optval, optlen);
7993 break;
7994 case SCTP_I_WANT_MAPPED_V4_ADDR:
7995 retval = sctp_getsockopt_mappedv4(sk, len, optval, optlen);
7996 break;
7997 case SCTP_MAXSEG:
7998 retval = sctp_getsockopt_maxseg(sk, len, optval, optlen);
7999 break;
8000 case SCTP_GET_PEER_ADDR_INFO:
8001 retval = sctp_getsockopt_peer_addr_info(sk, len, optval,
8002 optlen);
8003 break;
8004 case SCTP_ADAPTATION_LAYER:
8005 retval = sctp_getsockopt_adaptation_layer(sk, len, optval,
8006 optlen);
8007 break;
8008 case SCTP_CONTEXT:
8009 retval = sctp_getsockopt_context(sk, len, optval, optlen);
8010 break;
8011 case SCTP_FRAGMENT_INTERLEAVE:
8012 retval = sctp_getsockopt_fragment_interleave(sk, len, optval,
8013 optlen);
8014 break;
8015 case SCTP_PARTIAL_DELIVERY_POINT:
8016 retval = sctp_getsockopt_partial_delivery_point(sk, len, optval,
8017 optlen);
8018 break;
8019 case SCTP_MAX_BURST:
8020 retval = sctp_getsockopt_maxburst(sk, len, optval, optlen);
8021 break;
8022 case SCTP_AUTH_KEY:
8023 case SCTP_AUTH_CHUNK:
8024 case SCTP_AUTH_DELETE_KEY:
8025 case SCTP_AUTH_DEACTIVATE_KEY:
8026 retval = -EOPNOTSUPP;
8027 break;
8028 case SCTP_HMAC_IDENT:
8029 retval = sctp_getsockopt_hmac_ident(sk, len, optval, optlen);
8030 break;
8031 case SCTP_AUTH_ACTIVE_KEY:
8032 retval = sctp_getsockopt_active_key(sk, len, optval, optlen);
8033 break;
8034 case SCTP_PEER_AUTH_CHUNKS:
8035 retval = sctp_getsockopt_peer_auth_chunks(sk, len, optval,
8036 optlen);
8037 break;
8038 case SCTP_LOCAL_AUTH_CHUNKS:
8039 retval = sctp_getsockopt_local_auth_chunks(sk, len, optval,
8040 optlen);
8041 break;
8042 case SCTP_GET_ASSOC_NUMBER:
8043 retval = sctp_getsockopt_assoc_number(sk, len, optval, optlen);
8044 break;
8045 case SCTP_GET_ASSOC_ID_LIST:
8046 retval = sctp_getsockopt_assoc_ids(sk, len, optval, optlen);
8047 break;
8048 case SCTP_AUTO_ASCONF:
8049 retval = sctp_getsockopt_auto_asconf(sk, len, optval, optlen);
8050 break;
8051 case SCTP_PEER_ADDR_THLDS:
8052 retval = sctp_getsockopt_paddr_thresholds(sk, optval, len, optlen);
8053 break;
8054 case SCTP_GET_ASSOC_STATS:
8055 retval = sctp_getsockopt_assoc_stats(sk, len, optval, optlen);
8056 break;
8057 case SCTP_RECVRCVINFO:
8058 retval = sctp_getsockopt_recvrcvinfo(sk, len, optval, optlen);
8059 break;
8060 case SCTP_RECVNXTINFO:
8061 retval = sctp_getsockopt_recvnxtinfo(sk, len, optval, optlen);
8062 break;
8063 case SCTP_PR_SUPPORTED:
8064 retval = sctp_getsockopt_pr_supported(sk, len, optval, optlen);
8065 break;
8066 case SCTP_DEFAULT_PRINFO:
8067 retval = sctp_getsockopt_default_prinfo(sk, len, optval,
8068 optlen);
8069 break;
8070 case SCTP_PR_ASSOC_STATUS:
8071 retval = sctp_getsockopt_pr_assocstatus(sk, len, optval,
8072 optlen);
8073 break;
8074 case SCTP_PR_STREAM_STATUS:
8075 retval = sctp_getsockopt_pr_streamstatus(sk, len, optval,
8076 optlen);
8077 break;
8078 case SCTP_RECONFIG_SUPPORTED:
8079 retval = sctp_getsockopt_reconfig_supported(sk, len, optval,
8080 optlen);
8081 break;
8082 case SCTP_ENABLE_STREAM_RESET:
8083 retval = sctp_getsockopt_enable_strreset(sk, len, optval,
8084 optlen);
8085 break;
8086 case SCTP_STREAM_SCHEDULER:
8087 retval = sctp_getsockopt_scheduler(sk, len, optval,
8088 optlen);
8089 break;
8090 case SCTP_STREAM_SCHEDULER_VALUE:
8091 retval = sctp_getsockopt_scheduler_value(sk, len, optval,
8092 optlen);
8093 break;
8094 case SCTP_INTERLEAVING_SUPPORTED:
8095 retval = sctp_getsockopt_interleaving_supported(sk, len, optval,
8096 optlen);
8097 break;
8098 case SCTP_REUSE_PORT:
8099 retval = sctp_getsockopt_reuse_port(sk, len, optval, optlen);
8100 break;
8101 case SCTP_EVENT:
8102 retval = sctp_getsockopt_event(sk, len, optval, optlen);
8103 break;
8104 case SCTP_ASCONF_SUPPORTED:
8105 retval = sctp_getsockopt_asconf_supported(sk, len, optval,
8106 optlen);
8107 break;
8108 case SCTP_AUTH_SUPPORTED:
8109 retval = sctp_getsockopt_auth_supported(sk, len, optval,
8110 optlen);
8111 break;
8112 case SCTP_ECN_SUPPORTED:
8113 retval = sctp_getsockopt_ecn_supported(sk, len, optval, optlen);
8114 break;
8115 default:
8116 retval = -ENOPROTOOPT;
8117 break;
8118 }
8119
8120 release_sock(sk);
8121 return retval;
8122}
8123
8124static int sctp_hash(struct sock *sk)
8125{
8126
8127 return 0;
8128}
8129
8130static void sctp_unhash(struct sock *sk)
8131{
8132
8133}
8134
8135
8136
8137
8138
8139
8140
8141
8142
8143
8144
8145
8146
8147static struct sctp_bind_bucket *sctp_bucket_create(
8148 struct sctp_bind_hashbucket *head, struct net *, unsigned short snum);
8149
8150static int sctp_get_port_local(struct sock *sk, union sctp_addr *addr)
8151{
8152 struct sctp_sock *sp = sctp_sk(sk);
8153 bool reuse = (sk->sk_reuse || sp->reuse);
8154 struct sctp_bind_hashbucket *head;
8155 kuid_t uid = sock_i_uid(sk);
8156 struct sctp_bind_bucket *pp;
8157 unsigned short snum;
8158 int ret;
8159
8160 snum = ntohs(addr->v4.sin_port);
8161
8162 pr_debug("%s: begins, snum:%d\n", __func__, snum);
8163
8164 local_bh_disable();
8165
8166 if (snum == 0) {
8167
8168 int low, high, remaining, index;
8169 unsigned int rover;
8170 struct net *net = sock_net(sk);
8171
8172 inet_get_local_port_range(net, &low, &high);
8173 remaining = (high - low) + 1;
8174 rover = prandom_u32() % remaining + low;
8175
8176 do {
8177 rover++;
8178 if ((rover < low) || (rover > high))
8179 rover = low;
8180 if (inet_is_local_reserved_port(net, rover))
8181 continue;
8182 index = sctp_phashfn(sock_net(sk), rover);
8183 head = &sctp_port_hashtable[index];
8184 spin_lock(&head->lock);
8185 sctp_for_each_hentry(pp, &head->chain)
8186 if ((pp->port == rover) &&
8187 net_eq(sock_net(sk), pp->net))
8188 goto next;
8189 break;
8190 next:
8191 spin_unlock(&head->lock);
8192 } while (--remaining > 0);
8193
8194
8195 ret = 1;
8196 if (remaining <= 0)
8197 goto fail;
8198
8199
8200
8201
8202
8203 snum = rover;
8204 } else {
8205
8206
8207
8208
8209
8210
8211 head = &sctp_port_hashtable[sctp_phashfn(sock_net(sk), snum)];
8212 spin_lock(&head->lock);
8213 sctp_for_each_hentry(pp, &head->chain) {
8214 if ((pp->port == snum) && net_eq(pp->net, sock_net(sk)))
8215 goto pp_found;
8216 }
8217 }
8218 pp = NULL;
8219 goto pp_not_found;
8220pp_found:
8221 if (!hlist_empty(&pp->owner)) {
8222
8223
8224
8225
8226
8227 struct sock *sk2;
8228
8229 pr_debug("%s: found a possible match\n", __func__);
8230
8231 if ((pp->fastreuse && reuse &&
8232 sk->sk_state != SCTP_SS_LISTENING) ||
8233 (pp->fastreuseport && sk->sk_reuseport &&
8234 uid_eq(pp->fastuid, uid)))
8235 goto success;
8236
8237
8238
8239
8240
8241
8242
8243
8244
8245
8246
8247 sk_for_each_bound(sk2, &pp->owner) {
8248 struct sctp_sock *sp2 = sctp_sk(sk2);
8249 struct sctp_endpoint *ep2 = sp2->ep;
8250
8251 if (sk == sk2 ||
8252 (reuse && (sk2->sk_reuse || sp2->reuse) &&
8253 sk2->sk_state != SCTP_SS_LISTENING) ||
8254 (sk->sk_reuseport && sk2->sk_reuseport &&
8255 uid_eq(uid, sock_i_uid(sk2))))
8256 continue;
8257
8258 if (sctp_bind_addr_conflict(&ep2->base.bind_addr,
8259 addr, sp2, sp)) {
8260 ret = 1;
8261 goto fail_unlock;
8262 }
8263 }
8264
8265 pr_debug("%s: found a match\n", __func__);
8266 }
8267pp_not_found:
8268
8269 ret = 1;
8270 if (!pp && !(pp = sctp_bucket_create(head, sock_net(sk), snum)))
8271 goto fail_unlock;
8272
8273
8274
8275
8276
8277 if (hlist_empty(&pp->owner)) {
8278 if (reuse && sk->sk_state != SCTP_SS_LISTENING)
8279 pp->fastreuse = 1;
8280 else
8281 pp->fastreuse = 0;
8282
8283 if (sk->sk_reuseport) {
8284 pp->fastreuseport = 1;
8285 pp->fastuid = uid;
8286 } else {
8287 pp->fastreuseport = 0;
8288 }
8289 } else {
8290 if (pp->fastreuse &&
8291 (!reuse || sk->sk_state == SCTP_SS_LISTENING))
8292 pp->fastreuse = 0;
8293
8294 if (pp->fastreuseport &&
8295 (!sk->sk_reuseport || !uid_eq(pp->fastuid, uid)))
8296 pp->fastreuseport = 0;
8297 }
8298
8299
8300
8301
8302
8303success:
8304 if (!sp->bind_hash) {
8305 inet_sk(sk)->inet_num = snum;
8306 sk_add_bind_node(sk, &pp->owner);
8307 sp->bind_hash = pp;
8308 }
8309 ret = 0;
8310
8311fail_unlock:
8312 spin_unlock(&head->lock);
8313
8314fail:
8315 local_bh_enable();
8316 return ret;
8317}
8318
8319
8320
8321
8322static int sctp_get_port(struct sock *sk, unsigned short snum)
8323{
8324 union sctp_addr addr;
8325 struct sctp_af *af = sctp_sk(sk)->pf->af;
8326
8327
8328 af->from_sk(&addr, sk);
8329 addr.v4.sin_port = htons(snum);
8330
8331
8332 return sctp_get_port_local(sk, &addr);
8333}
8334
8335
8336
8337
8338static int sctp_listen_start(struct sock *sk, int backlog)
8339{
8340 struct sctp_sock *sp = sctp_sk(sk);
8341 struct sctp_endpoint *ep = sp->ep;
8342 struct crypto_shash *tfm = NULL;
8343 char alg[32];
8344
8345
8346 if (!sp->hmac && sp->sctp_hmac_alg) {
8347 sprintf(alg, "hmac(%s)", sp->sctp_hmac_alg);
8348 tfm = crypto_alloc_shash(alg, 0, 0);
8349 if (IS_ERR(tfm)) {
8350 net_info_ratelimited("failed to load transform for %s: %ld\n",
8351 sp->sctp_hmac_alg, PTR_ERR(tfm));
8352 return -ENOSYS;
8353 }
8354 sctp_sk(sk)->hmac = tfm;
8355 }
8356
8357
8358
8359
8360
8361
8362
8363
8364
8365
8366
8367
8368 inet_sk_set_state(sk, SCTP_SS_LISTENING);
8369 if (!ep->base.bind_addr.port) {
8370 if (sctp_autobind(sk))
8371 return -EAGAIN;
8372 } else {
8373 if (sctp_get_port(sk, inet_sk(sk)->inet_num)) {
8374 inet_sk_set_state(sk, SCTP_SS_CLOSED);
8375 return -EADDRINUSE;
8376 }
8377 }
8378
8379 sk->sk_max_ack_backlog = backlog;
8380 return sctp_hash_endpoint(ep);
8381}
8382
8383
8384
8385
8386
8387
8388
8389
8390
8391
8392
8393
8394
8395
8396
8397int sctp_inet_listen(struct socket *sock, int backlog)
8398{
8399 struct sock *sk = sock->sk;
8400 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
8401 int err = -EINVAL;
8402
8403 if (unlikely(backlog < 0))
8404 return err;
8405
8406 lock_sock(sk);
8407
8408
8409 if (sctp_style(sk, UDP_HIGH_BANDWIDTH))
8410 goto out;
8411
8412 if (sock->state != SS_UNCONNECTED)
8413 goto out;
8414
8415 if (!sctp_sstate(sk, LISTENING) && !sctp_sstate(sk, CLOSED))
8416 goto out;
8417
8418
8419 if (!backlog) {
8420 if (sctp_sstate(sk, CLOSED))
8421 goto out;
8422
8423 err = 0;
8424 sctp_unhash_endpoint(ep);
8425 sk->sk_state = SCTP_SS_CLOSED;
8426 if (sk->sk_reuse || sctp_sk(sk)->reuse)
8427 sctp_sk(sk)->bind_hash->fastreuse = 1;
8428 goto out;
8429 }
8430
8431
8432 if (sctp_sstate(sk, LISTENING))
8433 sk->sk_max_ack_backlog = backlog;
8434 else {
8435 err = sctp_listen_start(sk, backlog);
8436 if (err)
8437 goto out;
8438 }
8439
8440 err = 0;
8441out:
8442 release_sock(sk);
8443 return err;
8444}
8445
8446
8447
8448
8449
8450
8451
8452
8453
8454
8455
8456
8457
8458
8459__poll_t sctp_poll(struct file *file, struct socket *sock, poll_table *wait)
8460{
8461 struct sock *sk = sock->sk;
8462 struct sctp_sock *sp = sctp_sk(sk);
8463 __poll_t mask;
8464
8465 poll_wait(file, sk_sleep(sk), wait);
8466
8467 sock_rps_record_flow(sk);
8468
8469
8470
8471
8472 if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING))
8473 return (!list_empty(&sp->ep->asocs)) ?
8474 (EPOLLIN | EPOLLRDNORM) : 0;
8475
8476 mask = 0;
8477
8478
8479 if (sk->sk_err || !skb_queue_empty_lockless(&sk->sk_error_queue))
8480 mask |= EPOLLERR |
8481 (sock_flag(sk, SOCK_SELECT_ERR_QUEUE) ? EPOLLPRI : 0);
8482 if (sk->sk_shutdown & RCV_SHUTDOWN)
8483 mask |= EPOLLRDHUP | EPOLLIN | EPOLLRDNORM;
8484 if (sk->sk_shutdown == SHUTDOWN_MASK)
8485 mask |= EPOLLHUP;
8486
8487
8488 if (!skb_queue_empty_lockless(&sk->sk_receive_queue))
8489 mask |= EPOLLIN | EPOLLRDNORM;
8490
8491
8492 if (!sctp_style(sk, UDP) && sctp_sstate(sk, CLOSED))
8493 return mask;
8494
8495
8496 if (sctp_writeable(sk)) {
8497 mask |= EPOLLOUT | EPOLLWRNORM;
8498 } else {
8499 sk_set_bit(SOCKWQ_ASYNC_NOSPACE, sk);
8500
8501
8502
8503
8504
8505
8506
8507
8508 if (sctp_writeable(sk))
8509 mask |= EPOLLOUT | EPOLLWRNORM;
8510 }
8511 return mask;
8512}
8513
8514
8515
8516
8517
8518static struct sctp_bind_bucket *sctp_bucket_create(
8519 struct sctp_bind_hashbucket *head, struct net *net, unsigned short snum)
8520{
8521 struct sctp_bind_bucket *pp;
8522
8523 pp = kmem_cache_alloc(sctp_bucket_cachep, GFP_ATOMIC);
8524 if (pp) {
8525 SCTP_DBG_OBJCNT_INC(bind_bucket);
8526 pp->port = snum;
8527 pp->fastreuse = 0;
8528 INIT_HLIST_HEAD(&pp->owner);
8529 pp->net = net;
8530 hlist_add_head(&pp->node, &head->chain);
8531 }
8532 return pp;
8533}
8534
8535
8536static void sctp_bucket_destroy(struct sctp_bind_bucket *pp)
8537{
8538 if (pp && hlist_empty(&pp->owner)) {
8539 __hlist_del(&pp->node);
8540 kmem_cache_free(sctp_bucket_cachep, pp);
8541 SCTP_DBG_OBJCNT_DEC(bind_bucket);
8542 }
8543}
8544
8545
8546static inline void __sctp_put_port(struct sock *sk)
8547{
8548 struct sctp_bind_hashbucket *head =
8549 &sctp_port_hashtable[sctp_phashfn(sock_net(sk),
8550 inet_sk(sk)->inet_num)];
8551 struct sctp_bind_bucket *pp;
8552
8553 spin_lock(&head->lock);
8554 pp = sctp_sk(sk)->bind_hash;
8555 __sk_del_bind_node(sk);
8556 sctp_sk(sk)->bind_hash = NULL;
8557 inet_sk(sk)->inet_num = 0;
8558 sctp_bucket_destroy(pp);
8559 spin_unlock(&head->lock);
8560}
8561
8562void sctp_put_port(struct sock *sk)
8563{
8564 local_bh_disable();
8565 __sctp_put_port(sk);
8566 local_bh_enable();
8567}
8568
8569
8570
8571
8572
8573
8574
8575static int sctp_autobind(struct sock *sk)
8576{
8577 union sctp_addr autoaddr;
8578 struct sctp_af *af;
8579 __be16 port;
8580
8581
8582 af = sctp_sk(sk)->pf->af;
8583
8584 port = htons(inet_sk(sk)->inet_num);
8585 af->inaddr_any(&autoaddr, port);
8586
8587 return sctp_do_bind(sk, &autoaddr, af->sockaddr_len);
8588}
8589
8590
8591
8592
8593
8594
8595
8596
8597
8598
8599
8600
8601
8602
8603
8604
8605
8606
8607
8608
8609
8610
8611
8612
8613
8614
8615
8616
8617
8618
8619
8620
8621
8622
8623
8624
8625
8626
8627
8628
8629static int sctp_msghdr_parse(const struct msghdr *msg, struct sctp_cmsgs *cmsgs)
8630{
8631 struct msghdr *my_msg = (struct msghdr *)msg;
8632 struct cmsghdr *cmsg;
8633
8634 for_each_cmsghdr(cmsg, my_msg) {
8635 if (!CMSG_OK(my_msg, cmsg))
8636 return -EINVAL;
8637
8638
8639 if (cmsg->cmsg_level != IPPROTO_SCTP)
8640 continue;
8641
8642
8643 switch (cmsg->cmsg_type) {
8644 case SCTP_INIT:
8645
8646
8647
8648
8649
8650
8651
8652
8653
8654
8655
8656
8657
8658 if (cmsg->cmsg_len != CMSG_LEN(sizeof(struct sctp_initmsg)))
8659 return -EINVAL;
8660
8661 cmsgs->init = CMSG_DATA(cmsg);
8662 break;
8663
8664 case SCTP_SNDRCV:
8665
8666
8667
8668
8669
8670
8671
8672
8673
8674
8675
8676 if (cmsg->cmsg_len != CMSG_LEN(sizeof(struct sctp_sndrcvinfo)))
8677 return -EINVAL;
8678
8679 cmsgs->srinfo = CMSG_DATA(cmsg);
8680
8681 if (cmsgs->srinfo->sinfo_flags &
8682 ~(SCTP_UNORDERED | SCTP_ADDR_OVER |
8683 SCTP_SACK_IMMEDIATELY | SCTP_SENDALL |
8684 SCTP_PR_SCTP_MASK | SCTP_ABORT | SCTP_EOF))
8685 return -EINVAL;
8686 break;
8687
8688 case SCTP_SNDINFO:
8689
8690
8691
8692
8693
8694
8695
8696
8697
8698
8699
8700 if (cmsg->cmsg_len != CMSG_LEN(sizeof(struct sctp_sndinfo)))
8701 return -EINVAL;
8702
8703 cmsgs->sinfo = CMSG_DATA(cmsg);
8704
8705 if (cmsgs->sinfo->snd_flags &
8706 ~(SCTP_UNORDERED | SCTP_ADDR_OVER |
8707 SCTP_SACK_IMMEDIATELY | SCTP_SENDALL |
8708 SCTP_PR_SCTP_MASK | SCTP_ABORT | SCTP_EOF))
8709 return -EINVAL;
8710 break;
8711 case SCTP_PRINFO:
8712
8713
8714
8715
8716
8717
8718
8719
8720
8721 if (cmsg->cmsg_len != CMSG_LEN(sizeof(struct sctp_prinfo)))
8722 return -EINVAL;
8723
8724 cmsgs->prinfo = CMSG_DATA(cmsg);
8725 if (cmsgs->prinfo->pr_policy & ~SCTP_PR_SCTP_MASK)
8726 return -EINVAL;
8727
8728 if (cmsgs->prinfo->pr_policy == SCTP_PR_SCTP_NONE)
8729 cmsgs->prinfo->pr_value = 0;
8730 break;
8731 case SCTP_AUTHINFO:
8732
8733
8734
8735
8736
8737
8738
8739
8740
8741 if (cmsg->cmsg_len != CMSG_LEN(sizeof(struct sctp_authinfo)))
8742 return -EINVAL;
8743
8744 cmsgs->authinfo = CMSG_DATA(cmsg);
8745 break;
8746 case SCTP_DSTADDRV4:
8747 case SCTP_DSTADDRV6:
8748
8749
8750
8751
8752
8753
8754
8755
8756
8757
8758
8759 cmsgs->addrs_msg = my_msg;
8760 break;
8761 default:
8762 return -EINVAL;
8763 }
8764 }
8765
8766 return 0;
8767}
8768
8769
8770
8771
8772
8773
8774static int sctp_wait_for_packet(struct sock *sk, int *err, long *timeo_p)
8775{
8776 int error;
8777 DEFINE_WAIT(wait);
8778
8779 prepare_to_wait_exclusive(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
8780
8781
8782 error = sock_error(sk);
8783 if (error)
8784 goto out;
8785
8786 if (!skb_queue_empty(&sk->sk_receive_queue))
8787 goto ready;
8788
8789
8790 if (sk->sk_shutdown & RCV_SHUTDOWN)
8791 goto out;
8792
8793
8794
8795
8796 error = -ENOTCONN;
8797
8798
8799 if (list_empty(&sctp_sk(sk)->ep->asocs) && !sctp_sstate(sk, LISTENING))
8800 goto out;
8801
8802
8803 if (signal_pending(current))
8804 goto interrupted;
8805
8806
8807
8808
8809
8810
8811 release_sock(sk);
8812 *timeo_p = schedule_timeout(*timeo_p);
8813 lock_sock(sk);
8814
8815ready:
8816 finish_wait(sk_sleep(sk), &wait);
8817 return 0;
8818
8819interrupted:
8820 error = sock_intr_errno(*timeo_p);
8821
8822out:
8823 finish_wait(sk_sleep(sk), &wait);
8824 *err = error;
8825 return error;
8826}
8827
8828
8829
8830
8831
8832struct sk_buff *sctp_skb_recv_datagram(struct sock *sk, int flags,
8833 int noblock, int *err)
8834{
8835 int error;
8836 struct sk_buff *skb;
8837 long timeo;
8838
8839 timeo = sock_rcvtimeo(sk, noblock);
8840
8841 pr_debug("%s: timeo:%ld, max:%ld\n", __func__, timeo,
8842 MAX_SCHEDULE_TIMEOUT);
8843
8844 do {
8845
8846
8847
8848
8849
8850
8851
8852 if (flags & MSG_PEEK) {
8853 skb = skb_peek(&sk->sk_receive_queue);
8854 if (skb)
8855 refcount_inc(&skb->users);
8856 } else {
8857 skb = __skb_dequeue(&sk->sk_receive_queue);
8858 }
8859
8860 if (skb)
8861 return skb;
8862
8863
8864 error = sock_error(sk);
8865 if (error)
8866 goto no_packet;
8867
8868 if (sk->sk_shutdown & RCV_SHUTDOWN)
8869 break;
8870
8871 if (sk_can_busy_loop(sk)) {
8872 sk_busy_loop(sk, noblock);
8873
8874 if (!skb_queue_empty_lockless(&sk->sk_receive_queue))
8875 continue;
8876 }
8877
8878
8879 error = -EAGAIN;
8880 if (!timeo)
8881 goto no_packet;
8882 } while (sctp_wait_for_packet(sk, err, &timeo) == 0);
8883
8884 return NULL;
8885
8886no_packet:
8887 *err = error;
8888 return NULL;
8889}
8890
8891
8892static void __sctp_write_space(struct sctp_association *asoc)
8893{
8894 struct sock *sk = asoc->base.sk;
8895
8896 if (sctp_wspace(asoc) <= 0)
8897 return;
8898
8899 if (waitqueue_active(&asoc->wait))
8900 wake_up_interruptible(&asoc->wait);
8901
8902 if (sctp_writeable(sk)) {
8903 struct socket_wq *wq;
8904
8905 rcu_read_lock();
8906 wq = rcu_dereference(sk->sk_wq);
8907 if (wq) {
8908 if (waitqueue_active(&wq->wait))
8909 wake_up_interruptible(&wq->wait);
8910
8911
8912
8913
8914
8915 if (!(sk->sk_shutdown & SEND_SHUTDOWN))
8916 sock_wake_async(wq, SOCK_WAKE_SPACE, POLL_OUT);
8917 }
8918 rcu_read_unlock();
8919 }
8920}
8921
8922static void sctp_wake_up_waiters(struct sock *sk,
8923 struct sctp_association *asoc)
8924{
8925 struct sctp_association *tmp = asoc;
8926
8927
8928
8929
8930 if (asoc->ep->sndbuf_policy)
8931 return __sctp_write_space(asoc);
8932
8933
8934
8935
8936 if (asoc->base.dead)
8937 return sctp_write_space(sk);
8938
8939
8940
8941
8942
8943
8944
8945
8946
8947
8948
8949 for (tmp = list_next_entry(tmp, asocs); 1;
8950 tmp = list_next_entry(tmp, asocs)) {
8951
8952 if (&tmp->asocs == &((sctp_sk(sk))->ep->asocs))
8953 continue;
8954
8955 __sctp_write_space(tmp);
8956
8957 if (tmp == asoc)
8958 break;
8959 }
8960}
8961
8962
8963
8964
8965
8966static void sctp_wfree(struct sk_buff *skb)
8967{
8968 struct sctp_chunk *chunk = skb_shinfo(skb)->destructor_arg;
8969 struct sctp_association *asoc = chunk->asoc;
8970 struct sock *sk = asoc->base.sk;
8971
8972 sk_mem_uncharge(sk, skb->truesize);
8973 sk->sk_wmem_queued -= skb->truesize + sizeof(struct sctp_chunk);
8974 asoc->sndbuf_used -= skb->truesize + sizeof(struct sctp_chunk);
8975 WARN_ON(refcount_sub_and_test(sizeof(struct sctp_chunk),
8976 &sk->sk_wmem_alloc));
8977
8978 if (chunk->shkey) {
8979 struct sctp_shared_key *shkey = chunk->shkey;
8980
8981
8982
8983
8984
8985 if (shkey->deactivated && !list_empty(&shkey->key_list) &&
8986 refcount_read(&shkey->refcnt) == 2) {
8987 struct sctp_ulpevent *ev;
8988
8989 ev = sctp_ulpevent_make_authkey(asoc, shkey->key_id,
8990 SCTP_AUTH_FREE_KEY,
8991 GFP_KERNEL);
8992 if (ev)
8993 asoc->stream.si->enqueue_event(&asoc->ulpq, ev);
8994 }
8995 sctp_auth_shkey_release(chunk->shkey);
8996 }
8997
8998 sock_wfree(skb);
8999 sctp_wake_up_waiters(sk, asoc);
9000
9001 sctp_association_put(asoc);
9002}
9003
9004
9005
9006
9007
9008
9009void sctp_sock_rfree(struct sk_buff *skb)
9010{
9011 struct sock *sk = skb->sk;
9012 struct sctp_ulpevent *event = sctp_skb2event(skb);
9013
9014 atomic_sub(event->rmem_len, &sk->sk_rmem_alloc);
9015
9016
9017
9018
9019 sk_mem_uncharge(sk, event->rmem_len);
9020}
9021
9022
9023
9024static int sctp_wait_for_sndbuf(struct sctp_association *asoc, long *timeo_p,
9025 size_t msg_len)
9026{
9027 struct sock *sk = asoc->base.sk;
9028 long current_timeo = *timeo_p;
9029 DEFINE_WAIT(wait);
9030 int err = 0;
9031
9032 pr_debug("%s: asoc:%p, timeo:%ld, msg_len:%zu\n", __func__, asoc,
9033 *timeo_p, msg_len);
9034
9035
9036 sctp_association_hold(asoc);
9037
9038
9039 for (;;) {
9040 prepare_to_wait_exclusive(&asoc->wait, &wait,
9041 TASK_INTERRUPTIBLE);
9042 if (asoc->base.dead)
9043 goto do_dead;
9044 if (!*timeo_p)
9045 goto do_nonblock;
9046 if (sk->sk_err || asoc->state >= SCTP_STATE_SHUTDOWN_PENDING)
9047 goto do_error;
9048 if (signal_pending(current))
9049 goto do_interrupted;
9050 if (sk_under_memory_pressure(sk))
9051 sk_mem_reclaim(sk);
9052 if ((int)msg_len <= sctp_wspace(asoc) &&
9053 sk_wmem_schedule(sk, msg_len))
9054 break;
9055
9056
9057
9058
9059 release_sock(sk);
9060 current_timeo = schedule_timeout(current_timeo);
9061 lock_sock(sk);
9062 if (sk != asoc->base.sk)
9063 goto do_error;
9064
9065 *timeo_p = current_timeo;
9066 }
9067
9068out:
9069 finish_wait(&asoc->wait, &wait);
9070
9071
9072 sctp_association_put(asoc);
9073
9074 return err;
9075
9076do_dead:
9077 err = -ESRCH;
9078 goto out;
9079
9080do_error:
9081 err = -EPIPE;
9082 goto out;
9083
9084do_interrupted:
9085 err = sock_intr_errno(*timeo_p);
9086 goto out;
9087
9088do_nonblock:
9089 err = -EAGAIN;
9090 goto out;
9091}
9092
9093void sctp_data_ready(struct sock *sk)
9094{
9095 struct socket_wq *wq;
9096
9097 rcu_read_lock();
9098 wq = rcu_dereference(sk->sk_wq);
9099 if (skwq_has_sleeper(wq))
9100 wake_up_interruptible_sync_poll(&wq->wait, EPOLLIN |
9101 EPOLLRDNORM | EPOLLRDBAND);
9102 sk_wake_async(sk, SOCK_WAKE_WAITD, POLL_IN);
9103 rcu_read_unlock();
9104}
9105
9106
9107void sctp_write_space(struct sock *sk)
9108{
9109 struct sctp_association *asoc;
9110
9111
9112 list_for_each_entry(asoc, &((sctp_sk(sk))->ep->asocs), asocs) {
9113 __sctp_write_space(asoc);
9114 }
9115}
9116
9117
9118
9119
9120
9121
9122
9123
9124
9125
9126
9127
9128static bool sctp_writeable(struct sock *sk)
9129{
9130 return sk->sk_sndbuf > sk->sk_wmem_queued;
9131}
9132
9133
9134
9135
9136static int sctp_wait_for_connect(struct sctp_association *asoc, long *timeo_p)
9137{
9138 struct sock *sk = asoc->base.sk;
9139 int err = 0;
9140 long current_timeo = *timeo_p;
9141 DEFINE_WAIT(wait);
9142
9143 pr_debug("%s: asoc:%p, timeo:%ld\n", __func__, asoc, *timeo_p);
9144
9145
9146 sctp_association_hold(asoc);
9147
9148 for (;;) {
9149 prepare_to_wait_exclusive(&asoc->wait, &wait,
9150 TASK_INTERRUPTIBLE);
9151 if (!*timeo_p)
9152 goto do_nonblock;
9153 if (sk->sk_shutdown & RCV_SHUTDOWN)
9154 break;
9155 if (sk->sk_err || asoc->state >= SCTP_STATE_SHUTDOWN_PENDING ||
9156 asoc->base.dead)
9157 goto do_error;
9158 if (signal_pending(current))
9159 goto do_interrupted;
9160
9161 if (sctp_state(asoc, ESTABLISHED))
9162 break;
9163
9164
9165
9166
9167 release_sock(sk);
9168 current_timeo = schedule_timeout(current_timeo);
9169 lock_sock(sk);
9170
9171 *timeo_p = current_timeo;
9172 }
9173
9174out:
9175 finish_wait(&asoc->wait, &wait);
9176
9177
9178 sctp_association_put(asoc);
9179
9180 return err;
9181
9182do_error:
9183 if (asoc->init_err_counter + 1 > asoc->max_init_attempts)
9184 err = -ETIMEDOUT;
9185 else
9186 err = -ECONNREFUSED;
9187 goto out;
9188
9189do_interrupted:
9190 err = sock_intr_errno(*timeo_p);
9191 goto out;
9192
9193do_nonblock:
9194 err = -EINPROGRESS;
9195 goto out;
9196}
9197
9198static int sctp_wait_for_accept(struct sock *sk, long timeo)
9199{
9200 struct sctp_endpoint *ep;
9201 int err = 0;
9202 DEFINE_WAIT(wait);
9203
9204 ep = sctp_sk(sk)->ep;
9205
9206
9207 for (;;) {
9208 prepare_to_wait_exclusive(sk_sleep(sk), &wait,
9209 TASK_INTERRUPTIBLE);
9210
9211 if (list_empty(&ep->asocs)) {
9212 release_sock(sk);
9213 timeo = schedule_timeout(timeo);
9214 lock_sock(sk);
9215 }
9216
9217 err = -EINVAL;
9218 if (!sctp_sstate(sk, LISTENING))
9219 break;
9220
9221 err = 0;
9222 if (!list_empty(&ep->asocs))
9223 break;
9224
9225 err = sock_intr_errno(timeo);
9226 if (signal_pending(current))
9227 break;
9228
9229 err = -EAGAIN;
9230 if (!timeo)
9231 break;
9232 }
9233
9234 finish_wait(sk_sleep(sk), &wait);
9235
9236 return err;
9237}
9238
9239static void sctp_wait_for_close(struct sock *sk, long timeout)
9240{
9241 DEFINE_WAIT(wait);
9242
9243 do {
9244 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
9245 if (list_empty(&sctp_sk(sk)->ep->asocs))
9246 break;
9247 release_sock(sk);
9248 timeout = schedule_timeout(timeout);
9249 lock_sock(sk);
9250 } while (!signal_pending(current) && timeout);
9251
9252 finish_wait(sk_sleep(sk), &wait);
9253}
9254
9255static void sctp_skb_set_owner_r_frag(struct sk_buff *skb, struct sock *sk)
9256{
9257 struct sk_buff *frag;
9258
9259 if (!skb->data_len)
9260 goto done;
9261
9262
9263 skb_walk_frags(skb, frag)
9264 sctp_skb_set_owner_r_frag(frag, sk);
9265
9266done:
9267 sctp_skb_set_owner_r(skb, sk);
9268}
9269
9270void sctp_copy_sock(struct sock *newsk, struct sock *sk,
9271 struct sctp_association *asoc)
9272{
9273 struct inet_sock *inet = inet_sk(sk);
9274 struct inet_sock *newinet;
9275 struct sctp_sock *sp = sctp_sk(sk);
9276 struct sctp_endpoint *ep = sp->ep;
9277
9278 newsk->sk_type = sk->sk_type;
9279 newsk->sk_bound_dev_if = sk->sk_bound_dev_if;
9280 newsk->sk_flags = sk->sk_flags;
9281 newsk->sk_tsflags = sk->sk_tsflags;
9282 newsk->sk_no_check_tx = sk->sk_no_check_tx;
9283 newsk->sk_no_check_rx = sk->sk_no_check_rx;
9284 newsk->sk_reuse = sk->sk_reuse;
9285 sctp_sk(newsk)->reuse = sp->reuse;
9286
9287 newsk->sk_shutdown = sk->sk_shutdown;
9288 newsk->sk_destruct = sctp_destruct_sock;
9289 newsk->sk_family = sk->sk_family;
9290 newsk->sk_protocol = IPPROTO_SCTP;
9291 newsk->sk_backlog_rcv = sk->sk_prot->backlog_rcv;
9292 newsk->sk_sndbuf = sk->sk_sndbuf;
9293 newsk->sk_rcvbuf = sk->sk_rcvbuf;
9294 newsk->sk_lingertime = sk->sk_lingertime;
9295 newsk->sk_rcvtimeo = sk->sk_rcvtimeo;
9296 newsk->sk_sndtimeo = sk->sk_sndtimeo;
9297 newsk->sk_rxhash = sk->sk_rxhash;
9298
9299 newinet = inet_sk(newsk);
9300
9301
9302
9303
9304 newinet->inet_sport = inet->inet_sport;
9305 newinet->inet_saddr = inet->inet_saddr;
9306 newinet->inet_rcv_saddr = inet->inet_rcv_saddr;
9307 newinet->inet_dport = htons(asoc->peer.port);
9308 newinet->pmtudisc = inet->pmtudisc;
9309 newinet->inet_id = prandom_u32();
9310
9311 newinet->uc_ttl = inet->uc_ttl;
9312 newinet->mc_loop = 1;
9313 newinet->mc_ttl = 1;
9314 newinet->mc_index = 0;
9315 newinet->mc_list = NULL;
9316
9317 if (newsk->sk_flags & SK_FLAGS_TIMESTAMP)
9318 net_enable_timestamp();
9319
9320
9321
9322
9323 security_sctp_sk_clone(ep, sk, newsk);
9324}
9325
9326static inline void sctp_copy_descendant(struct sock *sk_to,
9327 const struct sock *sk_from)
9328{
9329 int ancestor_size = sizeof(struct inet_sock) +
9330 sizeof(struct sctp_sock) -
9331 offsetof(struct sctp_sock, pd_lobby);
9332
9333 if (sk_from->sk_family == PF_INET6)
9334 ancestor_size += sizeof(struct ipv6_pinfo);
9335
9336 __inet_sk_copy_descendant(sk_to, sk_from, ancestor_size);
9337}
9338
9339
9340
9341
9342static int sctp_sock_migrate(struct sock *oldsk, struct sock *newsk,
9343 struct sctp_association *assoc,
9344 enum sctp_socket_type type)
9345{
9346 struct sctp_sock *oldsp = sctp_sk(oldsk);
9347 struct sctp_sock *newsp = sctp_sk(newsk);
9348 struct sctp_bind_bucket *pp;
9349 struct sctp_endpoint *newep = newsp->ep;
9350 struct sk_buff *skb, *tmp;
9351 struct sctp_ulpevent *event;
9352 struct sctp_bind_hashbucket *head;
9353 int err;
9354
9355
9356
9357
9358 newsk->sk_sndbuf = oldsk->sk_sndbuf;
9359 newsk->sk_rcvbuf = oldsk->sk_rcvbuf;
9360
9361 sctp_copy_descendant(newsk, oldsk);
9362
9363
9364
9365
9366 newsp->ep = newep;
9367 newsp->hmac = NULL;
9368
9369
9370 head = &sctp_port_hashtable[sctp_phashfn(sock_net(oldsk),
9371 inet_sk(oldsk)->inet_num)];
9372 spin_lock_bh(&head->lock);
9373 pp = sctp_sk(oldsk)->bind_hash;
9374 sk_add_bind_node(newsk, &pp->owner);
9375 sctp_sk(newsk)->bind_hash = pp;
9376 inet_sk(newsk)->inet_num = inet_sk(oldsk)->inet_num;
9377 spin_unlock_bh(&head->lock);
9378
9379
9380
9381
9382 err = sctp_bind_addr_dup(&newsp->ep->base.bind_addr,
9383 &oldsp->ep->base.bind_addr, GFP_KERNEL);
9384 if (err)
9385 return err;
9386
9387
9388
9389
9390
9391 if (oldsp->ep->auth_hmacs) {
9392 err = sctp_auth_init_hmacs(newsp->ep, GFP_KERNEL);
9393 if (err)
9394 return err;
9395 }
9396
9397
9398
9399
9400 sctp_skb_for_each(skb, &oldsk->sk_receive_queue, tmp) {
9401 event = sctp_skb2event(skb);
9402 if (event->asoc == assoc) {
9403 __skb_unlink(skb, &oldsk->sk_receive_queue);
9404 __skb_queue_tail(&newsk->sk_receive_queue, skb);
9405 sctp_skb_set_owner_r_frag(skb, newsk);
9406 }
9407 }
9408
9409
9410
9411
9412
9413
9414
9415 atomic_set(&sctp_sk(newsk)->pd_mode, assoc->ulpq.pd_mode);
9416
9417 if (atomic_read(&sctp_sk(oldsk)->pd_mode)) {
9418 struct sk_buff_head *queue;
9419
9420
9421 if (assoc->ulpq.pd_mode) {
9422 queue = &newsp->pd_lobby;
9423 } else
9424 queue = &newsk->sk_receive_queue;
9425
9426
9427
9428
9429 sctp_skb_for_each(skb, &oldsp->pd_lobby, tmp) {
9430 event = sctp_skb2event(skb);
9431 if (event->asoc == assoc) {
9432 __skb_unlink(skb, &oldsp->pd_lobby);
9433 __skb_queue_tail(queue, skb);
9434 sctp_skb_set_owner_r_frag(skb, newsk);
9435 }
9436 }
9437
9438
9439
9440
9441 if (assoc->ulpq.pd_mode)
9442 sctp_clear_pd(oldsk, NULL);
9443
9444 }
9445
9446 sctp_for_each_rx_skb(assoc, newsk, sctp_skb_set_owner_r_frag);
9447
9448
9449
9450
9451
9452 newsp->type = type;
9453
9454
9455
9456
9457
9458
9459
9460
9461
9462
9463 lock_sock_nested(newsk, SINGLE_DEPTH_NESTING);
9464 sctp_for_each_tx_datachunk(assoc, sctp_clear_owner_w);
9465 sctp_assoc_migrate(assoc, newsk);
9466 sctp_for_each_tx_datachunk(assoc, sctp_set_owner_w);
9467
9468
9469
9470
9471 if (sctp_state(assoc, CLOSED) && sctp_style(newsk, TCP)) {
9472 inet_sk_set_state(newsk, SCTP_SS_CLOSED);
9473 newsk->sk_shutdown |= RCV_SHUTDOWN;
9474 } else {
9475 inet_sk_set_state(newsk, SCTP_SS_ESTABLISHED);
9476 }
9477
9478 release_sock(newsk);
9479
9480 return 0;
9481}
9482
9483
9484
9485struct proto sctp_prot = {
9486 .name = "SCTP",
9487 .owner = THIS_MODULE,
9488 .close = sctp_close,
9489 .disconnect = sctp_disconnect,
9490 .accept = sctp_accept,
9491 .ioctl = sctp_ioctl,
9492 .init = sctp_init_sock,
9493 .destroy = sctp_destroy_sock,
9494 .shutdown = sctp_shutdown,
9495 .setsockopt = sctp_setsockopt,
9496 .getsockopt = sctp_getsockopt,
9497 .sendmsg = sctp_sendmsg,
9498 .recvmsg = sctp_recvmsg,
9499 .bind = sctp_bind,
9500 .backlog_rcv = sctp_backlog_rcv,
9501 .hash = sctp_hash,
9502 .unhash = sctp_unhash,
9503 .no_autobind = true,
9504 .obj_size = sizeof(struct sctp_sock),
9505 .useroffset = offsetof(struct sctp_sock, subscribe),
9506 .usersize = offsetof(struct sctp_sock, initmsg) -
9507 offsetof(struct sctp_sock, subscribe) +
9508 sizeof_field(struct sctp_sock, initmsg),
9509 .sysctl_mem = sysctl_sctp_mem,
9510 .sysctl_rmem = sysctl_sctp_rmem,
9511 .sysctl_wmem = sysctl_sctp_wmem,
9512 .memory_pressure = &sctp_memory_pressure,
9513 .enter_memory_pressure = sctp_enter_memory_pressure,
9514 .memory_allocated = &sctp_memory_allocated,
9515 .sockets_allocated = &sctp_sockets_allocated,
9516};
9517
9518#if IS_ENABLED(CONFIG_IPV6)
9519
9520#include <net/transp_v6.h>
9521static void sctp_v6_destroy_sock(struct sock *sk)
9522{
9523 sctp_destroy_sock(sk);
9524 inet6_destroy_sock(sk);
9525}
9526
9527struct proto sctpv6_prot = {
9528 .name = "SCTPv6",
9529 .owner = THIS_MODULE,
9530 .close = sctp_close,
9531 .disconnect = sctp_disconnect,
9532 .accept = sctp_accept,
9533 .ioctl = sctp_ioctl,
9534 .init = sctp_init_sock,
9535 .destroy = sctp_v6_destroy_sock,
9536 .shutdown = sctp_shutdown,
9537 .setsockopt = sctp_setsockopt,
9538 .getsockopt = sctp_getsockopt,
9539 .sendmsg = sctp_sendmsg,
9540 .recvmsg = sctp_recvmsg,
9541 .bind = sctp_bind,
9542 .backlog_rcv = sctp_backlog_rcv,
9543 .hash = sctp_hash,
9544 .unhash = sctp_unhash,
9545 .no_autobind = true,
9546 .obj_size = sizeof(struct sctp6_sock),
9547 .useroffset = offsetof(struct sctp6_sock, sctp.subscribe),
9548 .usersize = offsetof(struct sctp6_sock, sctp.initmsg) -
9549 offsetof(struct sctp6_sock, sctp.subscribe) +
9550 sizeof_field(struct sctp6_sock, sctp.initmsg),
9551 .sysctl_mem = sysctl_sctp_mem,
9552 .sysctl_rmem = sysctl_sctp_rmem,
9553 .sysctl_wmem = sysctl_sctp_wmem,
9554 .memory_pressure = &sctp_memory_pressure,
9555 .enter_memory_pressure = sctp_enter_memory_pressure,
9556 .memory_allocated = &sctp_memory_allocated,
9557 .sockets_allocated = &sctp_sockets_allocated,
9558};
9559#endif
9560