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 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
1236
1237
1238
1239 sctp_unhash_established(asoc);
1240 sctp_association_free(asoc);
1241 }
1242 return err;
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
1301
1302
1303
1304
1305
1306
1307SCTP_STATIC int __sctp_setsockopt_connectx(struct sock* sk,
1308 struct sockaddr __user *addrs,
1309 int addrs_size,
1310 sctp_assoc_t *assoc_id)
1311{
1312 int err = 0;
1313 struct sockaddr *kaddrs;
1314
1315 SCTP_DEBUG_PRINTK("%s - sk %p addrs %p addrs_size %d\n",
1316 __func__, sk, addrs, addrs_size);
1317
1318 if (unlikely(addrs_size <= 0))
1319 return -EINVAL;
1320
1321
1322 if (unlikely(!access_ok(VERIFY_READ, addrs, addrs_size)))
1323 return -EFAULT;
1324
1325
1326 kaddrs = kmalloc(addrs_size, GFP_KERNEL);
1327 if (unlikely(!kaddrs))
1328 return -ENOMEM;
1329
1330 if (__copy_from_user(kaddrs, addrs, addrs_size)) {
1331 err = -EFAULT;
1332 } else {
1333 err = __sctp_connect(sk, kaddrs, addrs_size, assoc_id);
1334 }
1335
1336 kfree(kaddrs);
1337
1338 return err;
1339}
1340
1341
1342
1343
1344
1345SCTP_STATIC int sctp_setsockopt_connectx_old(struct sock* sk,
1346 struct sockaddr __user *addrs,
1347 int addrs_size)
1348{
1349 return __sctp_setsockopt_connectx(sk, addrs, addrs_size, NULL);
1350}
1351
1352
1353
1354
1355
1356
1357
1358SCTP_STATIC int sctp_setsockopt_connectx(struct sock* sk,
1359 struct sockaddr __user *addrs,
1360 int addrs_size)
1361{
1362 sctp_assoc_t assoc_id = 0;
1363 int err = 0;
1364
1365 err = __sctp_setsockopt_connectx(sk, addrs, addrs_size, &assoc_id);
1366
1367 if (err)
1368 return err;
1369 else
1370 return assoc_id;
1371}
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381SCTP_STATIC int sctp_getsockopt_connectx3(struct sock* sk, int len,
1382 char __user *optval,
1383 int __user *optlen)
1384{
1385 struct sctp_getaddrs_old param;
1386 sctp_assoc_t assoc_id = 0;
1387 int err = 0;
1388
1389 if (len < sizeof(param))
1390 return -EINVAL;
1391
1392 if (copy_from_user(¶m, optval, sizeof(param)))
1393 return -EFAULT;
1394
1395 err = __sctp_setsockopt_connectx(sk,
1396 (struct sockaddr __user *)param.addrs,
1397 param.addr_num, &assoc_id);
1398
1399 if (err == 0 || err == -EINPROGRESS) {
1400 if (copy_to_user(optval, &assoc_id, sizeof(assoc_id)))
1401 return -EFAULT;
1402 if (put_user(sizeof(assoc_id), optlen))
1403 return -EFAULT;
1404 }
1405
1406 return err;
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
1453
1454
1455
1456
1457
1458
1459SCTP_STATIC void sctp_close(struct sock *sk, long timeout)
1460{
1461 struct sctp_endpoint *ep;
1462 struct sctp_association *asoc;
1463 struct list_head *pos, *temp;
1464 unsigned int data_was_unread;
1465
1466 SCTP_DEBUG_PRINTK("sctp_close(sk: 0x%p, timeout:%ld)\n", sk, timeout);
1467
1468 sctp_lock_sock(sk);
1469 sk->sk_shutdown = SHUTDOWN_MASK;
1470 sk->sk_state = SCTP_SS_CLOSING;
1471
1472 ep = sctp_sk(sk)->ep;
1473
1474
1475 data_was_unread = sctp_queue_purge_ulpevents(&sk->sk_receive_queue);
1476 data_was_unread += sctp_queue_purge_ulpevents(&sctp_sk(sk)->pd_lobby);
1477
1478
1479 list_for_each_safe(pos, temp, &ep->asocs) {
1480 asoc = list_entry(pos, struct sctp_association, asocs);
1481
1482 if (sctp_style(sk, TCP)) {
1483
1484
1485
1486
1487
1488 if (sctp_state(asoc, CLOSED)) {
1489 sctp_unhash_established(asoc);
1490 sctp_association_free(asoc);
1491 continue;
1492 }
1493 }
1494
1495 if (data_was_unread || !skb_queue_empty(&asoc->ulpq.lobby) ||
1496 !skb_queue_empty(&asoc->ulpq.reasm) ||
1497 (sock_flag(sk, SOCK_LINGER) && !sk->sk_lingertime)) {
1498 struct sctp_chunk *chunk;
1499
1500 chunk = sctp_make_abort_user(asoc, NULL, 0);
1501 if (chunk)
1502 sctp_primitive_ABORT(asoc, chunk);
1503 } else
1504 sctp_primitive_SHUTDOWN(asoc, NULL);
1505 }
1506
1507
1508 if (sctp_style(sk, TCP) && timeout)
1509 sctp_wait_for_close(sk, timeout);
1510
1511
1512 sctp_release_sock(sk);
1513
1514
1515
1516
1517 sctp_local_bh_disable();
1518 sctp_bh_lock_sock(sk);
1519
1520
1521
1522
1523 sock_hold(sk);
1524 sk_common_release(sk);
1525
1526 sctp_bh_unlock_sock(sk);
1527 sctp_local_bh_enable();
1528
1529 sock_put(sk);
1530
1531 SCTP_DBG_OBJCNT_DEC(sock);
1532}
1533
1534
1535static int sctp_error(struct sock *sk, int flags, int err)
1536{
1537 if (err == -EPIPE)
1538 err = sock_error(sk) ? : -EPIPE;
1539 if (err == -EPIPE && !(flags & MSG_NOSIGNAL))
1540 send_sig(SIGPIPE, current, 0);
1541 return err;
1542}
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567SCTP_STATIC int sctp_msghdr_parse(const struct msghdr *, sctp_cmsgs_t *);
1568
1569SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk,
1570 struct msghdr *msg, size_t msg_len)
1571{
1572 struct sctp_sock *sp;
1573 struct sctp_endpoint *ep;
1574 struct sctp_association *new_asoc=NULL, *asoc=NULL;
1575 struct sctp_transport *transport, *chunk_tp;
1576 struct sctp_chunk *chunk;
1577 union sctp_addr to;
1578 struct sockaddr *msg_name = NULL;
1579 struct sctp_sndrcvinfo default_sinfo;
1580 struct sctp_sndrcvinfo *sinfo;
1581 struct sctp_initmsg *sinit;
1582 sctp_assoc_t associd = 0;
1583 sctp_cmsgs_t cmsgs = { NULL };
1584 int err;
1585 sctp_scope_t scope;
1586 long timeo;
1587 __u16 sinfo_flags = 0;
1588 struct sctp_datamsg *datamsg;
1589 int msg_flags = msg->msg_flags;
1590
1591 SCTP_DEBUG_PRINTK("sctp_sendmsg(sk: %p, msg: %p, msg_len: %zu)\n",
1592 sk, msg, msg_len);
1593
1594 err = 0;
1595 sp = sctp_sk(sk);
1596 ep = sp->ep;
1597
1598 SCTP_DEBUG_PRINTK("Using endpoint: %p.\n", ep);
1599
1600
1601 if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING)) {
1602 err = -EPIPE;
1603 goto out_nounlock;
1604 }
1605
1606
1607 err = sctp_msghdr_parse(msg, &cmsgs);
1608
1609 if (err) {
1610 SCTP_DEBUG_PRINTK("msghdr parse err = %x\n", err);
1611 goto out_nounlock;
1612 }
1613
1614
1615
1616
1617
1618
1619 if (!sctp_style(sk, UDP_HIGH_BANDWIDTH) && msg->msg_name) {
1620 int msg_namelen = msg->msg_namelen;
1621
1622 err = sctp_verify_addr(sk, (union sctp_addr *)msg->msg_name,
1623 msg_namelen);
1624 if (err)
1625 return err;
1626
1627 if (msg_namelen > sizeof(to))
1628 msg_namelen = sizeof(to);
1629 memcpy(&to, msg->msg_name, msg_namelen);
1630 msg_name = msg->msg_name;
1631 }
1632
1633 sinfo = cmsgs.info;
1634 sinit = cmsgs.init;
1635
1636
1637 if (sinfo) {
1638 sinfo_flags = sinfo->sinfo_flags;
1639 associd = sinfo->sinfo_assoc_id;
1640 }
1641
1642 SCTP_DEBUG_PRINTK("msg_len: %zu, sinfo_flags: 0x%x\n",
1643 msg_len, sinfo_flags);
1644
1645
1646 if (sctp_style(sk, TCP) && (sinfo_flags & (SCTP_EOF | SCTP_ABORT))) {
1647 err = -EINVAL;
1648 goto out_nounlock;
1649 }
1650
1651
1652
1653
1654
1655
1656 if (((sinfo_flags & SCTP_EOF) && (msg_len > 0)) ||
1657 (!(sinfo_flags & (SCTP_EOF|SCTP_ABORT)) && (msg_len == 0))) {
1658 err = -EINVAL;
1659 goto out_nounlock;
1660 }
1661
1662
1663
1664
1665 if ((sinfo_flags & SCTP_ADDR_OVER) && (!msg->msg_name)) {
1666 err = -EINVAL;
1667 goto out_nounlock;
1668 }
1669
1670 transport = NULL;
1671
1672 SCTP_DEBUG_PRINTK("About to look up association.\n");
1673
1674 sctp_lock_sock(sk);
1675
1676
1677 if (msg_name) {
1678
1679 asoc = sctp_endpoint_lookup_assoc(ep, &to, &transport);
1680 if (!asoc) {
1681
1682
1683
1684
1685
1686 if ((sctp_style(sk, TCP) &&
1687 sctp_sstate(sk, ESTABLISHED)) ||
1688 sctp_endpoint_is_peeled_off(ep, &to)) {
1689 err = -EADDRNOTAVAIL;
1690 goto out_unlock;
1691 }
1692 }
1693 } else {
1694 asoc = sctp_id2assoc(sk, associd);
1695 if (!asoc) {
1696 err = -EPIPE;
1697 goto out_unlock;
1698 }
1699 }
1700
1701 if (asoc) {
1702 SCTP_DEBUG_PRINTK("Just looked up association: %p.\n", asoc);
1703
1704
1705
1706
1707
1708
1709 if (sctp_state(asoc, CLOSED) && sctp_style(sk, TCP)) {
1710 err = -EPIPE;
1711 goto out_unlock;
1712 }
1713
1714 if (sinfo_flags & SCTP_EOF) {
1715 SCTP_DEBUG_PRINTK("Shutting down association: %p\n",
1716 asoc);
1717 sctp_primitive_SHUTDOWN(asoc, NULL);
1718 err = 0;
1719 goto out_unlock;
1720 }
1721 if (sinfo_flags & SCTP_ABORT) {
1722
1723 chunk = sctp_make_abort_user(asoc, msg, msg_len);
1724 if (!chunk) {
1725 err = -ENOMEM;
1726 goto out_unlock;
1727 }
1728
1729 SCTP_DEBUG_PRINTK("Aborting association: %p\n", asoc);
1730 sctp_primitive_ABORT(asoc, chunk);
1731 err = 0;
1732 goto out_unlock;
1733 }
1734 }
1735
1736
1737 if (!asoc) {
1738 SCTP_DEBUG_PRINTK("There is no association yet.\n");
1739
1740 if (sinfo_flags & (SCTP_EOF | SCTP_ABORT)) {
1741 err = -EINVAL;
1742 goto out_unlock;
1743 }
1744
1745
1746
1747
1748 if (sinfo) {
1749 if (!sinit || (sinit && !sinit->sinit_num_ostreams)) {
1750
1751 if (sinfo->sinfo_stream >=
1752 sp->initmsg.sinit_num_ostreams) {
1753 err = -EINVAL;
1754 goto out_unlock;
1755 }
1756 } else {
1757
1758 if (sinfo->sinfo_stream >=
1759 sinit->sinit_num_ostreams) {
1760 err = -EINVAL;
1761 goto out_unlock;
1762 }
1763 }
1764 }
1765
1766
1767
1768
1769
1770
1771
1772
1773 if (!ep->base.bind_addr.port) {
1774 if (sctp_autobind(sk)) {
1775 err = -EAGAIN;
1776 goto out_unlock;
1777 }
1778 } else {
1779
1780
1781
1782
1783
1784
1785
1786 if (ep->base.bind_addr.port < PROT_SOCK &&
1787 !capable(CAP_NET_BIND_SERVICE)) {
1788 err = -EACCES;
1789 goto out_unlock;
1790 }
1791 }
1792
1793 scope = sctp_scope(&to);
1794 new_asoc = sctp_association_new(ep, sk, scope, GFP_KERNEL);
1795 if (!new_asoc) {
1796 err = -ENOMEM;
1797 goto out_unlock;
1798 }
1799 asoc = new_asoc;
1800 err = sctp_assoc_set_bind_addr_from_ep(asoc, scope, GFP_KERNEL);
1801 if (err < 0) {
1802 err = -ENOMEM;
1803 goto out_free;
1804 }
1805
1806
1807
1808
1809 if (sinit) {
1810 if (sinit->sinit_num_ostreams) {
1811 asoc->c.sinit_num_ostreams =
1812 sinit->sinit_num_ostreams;
1813 }
1814 if (sinit->sinit_max_instreams) {
1815 asoc->c.sinit_max_instreams =
1816 sinit->sinit_max_instreams;
1817 }
1818 if (sinit->sinit_max_attempts) {
1819 asoc->max_init_attempts
1820 = sinit->sinit_max_attempts;
1821 }
1822 if (sinit->sinit_max_init_timeo) {
1823 asoc->max_init_timeo =
1824 msecs_to_jiffies(sinit->sinit_max_init_timeo);
1825 }
1826 }
1827
1828
1829 transport = sctp_assoc_add_peer(asoc, &to, GFP_KERNEL, SCTP_UNKNOWN);
1830 if (!transport) {
1831 err = -ENOMEM;
1832 goto out_free;
1833 }
1834 }
1835
1836
1837 SCTP_DEBUG_PRINTK("We have a valid association.\n");
1838
1839 if (!sinfo) {
1840
1841
1842
1843 memset(&default_sinfo, 0, sizeof(default_sinfo));
1844 default_sinfo.sinfo_stream = asoc->default_stream;
1845 default_sinfo.sinfo_flags = asoc->default_flags;
1846 default_sinfo.sinfo_ppid = asoc->default_ppid;
1847 default_sinfo.sinfo_context = asoc->default_context;
1848 default_sinfo.sinfo_timetolive = asoc->default_timetolive;
1849 default_sinfo.sinfo_assoc_id = sctp_assoc2id(asoc);
1850 sinfo = &default_sinfo;
1851 }
1852
1853
1854
1855
1856 if (msg_len > sk->sk_sndbuf) {
1857 err = -EMSGSIZE;
1858 goto out_free;
1859 }
1860
1861 if (asoc->pmtu_pending)
1862 sctp_assoc_pending_pmtu(sk, asoc);
1863
1864
1865
1866
1867
1868
1869 if (sctp_sk(sk)->disable_fragments && (msg_len > asoc->frag_point)) {
1870 err = -EMSGSIZE;
1871 goto out_free;
1872 }
1873
1874
1875 if (sinfo->sinfo_stream >= asoc->c.sinit_num_ostreams) {
1876 err = -EINVAL;
1877 goto out_free;
1878 }
1879
1880 timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT);
1881 if (!sctp_wspace(asoc)) {
1882 err = sctp_wait_for_sndbuf(asoc, &timeo, msg_len);
1883 if (err)
1884 goto out_free;
1885 }
1886
1887
1888
1889
1890
1891 if ((sctp_style(sk, TCP) && msg_name) ||
1892 (sinfo_flags & SCTP_ADDR_OVER)) {
1893 chunk_tp = sctp_assoc_lookup_paddr(asoc, &to);
1894 if (!chunk_tp) {
1895 err = -EINVAL;
1896 goto out_free;
1897 }
1898 } else
1899 chunk_tp = NULL;
1900
1901
1902 if (sctp_state(asoc, CLOSED)) {
1903 err = sctp_primitive_ASSOCIATE(asoc, NULL);
1904 if (err < 0)
1905 goto out_free;
1906 SCTP_DEBUG_PRINTK("We associated primitively.\n");
1907 }
1908
1909
1910 datamsg = sctp_datamsg_from_user(asoc, sinfo, msg, msg_len);
1911 if (!datamsg) {
1912 err = -ENOMEM;
1913 goto out_free;
1914 }
1915
1916
1917 list_for_each_entry(chunk, &datamsg->chunks, frag_list) {
1918 sctp_chunk_hold(chunk);
1919
1920
1921 sctp_set_owner_w(chunk);
1922
1923 chunk->transport = chunk_tp;
1924 }
1925
1926
1927
1928
1929
1930
1931 err = sctp_primitive_SEND(asoc, datamsg);
1932
1933 if (err)
1934 sctp_datamsg_free(datamsg);
1935 else
1936 sctp_datamsg_put(datamsg);
1937
1938 SCTP_DEBUG_PRINTK("We sent primitively.\n");
1939
1940 if (err)
1941 goto out_free;
1942 else
1943 err = msg_len;
1944
1945
1946
1947
1948 goto out_unlock;
1949
1950out_free:
1951 if (new_asoc) {
1952 sctp_unhash_established(asoc);
1953 sctp_association_free(asoc);
1954 }
1955out_unlock:
1956 sctp_release_sock(sk);
1957
1958out_nounlock:
1959 return sctp_error(sk, msg_flags, err);
1960
1961#if 0
1962do_sock_err:
1963 if (msg_len)
1964 err = msg_len;
1965 else
1966 err = sock_error(sk);
1967 goto out;
1968
1969do_interrupted:
1970 if (msg_len)
1971 err = msg_len;
1972 goto out;
1973#endif
1974}
1975
1976
1977
1978
1979
1980
1981
1982
1983static int sctp_skb_pull(struct sk_buff *skb, int len)
1984{
1985 struct sk_buff *list;
1986 int skb_len = skb_headlen(skb);
1987 int rlen;
1988
1989 if (len <= skb_len) {
1990 __skb_pull(skb, len);
1991 return 0;
1992 }
1993 len -= skb_len;
1994 __skb_pull(skb, skb_len);
1995
1996 skb_walk_frags(skb, list) {
1997 rlen = sctp_skb_pull(list, len);
1998 skb->len -= (len-rlen);
1999 skb->data_len -= (len-rlen);
2000
2001 if (!rlen)
2002 return 0;
2003
2004 len = rlen;
2005 }
2006
2007 return len;
2008}
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025static struct sk_buff *sctp_skb_recv_datagram(struct sock *, int, int, int *);
2026
2027SCTP_STATIC int sctp_recvmsg(struct kiocb *iocb, struct sock *sk,
2028 struct msghdr *msg, size_t len, int noblock,
2029 int flags, int *addr_len)
2030{
2031 struct sctp_ulpevent *event = NULL;
2032 struct sctp_sock *sp = sctp_sk(sk);
2033 struct sk_buff *skb;
2034 int copied;
2035 int err = 0;
2036 int skb_len;
2037
2038 SCTP_DEBUG_PRINTK("sctp_recvmsg(%s: %p, %s: %p, %s: %zd, %s: %d, %s: "
2039 "0x%x, %s: %p)\n", "sk", sk, "msghdr", msg,
2040 "len", len, "knoblauch", noblock,
2041 "flags", flags, "addr_len", addr_len);
2042
2043 sctp_lock_sock(sk);
2044
2045 if (sctp_style(sk, TCP) && !sctp_sstate(sk, ESTABLISHED)) {
2046 err = -ENOTCONN;
2047 goto out;
2048 }
2049
2050 skb = sctp_skb_recv_datagram(sk, flags, noblock, &err);
2051 if (!skb)
2052 goto out;
2053
2054
2055
2056
2057 skb_len = skb->len;
2058
2059 copied = skb_len;
2060 if (copied > len)
2061 copied = len;
2062
2063 err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
2064
2065 event = sctp_skb2event(skb);
2066
2067 if (err)
2068 goto out_free;
2069
2070 sock_recv_ts_and_drops(msg, sk, skb);
2071 if (sctp_ulpevent_is_notification(event)) {
2072 msg->msg_flags |= MSG_NOTIFICATION;
2073 sp->pf->event_msgname(event, msg->msg_name, addr_len);
2074 } else {
2075 sp->pf->skb_msgname(skb, msg->msg_name, addr_len);
2076 }
2077
2078
2079 if (sp->subscribe.sctp_data_io_event)
2080 sctp_ulpevent_read_sndrcvinfo(event, msg);
2081#if 0
2082
2083 if (sk->sk_protinfo.af_inet.cmsg_flags)
2084 ip_cmsg_recv(msg, skb);
2085#endif
2086
2087 err = copied;
2088
2089
2090
2091
2092
2093 if (skb_len > copied) {
2094 msg->msg_flags &= ~MSG_EOR;
2095 if (flags & MSG_PEEK)
2096 goto out_free;
2097 sctp_skb_pull(skb, copied);
2098 skb_queue_head(&sk->sk_receive_queue, skb);
2099
2100
2101
2102
2103
2104 if (!sctp_ulpevent_is_notification(event))
2105 sctp_assoc_rwnd_increase(event->asoc, copied);
2106 goto out;
2107 } else if ((event->msg_flags & MSG_NOTIFICATION) ||
2108 (event->msg_flags & MSG_EOR))
2109 msg->msg_flags |= MSG_EOR;
2110 else
2111 msg->msg_flags &= ~MSG_EOR;
2112
2113out_free:
2114 if (flags & MSG_PEEK) {
2115
2116
2117
2118 kfree_skb(skb);
2119 } else {
2120
2121
2122
2123
2124 sctp_ulpevent_free(event);
2125 }
2126out:
2127 sctp_release_sock(sk);
2128 return err;
2129}
2130
2131
2132
2133
2134
2135
2136
2137
2138static int sctp_setsockopt_disable_fragments(struct sock *sk,
2139 char __user *optval,
2140 unsigned int optlen)
2141{
2142 int val;
2143
2144 if (optlen < sizeof(int))
2145 return -EINVAL;
2146
2147 if (get_user(val, (int __user *)optval))
2148 return -EFAULT;
2149
2150 sctp_sk(sk)->disable_fragments = (val == 0) ? 0 : 1;
2151
2152 return 0;
2153}
2154
2155static int sctp_setsockopt_events(struct sock *sk, char __user *optval,
2156 unsigned int optlen)
2157{
2158 struct sctp_association *asoc;
2159 struct sctp_ulpevent *event;
2160
2161 if (optlen > sizeof(struct sctp_event_subscribe))
2162 return -EINVAL;
2163 if (copy_from_user(&sctp_sk(sk)->subscribe, optval, optlen))
2164 return -EFAULT;
2165
2166
2167
2168
2169
2170
2171 if (sctp_ulpevent_type_enabled(SCTP_SENDER_DRY_EVENT,
2172 &sctp_sk(sk)->subscribe)) {
2173 asoc = sctp_id2assoc(sk, 0);
2174
2175 if (asoc && sctp_outq_is_empty(&asoc->outqueue)) {
2176 event = sctp_ulpevent_make_sender_dry_event(asoc,
2177 GFP_ATOMIC);
2178 if (!event)
2179 return -ENOMEM;
2180
2181 sctp_ulpq_tail_event(&asoc->ulpq, event);
2182 }
2183 }
2184
2185 return 0;
2186}
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199static int sctp_setsockopt_autoclose(struct sock *sk, char __user *optval,
2200 unsigned int optlen)
2201{
2202 struct sctp_sock *sp = sctp_sk(sk);
2203
2204
2205 if (sctp_style(sk, TCP))
2206 return -EOPNOTSUPP;
2207 if (optlen != sizeof(int))
2208 return -EINVAL;
2209 if (copy_from_user(&sp->autoclose, optval, optlen))
2210 return -EFAULT;
2211
2212 return 0;
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
2304
2305
2306
2307
2308
2309
2310
2311
2312static int sctp_apply_peer_addr_params(struct sctp_paddrparams *params,
2313 struct sctp_transport *trans,
2314 struct sctp_association *asoc,
2315 struct sctp_sock *sp,
2316 int hb_change,
2317 int pmtud_change,
2318 int sackdelay_change)
2319{
2320 int error;
2321
2322 if (params->spp_flags & SPP_HB_DEMAND && trans) {
2323 error = sctp_primitive_REQUESTHEARTBEAT (trans->asoc, trans);
2324 if (error)
2325 return error;
2326 }
2327
2328
2329
2330
2331
2332 if (params->spp_flags & SPP_HB_ENABLE) {
2333
2334
2335
2336
2337
2338 if (params->spp_flags & SPP_HB_TIME_IS_ZERO)
2339 params->spp_hbinterval = 0;
2340
2341 if (params->spp_hbinterval ||
2342 (params->spp_flags & SPP_HB_TIME_IS_ZERO)) {
2343 if (trans) {
2344 trans->hbinterval =
2345 msecs_to_jiffies(params->spp_hbinterval);
2346 } else if (asoc) {
2347 asoc->hbinterval =
2348 msecs_to_jiffies(params->spp_hbinterval);
2349 } else {
2350 sp->hbinterval = params->spp_hbinterval;
2351 }
2352 }
2353 }
2354
2355 if (hb_change) {
2356 if (trans) {
2357 trans->param_flags =
2358 (trans->param_flags & ~SPP_HB) | hb_change;
2359 } else if (asoc) {
2360 asoc->param_flags =
2361 (asoc->param_flags & ~SPP_HB) | hb_change;
2362 } else {
2363 sp->param_flags =
2364 (sp->param_flags & ~SPP_HB) | hb_change;
2365 }
2366 }
2367
2368
2369
2370
2371
2372
2373 if ((params->spp_flags & SPP_PMTUD_DISABLE) && params->spp_pathmtu) {
2374 if (trans) {
2375 trans->pathmtu = params->spp_pathmtu;
2376 sctp_assoc_sync_pmtu(sctp_opt2sk(sp), asoc);
2377 } else if (asoc) {
2378 asoc->pathmtu = params->spp_pathmtu;
2379 sctp_frag_point(asoc, params->spp_pathmtu);
2380 } else {
2381 sp->pathmtu = params->spp_pathmtu;
2382 }
2383 }
2384
2385 if (pmtud_change) {
2386 if (trans) {
2387 int update = (trans->param_flags & SPP_PMTUD_DISABLE) &&
2388 (params->spp_flags & SPP_PMTUD_ENABLE);
2389 trans->param_flags =
2390 (trans->param_flags & ~SPP_PMTUD) | pmtud_change;
2391 if (update) {
2392 sctp_transport_pmtu(trans, sctp_opt2sk(sp));
2393 sctp_assoc_sync_pmtu(sctp_opt2sk(sp), asoc);
2394 }
2395 } else if (asoc) {
2396 asoc->param_flags =
2397 (asoc->param_flags & ~SPP_PMTUD) | pmtud_change;
2398 } else {
2399 sp->param_flags =
2400 (sp->param_flags & ~SPP_PMTUD) | pmtud_change;
2401 }
2402 }
2403
2404
2405
2406
2407
2408 if ((params->spp_flags & SPP_SACKDELAY_ENABLE) && params->spp_sackdelay) {
2409 if (trans) {
2410 trans->sackdelay =
2411 msecs_to_jiffies(params->spp_sackdelay);
2412 } else if (asoc) {
2413 asoc->sackdelay =
2414 msecs_to_jiffies(params->spp_sackdelay);
2415 } else {
2416 sp->sackdelay = params->spp_sackdelay;
2417 }
2418 }
2419
2420 if (sackdelay_change) {
2421 if (trans) {
2422 trans->param_flags =
2423 (trans->param_flags & ~SPP_SACKDELAY) |
2424 sackdelay_change;
2425 } else if (asoc) {
2426 asoc->param_flags =
2427 (asoc->param_flags & ~SPP_SACKDELAY) |
2428 sackdelay_change;
2429 } else {
2430 sp->param_flags =
2431 (sp->param_flags & ~SPP_SACKDELAY) |
2432 sackdelay_change;
2433 }
2434 }
2435
2436
2437
2438
2439 if (params->spp_pathmaxrxt) {
2440 if (trans) {
2441 trans->pathmaxrxt = params->spp_pathmaxrxt;
2442 } else if (asoc) {
2443 asoc->pathmaxrxt = params->spp_pathmaxrxt;
2444 } else {
2445 sp->pathmaxrxt = params->spp_pathmaxrxt;
2446 }
2447 }
2448
2449 return 0;
2450}
2451
2452static int sctp_setsockopt_peer_addr_params(struct sock *sk,
2453 char __user *optval,
2454 unsigned int optlen)
2455{
2456 struct sctp_paddrparams params;
2457 struct sctp_transport *trans = NULL;
2458 struct sctp_association *asoc = NULL;
2459 struct sctp_sock *sp = sctp_sk(sk);
2460 int error;
2461 int hb_change, pmtud_change, sackdelay_change;
2462
2463 if (optlen != sizeof(struct sctp_paddrparams))
2464 return - EINVAL;
2465
2466 if (copy_from_user(¶ms, optval, optlen))
2467 return -EFAULT;
2468
2469
2470 hb_change = params.spp_flags & SPP_HB;
2471 pmtud_change = params.spp_flags & SPP_PMTUD;
2472 sackdelay_change = params.spp_flags & SPP_SACKDELAY;
2473
2474 if (hb_change == SPP_HB ||
2475 pmtud_change == SPP_PMTUD ||
2476 sackdelay_change == SPP_SACKDELAY ||
2477 params.spp_sackdelay > 500 ||
2478 (params.spp_pathmtu &&
2479 params.spp_pathmtu < SCTP_DEFAULT_MINSEGMENT))
2480 return -EINVAL;
2481
2482
2483
2484
2485 if (!sctp_is_any(sk, ( union sctp_addr *)¶ms.spp_address)) {
2486 trans = sctp_addr_id2transport(sk, ¶ms.spp_address,
2487 params.spp_assoc_id);
2488 if (!trans)
2489 return -EINVAL;
2490 }
2491
2492
2493
2494
2495
2496 asoc = sctp_id2assoc(sk, params.spp_assoc_id);
2497 if (!asoc && params.spp_assoc_id && sctp_style(sk, UDP))
2498 return -EINVAL;
2499
2500
2501
2502
2503 if (params.spp_flags & SPP_HB_DEMAND && !trans && !asoc)
2504 return -EINVAL;
2505
2506
2507 error = sctp_apply_peer_addr_params(¶ms, trans, asoc, sp,
2508 hb_change, pmtud_change,
2509 sackdelay_change);
2510
2511 if (error)
2512 return error;
2513
2514
2515
2516
2517 if (!trans && asoc) {
2518 list_for_each_entry(trans, &asoc->peer.transport_addr_list,
2519 transports) {
2520 sctp_apply_peer_addr_params(¶ms, trans, asoc, sp,
2521 hb_change, pmtud_change,
2522 sackdelay_change);
2523 }
2524 }
2525
2526 return 0;
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
2557
2558
2559
2560
2561
2562
2563
2564
2565static int sctp_setsockopt_delayed_ack(struct sock *sk,
2566 char __user *optval, unsigned int optlen)
2567{
2568 struct sctp_sack_info params;
2569 struct sctp_transport *trans = NULL;
2570 struct sctp_association *asoc = NULL;
2571 struct sctp_sock *sp = sctp_sk(sk);
2572
2573 if (optlen == sizeof(struct sctp_sack_info)) {
2574 if (copy_from_user(¶ms, optval, optlen))
2575 return -EFAULT;
2576
2577 if (params.sack_delay == 0 && params.sack_freq == 0)
2578 return 0;
2579 } else if (optlen == sizeof(struct sctp_assoc_value)) {
2580 pr_warn("Use of struct sctp_assoc_value in delayed_ack socket option deprecated\n");
2581 pr_warn("Use struct sctp_sack_info instead\n");
2582 if (copy_from_user(¶ms, optval, optlen))
2583 return -EFAULT;
2584
2585 if (params.sack_delay == 0)
2586 params.sack_freq = 1;
2587 else
2588 params.sack_freq = 0;
2589 } else
2590 return - EINVAL;
2591
2592
2593 if (params.sack_delay > 500)
2594 return -EINVAL;
2595
2596
2597
2598
2599
2600 asoc = sctp_id2assoc(sk, params.sack_assoc_id);
2601 if (!asoc && params.sack_assoc_id && sctp_style(sk, UDP))
2602 return -EINVAL;
2603
2604 if (params.sack_delay) {
2605 if (asoc) {
2606 asoc->sackdelay =
2607 msecs_to_jiffies(params.sack_delay);
2608 asoc->param_flags =
2609 (asoc->param_flags & ~SPP_SACKDELAY) |
2610 SPP_SACKDELAY_ENABLE;
2611 } else {
2612 sp->sackdelay = params.sack_delay;
2613 sp->param_flags =
2614 (sp->param_flags & ~SPP_SACKDELAY) |
2615 SPP_SACKDELAY_ENABLE;
2616 }
2617 }
2618
2619 if (params.sack_freq == 1) {
2620 if (asoc) {
2621 asoc->param_flags =
2622 (asoc->param_flags & ~SPP_SACKDELAY) |
2623 SPP_SACKDELAY_DISABLE;
2624 } else {
2625 sp->param_flags =
2626 (sp->param_flags & ~SPP_SACKDELAY) |
2627 SPP_SACKDELAY_DISABLE;
2628 }
2629 } else if (params.sack_freq > 1) {
2630 if (asoc) {
2631 asoc->sackfreq = params.sack_freq;
2632 asoc->param_flags =
2633 (asoc->param_flags & ~SPP_SACKDELAY) |
2634 SPP_SACKDELAY_ENABLE;
2635 } else {
2636 sp->sackfreq = params.sack_freq;
2637 sp->param_flags =
2638 (sp->param_flags & ~SPP_SACKDELAY) |
2639 SPP_SACKDELAY_ENABLE;
2640 }
2641 }
2642
2643
2644 if (asoc) {
2645 list_for_each_entry(trans, &asoc->peer.transport_addr_list,
2646 transports) {
2647 if (params.sack_delay) {
2648 trans->sackdelay =
2649 msecs_to_jiffies(params.sack_delay);
2650 trans->param_flags =
2651 (trans->param_flags & ~SPP_SACKDELAY) |
2652 SPP_SACKDELAY_ENABLE;
2653 }
2654 if (params.sack_freq == 1) {
2655 trans->param_flags =
2656 (trans->param_flags & ~SPP_SACKDELAY) |
2657 SPP_SACKDELAY_DISABLE;
2658 } else if (params.sack_freq > 1) {
2659 trans->sackfreq = params.sack_freq;
2660 trans->param_flags =
2661 (trans->param_flags & ~SPP_SACKDELAY) |
2662 SPP_SACKDELAY_ENABLE;
2663 }
2664 }
2665 }
2666
2667 return 0;
2668}
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681static int sctp_setsockopt_initmsg(struct sock *sk, char __user *optval, unsigned int optlen)
2682{
2683 struct sctp_initmsg sinit;
2684 struct sctp_sock *sp = sctp_sk(sk);
2685
2686 if (optlen != sizeof(struct sctp_initmsg))
2687 return -EINVAL;
2688 if (copy_from_user(&sinit, optval, optlen))
2689 return -EFAULT;
2690
2691 if (sinit.sinit_num_ostreams)
2692 sp->initmsg.sinit_num_ostreams = sinit.sinit_num_ostreams;
2693 if (sinit.sinit_max_instreams)
2694 sp->initmsg.sinit_max_instreams = sinit.sinit_max_instreams;
2695 if (sinit.sinit_max_attempts)
2696 sp->initmsg.sinit_max_attempts = sinit.sinit_max_attempts;
2697 if (sinit.sinit_max_init_timeo)
2698 sp->initmsg.sinit_max_init_timeo = sinit.sinit_max_init_timeo;
2699
2700 return 0;
2701}
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717static int sctp_setsockopt_default_send_param(struct sock *sk,
2718 char __user *optval,
2719 unsigned int optlen)
2720{
2721 struct sctp_sndrcvinfo info;
2722 struct sctp_association *asoc;
2723 struct sctp_sock *sp = sctp_sk(sk);
2724
2725 if (optlen != sizeof(struct sctp_sndrcvinfo))
2726 return -EINVAL;
2727 if (copy_from_user(&info, optval, optlen))
2728 return -EFAULT;
2729
2730 asoc = sctp_id2assoc(sk, info.sinfo_assoc_id);
2731 if (!asoc && info.sinfo_assoc_id && sctp_style(sk, UDP))
2732 return -EINVAL;
2733
2734 if (asoc) {
2735 asoc->default_stream = info.sinfo_stream;
2736 asoc->default_flags = info.sinfo_flags;
2737 asoc->default_ppid = info.sinfo_ppid;
2738 asoc->default_context = info.sinfo_context;
2739 asoc->default_timetolive = info.sinfo_timetolive;
2740 } else {
2741 sp->default_stream = info.sinfo_stream;
2742 sp->default_flags = info.sinfo_flags;
2743 sp->default_ppid = info.sinfo_ppid;
2744 sp->default_context = info.sinfo_context;
2745 sp->default_timetolive = info.sinfo_timetolive;
2746 }
2747
2748 return 0;
2749}
2750
2751
2752
2753
2754
2755
2756
2757static int sctp_setsockopt_primary_addr(struct sock *sk, char __user *optval,
2758 unsigned int optlen)
2759{
2760 struct sctp_prim prim;
2761 struct sctp_transport *trans;
2762
2763 if (optlen != sizeof(struct sctp_prim))
2764 return -EINVAL;
2765
2766 if (copy_from_user(&prim, optval, sizeof(struct sctp_prim)))
2767 return -EFAULT;
2768
2769 trans = sctp_addr_id2transport(sk, &prim.ssp_addr, prim.ssp_assoc_id);
2770 if (!trans)
2771 return -EINVAL;
2772
2773 sctp_assoc_set_primary(trans->asoc, trans);
2774
2775 return 0;
2776}
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786static int sctp_setsockopt_nodelay(struct sock *sk, char __user *optval,
2787 unsigned int optlen)
2788{
2789 int val;
2790
2791 if (optlen < sizeof(int))
2792 return -EINVAL;
2793 if (get_user(val, (int __user *)optval))
2794 return -EFAULT;
2795
2796 sctp_sk(sk)->nodelay = (val == 0) ? 0 : 1;
2797 return 0;
2798}
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812static int sctp_setsockopt_rtoinfo(struct sock *sk, char __user *optval, unsigned int optlen)
2813{
2814 struct sctp_rtoinfo rtoinfo;
2815 struct sctp_association *asoc;
2816
2817 if (optlen != sizeof (struct sctp_rtoinfo))
2818 return -EINVAL;
2819
2820 if (copy_from_user(&rtoinfo, optval, optlen))
2821 return -EFAULT;
2822
2823 asoc = sctp_id2assoc(sk, rtoinfo.srto_assoc_id);
2824
2825
2826 if (!asoc && rtoinfo.srto_assoc_id && sctp_style(sk, UDP))
2827 return -EINVAL;
2828
2829 if (asoc) {
2830 if (rtoinfo.srto_initial != 0)
2831 asoc->rto_initial =
2832 msecs_to_jiffies(rtoinfo.srto_initial);
2833 if (rtoinfo.srto_max != 0)
2834 asoc->rto_max = msecs_to_jiffies(rtoinfo.srto_max);
2835 if (rtoinfo.srto_min != 0)
2836 asoc->rto_min = msecs_to_jiffies(rtoinfo.srto_min);
2837 } else {
2838
2839
2840
2841 struct sctp_sock *sp = sctp_sk(sk);
2842
2843 if (rtoinfo.srto_initial != 0)
2844 sp->rtoinfo.srto_initial = rtoinfo.srto_initial;
2845 if (rtoinfo.srto_max != 0)
2846 sp->rtoinfo.srto_max = rtoinfo.srto_max;
2847 if (rtoinfo.srto_min != 0)
2848 sp->rtoinfo.srto_min = rtoinfo.srto_min;
2849 }
2850
2851 return 0;
2852}
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865static int sctp_setsockopt_associnfo(struct sock *sk, char __user *optval, unsigned int optlen)
2866{
2867
2868 struct sctp_assocparams assocparams;
2869 struct sctp_association *asoc;
2870
2871 if (optlen != sizeof(struct sctp_assocparams))
2872 return -EINVAL;
2873 if (copy_from_user(&assocparams, optval, optlen))
2874 return -EFAULT;
2875
2876 asoc = sctp_id2assoc(sk, assocparams.sasoc_assoc_id);
2877
2878 if (!asoc && assocparams.sasoc_assoc_id && sctp_style(sk, UDP))
2879 return -EINVAL;
2880
2881
2882 if (asoc) {
2883 if (assocparams.sasoc_asocmaxrxt != 0) {
2884 __u32 path_sum = 0;
2885 int paths = 0;
2886 struct sctp_transport *peer_addr;
2887
2888 list_for_each_entry(peer_addr, &asoc->peer.transport_addr_list,
2889 transports) {
2890 path_sum += peer_addr->pathmaxrxt;
2891 paths++;
2892 }
2893
2894
2895
2896
2897
2898
2899 if (paths > 1 &&
2900 assocparams.sasoc_asocmaxrxt > path_sum)
2901 return -EINVAL;
2902
2903 asoc->max_retrans = assocparams.sasoc_asocmaxrxt;
2904 }
2905
2906 if (assocparams.sasoc_cookie_life != 0) {
2907 asoc->cookie_life.tv_sec =
2908 assocparams.sasoc_cookie_life / 1000;
2909 asoc->cookie_life.tv_usec =
2910 (assocparams.sasoc_cookie_life % 1000)
2911 * 1000;
2912 }
2913 } else {
2914
2915 struct sctp_sock *sp = sctp_sk(sk);
2916
2917 if (assocparams.sasoc_asocmaxrxt != 0)
2918 sp->assocparams.sasoc_asocmaxrxt =
2919 assocparams.sasoc_asocmaxrxt;
2920 if (assocparams.sasoc_cookie_life != 0)
2921 sp->assocparams.sasoc_cookie_life =
2922 assocparams.sasoc_cookie_life;
2923 }
2924 return 0;
2925}
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937static int sctp_setsockopt_mappedv4(struct sock *sk, char __user *optval, unsigned int optlen)
2938{
2939 int val;
2940 struct sctp_sock *sp = sctp_sk(sk);
2941
2942 if (optlen < sizeof(int))
2943 return -EINVAL;
2944 if (get_user(val, (int __user *)optval))
2945 return -EFAULT;
2946 if (val)
2947 sp->v4mapped = 1;
2948 else
2949 sp->v4mapped = 0;
2950
2951 return 0;
2952}
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981static int sctp_setsockopt_maxseg(struct sock *sk, char __user *optval, unsigned int optlen)
2982{
2983 struct sctp_assoc_value params;
2984 struct sctp_association *asoc;
2985 struct sctp_sock *sp = sctp_sk(sk);
2986 int val;
2987
2988 if (optlen == sizeof(int)) {
2989 pr_warn("Use of int in maxseg socket option deprecated\n");
2990 pr_warn("Use struct sctp_assoc_value instead\n");
2991 if (copy_from_user(&val, optval, optlen))
2992 return -EFAULT;
2993 params.assoc_id = 0;
2994 } else if (optlen == sizeof(struct sctp_assoc_value)) {
2995 if (copy_from_user(¶ms, optval, optlen))
2996 return -EFAULT;
2997 val = params.assoc_value;
2998 } else
2999 return -EINVAL;
3000
3001 if ((val != 0) && ((val < 8) || (val > SCTP_MAX_CHUNK_LEN)))
3002 return -EINVAL;
3003
3004 asoc = sctp_id2assoc(sk, params.assoc_id);
3005 if (!asoc && params.assoc_id && sctp_style(sk, UDP))
3006 return -EINVAL;
3007
3008 if (asoc) {
3009 if (val == 0) {
3010 val = asoc->pathmtu;
3011 val -= sp->pf->af->net_header_len;
3012 val -= sizeof(struct sctphdr) +
3013 sizeof(struct sctp_data_chunk);
3014 }
3015 asoc->user_frag = val;
3016 asoc->frag_point = sctp_frag_point(asoc, asoc->pathmtu);
3017 } else {
3018 sp->user_frag = val;
3019 }
3020
3021 return 0;
3022}
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033static int sctp_setsockopt_peer_primary_addr(struct sock *sk, char __user *optval,
3034 unsigned int optlen)
3035{
3036 struct sctp_sock *sp;
3037 struct sctp_association *asoc = NULL;
3038 struct sctp_setpeerprim prim;
3039 struct sctp_chunk *chunk;
3040 struct sctp_af *af;
3041 int err;
3042
3043 sp = sctp_sk(sk);
3044
3045 if (!sctp_addip_enable)
3046 return -EPERM;
3047
3048 if (optlen != sizeof(struct sctp_setpeerprim))
3049 return -EINVAL;
3050
3051 if (copy_from_user(&prim, optval, optlen))
3052 return -EFAULT;
3053
3054 asoc = sctp_id2assoc(sk, prim.sspp_assoc_id);
3055 if (!asoc)
3056 return -EINVAL;
3057
3058 if (!asoc->peer.asconf_capable)
3059 return -EPERM;
3060
3061 if (asoc->peer.addip_disabled_mask & SCTP_PARAM_SET_PRIMARY)
3062 return -EPERM;
3063
3064 if (!sctp_state(asoc, ESTABLISHED))
3065 return -ENOTCONN;
3066
3067 af = sctp_get_af_specific(prim.sspp_addr.ss_family);
3068 if (!af)
3069 return -EINVAL;
3070
3071 if (!af->addr_valid((union sctp_addr *)&prim.sspp_addr, sp, NULL))
3072 return -EADDRNOTAVAIL;
3073
3074 if (!sctp_assoc_lookup_laddr(asoc, (union sctp_addr *)&prim.sspp_addr))
3075 return -EADDRNOTAVAIL;
3076
3077
3078 chunk = sctp_make_asconf_set_prim(asoc,
3079 (union sctp_addr *)&prim.sspp_addr);
3080 if (!chunk)
3081 return -ENOMEM;
3082
3083 err = sctp_send_asconf(asoc, chunk);
3084
3085 SCTP_DEBUG_PRINTK("We set peer primary addr primitively.\n");
3086
3087 return err;
3088}
3089
3090static int sctp_setsockopt_adaptation_layer(struct sock *sk, char __user *optval,
3091 unsigned int optlen)
3092{
3093 struct sctp_setadaptation adaptation;
3094
3095 if (optlen != sizeof(struct sctp_setadaptation))
3096 return -EINVAL;
3097 if (copy_from_user(&adaptation, optval, optlen))
3098 return -EFAULT;
3099
3100 sctp_sk(sk)->adaptation_ind = adaptation.ssb_adaptation_ind;
3101
3102 return 0;
3103}
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119static int sctp_setsockopt_context(struct sock *sk, char __user *optval,
3120 unsigned int optlen)
3121{
3122 struct sctp_assoc_value params;
3123 struct sctp_sock *sp;
3124 struct sctp_association *asoc;
3125
3126 if (optlen != sizeof(struct sctp_assoc_value))
3127 return -EINVAL;
3128 if (copy_from_user(¶ms, optval, optlen))
3129 return -EFAULT;
3130
3131 sp = sctp_sk(sk);
3132
3133 if (params.assoc_id != 0) {
3134 asoc = sctp_id2assoc(sk, params.assoc_id);
3135 if (!asoc)
3136 return -EINVAL;
3137 asoc->default_rcv_context = params.assoc_value;
3138 } else {
3139 sp->default_rcv_context = params.assoc_value;
3140 }
3141
3142 return 0;
3143}
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169static int sctp_setsockopt_fragment_interleave(struct sock *sk,
3170 char __user *optval,
3171 unsigned int optlen)
3172{
3173 int val;
3174
3175 if (optlen != sizeof(int))
3176 return -EINVAL;
3177 if (get_user(val, (int __user *)optval))
3178 return -EFAULT;
3179
3180 sctp_sk(sk)->frag_interleave = (val == 0) ? 0 : 1;
3181
3182 return 0;
3183}
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202static int sctp_setsockopt_partial_delivery_point(struct sock *sk,
3203 char __user *optval,
3204 unsigned int optlen)
3205{
3206 u32 val;
3207
3208 if (optlen != sizeof(u32))
3209 return -EINVAL;
3210 if (get_user(val, (int __user *)optval))
3211 return -EFAULT;
3212
3213
3214
3215
3216 if (val > (sk->sk_rcvbuf >> 1))
3217 return -EINVAL;
3218
3219 sctp_sk(sk)->pd_point = val;
3220
3221 return 0;
3222}
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235static int sctp_setsockopt_maxburst(struct sock *sk,
3236 char __user *optval,
3237 unsigned int optlen)
3238{
3239 struct sctp_assoc_value params;
3240 struct sctp_sock *sp;
3241 struct sctp_association *asoc;
3242 int val;
3243 int assoc_id = 0;
3244
3245 if (optlen == sizeof(int)) {
3246 pr_warn("Use of int in max_burst socket option deprecated\n");
3247 pr_warn("Use struct sctp_assoc_value instead\n");
3248 if (copy_from_user(&val, optval, optlen))
3249 return -EFAULT;
3250 } else if (optlen == sizeof(struct sctp_assoc_value)) {
3251 if (copy_from_user(¶ms, optval, optlen))
3252 return -EFAULT;
3253 val = params.assoc_value;
3254 assoc_id = params.assoc_id;
3255 } else
3256 return -EINVAL;
3257
3258 sp = sctp_sk(sk);
3259
3260 if (assoc_id != 0) {
3261 asoc = sctp_id2assoc(sk, assoc_id);
3262 if (!asoc)
3263 return -EINVAL;
3264 asoc->max_burst = val;
3265 } else
3266 sp->max_burst = val;
3267
3268 return 0;
3269}
3270
3271
3272
3273
3274
3275
3276
3277
3278static int sctp_setsockopt_auth_chunk(struct sock *sk,
3279 char __user *optval,
3280 unsigned int optlen)
3281{
3282 struct sctp_authchunk val;
3283
3284 if (!sctp_auth_enable)
3285 return -EACCES;
3286
3287 if (optlen != sizeof(struct sctp_authchunk))
3288 return -EINVAL;
3289 if (copy_from_user(&val, optval, optlen))
3290 return -EFAULT;
3291
3292 switch (val.sauth_chunk) {
3293 case SCTP_CID_INIT:
3294 case SCTP_CID_INIT_ACK:
3295 case SCTP_CID_SHUTDOWN_COMPLETE:
3296 case SCTP_CID_AUTH:
3297 return -EINVAL;
3298 }
3299
3300
3301 return sctp_auth_ep_add_chunkid(sctp_sk(sk)->ep, val.sauth_chunk);
3302}
3303
3304
3305
3306
3307
3308
3309
3310static int sctp_setsockopt_hmac_ident(struct sock *sk,
3311 char __user *optval,
3312 unsigned int optlen)
3313{
3314 struct sctp_hmacalgo *hmacs;
3315 u32 idents;
3316 int err;
3317
3318 if (!sctp_auth_enable)
3319 return -EACCES;
3320
3321 if (optlen < sizeof(struct sctp_hmacalgo))
3322 return -EINVAL;
3323
3324 hmacs= memdup_user(optval, optlen);
3325 if (IS_ERR(hmacs))
3326 return PTR_ERR(hmacs);
3327
3328 idents = hmacs->shmac_num_idents;
3329 if (idents == 0 || idents > SCTP_AUTH_NUM_HMACS ||
3330 (idents * sizeof(u16)) > (optlen - sizeof(struct sctp_hmacalgo))) {
3331 err = -EINVAL;
3332 goto out;
3333 }
3334
3335 err = sctp_auth_ep_set_hmacs(sctp_sk(sk)->ep, hmacs);
3336out:
3337 kfree(hmacs);
3338 return err;
3339}
3340
3341
3342
3343
3344
3345
3346
3347static int sctp_setsockopt_auth_key(struct sock *sk,
3348 char __user *optval,
3349 unsigned int optlen)
3350{
3351 struct sctp_authkey *authkey;
3352 struct sctp_association *asoc;
3353 int ret;
3354
3355 if (!sctp_auth_enable)
3356 return -EACCES;
3357
3358 if (optlen <= sizeof(struct sctp_authkey))
3359 return -EINVAL;
3360
3361 authkey= memdup_user(optval, optlen);
3362 if (IS_ERR(authkey))
3363 return PTR_ERR(authkey);
3364
3365 if (authkey->sca_keylength > optlen - sizeof(struct sctp_authkey)) {
3366 ret = -EINVAL;
3367 goto out;
3368 }
3369
3370 asoc = sctp_id2assoc(sk, authkey->sca_assoc_id);
3371 if (!asoc && authkey->sca_assoc_id && sctp_style(sk, UDP)) {
3372 ret = -EINVAL;
3373 goto out;
3374 }
3375
3376 ret = sctp_auth_set_key(sctp_sk(sk)->ep, asoc, authkey);
3377out:
3378 kfree(authkey);
3379 return ret;
3380}
3381
3382
3383
3384
3385
3386
3387
3388static int sctp_setsockopt_active_key(struct sock *sk,
3389 char __user *optval,
3390 unsigned int optlen)
3391{
3392 struct sctp_authkeyid val;
3393 struct sctp_association *asoc;
3394
3395 if (!sctp_auth_enable)
3396 return -EACCES;
3397
3398 if (optlen != sizeof(struct sctp_authkeyid))
3399 return -EINVAL;
3400 if (copy_from_user(&val, optval, optlen))
3401 return -EFAULT;
3402
3403 asoc = sctp_id2assoc(sk, val.scact_assoc_id);
3404 if (!asoc && val.scact_assoc_id && sctp_style(sk, UDP))
3405 return -EINVAL;
3406
3407 return sctp_auth_set_active_key(sctp_sk(sk)->ep, asoc,
3408 val.scact_keynumber);
3409}
3410
3411
3412
3413
3414
3415
3416static int sctp_setsockopt_del_key(struct sock *sk,
3417 char __user *optval,
3418 unsigned int optlen)
3419{
3420 struct sctp_authkeyid val;
3421 struct sctp_association *asoc;
3422
3423 if (!sctp_auth_enable)
3424 return -EACCES;
3425
3426 if (optlen != sizeof(struct sctp_authkeyid))
3427 return -EINVAL;
3428 if (copy_from_user(&val, optval, optlen))
3429 return -EFAULT;
3430
3431 asoc = sctp_id2assoc(sk, val.scact_assoc_id);
3432 if (!asoc && val.scact_assoc_id && sctp_style(sk, UDP))
3433 return -EINVAL;
3434
3435 return sctp_auth_del_key_id(sctp_sk(sk)->ep, asoc,
3436 val.scact_keynumber);
3437
3438}
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454static int sctp_setsockopt_auto_asconf(struct sock *sk, char __user *optval,
3455 unsigned int optlen)
3456{
3457 int val;
3458 struct sctp_sock *sp = sctp_sk(sk);
3459
3460 if (optlen < sizeof(int))
3461 return -EINVAL;
3462 if (get_user(val, (int __user *)optval))
3463 return -EFAULT;
3464 if (!sctp_is_ep_boundall(sk) && val)
3465 return -EINVAL;
3466 if ((val && sp->do_auto_asconf) || (!val && !sp->do_auto_asconf))
3467 return 0;
3468
3469 if (val == 0 && sp->do_auto_asconf) {
3470 list_del(&sp->auto_asconf_list);
3471 sp->do_auto_asconf = 0;
3472 } else if (val && !sp->do_auto_asconf) {
3473 list_add_tail(&sp->auto_asconf_list,
3474 &sctp_auto_asconf_splist);
3475 sp->do_auto_asconf = 1;
3476 }
3477 return 0;
3478}
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488static int sctp_setsockopt_paddr_thresholds(struct sock *sk,
3489 char __user *optval,
3490 unsigned int optlen)
3491{
3492 struct sctp_paddrthlds val;
3493 struct sctp_transport *trans;
3494 struct sctp_association *asoc;
3495
3496 if (optlen < sizeof(struct sctp_paddrthlds))
3497 return -EINVAL;
3498 if (copy_from_user(&val, (struct sctp_paddrthlds __user *)optval,
3499 sizeof(struct sctp_paddrthlds)))
3500 return -EFAULT;
3501
3502
3503 if (sctp_is_any(sk, (const union sctp_addr *)&val.spt_address)) {
3504 asoc = sctp_id2assoc(sk, val.spt_assoc_id);
3505 if (!asoc)
3506 return -ENOENT;
3507 list_for_each_entry(trans, &asoc->peer.transport_addr_list,
3508 transports) {
3509 if (val.spt_pathmaxrxt)
3510 trans->pathmaxrxt = val.spt_pathmaxrxt;
3511 trans->pf_retrans = val.spt_pathpfthld;
3512 }
3513
3514 if (val.spt_pathmaxrxt)
3515 asoc->pathmaxrxt = val.spt_pathmaxrxt;
3516 asoc->pf_retrans = val.spt_pathpfthld;
3517 } else {
3518 trans = sctp_addr_id2transport(sk, &val.spt_address,
3519 val.spt_assoc_id);
3520 if (!trans)
3521 return -ENOENT;
3522
3523 if (val.spt_pathmaxrxt)
3524 trans->pathmaxrxt = val.spt_pathmaxrxt;
3525 trans->pf_retrans = val.spt_pathpfthld;
3526 }
3527
3528 return 0;
3529}
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550SCTP_STATIC int sctp_setsockopt(struct sock *sk, int level, int optname,
3551 char __user *optval, unsigned int optlen)
3552{
3553 int retval = 0;
3554
3555 SCTP_DEBUG_PRINTK("sctp_setsockopt(sk: %p... optname: %d)\n",
3556 sk, optname);
3557
3558
3559
3560
3561
3562
3563
3564 if (level != SOL_SCTP) {
3565 struct sctp_af *af = sctp_sk(sk)->pf->af;
3566 retval = af->setsockopt(sk, level, optname, optval, optlen);
3567 goto out_nounlock;
3568 }
3569
3570 sctp_lock_sock(sk);
3571
3572 switch (optname) {
3573 case SCTP_SOCKOPT_BINDX_ADD:
3574
3575 retval = sctp_setsockopt_bindx(sk, (struct sockaddr __user *)optval,
3576 optlen, SCTP_BINDX_ADD_ADDR);
3577 break;
3578
3579 case SCTP_SOCKOPT_BINDX_REM:
3580
3581 retval = sctp_setsockopt_bindx(sk, (struct sockaddr __user *)optval,
3582 optlen, SCTP_BINDX_REM_ADDR);
3583 break;
3584
3585 case SCTP_SOCKOPT_CONNECTX_OLD:
3586
3587 retval = sctp_setsockopt_connectx_old(sk,
3588 (struct sockaddr __user *)optval,
3589 optlen);
3590 break;
3591
3592 case SCTP_SOCKOPT_CONNECTX:
3593
3594 retval = sctp_setsockopt_connectx(sk,
3595 (struct sockaddr __user *)optval,
3596 optlen);
3597 break;
3598
3599 case SCTP_DISABLE_FRAGMENTS:
3600 retval = sctp_setsockopt_disable_fragments(sk, optval, optlen);
3601 break;
3602
3603 case SCTP_EVENTS:
3604 retval = sctp_setsockopt_events(sk, optval, optlen);
3605 break;
3606
3607 case SCTP_AUTOCLOSE:
3608 retval = sctp_setsockopt_autoclose(sk, optval, optlen);
3609 break;
3610
3611 case SCTP_PEER_ADDR_PARAMS:
3612 retval = sctp_setsockopt_peer_addr_params(sk, optval, optlen);
3613 break;
3614
3615 case SCTP_DELAYED_SACK:
3616 retval = sctp_setsockopt_delayed_ack(sk, optval, optlen);
3617 break;
3618 case SCTP_PARTIAL_DELIVERY_POINT:
3619 retval = sctp_setsockopt_partial_delivery_point(sk, optval, optlen);
3620 break;
3621
3622 case SCTP_INITMSG:
3623 retval = sctp_setsockopt_initmsg(sk, optval, optlen);
3624 break;
3625 case SCTP_DEFAULT_SEND_PARAM:
3626 retval = sctp_setsockopt_default_send_param(sk, optval,
3627 optlen);
3628 break;
3629 case SCTP_PRIMARY_ADDR:
3630 retval = sctp_setsockopt_primary_addr(sk, optval, optlen);
3631 break;
3632 case SCTP_SET_PEER_PRIMARY_ADDR:
3633 retval = sctp_setsockopt_peer_primary_addr(sk, optval, optlen);
3634 break;
3635 case SCTP_NODELAY:
3636 retval = sctp_setsockopt_nodelay(sk, optval, optlen);
3637 break;
3638 case SCTP_RTOINFO:
3639 retval = sctp_setsockopt_rtoinfo(sk, optval, optlen);
3640 break;
3641 case SCTP_ASSOCINFO:
3642 retval = sctp_setsockopt_associnfo(sk, optval, optlen);
3643 break;
3644 case SCTP_I_WANT_MAPPED_V4_ADDR:
3645 retval = sctp_setsockopt_mappedv4(sk, optval, optlen);
3646 break;
3647 case SCTP_MAXSEG:
3648 retval = sctp_setsockopt_maxseg(sk, optval, optlen);
3649 break;
3650 case SCTP_ADAPTATION_LAYER:
3651 retval = sctp_setsockopt_adaptation_layer(sk, optval, optlen);
3652 break;
3653 case SCTP_CONTEXT:
3654 retval = sctp_setsockopt_context(sk, optval, optlen);
3655 break;
3656 case SCTP_FRAGMENT_INTERLEAVE:
3657 retval = sctp_setsockopt_fragment_interleave(sk, optval, optlen);
3658 break;
3659 case SCTP_MAX_BURST:
3660 retval = sctp_setsockopt_maxburst(sk, optval, optlen);
3661 break;
3662 case SCTP_AUTH_CHUNK:
3663 retval = sctp_setsockopt_auth_chunk(sk, optval, optlen);
3664 break;
3665 case SCTP_HMAC_IDENT:
3666 retval = sctp_setsockopt_hmac_ident(sk, optval, optlen);
3667 break;
3668 case SCTP_AUTH_KEY:
3669 retval = sctp_setsockopt_auth_key(sk, optval, optlen);
3670 break;
3671 case SCTP_AUTH_ACTIVE_KEY:
3672 retval = sctp_setsockopt_active_key(sk, optval, optlen);
3673 break;
3674 case SCTP_AUTH_DELETE_KEY:
3675 retval = sctp_setsockopt_del_key(sk, optval, optlen);
3676 break;
3677 case SCTP_AUTO_ASCONF:
3678 retval = sctp_setsockopt_auto_asconf(sk, optval, optlen);
3679 break;
3680 case SCTP_PEER_ADDR_THLDS:
3681 retval = sctp_setsockopt_paddr_thresholds(sk, optval, optlen);
3682 break;
3683 default:
3684 retval = -ENOPROTOOPT;
3685 break;
3686 }
3687
3688 sctp_release_sock(sk);
3689
3690out_nounlock:
3691 return retval;
3692}
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710SCTP_STATIC int sctp_connect(struct sock *sk, struct sockaddr *addr,
3711 int addr_len)
3712{
3713 int err = 0;
3714 struct sctp_af *af;
3715
3716 sctp_lock_sock(sk);
3717
3718 SCTP_DEBUG_PRINTK("%s - sk: %p, sockaddr: %p, addr_len: %d\n",
3719 __func__, sk, addr, addr_len);
3720
3721
3722 af = sctp_get_af_specific(addr->sa_family);
3723 if (!af || addr_len < af->sockaddr_len) {
3724 err = -EINVAL;
3725 } else {
3726
3727
3728
3729 err = __sctp_connect(sk, addr, af->sockaddr_len, NULL);
3730 }
3731
3732 sctp_release_sock(sk);
3733 return err;
3734}
3735
3736
3737SCTP_STATIC int sctp_disconnect(struct sock *sk, int flags)
3738{
3739 return -EOPNOTSUPP;
3740}
3741
3742
3743
3744
3745
3746
3747
3748
3749SCTP_STATIC struct sock *sctp_accept(struct sock *sk, int flags, int *err)
3750{
3751 struct sctp_sock *sp;
3752 struct sctp_endpoint *ep;
3753 struct sock *newsk = NULL;
3754 struct sctp_association *asoc;
3755 long timeo;
3756 int error = 0;
3757
3758 sctp_lock_sock(sk);
3759
3760 sp = sctp_sk(sk);
3761 ep = sp->ep;
3762
3763 if (!sctp_style(sk, TCP)) {
3764 error = -EOPNOTSUPP;
3765 goto out;
3766 }
3767
3768 if (!sctp_sstate(sk, LISTENING)) {
3769 error = -EINVAL;
3770 goto out;
3771 }
3772
3773 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
3774
3775 error = sctp_wait_for_accept(sk, timeo);
3776 if (error)
3777 goto out;
3778
3779
3780
3781
3782 asoc = list_entry(ep->asocs.next, struct sctp_association, asocs);
3783
3784 newsk = sp->pf->create_accept_sk(sk, asoc);
3785 if (!newsk) {
3786 error = -ENOMEM;
3787 goto out;
3788 }
3789
3790
3791
3792
3793 sctp_sock_migrate(sk, newsk, asoc, SCTP_SOCKET_TCP);
3794
3795out:
3796 sctp_release_sock(sk);
3797 *err = error;
3798 return newsk;
3799}
3800
3801
3802SCTP_STATIC int sctp_ioctl(struct sock *sk, int cmd, unsigned long arg)
3803{
3804 int rc = -ENOTCONN;
3805
3806 sctp_lock_sock(sk);
3807
3808
3809
3810
3811
3812 if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING))
3813 goto out;
3814
3815 switch (cmd) {
3816 case SIOCINQ: {
3817 struct sk_buff *skb;
3818 unsigned int amount = 0;
3819
3820 skb = skb_peek(&sk->sk_receive_queue);
3821 if (skb != NULL) {
3822
3823
3824
3825
3826 amount = skb->len;
3827 }
3828 rc = put_user(amount, (int __user *)arg);
3829 break;
3830 }
3831 default:
3832 rc = -ENOIOCTLCMD;
3833 break;
3834 }
3835out:
3836 sctp_release_sock(sk);
3837 return rc;
3838}
3839
3840
3841
3842
3843
3844SCTP_STATIC int sctp_init_sock(struct sock *sk)
3845{
3846 struct sctp_endpoint *ep;
3847 struct sctp_sock *sp;
3848
3849 SCTP_DEBUG_PRINTK("sctp_init_sock(sk: %p)\n", sk);
3850
3851 sp = sctp_sk(sk);
3852
3853
3854 switch (sk->sk_type) {
3855 case SOCK_SEQPACKET:
3856 sp->type = SCTP_SOCKET_UDP;
3857 break;
3858 case SOCK_STREAM:
3859 sp->type = SCTP_SOCKET_TCP;
3860 break;
3861 default:
3862 return -ESOCKTNOSUPPORT;
3863 }
3864
3865
3866
3867
3868 sp->default_stream = 0;
3869 sp->default_ppid = 0;
3870 sp->default_flags = 0;
3871 sp->default_context = 0;
3872 sp->default_timetolive = 0;
3873
3874 sp->default_rcv_context = 0;
3875 sp->max_burst = sctp_max_burst;
3876
3877
3878
3879
3880
3881 sp->initmsg.sinit_num_ostreams = sctp_max_outstreams;
3882 sp->initmsg.sinit_max_instreams = sctp_max_instreams;
3883 sp->initmsg.sinit_max_attempts = sctp_max_retrans_init;
3884 sp->initmsg.sinit_max_init_timeo = sctp_rto_max;
3885
3886
3887
3888
3889 sp->rtoinfo.srto_initial = sctp_rto_initial;
3890 sp->rtoinfo.srto_max = sctp_rto_max;
3891 sp->rtoinfo.srto_min = sctp_rto_min;
3892
3893
3894
3895
3896 sp->assocparams.sasoc_asocmaxrxt = sctp_max_retrans_association;
3897 sp->assocparams.sasoc_number_peer_destinations = 0;
3898 sp->assocparams.sasoc_peer_rwnd = 0;
3899 sp->assocparams.sasoc_local_rwnd = 0;
3900 sp->assocparams.sasoc_cookie_life = sctp_valid_cookie_life;
3901
3902
3903
3904
3905 memset(&sp->subscribe, 0, sizeof(struct sctp_event_subscribe));
3906
3907
3908
3909
3910 sp->hbinterval = sctp_hb_interval;
3911 sp->pathmaxrxt = sctp_max_retrans_path;
3912 sp->pathmtu = 0;
3913 sp->sackdelay = sctp_sack_timeout;
3914 sp->sackfreq = 2;
3915 sp->param_flags = SPP_HB_ENABLE |
3916 SPP_PMTUD_ENABLE |
3917 SPP_SACKDELAY_ENABLE;
3918
3919
3920
3921
3922 sp->disable_fragments = 0;
3923
3924
3925 sp->nodelay = 0;
3926
3927
3928 sp->v4mapped = 1;
3929
3930
3931
3932
3933
3934
3935 sp->autoclose = 0;
3936
3937
3938 sp->user_frag = 0;
3939
3940 sp->adaptation_ind = 0;
3941
3942 sp->pf = sctp_get_pf_specific(sk->sk_family);
3943
3944
3945 atomic_set(&sp->pd_mode, 0);
3946 skb_queue_head_init(&sp->pd_lobby);
3947 sp->frag_interleave = 0;
3948
3949
3950
3951
3952
3953 ep = sctp_endpoint_new(sk, GFP_KERNEL);
3954 if (!ep)
3955 return -ENOMEM;
3956
3957 sp->ep = ep;
3958 sp->hmac = NULL;
3959
3960 SCTP_DBG_OBJCNT_INC(sock);
3961
3962 local_bh_disable();
3963 percpu_counter_inc(&sctp_sockets_allocated);
3964 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
3965 if (sctp_default_auto_asconf) {
3966 list_add_tail(&sp->auto_asconf_list,
3967 &sctp_auto_asconf_splist);
3968 sp->do_auto_asconf = 1;
3969 } else
3970 sp->do_auto_asconf = 0;
3971 local_bh_enable();
3972
3973 return 0;
3974}
3975
3976
3977SCTP_STATIC void sctp_destroy_sock(struct sock *sk)
3978{
3979 struct sctp_sock *sp;
3980
3981 SCTP_DEBUG_PRINTK("sctp_destroy_sock(sk: %p)\n", sk);
3982
3983
3984 sp = sctp_sk(sk);
3985 if (sp->do_auto_asconf) {
3986 sp->do_auto_asconf = 0;
3987 list_del(&sp->auto_asconf_list);
3988 }
3989 sctp_endpoint_free(sp->ep);
3990 local_bh_disable();
3991 percpu_counter_dec(&sctp_sockets_allocated);
3992 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
3993 local_bh_enable();
3994}
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012SCTP_STATIC void sctp_shutdown(struct sock *sk, int how)
4013{
4014 struct sctp_endpoint *ep;
4015 struct sctp_association *asoc;
4016
4017 if (!sctp_style(sk, TCP))
4018 return;
4019
4020 if (how & SEND_SHUTDOWN) {
4021 ep = sctp_sk(sk)->ep;
4022 if (!list_empty(&ep->asocs)) {
4023 asoc = list_entry(ep->asocs.next,
4024 struct sctp_association, asocs);
4025 sctp_primitive_SHUTDOWN(asoc, NULL);
4026 }
4027 }
4028}
4029
4030
4031
4032
4033
4034
4035
4036
4037static int sctp_getsockopt_sctp_status(struct sock *sk, int len,
4038 char __user *optval,
4039 int __user *optlen)
4040{
4041 struct sctp_status status;
4042 struct sctp_association *asoc = NULL;
4043 struct sctp_transport *transport;
4044 sctp_assoc_t associd;
4045 int retval = 0;
4046
4047 if (len < sizeof(status)) {
4048 retval = -EINVAL;
4049 goto out;
4050 }
4051
4052 len = sizeof(status);
4053 if (copy_from_user(&status, optval, len)) {
4054 retval = -EFAULT;
4055 goto out;
4056 }
4057
4058 associd = status.sstat_assoc_id;
4059 asoc = sctp_id2assoc(sk, associd);
4060 if (!asoc) {
4061 retval = -EINVAL;
4062 goto out;
4063 }
4064
4065 transport = asoc->peer.primary_path;
4066
4067 status.sstat_assoc_id = sctp_assoc2id(asoc);
4068 status.sstat_state = asoc->state;
4069 status.sstat_rwnd = asoc->peer.rwnd;
4070 status.sstat_unackdata = asoc->unack_data;
4071
4072 status.sstat_penddata = sctp_tsnmap_pending(&asoc->peer.tsn_map);
4073 status.sstat_instrms = asoc->c.sinit_max_instreams;
4074 status.sstat_outstrms = asoc->c.sinit_num_ostreams;
4075 status.sstat_fragmentation_point = asoc->frag_point;
4076 status.sstat_primary.spinfo_assoc_id = sctp_assoc2id(transport->asoc);
4077 memcpy(&status.sstat_primary.spinfo_address, &transport->ipaddr,
4078 transport->af_specific->sockaddr_len);
4079
4080 sctp_get_pf_specific(sk->sk_family)->addr_v4map(sctp_sk(sk),
4081 (union sctp_addr *)&status.sstat_primary.spinfo_address);
4082 status.sstat_primary.spinfo_state = transport->state;
4083 status.sstat_primary.spinfo_cwnd = transport->cwnd;
4084 status.sstat_primary.spinfo_srtt = transport->srtt;
4085 status.sstat_primary.spinfo_rto = jiffies_to_msecs(transport->rto);
4086 status.sstat_primary.spinfo_mtu = transport->pathmtu;
4087
4088 if (status.sstat_primary.spinfo_state == SCTP_UNKNOWN)
4089 status.sstat_primary.spinfo_state = SCTP_ACTIVE;
4090
4091 if (put_user(len, optlen)) {
4092 retval = -EFAULT;
4093 goto out;
4094 }
4095
4096 SCTP_DEBUG_PRINTK("sctp_getsockopt_sctp_status(%d): %d %d %d\n",
4097 len, status.sstat_state, status.sstat_rwnd,
4098 status.sstat_assoc_id);
4099
4100 if (copy_to_user(optval, &status, len)) {
4101 retval = -EFAULT;
4102 goto out;
4103 }
4104
4105out:
4106 return retval;
4107}
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117static int sctp_getsockopt_peer_addr_info(struct sock *sk, int len,
4118 char __user *optval,
4119 int __user *optlen)
4120{
4121 struct sctp_paddrinfo pinfo;
4122 struct sctp_transport *transport;
4123 int retval = 0;
4124
4125 if (len < sizeof(pinfo)) {
4126 retval = -EINVAL;
4127 goto out;
4128 }
4129
4130 len = sizeof(pinfo);
4131 if (copy_from_user(&pinfo, optval, len)) {
4132 retval = -EFAULT;
4133 goto out;
4134 }
4135
4136 transport = sctp_addr_id2transport(sk, &pinfo.spinfo_address,
4137 pinfo.spinfo_assoc_id);
4138 if (!transport)
4139 return -EINVAL;
4140
4141 pinfo.spinfo_assoc_id = sctp_assoc2id(transport->asoc);
4142 pinfo.spinfo_state = transport->state;
4143 pinfo.spinfo_cwnd = transport->cwnd;
4144 pinfo.spinfo_srtt = transport->srtt;
4145 pinfo.spinfo_rto = jiffies_to_msecs(transport->rto);
4146 pinfo.spinfo_mtu = transport->pathmtu;
4147
4148 if (pinfo.spinfo_state == SCTP_UNKNOWN)
4149 pinfo.spinfo_state = SCTP_ACTIVE;
4150
4151 if (put_user(len, optlen)) {
4152 retval = -EFAULT;
4153 goto out;
4154 }
4155
4156 if (copy_to_user(optval, &pinfo, len)) {
4157 retval = -EFAULT;
4158 goto out;
4159 }
4160
4161out:
4162 return retval;
4163}
4164
4165
4166
4167
4168
4169
4170
4171
4172static int sctp_getsockopt_disable_fragments(struct sock *sk, int len,
4173 char __user *optval, int __user *optlen)
4174{
4175 int val;
4176
4177 if (len < sizeof(int))
4178 return -EINVAL;
4179
4180 len = sizeof(int);
4181 val = (sctp_sk(sk)->disable_fragments == 1);
4182 if (put_user(len, optlen))
4183 return -EFAULT;
4184 if (copy_to_user(optval, &val, len))
4185 return -EFAULT;
4186 return 0;
4187}
4188
4189
4190
4191
4192
4193
4194static int sctp_getsockopt_events(struct sock *sk, int len, char __user *optval,
4195 int __user *optlen)
4196{
4197 if (len <= 0)
4198 return -EINVAL;
4199 if (len > sizeof(struct sctp_event_subscribe))
4200 len = sizeof(struct sctp_event_subscribe);
4201 if (put_user(len, optlen))
4202 return -EFAULT;
4203 if (copy_to_user(optval, &sctp_sk(sk)->subscribe, len))
4204 return -EFAULT;
4205 return 0;
4206}
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219static int sctp_getsockopt_autoclose(struct sock *sk, int len, char __user *optval, int __user *optlen)
4220{
4221
4222 if (sctp_style(sk, TCP))
4223 return -EOPNOTSUPP;
4224 if (len < sizeof(int))
4225 return -EINVAL;
4226 len = sizeof(int);
4227 if (put_user(len, optlen))
4228 return -EFAULT;
4229 if (copy_to_user(optval, &sctp_sk(sk)->autoclose, sizeof(int)))
4230 return -EFAULT;
4231 return 0;
4232}
4233
4234
4235int sctp_do_peeloff(struct sock *sk, sctp_assoc_t id, struct socket **sockp)
4236{
4237 struct sctp_association *asoc = sctp_id2assoc(sk, id);
4238 struct socket *sock;
4239 struct sctp_af *af;
4240 int err = 0;
4241
4242 if (!asoc)
4243 return -EINVAL;
4244
4245
4246
4247
4248 if (!sctp_style(sk, UDP))
4249 return -EINVAL;
4250
4251
4252 err = sock_create(sk->sk_family, SOCK_SEQPACKET, IPPROTO_SCTP, &sock);
4253 if (err < 0)
4254 return err;
4255
4256 sctp_copy_sock(sock->sk, sk, asoc);
4257
4258
4259
4260
4261 af = sctp_get_af_specific(asoc->peer.primary_addr.sa.sa_family);
4262 af->to_sk_daddr(&asoc->peer.primary_addr, sk);
4263
4264
4265
4266
4267 sctp_sock_migrate(sk, sock->sk, asoc, SCTP_SOCKET_UDP_HIGH_BANDWIDTH);
4268
4269 *sockp = sock;
4270
4271 return err;
4272}
4273EXPORT_SYMBOL(sctp_do_peeloff);
4274
4275static int sctp_getsockopt_peeloff(struct sock *sk, int len, char __user *optval, int __user *optlen)
4276{
4277 sctp_peeloff_arg_t peeloff;
4278 struct socket *newsock;
4279 int retval = 0;
4280
4281 if (len < sizeof(sctp_peeloff_arg_t))
4282 return -EINVAL;
4283 len = sizeof(sctp_peeloff_arg_t);
4284 if (copy_from_user(&peeloff, optval, len))
4285 return -EFAULT;
4286
4287 retval = sctp_do_peeloff(sk, peeloff.associd, &newsock);
4288 if (retval < 0)
4289 goto out;
4290
4291
4292 retval = sock_map_fd(newsock, 0);
4293 if (retval < 0) {
4294 sock_release(newsock);
4295 goto out;
4296 }
4297
4298 SCTP_DEBUG_PRINTK("%s: sk: %p newsk: %p sd: %d\n",
4299 __func__, sk, newsock->sk, retval);
4300
4301
4302 peeloff.sd = retval;
4303 if (put_user(len, optlen))
4304 return -EFAULT;
4305 if (copy_to_user(optval, &peeloff, len))
4306 retval = -EFAULT;
4307
4308out:
4309 return retval;
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
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405static int sctp_getsockopt_peer_addr_params(struct sock *sk, int len,
4406 char __user *optval, int __user *optlen)
4407{
4408 struct sctp_paddrparams params;
4409 struct sctp_transport *trans = NULL;
4410 struct sctp_association *asoc = NULL;
4411 struct sctp_sock *sp = sctp_sk(sk);
4412
4413 if (len < sizeof(struct sctp_paddrparams))
4414 return -EINVAL;
4415 len = sizeof(struct sctp_paddrparams);
4416 if (copy_from_user(¶ms, optval, len))
4417 return -EFAULT;
4418
4419
4420
4421
4422 if (!sctp_is_any(sk, ( union sctp_addr *)¶ms.spp_address)) {
4423 trans = sctp_addr_id2transport(sk, ¶ms.spp_address,
4424 params.spp_assoc_id);
4425 if (!trans) {
4426 SCTP_DEBUG_PRINTK("Failed no transport\n");
4427 return -EINVAL;
4428 }
4429 }
4430
4431
4432
4433
4434
4435 asoc = sctp_id2assoc(sk, params.spp_assoc_id);
4436 if (!asoc && params.spp_assoc_id && sctp_style(sk, UDP)) {
4437 SCTP_DEBUG_PRINTK("Failed no association\n");
4438 return -EINVAL;
4439 }
4440
4441 if (trans) {
4442
4443 params.spp_hbinterval = jiffies_to_msecs(trans->hbinterval);
4444 params.spp_pathmtu = trans->pathmtu;
4445 params.spp_pathmaxrxt = trans->pathmaxrxt;
4446 params.spp_sackdelay = jiffies_to_msecs(trans->sackdelay);
4447
4448
4449 params.spp_flags = trans->param_flags;
4450 } else if (asoc) {
4451
4452 params.spp_hbinterval = jiffies_to_msecs(asoc->hbinterval);
4453 params.spp_pathmtu = asoc->pathmtu;
4454 params.spp_pathmaxrxt = asoc->pathmaxrxt;
4455 params.spp_sackdelay = jiffies_to_msecs(asoc->sackdelay);
4456
4457
4458 params.spp_flags = asoc->param_flags;
4459 } else {
4460
4461 params.spp_hbinterval = sp->hbinterval;
4462 params.spp_pathmtu = sp->pathmtu;
4463 params.spp_sackdelay = sp->sackdelay;
4464 params.spp_pathmaxrxt = sp->pathmaxrxt;
4465
4466
4467 params.spp_flags = sp->param_flags;
4468 }
4469
4470 if (copy_to_user(optval, ¶ms, len))
4471 return -EFAULT;
4472
4473 if (put_user(len, optlen))
4474 return -EFAULT;
4475
4476 return 0;
4477}
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514static int sctp_getsockopt_delayed_ack(struct sock *sk, int len,
4515 char __user *optval,
4516 int __user *optlen)
4517{
4518 struct sctp_sack_info params;
4519 struct sctp_association *asoc = NULL;
4520 struct sctp_sock *sp = sctp_sk(sk);
4521
4522 if (len >= sizeof(struct sctp_sack_info)) {
4523 len = sizeof(struct sctp_sack_info);
4524
4525 if (copy_from_user(¶ms, optval, len))
4526 return -EFAULT;
4527 } else if (len == sizeof(struct sctp_assoc_value)) {
4528 pr_warn("Use of struct sctp_assoc_value in delayed_ack socket option deprecated\n");
4529 pr_warn("Use struct sctp_sack_info instead\n");
4530 if (copy_from_user(¶ms, optval, len))
4531 return -EFAULT;
4532 } else
4533 return - EINVAL;
4534
4535
4536
4537
4538
4539 asoc = sctp_id2assoc(sk, params.sack_assoc_id);
4540 if (!asoc && params.sack_assoc_id && sctp_style(sk, UDP))
4541 return -EINVAL;
4542
4543 if (asoc) {
4544
4545 if (asoc->param_flags & SPP_SACKDELAY_ENABLE) {
4546 params.sack_delay = jiffies_to_msecs(
4547 asoc->sackdelay);
4548 params.sack_freq = asoc->sackfreq;
4549
4550 } else {
4551 params.sack_delay = 0;
4552 params.sack_freq = 1;
4553 }
4554 } else {
4555
4556 if (sp->param_flags & SPP_SACKDELAY_ENABLE) {
4557 params.sack_delay = sp->sackdelay;
4558 params.sack_freq = sp->sackfreq;
4559 } else {
4560 params.sack_delay = 0;
4561 params.sack_freq = 1;
4562 }
4563 }
4564
4565 if (copy_to_user(optval, ¶ms, len))
4566 return -EFAULT;
4567
4568 if (put_user(len, optlen))
4569 return -EFAULT;
4570
4571 return 0;
4572}
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585static int sctp_getsockopt_initmsg(struct sock *sk, int len, char __user *optval, int __user *optlen)
4586{
4587 if (len < sizeof(struct sctp_initmsg))
4588 return -EINVAL;
4589 len = sizeof(struct sctp_initmsg);
4590 if (put_user(len, optlen))
4591 return -EFAULT;
4592 if (copy_to_user(optval, &sctp_sk(sk)->initmsg, len))
4593 return -EFAULT;
4594 return 0;
4595}
4596
4597
4598static int sctp_getsockopt_peer_addrs(struct sock *sk, int len,
4599 char __user *optval, int __user *optlen)
4600{
4601 struct sctp_association *asoc;
4602 int cnt = 0;
4603 struct sctp_getaddrs getaddrs;
4604 struct sctp_transport *from;
4605 void __user *to;
4606 union sctp_addr temp;
4607 struct sctp_sock *sp = sctp_sk(sk);
4608 int addrlen;
4609 size_t space_left;
4610 int bytes_copied;
4611
4612 if (len < sizeof(struct sctp_getaddrs))
4613 return -EINVAL;
4614
4615 if (copy_from_user(&getaddrs, optval, sizeof(struct sctp_getaddrs)))
4616 return -EFAULT;
4617
4618
4619 asoc = sctp_id2assoc(sk, getaddrs.assoc_id);
4620 if (!asoc)
4621 return -EINVAL;
4622
4623 to = optval + offsetof(struct sctp_getaddrs,addrs);
4624 space_left = len - offsetof(struct sctp_getaddrs,addrs);
4625
4626 list_for_each_entry(from, &asoc->peer.transport_addr_list,
4627 transports) {
4628 memcpy(&temp, &from->ipaddr, sizeof(temp));
4629 sctp_get_pf_specific(sk->sk_family)->addr_v4map(sp, &temp);
4630 addrlen = sctp_get_af_specific(temp.sa.sa_family)->sockaddr_len;
4631 if (space_left < addrlen)
4632 return -ENOMEM;
4633 if (copy_to_user(to, &temp, addrlen))
4634 return -EFAULT;
4635 to += addrlen;
4636 cnt++;
4637 space_left -= addrlen;
4638 }
4639
4640 if (put_user(cnt, &((struct sctp_getaddrs __user *)optval)->addr_num))
4641 return -EFAULT;
4642 bytes_copied = ((char __user *)to) - optval;
4643 if (put_user(bytes_copied, optlen))
4644 return -EFAULT;
4645
4646 return 0;
4647}
4648
4649static int sctp_copy_laddrs(struct sock *sk, __u16 port, void *to,
4650 size_t space_left, int *bytes_copied)
4651{
4652 struct sctp_sockaddr_entry *addr;
4653 union sctp_addr temp;
4654 int cnt = 0;
4655 int addrlen;
4656
4657 rcu_read_lock();
4658 list_for_each_entry_rcu(addr, &sctp_local_addr_list, list) {
4659 if (!addr->valid)
4660 continue;
4661
4662 if ((PF_INET == sk->sk_family) &&
4663 (AF_INET6 == addr->a.sa.sa_family))
4664 continue;
4665 if ((PF_INET6 == sk->sk_family) &&
4666 inet_v6_ipv6only(sk) &&
4667 (AF_INET == addr->a.sa.sa_family))
4668 continue;
4669 memcpy(&temp, &addr->a, sizeof(temp));
4670 if (!temp.v4.sin_port)
4671 temp.v4.sin_port = htons(port);
4672
4673 sctp_get_pf_specific(sk->sk_family)->addr_v4map(sctp_sk(sk),
4674 &temp);
4675 addrlen = sctp_get_af_specific(temp.sa.sa_family)->sockaddr_len;
4676 if (space_left < addrlen) {
4677 cnt = -ENOMEM;
4678 break;
4679 }
4680 memcpy(to, &temp, addrlen);
4681
4682 to += addrlen;
4683 cnt ++;
4684 space_left -= addrlen;
4685 *bytes_copied += addrlen;
4686 }
4687 rcu_read_unlock();
4688
4689 return cnt;
4690}
4691
4692
4693static int sctp_getsockopt_local_addrs(struct sock *sk, int len,
4694 char __user *optval, int __user *optlen)
4695{
4696 struct sctp_bind_addr *bp;
4697 struct sctp_association *asoc;
4698 int cnt = 0;
4699 struct sctp_getaddrs getaddrs;
4700 struct sctp_sockaddr_entry *addr;
4701 void __user *to;
4702 union sctp_addr temp;
4703 struct sctp_sock *sp = sctp_sk(sk);
4704 int addrlen;
4705 int err = 0;
4706 size_t space_left;
4707 int bytes_copied = 0;
4708 void *addrs;
4709 void *buf;
4710
4711 if (len < sizeof(struct sctp_getaddrs))
4712 return -EINVAL;
4713
4714 if (copy_from_user(&getaddrs, optval, sizeof(struct sctp_getaddrs)))
4715 return -EFAULT;
4716
4717
4718
4719
4720
4721
4722
4723 if (0 == getaddrs.assoc_id) {
4724 bp = &sctp_sk(sk)->ep->base.bind_addr;
4725 } else {
4726 asoc = sctp_id2assoc(sk, getaddrs.assoc_id);
4727 if (!asoc)
4728 return -EINVAL;
4729 bp = &asoc->base.bind_addr;
4730 }
4731
4732 to = optval + offsetof(struct sctp_getaddrs,addrs);
4733 space_left = len - offsetof(struct sctp_getaddrs,addrs);
4734
4735 addrs = kmalloc(space_left, GFP_KERNEL);
4736 if (!addrs)
4737 return -ENOMEM;
4738
4739
4740
4741
4742 if (sctp_list_single_entry(&bp->address_list)) {
4743 addr = list_entry(bp->address_list.next,
4744 struct sctp_sockaddr_entry, list);
4745 if (sctp_is_any(sk, &addr->a)) {
4746 cnt = sctp_copy_laddrs(sk, bp->port, addrs,
4747 space_left, &bytes_copied);
4748 if (cnt < 0) {
4749 err = cnt;
4750 goto out;
4751 }
4752 goto copy_getaddrs;
4753 }
4754 }
4755
4756 buf = addrs;
4757
4758
4759
4760
4761 list_for_each_entry(addr, &bp->address_list, list) {
4762 memcpy(&temp, &addr->a, sizeof(temp));
4763 sctp_get_pf_specific(sk->sk_family)->addr_v4map(sp, &temp);
4764 addrlen = sctp_get_af_specific(temp.sa.sa_family)->sockaddr_len;
4765 if (space_left < addrlen) {
4766 err = -ENOMEM;
4767 goto out;
4768 }
4769 memcpy(buf, &temp, addrlen);
4770 buf += addrlen;
4771 bytes_copied += addrlen;
4772 cnt ++;
4773 space_left -= addrlen;
4774 }
4775
4776copy_getaddrs:
4777 if (copy_to_user(to, addrs, bytes_copied)) {
4778 err = -EFAULT;
4779 goto out;
4780 }
4781 if (put_user(cnt, &((struct sctp_getaddrs __user *)optval)->addr_num)) {
4782 err = -EFAULT;
4783 goto out;
4784 }
4785 if (put_user(bytes_copied, optlen))
4786 err = -EFAULT;
4787out:
4788 kfree(addrs);
4789 return err;
4790}
4791
4792
4793
4794
4795
4796
4797
4798static int sctp_getsockopt_primary_addr(struct sock *sk, int len,
4799 char __user *optval, int __user *optlen)
4800{
4801 struct sctp_prim prim;
4802 struct sctp_association *asoc;
4803 struct sctp_sock *sp = sctp_sk(sk);
4804
4805 if (len < sizeof(struct sctp_prim))
4806 return -EINVAL;
4807
4808 len = sizeof(struct sctp_prim);
4809
4810 if (copy_from_user(&prim, optval, len))
4811 return -EFAULT;
4812
4813 asoc = sctp_id2assoc(sk, prim.ssp_assoc_id);
4814 if (!asoc)
4815 return -EINVAL;
4816
4817 if (!asoc->peer.primary_path)
4818 return -ENOTCONN;
4819
4820 memcpy(&prim.ssp_addr, &asoc->peer.primary_path->ipaddr,
4821 asoc->peer.primary_path->af_specific->sockaddr_len);
4822
4823 sctp_get_pf_specific(sk->sk_family)->addr_v4map(sp,
4824 (union sctp_addr *)&prim.ssp_addr);
4825
4826 if (put_user(len, optlen))
4827 return -EFAULT;
4828 if (copy_to_user(optval, &prim, len))
4829 return -EFAULT;
4830
4831 return 0;
4832}
4833
4834
4835
4836
4837
4838
4839
4840static int sctp_getsockopt_adaptation_layer(struct sock *sk, int len,
4841 char __user *optval, int __user *optlen)
4842{
4843 struct sctp_setadaptation adaptation;
4844
4845 if (len < sizeof(struct sctp_setadaptation))
4846 return -EINVAL;
4847
4848 len = sizeof(struct sctp_setadaptation);
4849
4850 adaptation.ssb_adaptation_ind = sctp_sk(sk)->adaptation_ind;
4851
4852 if (put_user(len, optlen))
4853 return -EFAULT;
4854 if (copy_to_user(optval, &adaptation, len))
4855 return -EFAULT;
4856
4857 return 0;
4858}
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879static int sctp_getsockopt_default_send_param(struct sock *sk,
4880 int len, char __user *optval,
4881 int __user *optlen)
4882{
4883 struct sctp_sndrcvinfo info;
4884 struct sctp_association *asoc;
4885 struct sctp_sock *sp = sctp_sk(sk);
4886
4887 if (len < sizeof(struct sctp_sndrcvinfo))
4888 return -EINVAL;
4889
4890 len = sizeof(struct sctp_sndrcvinfo);
4891
4892 if (copy_from_user(&info, optval, len))
4893 return -EFAULT;
4894
4895 asoc = sctp_id2assoc(sk, info.sinfo_assoc_id);
4896 if (!asoc && info.sinfo_assoc_id && sctp_style(sk, UDP))
4897 return -EINVAL;
4898
4899 if (asoc) {
4900 info.sinfo_stream = asoc->default_stream;
4901 info.sinfo_flags = asoc->default_flags;
4902 info.sinfo_ppid = asoc->default_ppid;
4903 info.sinfo_context = asoc->default_context;
4904 info.sinfo_timetolive = asoc->default_timetolive;
4905 } else {
4906 info.sinfo_stream = sp->default_stream;
4907 info.sinfo_flags = sp->default_flags;
4908 info.sinfo_ppid = sp->default_ppid;
4909 info.sinfo_context = sp->default_context;
4910 info.sinfo_timetolive = sp->default_timetolive;
4911 }
4912
4913 if (put_user(len, optlen))
4914 return -EFAULT;
4915 if (copy_to_user(optval, &info, len))
4916 return -EFAULT;
4917
4918 return 0;
4919}
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931static int sctp_getsockopt_nodelay(struct sock *sk, int len,
4932 char __user *optval, int __user *optlen)
4933{
4934 int val;
4935
4936 if (len < sizeof(int))
4937 return -EINVAL;
4938
4939 len = sizeof(int);
4940 val = (sctp_sk(sk)->nodelay == 1);
4941 if (put_user(len, optlen))
4942 return -EFAULT;
4943 if (copy_to_user(optval, &val, len))
4944 return -EFAULT;
4945 return 0;
4946}
4947
4948
4949
4950
4951
4952
4953
4954
4955
4956
4957
4958
4959
4960static int sctp_getsockopt_rtoinfo(struct sock *sk, int len,
4961 char __user *optval,
4962 int __user *optlen) {
4963 struct sctp_rtoinfo rtoinfo;
4964 struct sctp_association *asoc;
4965
4966 if (len < sizeof (struct sctp_rtoinfo))
4967 return -EINVAL;
4968
4969 len = sizeof(struct sctp_rtoinfo);
4970
4971 if (copy_from_user(&rtoinfo, optval, len))
4972 return -EFAULT;
4973
4974 asoc = sctp_id2assoc(sk, rtoinfo.srto_assoc_id);
4975
4976 if (!asoc && rtoinfo.srto_assoc_id && sctp_style(sk, UDP))
4977 return -EINVAL;
4978
4979
4980 if (asoc) {
4981 rtoinfo.srto_initial = jiffies_to_msecs(asoc->rto_initial);
4982 rtoinfo.srto_max = jiffies_to_msecs(asoc->rto_max);
4983 rtoinfo.srto_min = jiffies_to_msecs(asoc->rto_min);
4984 } else {
4985
4986 struct sctp_sock *sp = sctp_sk(sk);
4987
4988 rtoinfo.srto_initial = sp->rtoinfo.srto_initial;
4989 rtoinfo.srto_max = sp->rtoinfo.srto_max;
4990 rtoinfo.srto_min = sp->rtoinfo.srto_min;
4991 }
4992
4993 if (put_user(len, optlen))
4994 return -EFAULT;
4995
4996 if (copy_to_user(optval, &rtoinfo, len))
4997 return -EFAULT;
4998
4999 return 0;
5000}
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013static int sctp_getsockopt_associnfo(struct sock *sk, int len,
5014 char __user *optval,
5015 int __user *optlen)
5016{
5017
5018 struct sctp_assocparams assocparams;
5019 struct sctp_association *asoc;
5020 struct list_head *pos;
5021 int cnt = 0;
5022
5023 if (len < sizeof (struct sctp_assocparams))
5024 return -EINVAL;
5025
5026 len = sizeof(struct sctp_assocparams);
5027
5028 if (copy_from_user(&assocparams, optval, len))
5029 return -EFAULT;
5030
5031 asoc = sctp_id2assoc(sk, assocparams.sasoc_assoc_id);
5032
5033 if (!asoc && assocparams.sasoc_assoc_id && sctp_style(sk, UDP))
5034 return -EINVAL;
5035
5036
5037 if (asoc) {
5038 assocparams.sasoc_asocmaxrxt = asoc->max_retrans;
5039 assocparams.sasoc_peer_rwnd = asoc->peer.rwnd;
5040 assocparams.sasoc_local_rwnd = asoc->a_rwnd;
5041 assocparams.sasoc_cookie_life = (asoc->cookie_life.tv_sec
5042 * 1000) +
5043 (asoc->cookie_life.tv_usec
5044 / 1000);
5045
5046 list_for_each(pos, &asoc->peer.transport_addr_list) {
5047 cnt ++;
5048 }
5049
5050 assocparams.sasoc_number_peer_destinations = cnt;
5051 } else {
5052
5053 struct sctp_sock *sp = sctp_sk(sk);
5054
5055 assocparams.sasoc_asocmaxrxt = sp->assocparams.sasoc_asocmaxrxt;
5056 assocparams.sasoc_peer_rwnd = sp->assocparams.sasoc_peer_rwnd;
5057 assocparams.sasoc_local_rwnd = sp->assocparams.sasoc_local_rwnd;
5058 assocparams.sasoc_cookie_life =
5059 sp->assocparams.sasoc_cookie_life;
5060 assocparams.sasoc_number_peer_destinations =
5061 sp->assocparams.
5062 sasoc_number_peer_destinations;
5063 }
5064
5065 if (put_user(len, optlen))
5066 return -EFAULT;
5067
5068 if (copy_to_user(optval, &assocparams, len))
5069 return -EFAULT;
5070
5071 return 0;
5072}
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084static int sctp_getsockopt_mappedv4(struct sock *sk, int len,
5085 char __user *optval, int __user *optlen)
5086{
5087 int val;
5088 struct sctp_sock *sp = sctp_sk(sk);
5089
5090 if (len < sizeof(int))
5091 return -EINVAL;
5092
5093 len = sizeof(int);
5094 val = sp->v4mapped;
5095 if (put_user(len, optlen))
5096 return -EFAULT;
5097 if (copy_to_user(optval, &val, len))
5098 return -EFAULT;
5099
5100 return 0;
5101}
5102
5103
5104
5105
5106
5107static int sctp_getsockopt_context(struct sock *sk, int len,
5108 char __user *optval, int __user *optlen)
5109{
5110 struct sctp_assoc_value params;
5111 struct sctp_sock *sp;
5112 struct sctp_association *asoc;
5113
5114 if (len < sizeof(struct sctp_assoc_value))
5115 return -EINVAL;
5116
5117 len = sizeof(struct sctp_assoc_value);
5118
5119 if (copy_from_user(¶ms, optval, len))
5120 return -EFAULT;
5121
5122 sp = sctp_sk(sk);
5123
5124 if (params.assoc_id != 0) {
5125 asoc = sctp_id2assoc(sk, params.assoc_id);
5126 if (!asoc)
5127 return -EINVAL;
5128 params.assoc_value = asoc->default_rcv_context;
5129 } else {
5130 params.assoc_value = sp->default_rcv_context;
5131 }
5132
5133 if (put_user(len, optlen))
5134 return -EFAULT;
5135 if (copy_to_user(optval, ¶ms, len))
5136 return -EFAULT;
5137
5138 return 0;
5139}
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168static int sctp_getsockopt_maxseg(struct sock *sk, int len,
5169 char __user *optval, int __user *optlen)
5170{
5171 struct sctp_assoc_value params;
5172 struct sctp_association *asoc;
5173
5174 if (len == sizeof(int)) {
5175 pr_warn("Use of int in maxseg socket option deprecated\n");
5176 pr_warn("Use struct sctp_assoc_value instead\n");
5177 params.assoc_id = 0;
5178 } else if (len >= sizeof(struct sctp_assoc_value)) {
5179 len = sizeof(struct sctp_assoc_value);
5180 if (copy_from_user(¶ms, optval, sizeof(params)))
5181 return -EFAULT;
5182 } else
5183 return -EINVAL;
5184
5185 asoc = sctp_id2assoc(sk, params.assoc_id);
5186 if (!asoc && params.assoc_id && sctp_style(sk, UDP))
5187 return -EINVAL;
5188
5189 if (asoc)
5190 params.assoc_value = asoc->frag_point;
5191 else
5192 params.assoc_value = sctp_sk(sk)->user_frag;
5193
5194 if (put_user(len, optlen))
5195 return -EFAULT;
5196 if (len == sizeof(int)) {
5197 if (copy_to_user(optval, ¶ms.assoc_value, len))
5198 return -EFAULT;
5199 } else {
5200 if (copy_to_user(optval, ¶ms, len))
5201 return -EFAULT;
5202 }
5203
5204 return 0;
5205}
5206
5207
5208
5209
5210
5211static int sctp_getsockopt_fragment_interleave(struct sock *sk, int len,
5212 char __user *optval, int __user *optlen)
5213{
5214 int val;
5215
5216 if (len < sizeof(int))
5217 return -EINVAL;
5218
5219 len = sizeof(int);
5220
5221 val = sctp_sk(sk)->frag_interleave;
5222 if (put_user(len, optlen))
5223 return -EFAULT;
5224 if (copy_to_user(optval, &val, len))
5225 return -EFAULT;
5226
5227 return 0;
5228}
5229
5230
5231
5232
5233
5234static int sctp_getsockopt_partial_delivery_point(struct sock *sk, int len,
5235 char __user *optval,
5236 int __user *optlen)
5237{
5238 u32 val;
5239
5240 if (len < sizeof(u32))
5241 return -EINVAL;
5242
5243 len = sizeof(u32);
5244
5245 val = sctp_sk(sk)->pd_point;
5246 if (put_user(len, optlen))
5247 return -EFAULT;
5248 if (copy_to_user(optval, &val, len))
5249 return -EFAULT;
5250
5251 return 0;
5252}
5253
5254
5255
5256
5257
5258static int sctp_getsockopt_maxburst(struct sock *sk, int len,
5259 char __user *optval,
5260 int __user *optlen)
5261{
5262 struct sctp_assoc_value params;
5263 struct sctp_sock *sp;
5264 struct sctp_association *asoc;
5265
5266 if (len == sizeof(int)) {
5267 pr_warn("Use of int in max_burst socket option deprecated\n");
5268 pr_warn("Use struct sctp_assoc_value instead\n");
5269 params.assoc_id = 0;
5270 } else if (len >= sizeof(struct sctp_assoc_value)) {
5271 len = sizeof(struct sctp_assoc_value);
5272 if (copy_from_user(¶ms, optval, len))
5273 return -EFAULT;
5274 } else
5275 return -EINVAL;
5276
5277 sp = sctp_sk(sk);
5278
5279 if (params.assoc_id != 0) {
5280 asoc = sctp_id2assoc(sk, params.assoc_id);
5281 if (!asoc)
5282 return -EINVAL;
5283 params.assoc_value = asoc->max_burst;
5284 } else
5285 params.assoc_value = sp->max_burst;
5286
5287 if (len == sizeof(int)) {
5288 if (copy_to_user(optval, ¶ms.assoc_value, len))
5289 return -EFAULT;
5290 } else {
5291 if (copy_to_user(optval, ¶ms, len))
5292 return -EFAULT;
5293 }
5294
5295 return 0;
5296
5297}
5298
5299static int sctp_getsockopt_hmac_ident(struct sock *sk, int len,
5300 char __user *optval, int __user *optlen)
5301{
5302 struct sctp_hmacalgo __user *p = (void __user *)optval;
5303 struct sctp_hmac_algo_param *hmacs;
5304 __u16 data_len = 0;
5305 u32 num_idents;
5306
5307 if (!sctp_auth_enable)
5308 return -EACCES;
5309
5310 hmacs = sctp_sk(sk)->ep->auth_hmacs_list;
5311 data_len = ntohs(hmacs->param_hdr.length) - sizeof(sctp_paramhdr_t);
5312
5313 if (len < sizeof(struct sctp_hmacalgo) + data_len)
5314 return -EINVAL;
5315
5316 len = sizeof(struct sctp_hmacalgo) + data_len;
5317 num_idents = data_len / sizeof(u16);
5318
5319 if (put_user(len, optlen))
5320 return -EFAULT;
5321 if (put_user(num_idents, &p->shmac_num_idents))
5322 return -EFAULT;
5323 if (copy_to_user(p->shmac_idents, hmacs->hmac_ids, data_len))
5324 return -EFAULT;
5325 return 0;
5326}
5327
5328static int sctp_getsockopt_active_key(struct sock *sk, int len,
5329 char __user *optval, int __user *optlen)
5330{
5331 struct sctp_authkeyid val;
5332 struct sctp_association *asoc;
5333
5334 if (!sctp_auth_enable)
5335 return -EACCES;
5336
5337 if (len < sizeof(struct sctp_authkeyid))
5338 return -EINVAL;
5339 if (copy_from_user(&val, optval, sizeof(struct sctp_authkeyid)))
5340 return -EFAULT;
5341
5342 asoc = sctp_id2assoc(sk, val.scact_assoc_id);
5343 if (!asoc && val.scact_assoc_id && sctp_style(sk, UDP))
5344 return -EINVAL;
5345
5346 if (asoc)
5347 val.scact_keynumber = asoc->active_key_id;
5348 else
5349 val.scact_keynumber = sctp_sk(sk)->ep->active_key_id;
5350
5351 len = sizeof(struct sctp_authkeyid);
5352 if (put_user(len, optlen))
5353 return -EFAULT;
5354 if (copy_to_user(optval, &val, len))
5355 return -EFAULT;
5356
5357 return 0;
5358}
5359
5360static int sctp_getsockopt_peer_auth_chunks(struct sock *sk, int len,
5361 char __user *optval, int __user *optlen)
5362{
5363 struct sctp_authchunks __user *p = (void __user *)optval;
5364 struct sctp_authchunks val;
5365 struct sctp_association *asoc;
5366 struct sctp_chunks_param *ch;
5367 u32 num_chunks = 0;
5368 char __user *to;
5369
5370 if (!sctp_auth_enable)
5371 return -EACCES;
5372
5373 if (len < sizeof(struct sctp_authchunks))
5374 return -EINVAL;
5375
5376 if (copy_from_user(&val, optval, sizeof(struct sctp_authchunks)))
5377 return -EFAULT;
5378
5379 to = p->gauth_chunks;
5380 asoc = sctp_id2assoc(sk, val.gauth_assoc_id);
5381 if (!asoc)
5382 return -EINVAL;
5383
5384 ch = asoc->peer.peer_chunks;
5385 if (!ch)
5386 goto num;
5387
5388
5389 num_chunks = ntohs(ch->param_hdr.length) - sizeof(sctp_paramhdr_t);
5390 if (len < num_chunks)
5391 return -EINVAL;
5392
5393 if (copy_to_user(to, ch->chunks, num_chunks))
5394 return -EFAULT;
5395num:
5396 len = sizeof(struct sctp_authchunks) + num_chunks;
5397 if (put_user(len, optlen)) return -EFAULT;
5398 if (put_user(num_chunks, &p->gauth_number_of_chunks))
5399 return -EFAULT;
5400 return 0;
5401}
5402
5403static int sctp_getsockopt_local_auth_chunks(struct sock *sk, int len,
5404 char __user *optval, int __user *optlen)
5405{
5406 struct sctp_authchunks __user *p = (void __user *)optval;
5407 struct sctp_authchunks val;
5408 struct sctp_association *asoc;
5409 struct sctp_chunks_param *ch;
5410 u32 num_chunks = 0;
5411 char __user *to;
5412
5413 if (!sctp_auth_enable)
5414 return -EACCES;
5415
5416 if (len < sizeof(struct sctp_authchunks))
5417 return -EINVAL;
5418
5419 if (copy_from_user(&val, optval, sizeof(struct sctp_authchunks)))
5420 return -EFAULT;
5421
5422 to = p->gauth_chunks;
5423 asoc = sctp_id2assoc(sk, val.gauth_assoc_id);
5424 if (!asoc && val.gauth_assoc_id && sctp_style(sk, UDP))
5425 return -EINVAL;
5426
5427 if (asoc)
5428 ch = (struct sctp_chunks_param*)asoc->c.auth_chunks;
5429 else
5430 ch = sctp_sk(sk)->ep->auth_chunk_list;
5431
5432 if (!ch)
5433 goto num;
5434
5435 num_chunks = ntohs(ch->param_hdr.length) - sizeof(sctp_paramhdr_t);
5436 if (len < sizeof(struct sctp_authchunks) + num_chunks)
5437 return -EINVAL;
5438
5439 if (copy_to_user(to, ch->chunks, num_chunks))
5440 return -EFAULT;
5441num:
5442 len = sizeof(struct sctp_authchunks) + num_chunks;
5443 if (put_user(len, optlen))
5444 return -EFAULT;
5445 if (put_user(num_chunks, &p->gauth_number_of_chunks))
5446 return -EFAULT;
5447
5448 return 0;
5449}
5450
5451
5452
5453
5454
5455
5456static int sctp_getsockopt_assoc_number(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 u32 val = 0;
5462
5463 if (sctp_style(sk, TCP))
5464 return -EOPNOTSUPP;
5465
5466 if (len < sizeof(u32))
5467 return -EINVAL;
5468
5469 len = sizeof(u32);
5470
5471 list_for_each_entry(asoc, &(sp->ep->asocs), asocs) {
5472 val++;
5473 }
5474
5475 if (put_user(len, optlen))
5476 return -EFAULT;
5477 if (copy_to_user(optval, &val, len))
5478 return -EFAULT;
5479
5480 return 0;
5481}
5482
5483
5484
5485
5486
5487static int sctp_getsockopt_auto_asconf(struct sock *sk, int len,
5488 char __user *optval, int __user *optlen)
5489{
5490 int val = 0;
5491
5492 if (len < sizeof(int))
5493 return -EINVAL;
5494
5495 len = sizeof(int);
5496 if (sctp_sk(sk)->do_auto_asconf && sctp_is_ep_boundall(sk))
5497 val = 1;
5498 if (put_user(len, optlen))
5499 return -EFAULT;
5500 if (copy_to_user(optval, &val, len))
5501 return -EFAULT;
5502 return 0;
5503}
5504
5505
5506
5507
5508
5509
5510
5511
5512static int sctp_getsockopt_assoc_ids(struct sock *sk, int len,
5513 char __user *optval, int __user *optlen)
5514{
5515 struct sctp_sock *sp = sctp_sk(sk);
5516 struct sctp_association *asoc;
5517 struct sctp_assoc_ids *ids;
5518 u32 num = 0;
5519
5520 if (sctp_style(sk, TCP))
5521 return -EOPNOTSUPP;
5522
5523 if (len < sizeof(struct sctp_assoc_ids))
5524 return -EINVAL;
5525
5526 list_for_each_entry(asoc, &(sp->ep->asocs), asocs) {
5527 num++;
5528 }
5529
5530 if (len < sizeof(struct sctp_assoc_ids) + sizeof(sctp_assoc_t) * num)
5531 return -EINVAL;
5532
5533 len = sizeof(struct sctp_assoc_ids) + sizeof(sctp_assoc_t) * num;
5534
5535 ids = kmalloc(len, GFP_KERNEL);
5536 if (unlikely(!ids))
5537 return -ENOMEM;
5538
5539 ids->gaids_number_of_ids = num;
5540 num = 0;
5541 list_for_each_entry(asoc, &(sp->ep->asocs), asocs) {
5542 ids->gaids_assoc_id[num++] = asoc->assoc_id;
5543 }
5544
5545 if (put_user(len, optlen) || copy_to_user(optval, ids, len)) {
5546 kfree(ids);
5547 return -EFAULT;
5548 }
5549
5550 kfree(ids);
5551 return 0;
5552}
5553
5554
5555
5556
5557
5558
5559
5560
5561static int sctp_getsockopt_paddr_thresholds(struct sock *sk,
5562 char __user *optval,
5563 int len,
5564 int __user *optlen)
5565{
5566 struct sctp_paddrthlds val;
5567 struct sctp_transport *trans;
5568 struct sctp_association *asoc;
5569
5570 if (len < sizeof(struct sctp_paddrthlds))
5571 return -EINVAL;
5572 len = sizeof(struct sctp_paddrthlds);
5573 if (copy_from_user(&val, (struct sctp_paddrthlds __user *)optval, len))
5574 return -EFAULT;
5575
5576 if (sctp_is_any(sk, (const union sctp_addr *)&val.spt_address)) {
5577 asoc = sctp_id2assoc(sk, val.spt_assoc_id);
5578 if (!asoc)
5579 return -ENOENT;
5580
5581 val.spt_pathpfthld = asoc->pf_retrans;
5582 val.spt_pathmaxrxt = asoc->pathmaxrxt;
5583 } else {
5584 trans = sctp_addr_id2transport(sk, &val.spt_address,
5585 val.spt_assoc_id);
5586 if (!trans)
5587 return -ENOENT;
5588
5589 val.spt_pathmaxrxt = trans->pathmaxrxt;
5590 val.spt_pathpfthld = trans->pf_retrans;
5591 }
5592
5593 if (put_user(len, optlen) || copy_to_user(optval, &val, len))
5594 return -EFAULT;
5595
5596 return 0;
5597}
5598
5599SCTP_STATIC int sctp_getsockopt(struct sock *sk, int level, int optname,
5600 char __user *optval, int __user *optlen)
5601{
5602 int retval = 0;
5603 int len;
5604
5605 SCTP_DEBUG_PRINTK("sctp_getsockopt(sk: %p... optname: %d)\n",
5606 sk, optname);
5607
5608
5609
5610
5611
5612
5613
5614 if (level != SOL_SCTP) {
5615 struct sctp_af *af = sctp_sk(sk)->pf->af;
5616
5617 retval = af->getsockopt(sk, level, optname, optval, optlen);
5618 return retval;
5619 }
5620
5621 if (get_user(len, optlen))
5622 return -EFAULT;
5623
5624 sctp_lock_sock(sk);
5625
5626 switch (optname) {
5627 case SCTP_STATUS:
5628 retval = sctp_getsockopt_sctp_status(sk, len, optval, optlen);
5629 break;
5630 case SCTP_DISABLE_FRAGMENTS:
5631 retval = sctp_getsockopt_disable_fragments(sk, len, optval,
5632 optlen);
5633 break;
5634 case SCTP_EVENTS:
5635 retval = sctp_getsockopt_events(sk, len, optval, optlen);
5636 break;
5637 case SCTP_AUTOCLOSE:
5638 retval = sctp_getsockopt_autoclose(sk, len, optval, optlen);
5639 break;
5640 case SCTP_SOCKOPT_PEELOFF:
5641 retval = sctp_getsockopt_peeloff(sk, len, optval, optlen);
5642 break;
5643 case SCTP_PEER_ADDR_PARAMS:
5644 retval = sctp_getsockopt_peer_addr_params(sk, len, optval,
5645 optlen);
5646 break;
5647 case SCTP_DELAYED_SACK:
5648 retval = sctp_getsockopt_delayed_ack(sk, len, optval,
5649 optlen);
5650 break;
5651 case SCTP_INITMSG:
5652 retval = sctp_getsockopt_initmsg(sk, len, optval, optlen);
5653 break;
5654 case SCTP_GET_PEER_ADDRS:
5655 retval = sctp_getsockopt_peer_addrs(sk, len, optval,
5656 optlen);
5657 break;
5658 case SCTP_GET_LOCAL_ADDRS:
5659 retval = sctp_getsockopt_local_addrs(sk, len, optval,
5660 optlen);
5661 break;
5662 case SCTP_SOCKOPT_CONNECTX3:
5663 retval = sctp_getsockopt_connectx3(sk, len, optval, optlen);
5664 break;
5665 case SCTP_DEFAULT_SEND_PARAM:
5666 retval = sctp_getsockopt_default_send_param(sk, len,
5667 optval, optlen);
5668 break;
5669 case SCTP_PRIMARY_ADDR:
5670 retval = sctp_getsockopt_primary_addr(sk, len, optval, optlen);
5671 break;
5672 case SCTP_NODELAY:
5673 retval = sctp_getsockopt_nodelay(sk, len, optval, optlen);
5674 break;
5675 case SCTP_RTOINFO:
5676 retval = sctp_getsockopt_rtoinfo(sk, len, optval, optlen);
5677 break;
5678 case SCTP_ASSOCINFO:
5679 retval = sctp_getsockopt_associnfo(sk, len, optval, optlen);
5680 break;
5681 case SCTP_I_WANT_MAPPED_V4_ADDR:
5682 retval = sctp_getsockopt_mappedv4(sk, len, optval, optlen);
5683 break;
5684 case SCTP_MAXSEG:
5685 retval = sctp_getsockopt_maxseg(sk, len, optval, optlen);
5686 break;
5687 case SCTP_GET_PEER_ADDR_INFO:
5688 retval = sctp_getsockopt_peer_addr_info(sk, len, optval,
5689 optlen);
5690 break;
5691 case SCTP_ADAPTATION_LAYER:
5692 retval = sctp_getsockopt_adaptation_layer(sk, len, optval,
5693 optlen);
5694 break;
5695 case SCTP_CONTEXT:
5696 retval = sctp_getsockopt_context(sk, len, optval, optlen);
5697 break;
5698 case SCTP_FRAGMENT_INTERLEAVE:
5699 retval = sctp_getsockopt_fragment_interleave(sk, len, optval,
5700 optlen);
5701 break;
5702 case SCTP_PARTIAL_DELIVERY_POINT:
5703 retval = sctp_getsockopt_partial_delivery_point(sk, len, optval,
5704 optlen);
5705 break;
5706 case SCTP_MAX_BURST:
5707 retval = sctp_getsockopt_maxburst(sk, len, optval, optlen);
5708 break;
5709 case SCTP_AUTH_KEY:
5710 case SCTP_AUTH_CHUNK:
5711 case SCTP_AUTH_DELETE_KEY:
5712 retval = -EOPNOTSUPP;
5713 break;
5714 case SCTP_HMAC_IDENT:
5715 retval = sctp_getsockopt_hmac_ident(sk, len, optval, optlen);
5716 break;
5717 case SCTP_AUTH_ACTIVE_KEY:
5718 retval = sctp_getsockopt_active_key(sk, len, optval, optlen);
5719 break;
5720 case SCTP_PEER_AUTH_CHUNKS:
5721 retval = sctp_getsockopt_peer_auth_chunks(sk, len, optval,
5722 optlen);
5723 break;
5724 case SCTP_LOCAL_AUTH_CHUNKS:
5725 retval = sctp_getsockopt_local_auth_chunks(sk, len, optval,
5726 optlen);
5727 break;
5728 case SCTP_GET_ASSOC_NUMBER:
5729 retval = sctp_getsockopt_assoc_number(sk, len, optval, optlen);
5730 break;
5731 case SCTP_GET_ASSOC_ID_LIST:
5732 retval = sctp_getsockopt_assoc_ids(sk, len, optval, optlen);
5733 break;
5734 case SCTP_AUTO_ASCONF:
5735 retval = sctp_getsockopt_auto_asconf(sk, len, optval, optlen);
5736 break;
5737 case SCTP_PEER_ADDR_THLDS:
5738 retval = sctp_getsockopt_paddr_thresholds(sk, optval, len, optlen);
5739 break;
5740 default:
5741 retval = -ENOPROTOOPT;
5742 break;
5743 }
5744
5745 sctp_release_sock(sk);
5746 return retval;
5747}
5748
5749static void sctp_hash(struct sock *sk)
5750{
5751
5752}
5753
5754static void sctp_unhash(struct sock *sk)
5755{
5756
5757}
5758
5759
5760
5761
5762
5763
5764
5765
5766
5767
5768
5769
5770
5771static struct sctp_bind_bucket *sctp_bucket_create(
5772 struct sctp_bind_hashbucket *head, unsigned short snum);
5773
5774static long sctp_get_port_local(struct sock *sk, union sctp_addr *addr)
5775{
5776 struct sctp_bind_hashbucket *head;
5777 struct sctp_bind_bucket *pp;
5778 struct hlist_node *node;
5779 unsigned short snum;
5780 int ret;
5781
5782 snum = ntohs(addr->v4.sin_port);
5783
5784 SCTP_DEBUG_PRINTK("sctp_get_port() begins, snum=%d\n", snum);
5785 sctp_local_bh_disable();
5786
5787 if (snum == 0) {
5788
5789 int low, high, remaining, index;
5790 unsigned int rover;
5791
5792 inet_get_local_port_range(&low, &high);
5793 remaining = (high - low) + 1;
5794 rover = net_random() % remaining + low;
5795
5796 do {
5797 rover++;
5798 if ((rover < low) || (rover > high))
5799 rover = low;
5800 if (inet_is_reserved_local_port(rover))
5801 continue;
5802 index = sctp_phashfn(rover);
5803 head = &sctp_port_hashtable[index];
5804 sctp_spin_lock(&head->lock);
5805 sctp_for_each_hentry(pp, node, &head->chain)
5806 if (pp->port == rover)
5807 goto next;
5808 break;
5809 next:
5810 sctp_spin_unlock(&head->lock);
5811 } while (--remaining > 0);
5812
5813
5814 ret = 1;
5815 if (remaining <= 0)
5816 goto fail;
5817
5818
5819
5820
5821
5822 snum = rover;
5823 } else {
5824
5825
5826
5827
5828
5829
5830 head = &sctp_port_hashtable[sctp_phashfn(snum)];
5831 sctp_spin_lock(&head->lock);
5832 sctp_for_each_hentry(pp, node, &head->chain) {
5833 if (pp->port == snum)
5834 goto pp_found;
5835 }
5836 }
5837 pp = NULL;
5838 goto pp_not_found;
5839pp_found:
5840 if (!hlist_empty(&pp->owner)) {
5841
5842
5843
5844
5845
5846 int reuse = sk->sk_reuse;
5847 struct sock *sk2;
5848
5849 SCTP_DEBUG_PRINTK("sctp_get_port() found a possible match\n");
5850 if (pp->fastreuse && sk->sk_reuse &&
5851 sk->sk_state != SCTP_SS_LISTENING)
5852 goto success;
5853
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
5864 sk_for_each_bound(sk2, node, &pp->owner) {
5865 struct sctp_endpoint *ep2;
5866 ep2 = sctp_sk(sk2)->ep;
5867
5868 if (sk == sk2 ||
5869 (reuse && sk2->sk_reuse &&
5870 sk2->sk_state != SCTP_SS_LISTENING))
5871 continue;
5872
5873 if (sctp_bind_addr_conflict(&ep2->base.bind_addr, addr,
5874 sctp_sk(sk2), sctp_sk(sk))) {
5875 ret = (long)sk2;
5876 goto fail_unlock;
5877 }
5878 }
5879 SCTP_DEBUG_PRINTK("sctp_get_port(): Found a match\n");
5880 }
5881pp_not_found:
5882
5883 ret = 1;
5884 if (!pp && !(pp = sctp_bucket_create(head, snum)))
5885 goto fail_unlock;
5886
5887
5888
5889
5890
5891 if (hlist_empty(&pp->owner)) {
5892 if (sk->sk_reuse && sk->sk_state != SCTP_SS_LISTENING)
5893 pp->fastreuse = 1;
5894 else
5895 pp->fastreuse = 0;
5896 } else if (pp->fastreuse &&
5897 (!sk->sk_reuse || sk->sk_state == SCTP_SS_LISTENING))
5898 pp->fastreuse = 0;
5899
5900
5901
5902
5903
5904success:
5905 if (!sctp_sk(sk)->bind_hash) {
5906 inet_sk(sk)->inet_num = snum;
5907 sk_add_bind_node(sk, &pp->owner);
5908 sctp_sk(sk)->bind_hash = pp;
5909 }
5910 ret = 0;
5911
5912fail_unlock:
5913 sctp_spin_unlock(&head->lock);
5914
5915fail:
5916 sctp_local_bh_enable();
5917 return ret;
5918}
5919
5920
5921
5922
5923static int sctp_get_port(struct sock *sk, unsigned short snum)
5924{
5925 long ret;
5926 union sctp_addr addr;
5927 struct sctp_af *af = sctp_sk(sk)->pf->af;
5928
5929
5930 af->from_sk(&addr, sk);
5931 addr.v4.sin_port = htons(snum);
5932
5933
5934 ret = sctp_get_port_local(sk, &addr);
5935
5936 return ret ? 1 : 0;
5937}
5938
5939
5940
5941
5942SCTP_STATIC int sctp_listen_start(struct sock *sk, int backlog)
5943{
5944 struct sctp_sock *sp = sctp_sk(sk);
5945 struct sctp_endpoint *ep = sp->ep;
5946 struct crypto_hash *tfm = NULL;
5947
5948
5949 if (!sctp_sk(sk)->hmac && sctp_hmac_alg) {
5950 tfm = crypto_alloc_hash(sctp_hmac_alg, 0, CRYPTO_ALG_ASYNC);
5951 if (IS_ERR(tfm)) {
5952 net_info_ratelimited("failed to load transform for %s: %ld\n",
5953 sctp_hmac_alg, PTR_ERR(tfm));
5954 return -ENOSYS;
5955 }
5956 sctp_sk(sk)->hmac = tfm;
5957 }
5958
5959
5960
5961
5962
5963
5964
5965
5966
5967
5968
5969
5970 sk->sk_state = SCTP_SS_LISTENING;
5971 if (!ep->base.bind_addr.port) {
5972 if (sctp_autobind(sk))
5973 return -EAGAIN;
5974 } else {
5975 if (sctp_get_port(sk, inet_sk(sk)->inet_num)) {
5976 sk->sk_state = SCTP_SS_CLOSED;
5977 return -EADDRINUSE;
5978 }
5979 }
5980
5981 sk->sk_max_ack_backlog = backlog;
5982 sctp_hash_endpoint(ep);
5983 return 0;
5984}
5985
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996
5997
5998
5999
6000int sctp_inet_listen(struct socket *sock, int backlog)
6001{
6002 struct sock *sk = sock->sk;
6003 struct sctp_endpoint *ep = sctp_sk(sk)->ep;
6004 int err = -EINVAL;
6005
6006 if (unlikely(backlog < 0))
6007 return err;
6008
6009 sctp_lock_sock(sk);
6010
6011
6012 if (sctp_style(sk, UDP_HIGH_BANDWIDTH))
6013 goto out;
6014
6015 if (sock->state != SS_UNCONNECTED)
6016 goto out;
6017
6018
6019 if (!backlog) {
6020 if (sctp_sstate(sk, CLOSED))
6021 goto out;
6022
6023 err = 0;
6024 sctp_unhash_endpoint(ep);
6025 sk->sk_state = SCTP_SS_CLOSED;
6026 if (sk->sk_reuse)
6027 sctp_sk(sk)->bind_hash->fastreuse = 1;
6028 goto out;
6029 }
6030
6031
6032 if (sctp_sstate(sk, LISTENING))
6033 sk->sk_max_ack_backlog = backlog;
6034 else {
6035 err = sctp_listen_start(sk, backlog);
6036 if (err)
6037 goto out;
6038 }
6039
6040 err = 0;
6041out:
6042 sctp_release_sock(sk);
6043 return err;
6044}
6045
6046
6047
6048
6049
6050
6051
6052
6053
6054
6055
6056
6057
6058
6059unsigned int sctp_poll(struct file *file, struct socket *sock, poll_table *wait)
6060{
6061 struct sock *sk = sock->sk;
6062 struct sctp_sock *sp = sctp_sk(sk);
6063 unsigned int mask;
6064
6065 poll_wait(file, sk_sleep(sk), wait);
6066
6067
6068
6069
6070 if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING))
6071 return (!list_empty(&sp->ep->asocs)) ?
6072 (POLLIN | POLLRDNORM) : 0;
6073
6074 mask = 0;
6075
6076
6077 if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue))
6078 mask |= POLLERR;
6079 if (sk->sk_shutdown & RCV_SHUTDOWN)
6080 mask |= POLLRDHUP | POLLIN | POLLRDNORM;
6081 if (sk->sk_shutdown == SHUTDOWN_MASK)
6082 mask |= POLLHUP;
6083
6084
6085 if (!skb_queue_empty(&sk->sk_receive_queue))
6086 mask |= POLLIN | POLLRDNORM;
6087
6088
6089 if (!sctp_style(sk, UDP) && sctp_sstate(sk, CLOSED))
6090 return mask;
6091
6092
6093 if (sctp_writeable(sk)) {
6094 mask |= POLLOUT | POLLWRNORM;
6095 } else {
6096 set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags);
6097
6098
6099
6100
6101
6102
6103
6104
6105 if (sctp_writeable(sk))
6106 mask |= POLLOUT | POLLWRNORM;
6107 }
6108 return mask;
6109}
6110
6111
6112
6113
6114
6115static struct sctp_bind_bucket *sctp_bucket_create(
6116 struct sctp_bind_hashbucket *head, unsigned short snum)
6117{
6118 struct sctp_bind_bucket *pp;
6119
6120 pp = kmem_cache_alloc(sctp_bucket_cachep, GFP_ATOMIC);
6121 if (pp) {
6122 SCTP_DBG_OBJCNT_INC(bind_bucket);
6123 pp->port = snum;
6124 pp->fastreuse = 0;
6125 INIT_HLIST_HEAD(&pp->owner);
6126 hlist_add_head(&pp->node, &head->chain);
6127 }
6128 return pp;
6129}
6130
6131
6132static void sctp_bucket_destroy(struct sctp_bind_bucket *pp)
6133{
6134 if (pp && hlist_empty(&pp->owner)) {
6135 __hlist_del(&pp->node);
6136 kmem_cache_free(sctp_bucket_cachep, pp);
6137 SCTP_DBG_OBJCNT_DEC(bind_bucket);
6138 }
6139}
6140
6141
6142static inline void __sctp_put_port(struct sock *sk)
6143{
6144 struct sctp_bind_hashbucket *head =
6145 &sctp_port_hashtable[sctp_phashfn(inet_sk(sk)->inet_num)];
6146 struct sctp_bind_bucket *pp;
6147
6148 sctp_spin_lock(&head->lock);
6149 pp = sctp_sk(sk)->bind_hash;
6150 __sk_del_bind_node(sk);
6151 sctp_sk(sk)->bind_hash = NULL;
6152 inet_sk(sk)->inet_num = 0;
6153 sctp_bucket_destroy(pp);
6154 sctp_spin_unlock(&head->lock);
6155}
6156
6157void sctp_put_port(struct sock *sk)
6158{
6159 sctp_local_bh_disable();
6160 __sctp_put_port(sk);
6161 sctp_local_bh_enable();
6162}
6163
6164
6165
6166
6167
6168
6169
6170static int sctp_autobind(struct sock *sk)
6171{
6172 union sctp_addr autoaddr;
6173 struct sctp_af *af;
6174 __be16 port;
6175
6176
6177 af = sctp_sk(sk)->pf->af;
6178
6179 port = htons(inet_sk(sk)->inet_num);
6180 af->inaddr_any(&autoaddr, port);
6181
6182 return sctp_do_bind(sk, &autoaddr, af->sockaddr_len);
6183}
6184
6185
6186
6187
6188
6189
6190
6191
6192
6193
6194
6195
6196
6197
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6215
6216
6217
6218
6219
6220
6221
6222
6223
6224SCTP_STATIC int sctp_msghdr_parse(const struct msghdr *msg,
6225 sctp_cmsgs_t *cmsgs)
6226{
6227 struct cmsghdr *cmsg;
6228 struct msghdr *my_msg = (struct msghdr *)msg;
6229
6230 for (cmsg = CMSG_FIRSTHDR(msg);
6231 cmsg != NULL;
6232 cmsg = CMSG_NXTHDR(my_msg, cmsg)) {
6233 if (!CMSG_OK(my_msg, cmsg))
6234 return -EINVAL;
6235
6236
6237 if (cmsg->cmsg_level != IPPROTO_SCTP)
6238 continue;
6239
6240
6241 switch (cmsg->cmsg_type) {
6242 case SCTP_INIT:
6243
6244
6245
6246
6247
6248
6249
6250
6251
6252
6253
6254
6255
6256 if (cmsg->cmsg_len !=
6257 CMSG_LEN(sizeof(struct sctp_initmsg)))
6258 return -EINVAL;
6259 cmsgs->init = (struct sctp_initmsg *)CMSG_DATA(cmsg);
6260 break;
6261
6262 case SCTP_SNDRCV:
6263
6264
6265
6266
6267
6268
6269
6270
6271
6272
6273
6274 if (cmsg->cmsg_len !=
6275 CMSG_LEN(sizeof(struct sctp_sndrcvinfo)))
6276 return -EINVAL;
6277
6278 cmsgs->info =
6279 (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg);
6280
6281
6282 if (cmsgs->info->sinfo_flags &
6283 ~(SCTP_UNORDERED | SCTP_ADDR_OVER |
6284 SCTP_ABORT | SCTP_EOF))
6285 return -EINVAL;
6286 break;
6287
6288 default:
6289 return -EINVAL;
6290 }
6291 }
6292 return 0;
6293}
6294
6295
6296
6297
6298
6299
6300static int sctp_wait_for_packet(struct sock * sk, int *err, long *timeo_p)
6301{
6302 int error;
6303 DEFINE_WAIT(wait);
6304
6305 prepare_to_wait_exclusive(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
6306
6307
6308 error = sock_error(sk);
6309 if (error)
6310 goto out;
6311
6312 if (!skb_queue_empty(&sk->sk_receive_queue))
6313 goto ready;
6314
6315
6316 if (sk->sk_shutdown & RCV_SHUTDOWN)
6317 goto out;
6318
6319
6320
6321
6322 error = -ENOTCONN;
6323
6324
6325 if (list_empty(&sctp_sk(sk)->ep->asocs) && !sctp_sstate(sk, LISTENING))
6326 goto out;
6327
6328
6329 if (signal_pending(current))
6330 goto interrupted;
6331
6332
6333
6334
6335
6336
6337 sctp_release_sock(sk);
6338 *timeo_p = schedule_timeout(*timeo_p);
6339 sctp_lock_sock(sk);
6340
6341ready:
6342 finish_wait(sk_sleep(sk), &wait);
6343 return 0;
6344
6345interrupted:
6346 error = sock_intr_errno(*timeo_p);
6347
6348out:
6349 finish_wait(sk_sleep(sk), &wait);
6350 *err = error;
6351 return error;
6352}
6353
6354
6355
6356
6357
6358static struct sk_buff *sctp_skb_recv_datagram(struct sock *sk, int flags,
6359 int noblock, int *err)
6360{
6361 int error;
6362 struct sk_buff *skb;
6363 long timeo;
6364
6365 timeo = sock_rcvtimeo(sk, noblock);
6366
6367 SCTP_DEBUG_PRINTK("Timeout: timeo: %ld, MAX: %ld.\n",
6368 timeo, MAX_SCHEDULE_TIMEOUT);
6369
6370 do {
6371
6372
6373
6374
6375
6376
6377
6378 if (flags & MSG_PEEK) {
6379 spin_lock_bh(&sk->sk_receive_queue.lock);
6380 skb = skb_peek(&sk->sk_receive_queue);
6381 if (skb)
6382 atomic_inc(&skb->users);
6383 spin_unlock_bh(&sk->sk_receive_queue.lock);
6384 } else {
6385 skb = skb_dequeue(&sk->sk_receive_queue);
6386 }
6387
6388 if (skb)
6389 return skb;
6390
6391
6392 error = sock_error(sk);
6393 if (error)
6394 goto no_packet;
6395
6396 if (sk->sk_shutdown & RCV_SHUTDOWN)
6397 break;
6398
6399
6400 error = -EAGAIN;
6401 if (!timeo)
6402 goto no_packet;
6403 } while (sctp_wait_for_packet(sk, err, &timeo) == 0);
6404
6405 return NULL;
6406
6407no_packet:
6408 *err = error;
6409 return NULL;
6410}
6411
6412
6413static void __sctp_write_space(struct sctp_association *asoc)
6414{
6415 struct sock *sk = asoc->base.sk;
6416 struct socket *sock = sk->sk_socket;
6417
6418 if ((sctp_wspace(asoc) > 0) && sock) {
6419 if (waitqueue_active(&asoc->wait))
6420 wake_up_interruptible(&asoc->wait);
6421
6422 if (sctp_writeable(sk)) {
6423 wait_queue_head_t *wq = sk_sleep(sk);
6424
6425 if (wq && waitqueue_active(wq))
6426 wake_up_interruptible(wq);
6427
6428
6429
6430
6431
6432 if (!(sk->sk_shutdown & SEND_SHUTDOWN))
6433 sock_wake_async(sock,
6434 SOCK_WAKE_SPACE, POLL_OUT);
6435 }
6436 }
6437}
6438
6439
6440
6441
6442
6443static void sctp_wfree(struct sk_buff *skb)
6444{
6445 struct sctp_association *asoc;
6446 struct sctp_chunk *chunk;
6447 struct sock *sk;
6448
6449
6450 chunk = *((struct sctp_chunk **)(skb->cb));
6451 asoc = chunk->asoc;
6452 sk = asoc->base.sk;
6453 asoc->sndbuf_used -= SCTP_DATA_SNDSIZE(chunk) +
6454 sizeof(struct sk_buff) +
6455 sizeof(struct sctp_chunk);
6456
6457 atomic_sub(sizeof(struct sctp_chunk), &sk->sk_wmem_alloc);
6458
6459
6460
6461
6462 sk->sk_wmem_queued -= skb->truesize;
6463 sk_mem_uncharge(sk, skb->truesize);
6464
6465 sock_wfree(skb);
6466 __sctp_write_space(asoc);
6467
6468 sctp_association_put(asoc);
6469}
6470
6471
6472
6473
6474
6475
6476void sctp_sock_rfree(struct sk_buff *skb)
6477{
6478 struct sock *sk = skb->sk;
6479 struct sctp_ulpevent *event = sctp_skb2event(skb);
6480
6481 atomic_sub(event->rmem_len, &sk->sk_rmem_alloc);
6482
6483
6484
6485
6486 sk_mem_uncharge(sk, event->rmem_len);
6487}
6488
6489
6490
6491static int sctp_wait_for_sndbuf(struct sctp_association *asoc, long *timeo_p,
6492 size_t msg_len)
6493{
6494 struct sock *sk = asoc->base.sk;
6495 int err = 0;
6496 long current_timeo = *timeo_p;
6497 DEFINE_WAIT(wait);
6498
6499 SCTP_DEBUG_PRINTK("wait_for_sndbuf: asoc=%p, timeo=%ld, msg_len=%zu\n",
6500 asoc, (long)(*timeo_p), msg_len);
6501
6502
6503 sctp_association_hold(asoc);
6504
6505
6506 for (;;) {
6507 prepare_to_wait_exclusive(&asoc->wait, &wait,
6508 TASK_INTERRUPTIBLE);
6509 if (!*timeo_p)
6510 goto do_nonblock;
6511 if (sk->sk_err || asoc->state >= SCTP_STATE_SHUTDOWN_PENDING ||
6512 asoc->base.dead)
6513 goto do_error;
6514 if (signal_pending(current))
6515 goto do_interrupted;
6516 if (msg_len <= sctp_wspace(asoc))
6517 break;
6518
6519
6520
6521
6522 sctp_release_sock(sk);
6523 current_timeo = schedule_timeout(current_timeo);
6524 BUG_ON(sk != asoc->base.sk);
6525 sctp_lock_sock(sk);
6526
6527 *timeo_p = current_timeo;
6528 }
6529
6530out:
6531 finish_wait(&asoc->wait, &wait);
6532
6533
6534 sctp_association_put(asoc);
6535
6536 return err;
6537
6538do_error:
6539 err = -EPIPE;
6540 goto out;
6541
6542do_interrupted:
6543 err = sock_intr_errno(*timeo_p);
6544 goto out;
6545
6546do_nonblock:
6547 err = -EAGAIN;
6548 goto out;
6549}
6550
6551void sctp_data_ready(struct sock *sk, int len)
6552{
6553 struct socket_wq *wq;
6554
6555 rcu_read_lock();
6556 wq = rcu_dereference(sk->sk_wq);
6557 if (wq_has_sleeper(wq))
6558 wake_up_interruptible_sync_poll(&wq->wait, POLLIN |
6559 POLLRDNORM | POLLRDBAND);
6560 sk_wake_async(sk, SOCK_WAKE_WAITD, POLL_IN);
6561 rcu_read_unlock();
6562}
6563
6564
6565void sctp_write_space(struct sock *sk)
6566{
6567 struct sctp_association *asoc;
6568
6569
6570 list_for_each_entry(asoc, &((sctp_sk(sk))->ep->asocs), asocs) {
6571 __sctp_write_space(asoc);
6572 }
6573}
6574
6575
6576
6577
6578
6579
6580
6581
6582
6583
6584
6585
6586static int sctp_writeable(struct sock *sk)
6587{
6588 int amt = 0;
6589
6590 amt = sk->sk_sndbuf - sk_wmem_alloc_get(sk);
6591 if (amt < 0)
6592 amt = 0;
6593 return amt;
6594}
6595
6596
6597
6598
6599static int sctp_wait_for_connect(struct sctp_association *asoc, long *timeo_p)
6600{
6601 struct sock *sk = asoc->base.sk;
6602 int err = 0;
6603 long current_timeo = *timeo_p;
6604 DEFINE_WAIT(wait);
6605
6606 SCTP_DEBUG_PRINTK("%s: asoc=%p, timeo=%ld\n", __func__, asoc,
6607 (long)(*timeo_p));
6608
6609
6610 sctp_association_hold(asoc);
6611
6612 for (;;) {
6613 prepare_to_wait_exclusive(&asoc->wait, &wait,
6614 TASK_INTERRUPTIBLE);
6615 if (!*timeo_p)
6616 goto do_nonblock;
6617 if (sk->sk_shutdown & RCV_SHUTDOWN)
6618 break;
6619 if (sk->sk_err || asoc->state >= SCTP_STATE_SHUTDOWN_PENDING ||
6620 asoc->base.dead)
6621 goto do_error;
6622 if (signal_pending(current))
6623 goto do_interrupted;
6624
6625 if (sctp_state(asoc, ESTABLISHED))
6626 break;
6627
6628
6629
6630
6631 sctp_release_sock(sk);
6632 current_timeo = schedule_timeout(current_timeo);
6633 sctp_lock_sock(sk);
6634
6635 *timeo_p = current_timeo;
6636 }
6637
6638out:
6639 finish_wait(&asoc->wait, &wait);
6640
6641
6642 sctp_association_put(asoc);
6643
6644 return err;
6645
6646do_error:
6647 if (asoc->init_err_counter + 1 > asoc->max_init_attempts)
6648 err = -ETIMEDOUT;
6649 else
6650 err = -ECONNREFUSED;
6651 goto out;
6652
6653do_interrupted:
6654 err = sock_intr_errno(*timeo_p);
6655 goto out;
6656
6657do_nonblock:
6658 err = -EINPROGRESS;
6659 goto out;
6660}
6661
6662static int sctp_wait_for_accept(struct sock *sk, long timeo)
6663{
6664 struct sctp_endpoint *ep;
6665 int err = 0;
6666 DEFINE_WAIT(wait);
6667
6668 ep = sctp_sk(sk)->ep;
6669
6670
6671 for (;;) {
6672 prepare_to_wait_exclusive(sk_sleep(sk), &wait,
6673 TASK_INTERRUPTIBLE);
6674
6675 if (list_empty(&ep->asocs)) {
6676 sctp_release_sock(sk);
6677 timeo = schedule_timeout(timeo);
6678 sctp_lock_sock(sk);
6679 }
6680
6681 err = -EINVAL;
6682 if (!sctp_sstate(sk, LISTENING))
6683 break;
6684
6685 err = 0;
6686 if (!list_empty(&ep->asocs))
6687 break;
6688
6689 err = sock_intr_errno(timeo);
6690 if (signal_pending(current))
6691 break;
6692
6693 err = -EAGAIN;
6694 if (!timeo)
6695 break;
6696 }
6697
6698 finish_wait(sk_sleep(sk), &wait);
6699
6700 return err;
6701}
6702
6703static void sctp_wait_for_close(struct sock *sk, long timeout)
6704{
6705 DEFINE_WAIT(wait);
6706
6707 do {
6708 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
6709 if (list_empty(&sctp_sk(sk)->ep->asocs))
6710 break;
6711 sctp_release_sock(sk);
6712 timeout = schedule_timeout(timeout);
6713 sctp_lock_sock(sk);
6714 } while (!signal_pending(current) && timeout);
6715
6716 finish_wait(sk_sleep(sk), &wait);
6717}
6718
6719static void sctp_skb_set_owner_r_frag(struct sk_buff *skb, struct sock *sk)
6720{
6721 struct sk_buff *frag;
6722
6723 if (!skb->data_len)
6724 goto done;
6725
6726
6727 skb_walk_frags(skb, frag)
6728 sctp_skb_set_owner_r_frag(frag, sk);
6729
6730done:
6731 sctp_skb_set_owner_r(skb, sk);
6732}
6733
6734void sctp_copy_sock(struct sock *newsk, struct sock *sk,
6735 struct sctp_association *asoc)
6736{
6737 struct inet_sock *inet = inet_sk(sk);
6738 struct inet_sock *newinet;
6739
6740 newsk->sk_type = sk->sk_type;
6741 newsk->sk_bound_dev_if = sk->sk_bound_dev_if;
6742 newsk->sk_flags = sk->sk_flags;
6743 newsk->sk_no_check = sk->sk_no_check;
6744 newsk->sk_reuse = sk->sk_reuse;
6745
6746 newsk->sk_shutdown = sk->sk_shutdown;
6747 newsk->sk_destruct = inet_sock_destruct;
6748 newsk->sk_family = sk->sk_family;
6749 newsk->sk_protocol = IPPROTO_SCTP;
6750 newsk->sk_backlog_rcv = sk->sk_prot->backlog_rcv;
6751 newsk->sk_sndbuf = sk->sk_sndbuf;
6752 newsk->sk_rcvbuf = sk->sk_rcvbuf;
6753 newsk->sk_lingertime = sk->sk_lingertime;
6754 newsk->sk_rcvtimeo = sk->sk_rcvtimeo;
6755 newsk->sk_sndtimeo = sk->sk_sndtimeo;
6756
6757 newinet = inet_sk(newsk);
6758
6759
6760
6761
6762 newinet->inet_sport = inet->inet_sport;
6763 newinet->inet_saddr = inet->inet_saddr;
6764 newinet->inet_rcv_saddr = inet->inet_rcv_saddr;
6765 newinet->inet_dport = htons(asoc->peer.port);
6766 newinet->pmtudisc = inet->pmtudisc;
6767 newinet->inet_id = asoc->next_tsn ^ jiffies;
6768
6769 newinet->uc_ttl = inet->uc_ttl;
6770 newinet->mc_loop = 1;
6771 newinet->mc_ttl = 1;
6772 newinet->mc_index = 0;
6773 newinet->mc_list = NULL;
6774}
6775
6776
6777
6778
6779static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk,
6780 struct sctp_association *assoc,
6781 sctp_socket_type_t type)
6782{
6783 struct sctp_sock *oldsp = sctp_sk(oldsk);
6784 struct sctp_sock *newsp = sctp_sk(newsk);
6785 struct sctp_bind_bucket *pp;
6786 struct sctp_endpoint *newep = newsp->ep;
6787 struct sk_buff *skb, *tmp;
6788 struct sctp_ulpevent *event;
6789 struct sctp_bind_hashbucket *head;
6790 struct list_head tmplist;
6791
6792
6793
6794
6795 newsk->sk_sndbuf = oldsk->sk_sndbuf;
6796 newsk->sk_rcvbuf = oldsk->sk_rcvbuf;
6797
6798 if (oldsp->do_auto_asconf) {
6799 memcpy(&tmplist, &newsp->auto_asconf_list, sizeof(tmplist));
6800 inet_sk_copy_descendant(newsk, oldsk);
6801 memcpy(&newsp->auto_asconf_list, &tmplist, sizeof(tmplist));
6802 } else
6803 inet_sk_copy_descendant(newsk, oldsk);
6804
6805
6806
6807
6808 newsp->ep = newep;
6809 newsp->hmac = NULL;
6810
6811
6812 head = &sctp_port_hashtable[sctp_phashfn(inet_sk(oldsk)->inet_num)];
6813 sctp_local_bh_disable();
6814 sctp_spin_lock(&head->lock);
6815 pp = sctp_sk(oldsk)->bind_hash;
6816 sk_add_bind_node(newsk, &pp->owner);
6817 sctp_sk(newsk)->bind_hash = pp;
6818 inet_sk(newsk)->inet_num = inet_sk(oldsk)->inet_num;
6819 sctp_spin_unlock(&head->lock);
6820 sctp_local_bh_enable();
6821
6822
6823
6824
6825 sctp_bind_addr_dup(&newsp->ep->base.bind_addr,
6826 &oldsp->ep->base.bind_addr, GFP_KERNEL);
6827
6828
6829
6830
6831 sctp_skb_for_each(skb, &oldsk->sk_receive_queue, tmp) {
6832 event = sctp_skb2event(skb);
6833 if (event->asoc == assoc) {
6834 __skb_unlink(skb, &oldsk->sk_receive_queue);
6835 __skb_queue_tail(&newsk->sk_receive_queue, skb);
6836 sctp_skb_set_owner_r_frag(skb, newsk);
6837 }
6838 }
6839
6840
6841
6842
6843
6844
6845
6846 skb_queue_head_init(&newsp->pd_lobby);
6847 atomic_set(&sctp_sk(newsk)->pd_mode, assoc->ulpq.pd_mode);
6848
6849 if (atomic_read(&sctp_sk(oldsk)->pd_mode)) {
6850 struct sk_buff_head *queue;
6851
6852
6853 if (assoc->ulpq.pd_mode) {
6854 queue = &newsp->pd_lobby;
6855 } else
6856 queue = &newsk->sk_receive_queue;
6857
6858
6859
6860
6861 sctp_skb_for_each(skb, &oldsp->pd_lobby, tmp) {
6862 event = sctp_skb2event(skb);
6863 if (event->asoc == assoc) {
6864 __skb_unlink(skb, &oldsp->pd_lobby);
6865 __skb_queue_tail(queue, skb);
6866 sctp_skb_set_owner_r_frag(skb, newsk);
6867 }
6868 }
6869
6870
6871
6872
6873 if (assoc->ulpq.pd_mode)
6874 sctp_clear_pd(oldsk, NULL);
6875
6876 }
6877
6878 sctp_skb_for_each(skb, &assoc->ulpq.reasm, tmp)
6879 sctp_skb_set_owner_r_frag(skb, newsk);
6880
6881 sctp_skb_for_each(skb, &assoc->ulpq.lobby, tmp)
6882 sctp_skb_set_owner_r_frag(skb, newsk);
6883
6884
6885
6886
6887
6888 newsp->type = type;
6889
6890
6891
6892
6893
6894
6895
6896
6897
6898
6899 lock_sock_nested(newsk, SINGLE_DEPTH_NESTING);
6900 sctp_assoc_migrate(assoc, newsk);
6901
6902
6903
6904
6905 if (sctp_state(assoc, CLOSED) && sctp_style(newsk, TCP))
6906 newsk->sk_shutdown |= RCV_SHUTDOWN;
6907
6908 newsk->sk_state = SCTP_SS_ESTABLISHED;
6909 sctp_release_sock(newsk);
6910}
6911
6912
6913
6914struct proto sctp_prot = {
6915 .name = "SCTP",
6916 .owner = THIS_MODULE,
6917 .close = sctp_close,
6918 .connect = sctp_connect,
6919 .disconnect = sctp_disconnect,
6920 .accept = sctp_accept,
6921 .ioctl = sctp_ioctl,
6922 .init = sctp_init_sock,
6923 .destroy = sctp_destroy_sock,
6924 .shutdown = sctp_shutdown,
6925 .setsockopt = sctp_setsockopt,
6926 .getsockopt = sctp_getsockopt,
6927 .sendmsg = sctp_sendmsg,
6928 .recvmsg = sctp_recvmsg,
6929 .bind = sctp_bind,
6930 .backlog_rcv = sctp_backlog_rcv,
6931 .hash = sctp_hash,
6932 .unhash = sctp_unhash,
6933 .get_port = sctp_get_port,
6934 .obj_size = sizeof(struct sctp_sock),
6935 .sysctl_mem = sysctl_sctp_mem,
6936 .sysctl_rmem = sysctl_sctp_rmem,
6937 .sysctl_wmem = sysctl_sctp_wmem,
6938 .memory_pressure = &sctp_memory_pressure,
6939 .enter_memory_pressure = sctp_enter_memory_pressure,
6940 .memory_allocated = &sctp_memory_allocated,
6941 .sockets_allocated = &sctp_sockets_allocated,
6942};
6943
6944#if IS_ENABLED(CONFIG_IPV6)
6945
6946struct proto sctpv6_prot = {
6947 .name = "SCTPv6",
6948 .owner = THIS_MODULE,
6949 .close = sctp_close,
6950 .connect = sctp_connect,
6951 .disconnect = sctp_disconnect,
6952 .accept = sctp_accept,
6953 .ioctl = sctp_ioctl,
6954 .init = sctp_init_sock,
6955 .destroy = sctp_destroy_sock,
6956 .shutdown = sctp_shutdown,
6957 .setsockopt = sctp_setsockopt,
6958 .getsockopt = sctp_getsockopt,
6959 .sendmsg = sctp_sendmsg,
6960 .recvmsg = sctp_recvmsg,
6961 .bind = sctp_bind,
6962 .backlog_rcv = sctp_backlog_rcv,
6963 .hash = sctp_hash,
6964 .unhash = sctp_unhash,
6965 .get_port = sctp_get_port,
6966 .obj_size = sizeof(struct sctp6_sock),
6967 .sysctl_mem = sysctl_sctp_mem,
6968 .sysctl_rmem = sysctl_sctp_rmem,
6969 .sysctl_wmem = sysctl_sctp_wmem,
6970 .memory_pressure = &sctp_memory_pressure,
6971 .enter_memory_pressure = sctp_enter_memory_pressure,
6972 .memory_allocated = &sctp_memory_allocated,
6973 .sockets_allocated = &sctp_sockets_allocated,
6974};
6975#endif
6976