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#include <linux/module.h>
38#include <linux/types.h>
39#include <linux/net.h>
40#include <linux/socket.h>
41#include <linux/errno.h>
42#include <linux/mm.h>
43#include <linux/slab.h>
44#include <linux/poll.h>
45#include <linux/fcntl.h>
46#include <asm/string.h>
47#include <asm/atomic.h>
48#include <net/sock.h>
49
50#include <linux/tipc.h>
51#include <linux/tipc_config.h>
52#include <net/tipc/tipc_msg.h>
53#include <net/tipc/tipc_port.h>
54
55#include "core.h"
56
57#define SS_LISTENING -1
58#define SS_READY -2
59
60#define OVERLOAD_LIMIT_BASE 5000
61#define CONN_TIMEOUT_DEFAULT 8000
62
63struct tipc_sock {
64 struct sock sk;
65 struct tipc_port *p;
66 struct tipc_portid peer_name;
67};
68
69#define tipc_sk(sk) ((struct tipc_sock *)(sk))
70#define tipc_sk_port(sk) ((struct tipc_port *)(tipc_sk(sk)->p))
71
72static int backlog_rcv(struct sock *sk, struct sk_buff *skb);
73static u32 dispatch(struct tipc_port *tport, struct sk_buff *buf);
74static void wakeupdispatch(struct tipc_port *tport);
75
76static const struct proto_ops packet_ops;
77static const struct proto_ops stream_ops;
78static const struct proto_ops msg_ops;
79
80static struct proto tipc_proto;
81
82static int sockets_enabled = 0;
83
84static atomic_t tipc_queue_size = ATOMIC_INIT(0);
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137static void advance_rx_queue(struct sock *sk)
138{
139 buf_discard(__skb_dequeue(&sk->sk_receive_queue));
140 atomic_dec(&tipc_queue_size);
141}
142
143
144
145
146
147
148
149static void discard_rx_queue(struct sock *sk)
150{
151 struct sk_buff *buf;
152
153 while ((buf = __skb_dequeue(&sk->sk_receive_queue))) {
154 atomic_dec(&tipc_queue_size);
155 buf_discard(buf);
156 }
157}
158
159
160
161
162
163
164
165static void reject_rx_queue(struct sock *sk)
166{
167 struct sk_buff *buf;
168
169 while ((buf = __skb_dequeue(&sk->sk_receive_queue))) {
170 tipc_reject_msg(buf, TIPC_ERR_NO_PORT);
171 atomic_dec(&tipc_queue_size);
172 }
173}
174
175
176
177
178
179
180
181
182
183
184
185
186
187static int tipc_create(struct net *net, struct socket *sock, int protocol)
188{
189 const struct proto_ops *ops;
190 socket_state state;
191 struct sock *sk;
192 struct tipc_port *tp_ptr;
193
194
195
196 if (net != &init_net)
197 return -EAFNOSUPPORT;
198
199 if (unlikely(protocol != 0))
200 return -EPROTONOSUPPORT;
201
202 switch (sock->type) {
203 case SOCK_STREAM:
204 ops = &stream_ops;
205 state = SS_UNCONNECTED;
206 break;
207 case SOCK_SEQPACKET:
208 ops = &packet_ops;
209 state = SS_UNCONNECTED;
210 break;
211 case SOCK_DGRAM:
212 case SOCK_RDM:
213 ops = &msg_ops;
214 state = SS_READY;
215 break;
216 default:
217 return -EPROTOTYPE;
218 }
219
220
221
222 sk = sk_alloc(net, AF_TIPC, GFP_KERNEL, &tipc_proto);
223 if (sk == NULL)
224 return -ENOMEM;
225
226
227
228 tp_ptr = tipc_createport_raw(sk, &dispatch, &wakeupdispatch,
229 TIPC_LOW_IMPORTANCE);
230 if (unlikely(!tp_ptr)) {
231 sk_free(sk);
232 return -ENOMEM;
233 }
234
235
236
237 sock->ops = ops;
238 sock->state = state;
239
240 sock_init_data(sock, sk);
241 sk->sk_rcvtimeo = msecs_to_jiffies(CONN_TIMEOUT_DEFAULT);
242 sk->sk_backlog_rcv = backlog_rcv;
243 tipc_sk(sk)->p = tp_ptr;
244
245 spin_unlock_bh(tp_ptr->lock);
246
247 if (sock->state == SS_READY) {
248 tipc_set_portunreturnable(tp_ptr->ref, 1);
249 if (sock->type == SOCK_DGRAM)
250 tipc_set_portunreliable(tp_ptr->ref, 1);
251 }
252
253 atomic_inc(&tipc_user_count);
254 return 0;
255}
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274static int release(struct socket *sock)
275{
276 struct sock *sk = sock->sk;
277 struct tipc_port *tport;
278 struct sk_buff *buf;
279 int res;
280
281
282
283
284
285
286 if (sk == NULL)
287 return 0;
288
289 tport = tipc_sk_port(sk);
290 lock_sock(sk);
291
292
293
294
295
296
297 while (sock->state != SS_DISCONNECTING) {
298 buf = __skb_dequeue(&sk->sk_receive_queue);
299 if (buf == NULL)
300 break;
301 atomic_dec(&tipc_queue_size);
302 if (TIPC_SKB_CB(buf)->handle != msg_data(buf_msg(buf)))
303 buf_discard(buf);
304 else {
305 if ((sock->state == SS_CONNECTING) ||
306 (sock->state == SS_CONNECTED)) {
307 sock->state = SS_DISCONNECTING;
308 tipc_disconnect(tport->ref);
309 }
310 tipc_reject_msg(buf, TIPC_ERR_NO_PORT);
311 }
312 }
313
314
315
316
317
318
319 res = tipc_deleteport(tport->ref);
320
321
322
323 discard_rx_queue(sk);
324
325
326
327 sock->state = SS_DISCONNECTING;
328 release_sock(sk);
329
330 sock_put(sk);
331 sock->sk = NULL;
332
333 atomic_dec(&tipc_user_count);
334 return res;
335}
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353static int bind(struct socket *sock, struct sockaddr *uaddr, int uaddr_len)
354{
355 struct sockaddr_tipc *addr = (struct sockaddr_tipc *)uaddr;
356 u32 portref = tipc_sk_port(sock->sk)->ref;
357
358 if (unlikely(!uaddr_len))
359 return tipc_withdraw(portref, 0, NULL);
360
361 if (uaddr_len < sizeof(struct sockaddr_tipc))
362 return -EINVAL;
363 if (addr->family != AF_TIPC)
364 return -EAFNOSUPPORT;
365
366 if (addr->addrtype == TIPC_ADDR_NAME)
367 addr->addr.nameseq.upper = addr->addr.nameseq.lower;
368 else if (addr->addrtype != TIPC_ADDR_NAMESEQ)
369 return -EAFNOSUPPORT;
370
371 return (addr->scope > 0) ?
372 tipc_publish(portref, addr->scope, &addr->addr.nameseq) :
373 tipc_withdraw(portref, -addr->scope, &addr->addr.nameseq);
374}
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390static int get_name(struct socket *sock, struct sockaddr *uaddr,
391 int *uaddr_len, int peer)
392{
393 struct sockaddr_tipc *addr = (struct sockaddr_tipc *)uaddr;
394 struct tipc_sock *tsock = tipc_sk(sock->sk);
395
396 memset(addr, 0, sizeof(*addr));
397 if (peer) {
398 if ((sock->state != SS_CONNECTED) &&
399 ((peer != 2) || (sock->state != SS_DISCONNECTING)))
400 return -ENOTCONN;
401 addr->addr.id.ref = tsock->peer_name.ref;
402 addr->addr.id.node = tsock->peer_name.node;
403 } else {
404 tipc_ownidentity(tsock->p->ref, &addr->addr.id);
405 }
406
407 *uaddr_len = sizeof(*addr);
408 addr->addrtype = TIPC_ADDR_ID;
409 addr->family = AF_TIPC;
410 addr->scope = 0;
411 addr->addr.name.domain = 0;
412
413 return 0;
414}
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442static unsigned int poll(struct file *file, struct socket *sock,
443 poll_table *wait)
444{
445 struct sock *sk = sock->sk;
446 u32 mask;
447
448 poll_wait(file, sk->sk_sleep, wait);
449
450 if (!skb_queue_empty(&sk->sk_receive_queue) ||
451 (sock->state == SS_UNCONNECTED) ||
452 (sock->state == SS_DISCONNECTING))
453 mask = (POLLRDNORM | POLLIN);
454 else
455 mask = 0;
456
457 if (sock->state == SS_DISCONNECTING)
458 mask |= POLLHUP;
459 else
460 mask |= POLLOUT;
461
462 return mask;
463}
464
465
466
467
468
469
470
471
472
473
474
475
476static int dest_name_check(struct sockaddr_tipc *dest, struct msghdr *m)
477{
478 struct tipc_cfg_msg_hdr hdr;
479
480 if (likely(dest->addr.name.name.type >= TIPC_RESERVED_TYPES))
481 return 0;
482 if (likely(dest->addr.name.name.type == TIPC_TOP_SRV))
483 return 0;
484 if (likely(dest->addr.name.name.type != TIPC_CFG_SRV))
485 return -EACCES;
486
487 if (copy_from_user(&hdr, m->msg_iov[0].iov_base, sizeof(hdr)))
488 return -EFAULT;
489 if ((ntohs(hdr.tcm_type) & 0xC000) && (!capable(CAP_NET_ADMIN)))
490 return -EACCES;
491
492 return 0;
493}
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510static int send_msg(struct kiocb *iocb, struct socket *sock,
511 struct msghdr *m, size_t total_len)
512{
513 struct sock *sk = sock->sk;
514 struct tipc_port *tport = tipc_sk_port(sk);
515 struct sockaddr_tipc *dest = (struct sockaddr_tipc *)m->msg_name;
516 int needs_conn;
517 int res = -EINVAL;
518
519 if (unlikely(!dest))
520 return -EDESTADDRREQ;
521 if (unlikely((m->msg_namelen < sizeof(*dest)) ||
522 (dest->family != AF_TIPC)))
523 return -EINVAL;
524
525 if (iocb)
526 lock_sock(sk);
527
528 needs_conn = (sock->state != SS_READY);
529 if (unlikely(needs_conn)) {
530 if (sock->state == SS_LISTENING) {
531 res = -EPIPE;
532 goto exit;
533 }
534 if (sock->state != SS_UNCONNECTED) {
535 res = -EISCONN;
536 goto exit;
537 }
538 if ((tport->published) ||
539 ((sock->type == SOCK_STREAM) && (total_len != 0))) {
540 res = -EOPNOTSUPP;
541 goto exit;
542 }
543 if (dest->addrtype == TIPC_ADDR_NAME) {
544 tport->conn_type = dest->addr.name.name.type;
545 tport->conn_instance = dest->addr.name.name.instance;
546 }
547
548
549
550 reject_rx_queue(sk);
551 }
552
553 do {
554 if (dest->addrtype == TIPC_ADDR_NAME) {
555 if ((res = dest_name_check(dest, m)))
556 break;
557 res = tipc_send2name(tport->ref,
558 &dest->addr.name.name,
559 dest->addr.name.domain,
560 m->msg_iovlen,
561 m->msg_iov);
562 }
563 else if (dest->addrtype == TIPC_ADDR_ID) {
564 res = tipc_send2port(tport->ref,
565 &dest->addr.id,
566 m->msg_iovlen,
567 m->msg_iov);
568 }
569 else if (dest->addrtype == TIPC_ADDR_MCAST) {
570 if (needs_conn) {
571 res = -EOPNOTSUPP;
572 break;
573 }
574 if ((res = dest_name_check(dest, m)))
575 break;
576 res = tipc_multicast(tport->ref,
577 &dest->addr.nameseq,
578 0,
579 m->msg_iovlen,
580 m->msg_iov);
581 }
582 if (likely(res != -ELINKCONG)) {
583 if (needs_conn && (res >= 0)) {
584 sock->state = SS_CONNECTING;
585 }
586 break;
587 }
588 if (m->msg_flags & MSG_DONTWAIT) {
589 res = -EWOULDBLOCK;
590 break;
591 }
592 release_sock(sk);
593 res = wait_event_interruptible(*sk->sk_sleep,
594 !tport->congested);
595 lock_sock(sk);
596 if (res)
597 break;
598 } while (1);
599
600exit:
601 if (iocb)
602 release_sock(sk);
603 return res;
604}
605
606
607
608
609
610
611
612
613
614
615
616
617
618static int send_packet(struct kiocb *iocb, struct socket *sock,
619 struct msghdr *m, size_t total_len)
620{
621 struct sock *sk = sock->sk;
622 struct tipc_port *tport = tipc_sk_port(sk);
623 struct sockaddr_tipc *dest = (struct sockaddr_tipc *)m->msg_name;
624 int res;
625
626
627
628 if (unlikely(dest))
629 return send_msg(iocb, sock, m, total_len);
630
631 if (iocb)
632 lock_sock(sk);
633
634 do {
635 if (unlikely(sock->state != SS_CONNECTED)) {
636 if (sock->state == SS_DISCONNECTING)
637 res = -EPIPE;
638 else
639 res = -ENOTCONN;
640 break;
641 }
642
643 res = tipc_send(tport->ref, m->msg_iovlen, m->msg_iov);
644 if (likely(res != -ELINKCONG)) {
645 break;
646 }
647 if (m->msg_flags & MSG_DONTWAIT) {
648 res = -EWOULDBLOCK;
649 break;
650 }
651 release_sock(sk);
652 res = wait_event_interruptible(*sk->sk_sleep,
653 (!tport->congested || !tport->connected));
654 lock_sock(sk);
655 if (res)
656 break;
657 } while (1);
658
659 if (iocb)
660 release_sock(sk);
661 return res;
662}
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677static int send_stream(struct kiocb *iocb, struct socket *sock,
678 struct msghdr *m, size_t total_len)
679{
680 struct sock *sk = sock->sk;
681 struct tipc_port *tport = tipc_sk_port(sk);
682 struct msghdr my_msg;
683 struct iovec my_iov;
684 struct iovec *curr_iov;
685 int curr_iovlen;
686 char __user *curr_start;
687 u32 hdr_size;
688 int curr_left;
689 int bytes_to_send;
690 int bytes_sent;
691 int res;
692
693 lock_sock(sk);
694
695
696
697 if (unlikely(sock->state != SS_CONNECTED)) {
698 if (sock->state == SS_UNCONNECTED) {
699 res = send_packet(NULL, sock, m, total_len);
700 goto exit;
701 } else if (sock->state == SS_DISCONNECTING) {
702 res = -EPIPE;
703 goto exit;
704 } else {
705 res = -ENOTCONN;
706 goto exit;
707 }
708 }
709
710 if (unlikely(m->msg_name)) {
711 res = -EISCONN;
712 goto exit;
713 }
714
715
716
717
718
719
720
721
722
723 curr_iov = m->msg_iov;
724 curr_iovlen = m->msg_iovlen;
725 my_msg.msg_iov = &my_iov;
726 my_msg.msg_iovlen = 1;
727 my_msg.msg_flags = m->msg_flags;
728 my_msg.msg_name = NULL;
729 bytes_sent = 0;
730
731 hdr_size = msg_hdr_sz(&tport->phdr);
732
733 while (curr_iovlen--) {
734 curr_start = curr_iov->iov_base;
735 curr_left = curr_iov->iov_len;
736
737 while (curr_left) {
738 bytes_to_send = tport->max_pkt - hdr_size;
739 if (bytes_to_send > TIPC_MAX_USER_MSG_SIZE)
740 bytes_to_send = TIPC_MAX_USER_MSG_SIZE;
741 if (curr_left < bytes_to_send)
742 bytes_to_send = curr_left;
743 my_iov.iov_base = curr_start;
744 my_iov.iov_len = bytes_to_send;
745 if ((res = send_packet(NULL, sock, &my_msg, 0)) < 0) {
746 if (bytes_sent)
747 res = bytes_sent;
748 goto exit;
749 }
750 curr_left -= bytes_to_send;
751 curr_start += bytes_to_send;
752 bytes_sent += bytes_to_send;
753 }
754
755 curr_iov++;
756 }
757 res = bytes_sent;
758exit:
759 release_sock(sk);
760 return res;
761}
762
763
764
765
766
767
768
769
770
771static int auto_connect(struct socket *sock, struct tipc_msg *msg)
772{
773 struct tipc_sock *tsock = tipc_sk(sock->sk);
774
775 if (msg_errcode(msg)) {
776 sock->state = SS_DISCONNECTING;
777 return -ECONNREFUSED;
778 }
779
780 tsock->peer_name.ref = msg_origport(msg);
781 tsock->peer_name.node = msg_orignode(msg);
782 tipc_connect2port(tsock->p->ref, &tsock->peer_name);
783 tipc_set_portimportance(tsock->p->ref, msg_importance(msg));
784 sock->state = SS_CONNECTED;
785 return 0;
786}
787
788
789
790
791
792
793
794
795
796static void set_orig_addr(struct msghdr *m, struct tipc_msg *msg)
797{
798 struct sockaddr_tipc *addr = (struct sockaddr_tipc *)m->msg_name;
799
800 if (addr) {
801 addr->family = AF_TIPC;
802 addr->addrtype = TIPC_ADDR_ID;
803 addr->addr.id.ref = msg_origport(msg);
804 addr->addr.id.node = msg_orignode(msg);
805 addr->addr.name.domain = 0;
806 addr->scope = 0;
807 m->msg_namelen = sizeof(struct sockaddr_tipc);
808 }
809}
810
811
812
813
814
815
816
817
818
819
820
821
822static int anc_data_recv(struct msghdr *m, struct tipc_msg *msg,
823 struct tipc_port *tport)
824{
825 u32 anc_data[3];
826 u32 err;
827 u32 dest_type;
828 int has_name;
829 int res;
830
831 if (likely(m->msg_controllen == 0))
832 return 0;
833
834
835
836 err = msg ? msg_errcode(msg) : 0;
837 if (unlikely(err)) {
838 anc_data[0] = err;
839 anc_data[1] = msg_data_sz(msg);
840 if ((res = put_cmsg(m, SOL_TIPC, TIPC_ERRINFO, 8, anc_data)))
841 return res;
842 if (anc_data[1] &&
843 (res = put_cmsg(m, SOL_TIPC, TIPC_RETDATA, anc_data[1],
844 msg_data(msg))))
845 return res;
846 }
847
848
849
850 dest_type = msg ? msg_type(msg) : TIPC_DIRECT_MSG;
851 switch (dest_type) {
852 case TIPC_NAMED_MSG:
853 has_name = 1;
854 anc_data[0] = msg_nametype(msg);
855 anc_data[1] = msg_namelower(msg);
856 anc_data[2] = msg_namelower(msg);
857 break;
858 case TIPC_MCAST_MSG:
859 has_name = 1;
860 anc_data[0] = msg_nametype(msg);
861 anc_data[1] = msg_namelower(msg);
862 anc_data[2] = msg_nameupper(msg);
863 break;
864 case TIPC_CONN_MSG:
865 has_name = (tport->conn_type != 0);
866 anc_data[0] = tport->conn_type;
867 anc_data[1] = tport->conn_instance;
868 anc_data[2] = tport->conn_instance;
869 break;
870 default:
871 has_name = 0;
872 }
873 if (has_name &&
874 (res = put_cmsg(m, SOL_TIPC, TIPC_DESTNAME, 12, anc_data)))
875 return res;
876
877 return 0;
878}
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893static int recv_msg(struct kiocb *iocb, struct socket *sock,
894 struct msghdr *m, size_t buf_len, int flags)
895{
896 struct sock *sk = sock->sk;
897 struct tipc_port *tport = tipc_sk_port(sk);
898 struct sk_buff *buf;
899 struct tipc_msg *msg;
900 unsigned int sz;
901 u32 err;
902 int res;
903
904
905
906 if (m->msg_iovlen != 1)
907 return -EOPNOTSUPP;
908
909 if (unlikely(!buf_len))
910 return -EINVAL;
911
912 lock_sock(sk);
913
914 if (unlikely(sock->state == SS_UNCONNECTED)) {
915 res = -ENOTCONN;
916 goto exit;
917 }
918
919restart:
920
921
922
923 while (skb_queue_empty(&sk->sk_receive_queue)) {
924 if (sock->state == SS_DISCONNECTING) {
925 res = -ENOTCONN;
926 goto exit;
927 }
928 if (flags & MSG_DONTWAIT) {
929 res = -EWOULDBLOCK;
930 goto exit;
931 }
932 release_sock(sk);
933 res = wait_event_interruptible(*sk->sk_sleep,
934 (!skb_queue_empty(&sk->sk_receive_queue) ||
935 (sock->state == SS_DISCONNECTING)));
936 lock_sock(sk);
937 if (res)
938 goto exit;
939 }
940
941
942
943 buf = skb_peek(&sk->sk_receive_queue);
944 msg = buf_msg(buf);
945 sz = msg_data_sz(msg);
946 err = msg_errcode(msg);
947
948
949
950 if (unlikely(sock->state == SS_CONNECTING)) {
951 res = auto_connect(sock, msg);
952 if (res)
953 goto exit;
954 }
955
956
957
958 if ((!sz) && (!err)) {
959 advance_rx_queue(sk);
960 goto restart;
961 }
962
963
964
965 set_orig_addr(m, msg);
966
967
968
969 res = anc_data_recv(m, msg, tport);
970 if (res)
971 goto exit;
972
973
974
975 if (!err) {
976 if (unlikely(buf_len < sz)) {
977 sz = buf_len;
978 m->msg_flags |= MSG_TRUNC;
979 }
980 if (unlikely(copy_to_user(m->msg_iov->iov_base, msg_data(msg),
981 sz))) {
982 res = -EFAULT;
983 goto exit;
984 }
985 res = sz;
986 } else {
987 if ((sock->state == SS_READY) ||
988 ((err == TIPC_CONN_SHUTDOWN) || m->msg_control))
989 res = 0;
990 else
991 res = -ECONNRESET;
992 }
993
994
995
996 if (likely(!(flags & MSG_PEEK))) {
997 if ((sock->state != SS_READY) &&
998 (++tport->conn_unacked >= TIPC_FLOW_CONTROL_WIN))
999 tipc_acknowledge(tport->ref, tport->conn_unacked);
1000 advance_rx_queue(sk);
1001 }
1002exit:
1003 release_sock(sk);
1004 return res;
1005}
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020static int recv_stream(struct kiocb *iocb, struct socket *sock,
1021 struct msghdr *m, size_t buf_len, int flags)
1022{
1023 struct sock *sk = sock->sk;
1024 struct tipc_port *tport = tipc_sk_port(sk);
1025 struct sk_buff *buf;
1026 struct tipc_msg *msg;
1027 unsigned int sz;
1028 int sz_to_copy;
1029 int sz_copied = 0;
1030 int needed;
1031 char __user *crs = m->msg_iov->iov_base;
1032 unsigned char *buf_crs;
1033 u32 err;
1034 int res = 0;
1035
1036
1037
1038 if (m->msg_iovlen != 1)
1039 return -EOPNOTSUPP;
1040
1041 if (unlikely(!buf_len))
1042 return -EINVAL;
1043
1044 lock_sock(sk);
1045
1046 if (unlikely((sock->state == SS_UNCONNECTED) ||
1047 (sock->state == SS_CONNECTING))) {
1048 res = -ENOTCONN;
1049 goto exit;
1050 }
1051
1052restart:
1053
1054
1055
1056 while (skb_queue_empty(&sk->sk_receive_queue)) {
1057 if (sock->state == SS_DISCONNECTING) {
1058 res = -ENOTCONN;
1059 goto exit;
1060 }
1061 if (flags & MSG_DONTWAIT) {
1062 res = -EWOULDBLOCK;
1063 goto exit;
1064 }
1065 release_sock(sk);
1066 res = wait_event_interruptible(*sk->sk_sleep,
1067 (!skb_queue_empty(&sk->sk_receive_queue) ||
1068 (sock->state == SS_DISCONNECTING)));
1069 lock_sock(sk);
1070 if (res)
1071 goto exit;
1072 }
1073
1074
1075
1076 buf = skb_peek(&sk->sk_receive_queue);
1077 msg = buf_msg(buf);
1078 sz = msg_data_sz(msg);
1079 err = msg_errcode(msg);
1080
1081
1082
1083 if ((!sz) && (!err)) {
1084 advance_rx_queue(sk);
1085 goto restart;
1086 }
1087
1088
1089
1090 if (sz_copied == 0) {
1091 set_orig_addr(m, msg);
1092 res = anc_data_recv(m, msg, tport);
1093 if (res)
1094 goto exit;
1095 }
1096
1097
1098
1099 if (!err) {
1100 buf_crs = (unsigned char *)(TIPC_SKB_CB(buf)->handle);
1101 sz = (unsigned char *)msg + msg_size(msg) - buf_crs;
1102
1103 needed = (buf_len - sz_copied);
1104 sz_to_copy = (sz <= needed) ? sz : needed;
1105 if (unlikely(copy_to_user(crs, buf_crs, sz_to_copy))) {
1106 res = -EFAULT;
1107 goto exit;
1108 }
1109 sz_copied += sz_to_copy;
1110
1111 if (sz_to_copy < sz) {
1112 if (!(flags & MSG_PEEK))
1113 TIPC_SKB_CB(buf)->handle = buf_crs + sz_to_copy;
1114 goto exit;
1115 }
1116
1117 crs += sz_to_copy;
1118 } else {
1119 if (sz_copied != 0)
1120 goto exit;
1121
1122 if ((err == TIPC_CONN_SHUTDOWN) || m->msg_control)
1123 res = 0;
1124 else
1125 res = -ECONNRESET;
1126 }
1127
1128
1129
1130 if (likely(!(flags & MSG_PEEK))) {
1131 if (unlikely(++tport->conn_unacked >= TIPC_FLOW_CONTROL_WIN))
1132 tipc_acknowledge(tport->ref, tport->conn_unacked);
1133 advance_rx_queue(sk);
1134 }
1135
1136
1137
1138 if ((sz_copied < buf_len)
1139 && (!skb_queue_empty(&sk->sk_receive_queue) ||
1140 (flags & MSG_WAITALL))
1141
1142 && (!(flags & MSG_PEEK))
1143 && (!err)
1144 )
1145 goto restart;
1146
1147exit:
1148 release_sock(sk);
1149 return sz_copied ? sz_copied : res;
1150}
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161static int rx_queue_full(struct tipc_msg *msg, u32 queue_size, u32 base)
1162{
1163 u32 threshold;
1164 u32 imp = msg_importance(msg);
1165
1166 if (imp == TIPC_LOW_IMPORTANCE)
1167 threshold = base;
1168 else if (imp == TIPC_MEDIUM_IMPORTANCE)
1169 threshold = base * 2;
1170 else if (imp == TIPC_HIGH_IMPORTANCE)
1171 threshold = base * 100;
1172 else
1173 return 0;
1174
1175 if (msg_connected(msg))
1176 threshold *= 4;
1177
1178 return (queue_size >= threshold);
1179}
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194static u32 filter_rcv(struct sock *sk, struct sk_buff *buf)
1195{
1196 struct socket *sock = sk->sk_socket;
1197 struct tipc_msg *msg = buf_msg(buf);
1198 u32 recv_q_len;
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208 if (sock->state == SS_READY) {
1209 if (msg_connected(msg)) {
1210 msg_dbg(msg, "dispatch filter 1\n");
1211 return TIPC_ERR_NO_PORT;
1212 }
1213 } else {
1214 if (msg_mcast(msg)) {
1215 msg_dbg(msg, "dispatch filter 2\n");
1216 return TIPC_ERR_NO_PORT;
1217 }
1218 if (sock->state == SS_CONNECTED) {
1219 if (!msg_connected(msg)) {
1220 msg_dbg(msg, "dispatch filter 3\n");
1221 return TIPC_ERR_NO_PORT;
1222 }
1223 }
1224 else if (sock->state == SS_CONNECTING) {
1225 if (!msg_connected(msg) && (msg_errcode(msg) == 0)) {
1226 msg_dbg(msg, "dispatch filter 4\n");
1227 return TIPC_ERR_NO_PORT;
1228 }
1229 }
1230 else if (sock->state == SS_LISTENING) {
1231 if (msg_connected(msg) || msg_errcode(msg)) {
1232 msg_dbg(msg, "dispatch filter 5\n");
1233 return TIPC_ERR_NO_PORT;
1234 }
1235 }
1236 else if (sock->state == SS_DISCONNECTING) {
1237 msg_dbg(msg, "dispatch filter 6\n");
1238 return TIPC_ERR_NO_PORT;
1239 }
1240 else {
1241 if (msg_connected(msg) || msg_errcode(msg)) {
1242 msg_dbg(msg, "dispatch filter 7\n");
1243 return TIPC_ERR_NO_PORT;
1244 }
1245 }
1246 }
1247
1248
1249
1250 recv_q_len = (u32)atomic_read(&tipc_queue_size);
1251 if (unlikely(recv_q_len >= OVERLOAD_LIMIT_BASE)) {
1252 if (rx_queue_full(msg, recv_q_len, OVERLOAD_LIMIT_BASE))
1253 return TIPC_ERR_OVERLOAD;
1254 }
1255 recv_q_len = skb_queue_len(&sk->sk_receive_queue);
1256 if (unlikely(recv_q_len >= (OVERLOAD_LIMIT_BASE / 2))) {
1257 if (rx_queue_full(msg, recv_q_len, OVERLOAD_LIMIT_BASE / 2))
1258 return TIPC_ERR_OVERLOAD;
1259 }
1260
1261
1262
1263 msg_dbg(msg, "<DISP<: ");
1264 TIPC_SKB_CB(buf)->handle = msg_data(msg);
1265 atomic_inc(&tipc_queue_size);
1266 __skb_queue_tail(&sk->sk_receive_queue, buf);
1267
1268
1269
1270 if (unlikely(msg_errcode(msg) && (sock->state == SS_CONNECTED))) {
1271 sock->state = SS_DISCONNECTING;
1272 tipc_disconnect_port(tipc_sk_port(sk));
1273 }
1274
1275 if (waitqueue_active(sk->sk_sleep))
1276 wake_up_interruptible(sk->sk_sleep);
1277 return TIPC_OK;
1278}
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290static int backlog_rcv(struct sock *sk, struct sk_buff *buf)
1291{
1292 u32 res;
1293
1294 res = filter_rcv(sk, buf);
1295 if (res)
1296 tipc_reject_msg(buf, res);
1297 return 0;
1298}
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310static u32 dispatch(struct tipc_port *tport, struct sk_buff *buf)
1311{
1312 struct sock *sk = (struct sock *)tport->usr_handle;
1313 u32 res;
1314
1315
1316
1317
1318
1319
1320
1321
1322 bh_lock_sock(sk);
1323 if (!sock_owned_by_user(sk)) {
1324 res = filter_rcv(sk, buf);
1325 } else {
1326 sk_add_backlog(sk, buf);
1327 res = TIPC_OK;
1328 }
1329 bh_unlock_sock(sk);
1330
1331 return res;
1332}
1333
1334
1335
1336
1337
1338
1339
1340
1341static void wakeupdispatch(struct tipc_port *tport)
1342{
1343 struct sock *sk = (struct sock *)tport->usr_handle;
1344
1345 if (waitqueue_active(sk->sk_sleep))
1346 wake_up_interruptible(sk->sk_sleep);
1347}
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359static int connect(struct socket *sock, struct sockaddr *dest, int destlen,
1360 int flags)
1361{
1362 struct sock *sk = sock->sk;
1363 struct sockaddr_tipc *dst = (struct sockaddr_tipc *)dest;
1364 struct msghdr m = {NULL,};
1365 struct sk_buff *buf;
1366 struct tipc_msg *msg;
1367 int res;
1368
1369 lock_sock(sk);
1370
1371
1372
1373 if (sock->state == SS_READY) {
1374 res = -EOPNOTSUPP;
1375 goto exit;
1376 }
1377
1378
1379
1380 if (flags & O_NONBLOCK) {
1381 res = -EWOULDBLOCK;
1382 goto exit;
1383 }
1384
1385
1386
1387 if (sock->state == SS_LISTENING) {
1388 res = -EOPNOTSUPP;
1389 goto exit;
1390 }
1391 if (sock->state == SS_CONNECTING) {
1392 res = -EALREADY;
1393 goto exit;
1394 }
1395 if (sock->state != SS_UNCONNECTED) {
1396 res = -EISCONN;
1397 goto exit;
1398 }
1399
1400
1401
1402
1403
1404
1405
1406
1407 if (dst->addrtype == TIPC_ADDR_MCAST) {
1408 res = -EINVAL;
1409 goto exit;
1410 }
1411
1412
1413
1414 reject_rx_queue(sk);
1415
1416
1417
1418 m.msg_name = dest;
1419 m.msg_namelen = destlen;
1420 res = send_msg(NULL, sock, &m, 0);
1421 if (res < 0) {
1422 goto exit;
1423 }
1424
1425
1426
1427 release_sock(sk);
1428 res = wait_event_interruptible_timeout(*sk->sk_sleep,
1429 (!skb_queue_empty(&sk->sk_receive_queue) ||
1430 (sock->state != SS_CONNECTING)),
1431 sk->sk_rcvtimeo);
1432 lock_sock(sk);
1433
1434 if (res > 0) {
1435 buf = skb_peek(&sk->sk_receive_queue);
1436 if (buf != NULL) {
1437 msg = buf_msg(buf);
1438 res = auto_connect(sock, msg);
1439 if (!res) {
1440 if (!msg_data_sz(msg))
1441 advance_rx_queue(sk);
1442 }
1443 } else {
1444 if (sock->state == SS_CONNECTED) {
1445 res = -EISCONN;
1446 } else {
1447 res = -ECONNREFUSED;
1448 }
1449 }
1450 } else {
1451 if (res == 0)
1452 res = -ETIMEDOUT;
1453 else
1454 ;
1455 sock->state = SS_DISCONNECTING;
1456 }
1457
1458exit:
1459 release_sock(sk);
1460 return res;
1461}
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471static int listen(struct socket *sock, int len)
1472{
1473 struct sock *sk = sock->sk;
1474 int res;
1475
1476 lock_sock(sk);
1477
1478 if (sock->state == SS_READY)
1479 res = -EOPNOTSUPP;
1480 else if (sock->state != SS_UNCONNECTED)
1481 res = -EINVAL;
1482 else {
1483 sock->state = SS_LISTENING;
1484 res = 0;
1485 }
1486
1487 release_sock(sk);
1488 return res;
1489}
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500static int accept(struct socket *sock, struct socket *new_sock, int flags)
1501{
1502 struct sock *sk = sock->sk;
1503 struct sk_buff *buf;
1504 int res;
1505
1506 lock_sock(sk);
1507
1508 if (sock->state == SS_READY) {
1509 res = -EOPNOTSUPP;
1510 goto exit;
1511 }
1512 if (sock->state != SS_LISTENING) {
1513 res = -EINVAL;
1514 goto exit;
1515 }
1516
1517 while (skb_queue_empty(&sk->sk_receive_queue)) {
1518 if (flags & O_NONBLOCK) {
1519 res = -EWOULDBLOCK;
1520 goto exit;
1521 }
1522 release_sock(sk);
1523 res = wait_event_interruptible(*sk->sk_sleep,
1524 (!skb_queue_empty(&sk->sk_receive_queue)));
1525 lock_sock(sk);
1526 if (res)
1527 goto exit;
1528 }
1529
1530 buf = skb_peek(&sk->sk_receive_queue);
1531
1532 res = tipc_create(sock_net(sock->sk), new_sock, 0);
1533 if (!res) {
1534 struct sock *new_sk = new_sock->sk;
1535 struct tipc_sock *new_tsock = tipc_sk(new_sk);
1536 struct tipc_port *new_tport = new_tsock->p;
1537 u32 new_ref = new_tport->ref;
1538 struct tipc_msg *msg = buf_msg(buf);
1539
1540 lock_sock(new_sk);
1541
1542
1543
1544
1545
1546
1547 reject_rx_queue(new_sk);
1548
1549
1550
1551 new_tsock->peer_name.ref = msg_origport(msg);
1552 new_tsock->peer_name.node = msg_orignode(msg);
1553 tipc_connect2port(new_ref, &new_tsock->peer_name);
1554 new_sock->state = SS_CONNECTED;
1555
1556 tipc_set_portimportance(new_ref, msg_importance(msg));
1557 if (msg_named(msg)) {
1558 new_tport->conn_type = msg_nametype(msg);
1559 new_tport->conn_instance = msg_nameinst(msg);
1560 }
1561
1562
1563
1564
1565
1566
1567 msg_dbg(msg,"<ACC<: ");
1568 if (!msg_data_sz(msg)) {
1569 struct msghdr m = {NULL,};
1570
1571 advance_rx_queue(sk);
1572 send_packet(NULL, new_sock, &m, 0);
1573 } else {
1574 __skb_dequeue(&sk->sk_receive_queue);
1575 __skb_queue_head(&new_sk->sk_receive_queue, buf);
1576 }
1577 release_sock(new_sk);
1578 }
1579exit:
1580 release_sock(sk);
1581 return res;
1582}
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594static int shutdown(struct socket *sock, int how)
1595{
1596 struct sock *sk = sock->sk;
1597 struct tipc_port *tport = tipc_sk_port(sk);
1598 struct sk_buff *buf;
1599 int res;
1600
1601 if (how != SHUT_RDWR)
1602 return -EINVAL;
1603
1604 lock_sock(sk);
1605
1606 switch (sock->state) {
1607 case SS_CONNECTING:
1608 case SS_CONNECTED:
1609
1610
1611restart:
1612 buf = __skb_dequeue(&sk->sk_receive_queue);
1613 if (buf) {
1614 atomic_dec(&tipc_queue_size);
1615 if (TIPC_SKB_CB(buf)->handle != msg_data(buf_msg(buf))) {
1616 buf_discard(buf);
1617 goto restart;
1618 }
1619 tipc_disconnect(tport->ref);
1620 tipc_reject_msg(buf, TIPC_CONN_SHUTDOWN);
1621 } else {
1622 tipc_shutdown(tport->ref);
1623 }
1624
1625 sock->state = SS_DISCONNECTING;
1626
1627
1628
1629 case SS_DISCONNECTING:
1630
1631
1632
1633 discard_rx_queue(sk);
1634 if (waitqueue_active(sk->sk_sleep))
1635 wake_up_interruptible(sk->sk_sleep);
1636 res = 0;
1637 break;
1638
1639 default:
1640 res = -ENOTCONN;
1641 }
1642
1643 release_sock(sk);
1644 return res;
1645}
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661static int setsockopt(struct socket *sock,
1662 int lvl, int opt, char __user *ov, int ol)
1663{
1664 struct sock *sk = sock->sk;
1665 struct tipc_port *tport = tipc_sk_port(sk);
1666 u32 value;
1667 int res;
1668
1669 if ((lvl == IPPROTO_TCP) && (sock->type == SOCK_STREAM))
1670 return 0;
1671 if (lvl != SOL_TIPC)
1672 return -ENOPROTOOPT;
1673 if (ol < sizeof(value))
1674 return -EINVAL;
1675 if ((res = get_user(value, (u32 __user *)ov)))
1676 return res;
1677
1678 lock_sock(sk);
1679
1680 switch (opt) {
1681 case TIPC_IMPORTANCE:
1682 res = tipc_set_portimportance(tport->ref, value);
1683 break;
1684 case TIPC_SRC_DROPPABLE:
1685 if (sock->type != SOCK_STREAM)
1686 res = tipc_set_portunreliable(tport->ref, value);
1687 else
1688 res = -ENOPROTOOPT;
1689 break;
1690 case TIPC_DEST_DROPPABLE:
1691 res = tipc_set_portunreturnable(tport->ref, value);
1692 break;
1693 case TIPC_CONN_TIMEOUT:
1694 sk->sk_rcvtimeo = msecs_to_jiffies(value);
1695
1696 break;
1697 default:
1698 res = -EINVAL;
1699 }
1700
1701 release_sock(sk);
1702
1703 return res;
1704}
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720static int getsockopt(struct socket *sock,
1721 int lvl, int opt, char __user *ov, int __user *ol)
1722{
1723 struct sock *sk = sock->sk;
1724 struct tipc_port *tport = tipc_sk_port(sk);
1725 int len;
1726 u32 value;
1727 int res;
1728
1729 if ((lvl == IPPROTO_TCP) && (sock->type == SOCK_STREAM))
1730 return put_user(0, ol);
1731 if (lvl != SOL_TIPC)
1732 return -ENOPROTOOPT;
1733 if ((res = get_user(len, ol)))
1734 return res;
1735
1736 lock_sock(sk);
1737
1738 switch (opt) {
1739 case TIPC_IMPORTANCE:
1740 res = tipc_portimportance(tport->ref, &value);
1741 break;
1742 case TIPC_SRC_DROPPABLE:
1743 res = tipc_portunreliable(tport->ref, &value);
1744 break;
1745 case TIPC_DEST_DROPPABLE:
1746 res = tipc_portunreturnable(tport->ref, &value);
1747 break;
1748 case TIPC_CONN_TIMEOUT:
1749 value = jiffies_to_msecs(sk->sk_rcvtimeo);
1750
1751 break;
1752 default:
1753 res = -EINVAL;
1754 }
1755
1756 release_sock(sk);
1757
1758 if (res) {
1759
1760 }
1761 else if (len < sizeof(value)) {
1762 res = -EINVAL;
1763 }
1764 else if (copy_to_user(ov, &value, sizeof(value))) {
1765 res = -EFAULT;
1766 }
1767 else {
1768 res = put_user(sizeof(value), ol);
1769 }
1770
1771 return res;
1772}
1773
1774
1775
1776
1777
1778static const struct proto_ops msg_ops = {
1779 .owner = THIS_MODULE,
1780 .family = AF_TIPC,
1781 .release = release,
1782 .bind = bind,
1783 .connect = connect,
1784 .socketpair = sock_no_socketpair,
1785 .accept = accept,
1786 .getname = get_name,
1787 .poll = poll,
1788 .ioctl = sock_no_ioctl,
1789 .listen = listen,
1790 .shutdown = shutdown,
1791 .setsockopt = setsockopt,
1792 .getsockopt = getsockopt,
1793 .sendmsg = send_msg,
1794 .recvmsg = recv_msg,
1795 .mmap = sock_no_mmap,
1796 .sendpage = sock_no_sendpage
1797};
1798
1799static const struct proto_ops packet_ops = {
1800 .owner = THIS_MODULE,
1801 .family = AF_TIPC,
1802 .release = release,
1803 .bind = bind,
1804 .connect = connect,
1805 .socketpair = sock_no_socketpair,
1806 .accept = accept,
1807 .getname = get_name,
1808 .poll = poll,
1809 .ioctl = sock_no_ioctl,
1810 .listen = listen,
1811 .shutdown = shutdown,
1812 .setsockopt = setsockopt,
1813 .getsockopt = getsockopt,
1814 .sendmsg = send_packet,
1815 .recvmsg = recv_msg,
1816 .mmap = sock_no_mmap,
1817 .sendpage = sock_no_sendpage
1818};
1819
1820static const struct proto_ops stream_ops = {
1821 .owner = THIS_MODULE,
1822 .family = AF_TIPC,
1823 .release = release,
1824 .bind = bind,
1825 .connect = connect,
1826 .socketpair = sock_no_socketpair,
1827 .accept = accept,
1828 .getname = get_name,
1829 .poll = poll,
1830 .ioctl = sock_no_ioctl,
1831 .listen = listen,
1832 .shutdown = shutdown,
1833 .setsockopt = setsockopt,
1834 .getsockopt = getsockopt,
1835 .sendmsg = send_stream,
1836 .recvmsg = recv_stream,
1837 .mmap = sock_no_mmap,
1838 .sendpage = sock_no_sendpage
1839};
1840
1841static const struct net_proto_family tipc_family_ops = {
1842 .owner = THIS_MODULE,
1843 .family = AF_TIPC,
1844 .create = tipc_create
1845};
1846
1847static struct proto tipc_proto = {
1848 .name = "TIPC",
1849 .owner = THIS_MODULE,
1850 .obj_size = sizeof(struct tipc_sock)
1851};
1852
1853
1854
1855
1856
1857
1858int tipc_socket_init(void)
1859{
1860 int res;
1861
1862 res = proto_register(&tipc_proto, 1);
1863 if (res) {
1864 err("Failed to register TIPC protocol type\n");
1865 goto out;
1866 }
1867
1868 res = sock_register(&tipc_family_ops);
1869 if (res) {
1870 err("Failed to register TIPC socket type\n");
1871 proto_unregister(&tipc_proto);
1872 goto out;
1873 }
1874
1875 sockets_enabled = 1;
1876 out:
1877 return res;
1878}
1879
1880
1881
1882
1883
1884void tipc_socket_stop(void)
1885{
1886 if (!sockets_enabled)
1887 return;
1888
1889 sockets_enabled = 0;
1890 sock_unregister(tipc_family_ops.family);
1891 proto_unregister(&tipc_proto);
1892}
1893
1894