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