1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
61
62#include <linux/types.h>
63#include <linux/kernel.h>
64#include <linux/wait.h>
65#include <linux/time.h>
66#include <linux/ip.h>
67#include <linux/capability.h>
68#include <linux/fcntl.h>
69#include <linux/poll.h>
70#include <linux/init.h>
71#include <linux/crypto.h>
72#include <linux/slab.h>
73#include <linux/file.h>
74
75#include <net/ip.h>
76#include <net/icmp.h>
77#include <net/route.h>
78#include <net/ipv6.h>
79#include <net/inet_common.h>
80
81#include <linux/socket.h>
82#include <linux/export.h>
83#include <net/sock.h>
84#include <net/sctp/sctp.h>
85#include <net/sctp/sm.h>
86
87
88
89
90
91
92
93static int sctp_writeable(struct sock *sk);
94static void sctp_wfree(struct sk_buff *skb);
95static int sctp_wait_for_sndbuf(struct sctp_association *, long *timeo_p,
96 size_t msg_len);
97static int sctp_wait_for_packet(struct sock * sk, int *err, long *timeo_p);
98static int sctp_wait_for_connect(struct sctp_association *, long *timeo_p);
99static int sctp_wait_for_accept(struct sock *sk, long timeo);
100static void sctp_wait_for_close(struct sock *sk, long timeo);
101static struct sctp_af *sctp_sockaddr_af(struct sctp_sock *opt,
102 union sctp_addr *addr, int len);
103static int sctp_bindx_add(struct sock *, struct sockaddr *, int);
104static int sctp_bindx_rem(struct sock *, struct sockaddr *, int);
105static int sctp_send_asconf_add_ip(struct sock *, struct sockaddr *, int);
106static int sctp_send_asconf_del_ip(struct sock *, struct sockaddr *, int);
107static int sctp_send_asconf(struct sctp_association *asoc,
108 struct sctp_chunk *chunk);
109static int sctp_do_bind(struct sock *, union sctp_addr *, int);
110static int sctp_autobind(struct sock *sk);
111static void sctp_sock_migrate(struct sock *, struct sock *,
112 struct sctp_association *, sctp_socket_type_t);
113static char *sctp_hmac_alg = SCTP_COOKIE_HMAC_ALG;
114
115extern struct kmem_cache *sctp_bucket_cachep;
116extern long sysctl_sctp_mem[3];
117extern int sysctl_sctp_rmem[3];
118extern int sysctl_sctp_wmem[3];
119
120static int sctp_memory_pressure;
121static atomic_long_t sctp_memory_allocated;
122struct percpu_counter sctp_sockets_allocated;
123
124static void sctp_enter_memory_pressure(struct sock *sk)
125{
126 sctp_memory_pressure = 1;
127}
128
129
130
131static inline int sctp_wspace(struct sctp_association *asoc)
132{
133 int amt;
134
135 if (asoc->ep->sndbuf_policy)
136 amt = asoc->sndbuf_used;
137 else
138 amt = sk_wmem_alloc_get(asoc->base.sk);
139
140 if (amt >= asoc->base.sk->sk_sndbuf) {
141 if (asoc->base.sk->sk_userlocks & SOCK_SNDBUF_LOCK)
142 amt = 0;
143 else {
144 amt = sk_stream_wspace(asoc->base.sk);
145 if (amt < 0)
146 amt = 0;
147 }
148 } else {
149 amt = asoc->base.sk->sk_sndbuf - amt;
150 }
151 return amt;
152}
153
154
155
156
157
158
159
160
161
162
163static inline void sctp_set_owner_w(struct sctp_chunk *chunk)
164{
165 struct sctp_association *asoc = chunk->asoc;
166 struct sock *sk = asoc->base.sk;
167
168
169 sctp_association_hold(asoc);
170
171 skb_set_owner_w(chunk->skb, sk);
172
173 chunk->skb->destructor = sctp_wfree;
174
175 *((struct sctp_chunk **)(chunk->skb->cb)) = chunk;
176
177 asoc->sndbuf_used += SCTP_DATA_SNDSIZE(chunk) +
178 sizeof(struct sk_buff) +
179 sizeof(struct sctp_chunk);
180
181 atomic_add(sizeof(struct sctp_chunk), &sk->sk_wmem_alloc);
182 sk->sk_wmem_queued += chunk->skb->truesize;
183 sk_mem_charge(sk, chunk->skb->truesize);
184}
185
186
187static inline int sctp_verify_addr(struct sock *sk, union sctp_addr *addr,
188 int len)
189{
190 struct sctp_af *af;
191
192
193 af = sctp_sockaddr_af(sctp_sk(sk), addr, len);
194 if (!af)
195 return -EINVAL;
196
197
198 if (!af->addr_valid(addr, sctp_sk(sk), NULL))
199 return -EINVAL;
200
201 if (!sctp_sk(sk)->pf->send_verify(sctp_sk(sk), (addr)))
202 return -EINVAL;
203
204 return 0;
205}
206
207
208
209
210struct sctp_association *sctp_id2assoc(struct sock *sk, sctp_assoc_t id)
211{
212 struct sctp_association *asoc = NULL;
213
214
215 if (!sctp_style(sk, UDP)) {
216
217
218
219
220 if (!sctp_sstate(sk, ESTABLISHED))
221 return NULL;
222
223
224 if (!list_empty(&sctp_sk(sk)->ep->asocs))
225 asoc = list_entry(sctp_sk(sk)->ep->asocs.next,
226 struct sctp_association, asocs);
227 return asoc;
228 }
229
230
231 if (!id || (id == (sctp_assoc_t)-1))
232 return NULL;
233
234 spin_lock_bh(&sctp_assocs_id_lock);
235 asoc = (struct sctp_association *)idr_find(&sctp_assocs_id, (int)id);
236 spin_unlock_bh(&sctp_assocs_id_lock);
237
238 if (!asoc || (asoc->base.sk != sk) || asoc->base.dead)
239 return NULL;
240
241 return asoc;
242}
243
244
245
246
247
248static struct sctp_transport *sctp_addr_id2transport(struct sock *sk,
249 struct sockaddr_storage *addr,
250 sctp_assoc_t id)
251{
252 struct sctp_association *addr_asoc = NULL, *id_asoc = NULL;
253 struct sctp_transport *transport;
254 union sctp_addr *laddr = (union sctp_addr *)addr;
255
256 addr_asoc = sctp_endpoint_lookup_assoc(sctp_sk(sk)->ep,
257 laddr,
258 &transport);
259
260 if (!addr_asoc)
261 return NULL;
262
263 id_asoc = sctp_id2assoc(sk, id);
264 if (id_asoc && (id_asoc != addr_asoc))
265 return NULL;
266
267 sctp_get_pf_specific(sk->sk_family)->addr_v4map(sctp_sk(sk),
268 (union sctp_addr *)addr);
269
270 return transport;
271}
272
273
274
275
276
277
278
279
280
281
282
283SCTP_STATIC int sctp_bind(struct sock *sk, struct sockaddr *addr, int addr_len)
284{
285 int retval = 0;
286
287 sctp_lock_sock(sk);
288
289 SCTP_DEBUG_PRINTK("sctp_bind(sk: %p, addr: %p, addr_len: %d)\n",
290 sk, addr, addr_len);
291
292
293 if (!sctp_sk(sk)->ep->base.bind_addr.port)
294 retval = sctp_do_bind(sk, (union sctp_addr *)addr,
295 addr_len);
296 else
297 retval = -EINVAL;
298
299 sctp_release_sock(sk);
300
301 return retval;
302}
303
304static long sctp_get_port_local(struct sock *, union sctp_addr *);
305
306
307static struct sctp_af *sctp_sockaddr_af(struct sctp_sock *opt,
308 union sctp_addr *addr, int len)
309{
310 struct sctp_af *af;
311
312
313 if (len < sizeof (struct sockaddr))
314 return NULL;
315
316
317 if (addr->sa.sa_family == AF_INET6 &&
318 ipv6_addr_v4mapped(&addr->v6.sin6_addr)) {
319 if (!opt->pf->af_supported(AF_INET, opt))
320 return NULL;
321 } else {
322
323 if (!opt->pf->af_supported(addr->sa.sa_family, opt))
324 return NULL;
325 }
326
327
328 af = sctp_get_af_specific(addr->sa.sa_family);
329
330 if (len < af->sockaddr_len)
331 return NULL;
332
333 return af;
334}
335
336
337SCTP_STATIC int sctp_do_bind(struct sock *sk, union sctp_addr *addr, int len)
338{
339 struct sctp_sock *sp = sctp_sk(sk);
340 struct sctp_endpoint *ep = sp->ep;
341 struct sctp_bind_addr *bp = &ep->base.bind_addr;
342 struct sctp_af *af;
343 unsigned short snum;
344 int ret = 0;
345
346
347 af = sctp_sockaddr_af(sp, addr, len);
348 if (!af) {
349 SCTP_DEBUG_PRINTK("sctp_do_bind(sk: %p, newaddr: %p, len: %d) EINVAL\n",
350 sk, addr, len);
351 return -EINVAL;
352 }
353
354 snum = ntohs(addr->v4.sin_port);
355
356 SCTP_DEBUG_PRINTK_IPADDR("sctp_do_bind(sk: %p, new addr: ",
357 ", port: %d, new port: %d, len: %d)\n",
358 sk,
359 addr,
360 bp->port, snum,
361 len);
362
363
364 if (!sp->pf->bind_verify(sp, addr))
365 return -EADDRNOTAVAIL;
366
367
368
369
370
371 if (bp->port) {
372 if (!snum)
373 snum = bp->port;
374 else if (snum != bp->port) {
375 SCTP_DEBUG_PRINTK("sctp_do_bind:"
376 " New port %d does not match existing port "
377 "%d.\n", snum, bp->port);
378 return -EINVAL;
379 }
380 }
381
382 if (snum && snum < PROT_SOCK && !capable(CAP_NET_BIND_SERVICE))
383 return -EACCES;
384
385
386
387
388 if (sctp_bind_addr_match(bp, addr, sp))
389 return -EINVAL;
390
391
392
393
394
395 addr->v4.sin_port = htons(snum);
396 if ((ret = sctp_get_port_local(sk, addr))) {
397 return -EADDRINUSE;
398 }
399
400
401 if (!bp->port)
402 bp->port = inet_sk(sk)->inet_num;
403
404
405
406
407 ret = sctp_add_bind_addr(bp, addr, SCTP_ADDR_SRC, GFP_ATOMIC);
408
409
410 if (!ret) {
411 inet_sk(sk)->inet_sport = htons(inet_sk(sk)->inet_num);
412 af->to_sk_saddr(addr, sk);
413 }
414
415 return ret;
416}
417
418
419
420
421
422
423
424
425
426
427
428static int sctp_send_asconf(struct sctp_association *asoc,
429 struct sctp_chunk *chunk)
430{
431 struct net *net = sock_net(asoc->base.sk);
432 int retval = 0;
433
434
435
436
437 if (asoc->addip_last_asconf) {
438 list_add_tail(&chunk->list, &asoc->addip_chunk_list);
439 goto out;
440 }
441
442
443 sctp_chunk_hold(chunk);
444 retval = sctp_primitive_ASCONF(net, asoc, chunk);
445 if (retval)
446 sctp_chunk_free(chunk);
447 else
448 asoc->addip_last_asconf = chunk;
449
450out:
451 return retval;
452}
453
454
455
456
457
458
459
460
461
462
463
464
465
466static int sctp_bindx_add(struct sock *sk, struct sockaddr *addrs, int addrcnt)
467{
468 int cnt;
469 int retval = 0;
470 void *addr_buf;
471 struct sockaddr *sa_addr;
472 struct sctp_af *af;
473
474 SCTP_DEBUG_PRINTK("sctp_bindx_add (sk: %p, addrs: %p, addrcnt: %d)\n",
475 sk, addrs, addrcnt);
476
477 addr_buf = addrs;
478 for (cnt = 0; cnt < addrcnt; cnt++) {
479
480
481
482 sa_addr = addr_buf;
483 af = sctp_get_af_specific(sa_addr->sa_family);
484 if (!af) {
485 retval = -EINVAL;
486 goto err_bindx_add;
487 }
488
489 retval = sctp_do_bind(sk, (union sctp_addr *)sa_addr,
490 af->sockaddr_len);
491
492 addr_buf += af->sockaddr_len;
493
494err_bindx_add:
495 if (retval < 0) {
496
497 if (cnt > 0)
498 sctp_bindx_rem(sk, addrs, cnt);
499 return retval;
500 }
501 }
502
503 return retval;
504}
505
506
507
508
509
510
511
512
513
514
515
516static int sctp_send_asconf_add_ip(struct sock *sk,
517 struct sockaddr *addrs,
518 int addrcnt)
519{
520 struct net *net = sock_net(sk);
521 struct sctp_sock *sp;
522 struct sctp_endpoint *ep;
523 struct sctp_association *asoc;
524 struct sctp_bind_addr *bp;
525 struct sctp_chunk *chunk;
526 struct sctp_sockaddr_entry *laddr;
527 union sctp_addr *addr;
528 union sctp_addr saveaddr;
529 void *addr_buf;
530 struct sctp_af *af;
531 struct list_head *p;
532 int i;
533 int retval = 0;
534
535 if (!net->sctp.addip_enable)
536 return retval;
537
538 sp = sctp_sk(sk);
539 ep = sp->ep;
540
541 SCTP_DEBUG_PRINTK("%s: (sk: %p, addrs: %p, addrcnt: %d)\n",
542 __func__, sk, addrs, addrcnt);
543
544 list_for_each_entry(asoc, &ep->asocs, asocs) {
545
546 if (!asoc->peer.asconf_capable)
547 continue;
548
549 if (asoc->peer.addip_disabled_mask & SCTP_PARAM_ADD_IP)
550 continue;
551
552 if (!sctp_state(asoc, ESTABLISHED))
553 continue;
554
555
556
557
558
559
560 addr_buf = addrs;
561 for (i = 0; i < addrcnt; i++) {
562 addr = addr_buf;
563 af = sctp_get_af_specific(addr->v4.sin_family);
564 if (!af) {
565 retval = -EINVAL;
566 goto out;
567 }
568
569 if (sctp_assoc_lookup_laddr(asoc, addr))
570 break;
571
572 addr_buf += af->sockaddr_len;
573 }
574 if (i < addrcnt)
575 continue;
576
577
578
579
580 bp = &asoc->base.bind_addr;
581 p = bp->address_list.next;
582 laddr = list_entry(p, struct sctp_sockaddr_entry, list);
583 chunk = sctp_make_asconf_update_ip(asoc, &laddr->a, addrs,
584 addrcnt, SCTP_PARAM_ADD_IP);
585 if (!chunk) {
586 retval = -ENOMEM;
587 goto out;
588 }
589
590
591
592
593 addr_buf = addrs;
594 for (i = 0; i < addrcnt; i++) {
595 addr = addr_buf;
596 af = sctp_get_af_specific(addr->v4.sin_family);
597 memcpy(&saveaddr, addr, af->sockaddr_len);
598 retval = sctp_add_bind_addr(bp, &saveaddr,
599 SCTP_ADDR_NEW, GFP_ATOMIC);
600 addr_buf += af->sockaddr_len;
601 }
602 if (asoc->src_out_of_asoc_ok) {
603 struct sctp_transport *trans;
604
605 list_for_each_entry(trans,
606 &asoc->peer.transport_addr_list, transports) {
607
608 dst_release(trans->dst);
609 trans->cwnd = min(4*asoc->pathmtu, max_t(__u32,
610 2*asoc->pathmtu, 4380));
611 trans->ssthresh = asoc->peer.i.a_rwnd;
612 trans->rto = asoc->rto_initial;
613 trans->rtt = trans->srtt = trans->rttvar = 0;
614 sctp_transport_route(trans, NULL,
615 sctp_sk(asoc->base.sk));
616 }
617 }
618 retval = sctp_send_asconf(asoc, chunk);
619 }
620
621out:
622 return retval;
623}
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640static int sctp_bindx_rem(struct sock *sk, struct sockaddr *addrs, int addrcnt)
641{
642 struct sctp_sock *sp = sctp_sk(sk);
643 struct sctp_endpoint *ep = sp->ep;
644 int cnt;
645 struct sctp_bind_addr *bp = &ep->base.bind_addr;
646 int retval = 0;
647 void *addr_buf;
648 union sctp_addr *sa_addr;
649 struct sctp_af *af;
650
651 SCTP_DEBUG_PRINTK("sctp_bindx_rem (sk: %p, addrs: %p, addrcnt: %d)\n",
652 sk, addrs, addrcnt);
653
654 addr_buf = addrs;
655 for (cnt = 0; cnt < addrcnt; cnt++) {
656
657
658
659
660 if (list_empty(&bp->address_list) ||
661 (sctp_list_single_entry(&bp->address_list))) {
662 retval = -EBUSY;
663 goto err_bindx_rem;
664 }
665
666 sa_addr = addr_buf;
667 af = sctp_get_af_specific(sa_addr->sa.sa_family);
668 if (!af) {
669 retval = -EINVAL;
670 goto err_bindx_rem;
671 }
672
673 if (!af->addr_valid(sa_addr, sp, NULL)) {
674 retval = -EADDRNOTAVAIL;
675 goto err_bindx_rem;
676 }
677
678 if (sa_addr->v4.sin_port &&
679 sa_addr->v4.sin_port != htons(bp->port)) {
680 retval = -EINVAL;
681 goto err_bindx_rem;
682 }
683
684 if (!sa_addr->v4.sin_port)
685 sa_addr->v4.sin_port = htons(bp->port);
686
687
688
689
690
691
692
693
694 retval = sctp_del_bind_addr(bp, sa_addr);
695
696 addr_buf += af->sockaddr_len;
697err_bindx_rem:
698 if (retval < 0) {
699
700 if (cnt > 0)
701 sctp_bindx_add(sk, addrs, cnt);
702 return retval;
703 }
704 }
705
706 return retval;
707}
708
709
710
711
712
713
714
715
716
717
718
719static int sctp_send_asconf_del_ip(struct sock *sk,
720 struct sockaddr *addrs,
721 int addrcnt)
722{
723 struct net *net = sock_net(sk);
724 struct sctp_sock *sp;
725 struct sctp_endpoint *ep;
726 struct sctp_association *asoc;
727 struct sctp_transport *transport;
728 struct sctp_bind_addr *bp;
729 struct sctp_chunk *chunk;
730 union sctp_addr *laddr;
731 void *addr_buf;
732 struct sctp_af *af;
733 struct sctp_sockaddr_entry *saddr;
734 int i;
735 int retval = 0;
736 int stored = 0;
737
738 chunk = NULL;
739 if (!net->sctp.addip_enable)
740 return retval;
741
742 sp = sctp_sk(sk);
743 ep = sp->ep;
744
745 SCTP_DEBUG_PRINTK("%s: (sk: %p, addrs: %p, addrcnt: %d)\n",
746 __func__, sk, addrs, addrcnt);
747
748 list_for_each_entry(asoc, &ep->asocs, asocs) {
749
750 if (!asoc->peer.asconf_capable)
751 continue;
752
753 if (asoc->peer.addip_disabled_mask & SCTP_PARAM_DEL_IP)
754 continue;
755
756 if (!sctp_state(asoc, ESTABLISHED))
757 continue;
758
759
760
761
762
763
764 addr_buf = addrs;
765 for (i = 0; i < addrcnt; i++) {
766 laddr = addr_buf;
767 af = sctp_get_af_specific(laddr->v4.sin_family);
768 if (!af) {
769 retval = -EINVAL;
770 goto out;
771 }
772
773 if (!sctp_assoc_lookup_laddr(asoc, laddr))
774 break;
775
776 addr_buf += af->sockaddr_len;
777 }
778 if (i < addrcnt)
779 continue;
780
781
782
783
784
785
786 bp = &asoc->base.bind_addr;
787 laddr = sctp_find_unmatch_addr(bp, (union sctp_addr *)addrs,
788 addrcnt, sp);
789 if ((laddr == NULL) && (addrcnt == 1)) {
790 if (asoc->asconf_addr_del_pending)
791 continue;
792 asoc->asconf_addr_del_pending =
793 kzalloc(sizeof(union sctp_addr), GFP_ATOMIC);
794 if (asoc->asconf_addr_del_pending == NULL) {
795 retval = -ENOMEM;
796 goto out;
797 }
798 asoc->asconf_addr_del_pending->sa.sa_family =
799 addrs->sa_family;
800 asoc->asconf_addr_del_pending->v4.sin_port =
801 htons(bp->port);
802 if (addrs->sa_family == AF_INET) {
803 struct sockaddr_in *sin;
804
805 sin = (struct sockaddr_in *)addrs;
806 asoc->asconf_addr_del_pending->v4.sin_addr.s_addr = sin->sin_addr.s_addr;
807 } else if (addrs->sa_family == AF_INET6) {
808 struct sockaddr_in6 *sin6;
809
810 sin6 = (struct sockaddr_in6 *)addrs;
811 asoc->asconf_addr_del_pending->v6.sin6_addr = sin6->sin6_addr;
812 }
813 SCTP_DEBUG_PRINTK_IPADDR("send_asconf_del_ip: keep the last address asoc: %p ",
814 " at %p\n", asoc, asoc->asconf_addr_del_pending,
815 asoc->asconf_addr_del_pending);
816 asoc->src_out_of_asoc_ok = 1;
817 stored = 1;
818 goto skip_mkasconf;
819 }
820
821
822
823
824
825 chunk = sctp_make_asconf_update_ip(asoc, laddr, addrs, addrcnt,
826 SCTP_PARAM_DEL_IP);
827 if (!chunk) {
828 retval = -ENOMEM;
829 goto out;
830 }
831
832skip_mkasconf:
833
834
835
836 addr_buf = addrs;
837 for (i = 0; i < addrcnt; i++) {
838 laddr = addr_buf;
839 af = sctp_get_af_specific(laddr->v4.sin_family);
840 list_for_each_entry(saddr, &bp->address_list, list) {
841 if (sctp_cmp_addr_exact(&saddr->a, laddr))
842 saddr->state = SCTP_ADDR_DEL;
843 }
844 addr_buf += af->sockaddr_len;
845 }
846
847
848
849
850
851 list_for_each_entry(transport, &asoc->peer.transport_addr_list,
852 transports) {
853 dst_release(transport->dst);
854 sctp_transport_route(transport, NULL,
855 sctp_sk(asoc->base.sk));
856 }
857
858 if (stored)
859
860 continue;
861 retval = sctp_send_asconf(asoc, chunk);
862 }
863out:
864 return retval;
865}
866
867
868int sctp_asconf_mgmt(struct sctp_sock *sp, struct sctp_sockaddr_entry *addrw)
869{
870 struct sock *sk = sctp_opt2sk(sp);
871 union sctp_addr *addr;
872 struct sctp_af *af;
873
874
875 addr = &addrw->a;
876 addr->v4.sin_port = htons(sp->ep->base.bind_addr.port);
877 af = sctp_get_af_specific(addr->sa.sa_family);
878 if (!af)
879 return -EINVAL;
880 if (sctp_verify_addr(sk, addr, af->sockaddr_len))
881 return -EINVAL;
882
883 if (addrw->state == SCTP_ADDR_NEW)
884 return sctp_send_asconf_add_ip(sk, (struct sockaddr *)addr, 1);
885 else
886 return sctp_send_asconf_del_ip(sk, (struct sockaddr *)addr, 1);
887}
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965SCTP_STATIC int sctp_setsockopt_bindx(struct sock* sk,
966 struct sockaddr __user *addrs,
967 int addrs_size, int op)
968{
969 struct sockaddr *kaddrs;
970 int err;
971 int addrcnt = 0;
972 int walk_size = 0;
973 struct sockaddr *sa_addr;
974 void *addr_buf;
975 struct sctp_af *af;
976
977 SCTP_DEBUG_PRINTK("sctp_setsockopt_bindx: sk %p addrs %p"
978 " addrs_size %d opt %d\n", sk, addrs, addrs_size, op);
979
980 if (unlikely(addrs_size <= 0))
981 return -EINVAL;
982
983
984 if (unlikely(!access_ok(VERIFY_READ, addrs, addrs_size)))
985 return -EFAULT;
986
987
988 kaddrs = kmalloc(addrs_size, GFP_KERNEL);
989 if (unlikely(!kaddrs))
990 return -ENOMEM;
991
992 if (__copy_from_user(kaddrs, addrs, addrs_size)) {
993 kfree(kaddrs);
994 return -EFAULT;
995 }
996
997
998 addr_buf = kaddrs;
999 while (walk_size < addrs_size) {
1000 if (walk_size + sizeof(sa_family_t) > addrs_size) {
1001 kfree(kaddrs);
1002 return -EINVAL;
1003 }
1004
1005 sa_addr = addr_buf;
1006 af = sctp_get_af_specific(sa_addr->sa_family);
1007
1008
1009
1010
1011 if (!af || (walk_size + af->sockaddr_len) > addrs_size) {
1012 kfree(kaddrs);
1013 return -EINVAL;
1014 }
1015 addrcnt++;
1016 addr_buf += af->sockaddr_len;
1017 walk_size += af->sockaddr_len;
1018 }
1019
1020
1021 switch (op) {
1022 case SCTP_BINDX_ADD_ADDR:
1023 err = sctp_bindx_add(sk, kaddrs, addrcnt);
1024 if (err)
1025 goto out;
1026 err = sctp_send_asconf_add_ip(sk, kaddrs, addrcnt);
1027 break;
1028
1029 case SCTP_BINDX_REM_ADDR:
1030 err = sctp_bindx_rem(sk, kaddrs, addrcnt);
1031 if (err)
1032 goto out;
1033 err = sctp_send_asconf_del_ip(sk, kaddrs, addrcnt);
1034 break;
1035
1036 default:
1037 err = -EINVAL;
1038 break;
1039 }
1040
1041out:
1042 kfree(kaddrs);
1043
1044 return err;
1045}
1046
1047
1048
1049
1050
1051
1052static int __sctp_connect(struct sock* sk,
1053 struct sockaddr *kaddrs,
1054 int addrs_size,
1055 sctp_assoc_t *assoc_id)
1056{
1057 struct net *net = sock_net(sk);
1058 struct sctp_sock *sp;
1059 struct sctp_endpoint *ep;
1060 struct sctp_association *asoc = NULL;
1061 struct sctp_association *asoc2;
1062 struct sctp_transport *transport;
1063 union sctp_addr to;
1064 struct sctp_af *af;
1065 sctp_scope_t scope;
1066 long timeo;
1067 int err = 0;
1068 int addrcnt = 0;
1069 int walk_size = 0;
1070 union sctp_addr *sa_addr = NULL;
1071 void *addr_buf;
1072 unsigned short port;
1073 unsigned int f_flags = 0;
1074
1075 sp = sctp_sk(sk);
1076 ep = sp->ep;
1077
1078
1079
1080
1081
1082
1083 if (sctp_sstate(sk, ESTABLISHED) ||
1084 (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING))) {
1085 err = -EISCONN;
1086 goto out_free;
1087 }
1088
1089
1090 addr_buf = kaddrs;
1091 while (walk_size < addrs_size) {
1092 if (walk_size + sizeof(sa_family_t) > addrs_size) {
1093 err = -EINVAL;
1094 goto out_free;
1095 }
1096
1097 sa_addr = addr_buf;
1098 af = sctp_get_af_specific(sa_addr->sa.sa_family);
1099
1100
1101
1102
1103 if (!af || (walk_size + af->sockaddr_len) > addrs_size) {
1104 err = -EINVAL;
1105 goto out_free;
1106 }
1107
1108 port = ntohs(sa_addr->v4.sin_port);
1109
1110
1111 memcpy(&to, sa_addr, af->sockaddr_len);
1112
1113 err = sctp_verify_addr(sk, &to, af->sockaddr_len);
1114 if (err)
1115 goto out_free;
1116
1117
1118
1119
1120 if (asoc && asoc->peer.port && asoc->peer.port != port)
1121 goto out_free;
1122
1123
1124
1125
1126
1127 asoc2 = sctp_endpoint_lookup_assoc(ep, &to, &transport);
1128 if (asoc2 && asoc2 != asoc) {
1129 if (asoc2->state >= SCTP_STATE_ESTABLISHED)
1130 err = -EISCONN;
1131 else
1132 err = -EALREADY;
1133 goto out_free;
1134 }
1135
1136
1137
1138
1139
1140 if (sctp_endpoint_is_peeled_off(ep, &to)) {
1141 err = -EADDRNOTAVAIL;
1142 goto out_free;
1143 }
1144
1145 if (!asoc) {
1146
1147
1148
1149
1150
1151 if (!ep->base.bind_addr.port) {
1152 if (sctp_autobind(sk)) {
1153 err = -EAGAIN;
1154 goto out_free;
1155 }
1156 } else {
1157
1158
1159
1160
1161
1162
1163
1164 if (ep->base.bind_addr.port < PROT_SOCK &&
1165 !capable(CAP_NET_BIND_SERVICE)) {
1166 err = -EACCES;
1167 goto out_free;
1168 }
1169 }
1170
1171 scope = sctp_scope(&to);
1172 asoc = sctp_association_new(ep, sk, scope, GFP_KERNEL);
1173 if (!asoc) {
1174 err = -ENOMEM;
1175 goto out_free;
1176 }
1177
1178 err = sctp_assoc_set_bind_addr_from_ep(asoc, scope,
1179 GFP_KERNEL);
1180 if (err < 0) {
1181 goto out_free;
1182 }
1183
1184 }
1185
1186
1187 transport = sctp_assoc_add_peer(asoc, &to, GFP_KERNEL,
1188 SCTP_UNKNOWN);
1189 if (!transport) {
1190 err = -ENOMEM;
1191 goto out_free;
1192 }
1193
1194 addrcnt++;
1195 addr_buf += af->sockaddr_len;
1196 walk_size += af->sockaddr_len;
1197 }
1198
1199
1200
1201
1202 if (assoc_id) {
1203 err = sctp_assoc_set_id(asoc, GFP_KERNEL);
1204 if (err < 0)
1205 goto out_free;
1206 }
1207
1208 err = sctp_primitive_ASSOCIATE(net, asoc, NULL);
1209 if (err < 0) {
1210 goto out_free;
1211 }
1212
1213
1214 inet_sk(sk)->inet_dport = htons(asoc->peer.port);
1215 af = sctp_get_af_specific(sa_addr->sa.sa_family);
1216 af->to_sk_daddr(sa_addr, sk);
1217 sk->sk_err = 0;
1218
1219
1220
1221
1222 if (sk->sk_socket->file)
1223 f_flags = sk->sk_socket->file->f_flags;
1224
1225 timeo = sock_sndtimeo(sk, f_flags & O_NONBLOCK);
1226
1227 err = sctp_wait_for_connect(asoc, &timeo);
1228 if ((err == 0 || err == -EINPROGRESS) && assoc_id)
1229 *assoc_id = asoc->assoc_id;
1230
1231
1232 asoc = NULL;
1233
1234out_free:
1235
1236 SCTP_DEBUG_PRINTK("About to exit __sctp_connect() free asoc: %p"
1237 " kaddrs: %p err: %d\n",
1238 asoc, kaddrs, err);
1239 if (asoc) {
1240
1241
1242
1243
1244 sctp_unhash_established(asoc);
1245 sctp_association_free(asoc);
1246 }
1247 return err;
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
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312SCTP_STATIC int __sctp_setsockopt_connectx(struct sock* sk,
1313 struct sockaddr __user *addrs,
1314 int addrs_size,
1315 sctp_assoc_t *assoc_id)
1316{
1317 int err = 0;
1318 struct sockaddr *kaddrs;
1319
1320 SCTP_DEBUG_PRINTK("%s - sk %p addrs %p addrs_size %d\n",
1321 __func__, sk, addrs, addrs_size);
1322
1323 if (unlikely(addrs_size <= 0))
1324 return -EINVAL;
1325
1326
1327 if (unlikely(!access_ok(VERIFY_READ, addrs, addrs_size)))
1328 return -EFAULT;
1329
1330
1331 kaddrs = kmalloc(addrs_size, GFP_KERNEL);
1332 if (unlikely(!kaddrs))
1333 return -ENOMEM;
1334
1335 if (__copy_from_user(kaddrs, addrs, addrs_size)) {
1336 err = -EFAULT;
1337 } else {
1338 err = __sctp_connect(sk, kaddrs, addrs_size, assoc_id);
1339 }
1340
1341 kfree(kaddrs);
1342
1343 return err;
1344}
1345
1346
1347
1348
1349
1350SCTP_STATIC int sctp_setsockopt_connectx_old(struct sock* sk,
1351 struct sockaddr __user *addrs,
1352 int addrs_size)
1353{
1354 return __sctp_setsockopt_connectx(sk, addrs, addrs_size, NULL);
1355}
1356
1357
1358
1359
1360
1361
1362
1363SCTP_STATIC int sctp_setsockopt_connectx(struct sock* sk,
1364 struct sockaddr __user *addrs,
1365 int addrs_size)
1366{
1367 sctp_assoc_t assoc_id = 0;
1368 int err = 0;
1369
1370 err = __sctp_setsockopt_connectx(sk, addrs, addrs_size, &assoc_id);
1371
1372 if (err)
1373 return err;
1374 else
1375 return assoc_id;
1376}
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386SCTP_STATIC int sctp_getsockopt_connectx3(struct sock* sk, int len,
1387 char __user *optval,
1388 int __user *optlen)
1389{
1390 struct sctp_getaddrs_old param;
1391 sctp_assoc_t assoc_id = 0;
1392 int err = 0;
1393
1394 if (len < sizeof(param))
1395 return -EINVAL;
1396
1397 if (copy_from_user(¶m, optval, sizeof(param)))
1398 return -EFAULT;
1399
1400 err = __sctp_setsockopt_connectx(sk,
1401 (struct sockaddr __user *)param.addrs,
1402 param.addr_num, &assoc_id);
1403
1404 if (err == 0 || err == -EINPROGRESS) {
1405 if (copy_to_user(optval, &assoc_id, sizeof(assoc_id)))
1406 return -EFAULT;
1407 if (put_user(sizeof(assoc_id), optlen))
1408 return -EFAULT;
1409 }
1410
1411 return err;
1412}
1413
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
1464SCTP_STATIC void sctp_close(struct sock *sk, long timeout)
1465{
1466 struct net *net = sock_net(sk);
1467 struct sctp_endpoint *ep;
1468 struct sctp_association *asoc;
1469 struct list_head *pos, *temp;
1470 unsigned int data_was_unread;
1471
1472 SCTP_DEBUG_PRINTK("sctp_close(sk: 0x%p, timeout:%ld)\n", sk, timeout);
1473
1474 sctp_lock_sock(sk);
1475 sk->sk_shutdown = SHUTDOWN_MASK;
1476 sk->sk_state = SCTP_SS_CLOSING;
1477
1478 ep = sctp_sk(sk)->ep;
1479
1480
1481 data_was_unread = sctp_queue_purge_ulpevents(&sk->sk_receive_queue);
1482 data_was_unread += sctp_queue_purge_ulpevents(&sctp_sk(sk)->pd_lobby);
1483
1484
1485 list_for_each_safe(pos, temp, &ep->asocs) {
1486 asoc = list_entry(pos, struct sctp_association, asocs);
1487
1488 if (sctp_style(sk, TCP)) {
1489
1490
1491
1492
1493
1494 if (sctp_state(asoc, CLOSED)) {
1495 sctp_unhash_established(asoc);
1496 sctp_association_free(asoc);
1497 continue;
1498 }
1499 }
1500
1501 if (data_was_unread || !skb_queue_empty(&asoc->ulpq.lobby) ||
1502 !skb_queue_empty(&asoc->ulpq.reasm) ||
1503 (sock_flag(sk, SOCK_LINGER) && !sk->sk_lingertime)) {
1504 struct sctp_chunk *chunk;
1505
1506 chunk = sctp_make_abort_user(asoc, NULL, 0);
1507 if (chunk)
1508 sctp_primitive_ABORT(net, asoc, chunk);
1509 } else
1510 sctp_primitive_SHUTDOWN(net, asoc, NULL);
1511 }
1512
1513
1514 if (sctp_style(sk, TCP) && timeout)
1515 sctp_wait_for_close(sk, timeout);
1516
1517
1518 sctp_release_sock(sk);
1519
1520
1521
1522
1523 sctp_local_bh_disable();
1524 sctp_bh_lock_sock(sk);
1525
1526
1527
1528
1529 sock_hold(sk);
1530 sk_common_release(sk);
1531
1532 sctp_bh_unlock_sock(sk);
1533 sctp_local_bh_enable();
1534
1535 sock_put(sk);
1536
1537 SCTP_DBG_OBJCNT_DEC(sock);
1538}
1539
1540
1541static int sctp_error(struct sock *sk, int flags, int err)
1542{
1543 if (err == -EPIPE)
1544 err = sock_error(sk) ? : -EPIPE;
1545 if (err == -EPIPE && !(flags & MSG_NOSIGNAL))
1546 send_sig(SIGPIPE, current, 0);
1547 return err;
1548}
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573SCTP_STATIC int sctp_msghdr_parse(const struct msghdr *, sctp_cmsgs_t *);
1574
1575SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk,
1576 struct msghdr *msg, size_t msg_len)
1577{
1578 struct net *net = sock_net(sk);
1579 struct sctp_sock *sp;
1580 struct sctp_endpoint *ep;
1581 struct sctp_association *new_asoc=NULL, *asoc=NULL;
1582 struct sctp_transport *transport, *chunk_tp;
1583 struct sctp_chunk *chunk;
1584 union sctp_addr to;
1585 struct sockaddr *msg_name = NULL;
1586 struct sctp_sndrcvinfo default_sinfo;
1587 struct sctp_sndrcvinfo *sinfo;
1588 struct sctp_initmsg *sinit;
1589 sctp_assoc_t associd = 0;
1590 sctp_cmsgs_t cmsgs = { NULL };
1591 int err;
1592 sctp_scope_t scope;
1593 long timeo;
1594 __u16 sinfo_flags = 0;
1595 struct sctp_datamsg *datamsg;
1596 int msg_flags = msg->msg_flags;
1597
1598 SCTP_DEBUG_PRINTK("sctp_sendmsg(sk: %p, msg: %p, msg_len: %zu)\n",
1599 sk, msg, msg_len);
1600
1601 err = 0;
1602 sp = sctp_sk(sk);
1603 ep = sp->ep;
1604
1605 SCTP_DEBUG_PRINTK("Using endpoint: %p.\n", ep);
1606
1607
1608 if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING)) {
1609 err = -EPIPE;
1610 goto out_nounlock;
1611 }
1612
1613
1614 err = sctp_msghdr_parse(msg, &cmsgs);
1615
1616 if (err) {
1617 SCTP_DEBUG_PRINTK("msghdr parse err = %x\n", err);
1618 goto out_nounlock;
1619 }
1620
1621
1622
1623
1624
1625
1626 if (!sctp_style(sk, UDP_HIGH_BANDWIDTH) && msg->msg_name) {
1627 int msg_namelen = msg->msg_namelen;
1628
1629 err = sctp_verify_addr(sk, (union sctp_addr *)msg->msg_name,
1630 msg_namelen);
1631 if (err)
1632 return err;
1633
1634 if (msg_namelen > sizeof(to))
1635 msg_namelen = sizeof(to);
1636 memcpy(&to, msg->msg_name, msg_namelen);
1637 msg_name = msg->msg_name;
1638 }
1639
1640 sinfo = cmsgs.info;
1641 sinit = cmsgs.init;
1642
1643
1644 if (sinfo) {
1645 sinfo_flags = sinfo->sinfo_flags;
1646 associd = sinfo->sinfo_assoc_id;
1647 }
1648
1649 SCTP_DEBUG_PRINTK("msg_len: %zu, sinfo_flags: 0x%x\n",
1650 msg_len, sinfo_flags);
1651
1652
1653 if (sctp_style(sk, TCP) && (sinfo_flags & (SCTP_EOF | SCTP_ABORT))) {
1654 err = -EINVAL;
1655 goto out_nounlock;
1656 }
1657
1658
1659
1660
1661
1662
1663 if (((sinfo_flags & SCTP_EOF) && (msg_len > 0)) ||
1664 (!(sinfo_flags & (SCTP_EOF|SCTP_ABORT)) && (msg_len == 0))) {
1665 err = -EINVAL;
1666 goto out_nounlock;
1667 }
1668
1669
1670
1671
1672 if ((sinfo_flags & SCTP_ADDR_OVER) && (!msg->msg_name)) {
1673 err = -EINVAL;
1674 goto out_nounlock;
1675 }
1676
1677 transport = NULL;
1678
1679 SCTP_DEBUG_PRINTK("About to look up association.\n");
1680
1681 sctp_lock_sock(sk);
1682
1683
1684 if (msg_name) {
1685
1686 asoc = sctp_endpoint_lookup_assoc(ep, &to, &transport);
1687 if (!asoc) {
1688
1689
1690
1691
1692
1693 if ((sctp_style(sk, TCP) &&
1694 sctp_sstate(sk, ESTABLISHED)) ||
1695 sctp_endpoint_is_peeled_off(ep, &to)) {
1696 err = -EADDRNOTAVAIL;
1697 goto out_unlock;
1698 }
1699 }
1700 } else {
1701 asoc = sctp_id2assoc(sk, associd);
1702 if (!asoc) {
1703 err = -EPIPE;
1704 goto out_unlock;
1705 }
1706 }
1707
1708 if (asoc) {
1709 SCTP_DEBUG_PRINTK("Just looked up association: %p.\n", asoc);
1710
1711
1712
1713
1714
1715
1716 if (sctp_state(asoc, CLOSED) && sctp_style(sk, TCP)) {
1717 err = -EPIPE;
1718 goto out_unlock;
1719 }
1720
1721 if (sinfo_flags & SCTP_EOF) {
1722 SCTP_DEBUG_PRINTK("Shutting down association: %p\n",
1723 asoc);
1724 sctp_primitive_SHUTDOWN(net, asoc, NULL);
1725 err = 0;
1726 goto out_unlock;
1727 }
1728 if (sinfo_flags & SCTP_ABORT) {
1729
1730 chunk = sctp_make_abort_user(asoc, msg, msg_len);
1731 if (!chunk) {
1732 err = -ENOMEM;
1733 goto out_unlock;
1734 }
1735
1736 SCTP_DEBUG_PRINTK("Aborting association: %p\n", asoc);
1737 sctp_primitive_ABORT(net, asoc, chunk);
1738 err = 0;
1739 goto out_unlock;
1740 }
1741 }
1742
1743
1744 if (!asoc) {
1745 SCTP_DEBUG_PRINTK("There is no association yet.\n");
1746
1747 if (sinfo_flags & (SCTP_EOF | SCTP_ABORT)) {
1748 err = -EINVAL;
1749 goto out_unlock;
1750 }
1751
1752
1753
1754
1755 if (sinfo) {
1756 if (!sinit || (sinit && !sinit->sinit_num_ostreams)) {
1757
1758 if (sinfo->sinfo_stream >=
1759 sp->initmsg.sinit_num_ostreams) {
1760 err = -EINVAL;
1761 goto out_unlock;
1762 }
1763 } else {
1764
1765 if (sinfo->sinfo_stream >=
1766 sinit->sinit_num_ostreams) {
1767 err = -EINVAL;
1768 goto out_unlock;
1769 }
1770 }
1771 }
1772
1773
1774
1775
1776
1777
1778
1779
1780 if (!ep->base.bind_addr.port) {
1781 if (sctp_autobind(sk)) {
1782 err = -EAGAIN;
1783 goto out_unlock;
1784 }
1785 } else {
1786
1787
1788
1789
1790
1791
1792
1793 if (ep->base.bind_addr.port < PROT_SOCK &&
1794 !capable(CAP_NET_BIND_SERVICE)) {
1795 err = -EACCES;
1796 goto out_unlock;
1797 }
1798 }
1799
1800 scope = sctp_scope(&to);
1801 new_asoc = sctp_association_new(ep, sk, scope, GFP_KERNEL);
1802 if (!new_asoc) {
1803 err = -ENOMEM;
1804 goto out_unlock;
1805 }
1806 asoc = new_asoc;
1807 err = sctp_assoc_set_bind_addr_from_ep(asoc, scope, GFP_KERNEL);
1808 if (err < 0) {
1809 err = -ENOMEM;
1810 goto out_free;
1811 }
1812
1813
1814
1815
1816 if (sinit) {
1817 if (sinit->sinit_num_ostreams) {
1818 asoc->c.sinit_num_ostreams =
1819 sinit->sinit_num_ostreams;
1820 }
1821 if (sinit->sinit_max_instreams) {
1822 asoc->c.sinit_max_instreams =
1823 sinit->sinit_max_instreams;
1824 }
1825 if (sinit->sinit_max_attempts) {
1826 asoc->max_init_attempts
1827 = sinit->sinit_max_attempts;
1828 }
1829 if (sinit->sinit_max_init_timeo) {
1830 asoc->max_init_timeo =
1831 msecs_to_jiffies(sinit->sinit_max_init_timeo);
1832 }
1833 }
1834
1835
1836 transport = sctp_assoc_add_peer(asoc, &to, GFP_KERNEL, SCTP_UNKNOWN);
1837 if (!transport) {
1838 err = -ENOMEM;
1839 goto out_free;
1840 }
1841 }
1842
1843
1844 SCTP_DEBUG_PRINTK("We have a valid association.\n");
1845
1846 if (!sinfo) {
1847
1848
1849
1850 memset(&default_sinfo, 0, sizeof(default_sinfo));
1851 default_sinfo.sinfo_stream = asoc->default_stream;
1852 default_sinfo.sinfo_flags = asoc->default_flags;
1853 default_sinfo.sinfo_ppid = asoc->default_ppid;
1854 default_sinfo.sinfo_context = asoc->default_context;
1855 default_sinfo.sinfo_timetolive = asoc->default_timetolive;
1856 default_sinfo.sinfo_assoc_id = sctp_assoc2id(asoc);
1857 sinfo = &default_sinfo;
1858 }
1859
1860
1861
1862
1863 if (msg_len > sk->sk_sndbuf) {
1864 err = -EMSGSIZE;
1865 goto out_free;
1866 }
1867
1868 if (asoc->pmtu_pending)
1869 sctp_assoc_pending_pmtu(sk, asoc);
1870
1871
1872
1873
1874
1875
1876 if (sctp_sk(sk)->disable_fragments && (msg_len > asoc->frag_point)) {
1877 err = -EMSGSIZE;
1878 goto out_free;
1879 }
1880
1881
1882 if (sinfo->sinfo_stream >= asoc->c.sinit_num_ostreams) {
1883 err = -EINVAL;
1884 goto out_free;
1885 }
1886
1887 timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT);
1888 if (!sctp_wspace(asoc)) {
1889 err = sctp_wait_for_sndbuf(asoc, &timeo, msg_len);
1890 if (err)
1891 goto out_free;
1892 }
1893
1894
1895
1896
1897
1898 if ((sctp_style(sk, TCP) && msg_name) ||
1899 (sinfo_flags & SCTP_ADDR_OVER)) {
1900 chunk_tp = sctp_assoc_lookup_paddr(asoc, &to);
1901 if (!chunk_tp) {
1902 err = -EINVAL;
1903 goto out_free;
1904 }
1905 } else
1906 chunk_tp = NULL;
1907
1908
1909 if (sctp_state(asoc, CLOSED)) {
1910 err = sctp_primitive_ASSOCIATE(net, asoc, NULL);
1911 if (err < 0)
1912 goto out_free;
1913 SCTP_DEBUG_PRINTK("We associated primitively.\n");
1914 }
1915
1916
1917 datamsg = sctp_datamsg_from_user(asoc, sinfo, msg, msg_len);
1918 if (IS_ERR(datamsg)) {
1919 err = PTR_ERR(datamsg);
1920 goto out_free;
1921 }
1922
1923
1924 list_for_each_entry(chunk, &datamsg->chunks, frag_list) {
1925 sctp_chunk_hold(chunk);
1926
1927
1928 sctp_set_owner_w(chunk);
1929
1930 chunk->transport = chunk_tp;
1931 }
1932
1933
1934
1935
1936
1937
1938 err = sctp_primitive_SEND(net, asoc, datamsg);
1939
1940 if (err)
1941 sctp_datamsg_free(datamsg);
1942 else
1943 sctp_datamsg_put(datamsg);
1944
1945 SCTP_DEBUG_PRINTK("We sent primitively.\n");
1946
1947 if (err)
1948 goto out_free;
1949 else
1950 err = msg_len;
1951
1952
1953
1954
1955 goto out_unlock;
1956
1957out_free:
1958 if (new_asoc) {
1959 sctp_unhash_established(asoc);
1960 sctp_association_free(asoc);
1961 }
1962out_unlock:
1963 sctp_release_sock(sk);
1964
1965out_nounlock:
1966 return sctp_error(sk, msg_flags, err);
1967
1968#if 0
1969do_sock_err:
1970 if (msg_len)
1971 err = msg_len;
1972 else
1973 err = sock_error(sk);
1974 goto out;
1975
1976do_interrupted:
1977 if (msg_len)
1978 err = msg_len;
1979 goto out;
1980#endif
1981}
1982
1983
1984
1985
1986
1987
1988
1989
1990static int sctp_skb_pull(struct sk_buff *skb, int len)
1991{
1992 struct sk_buff *list;
1993 int skb_len = skb_headlen(skb);
1994 int rlen;
1995
1996 if (len <= skb_len) {
1997 __skb_pull(skb, len);
1998 return 0;
1999 }
2000 len -= skb_len;
2001 __skb_pull(skb, skb_len);
2002
2003 skb_walk_frags(skb, list) {
2004 rlen = sctp_skb_pull(list, len);
2005 skb->len -= (len-rlen);
2006 skb->data_len -= (len-rlen);
2007
2008 if (!rlen)
2009 return 0;
2010
2011 len = rlen;
2012 }
2013
2014 return len;
2015}
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032static struct sk_buff *sctp_skb_recv_datagram(struct sock *, int, int, int *);
2033
2034SCTP_STATIC int sctp_recvmsg(struct kiocb *iocb, struct sock *sk,
2035 struct msghdr *msg, size_t len, int noblock,
2036 int flags, int *addr_len)
2037{
2038 struct sctp_ulpevent *event = NULL;
2039 struct sctp_sock *sp = sctp_sk(sk);
2040 struct sk_buff *skb;
2041 int copied;
2042 int err = 0;
2043 int skb_len;
2044
2045 SCTP_DEBUG_PRINTK("sctp_recvmsg(%s: %p, %s: %p, %s: %zd, %s: %d, %s: "
2046 "0x%x, %s: %p)\n", "sk", sk, "msghdr", msg,
2047 "len", len, "knoblauch", noblock,
2048 "flags", flags, "addr_len", addr_len);
2049
2050 sctp_lock_sock(sk);
2051
2052 if (sctp_style(sk, TCP) && !sctp_sstate(sk, ESTABLISHED)) {
2053 err = -ENOTCONN;
2054 goto out;
2055 }
2056
2057 skb = sctp_skb_recv_datagram(sk, flags, noblock, &err);
2058 if (!skb)
2059 goto out;
2060
2061
2062
2063
2064 skb_len = skb->len;
2065
2066 copied = skb_len;
2067 if (copied > len)
2068 copied = len;
2069
2070 err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
2071
2072 event = sctp_skb2event(skb);
2073
2074 if (err)
2075 goto out_free;
2076
2077 sock_recv_ts_and_drops(msg, sk, skb);
2078 if (sctp_ulpevent_is_notification(event)) {
2079 msg->msg_flags |= MSG_NOTIFICATION;
2080 sp->pf->event_msgname(event, msg->msg_name, addr_len);
2081 } else {
2082 sp->pf->skb_msgname(skb, msg->msg_name, addr_len);
2083 }
2084
2085
2086 if (sp->subscribe.sctp_data_io_event)
2087 sctp_ulpevent_read_sndrcvinfo(event, msg);
2088#if 0
2089
2090 if (sk->sk_protinfo.af_inet.cmsg_flags)
2091 ip_cmsg_recv(msg, skb);
2092#endif
2093
2094 err = copied;
2095
2096
2097
2098
2099
2100 if (skb_len > copied) {
2101 msg->msg_flags &= ~MSG_EOR;
2102 if (flags & MSG_PEEK)
2103 goto out_free;
2104 sctp_skb_pull(skb, copied);
2105 skb_queue_head(&sk->sk_receive_queue, skb);
2106
2107
2108
2109
2110
2111 if (!sctp_ulpevent_is_notification(event))
2112 sctp_assoc_rwnd_increase(event->asoc, copied);
2113 goto out;
2114 } else if ((event->msg_flags & MSG_NOTIFICATION) ||
2115 (event->msg_flags & MSG_EOR))
2116 msg->msg_flags |= MSG_EOR;
2117 else
2118 msg->msg_flags &= ~MSG_EOR;
2119
2120out_free:
2121 if (flags & MSG_PEEK) {
2122
2123
2124
2125 kfree_skb(skb);
2126 } else {
2127
2128
2129
2130
2131 sctp_ulpevent_free(event);
2132 }
2133out:
2134 sctp_release_sock(sk);
2135 return err;
2136}
2137
2138
2139
2140
2141
2142
2143
2144
2145static int sctp_setsockopt_disable_fragments(struct sock *sk,
2146 char __user *optval,
2147 unsigned int optlen)
2148{
2149 int val;
2150
2151 if (optlen < sizeof(int))
2152 return -EINVAL;
2153
2154 if (get_user(val, (int __user *)optval))
2155 return -EFAULT;
2156
2157 sctp_sk(sk)->disable_fragments = (val == 0) ? 0 : 1;
2158
2159 return 0;
2160}
2161
2162static int sctp_setsockopt_events(struct sock *sk, char __user *optval,
2163 unsigned int optlen)
2164{
2165 struct sctp_association *asoc;
2166 struct sctp_ulpevent *event;
2167
2168 if (optlen > sizeof(struct sctp_event_subscribe))
2169 return -EINVAL;
2170 if (copy_from_user(&sctp_sk(sk)->subscribe, optval, optlen))
2171 return -EFAULT;
2172
2173
2174
2175
2176
2177
2178 if (sctp_ulpevent_type_enabled(SCTP_SENDER_DRY_EVENT,
2179 &sctp_sk(sk)->subscribe)) {
2180 asoc = sctp_id2assoc(sk, 0);
2181
2182 if (asoc && sctp_outq_is_empty(&asoc->outqueue)) {
2183 event = sctp_ulpevent_make_sender_dry_event(asoc,
2184 GFP_ATOMIC);
2185 if (!event)
2186 return -ENOMEM;
2187
2188 sctp_ulpq_tail_event(&asoc->ulpq, event);
2189 }
2190 }
2191
2192 return 0;
2193}
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206static int sctp_setsockopt_autoclose(struct sock *sk, char __user *optval,
2207 unsigned int optlen)
2208{
2209 struct sctp_sock *sp = sctp_sk(sk);
2210
2211
2212 if (sctp_style(sk, TCP))
2213 return -EOPNOTSUPP;
2214 if (optlen != sizeof(int))
2215 return -EINVAL;
2216 if (copy_from_user(&sp->autoclose, optval, optlen))
2217 return -EFAULT;
2218
2219 return 0;
2220}
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
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
2319static int sctp_apply_peer_addr_params(struct sctp_paddrparams *params,
2320 struct sctp_transport *trans,
2321 struct sctp_association *asoc,
2322 struct sctp_sock *sp,
2323 int hb_change,
2324 int pmtud_change,
2325 int sackdelay_change)
2326{
2327 int error;
2328
2329 if (params->spp_flags & SPP_HB_DEMAND && trans) {
2330 struct net *net = sock_net(trans->asoc->base.sk);
2331
2332 error = sctp_primitive_REQUESTHEARTBEAT(net, trans->asoc, trans);
2333 if (error)
2334 return error;
2335 }
2336
2337
2338
2339
2340
2341 if (params->spp_flags & SPP_HB_ENABLE) {
2342
2343
2344
2345
2346
2347 if (params->spp_flags & SPP_HB_TIME_IS_ZERO)
2348 params->spp_hbinterval = 0;
2349
2350 if (params->spp_hbinterval ||
2351 (params->spp_flags & SPP_HB_TIME_IS_ZERO)) {
2352 if (trans) {
2353 trans->hbinterval =
2354 msecs_to_jiffies(params->spp_hbinterval);
2355 } else if (asoc) {
2356 asoc->hbinterval =
2357 msecs_to_jiffies(params->spp_hbinterval);
2358 } else {
2359 sp->hbinterval = params->spp_hbinterval;
2360 }
2361 }
2362 }
2363
2364 if (hb_change) {
2365 if (trans) {
2366 trans->param_flags =
2367 (trans->param_flags & ~SPP_HB) | hb_change;
2368 } else if (asoc) {
2369 asoc->param_flags =
2370 (asoc->param_flags & ~SPP_HB) | hb_change;
2371 } else {
2372 sp->param_flags =
2373 (sp->param_flags & ~SPP_HB) | hb_change;
2374 }
2375 }
2376
2377
2378
2379
2380
2381
2382 if ((params->spp_flags & SPP_PMTUD_DISABLE) && params->spp_pathmtu) {
2383 if (trans) {
2384 trans->pathmtu = params->spp_pathmtu;
2385 sctp_assoc_sync_pmtu(sctp_opt2sk(sp), asoc);
2386 } else if (asoc) {
2387 asoc->pathmtu = params->spp_pathmtu;
2388 sctp_frag_point(asoc, params->spp_pathmtu);
2389 } else {
2390 sp->pathmtu = params->spp_pathmtu;
2391 }
2392 }
2393
2394 if (pmtud_change) {
2395 if (trans) {
2396 int update = (trans->param_flags & SPP_PMTUD_DISABLE) &&
2397 (params->spp_flags & SPP_PMTUD_ENABLE);
2398 trans->param_flags =
2399 (trans->param_flags & ~SPP_PMTUD) | pmtud_change;
2400 if (update) {
2401 sctp_transport_pmtu(trans, sctp_opt2sk(sp));
2402 sctp_assoc_sync_pmtu(sctp_opt2sk(sp), asoc);
2403 }
2404 } else if (asoc) {
2405 asoc->param_flags =
2406 (asoc->param_flags & ~SPP_PMTUD) | pmtud_change;
2407 } else {
2408 sp->param_flags =
2409 (sp->param_flags & ~SPP_PMTUD) | pmtud_change;
2410 }
2411 }
2412
2413
2414
2415
2416
2417 if ((params->spp_flags & SPP_SACKDELAY_ENABLE) && params->spp_sackdelay) {
2418 if (trans) {
2419 trans->sackdelay =
2420 msecs_to_jiffies(params->spp_sackdelay);
2421 } else if (asoc) {
2422 asoc->sackdelay =
2423 msecs_to_jiffies(params->spp_sackdelay);
2424 } else {
2425 sp->sackdelay = params->spp_sackdelay;
2426 }
2427 }
2428
2429 if (sackdelay_change) {
2430 if (trans) {
2431 trans->param_flags =
2432 (trans->param_flags & ~SPP_SACKDELAY) |
2433 sackdelay_change;
2434 } else if (asoc) {
2435 asoc->param_flags =
2436 (asoc->param_flags & ~SPP_SACKDELAY) |
2437 sackdelay_change;
2438 } else {
2439 sp->param_flags =
2440 (sp->param_flags & ~SPP_SACKDELAY) |
2441 sackdelay_change;
2442 }
2443 }
2444
2445
2446
2447
2448 if (params->spp_pathmaxrxt) {
2449 if (trans) {
2450 trans->pathmaxrxt = params->spp_pathmaxrxt;
2451 } else if (asoc) {
2452 asoc->pathmaxrxt = params->spp_pathmaxrxt;
2453 } else {
2454 sp->pathmaxrxt = params->spp_pathmaxrxt;
2455 }
2456 }
2457
2458 return 0;
2459}
2460
2461static int sctp_setsockopt_peer_addr_params(struct sock *sk,
2462 char __user *optval,
2463 unsigned int optlen)
2464{
2465 struct sctp_paddrparams params;
2466 struct sctp_transport *trans = NULL;
2467 struct sctp_association *asoc = NULL;
2468 struct sctp_sock *sp = sctp_sk(sk);
2469 int error;
2470 int hb_change, pmtud_change, sackdelay_change;
2471
2472 if (optlen != sizeof(struct sctp_paddrparams))
2473 return - EINVAL;
2474
2475 if (copy_from_user(¶ms, optval, optlen))
2476 return -EFAULT;
2477
2478
2479 hb_change = params.spp_flags & SPP_HB;
2480 pmtud_change = params.spp_flags & SPP_PMTUD;
2481 sackdelay_change = params.spp_flags & SPP_SACKDELAY;
2482
2483 if (hb_change == SPP_HB ||
2484 pmtud_change == SPP_PMTUD ||
2485 sackdelay_change == SPP_SACKDELAY ||
2486 params.spp_sackdelay > 500 ||
2487 (params.spp_pathmtu &&
2488 params.spp_pathmtu < SCTP_DEFAULT_MINSEGMENT))
2489 return -EINVAL;
2490
2491
2492
2493
2494 if (!sctp_is_any(sk, ( union sctp_addr *)¶ms.spp_address)) {
2495 trans = sctp_addr_id2transport(sk, ¶ms.spp_address,
2496 params.spp_assoc_id);
2497 if (!trans)
2498 return -EINVAL;
2499 }
2500
2501
2502
2503
2504
2505 asoc = sctp_id2assoc(sk, params.spp_assoc_id);
2506 if (!asoc && params.spp_assoc_id && sctp_style(sk, UDP))
2507 return -EINVAL;
2508
2509
2510
2511
2512 if (params.spp_flags & SPP_HB_DEMAND && !trans && !asoc)
2513 return -EINVAL;
2514
2515
2516 error = sctp_apply_peer_addr_params(¶ms, trans, asoc, sp,
2517 hb_change, pmtud_change,
2518 sackdelay_change);
2519
2520 if (error)
2521 return error;
2522
2523
2524
2525
2526 if (!trans && asoc) {
2527 list_for_each_entry(trans, &asoc->peer.transport_addr_list,
2528 transports) {
2529 sctp_apply_peer_addr_params(¶ms, trans, asoc, sp,
2530 hb_change, pmtud_change,
2531 sackdelay_change);
2532 }
2533 }
2534
2535 return 0;
2536}
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574static int sctp_setsockopt_delayed_ack(struct sock *sk,
2575 char __user *optval, unsigned int optlen)
2576{
2577 struct sctp_sack_info params;
2578 struct sctp_transport *trans = NULL;
2579 struct sctp_association *asoc = NULL;
2580 struct sctp_sock *sp = sctp_sk(sk);
2581
2582 if (optlen == sizeof(struct sctp_sack_info)) {
2583 if (copy_from_user(¶ms, optval, optlen))
2584 return -EFAULT;
2585
2586 if (params.sack_delay == 0 && params.sack_freq == 0)
2587 return 0;
2588 } else if (optlen == sizeof(struct sctp_assoc_value)) {
2589 pr_warn("Use of struct sctp_assoc_value in delayed_ack socket option deprecated\n");
2590 pr_warn("Use struct sctp_sack_info instead\n");
2591 if (copy_from_user(¶ms, optval, optlen))
2592 return -EFAULT;
2593
2594 if (params.sack_delay == 0)
2595 params.sack_freq = 1;
2596 else
2597 params.sack_freq = 0;
2598 } else
2599 return - EINVAL;
2600
2601
2602 if (params.sack_delay > 500)
2603 return -EINVAL;
2604
2605
2606
2607
2608
2609 asoc = sctp_id2assoc(sk, params.sack_assoc_id);
2610 if (!asoc && params.sack_assoc_id && sctp_style(sk, UDP))
2611 return -EINVAL;
2612
2613 if (params.sack_delay) {
2614 if (asoc) {
2615 asoc->sackdelay =
2616 msecs_to_jiffies(params.sack_delay);
2617 asoc->param_flags =
2618 (asoc->param_flags & ~SPP_SACKDELAY) |
2619 SPP_SACKDELAY_ENABLE;
2620 } else {
2621 sp->sackdelay = params.sack_delay;
2622 sp->param_flags =
2623 (sp->param_flags & ~SPP_SACKDELAY) |
2624 SPP_SACKDELAY_ENABLE;
2625 }
2626 }
2627
2628 if (params.sack_freq == 1) {
2629 if (asoc) {
2630 asoc->param_flags =
2631 (asoc->param_flags & ~SPP_SACKDELAY) |
2632 SPP_SACKDELAY_DISABLE;
2633 } else {
2634 sp->param_flags =
2635 (sp->param_flags & ~SPP_SACKDELAY) |
2636 SPP_SACKDELAY_DISABLE;
2637 }
2638 } else if (params.sack_freq > 1) {
2639 if (asoc) {
2640 asoc->sackfreq = params.sack_freq;
2641 asoc->param_flags =
2642 (asoc->param_flags & ~SPP_SACKDELAY) |
2643 SPP_SACKDELAY_ENABLE;
2644 } else {
2645 sp->sackfreq = params.sack_freq;
2646 sp->param_flags =
2647 (sp->param_flags & ~SPP_SACKDELAY) |
2648 SPP_SACKDELAY_ENABLE;
2649 }
2650 }
2651
2652
2653 if (asoc) {
2654 list_for_each_entry(trans, &asoc->peer.transport_addr_list,
2655 transports) {
2656 if (params.sack_delay) {
2657 trans->sackdelay =
2658 msecs_to_jiffies(params.sack_delay);
2659 trans->param_flags =
2660 (trans->param_flags & ~SPP_SACKDELAY) |
2661 SPP_SACKDELAY_ENABLE;
2662 }
2663 if (params.sack_freq == 1) {
2664 trans->param_flags =
2665 (trans->param_flags & ~SPP_SACKDELAY) |
2666 SPP_SACKDELAY_DISABLE;
2667 } else if (params.sack_freq > 1) {
2668 trans->sackfreq = params.sack_freq;
2669 trans->param_flags =
2670 (trans->param_flags & ~SPP_SACKDELAY) |
2671 SPP_SACKDELAY_ENABLE;
2672 }
2673 }
2674 }
2675
2676 return 0;
2677}
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690static int sctp_setsockopt_initmsg(struct sock *sk, char __user *optval, unsigned int optlen)
2691{
2692 struct sctp_initmsg sinit;
2693 struct sctp_sock *sp = sctp_sk(sk);
2694
2695 if (optlen != sizeof(struct sctp_initmsg))
2696 return -EINVAL;
2697 if (copy_from_user(&sinit, optval, optlen))
2698 return -EFAULT;
2699
2700 if (sinit.sinit_num_ostreams)
2701 sp->initmsg.sinit_num_ostreams = sinit.sinit_num_ostreams;
2702 if (sinit.sinit_max_instreams)
2703 sp->initmsg.sinit_max_instreams = sinit.sinit_max_instreams;
2704 if (sinit.sinit_max_attempts)
2705 sp->initmsg.sinit_max_attempts = sinit.sinit_max_attempts;
2706 if (sinit.sinit_max_init_timeo)
2707 sp->initmsg.sinit_max_init_timeo = sinit.sinit_max_init_timeo;
2708
2709 return 0;
2710}
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726static int sctp_setsockopt_default_send_param(struct sock *sk,
2727 char __user *optval,
2728 unsigned int optlen)
2729{
2730 struct sctp_sndrcvinfo info;
2731 struct sctp_association *asoc;
2732 struct sctp_sock *sp = sctp_sk(sk);
2733
2734 if (optlen != sizeof(struct sctp_sndrcvinfo))
2735 return -EINVAL;
2736 if (copy_from_user(&info, optval, optlen))
2737 return -EFAULT;
2738
2739 asoc = sctp_id2assoc(sk, info.sinfo_assoc_id);
2740 if (!asoc && info.sinfo_assoc_id && sctp_style(sk, UDP))
2741 return -EINVAL;
2742
2743 if (asoc) {
2744 asoc->default_stream = info.sinfo_stream;
2745 asoc->default_flags = info.sinfo_flags;
2746 asoc->default_ppid = info.sinfo_ppid;
2747 asoc->default_context = info.sinfo_context;
2748 asoc->default_timetolive = info.sinfo_timetolive;
2749 } else {
2750 sp->default_stream = info.sinfo_stream;
2751 sp->default_flags = info.sinfo_flags;
2752 sp->default_ppid = info.sinfo_ppid;
2753 sp->default_context = info.sinfo_context;
2754 sp->default_timetolive = info.sinfo_timetolive;
2755 }
2756
2757 return 0;
2758}
2759
2760
2761
2762
2763
2764
2765
2766static int sctp_setsockopt_primary_addr(struct sock *sk, char __user *optval,
2767 unsigned int optlen)
2768{
2769 struct sctp_prim prim;
2770 struct sctp_transport *trans;
2771
2772 if (optlen != sizeof(struct sctp_prim))
2773 return -EINVAL;
2774
2775 if (copy_from_user(&prim, optval, sizeof(struct sctp_prim)))
2776 return -EFAULT;
2777
2778 trans = sctp_addr_id2transport(sk, &prim.ssp_addr, prim.ssp_assoc_id);
2779 if (!trans)
2780 return -EINVAL;
2781
2782 sctp_assoc_set_primary(trans->asoc, trans);
2783
2784 return 0;
2785}
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795static int sctp_setsockopt_nodelay(struct sock *sk, char __user *optval,
2796 unsigned int optlen)
2797{
2798 int val;
2799
2800 if (optlen < sizeof(int))
2801 return -EINVAL;
2802 if (get_user(val, (int __user *)optval))
2803 return -EFAULT;
2804
2805 sctp_sk(sk)->nodelay = (val == 0) ? 0 : 1;
2806 return 0;
2807}
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821static int sctp_setsockopt_rtoinfo(struct sock *sk, char __user *optval, unsigned int optlen)
2822{
2823 struct sctp_rtoinfo rtoinfo;
2824 struct sctp_association *asoc;
2825
2826 if (optlen != sizeof (struct sctp_rtoinfo))
2827 return -EINVAL;
2828
2829 if (copy_from_user(&rtoinfo, optval, optlen))
2830 return -EFAULT;
2831
2832 asoc = sctp_id2assoc(sk, rtoinfo.srto_assoc_id);
2833
2834
2835 if (!asoc && rtoinfo.srto_assoc_id && sctp_style(sk, UDP))
2836 return -EINVAL;
2837
2838 if (asoc) {
2839 if (rtoinfo.srto_initial != 0)
2840 asoc->rto_initial =
2841 msecs_to_jiffies(rtoinfo.srto_initial);
2842 if (rtoinfo.srto_max != 0)
2843 asoc->rto_max = msecs_to_jiffies(rtoinfo.srto_max);
2844 if (rtoinfo.srto_min != 0)
2845 asoc->rto_min = msecs_to_jiffies(rtoinfo.srto_min);
2846 } else {
2847
2848
2849
2850 struct sctp_sock *sp = sctp_sk(sk);
2851
2852 if (rtoinfo.srto_initial != 0)
2853 sp->rtoinfo.srto_initial = rtoinfo.srto_initial;
2854 if (rtoinfo.srto_max != 0)
2855 sp->rtoinfo.srto_max = rtoinfo.srto_max;
2856 if (rtoinfo.srto_min != 0)
2857 sp->rtoinfo.srto_min = rtoinfo.srto_min;
2858 }
2859
2860 return 0;
2861}
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874static int sctp_setsockopt_associnfo(struct sock *sk, char __user *optval, unsigned int optlen)
2875{
2876
2877 struct sctp_assocparams assocparams;
2878 struct sctp_association *asoc;
2879
2880 if (optlen != sizeof(struct sctp_assocparams))
2881 return -EINVAL;
2882 if (copy_from_user(&assocparams, optval, optlen))
2883 return -EFAULT;
2884
2885 asoc = sctp_id2assoc(sk, assocparams.sasoc_assoc_id);
2886
2887 if (!asoc && assocparams.sasoc_assoc_id && sctp_style(sk, UDP))
2888 return -EINVAL;
2889
2890
2891 if (asoc) {
2892 if (assocparams.sasoc_asocmaxrxt != 0) {
2893 __u32 path_sum = 0;
2894 int paths = 0;
2895 struct sctp_transport *peer_addr;
2896
2897 list_for_each_entry(peer_addr, &asoc->peer.transport_addr_list,
2898 transports) {
2899 path_sum += peer_addr->pathmaxrxt;
2900 paths++;
2901 }
2902
2903
2904
2905
2906
2907
2908 if (paths > 1 &&
2909 assocparams.sasoc_asocmaxrxt > path_sum)
2910 return -EINVAL;
2911
2912 asoc->max_retrans = assocparams.sasoc_asocmaxrxt;
2913 }
2914
2915 if (assocparams.sasoc_cookie_life != 0) {
2916 asoc->cookie_life.tv_sec =
2917 assocparams.sasoc_cookie_life / 1000;
2918 asoc->cookie_life.tv_usec =
2919 (assocparams.sasoc_cookie_life % 1000)
2920 * 1000;
2921 }
2922 } else {
2923
2924 struct sctp_sock *sp = sctp_sk(sk);
2925
2926 if (assocparams.sasoc_asocmaxrxt != 0)
2927 sp->assocparams.sasoc_asocmaxrxt =
2928 assocparams.sasoc_asocmaxrxt;
2929 if (assocparams.sasoc_cookie_life != 0)
2930 sp->assocparams.sasoc_cookie_life =
2931 assocparams.sasoc_cookie_life;
2932 }
2933 return 0;
2934}
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946static int sctp_setsockopt_mappedv4(struct sock *sk, char __user *optval, unsigned int optlen)
2947{
2948 int val;
2949 struct sctp_sock *sp = sctp_sk(sk);
2950
2951 if (optlen < sizeof(int))
2952 return -EINVAL;
2953 if (get_user(val, (int __user *)optval))
2954 return -EFAULT;
2955 if (val)
2956 sp->v4mapped = 1;
2957 else
2958 sp->v4mapped = 0;
2959
2960 return 0;
2961}
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990static int sctp_setsockopt_maxseg(struct sock *sk, char __user *optval, unsigned int optlen)
2991{
2992 struct sctp_assoc_value params;
2993 struct sctp_association *asoc;
2994 struct sctp_sock *sp = sctp_sk(sk);
2995 int val;
2996
2997 if (optlen == sizeof(int)) {
2998 pr_warn("Use of int in maxseg socket option deprecated\n");
2999 pr_warn("Use struct sctp_assoc_value instead\n");
3000 if (copy_from_user(&val, optval, optlen))
3001 return -EFAULT;
3002 params.assoc_id = 0;
3003 } else if (optlen == sizeof(struct sctp_assoc_value)) {
3004 if (copy_from_user(¶ms, optval, optlen))
3005 return -EFAULT;
3006 val = params.assoc_value;
3007 } else
3008 return -EINVAL;
3009
3010 if ((val != 0) && ((val < 8) || (val > SCTP_MAX_CHUNK_LEN)))
3011 return -EINVAL;
3012
3013 asoc = sctp_id2assoc(sk, params.assoc_id);
3014 if (!asoc && params.assoc_id && sctp_style(sk, UDP))
3015 return -EINVAL;
3016
3017 if (asoc) {
3018 if (val == 0) {
3019 val = asoc->pathmtu;
3020 val -= sp->pf->af->net_header_len;
3021 val -= sizeof(struct sctphdr) +
3022 sizeof(struct sctp_data_chunk);
3023 }
3024 asoc->user_frag = val;
3025 asoc->frag_point = sctp_frag_point(asoc, asoc->pathmtu);
3026 } else {
3027 sp->user_frag = val;
3028 }
3029
3030 return 0;
3031}
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042static int sctp_setsockopt_peer_primary_addr(struct sock *sk, char __user *optval,
3043 unsigned int optlen)
3044{
3045 struct net *net = sock_net(sk);
3046 struct sctp_sock *sp;
3047 struct sctp_association *asoc = NULL;
3048 struct sctp_setpeerprim prim;
3049 struct sctp_chunk *chunk;
3050 struct sctp_af *af;
3051 int err;
3052
3053 sp = sctp_sk(sk);
3054
3055 if (!net->sctp.addip_enable)
3056 return -EPERM;
3057
3058 if (optlen != sizeof(struct sctp_setpeerprim))
3059 return -EINVAL;
3060
3061 if (copy_from_user(&prim, optval, optlen))
3062 return -EFAULT;
3063
3064 asoc = sctp_id2assoc(sk, prim.sspp_assoc_id);
3065 if (!asoc)
3066 return -EINVAL;
3067
3068 if (!asoc->peer.asconf_capable)
3069 return -EPERM;
3070
3071 if (asoc->peer.addip_disabled_mask & SCTP_PARAM_SET_PRIMARY)
3072 return -EPERM;
3073
3074 if (!sctp_state(asoc, ESTABLISHED))
3075 return -ENOTCONN;
3076
3077 af = sctp_get_af_specific(prim.sspp_addr.ss_family);
3078 if (!af)
3079 return -EINVAL;
3080
3081 if (!af->addr_valid((union sctp_addr *)&prim.sspp_addr, sp, NULL))
3082 return -EADDRNOTAVAIL;
3083
3084 if (!sctp_assoc_lookup_laddr(asoc, (union sctp_addr *)&prim.sspp_addr))
3085 return -EADDRNOTAVAIL;
3086
3087
3088 chunk = sctp_make_asconf_set_prim(asoc,
3089 (union sctp_addr *)&prim.sspp_addr);
3090 if (!chunk)
3091 return -ENOMEM;
3092
3093 err = sctp_send_asconf(asoc, chunk);
3094
3095 SCTP_DEBUG_PRINTK("We set peer primary addr primitively.\n");
3096
3097 return err;
3098}
3099
3100static int sctp_setsockopt_adaptation_layer(struct sock *sk, char __user *optval,
3101 unsigned int optlen)
3102{
3103 struct sctp_setadaptation adaptation;
3104
3105 if (optlen != sizeof(struct sctp_setadaptation))
3106 return -EINVAL;
3107 if (copy_from_user(&adaptation, optval, optlen))
3108 return -EFAULT;
3109
3110 sctp_sk(sk)->adaptation_ind = adaptation.ssb_adaptation_ind;
3111
3112 return 0;
3113}
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129static int sctp_setsockopt_context(struct sock *sk, char __user *optval,
3130 unsigned int optlen)
3131{
3132 struct sctp_assoc_value params;
3133 struct sctp_sock *sp;
3134 struct sctp_association *asoc;
3135
3136 if (optlen != sizeof(struct sctp_assoc_value))
3137 return -EINVAL;
3138 if (copy_from_user(¶ms, optval, optlen))
3139 return -EFAULT;
3140
3141 sp = sctp_sk(sk);
3142
3143 if (params.assoc_id != 0) {
3144 asoc = sctp_id2assoc(sk, params.assoc_id);
3145 if (!asoc)
3146 return -EINVAL;
3147 asoc->default_rcv_context = params.assoc_value;
3148 } else {
3149 sp->default_rcv_context = params.assoc_value;
3150 }
3151
3152 return 0;
3153}
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179static int sctp_setsockopt_fragment_interleave(struct sock *sk,
3180 char __user *optval,
3181 unsigned int optlen)
3182{
3183 int val;
3184
3185 if (optlen != sizeof(int))
3186 return -EINVAL;
3187 if (get_user(val, (int __user *)optval))
3188 return -EFAULT;
3189
3190 sctp_sk(sk)->frag_interleave = (val == 0) ? 0 : 1;
3191
3192 return 0;
3193}
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212static int sctp_setsockopt_partial_delivery_point(struct sock *sk,
3213 char __user *optval,
3214 unsigned int optlen)
3215{
3216 u32 val;
3217
3218 if (optlen != sizeof(u32))
3219 return -EINVAL;
3220 if (get_user(val, (int __user *)optval))
3221 return -EFAULT;
3222
3223
3224
3225
3226 if (val > (sk->sk_rcvbuf >> 1))
3227 return -EINVAL;
3228
3229 sctp_sk(sk)->pd_point = val;
3230
3231 return 0;
3232}
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245static int sctp_setsockopt_maxburst(struct sock *sk,
3246 char __user *optval,
3247 unsigned int optlen)
3248{
3249 struct sctp_assoc_value params;
3250 struct sctp_sock *sp;
3251 struct sctp_association *asoc;
3252 int val;
3253 int assoc_id = 0;
3254
3255 if (optlen == sizeof(int)) {
3256 pr_warn("Use of int in max_burst socket option deprecated\n");
3257 pr_warn("Use struct sctp_assoc_value instead\n");
3258 if (copy_from_user(&val, optval, optlen))
3259 return -EFAULT;
3260 } else if (optlen == sizeof(struct sctp_assoc_value)) {
3261 if (copy_from_user(¶ms, optval, optlen))
3262 return -EFAULT;
3263 val = params.assoc_value;
3264 assoc_id = params.assoc_id;
3265 } else
3266 return -EINVAL;
3267
3268 sp = sctp_sk(sk);
3269
3270 if (assoc_id != 0) {
3271 asoc = sctp_id2assoc(sk, assoc_id);
3272 if (!asoc)
3273 return -EINVAL;
3274 asoc->max_burst = val;
3275 } else
3276 sp->max_burst = val;
3277
3278 return 0;
3279}
3280
3281
3282
3283
3284
3285
3286
3287
3288static int sctp_setsockopt_auth_chunk(struct sock *sk,
3289 char __user *optval,
3290 unsigned int optlen)
3291{
3292 struct net *net = sock_net(sk);
3293 struct sctp_authchunk val;
3294
3295 if (!net->sctp.auth_enable)
3296 return -EACCES;
3297
3298 if (optlen != sizeof(struct sctp_authchunk))
3299 return -EINVAL;
3300 if (copy_from_user(&val, optval, optlen))
3301 return -EFAULT;
3302
3303 switch (val.sauth_chunk) {
3304 case SCTP_CID_INIT:
3305 case SCTP_CID_INIT_ACK:
3306 case SCTP_CID_SHUTDOWN_COMPLETE:
3307 case SCTP_CID_AUTH:
3308 return -EINVAL;
3309 }
3310
3311
3312 return sctp_auth_ep_add_chunkid(sctp_sk(sk)->ep, val.sauth_chunk);
3313}
3314
3315
3316
3317
3318
3319
3320
3321static int sctp_setsockopt_hmac_ident(struct sock *sk,
3322 char __user *optval,
3323 unsigned int optlen)
3324{
3325 struct net *net = sock_net(sk);
3326 struct sctp_hmacalgo *hmacs;
3327 u32 idents;
3328 int err;
3329
3330 if (!net->sctp.auth_enable)
3331 return -EACCES;
3332
3333 if (optlen < sizeof(struct sctp_hmacalgo))
3334 return -EINVAL;
3335
3336 hmacs= memdup_user(optval, optlen);
3337 if (IS_ERR(hmacs))
3338 return PTR_ERR(hmacs);
3339
3340 idents = hmacs->shmac_num_idents;
3341 if (idents == 0 || idents > SCTP_AUTH_NUM_HMACS ||
3342 (idents * sizeof(u16)) > (optlen - sizeof(struct sctp_hmacalgo))) {
3343 err = -EINVAL;
3344 goto out;
3345 }
3346
3347 err = sctp_auth_ep_set_hmacs(sctp_sk(sk)->ep, hmacs);
3348out:
3349 kfree(hmacs);
3350 return err;
3351}
3352
3353
3354
3355
3356
3357
3358
3359static int sctp_setsockopt_auth_key(struct sock *sk,
3360 char __user *optval,
3361 unsigned int optlen)
3362{
3363 struct net *net = sock_net(sk);
3364 struct sctp_authkey *authkey;
3365 struct sctp_association *asoc;
3366 int ret;
3367
3368 if (!net->sctp.auth_enable)
3369 return -EACCES;
3370
3371 if (optlen <= sizeof(struct sctp_authkey))
3372 return -EINVAL;
3373
3374 authkey= memdup_user(optval, optlen);
3375 if (IS_ERR(authkey))
3376 return PTR_ERR(authkey);
3377
3378 if (authkey->sca_keylength > optlen - sizeof(struct sctp_authkey)) {
3379 ret = -EINVAL;
3380 goto out;
3381 }
3382
3383 asoc = sctp_id2assoc(sk, authkey->sca_assoc_id);
3384 if (!asoc && authkey->sca_assoc_id && sctp_style(sk, UDP)) {
3385 ret = -EINVAL;
3386 goto out;
3387 }
3388
3389 ret = sctp_auth_set_key(sctp_sk(sk)->ep, asoc, authkey);
3390out:
3391 kfree(authkey);
3392 return ret;
3393}
3394
3395
3396
3397
3398
3399
3400
3401static int sctp_setsockopt_active_key(struct sock *sk,
3402 char __user *optval,
3403 unsigned int optlen)
3404{
3405 struct net *net = sock_net(sk);
3406 struct sctp_authkeyid val;
3407 struct sctp_association *asoc;
3408
3409 if (!net->sctp.auth_enable)
3410 return -EACCES;
3411
3412 if (optlen != sizeof(struct sctp_authkeyid))
3413 return -EINVAL;
3414 if (copy_from_user(&val, optval, optlen))
3415 return -EFAULT;
3416
3417 asoc = sctp_id2assoc(sk, val.scact_assoc_id);
3418 if (!asoc && val.scact_assoc_id && sctp_style(sk, UDP))
3419 return -EINVAL;
3420
3421 return sctp_auth_set_active_key(sctp_sk(sk)->ep, asoc,
3422 val.scact_keynumber);
3423}
3424
3425
3426
3427
3428
3429
3430static int sctp_setsockopt_del_key(struct sock *sk,
3431 char __user *optval,
3432 unsigned int optlen)
3433{
3434 struct net *net = sock_net(sk);
3435 struct sctp_authkeyid val;
3436 struct sctp_association *asoc;
3437
3438 if (!net->sctp.auth_enable)
3439 return -EACCES;
3440
3441 if (optlen != sizeof(struct sctp_authkeyid))
3442 return -EINVAL;
3443 if (copy_from_user(&val, optval, optlen))
3444 return -EFAULT;
3445
3446 asoc = sctp_id2assoc(sk, val.scact_assoc_id);
3447 if (!asoc && val.scact_assoc_id && sctp_style(sk, UDP))
3448 return -EINVAL;
3449
3450 return sctp_auth_del_key_id(sctp_sk(sk)->ep, asoc,
3451 val.scact_keynumber);
3452
3453}
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469static int sctp_setsockopt_auto_asconf(struct sock *sk, char __user *optval,
3470 unsigned int optlen)
3471{
3472 int val;
3473 struct sctp_sock *sp = sctp_sk(sk);
3474
3475 if (optlen < sizeof(int))
3476 return -EINVAL;
3477 if (get_user(val, (int __user *)optval))
3478 return -EFAULT;
3479 if (!sctp_is_ep_boundall(sk) && val)
3480 return -EINVAL;
3481 if ((val && sp->do_auto_asconf) || (!val && !sp->do_auto_asconf))
3482 return 0;
3483
3484 if (val == 0 && sp->do_auto_asconf) {
3485 list_del(&sp->auto_asconf_list);
3486 sp->do_auto_asconf = 0;
3487 } else if (val && !sp->do_auto_asconf) {
3488 list_add_tail(&sp->auto_asconf_list,
3489 &sock_net(sk)->sctp.auto_asconf_splist);
3490 sp->do_auto_asconf = 1;
3491 }
3492 return 0;
3493}
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503static int sctp_setsockopt_paddr_thresholds(struct sock *sk,
3504 char __user *optval,
3505 unsigned int optlen)
3506{
3507 struct sctp_paddrthlds val;
3508 struct sctp_transport *trans;
3509 struct sctp_association *asoc;
3510
3511 if (optlen < sizeof(struct sctp_paddrthlds))
3512 return -EINVAL;
3513 if (copy_from_user(&val, (struct sctp_paddrthlds __user *)optval,
3514 sizeof(struct sctp_paddrthlds)))
3515 return -EFAULT;
3516
3517
3518 if (sctp_is_any(sk, (const union sctp_addr *)&val.spt_address)) {
3519 asoc = sctp_id2assoc(sk, val.spt_assoc_id);
3520 if (!asoc)
3521 return -ENOENT;
3522 list_for_each_entry(trans, &asoc->peer.transport_addr_list,
3523 transports) {
3524 if (val.spt_pathmaxrxt)
3525 trans->pathmaxrxt = val.spt_pathmaxrxt;
3526 trans->pf_retrans = val.spt_pathpfthld;
3527 }
3528
3529 if (val.spt_pathmaxrxt)
3530 asoc->pathmaxrxt = val.spt_pathmaxrxt;
3531 asoc->pf_retrans = val.spt_pathpfthld;
3532 } else {
3533 trans = sctp_addr_id2transport(sk, &val.spt_address,
3534 val.spt_assoc_id);
3535 if (!trans)
3536 return -ENOENT;
3537
3538 if (val.spt_pathmaxrxt)
3539 trans->pathmaxrxt = val.spt_pathmaxrxt;
3540 trans->pf_retrans = val.spt_pathpfthld;
3541 }
3542
3543 return 0;
3544}
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565SCTP_STATIC int sctp_setsockopt(struct sock *sk, int level, int optname,
3566 char __user *optval, unsigned int optlen)
3567{
3568 int retval = 0;
3569
3570 SCTP_DEBUG_PRINTK("sctp_setsockopt(sk: %p... optname: %d)\n",
3571 sk, optname);
3572
3573
3574
3575
3576
3577
3578
3579 if (level != SOL_SCTP) {
3580 struct sctp_af *af = sctp_sk(sk)->pf->af;
3581 retval = af->setsockopt(sk, level, optname, optval, optlen);
3582 goto out_nounlock;
3583 }
3584
3585 sctp_lock_sock(sk);
3586
3587 switch (optname) {
3588 case SCTP_SOCKOPT_BINDX_ADD:
3589
3590 retval = sctp_setsockopt_bindx(sk, (struct sockaddr __user *)optval,
3591 optlen, SCTP_BINDX_ADD_ADDR);
3592 break;
3593
3594 case SCTP_SOCKOPT_BINDX_REM:
3595
3596 retval = sctp_setsockopt_bindx(sk, (struct sockaddr __user *)optval,
3597 optlen, SCTP_BINDX_REM_ADDR);
3598 break;
3599
3600 case SCTP_SOCKOPT_CONNECTX_OLD:
3601
3602 retval = sctp_setsockopt_connectx_old(sk,
3603 (struct sockaddr __user *)optval,
3604 optlen);
3605 break;
3606
3607 case SCTP_SOCKOPT_CONNECTX:
3608
3609 retval = sctp_setsockopt_connectx(sk,
3610 (struct sockaddr __user *)optval,
3611 optlen);
3612 break;
3613
3614 case SCTP_DISABLE_FRAGMENTS:
3615 retval = sctp_setsockopt_disable_fragments(sk, optval, optlen);
3616 break;
3617
3618 case SCTP_EVENTS:
3619 retval = sctp_setsockopt_events(sk, optval, optlen);
3620 break;
3621
3622 case SCTP_AUTOCLOSE:
3623 retval = sctp_setsockopt_autoclose(sk, optval, optlen);
3624 break;
3625
3626 case SCTP_PEER_ADDR_PARAMS:
3627 retval = sctp_setsockopt_peer_addr_params(sk, optval, optlen);
3628 break;
3629
3630 case SCTP_DELAYED_SACK:
3631 retval = sctp_setsockopt_delayed_ack(sk, optval, optlen);
3632 break;
3633 case SCTP_PARTIAL_DELIVERY_POINT:
3634 retval = sctp_setsockopt_partial_delivery_point(sk, optval, optlen);
3635 break;
3636
3637 case SCTP_INITMSG:
3638 retval = sctp_setsockopt_initmsg(sk, optval, optlen);
3639 break;
3640 case SCTP_DEFAULT_SEND_PARAM:
3641 retval = sctp_setsockopt_default_send_param(sk, optval,
3642 optlen);
3643 break;
3644 case SCTP_PRIMARY_ADDR:
3645 retval = sctp_setsockopt_primary_addr(sk, optval, optlen);
3646 break;
3647 case SCTP_SET_PEER_PRIMARY_ADDR:
3648 retval = sctp_setsockopt_peer_primary_addr(sk, optval, optlen);
3649 break;
3650 case SCTP_NODELAY:
3651 retval = sctp_setsockopt_nodelay(sk, optval, optlen);
3652 break;
3653 case SCTP_RTOINFO:
3654 retval = sctp_setsockopt_rtoinfo(sk, optval, optlen);
3655 break;
3656 case SCTP_ASSOCINFO:
3657 retval = sctp_setsockopt_associnfo(sk, optval, optlen);
3658 break;
3659 case SCTP_I_WANT_MAPPED_V4_ADDR:
3660 retval = sctp_setsockopt_mappedv4(sk, optval, optlen);
3661 break;
3662 case SCTP_MAXSEG:
3663 retval = sctp_setsockopt_maxseg(sk, optval, optlen);
3664 break;
3665 case SCTP_ADAPTATION_LAYER:
3666 retval = sctp_setsockopt_adaptation_layer(sk, optval, optlen);
3667 break;
3668 case SCTP_CONTEXT:
3669 retval = sctp_setsockopt_context(sk, optval, optlen);
3670 break;
3671 case SCTP_FRAGMENT_INTERLEAVE:
3672 retval = sctp_setsockopt_fragment_interleave(sk, optval, optlen);
3673 break;
3674 case SCTP_MAX_BURST:
3675 retval = sctp_setsockopt_maxburst(sk, optval, optlen);
3676 break;
3677 case SCTP_AUTH_CHUNK:
3678 retval = sctp_setsockopt_auth_chunk(sk, optval, optlen);
3679 break;
3680 case SCTP_HMAC_IDENT:
3681 retval = sctp_setsockopt_hmac_ident(sk, optval, optlen);
3682 break;
3683 case SCTP_AUTH_KEY:
3684 retval = sctp_setsockopt_auth_key(sk, optval, optlen);
3685 break;
3686 case SCTP_AUTH_ACTIVE_KEY:
3687 retval = sctp_setsockopt_active_key(sk, optval, optlen);
3688 break;
3689 case SCTP_AUTH_DELETE_KEY:
3690 retval = sctp_setsockopt_del_key(sk, optval, optlen);
3691 break;
3692 case SCTP_AUTO_ASCONF:
3693 retval = sctp_setsockopt_auto_asconf(sk, optval, optlen);
3694 break;
3695 case SCTP_PEER_ADDR_THLDS:
3696 retval = sctp_setsockopt_paddr_thresholds(sk, optval, optlen);
3697 break;
3698 default:
3699 retval = -ENOPROTOOPT;
3700 break;
3701 }
3702
3703 sctp_release_sock(sk);
3704
3705out_nounlock:
3706 return retval;
3707}
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725SCTP_STATIC int sctp_connect(struct sock *sk, struct sockaddr *addr,
3726 int addr_len)
3727{
3728 int err = 0;
3729 struct sctp_af *af;
3730
3731 sctp_lock_sock(sk);
3732
3733 SCTP_DEBUG_PRINTK("%s - sk: %p, sockaddr: %p, addr_len: %d\n",
3734 __func__, sk, addr, addr_len);
3735
3736
3737 af = sctp_get_af_specific(addr->sa_family);
3738 if (!af || addr_len < af->sockaddr_len) {
3739 err = -EINVAL;
3740 } else {
3741
3742
3743
3744 err = __sctp_connect(sk, addr, af->sockaddr_len, NULL);
3745 }
3746
3747 sctp_release_sock(sk);
3748 return err;
3749}
3750
3751
3752SCTP_STATIC int sctp_disconnect(struct sock *sk, int flags)
3753{
3754 return -EOPNOTSUPP;
3755}
3756
3757
3758
3759
3760
3761
3762
3763
3764SCTP_STATIC struct sock *sctp_accept(struct sock *sk, int flags, int *err)
3765{
3766 struct sctp_sock *sp;
3767 struct sctp_endpoint *ep;
3768 struct sock *newsk = NULL;
3769 struct sctp_association *asoc;
3770 long timeo;
3771 int error = 0;
3772
3773 sctp_lock_sock(sk);
3774
3775 sp = sctp_sk(sk);
3776 ep = sp->ep;
3777
3778 if (!sctp_style(sk, TCP)) {
3779 error = -EOPNOTSUPP;
3780 goto out;
3781 }
3782
3783 if (!sctp_sstate(sk, LISTENING)) {
3784 error = -EINVAL;
3785 goto out;
3786 }
3787
3788 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
3789
3790 error = sctp_wait_for_accept(sk, timeo);
3791 if (error)
3792 goto out;
3793
3794
3795
3796
3797 asoc = list_entry(ep->asocs.next, struct sctp_association, asocs);
3798
3799 newsk = sp->pf->create_accept_sk(sk, asoc);
3800 if (!newsk) {
3801 error = -ENOMEM;
3802 goto out;
3803 }
3804
3805
3806
3807
3808 sctp_sock_migrate(sk, newsk, asoc, SCTP_SOCKET_TCP);
3809
3810out:
3811 sctp_release_sock(sk);
3812 *err = error;
3813 return newsk;
3814}
3815
3816
3817SCTP_STATIC int sctp_ioctl(struct sock *sk, int cmd, unsigned long arg)
3818{
3819 int rc = -ENOTCONN;
3820
3821 sctp_lock_sock(sk);
3822
3823
3824
3825
3826
3827 if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING))
3828 goto out;
3829
3830 switch (cmd) {
3831 case SIOCINQ: {
3832 struct sk_buff *skb;
3833 unsigned int amount = 0;
3834
3835 skb = skb_peek(&sk->sk_receive_queue);
3836 if (skb != NULL) {
3837
3838
3839
3840
3841 amount = skb->len;
3842 }
3843 rc = put_user(amount, (int __user *)arg);
3844 break;
3845 }
3846 default:
3847 rc = -ENOIOCTLCMD;
3848 break;
3849 }
3850out:
3851 sctp_release_sock(sk);
3852 return rc;
3853}
3854
3855
3856
3857
3858
3859SCTP_STATIC int sctp_init_sock(struct sock *sk)
3860{
3861 struct net *net = sock_net(sk);
3862 struct sctp_endpoint *ep;
3863 struct sctp_sock *sp;
3864
3865 SCTP_DEBUG_PRINTK("sctp_init_sock(sk: %p)\n", sk);
3866
3867 sp = sctp_sk(sk);
3868
3869
3870 switch (sk->sk_type) {
3871 case SOCK_SEQPACKET:
3872 sp->type = SCTP_SOCKET_UDP;
3873 break;
3874 case SOCK_STREAM:
3875 sp->type = SCTP_SOCKET_TCP;
3876 break;
3877 default:
3878 return -ESOCKTNOSUPPORT;
3879 }
3880
3881
3882
3883
3884 sp->default_stream = 0;
3885 sp->default_ppid = 0;
3886 sp->default_flags = 0;
3887 sp->default_context = 0;
3888 sp->default_timetolive = 0;
3889
3890 sp->default_rcv_context = 0;
3891 sp->max_burst = net->sctp.max_burst;
3892
3893
3894
3895
3896
3897 sp->initmsg.sinit_num_ostreams = sctp_max_outstreams;
3898 sp->initmsg.sinit_max_instreams = sctp_max_instreams;
3899 sp->initmsg.sinit_max_attempts = net->sctp.max_retrans_init;
3900 sp->initmsg.sinit_max_init_timeo = net->sctp.rto_max;
3901
3902
3903
3904
3905 sp->rtoinfo.srto_initial = net->sctp.rto_initial;
3906 sp->rtoinfo.srto_max = net->sctp.rto_max;
3907 sp->rtoinfo.srto_min = net->sctp.rto_min;
3908
3909
3910
3911
3912 sp->assocparams.sasoc_asocmaxrxt = net->sctp.max_retrans_association;
3913 sp->assocparams.sasoc_number_peer_destinations = 0;
3914 sp->assocparams.sasoc_peer_rwnd = 0;
3915 sp->assocparams.sasoc_local_rwnd = 0;
3916 sp->assocparams.sasoc_cookie_life = net->sctp.valid_cookie_life;
3917
3918
3919
3920
3921 memset(&sp->subscribe, 0, sizeof(struct sctp_event_subscribe));
3922
3923
3924
3925
3926 sp->hbinterval = net->sctp.hb_interval;
3927 sp->pathmaxrxt = net->sctp.max_retrans_path;
3928 sp->pathmtu = 0;
3929 sp->sackdelay = net->sctp.sack_timeout;
3930 sp->sackfreq = 2;
3931 sp->param_flags = SPP_HB_ENABLE |
3932 SPP_PMTUD_ENABLE |
3933 SPP_SACKDELAY_ENABLE;
3934
3935
3936
3937
3938 sp->disable_fragments = 0;
3939
3940
3941 sp->nodelay = 0;
3942
3943
3944 sp->v4mapped = 1;
3945
3946
3947
3948
3949
3950
3951 sp->autoclose = 0;
3952
3953
3954 sp->user_frag = 0;
3955
3956 sp->adaptation_ind = 0;
3957
3958 sp->pf = sctp_get_pf_specific(sk->sk_family);
3959
3960
3961 atomic_set(&sp->pd_mode, 0);
3962 skb_queue_head_init(&sp->pd_lobby);
3963 sp->frag_interleave = 0;
3964
3965
3966
3967
3968
3969 ep = sctp_endpoint_new(sk, GFP_KERNEL);
3970 if (!ep)
3971 return -ENOMEM;
3972
3973 sp->ep = ep;
3974 sp->hmac = NULL;
3975
3976 SCTP_DBG_OBJCNT_INC(sock);
3977
3978 local_bh_disable();
3979 percpu_counter_inc(&sctp_sockets_allocated);
3980 sock_prot_inuse_add(net, sk->sk_prot, 1);
3981 if (net->sctp.default_auto_asconf) {
3982 list_add_tail(&sp->auto_asconf_list,
3983 &net->sctp.auto_asconf_splist);
3984 sp->do_auto_asconf = 1;
3985 } else
3986 sp->do_auto_asconf = 0;
3987 local_bh_enable();
3988
3989 return 0;
3990}
3991
3992
3993SCTP_STATIC void sctp_destroy_sock(struct sock *sk)
3994{
3995 struct sctp_sock *sp;
3996
3997 SCTP_DEBUG_PRINTK("sctp_destroy_sock(sk: %p)\n", sk);
3998
3999
4000 sp = sctp_sk(sk);
4001 if (sp->do_auto_asconf) {
4002 sp->do_auto_asconf = 0;
4003 list_del(&sp->auto_asconf_list);
4004 }
4005 sctp_endpoint_free(sp->ep);
4006 local_bh_disable();
4007 percpu_counter_dec(&sctp_sockets_allocated);
4008 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
4009 local_bh_enable();
4010}
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028SCTP_STATIC void sctp_shutdown(struct sock *sk, int how)
4029{
4030 struct net *net = sock_net(sk);
4031 struct sctp_endpoint *ep;
4032 struct sctp_association *asoc;
4033
4034 if (!sctp_style(sk, TCP))
4035 return;
4036
4037 if (how & SEND_SHUTDOWN) {
4038 ep = sctp_sk(sk)->ep;
4039 if (!list_empty(&ep->asocs)) {
4040 asoc = list_entry(ep->asocs.next,
4041 struct sctp_association, asocs);
4042 sctp_primitive_SHUTDOWN(net, asoc, NULL);
4043 }
4044 }
4045}
4046
4047
4048
4049
4050
4051
4052
4053
4054static int sctp_getsockopt_sctp_status(struct sock *sk, int len,
4055 char __user *optval,
4056 int __user *optlen)
4057{
4058 struct sctp_status status;
4059 struct sctp_association *asoc = NULL;
4060 struct sctp_transport *transport;
4061 sctp_assoc_t associd;
4062 int retval = 0;
4063
4064 if (len < sizeof(status)) {
4065 retval = -EINVAL;
4066 goto out;
4067 }
4068
4069 len = sizeof(status);
4070 if (copy_from_user(&status, optval, len)) {
4071 retval = -EFAULT;
4072 goto out;
4073 }
4074
4075 associd = status.sstat_assoc_id;
4076 asoc = sctp_id2assoc(sk, associd);
4077 if (!asoc) {
4078 retval = -EINVAL;
4079 goto out;
4080 }
4081
4082 transport = asoc->peer.primary_path;
4083
4084 status.sstat_assoc_id = sctp_assoc2id(asoc);
4085 status.sstat_state = asoc->state;
4086 status.sstat_rwnd = asoc->peer.rwnd;
4087 status.sstat_unackdata = asoc->unack_data;
4088
4089 status.sstat_penddata = sctp_tsnmap_pending(&asoc->peer.tsn_map);
4090 status.sstat_instrms = asoc->c.sinit_max_instreams;
4091 status.sstat_outstrms = asoc->c.sinit_num_ostreams;
4092 status.sstat_fragmentation_point = asoc->frag_point;
4093 status.sstat_primary.spinfo_assoc_id = sctp_assoc2id(transport->asoc);
4094 memcpy(&status.sstat_primary.spinfo_address, &transport->ipaddr,
4095 transport->af_specific->sockaddr_len);
4096
4097 sctp_get_pf_specific(sk->sk_family)->addr_v4map(sctp_sk(sk),
4098 (union sctp_addr *)&status.sstat_primary.spinfo_address);
4099 status.sstat_primary.spinfo_state = transport->state;
4100 status.sstat_primary.spinfo_cwnd = transport->cwnd;
4101 status.sstat_primary.spinfo_srtt = transport->srtt;
4102 status.sstat_primary.spinfo_rto = jiffies_to_msecs(transport->rto);
4103 status.sstat_primary.spinfo_mtu = transport->pathmtu;
4104
4105 if (status.sstat_primary.spinfo_state == SCTP_UNKNOWN)
4106 status.sstat_primary.spinfo_state = SCTP_ACTIVE;
4107
4108 if (put_user(len, optlen)) {
4109 retval = -EFAULT;
4110 goto out;
4111 }
4112
4113 SCTP_DEBUG_PRINTK("sctp_getsockopt_sctp_status(%d): %d %d %d\n",
4114 len, status.sstat_state, status.sstat_rwnd,
4115 status.sstat_assoc_id);
4116
4117 if (copy_to_user(optval, &status, len)) {
4118 retval = -EFAULT;
4119 goto out;
4120 }
4121
4122out:
4123 return retval;
4124}
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134static int sctp_getsockopt_peer_addr_info(struct sock *sk, int len,
4135 char __user *optval,
4136 int __user *optlen)
4137{
4138 struct sctp_paddrinfo pinfo;
4139 struct sctp_transport *transport;
4140 int retval = 0;
4141
4142 if (len < sizeof(pinfo)) {
4143 retval = -EINVAL;
4144 goto out;
4145 }
4146
4147 len = sizeof(pinfo);
4148 if (copy_from_user(&pinfo, optval, len)) {
4149 retval = -EFAULT;
4150 goto out;
4151 }
4152
4153 transport = sctp_addr_id2transport(sk, &pinfo.spinfo_address,
4154 pinfo.spinfo_assoc_id);
4155 if (!transport)
4156 return -EINVAL;
4157
4158 pinfo.spinfo_assoc_id = sctp_assoc2id(transport->asoc);
4159 pinfo.spinfo_state = transport->state;
4160 pinfo.spinfo_cwnd = transport->cwnd;
4161 pinfo.spinfo_srtt = transport->srtt;
4162 pinfo.spinfo_rto = jiffies_to_msecs(transport->rto);
4163 pinfo.spinfo_mtu = transport->pathmtu;
4164
4165 if (pinfo.spinfo_state == SCTP_UNKNOWN)
4166 pinfo.spinfo_state = SCTP_ACTIVE;
4167
4168 if (put_user(len, optlen)) {
4169 retval = -EFAULT;
4170 goto out;
4171 }
4172
4173 if (copy_to_user(optval, &pinfo, len)) {
4174 retval = -EFAULT;
4175 goto out;
4176 }
4177
4178out:
4179 return retval;
4180}
4181
4182
4183
4184
4185
4186
4187
4188
4189static int sctp_getsockopt_disable_fragments(struct sock *sk, int len,
4190 char __user *optval, int __user *optlen)
4191{
4192 int val;
4193
4194 if (len < sizeof(int))
4195 return -EINVAL;
4196
4197 len = sizeof(int);
4198 val = (sctp_sk(sk)->disable_fragments == 1);
4199 if (put_user(len, optlen))
4200 return -EFAULT;
4201 if (copy_to_user(optval, &val, len))
4202 return -EFAULT;
4203 return 0;
4204}
4205
4206
4207
4208
4209
4210
4211static int sctp_getsockopt_events(struct sock *sk, int len, char __user *optval,
4212 int __user *optlen)
4213{
4214 if (len <= 0)
4215 return -EINVAL;
4216 if (len > sizeof(struct sctp_event_subscribe))
4217 len = sizeof(struct sctp_event_subscribe);
4218 if (put_user(len, optlen))
4219 return -EFAULT;
4220 if (copy_to_user(optval, &sctp_sk(sk)->subscribe, len))
4221 return -EFAULT;
4222 return 0;
4223}
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236static int sctp_getsockopt_autoclose(struct sock *sk, int len, char __user *optval, int __user *optlen)
4237{
4238
4239 if (sctp_style(sk, TCP))
4240 return -EOPNOTSUPP;
4241 if (len < sizeof(int))
4242 return -EINVAL;
4243 len = sizeof(int);
4244 if (put_user(len, optlen))
4245 return -EFAULT;
4246 if (copy_to_user(optval, &sctp_sk(sk)->autoclose, sizeof(int)))
4247 return -EFAULT;
4248 return 0;
4249}
4250
4251
4252int sctp_do_peeloff(struct sock *sk, sctp_assoc_t id, struct socket **sockp)
4253{
4254 struct sctp_association *asoc = sctp_id2assoc(sk, id);
4255 struct socket *sock;
4256 struct sctp_af *af;
4257 int err = 0;
4258
4259 if (!asoc)
4260 return -EINVAL;
4261
4262
4263
4264
4265 if (!sctp_style(sk, UDP))
4266 return -EINVAL;
4267
4268
4269 err = sock_create(sk->sk_family, SOCK_SEQPACKET, IPPROTO_SCTP, &sock);
4270 if (err < 0)
4271 return err;
4272
4273 sctp_copy_sock(sock->sk, sk, asoc);
4274
4275
4276
4277
4278 af = sctp_get_af_specific(asoc->peer.primary_addr.sa.sa_family);
4279 af->to_sk_daddr(&asoc->peer.primary_addr, sk);
4280
4281
4282
4283
4284 sctp_sock_migrate(sk, sock->sk, asoc, SCTP_SOCKET_UDP_HIGH_BANDWIDTH);
4285
4286 *sockp = sock;
4287
4288 return err;
4289}
4290EXPORT_SYMBOL(sctp_do_peeloff);
4291
4292static int sctp_getsockopt_peeloff(struct sock *sk, int len, char __user *optval, int __user *optlen)
4293{
4294 sctp_peeloff_arg_t peeloff;
4295 struct socket *newsock;
4296 struct file *newfile;
4297 int retval = 0;
4298
4299 if (len < sizeof(sctp_peeloff_arg_t))
4300 return -EINVAL;
4301 len = sizeof(sctp_peeloff_arg_t);
4302 if (copy_from_user(&peeloff, optval, len))
4303 return -EFAULT;
4304
4305 retval = sctp_do_peeloff(sk, peeloff.associd, &newsock);
4306 if (retval < 0)
4307 goto out;
4308
4309
4310 retval = get_unused_fd();
4311 if (retval < 0) {
4312 sock_release(newsock);
4313 goto out;
4314 }
4315
4316 newfile = sock_alloc_file(newsock, 0, NULL);
4317 if (unlikely(IS_ERR(newfile))) {
4318 put_unused_fd(retval);
4319 sock_release(newsock);
4320 return PTR_ERR(newfile);
4321 }
4322
4323 SCTP_DEBUG_PRINTK("%s: sk: %p newsk: %p sd: %d\n",
4324 __func__, sk, newsock->sk, retval);
4325
4326
4327 if (put_user(len, optlen)) {
4328 fput(newfile);
4329 put_unused_fd(retval);
4330 return -EFAULT;
4331 }
4332 peeloff.sd = retval;
4333 if (copy_to_user(optval, &peeloff, len)) {
4334 fput(newfile);
4335 put_unused_fd(retval);
4336 return -EFAULT;
4337 }
4338 fd_install(retval, newfile);
4339out:
4340 return retval;
4341}
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436static int sctp_getsockopt_peer_addr_params(struct sock *sk, int len,
4437 char __user *optval, int __user *optlen)
4438{
4439 struct sctp_paddrparams params;
4440 struct sctp_transport *trans = NULL;
4441 struct sctp_association *asoc = NULL;
4442 struct sctp_sock *sp = sctp_sk(sk);
4443
4444 if (len < sizeof(struct sctp_paddrparams))
4445 return -EINVAL;
4446 len = sizeof(struct sctp_paddrparams);
4447 if (copy_from_user(¶ms, optval, len))
4448 return -EFAULT;
4449
4450
4451
4452
4453 if (!sctp_is_any(sk, ( union sctp_addr *)¶ms.spp_address)) {
4454 trans = sctp_addr_id2transport(sk, ¶ms.spp_address,
4455 params.spp_assoc_id);
4456 if (!trans) {
4457 SCTP_DEBUG_PRINTK("Failed no transport\n");
4458 return -EINVAL;
4459 }
4460 }
4461
4462
4463
4464
4465
4466 asoc = sctp_id2assoc(sk, params.spp_assoc_id);
4467 if (!asoc && params.spp_assoc_id && sctp_style(sk, UDP)) {
4468 SCTP_DEBUG_PRINTK("Failed no association\n");
4469 return -EINVAL;
4470 }
4471
4472 if (trans) {
4473
4474 params.spp_hbinterval = jiffies_to_msecs(trans->hbinterval);
4475 params.spp_pathmtu = trans->pathmtu;
4476 params.spp_pathmaxrxt = trans->pathmaxrxt;
4477 params.spp_sackdelay = jiffies_to_msecs(trans->sackdelay);
4478
4479
4480 params.spp_flags = trans->param_flags;
4481 } else if (asoc) {
4482
4483 params.spp_hbinterval = jiffies_to_msecs(asoc->hbinterval);
4484 params.spp_pathmtu = asoc->pathmtu;
4485 params.spp_pathmaxrxt = asoc->pathmaxrxt;
4486 params.spp_sackdelay = jiffies_to_msecs(asoc->sackdelay);
4487
4488
4489 params.spp_flags = asoc->param_flags;
4490 } else {
4491
4492 params.spp_hbinterval = sp->hbinterval;
4493 params.spp_pathmtu = sp->pathmtu;
4494 params.spp_sackdelay = sp->sackdelay;
4495 params.spp_pathmaxrxt = sp->pathmaxrxt;
4496
4497
4498 params.spp_flags = sp->param_flags;
4499 }
4500
4501 if (copy_to_user(optval, ¶ms, len))
4502 return -EFAULT;
4503
4504 if (put_user(len, optlen))
4505 return -EFAULT;
4506
4507 return 0;
4508}
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545static int sctp_getsockopt_delayed_ack(struct sock *sk, int len,
4546 char __user *optval,
4547 int __user *optlen)
4548{
4549 struct sctp_sack_info params;
4550 struct sctp_association *asoc = NULL;
4551 struct sctp_sock *sp = sctp_sk(sk);
4552
4553 if (len >= sizeof(struct sctp_sack_info)) {
4554 len = sizeof(struct sctp_sack_info);
4555
4556 if (copy_from_user(¶ms, optval, len))
4557 return -EFAULT;
4558 } else if (len == sizeof(struct sctp_assoc_value)) {
4559 pr_warn("Use of struct sctp_assoc_value in delayed_ack socket option deprecated\n");
4560 pr_warn("Use struct sctp_sack_info instead\n");
4561 if (copy_from_user(¶ms, optval, len))
4562 return -EFAULT;
4563 } else
4564 return - EINVAL;
4565
4566
4567
4568
4569
4570 asoc = sctp_id2assoc(sk, params.sack_assoc_id);
4571 if (!asoc && params.sack_assoc_id && sctp_style(sk, UDP))
4572 return -EINVAL;
4573
4574 if (asoc) {
4575
4576 if (asoc->param_flags & SPP_SACKDELAY_ENABLE) {
4577 params.sack_delay = jiffies_to_msecs(
4578 asoc->sackdelay);
4579 params.sack_freq = asoc->sackfreq;
4580
4581 } else {
4582 params.sack_delay = 0;
4583 params.sack_freq = 1;
4584 }
4585 } else {
4586
4587 if (sp->param_flags & SPP_SACKDELAY_ENABLE) {
4588 params.sack_delay = sp->sackdelay;
4589 params.sack_freq = sp->sackfreq;
4590 } else {
4591 params.sack_delay = 0;
4592 params.sack_freq = 1;
4593 }
4594 }
4595
4596 if (copy_to_user(optval, ¶ms, len))
4597 return -EFAULT;
4598
4599 if (put_user(len, optlen))
4600 return -EFAULT;
4601
4602 return 0;
4603}
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616static int sctp_getsockopt_initmsg(struct sock *sk, int len, char __user *optval, int __user *optlen)
4617{
4618 if (len < sizeof(struct sctp_initmsg))
4619 return -EINVAL;
4620 len = sizeof(struct sctp_initmsg);
4621 if (put_user(len, optlen))
4622 return -EFAULT;
4623 if (copy_to_user(optval, &sctp_sk(sk)->initmsg, len))
4624 return -EFAULT;
4625 return 0;
4626}
4627
4628
4629static int sctp_getsockopt_peer_addrs(struct sock *sk, int len,
4630 char __user *optval, int __user *optlen)
4631{
4632 struct sctp_association *asoc;
4633 int cnt = 0;
4634 struct sctp_getaddrs getaddrs;
4635 struct sctp_transport *from;
4636 void __user *to;
4637 union sctp_addr temp;
4638 struct sctp_sock *sp = sctp_sk(sk);
4639 int addrlen;
4640 size_t space_left;
4641 int bytes_copied;
4642
4643 if (len < sizeof(struct sctp_getaddrs))
4644 return -EINVAL;
4645
4646 if (copy_from_user(&getaddrs, optval, sizeof(struct sctp_getaddrs)))
4647 return -EFAULT;
4648
4649
4650 asoc = sctp_id2assoc(sk, getaddrs.assoc_id);
4651 if (!asoc)
4652 return -EINVAL;
4653
4654 to = optval + offsetof(struct sctp_getaddrs,addrs);
4655 space_left = len - offsetof(struct sctp_getaddrs,addrs);
4656
4657 list_for_each_entry(from, &asoc->peer.transport_addr_list,
4658 transports) {
4659 memcpy(&temp, &from->ipaddr, sizeof(temp));
4660 sctp_get_pf_specific(sk->sk_family)->addr_v4map(sp, &temp);
4661 addrlen = sctp_get_af_specific(temp.sa.sa_family)->sockaddr_len;
4662 if (space_left < addrlen)
4663 return -ENOMEM;
4664 if (copy_to_user(to, &temp, addrlen))
4665 return -EFAULT;
4666 to += addrlen;
4667 cnt++;
4668 space_left -= addrlen;
4669 }
4670
4671 if (put_user(cnt, &((struct sctp_getaddrs __user *)optval)->addr_num))
4672 return -EFAULT;
4673 bytes_copied = ((char __user *)to) - optval;
4674 if (put_user(bytes_copied, optlen))
4675 return -EFAULT;
4676
4677 return 0;
4678}
4679
4680static int sctp_copy_laddrs(struct sock *sk, __u16 port, void *to,
4681 size_t space_left, int *bytes_copied)
4682{
4683 struct sctp_sockaddr_entry *addr;
4684 union sctp_addr temp;
4685 int cnt = 0;
4686 int addrlen;
4687 struct net *net = sock_net(sk);
4688
4689 rcu_read_lock();
4690 list_for_each_entry_rcu(addr, &net->sctp.local_addr_list, list) {
4691 if (!addr->valid)
4692 continue;
4693
4694 if ((PF_INET == sk->sk_family) &&
4695 (AF_INET6 == addr->a.sa.sa_family))
4696 continue;
4697 if ((PF_INET6 == sk->sk_family) &&
4698 inet_v6_ipv6only(sk) &&
4699 (AF_INET == addr->a.sa.sa_family))
4700 continue;
4701 memcpy(&temp, &addr->a, sizeof(temp));
4702 if (!temp.v4.sin_port)
4703 temp.v4.sin_port = htons(port);
4704
4705 sctp_get_pf_specific(sk->sk_family)->addr_v4map(sctp_sk(sk),
4706 &temp);
4707 addrlen = sctp_get_af_specific(temp.sa.sa_family)->sockaddr_len;
4708 if (space_left < addrlen) {
4709 cnt = -ENOMEM;
4710 break;
4711 }
4712 memcpy(to, &temp, addrlen);
4713
4714 to += addrlen;
4715 cnt ++;
4716 space_left -= addrlen;
4717 *bytes_copied += addrlen;
4718 }
4719 rcu_read_unlock();
4720
4721 return cnt;
4722}
4723
4724
4725static int sctp_getsockopt_local_addrs(struct sock *sk, int len,
4726 char __user *optval, int __user *optlen)
4727{
4728 struct sctp_bind_addr *bp;
4729 struct sctp_association *asoc;
4730 int cnt = 0;
4731 struct sctp_getaddrs getaddrs;
4732 struct sctp_sockaddr_entry *addr;
4733 void __user *to;
4734 union sctp_addr temp;
4735 struct sctp_sock *sp = sctp_sk(sk);
4736 int addrlen;
4737 int err = 0;
4738 size_t space_left;
4739 int bytes_copied = 0;
4740 void *addrs;
4741 void *buf;
4742
4743 if (len < sizeof(struct sctp_getaddrs))
4744 return -EINVAL;
4745
4746 if (copy_from_user(&getaddrs, optval, sizeof(struct sctp_getaddrs)))
4747 return -EFAULT;
4748
4749
4750
4751
4752
4753
4754
4755 if (0 == getaddrs.assoc_id) {
4756 bp = &sctp_sk(sk)->ep->base.bind_addr;
4757 } else {
4758 asoc = sctp_id2assoc(sk, getaddrs.assoc_id);
4759 if (!asoc)
4760 return -EINVAL;
4761 bp = &asoc->base.bind_addr;
4762 }
4763
4764 to = optval + offsetof(struct sctp_getaddrs,addrs);
4765 space_left = len - offsetof(struct sctp_getaddrs,addrs);
4766
4767 addrs = kmalloc(space_left, GFP_KERNEL);
4768 if (!addrs)
4769 return -ENOMEM;
4770
4771
4772
4773
4774 if (sctp_list_single_entry(&bp->address_list)) {
4775 addr = list_entry(bp->address_list.next,
4776 struct sctp_sockaddr_entry, list);
4777 if (sctp_is_any(sk, &addr->a)) {
4778 cnt = sctp_copy_laddrs(sk, bp->port, addrs,
4779 space_left, &bytes_copied);
4780 if (cnt < 0) {
4781 err = cnt;
4782 goto out;
4783 }
4784 goto copy_getaddrs;
4785 }
4786 }
4787
4788 buf = addrs;
4789
4790
4791
4792
4793 list_for_each_entry(addr, &bp->address_list, list) {
4794 memcpy(&temp, &addr->a, sizeof(temp));
4795 sctp_get_pf_specific(sk->sk_family)->addr_v4map(sp, &temp);
4796 addrlen = sctp_get_af_specific(temp.sa.sa_family)->sockaddr_len;
4797 if (space_left < addrlen) {
4798 err = -ENOMEM;
4799 goto out;
4800 }
4801 memcpy(buf, &temp, addrlen);
4802 buf += addrlen;
4803 bytes_copied += addrlen;
4804 cnt ++;
4805 space_left -= addrlen;
4806 }
4807
4808copy_getaddrs:
4809 if (copy_to_user(to, addrs, bytes_copied)) {
4810 err = -EFAULT;
4811 goto out;
4812 }
4813 if (put_user(cnt, &((struct sctp_getaddrs __user *)optval)->addr_num)) {
4814 err = -EFAULT;
4815 goto out;
4816 }
4817 if (put_user(bytes_copied, optlen))
4818 err = -EFAULT;
4819out:
4820 kfree(addrs);
4821 return err;
4822}
4823
4824
4825
4826
4827
4828
4829
4830static int sctp_getsockopt_primary_addr(struct sock *sk, int len,
4831 char __user *optval, int __user *optlen)
4832{
4833 struct sctp_prim prim;
4834 struct sctp_association *asoc;
4835 struct sctp_sock *sp = sctp_sk(sk);
4836
4837 if (len < sizeof(struct sctp_prim))
4838 return -EINVAL;
4839
4840 len = sizeof(struct sctp_prim);
4841
4842 if (copy_from_user(&prim, optval, len))
4843 return -EFAULT;
4844
4845 asoc = sctp_id2assoc(sk, prim.ssp_assoc_id);
4846 if (!asoc)
4847 return -EINVAL;
4848
4849 if (!asoc->peer.primary_path)
4850 return -ENOTCONN;
4851
4852 memcpy(&prim.ssp_addr, &asoc->peer.primary_path->ipaddr,
4853 asoc->peer.primary_path->af_specific->sockaddr_len);
4854
4855 sctp_get_pf_specific(sk->sk_family)->addr_v4map(sp,
4856 (union sctp_addr *)&prim.ssp_addr);
4857
4858 if (put_user(len, optlen))
4859 return -EFAULT;
4860 if (copy_to_user(optval, &prim, len))
4861 return -EFAULT;
4862
4863 return 0;
4864}
4865
4866
4867
4868
4869
4870
4871
4872static int sctp_getsockopt_adaptation_layer(struct sock *sk, int len,
4873 char __user *optval, int __user *optlen)
4874{
4875 struct sctp_setadaptation adaptation;
4876
4877 if (len < sizeof(struct sctp_setadaptation))
4878 return -EINVAL;
4879
4880 len = sizeof(struct sctp_setadaptation);
4881
4882 adaptation.ssb_adaptation_ind = sctp_sk(sk)->adaptation_ind;
4883
4884 if (put_user(len, optlen))
4885 return -EFAULT;
4886 if (copy_to_user(optval, &adaptation, len))
4887 return -EFAULT;
4888
4889 return 0;
4890}
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911static int sctp_getsockopt_default_send_param(struct sock *sk,
4912 int len, char __user *optval,
4913 int __user *optlen)
4914{
4915 struct sctp_sndrcvinfo info;
4916 struct sctp_association *asoc;
4917 struct sctp_sock *sp = sctp_sk(sk);
4918
4919 if (len < sizeof(struct sctp_sndrcvinfo))
4920 return -EINVAL;
4921
4922 len = sizeof(struct sctp_sndrcvinfo);
4923
4924 if (copy_from_user(&info, optval, len))
4925 return -EFAULT;
4926
4927 asoc = sctp_id2assoc(sk, info.sinfo_assoc_id);
4928 if (!asoc && info.sinfo_assoc_id && sctp_style(sk, UDP))
4929 return -EINVAL;
4930
4931 if (asoc) {
4932 info.sinfo_stream = asoc->default_stream;
4933 info.sinfo_flags = asoc->default_flags;
4934 info.sinfo_ppid = asoc->default_ppid;
4935 info.sinfo_context = asoc->default_context;
4936 info.sinfo_timetolive = asoc->default_timetolive;
4937 } else {
4938 info.sinfo_stream = sp->default_stream;
4939 info.sinfo_flags = sp->default_flags;
4940 info.sinfo_ppid = sp->default_ppid;
4941 info.sinfo_context = sp->default_context;
4942 info.sinfo_timetolive = sp->default_timetolive;
4943 }
4944
4945 if (put_user(len, optlen))
4946 return -EFAULT;
4947 if (copy_to_user(optval, &info, len))
4948 return -EFAULT;
4949
4950 return 0;
4951}
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963static int sctp_getsockopt_nodelay(struct sock *sk, int len,
4964 char __user *optval, int __user *optlen)
4965{
4966 int val;
4967
4968 if (len < sizeof(int))
4969 return -EINVAL;
4970
4971 len = sizeof(int);
4972 val = (sctp_sk(sk)->nodelay == 1);
4973 if (put_user(len, optlen))
4974 return -EFAULT;
4975 if (copy_to_user(optval, &val, len))
4976 return -EFAULT;
4977 return 0;
4978}
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992static int sctp_getsockopt_rtoinfo(struct sock *sk, int len,
4993 char __user *optval,
4994 int __user *optlen) {
4995 struct sctp_rtoinfo rtoinfo;
4996 struct sctp_association *asoc;
4997
4998 if (len < sizeof (struct sctp_rtoinfo))
4999 return -EINVAL;
5000
5001 len = sizeof(struct sctp_rtoinfo);
5002
5003 if (copy_from_user(&rtoinfo, optval, len))
5004 return -EFAULT;
5005
5006 asoc = sctp_id2assoc(sk, rtoinfo.srto_assoc_id);
5007
5008 if (!asoc && rtoinfo.srto_assoc_id && sctp_style(sk, UDP))
5009 return -EINVAL;
5010
5011
5012 if (asoc) {
5013 rtoinfo.srto_initial = jiffies_to_msecs(asoc->rto_initial);
5014 rtoinfo.srto_max = jiffies_to_msecs(asoc->rto_max);
5015 rtoinfo.srto_min = jiffies_to_msecs(asoc->rto_min);
5016 } else {
5017
5018 struct sctp_sock *sp = sctp_sk(sk);
5019
5020 rtoinfo.srto_initial = sp->rtoinfo.srto_initial;
5021 rtoinfo.srto_max = sp->rtoinfo.srto_max;
5022 rtoinfo.srto_min = sp->rtoinfo.srto_min;
5023 }
5024
5025 if (put_user(len, optlen))
5026 return -EFAULT;
5027
5028 if (copy_to_user(optval, &rtoinfo, len))
5029 return -EFAULT;
5030
5031 return 0;
5032}
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045static int sctp_getsockopt_associnfo(struct sock *sk, int len,
5046 char __user *optval,
5047 int __user *optlen)
5048{
5049
5050 struct sctp_assocparams assocparams;
5051 struct sctp_association *asoc;
5052 struct list_head *pos;
5053 int cnt = 0;
5054
5055 if (len < sizeof (struct sctp_assocparams))
5056 return -EINVAL;
5057
5058 len = sizeof(struct sctp_assocparams);
5059
5060 if (copy_from_user(&assocparams, optval, len))
5061 return -EFAULT;
5062
5063 asoc = sctp_id2assoc(sk, assocparams.sasoc_assoc_id);
5064
5065 if (!asoc && assocparams.sasoc_assoc_id && sctp_style(sk, UDP))
5066 return -EINVAL;
5067
5068
5069 if (asoc) {
5070 assocparams.sasoc_asocmaxrxt = asoc->max_retrans;
5071 assocparams.sasoc_peer_rwnd = asoc->peer.rwnd;
5072 assocparams.sasoc_local_rwnd = asoc->a_rwnd;
5073 assocparams.sasoc_cookie_life = (asoc->cookie_life.tv_sec
5074 * 1000) +
5075 (asoc->cookie_life.tv_usec
5076 / 1000);
5077
5078 list_for_each(pos, &asoc->peer.transport_addr_list) {
5079 cnt ++;
5080 }
5081
5082 assocparams.sasoc_number_peer_destinations = cnt;
5083 } else {
5084
5085 struct sctp_sock *sp = sctp_sk(sk);
5086
5087 assocparams.sasoc_asocmaxrxt = sp->assocparams.sasoc_asocmaxrxt;
5088 assocparams.sasoc_peer_rwnd = sp->assocparams.sasoc_peer_rwnd;
5089 assocparams.sasoc_local_rwnd = sp->assocparams.sasoc_local_rwnd;
5090 assocparams.sasoc_cookie_life =
5091 sp->assocparams.sasoc_cookie_life;
5092 assocparams.sasoc_number_peer_destinations =
5093 sp->assocparams.
5094 sasoc_number_peer_destinations;
5095 }
5096
5097 if (put_user(len, optlen))
5098 return -EFAULT;
5099
5100 if (copy_to_user(optval, &assocparams, len))
5101 return -EFAULT;
5102
5103 return 0;
5104}
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116static int sctp_getsockopt_mappedv4(struct sock *sk, int len,
5117 char __user *optval, int __user *optlen)
5118{
5119 int val;
5120 struct sctp_sock *sp = sctp_sk(sk);
5121
5122 if (len < sizeof(int))
5123 return -EINVAL;
5124
5125 len = sizeof(int);
5126 val = sp->v4mapped;
5127 if (put_user(len, optlen))
5128 return -EFAULT;
5129 if (copy_to_user(optval, &val, len))
5130 return -EFAULT;
5131
5132 return 0;
5133}
5134
5135
5136
5137
5138
5139static int sctp_getsockopt_context(struct sock *sk, int len,
5140 char __user *optval, int __user *optlen)
5141{
5142 struct sctp_assoc_value params;
5143 struct sctp_sock *sp;
5144 struct sctp_association *asoc;
5145
5146 if (len < sizeof(struct sctp_assoc_value))
5147 return -EINVAL;
5148
5149 len = sizeof(struct sctp_assoc_value);
5150
5151 if (copy_from_user(¶ms, optval, len))
5152 return -EFAULT;
5153
5154 sp = sctp_sk(sk);
5155
5156 if (params.assoc_id != 0) {
5157 asoc = sctp_id2assoc(sk, params.assoc_id);
5158 if (!asoc)
5159 return -EINVAL;
5160 params.assoc_value = asoc->default_rcv_context;
5161 } else {
5162 params.assoc_value = sp->default_rcv_context;
5163 }
5164
5165 if (put_user(len, optlen))
5166 return -EFAULT;
5167 if (copy_to_user(optval, ¶ms, len))
5168 return -EFAULT;
5169
5170 return 0;
5171}
5172
5173
5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
5197
5198
5199
5200static int sctp_getsockopt_maxseg(struct sock *sk, int len,
5201 char __user *optval, int __user *optlen)
5202{
5203 struct sctp_assoc_value params;
5204 struct sctp_association *asoc;
5205
5206 if (len == sizeof(int)) {
5207 pr_warn("Use of int in maxseg socket option deprecated\n");
5208 pr_warn("Use struct sctp_assoc_value instead\n");
5209 params.assoc_id = 0;
5210 } else if (len >= sizeof(struct sctp_assoc_value)) {
5211 len = sizeof(struct sctp_assoc_value);
5212 if (copy_from_user(¶ms, optval, sizeof(params)))
5213 return -EFAULT;
5214 } else
5215 return -EINVAL;
5216
5217 asoc = sctp_id2assoc(sk, params.assoc_id);
5218 if (!asoc && params.assoc_id && sctp_style(sk, UDP))
5219 return -EINVAL;
5220
5221 if (asoc)
5222 params.assoc_value = asoc->frag_point;
5223 else
5224 params.assoc_value = sctp_sk(sk)->user_frag;
5225
5226 if (put_user(len, optlen))
5227 return -EFAULT;
5228 if (len == sizeof(int)) {
5229 if (copy_to_user(optval, ¶ms.assoc_value, len))
5230 return -EFAULT;
5231 } else {
5232 if (copy_to_user(optval, ¶ms, len))
5233 return -EFAULT;
5234 }
5235
5236 return 0;
5237}
5238
5239
5240
5241
5242
5243static int sctp_getsockopt_fragment_interleave(struct sock *sk, int len,
5244 char __user *optval, int __user *optlen)
5245{
5246 int val;
5247
5248 if (len < sizeof(int))
5249 return -EINVAL;
5250
5251 len = sizeof(int);
5252
5253 val = sctp_sk(sk)->frag_interleave;
5254 if (put_user(len, optlen))
5255 return -EFAULT;
5256 if (copy_to_user(optval, &val, len))
5257 return -EFAULT;
5258
5259 return 0;
5260}
5261
5262
5263
5264
5265
5266static int sctp_getsockopt_partial_delivery_point(struct sock *sk, int len,
5267 char __user *optval,
5268 int __user *optlen)
5269{
5270 u32 val;
5271
5272 if (len < sizeof(u32))
5273 return -EINVAL;
5274
5275 len = sizeof(u32);
5276
5277 val = sctp_sk(sk)->pd_point;
5278 if (put_user(len, optlen))
5279 return -EFAULT;
5280 if (copy_to_user(optval, &val, len))
5281 return -EFAULT;
5282
5283 return 0;
5284}
5285
5286
5287
5288
5289
5290static int sctp_getsockopt_maxburst(struct sock *sk, int len,
5291 char __user *optval,
5292 int __user *optlen)
5293{
5294 struct sctp_assoc_value params;
5295 struct sctp_sock *sp;
5296 struct sctp_association *asoc;
5297
5298 if (len == sizeof(int)) {
5299 pr_warn("Use of int in max_burst socket option deprecated\n");
5300 pr_warn("Use struct sctp_assoc_value instead\n");
5301 params.assoc_id = 0;
5302 } else if (len >= sizeof(struct sctp_assoc_value)) {
5303 len = sizeof(struct sctp_assoc_value);
5304 if (copy_from_user(¶ms, optval, len))
5305 return -EFAULT;
5306 } else
5307 return -EINVAL;
5308
5309 sp = sctp_sk(sk);
5310
5311 if (params.assoc_id != 0) {
5312 asoc = sctp_id2assoc(sk, params.assoc_id);
5313 if (!asoc)
5314 return -EINVAL;
5315 params.assoc_value = asoc->max_burst;
5316 } else
5317 params.assoc_value = sp->max_burst;
5318
5319 if (len == sizeof(int)) {
5320 if (copy_to_user(optval, ¶ms.assoc_value, len))
5321 return -EFAULT;
5322 } else {
5323 if (copy_to_user(optval, ¶ms, len))
5324 return -EFAULT;
5325 }
5326
5327 return 0;
5328
5329}
5330
5331static int sctp_getsockopt_hmac_ident(struct sock *sk, int len,
5332 char __user *optval, int __user *optlen)
5333{
5334 struct net *net = sock_net(sk);
5335 struct sctp_hmacalgo __user *p = (void __user *)optval;
5336 struct sctp_hmac_algo_param *hmacs;
5337 __u16 data_len = 0;
5338 u32 num_idents;
5339
5340 if (!net->sctp.auth_enable)
5341 return -EACCES;
5342
5343 hmacs = sctp_sk(sk)->ep->auth_hmacs_list;
5344 data_len = ntohs(hmacs->param_hdr.length) - sizeof(sctp_paramhdr_t);
5345
5346 if (len < sizeof(struct sctp_hmacalgo) + data_len)
5347 return -EINVAL;
5348
5349 len = sizeof(struct sctp_hmacalgo) + data_len;
5350 num_idents = data_len / sizeof(u16);
5351
5352 if (put_user(len, optlen))
5353 return -EFAULT;
5354 if (put_user(num_idents, &p->shmac_num_idents))
5355 return -EFAULT;
5356 if (copy_to_user(p->shmac_idents, hmacs->hmac_ids, data_len))
5357 return -EFAULT;
5358 return 0;
5359}
5360
5361static int sctp_getsockopt_active_key(struct sock *sk, int len,
5362 char __user *optval, int __user *optlen)
5363{
5364 struct net *net = sock_net(sk);
5365 struct sctp_authkeyid val;
5366 struct sctp_association *asoc;
5367
5368 if (!net->sctp.auth_enable)
5369 return -EACCES;
5370
5371 if (len < sizeof(struct sctp_authkeyid))
5372 return -EINVAL;
5373 if (copy_from_user(&val, optval, sizeof(struct sctp_authkeyid)))
5374 return -EFAULT;
5375
5376 asoc = sctp_id2assoc(sk, val.scact_assoc_id);
5377 if (!asoc && val.scact_assoc_id && sctp_style(sk, UDP))
5378 return -EINVAL;
5379
5380 if (asoc)
5381 val.scact_keynumber = asoc->active_key_id;
5382 else
5383 val.scact_keynumber = sctp_sk(sk)->ep->active_key_id;
5384
5385 len = sizeof(struct sctp_authkeyid);
5386 if (put_user(len, optlen))
5387 return -EFAULT;
5388 if (copy_to_user(optval, &val, len))
5389 return -EFAULT;
5390
5391 return 0;
5392}
5393
5394static int sctp_getsockopt_peer_auth_chunks(struct sock *sk, int len,
5395 char __user *optval, int __user *optlen)
5396{
5397 struct net *net = sock_net(sk);
5398 struct sctp_authchunks __user *p = (void __user *)optval;
5399 struct sctp_authchunks val;
5400 struct sctp_association *asoc;
5401 struct sctp_chunks_param *ch;
5402 u32 num_chunks = 0;
5403 char __user *to;
5404
5405 if (!net->sctp.auth_enable)
5406 return -EACCES;
5407
5408 if (len < sizeof(struct sctp_authchunks))
5409 return -EINVAL;
5410
5411 if (copy_from_user(&val, optval, sizeof(struct sctp_authchunks)))
5412 return -EFAULT;
5413
5414 to = p->gauth_chunks;
5415 asoc = sctp_id2assoc(sk, val.gauth_assoc_id);
5416 if (!asoc)
5417 return -EINVAL;
5418
5419 ch = asoc->peer.peer_chunks;
5420 if (!ch)
5421 goto num;
5422
5423
5424 num_chunks = ntohs(ch->param_hdr.length) - sizeof(sctp_paramhdr_t);
5425 if (len < num_chunks)
5426 return -EINVAL;
5427
5428 if (copy_to_user(to, ch->chunks, num_chunks))
5429 return -EFAULT;
5430num:
5431 len = sizeof(struct sctp_authchunks) + num_chunks;
5432 if (put_user(len, optlen)) return -EFAULT;
5433 if (put_user(num_chunks, &p->gauth_number_of_chunks))
5434 return -EFAULT;
5435 return 0;
5436}
5437
5438static int sctp_getsockopt_local_auth_chunks(struct sock *sk, int len,
5439 char __user *optval, int __user *optlen)
5440{
5441 struct net *net = sock_net(sk);
5442 struct sctp_authchunks __user *p = (void __user *)optval;
5443 struct sctp_authchunks val;
5444 struct sctp_association *asoc;
5445 struct sctp_chunks_param *ch;
5446 u32 num_chunks = 0;
5447 char __user *to;
5448
5449 if (!net->sctp.auth_enable)
5450 return -EACCES;
5451
5452 if (len < sizeof(struct sctp_authchunks))
5453 return -EINVAL;
5454
5455 if (copy_from_user(&val, optval, sizeof(struct sctp_authchunks)))
5456 return -EFAULT;
5457
5458 to = p->gauth_chunks;
5459 asoc = sctp_id2assoc(sk, val.gauth_assoc_id);
5460 if (!asoc && val.gauth_assoc_id && sctp_style(sk, UDP))
5461 return -EINVAL;
5462
5463 if (asoc)
5464 ch = (struct sctp_chunks_param*)asoc->c.auth_chunks;
5465 else
5466 ch = sctp_sk(sk)->ep->auth_chunk_list;
5467
5468 if (!ch)
5469 goto num;
5470
5471 num_chunks = ntohs(ch->param_hdr.length) - sizeof(sctp_paramhdr_t);
5472 if (len < sizeof(struct sctp_authchunks) + num_chunks)
5473 return -EINVAL;
5474
5475 if (copy_to_user(to, ch->chunks, num_chunks))
5476 return -EFAULT;
5477num:
5478 len = sizeof(struct sctp_authchunks) + num_chunks;
5479 if (put_user(len, optlen))
5480 return -EFAULT;
5481 if (put_user(num_chunks, &p->gauth_number_of_chunks))
5482 return -EFAULT;
5483
5484 return 0;
5485}
5486
5487
5488
5489
5490
5491
5492static int sctp_getsockopt_assoc_number(struct sock *sk, int len,
5493 char __user *optval, int __user *optlen)
5494{
5495 struct sctp_sock *sp = sctp_sk(sk);
5496 struct sctp_association *asoc;
5497 u32 val = 0;
5498
5499 if (sctp_style(sk, TCP))
5500 return -EOPNOTSUPP;
5501
5502 if (len < sizeof(u32))
5503 return -EINVAL;
5504
5505 len = sizeof(u32);
5506
5507 list_for_each_entry(asoc, &(sp->ep->asocs), asocs) {
5508 val++;
5509 }
5510
5511 if (put_user(len, optlen))
5512 return -EFAULT;
5513 if (copy_to_user(optval, &val, len))
5514 return -EFAULT;
5515
5516 return 0;
5517}
5518
5519
5520
5521
5522
5523static int sctp_getsockopt_auto_asconf(struct sock *sk, int len,
5524 char __user *optval, int __user *optlen)
5525{
5526 int val = 0;
5527
5528 if (len < sizeof(int))
5529 return -EINVAL;
5530
5531 len = sizeof(int);
5532 if (sctp_sk(sk)->do_auto_asconf && sctp_is_ep_boundall(sk))
5533 val = 1;
5534 if (put_user(len, optlen))
5535 return -EFAULT;
5536 if (copy_to_user(optval, &val, len))
5537 return -EFAULT;
5538 return 0;
5539}
5540
5541
5542
5543
5544
5545
5546
5547
5548static int sctp_getsockopt_assoc_ids(struct sock *sk, int len,
5549 char __user *optval, int __user *optlen)
5550{
5551 struct sctp_sock *sp = sctp_sk(sk);
5552 struct sctp_association *asoc;
5553 struct sctp_assoc_ids *ids;
5554 u32 num = 0;
5555
5556 if (sctp_style(sk, TCP))
5557 return -EOPNOTSUPP;
5558
5559 if (len < sizeof(struct sctp_assoc_ids))
5560 return -EINVAL;
5561
5562 list_for_each_entry(asoc, &(sp->ep->asocs), asocs) {
5563 num++;
5564 }
5565
5566 if (len < sizeof(struct sctp_assoc_ids) + sizeof(sctp_assoc_t) * num)
5567 return -EINVAL;
5568
5569 len = sizeof(struct sctp_assoc_ids) + sizeof(sctp_assoc_t) * num;
5570
5571 ids = kmalloc(len, GFP_KERNEL);
5572 if (unlikely(!ids))
5573 return -ENOMEM;
5574
5575 ids->gaids_number_of_ids = num;
5576 num = 0;
5577 list_for_each_entry(asoc, &(sp->ep->asocs), asocs) {
5578 ids->gaids_assoc_id[num++] = asoc->assoc_id;
5579 }
5580
5581 if (put_user(len, optlen) || copy_to_user(optval, ids, len)) {
5582 kfree(ids);
5583 return -EFAULT;
5584 }
5585
5586 kfree(ids);
5587 return 0;
5588}
5589
5590
5591
5592
5593
5594
5595
5596
5597static int sctp_getsockopt_paddr_thresholds(struct sock *sk,
5598 char __user *optval,
5599 int len,
5600 int __user *optlen)
5601{
5602 struct sctp_paddrthlds val;
5603 struct sctp_transport *trans;
5604 struct sctp_association *asoc;
5605
5606 if (len < sizeof(struct sctp_paddrthlds))
5607 return -EINVAL;
5608 len = sizeof(struct sctp_paddrthlds);
5609 if (copy_from_user(&val, (struct sctp_paddrthlds __user *)optval, len))
5610 return -EFAULT;
5611
5612 if (sctp_is_any(sk, (const union sctp_addr *)&val.spt_address)) {
5613 asoc = sctp_id2assoc(sk, val.spt_assoc_id);
5614 if (!asoc)
5615 return -ENOENT;
5616
5617 val.spt_pathpfthld = asoc->pf_retrans;
5618 val.spt_pathmaxrxt = asoc->pathmaxrxt;
5619 } else {
5620 trans = sctp_addr_id2transport(sk, &val.spt_address,
5621 val.spt_assoc_id);
5622 if (!trans)
5623 return -ENOENT;
5624
5625 val.spt_pathmaxrxt = trans->pathmaxrxt;
5626 val.spt_pathpfthld = trans->pf_retrans;
5627 }
5628
5629 if (put_user(len, optlen) || copy_to_user(optval, &val, len))
5630 return -EFAULT;
5631
5632 return 0;
5633}
5634
5635SCTP_STATIC int sctp_getsockopt(struct sock *sk, int level, int optname,
5636 char __user *optval, int __user *optlen)
5637{
5638 int retval = 0;
5639 int len;
5640
5641 SCTP_DEBUG_PRINTK("sctp_getsockopt(sk: %p... optname: %d)\n",
5642 sk, optname);
5643
5644
5645
5646
5647
5648
5649
5650 if (level != SOL_SCTP) {
5651 struct