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