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