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