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