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