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