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