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