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/rhashtable.h>
38#include "core.h"
39#include "name_table.h"
40#include "node.h"
41#include "link.h"
42#include "name_distr.h"
43#include "socket.h"
44#include "bcast.h"
45
46#define SS_LISTENING -1
47#define SS_READY -2
48
49#define CONN_TIMEOUT_DEFAULT 8000
50#define CONN_PROBING_INTERVAL msecs_to_jiffies(3600000)
51#define TIPC_FWD_MSG 1
52#define TIPC_CONN_OK 0
53#define TIPC_CONN_PROBING 1
54#define TIPC_MAX_PORT 0xffffffff
55#define TIPC_MIN_PORT 1
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81struct tipc_sock {
82 struct sock sk;
83 int connected;
84 u32 conn_type;
85 u32 conn_instance;
86 int published;
87 u32 max_pkt;
88 u32 portid;
89 struct tipc_msg phdr;
90 struct list_head sock_list;
91 struct list_head publications;
92 u32 pub_count;
93 u32 probing_state;
94 unsigned long probing_intv;
95 uint conn_timeout;
96 atomic_t dupl_rcvcnt;
97 bool link_cong;
98 uint sent_unacked;
99 uint rcv_unacked;
100 struct sockaddr_tipc remote;
101 struct rhash_head node;
102 struct rcu_head rcu;
103};
104
105static int tipc_backlog_rcv(struct sock *sk, struct sk_buff *skb);
106static void tipc_data_ready(struct sock *sk);
107static void tipc_write_space(struct sock *sk);
108static void tipc_sock_destruct(struct sock *sk);
109static int tipc_release(struct socket *sock);
110static int tipc_accept(struct socket *sock, struct socket *new_sock, int flags);
111static int tipc_wait_for_sndmsg(struct socket *sock, long *timeo_p);
112static void tipc_sk_timeout(unsigned long data);
113static int tipc_sk_publish(struct tipc_sock *tsk, uint scope,
114 struct tipc_name_seq const *seq);
115static int tipc_sk_withdraw(struct tipc_sock *tsk, uint scope,
116 struct tipc_name_seq const *seq);
117static struct tipc_sock *tipc_sk_lookup(struct net *net, u32 portid);
118static int tipc_sk_insert(struct tipc_sock *tsk);
119static void tipc_sk_remove(struct tipc_sock *tsk);
120static int __tipc_send_stream(struct socket *sock, struct msghdr *m,
121 size_t dsz);
122static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dsz);
123
124static const struct proto_ops packet_ops;
125static const struct proto_ops stream_ops;
126static const struct proto_ops msg_ops;
127static struct proto tipc_proto;
128
129static const struct nla_policy tipc_nl_sock_policy[TIPC_NLA_SOCK_MAX + 1] = {
130 [TIPC_NLA_SOCK_UNSPEC] = { .type = NLA_UNSPEC },
131 [TIPC_NLA_SOCK_ADDR] = { .type = NLA_U32 },
132 [TIPC_NLA_SOCK_REF] = { .type = NLA_U32 },
133 [TIPC_NLA_SOCK_CON] = { .type = NLA_NESTED },
134 [TIPC_NLA_SOCK_HAS_PUBL] = { .type = NLA_FLAG }
135};
136
137static const struct rhashtable_params tsk_rht_params;
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184static u32 tsk_own_node(struct tipc_sock *tsk)
185{
186 return msg_prevnode(&tsk->phdr);
187}
188
189static u32 tsk_peer_node(struct tipc_sock *tsk)
190{
191 return msg_destnode(&tsk->phdr);
192}
193
194static u32 tsk_peer_port(struct tipc_sock *tsk)
195{
196 return msg_destport(&tsk->phdr);
197}
198
199static bool tsk_unreliable(struct tipc_sock *tsk)
200{
201 return msg_src_droppable(&tsk->phdr) != 0;
202}
203
204static void tsk_set_unreliable(struct tipc_sock *tsk, bool unreliable)
205{
206 msg_set_src_droppable(&tsk->phdr, unreliable ? 1 : 0);
207}
208
209static bool tsk_unreturnable(struct tipc_sock *tsk)
210{
211 return msg_dest_droppable(&tsk->phdr) != 0;
212}
213
214static void tsk_set_unreturnable(struct tipc_sock *tsk, bool unreturnable)
215{
216 msg_set_dest_droppable(&tsk->phdr, unreturnable ? 1 : 0);
217}
218
219static int tsk_importance(struct tipc_sock *tsk)
220{
221 return msg_importance(&tsk->phdr);
222}
223
224static int tsk_set_importance(struct tipc_sock *tsk, int imp)
225{
226 if (imp > TIPC_CRITICAL_IMPORTANCE)
227 return -EINVAL;
228 msg_set_importance(&tsk->phdr, (u32)imp);
229 return 0;
230}
231
232static struct tipc_sock *tipc_sk(const struct sock *sk)
233{
234 return container_of(sk, struct tipc_sock, sk);
235}
236
237static int tsk_conn_cong(struct tipc_sock *tsk)
238{
239 return tsk->sent_unacked >= TIPC_FLOWCTRL_WIN;
240}
241
242
243
244
245
246
247static void tsk_advance_rx_queue(struct sock *sk)
248{
249 kfree_skb(__skb_dequeue(&sk->sk_receive_queue));
250}
251
252
253
254static void tipc_sk_respond(struct sock *sk, struct sk_buff *skb, int err)
255{
256 u32 selector;
257 u32 dnode;
258 u32 onode = tipc_own_addr(sock_net(sk));
259
260 if (!tipc_msg_reverse(onode, &skb, err))
261 return;
262
263 dnode = msg_destnode(buf_msg(skb));
264 selector = msg_origport(buf_msg(skb));
265 tipc_node_xmit_skb(sock_net(sk), skb, dnode, selector);
266}
267
268
269
270
271
272
273static void tsk_rej_rx_queue(struct sock *sk)
274{
275 struct sk_buff *skb;
276
277 while ((skb = __skb_dequeue(&sk->sk_receive_queue)))
278 tipc_sk_respond(sk, skb, TIPC_ERR_NO_PORT);
279}
280
281
282
283
284
285
286static bool tsk_peer_msg(struct tipc_sock *tsk, struct tipc_msg *msg)
287{
288 struct tipc_net *tn = net_generic(sock_net(&tsk->sk), tipc_net_id);
289 u32 peer_port = tsk_peer_port(tsk);
290 u32 orig_node;
291 u32 peer_node;
292
293 if (unlikely(!tsk->connected))
294 return false;
295
296 if (unlikely(msg_origport(msg) != peer_port))
297 return false;
298
299 orig_node = msg_orignode(msg);
300 peer_node = tsk_peer_node(tsk);
301
302 if (likely(orig_node == peer_node))
303 return true;
304
305 if (!orig_node && (peer_node == tn->own_addr))
306 return true;
307
308 if (!peer_node && (orig_node == tn->own_addr))
309 return true;
310
311 return false;
312}
313
314
315
316
317
318
319
320
321
322
323
324
325
326static int tipc_sk_create(struct net *net, struct socket *sock,
327 int protocol, int kern)
328{
329 struct tipc_net *tn;
330 const struct proto_ops *ops;
331 socket_state state;
332 struct sock *sk;
333 struct tipc_sock *tsk;
334 struct tipc_msg *msg;
335
336
337 if (unlikely(protocol != 0))
338 return -EPROTONOSUPPORT;
339
340 switch (sock->type) {
341 case SOCK_STREAM:
342 ops = &stream_ops;
343 state = SS_UNCONNECTED;
344 break;
345 case SOCK_SEQPACKET:
346 ops = &packet_ops;
347 state = SS_UNCONNECTED;
348 break;
349 case SOCK_DGRAM:
350 case SOCK_RDM:
351 ops = &msg_ops;
352 state = SS_READY;
353 break;
354 default:
355 return -EPROTOTYPE;
356 }
357
358
359 sk = sk_alloc(net, AF_TIPC, GFP_KERNEL, &tipc_proto, kern);
360 if (sk == NULL)
361 return -ENOMEM;
362
363 tsk = tipc_sk(sk);
364 tsk->max_pkt = MAX_PKT_DEFAULT;
365 INIT_LIST_HEAD(&tsk->publications);
366 msg = &tsk->phdr;
367 tn = net_generic(sock_net(sk), tipc_net_id);
368 tipc_msg_init(tn->own_addr, msg, TIPC_LOW_IMPORTANCE, TIPC_NAMED_MSG,
369 NAMED_H_SIZE, 0);
370
371
372 sock->ops = ops;
373 sock->state = state;
374 sock_init_data(sock, sk);
375 if (tipc_sk_insert(tsk)) {
376 pr_warn("Socket create failed; port numbrer exhausted\n");
377 return -EINVAL;
378 }
379 msg_set_origport(msg, tsk->portid);
380 setup_timer(&sk->sk_timer, tipc_sk_timeout, (unsigned long)tsk);
381 sk->sk_backlog_rcv = tipc_backlog_rcv;
382 sk->sk_rcvbuf = sysctl_tipc_rmem[1];
383 sk->sk_data_ready = tipc_data_ready;
384 sk->sk_write_space = tipc_write_space;
385 sk->sk_destruct = tipc_sock_destruct;
386 tsk->conn_timeout = CONN_TIMEOUT_DEFAULT;
387 tsk->sent_unacked = 0;
388 atomic_set(&tsk->dupl_rcvcnt, 0);
389
390 if (sock->state == SS_READY) {
391 tsk_set_unreturnable(tsk, true);
392 if (sock->type == SOCK_DGRAM)
393 tsk_set_unreliable(tsk, true);
394 }
395 return 0;
396}
397
398static void tipc_sk_callback(struct rcu_head *head)
399{
400 struct tipc_sock *tsk = container_of(head, struct tipc_sock, rcu);
401
402 sock_put(&tsk->sk);
403}
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421static int tipc_release(struct socket *sock)
422{
423 struct sock *sk = sock->sk;
424 struct net *net;
425 struct tipc_sock *tsk;
426 struct sk_buff *skb;
427 u32 dnode;
428
429
430
431
432
433 if (sk == NULL)
434 return 0;
435
436 net = sock_net(sk);
437 tsk = tipc_sk(sk);
438 lock_sock(sk);
439
440
441
442
443
444 dnode = tsk_peer_node(tsk);
445 while (sock->state != SS_DISCONNECTING) {
446 skb = __skb_dequeue(&sk->sk_receive_queue);
447 if (skb == NULL)
448 break;
449 if (TIPC_SKB_CB(skb)->handle != NULL)
450 kfree_skb(skb);
451 else {
452 if ((sock->state == SS_CONNECTING) ||
453 (sock->state == SS_CONNECTED)) {
454 sock->state = SS_DISCONNECTING;
455 tsk->connected = 0;
456 tipc_node_remove_conn(net, dnode, tsk->portid);
457 }
458 tipc_sk_respond(sk, skb, TIPC_ERR_NO_PORT);
459 }
460 }
461
462 tipc_sk_withdraw(tsk, 0, NULL);
463 sk_stop_timer(sk, &sk->sk_timer);
464 tipc_sk_remove(tsk);
465 if (tsk->connected) {
466 skb = tipc_msg_create(TIPC_CRITICAL_IMPORTANCE,
467 TIPC_CONN_MSG, SHORT_H_SIZE, 0, dnode,
468 tsk_own_node(tsk), tsk_peer_port(tsk),
469 tsk->portid, TIPC_ERR_NO_PORT);
470 if (skb)
471 tipc_node_xmit_skb(net, skb, dnode, tsk->portid);
472 tipc_node_remove_conn(net, dnode, tsk->portid);
473 }
474
475
476 sock->state = SS_DISCONNECTING;
477 release_sock(sk);
478
479 call_rcu(&tsk->rcu, tipc_sk_callback);
480 sock->sk = NULL;
481
482 return 0;
483}
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500static int tipc_bind(struct socket *sock, struct sockaddr *uaddr,
501 int uaddr_len)
502{
503 struct sock *sk = sock->sk;
504 struct sockaddr_tipc *addr = (struct sockaddr_tipc *)uaddr;
505 struct tipc_sock *tsk = tipc_sk(sk);
506 int res = -EINVAL;
507
508 lock_sock(sk);
509 if (unlikely(!uaddr_len)) {
510 res = tipc_sk_withdraw(tsk, 0, NULL);
511 goto exit;
512 }
513
514 if (uaddr_len < sizeof(struct sockaddr_tipc)) {
515 res = -EINVAL;
516 goto exit;
517 }
518 if (addr->family != AF_TIPC) {
519 res = -EAFNOSUPPORT;
520 goto exit;
521 }
522
523 if (addr->addrtype == TIPC_ADDR_NAME)
524 addr->addr.nameseq.upper = addr->addr.nameseq.lower;
525 else if (addr->addrtype != TIPC_ADDR_NAMESEQ) {
526 res = -EAFNOSUPPORT;
527 goto exit;
528 }
529
530 if ((addr->addr.nameseq.type < TIPC_RESERVED_TYPES) &&
531 (addr->addr.nameseq.type != TIPC_TOP_SRV) &&
532 (addr->addr.nameseq.type != TIPC_CFG_SRV)) {
533 res = -EACCES;
534 goto exit;
535 }
536
537 res = (addr->scope > 0) ?
538 tipc_sk_publish(tsk, addr->scope, &addr->addr.nameseq) :
539 tipc_sk_withdraw(tsk, -addr->scope, &addr->addr.nameseq);
540exit:
541 release_sock(sk);
542 return res;
543}
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558static int tipc_getname(struct socket *sock, struct sockaddr *uaddr,
559 int *uaddr_len, int peer)
560{
561 struct sockaddr_tipc *addr = (struct sockaddr_tipc *)uaddr;
562 struct tipc_sock *tsk = tipc_sk(sock->sk);
563 struct tipc_net *tn = net_generic(sock_net(sock->sk), tipc_net_id);
564
565 memset(addr, 0, sizeof(*addr));
566 if (peer) {
567 if ((sock->state != SS_CONNECTED) &&
568 ((peer != 2) || (sock->state != SS_DISCONNECTING)))
569 return -ENOTCONN;
570 addr->addr.id.ref = tsk_peer_port(tsk);
571 addr->addr.id.node = tsk_peer_node(tsk);
572 } else {
573 addr->addr.id.ref = tsk->portid;
574 addr->addr.id.node = tn->own_addr;
575 }
576
577 *uaddr_len = sizeof(*addr);
578 addr->addrtype = TIPC_ADDR_ID;
579 addr->family = AF_TIPC;
580 addr->scope = 0;
581 addr->addr.name.domain = 0;
582
583 return 0;
584}
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626static unsigned int tipc_poll(struct file *file, struct socket *sock,
627 poll_table *wait)
628{
629 struct sock *sk = sock->sk;
630 struct tipc_sock *tsk = tipc_sk(sk);
631 u32 mask = 0;
632
633 sock_poll_wait(file, sk_sleep(sk), wait);
634
635 switch ((int)sock->state) {
636 case SS_UNCONNECTED:
637 if (!tsk->link_cong)
638 mask |= POLLOUT;
639 break;
640 case SS_READY:
641 case SS_CONNECTED:
642 if (!tsk->link_cong && !tsk_conn_cong(tsk))
643 mask |= POLLOUT;
644
645 case SS_CONNECTING:
646 case SS_LISTENING:
647 if (!skb_queue_empty(&sk->sk_receive_queue))
648 mask |= (POLLIN | POLLRDNORM);
649 break;
650 case SS_DISCONNECTING:
651 mask = (POLLIN | POLLRDNORM | POLLHUP);
652 break;
653 }
654
655 return mask;
656}
657
658
659
660
661
662
663
664
665
666
667
668
669static int tipc_sendmcast(struct socket *sock, struct tipc_name_seq *seq,
670 struct msghdr *msg, size_t dsz, long timeo)
671{
672 struct sock *sk = sock->sk;
673 struct tipc_sock *tsk = tipc_sk(sk);
674 struct net *net = sock_net(sk);
675 struct tipc_msg *mhdr = &tsk->phdr;
676 struct sk_buff_head *pktchain = &sk->sk_write_queue;
677 struct iov_iter save = msg->msg_iter;
678 uint mtu;
679 int rc;
680
681 msg_set_type(mhdr, TIPC_MCAST_MSG);
682 msg_set_lookup_scope(mhdr, TIPC_CLUSTER_SCOPE);
683 msg_set_destport(mhdr, 0);
684 msg_set_destnode(mhdr, 0);
685 msg_set_nametype(mhdr, seq->type);
686 msg_set_namelower(mhdr, seq->lower);
687 msg_set_nameupper(mhdr, seq->upper);
688 msg_set_hdr_sz(mhdr, MCAST_H_SIZE);
689
690new_mtu:
691 mtu = tipc_bcast_get_mtu(net);
692 rc = tipc_msg_build(mhdr, msg, 0, dsz, mtu, pktchain);
693 if (unlikely(rc < 0))
694 return rc;
695
696 do {
697 rc = tipc_bcast_xmit(net, pktchain);
698 if (likely(!rc))
699 return dsz;
700
701 if (rc == -ELINKCONG) {
702 tsk->link_cong = 1;
703 rc = tipc_wait_for_sndmsg(sock, &timeo);
704 if (!rc)
705 continue;
706 }
707 __skb_queue_purge(pktchain);
708 if (rc == -EMSGSIZE) {
709 msg->msg_iter = save;
710 goto new_mtu;
711 }
712 break;
713 } while (1);
714 return rc;
715}
716
717
718
719
720
721
722
723
724void tipc_sk_mcast_rcv(struct net *net, struct sk_buff_head *arrvq,
725 struct sk_buff_head *inputq)
726{
727 struct tipc_msg *msg;
728 struct tipc_plist dports;
729 u32 portid;
730 u32 scope = TIPC_CLUSTER_SCOPE;
731 struct sk_buff_head tmpq;
732 uint hsz;
733 struct sk_buff *skb, *_skb;
734
735 __skb_queue_head_init(&tmpq);
736 tipc_plist_init(&dports);
737
738 skb = tipc_skb_peek(arrvq, &inputq->lock);
739 for (; skb; skb = tipc_skb_peek(arrvq, &inputq->lock)) {
740 msg = buf_msg(skb);
741 hsz = skb_headroom(skb) + msg_hdr_sz(msg);
742
743 if (in_own_node(net, msg_orignode(msg)))
744 scope = TIPC_NODE_SCOPE;
745
746
747 tipc_nametbl_mc_translate(net,
748 msg_nametype(msg), msg_namelower(msg),
749 msg_nameupper(msg), scope, &dports);
750 portid = tipc_plist_pop(&dports);
751 for (; portid; portid = tipc_plist_pop(&dports)) {
752 _skb = __pskb_copy(skb, hsz, GFP_ATOMIC);
753 if (_skb) {
754 msg_set_destport(buf_msg(_skb), portid);
755 __skb_queue_tail(&tmpq, _skb);
756 continue;
757 }
758 pr_warn("Failed to clone mcast rcv buffer\n");
759 }
760
761 spin_lock_bh(&inputq->lock);
762 if (skb_peek(arrvq) == skb) {
763 skb_queue_splice_tail_init(&tmpq, inputq);
764 kfree_skb(__skb_dequeue(arrvq));
765 }
766 spin_unlock_bh(&inputq->lock);
767 __skb_queue_purge(&tmpq);
768 kfree_skb(skb);
769 }
770 tipc_sk_rcv(net, inputq);
771}
772
773
774
775
776
777
778static void tipc_sk_proto_rcv(struct tipc_sock *tsk, struct sk_buff *skb)
779{
780 struct sock *sk = &tsk->sk;
781 struct tipc_msg *hdr = buf_msg(skb);
782 int mtyp = msg_type(hdr);
783 int conn_cong;
784
785
786 if (!tsk_peer_msg(tsk, hdr))
787 goto exit;
788
789 tsk->probing_state = TIPC_CONN_OK;
790
791 if (mtyp == CONN_PROBE) {
792 msg_set_type(hdr, CONN_PROBE_REPLY);
793 tipc_sk_respond(sk, skb, TIPC_OK);
794 return;
795 } else if (mtyp == CONN_ACK) {
796 conn_cong = tsk_conn_cong(tsk);
797 tsk->sent_unacked -= msg_msgcnt(hdr);
798 if (conn_cong)
799 sk->sk_write_space(sk);
800 } else if (mtyp != CONN_PROBE_REPLY) {
801 pr_warn("Received unknown CONN_PROTO msg\n");
802 }
803exit:
804 kfree_skb(skb);
805}
806
807static int tipc_wait_for_sndmsg(struct socket *sock, long *timeo_p)
808{
809 struct sock *sk = sock->sk;
810 struct tipc_sock *tsk = tipc_sk(sk);
811 DEFINE_WAIT(wait);
812 int done;
813
814 do {
815 int err = sock_error(sk);
816 if (err)
817 return err;
818 if (sock->state == SS_DISCONNECTING)
819 return -EPIPE;
820 if (!*timeo_p)
821 return -EAGAIN;
822 if (signal_pending(current))
823 return sock_intr_errno(*timeo_p);
824
825 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
826 done = sk_wait_event(sk, timeo_p, !tsk->link_cong);
827 finish_wait(sk_sleep(sk), &wait);
828 } while (!done);
829 return 0;
830}
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845static int tipc_sendmsg(struct socket *sock,
846 struct msghdr *m, size_t dsz)
847{
848 struct sock *sk = sock->sk;
849 int ret;
850
851 lock_sock(sk);
852 ret = __tipc_sendmsg(sock, m, dsz);
853 release_sock(sk);
854
855 return ret;
856}
857
858static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dsz)
859{
860 DECLARE_SOCKADDR(struct sockaddr_tipc *, dest, m->msg_name);
861 struct sock *sk = sock->sk;
862 struct tipc_sock *tsk = tipc_sk(sk);
863 struct net *net = sock_net(sk);
864 struct tipc_msg *mhdr = &tsk->phdr;
865 u32 dnode, dport;
866 struct sk_buff_head *pktchain = &sk->sk_write_queue;
867 struct sk_buff *skb;
868 struct tipc_name_seq *seq;
869 struct iov_iter save;
870 u32 mtu;
871 long timeo;
872 int rc;
873
874 if (dsz > TIPC_MAX_USER_MSG_SIZE)
875 return -EMSGSIZE;
876 if (unlikely(!dest)) {
877 if (tsk->connected && sock->state == SS_READY)
878 dest = &tsk->remote;
879 else
880 return -EDESTADDRREQ;
881 } else if (unlikely(m->msg_namelen < sizeof(*dest)) ||
882 dest->family != AF_TIPC) {
883 return -EINVAL;
884 }
885 if (unlikely(sock->state != SS_READY)) {
886 if (sock->state == SS_LISTENING)
887 return -EPIPE;
888 if (sock->state != SS_UNCONNECTED)
889 return -EISCONN;
890 if (tsk->published)
891 return -EOPNOTSUPP;
892 if (dest->addrtype == TIPC_ADDR_NAME) {
893 tsk->conn_type = dest->addr.name.name.type;
894 tsk->conn_instance = dest->addr.name.name.instance;
895 }
896 }
897 seq = &dest->addr.nameseq;
898 timeo = sock_sndtimeo(sk, m->msg_flags & MSG_DONTWAIT);
899
900 if (dest->addrtype == TIPC_ADDR_MCAST) {
901 return tipc_sendmcast(sock, seq, m, dsz, timeo);
902 } else if (dest->addrtype == TIPC_ADDR_NAME) {
903 u32 type = dest->addr.name.name.type;
904 u32 inst = dest->addr.name.name.instance;
905 u32 domain = dest->addr.name.domain;
906
907 dnode = domain;
908 msg_set_type(mhdr, TIPC_NAMED_MSG);
909 msg_set_hdr_sz(mhdr, NAMED_H_SIZE);
910 msg_set_nametype(mhdr, type);
911 msg_set_nameinst(mhdr, inst);
912 msg_set_lookup_scope(mhdr, tipc_addr_scope(domain));
913 dport = tipc_nametbl_translate(net, type, inst, &dnode);
914 msg_set_destnode(mhdr, dnode);
915 msg_set_destport(mhdr, dport);
916 if (unlikely(!dport && !dnode))
917 return -EHOSTUNREACH;
918 } else if (dest->addrtype == TIPC_ADDR_ID) {
919 dnode = dest->addr.id.node;
920 msg_set_type(mhdr, TIPC_DIRECT_MSG);
921 msg_set_lookup_scope(mhdr, 0);
922 msg_set_destnode(mhdr, dnode);
923 msg_set_destport(mhdr, dest->addr.id.ref);
924 msg_set_hdr_sz(mhdr, BASIC_H_SIZE);
925 }
926
927 save = m->msg_iter;
928new_mtu:
929 mtu = tipc_node_get_mtu(net, dnode, tsk->portid);
930 rc = tipc_msg_build(mhdr, m, 0, dsz, mtu, pktchain);
931 if (rc < 0)
932 return rc;
933
934 do {
935 skb = skb_peek(pktchain);
936 TIPC_SKB_CB(skb)->wakeup_pending = tsk->link_cong;
937 rc = tipc_node_xmit(net, pktchain, dnode, tsk->portid);
938 if (likely(!rc)) {
939 if (sock->state != SS_READY)
940 sock->state = SS_CONNECTING;
941 return dsz;
942 }
943 if (rc == -ELINKCONG) {
944 tsk->link_cong = 1;
945 rc = tipc_wait_for_sndmsg(sock, &timeo);
946 if (!rc)
947 continue;
948 }
949 __skb_queue_purge(pktchain);
950 if (rc == -EMSGSIZE) {
951 m->msg_iter = save;
952 goto new_mtu;
953 }
954 break;
955 } while (1);
956
957 return rc;
958}
959
960static int tipc_wait_for_sndpkt(struct socket *sock, long *timeo_p)
961{
962 struct sock *sk = sock->sk;
963 struct tipc_sock *tsk = tipc_sk(sk);
964 DEFINE_WAIT(wait);
965 int done;
966
967 do {
968 int err = sock_error(sk);
969 if (err)
970 return err;
971 if (sock->state == SS_DISCONNECTING)
972 return -EPIPE;
973 else if (sock->state != SS_CONNECTED)
974 return -ENOTCONN;
975 if (!*timeo_p)
976 return -EAGAIN;
977 if (signal_pending(current))
978 return sock_intr_errno(*timeo_p);
979
980 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
981 done = sk_wait_event(sk, timeo_p,
982 (!tsk->link_cong &&
983 !tsk_conn_cong(tsk)) ||
984 !tsk->connected);
985 finish_wait(sk_sleep(sk), &wait);
986 } while (!done);
987 return 0;
988}
989
990
991
992
993
994
995
996
997
998
999
1000
1001static int tipc_send_stream(struct socket *sock, struct msghdr *m, size_t dsz)
1002{
1003 struct sock *sk = sock->sk;
1004 int ret;
1005
1006 lock_sock(sk);
1007 ret = __tipc_send_stream(sock, m, dsz);
1008 release_sock(sk);
1009
1010 return ret;
1011}
1012
1013static int __tipc_send_stream(struct socket *sock, struct msghdr *m, size_t dsz)
1014{
1015 struct sock *sk = sock->sk;
1016 struct net *net = sock_net(sk);
1017 struct tipc_sock *tsk = tipc_sk(sk);
1018 struct tipc_msg *mhdr = &tsk->phdr;
1019 struct sk_buff_head *pktchain = &sk->sk_write_queue;
1020 DECLARE_SOCKADDR(struct sockaddr_tipc *, dest, m->msg_name);
1021 u32 portid = tsk->portid;
1022 int rc = -EINVAL;
1023 long timeo;
1024 u32 dnode;
1025 uint mtu, send, sent = 0;
1026 struct iov_iter save;
1027
1028
1029 if (unlikely(dest)) {
1030 rc = __tipc_sendmsg(sock, m, dsz);
1031 if (dsz && (dsz == rc))
1032 tsk->sent_unacked = 1;
1033 return rc;
1034 }
1035 if (dsz > (uint)INT_MAX)
1036 return -EMSGSIZE;
1037
1038 if (unlikely(sock->state != SS_CONNECTED)) {
1039 if (sock->state == SS_DISCONNECTING)
1040 return -EPIPE;
1041 else
1042 return -ENOTCONN;
1043 }
1044
1045 timeo = sock_sndtimeo(sk, m->msg_flags & MSG_DONTWAIT);
1046 dnode = tsk_peer_node(tsk);
1047
1048next:
1049 save = m->msg_iter;
1050 mtu = tsk->max_pkt;
1051 send = min_t(uint, dsz - sent, TIPC_MAX_USER_MSG_SIZE);
1052 rc = tipc_msg_build(mhdr, m, sent, send, mtu, pktchain);
1053 if (unlikely(rc < 0))
1054 return rc;
1055 do {
1056 if (likely(!tsk_conn_cong(tsk))) {
1057 rc = tipc_node_xmit(net, pktchain, dnode, portid);
1058 if (likely(!rc)) {
1059 tsk->sent_unacked++;
1060 sent += send;
1061 if (sent == dsz)
1062 return dsz;
1063 goto next;
1064 }
1065 if (rc == -EMSGSIZE) {
1066 __skb_queue_purge(pktchain);
1067 tsk->max_pkt = tipc_node_get_mtu(net, dnode,
1068 portid);
1069 m->msg_iter = save;
1070 goto next;
1071 }
1072 if (rc != -ELINKCONG)
1073 break;
1074
1075 tsk->link_cong = 1;
1076 }
1077 rc = tipc_wait_for_sndpkt(sock, &timeo);
1078 } while (!rc);
1079
1080 __skb_queue_purge(pktchain);
1081 return sent ? sent : rc;
1082}
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094static int tipc_send_packet(struct socket *sock, struct msghdr *m, size_t dsz)
1095{
1096 if (dsz > TIPC_MAX_USER_MSG_SIZE)
1097 return -EMSGSIZE;
1098
1099 return tipc_send_stream(sock, m, dsz);
1100}
1101
1102
1103
1104static void tipc_sk_finish_conn(struct tipc_sock *tsk, u32 peer_port,
1105 u32 peer_node)
1106{
1107 struct sock *sk = &tsk->sk;
1108 struct net *net = sock_net(sk);
1109 struct tipc_msg *msg = &tsk->phdr;
1110
1111 msg_set_destnode(msg, peer_node);
1112 msg_set_destport(msg, peer_port);
1113 msg_set_type(msg, TIPC_CONN_MSG);
1114 msg_set_lookup_scope(msg, 0);
1115 msg_set_hdr_sz(msg, SHORT_H_SIZE);
1116
1117 tsk->probing_intv = CONN_PROBING_INTERVAL;
1118 tsk->probing_state = TIPC_CONN_OK;
1119 tsk->connected = 1;
1120 sk_reset_timer(sk, &sk->sk_timer, jiffies + tsk->probing_intv);
1121 tipc_node_add_conn(net, peer_node, tsk->portid, peer_port);
1122 tsk->max_pkt = tipc_node_get_mtu(net, peer_node, tsk->portid);
1123}
1124
1125
1126
1127
1128
1129
1130
1131
1132static void set_orig_addr(struct msghdr *m, struct tipc_msg *msg)
1133{
1134 DECLARE_SOCKADDR(struct sockaddr_tipc *, addr, m->msg_name);
1135
1136 if (addr) {
1137 addr->family = AF_TIPC;
1138 addr->addrtype = TIPC_ADDR_ID;
1139 memset(&addr->addr, 0, sizeof(addr->addr));
1140 addr->addr.id.ref = msg_origport(msg);
1141 addr->addr.id.node = msg_orignode(msg);
1142 addr->addr.name.domain = 0;
1143 addr->scope = 0;
1144 m->msg_namelen = sizeof(struct sockaddr_tipc);
1145 }
1146}
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158static int tipc_sk_anc_data_recv(struct msghdr *m, struct tipc_msg *msg,
1159 struct tipc_sock *tsk)
1160{
1161 u32 anc_data[3];
1162 u32 err;
1163 u32 dest_type;
1164 int has_name;
1165 int res;
1166
1167 if (likely(m->msg_controllen == 0))
1168 return 0;
1169
1170
1171 err = msg ? msg_errcode(msg) : 0;
1172 if (unlikely(err)) {
1173 anc_data[0] = err;
1174 anc_data[1] = msg_data_sz(msg);
1175 res = put_cmsg(m, SOL_TIPC, TIPC_ERRINFO, 8, anc_data);
1176 if (res)
1177 return res;
1178 if (anc_data[1]) {
1179 res = put_cmsg(m, SOL_TIPC, TIPC_RETDATA, anc_data[1],
1180 msg_data(msg));
1181 if (res)
1182 return res;
1183 }
1184 }
1185
1186
1187 dest_type = msg ? msg_type(msg) : TIPC_DIRECT_MSG;
1188 switch (dest_type) {
1189 case TIPC_NAMED_MSG:
1190 has_name = 1;
1191 anc_data[0] = msg_nametype(msg);
1192 anc_data[1] = msg_namelower(msg);
1193 anc_data[2] = msg_namelower(msg);
1194 break;
1195 case TIPC_MCAST_MSG:
1196 has_name = 1;
1197 anc_data[0] = msg_nametype(msg);
1198 anc_data[1] = msg_namelower(msg);
1199 anc_data[2] = msg_nameupper(msg);
1200 break;
1201 case TIPC_CONN_MSG:
1202 has_name = (tsk->conn_type != 0);
1203 anc_data[0] = tsk->conn_type;
1204 anc_data[1] = tsk->conn_instance;
1205 anc_data[2] = tsk->conn_instance;
1206 break;
1207 default:
1208 has_name = 0;
1209 }
1210 if (has_name) {
1211 res = put_cmsg(m, SOL_TIPC, TIPC_DESTNAME, 12, anc_data);
1212 if (res)
1213 return res;
1214 }
1215
1216 return 0;
1217}
1218
1219static void tipc_sk_send_ack(struct tipc_sock *tsk, uint ack)
1220{
1221 struct net *net = sock_net(&tsk->sk);
1222 struct sk_buff *skb = NULL;
1223 struct tipc_msg *msg;
1224 u32 peer_port = tsk_peer_port(tsk);
1225 u32 dnode = tsk_peer_node(tsk);
1226
1227 if (!tsk->connected)
1228 return;
1229 skb = tipc_msg_create(CONN_MANAGER, CONN_ACK, INT_H_SIZE, 0,
1230 dnode, tsk_own_node(tsk), peer_port,
1231 tsk->portid, TIPC_OK);
1232 if (!skb)
1233 return;
1234 msg = buf_msg(skb);
1235 msg_set_msgcnt(msg, ack);
1236 tipc_node_xmit_skb(net, skb, dnode, msg_link_selector(msg));
1237}
1238
1239static int tipc_wait_for_rcvmsg(struct socket *sock, long *timeop)
1240{
1241 struct sock *sk = sock->sk;
1242 DEFINE_WAIT(wait);
1243 long timeo = *timeop;
1244 int err;
1245
1246 for (;;) {
1247 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
1248 if (timeo && skb_queue_empty(&sk->sk_receive_queue)) {
1249 if (sock->state == SS_DISCONNECTING) {
1250 err = -ENOTCONN;
1251 break;
1252 }
1253 release_sock(sk);
1254 timeo = schedule_timeout(timeo);
1255 lock_sock(sk);
1256 }
1257 err = 0;
1258 if (!skb_queue_empty(&sk->sk_receive_queue))
1259 break;
1260 err = -EAGAIN;
1261 if (!timeo)
1262 break;
1263 err = sock_intr_errno(timeo);
1264 if (signal_pending(current))
1265 break;
1266 }
1267 finish_wait(sk_sleep(sk), &wait);
1268 *timeop = timeo;
1269 return err;
1270}
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283static int tipc_recvmsg(struct socket *sock, struct msghdr *m, size_t buf_len,
1284 int flags)
1285{
1286 struct sock *sk = sock->sk;
1287 struct tipc_sock *tsk = tipc_sk(sk);
1288 struct sk_buff *buf;
1289 struct tipc_msg *msg;
1290 long timeo;
1291 unsigned int sz;
1292 u32 err;
1293 int res;
1294
1295
1296 if (unlikely(!buf_len))
1297 return -EINVAL;
1298
1299 lock_sock(sk);
1300
1301 if (unlikely(sock->state == SS_UNCONNECTED)) {
1302 res = -ENOTCONN;
1303 goto exit;
1304 }
1305
1306 timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
1307restart:
1308
1309
1310 res = tipc_wait_for_rcvmsg(sock, &timeo);
1311 if (res)
1312 goto exit;
1313
1314
1315 buf = skb_peek(&sk->sk_receive_queue);
1316 msg = buf_msg(buf);
1317 sz = msg_data_sz(msg);
1318 err = msg_errcode(msg);
1319
1320
1321 if ((!sz) && (!err)) {
1322 tsk_advance_rx_queue(sk);
1323 goto restart;
1324 }
1325
1326
1327 set_orig_addr(m, msg);
1328
1329
1330 res = tipc_sk_anc_data_recv(m, msg, tsk);
1331 if (res)
1332 goto exit;
1333
1334
1335 if (!err) {
1336 if (unlikely(buf_len < sz)) {
1337 sz = buf_len;
1338 m->msg_flags |= MSG_TRUNC;
1339 }
1340 res = skb_copy_datagram_msg(buf, msg_hdr_sz(msg), m, sz);
1341 if (res)
1342 goto exit;
1343 res = sz;
1344 } else {
1345 if ((sock->state == SS_READY) ||
1346 ((err == TIPC_CONN_SHUTDOWN) || m->msg_control))
1347 res = 0;
1348 else
1349 res = -ECONNRESET;
1350 }
1351
1352
1353 if (likely(!(flags & MSG_PEEK))) {
1354 if ((sock->state != SS_READY) &&
1355 (++tsk->rcv_unacked >= TIPC_CONNACK_INTV)) {
1356 tipc_sk_send_ack(tsk, tsk->rcv_unacked);
1357 tsk->rcv_unacked = 0;
1358 }
1359 tsk_advance_rx_queue(sk);
1360 }
1361exit:
1362 release_sock(sk);
1363 return res;
1364}
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377static int tipc_recv_stream(struct socket *sock, struct msghdr *m,
1378 size_t buf_len, int flags)
1379{
1380 struct sock *sk = sock->sk;
1381 struct tipc_sock *tsk = tipc_sk(sk);
1382 struct sk_buff *buf;
1383 struct tipc_msg *msg;
1384 long timeo;
1385 unsigned int sz;
1386 int sz_to_copy, target, needed;
1387 int sz_copied = 0;
1388 u32 err;
1389 int res = 0;
1390
1391
1392 if (unlikely(!buf_len))
1393 return -EINVAL;
1394
1395 lock_sock(sk);
1396
1397 if (unlikely(sock->state == SS_UNCONNECTED)) {
1398 res = -ENOTCONN;
1399 goto exit;
1400 }
1401
1402 target = sock_rcvlowat(sk, flags & MSG_WAITALL, buf_len);
1403 timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
1404
1405restart:
1406
1407 res = tipc_wait_for_rcvmsg(sock, &timeo);
1408 if (res)
1409 goto exit;
1410
1411
1412 buf = skb_peek(&sk->sk_receive_queue);
1413 msg = buf_msg(buf);
1414 sz = msg_data_sz(msg);
1415 err = msg_errcode(msg);
1416
1417
1418 if ((!sz) && (!err)) {
1419 tsk_advance_rx_queue(sk);
1420 goto restart;
1421 }
1422
1423
1424 if (sz_copied == 0) {
1425 set_orig_addr(m, msg);
1426 res = tipc_sk_anc_data_recv(m, msg, tsk);
1427 if (res)
1428 goto exit;
1429 }
1430
1431
1432 if (!err) {
1433 u32 offset = (u32)(unsigned long)(TIPC_SKB_CB(buf)->handle);
1434
1435 sz -= offset;
1436 needed = (buf_len - sz_copied);
1437 sz_to_copy = (sz <= needed) ? sz : needed;
1438
1439 res = skb_copy_datagram_msg(buf, msg_hdr_sz(msg) + offset,
1440 m, sz_to_copy);
1441 if (res)
1442 goto exit;
1443
1444 sz_copied += sz_to_copy;
1445
1446 if (sz_to_copy < sz) {
1447 if (!(flags & MSG_PEEK))
1448 TIPC_SKB_CB(buf)->handle =
1449 (void *)(unsigned long)(offset + sz_to_copy);
1450 goto exit;
1451 }
1452 } else {
1453 if (sz_copied != 0)
1454 goto exit;
1455
1456 if ((err == TIPC_CONN_SHUTDOWN) || m->msg_control)
1457 res = 0;
1458 else
1459 res = -ECONNRESET;
1460 }
1461
1462
1463 if (likely(!(flags & MSG_PEEK))) {
1464 if (unlikely(++tsk->rcv_unacked >= TIPC_CONNACK_INTV)) {
1465 tipc_sk_send_ack(tsk, tsk->rcv_unacked);
1466 tsk->rcv_unacked = 0;
1467 }
1468 tsk_advance_rx_queue(sk);
1469 }
1470
1471
1472 if ((sz_copied < buf_len) &&
1473 (!skb_queue_empty(&sk->sk_receive_queue) ||
1474 (sz_copied < target)) &&
1475 (!(flags & MSG_PEEK)) &&
1476 (!err))
1477 goto restart;
1478
1479exit:
1480 release_sock(sk);
1481 return sz_copied ? sz_copied : res;
1482}
1483
1484
1485
1486
1487
1488static void tipc_write_space(struct sock *sk)
1489{
1490 struct socket_wq *wq;
1491
1492 rcu_read_lock();
1493 wq = rcu_dereference(sk->sk_wq);
1494 if (wq_has_sleeper(wq))
1495 wake_up_interruptible_sync_poll(&wq->wait, POLLOUT |
1496 POLLWRNORM | POLLWRBAND);
1497 rcu_read_unlock();
1498}
1499
1500
1501
1502
1503
1504
1505static void tipc_data_ready(struct sock *sk)
1506{
1507 struct socket_wq *wq;
1508
1509 rcu_read_lock();
1510 wq = rcu_dereference(sk->sk_wq);
1511 if (wq_has_sleeper(wq))
1512 wake_up_interruptible_sync_poll(&wq->wait, POLLIN |
1513 POLLRDNORM | POLLRDBAND);
1514 rcu_read_unlock();
1515}
1516
1517static void tipc_sock_destruct(struct sock *sk)
1518{
1519 __skb_queue_purge(&sk->sk_receive_queue);
1520}
1521
1522
1523
1524
1525
1526
1527
1528
1529static bool filter_connect(struct tipc_sock *tsk, struct sk_buff *skb)
1530{
1531 struct sock *sk = &tsk->sk;
1532 struct net *net = sock_net(sk);
1533 struct socket *sock = sk->sk_socket;
1534 struct tipc_msg *hdr = buf_msg(skb);
1535
1536 if (unlikely(msg_mcast(hdr)))
1537 return false;
1538
1539 switch ((int)sock->state) {
1540 case SS_CONNECTED:
1541
1542
1543 if (unlikely(!tsk_peer_msg(tsk, hdr)))
1544 return false;
1545
1546 if (unlikely(msg_errcode(hdr))) {
1547 sock->state = SS_DISCONNECTING;
1548 tsk->connected = 0;
1549
1550 tipc_node_remove_conn(net, tsk_peer_node(tsk),
1551 tsk->portid);
1552 }
1553 return true;
1554
1555 case SS_CONNECTING:
1556
1557
1558 if (unlikely(!msg_connected(hdr)))
1559 return false;
1560
1561 if (unlikely(msg_errcode(hdr))) {
1562 sock->state = SS_DISCONNECTING;
1563 sk->sk_err = ECONNREFUSED;
1564 return true;
1565 }
1566
1567 if (unlikely(!msg_isdata(hdr))) {
1568 sock->state = SS_DISCONNECTING;
1569 sk->sk_err = EINVAL;
1570 return true;
1571 }
1572
1573 tipc_sk_finish_conn(tsk, msg_origport(hdr), msg_orignode(hdr));
1574 msg_set_importance(&tsk->phdr, msg_importance(hdr));
1575 sock->state = SS_CONNECTED;
1576
1577
1578 if (msg_data_sz(hdr))
1579 return true;
1580
1581
1582 if (waitqueue_active(sk_sleep(sk)))
1583 wake_up_interruptible(sk_sleep(sk));
1584
1585
1586 msg_set_dest_droppable(hdr, 1);
1587 return false;
1588
1589 case SS_LISTENING:
1590 case SS_UNCONNECTED:
1591
1592
1593 if (!msg_connected(hdr) && !(msg_errcode(hdr)))
1594 return true;
1595 break;
1596 case SS_DISCONNECTING:
1597 break;
1598 default:
1599 pr_err("Unknown socket state %u\n", sock->state);
1600 }
1601 return false;
1602}
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622static unsigned int rcvbuf_limit(struct sock *sk, struct sk_buff *buf)
1623{
1624 struct tipc_msg *msg = buf_msg(buf);
1625
1626 if (msg_connected(msg))
1627 return sysctl_tipc_rmem[2];
1628
1629 return sk->sk_rcvbuf >> TIPC_CRITICAL_IMPORTANCE <<
1630 msg_importance(msg);
1631}
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645static bool filter_rcv(struct sock *sk, struct sk_buff *skb)
1646{
1647 struct socket *sock = sk->sk_socket;
1648 struct tipc_sock *tsk = tipc_sk(sk);
1649 struct tipc_msg *hdr = buf_msg(skb);
1650 unsigned int limit = rcvbuf_limit(sk, skb);
1651 int err = TIPC_OK;
1652 int usr = msg_user(hdr);
1653
1654 if (unlikely(msg_user(hdr) == CONN_MANAGER)) {
1655 tipc_sk_proto_rcv(tsk, skb);
1656 return false;
1657 }
1658
1659 if (unlikely(usr == SOCK_WAKEUP)) {
1660 kfree_skb(skb);
1661 tsk->link_cong = 0;
1662 sk->sk_write_space(sk);
1663 return false;
1664 }
1665
1666
1667 if (unlikely(msg_type(hdr) > TIPC_DIRECT_MSG)) {
1668 kfree_skb(skb);
1669 return false;
1670 }
1671
1672
1673 if (unlikely(sock->state == SS_READY)) {
1674 if (msg_connected(hdr)) {
1675 err = TIPC_ERR_NO_PORT;
1676 goto reject;
1677 }
1678 } else if (unlikely(!filter_connect(tsk, skb))) {
1679 err = TIPC_ERR_NO_PORT;
1680 goto reject;
1681 }
1682
1683
1684 if (unlikely(sk_rmem_alloc_get(sk) + skb->truesize >= limit)) {
1685 err = TIPC_ERR_OVERLOAD;
1686 goto reject;
1687 }
1688
1689
1690 TIPC_SKB_CB(skb)->handle = NULL;
1691 __skb_queue_tail(&sk->sk_receive_queue, skb);
1692 skb_set_owner_r(skb, sk);
1693
1694 sk->sk_data_ready(sk);
1695 return true;
1696
1697reject:
1698 tipc_sk_respond(sk, skb, err);
1699 return false;
1700}
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711static int tipc_backlog_rcv(struct sock *sk, struct sk_buff *skb)
1712{
1713 unsigned int truesize = skb->truesize;
1714
1715 if (likely(filter_rcv(sk, skb)))
1716 atomic_add(truesize, &tipc_sk(sk)->dupl_rcvcnt);
1717 return 0;
1718}
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729static void tipc_sk_enqueue(struct sk_buff_head *inputq, struct sock *sk,
1730 u32 dport)
1731{
1732 unsigned int lim;
1733 atomic_t *dcnt;
1734 struct sk_buff *skb;
1735 unsigned long time_limit = jiffies + 2;
1736
1737 while (skb_queue_len(inputq)) {
1738 if (unlikely(time_after_eq(jiffies, time_limit)))
1739 return;
1740
1741 skb = tipc_skb_dequeue(inputq, dport);
1742 if (unlikely(!skb))
1743 return;
1744
1745
1746 if (!sock_owned_by_user(sk)) {
1747 filter_rcv(sk, skb);
1748 continue;
1749 }
1750
1751
1752 dcnt = &tipc_sk(sk)->dupl_rcvcnt;
1753 if (sk->sk_backlog.len)
1754 atomic_set(dcnt, 0);
1755 lim = rcvbuf_limit(sk, skb) + atomic_read(dcnt);
1756 if (likely(!sk_add_backlog(sk, skb, lim)))
1757 continue;
1758
1759
1760 tipc_sk_respond(sk, skb, TIPC_ERR_OVERLOAD);
1761 break;
1762 }
1763}
1764
1765
1766
1767
1768
1769
1770
1771void tipc_sk_rcv(struct net *net, struct sk_buff_head *inputq)
1772{
1773 u32 dnode, dport = 0;
1774 int err;
1775 struct tipc_sock *tsk;
1776 struct sock *sk;
1777 struct sk_buff *skb;
1778
1779 while (skb_queue_len(inputq)) {
1780 dport = tipc_skb_peek_port(inputq, dport);
1781 tsk = tipc_sk_lookup(net, dport);
1782
1783 if (likely(tsk)) {
1784 sk = &tsk->sk;
1785 if (likely(spin_trylock_bh(&sk->sk_lock.slock))) {
1786 tipc_sk_enqueue(inputq, sk, dport);
1787 spin_unlock_bh(&sk->sk_lock.slock);
1788 }
1789 sock_put(sk);
1790 continue;
1791 }
1792
1793
1794 skb = tipc_skb_dequeue(inputq, dport);
1795 if (!skb)
1796 return;
1797
1798
1799 err = TIPC_ERR_NO_PORT;
1800 if (tipc_msg_lookup_dest(net, skb, &err))
1801 goto xmit;
1802
1803
1804 if (!tipc_msg_reverse(tipc_own_addr(net), &skb, err))
1805 continue;
1806xmit:
1807 dnode = msg_destnode(buf_msg(skb));
1808 tipc_node_xmit_skb(net, skb, dnode, dport);
1809 }
1810}
1811
1812static int tipc_wait_for_connect(struct socket *sock, long *timeo_p)
1813{
1814 struct sock *sk = sock->sk;
1815 DEFINE_WAIT(wait);
1816 int done;
1817
1818 do {
1819 int err = sock_error(sk);
1820 if (err)
1821 return err;
1822 if (!*timeo_p)
1823 return -ETIMEDOUT;
1824 if (signal_pending(current))
1825 return sock_intr_errno(*timeo_p);
1826
1827 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
1828 done = sk_wait_event(sk, timeo_p, sock->state != SS_CONNECTING);
1829 finish_wait(sk_sleep(sk), &wait);
1830 } while (!done);
1831 return 0;
1832}
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843static int tipc_connect(struct socket *sock, struct sockaddr *dest,
1844 int destlen, int flags)
1845{
1846 struct sock *sk = sock->sk;
1847 struct tipc_sock *tsk = tipc_sk(sk);
1848 struct sockaddr_tipc *dst = (struct sockaddr_tipc *)dest;
1849 struct msghdr m = {NULL,};
1850 long timeout = (flags & O_NONBLOCK) ? 0 : tsk->conn_timeout;
1851 socket_state previous;
1852 int res = 0;
1853
1854 lock_sock(sk);
1855
1856
1857 if (sock->state == SS_READY) {
1858 if (dst->family == AF_UNSPEC) {
1859 memset(&tsk->remote, 0, sizeof(struct sockaddr_tipc));
1860 tsk->connected = 0;
1861 } else if (destlen != sizeof(struct sockaddr_tipc)) {
1862 res = -EINVAL;
1863 } else {
1864 memcpy(&tsk->remote, dest, destlen);
1865 tsk->connected = 1;
1866 }
1867 goto exit;
1868 }
1869
1870
1871
1872
1873
1874
1875
1876 if (dst->addrtype == TIPC_ADDR_MCAST) {
1877 res = -EINVAL;
1878 goto exit;
1879 }
1880
1881 previous = sock->state;
1882 switch (sock->state) {
1883 case SS_UNCONNECTED:
1884
1885 m.msg_name = dest;
1886 m.msg_namelen = destlen;
1887
1888
1889
1890
1891 if (!timeout)
1892 m.msg_flags = MSG_DONTWAIT;
1893
1894 res = __tipc_sendmsg(sock, &m, 0);
1895 if ((res < 0) && (res != -EWOULDBLOCK))
1896 goto exit;
1897
1898
1899
1900
1901
1902 res = -EINPROGRESS;
1903 case SS_CONNECTING:
1904 if (previous == SS_CONNECTING)
1905 res = -EALREADY;
1906 if (!timeout)
1907 goto exit;
1908 timeout = msecs_to_jiffies(timeout);
1909
1910 res = tipc_wait_for_connect(sock, &timeout);
1911 break;
1912 case SS_CONNECTED:
1913 res = -EISCONN;
1914 break;
1915 default:
1916 res = -EINVAL;
1917 break;
1918 }
1919exit:
1920 release_sock(sk);
1921 return res;
1922}
1923
1924
1925
1926
1927
1928
1929
1930
1931static int tipc_listen(struct socket *sock, int len)
1932{
1933 struct sock *sk = sock->sk;
1934 int res;
1935
1936 lock_sock(sk);
1937
1938 if (sock->state != SS_UNCONNECTED)
1939 res = -EINVAL;
1940 else {
1941 sock->state = SS_LISTENING;
1942 res = 0;
1943 }
1944
1945 release_sock(sk);
1946 return res;
1947}
1948
1949static int tipc_wait_for_accept(struct socket *sock, long timeo)
1950{
1951 struct sock *sk = sock->sk;
1952 DEFINE_WAIT(wait);
1953 int err;
1954
1955
1956
1957
1958
1959
1960 for (;;) {
1961 prepare_to_wait_exclusive(sk_sleep(sk), &wait,
1962 TASK_INTERRUPTIBLE);
1963 if (timeo && skb_queue_empty(&sk->sk_receive_queue)) {
1964 release_sock(sk);
1965 timeo = schedule_timeout(timeo);
1966 lock_sock(sk);
1967 }
1968 err = 0;
1969 if (!skb_queue_empty(&sk->sk_receive_queue))
1970 break;
1971 err = -EINVAL;
1972 if (sock->state != SS_LISTENING)
1973 break;
1974 err = -EAGAIN;
1975 if (!timeo)
1976 break;
1977 err = sock_intr_errno(timeo);
1978 if (signal_pending(current))
1979 break;
1980 }
1981 finish_wait(sk_sleep(sk), &wait);
1982 return err;
1983}
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993static int tipc_accept(struct socket *sock, struct socket *new_sock, int flags)
1994{
1995 struct sock *new_sk, *sk = sock->sk;
1996 struct sk_buff *buf;
1997 struct tipc_sock *new_tsock;
1998 struct tipc_msg *msg;
1999 long timeo;
2000 int res;
2001
2002 lock_sock(sk);
2003
2004 if (sock->state != SS_LISTENING) {
2005 res = -EINVAL;
2006 goto exit;
2007 }
2008 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
2009 res = tipc_wait_for_accept(sock, timeo);
2010 if (res)
2011 goto exit;
2012
2013 buf = skb_peek(&sk->sk_receive_queue);
2014
2015 res = tipc_sk_create(sock_net(sock->sk), new_sock, 0, 1);
2016 if (res)
2017 goto exit;
2018 security_sk_clone(sock->sk, new_sock->sk);
2019
2020 new_sk = new_sock->sk;
2021 new_tsock = tipc_sk(new_sk);
2022 msg = buf_msg(buf);
2023
2024
2025 lock_sock_nested(new_sk, SINGLE_DEPTH_NESTING);
2026
2027
2028
2029
2030
2031 tsk_rej_rx_queue(new_sk);
2032
2033
2034 tipc_sk_finish_conn(new_tsock, msg_origport(msg), msg_orignode(msg));
2035 new_sock->state = SS_CONNECTED;
2036
2037 tsk_set_importance(new_tsock, msg_importance(msg));
2038 if (msg_named(msg)) {
2039 new_tsock->conn_type = msg_nametype(msg);
2040 new_tsock->conn_instance = msg_nameinst(msg);
2041 }
2042
2043
2044
2045
2046
2047 if (!msg_data_sz(msg)) {
2048 struct msghdr m = {NULL,};
2049
2050 tsk_advance_rx_queue(sk);
2051 __tipc_send_stream(new_sock, &m, 0);
2052 } else {
2053 __skb_dequeue(&sk->sk_receive_queue);
2054 __skb_queue_head(&new_sk->sk_receive_queue, buf);
2055 skb_set_owner_r(buf, new_sk);
2056 }
2057 release_sock(new_sk);
2058exit:
2059 release_sock(sk);
2060 return res;
2061}
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072static int tipc_shutdown(struct socket *sock, int how)
2073{
2074 struct sock *sk = sock->sk;
2075 struct net *net = sock_net(sk);
2076 struct tipc_sock *tsk = tipc_sk(sk);
2077 struct sk_buff *skb;
2078 u32 dnode = tsk_peer_node(tsk);
2079 u32 dport = tsk_peer_port(tsk);
2080 u32 onode = tipc_own_addr(net);
2081 u32 oport = tsk->portid;
2082 int res;
2083
2084 if (how != SHUT_RDWR)
2085 return -EINVAL;
2086
2087 lock_sock(sk);
2088
2089 switch (sock->state) {
2090 case SS_CONNECTING:
2091 case SS_CONNECTED:
2092
2093restart:
2094 dnode = tsk_peer_node(tsk);
2095
2096
2097 skb = __skb_dequeue(&sk->sk_receive_queue);
2098 if (skb) {
2099 if (TIPC_SKB_CB(skb)->handle != NULL) {
2100 kfree_skb(skb);
2101 goto restart;
2102 }
2103 tipc_sk_respond(sk, skb, TIPC_CONN_SHUTDOWN);
2104 } else {
2105 skb = tipc_msg_create(TIPC_CRITICAL_IMPORTANCE,
2106 TIPC_CONN_MSG, SHORT_H_SIZE,
2107 0, dnode, onode, dport, oport,
2108 TIPC_CONN_SHUTDOWN);
2109 tipc_node_xmit_skb(net, skb, dnode, tsk->portid);
2110 }
2111 tsk->connected = 0;
2112 sock->state = SS_DISCONNECTING;
2113 tipc_node_remove_conn(net, dnode, tsk->portid);
2114
2115
2116 case SS_DISCONNECTING:
2117
2118
2119 __skb_queue_purge(&sk->sk_receive_queue);
2120
2121
2122 sk->sk_state_change(sk);
2123 res = 0;
2124 break;
2125
2126 default:
2127 res = -ENOTCONN;
2128 }
2129
2130 release_sock(sk);
2131 return res;
2132}
2133
2134static void tipc_sk_timeout(unsigned long data)
2135{
2136 struct tipc_sock *tsk = (struct tipc_sock *)data;
2137 struct sock *sk = &tsk->sk;
2138 struct sk_buff *skb = NULL;
2139 u32 peer_port, peer_node;
2140 u32 own_node = tsk_own_node(tsk);
2141
2142 bh_lock_sock(sk);
2143 if (!tsk->connected) {
2144 bh_unlock_sock(sk);
2145 goto exit;
2146 }
2147 peer_port = tsk_peer_port(tsk);
2148 peer_node = tsk_peer_node(tsk);
2149
2150 if (tsk->probing_state == TIPC_CONN_PROBING) {
2151 if (!sock_owned_by_user(sk)) {
2152 sk->sk_socket->state = SS_DISCONNECTING;
2153 tsk->connected = 0;
2154 tipc_node_remove_conn(sock_net(sk), tsk_peer_node(tsk),
2155 tsk_peer_port(tsk));
2156 sk->sk_state_change(sk);
2157 } else {
2158
2159 sk_reset_timer(sk, &sk->sk_timer, (HZ / 20));
2160 }
2161
2162 } else {
2163 skb = tipc_msg_create(CONN_MANAGER, CONN_PROBE,
2164 INT_H_SIZE, 0, peer_node, own_node,
2165 peer_port, tsk->portid, TIPC_OK);
2166 tsk->probing_state = TIPC_CONN_PROBING;
2167 sk_reset_timer(sk, &sk->sk_timer, jiffies + tsk->probing_intv);
2168 }
2169 bh_unlock_sock(sk);
2170 if (skb)
2171 tipc_node_xmit_skb(sock_net(sk), skb, peer_node, tsk->portid);
2172exit:
2173 sock_put(sk);
2174}
2175
2176static int tipc_sk_publish(struct tipc_sock *tsk, uint scope,
2177 struct tipc_name_seq const *seq)
2178{
2179 struct net *net = sock_net(&tsk->sk);
2180 struct publication *publ;
2181 u32 key;
2182
2183 if (tsk->connected)
2184 return -EINVAL;
2185 key = tsk->portid + tsk->pub_count + 1;
2186 if (key == tsk->portid)
2187 return -EADDRINUSE;
2188
2189 publ = tipc_nametbl_publish(net, seq->type, seq->lower, seq->upper,
2190 scope, tsk->portid, key);
2191 if (unlikely(!publ))
2192 return -EINVAL;
2193
2194 list_add(&publ->pport_list, &tsk->publications);
2195 tsk->pub_count++;
2196 tsk->published = 1;
2197 return 0;
2198}
2199
2200static int tipc_sk_withdraw(struct tipc_sock *tsk, uint scope,
2201 struct tipc_name_seq const *seq)
2202{
2203 struct net *net = sock_net(&tsk->sk);
2204 struct publication *publ;
2205 struct publication *safe;
2206 int rc = -EINVAL;
2207
2208 list_for_each_entry_safe(publ, safe, &tsk->publications, pport_list) {
2209 if (seq) {
2210 if (publ->scope != scope)
2211 continue;
2212 if (publ->type != seq->type)
2213 continue;
2214 if (publ->lower != seq->lower)
2215 continue;
2216 if (publ->upper != seq->upper)
2217 break;
2218 tipc_nametbl_withdraw(net, publ->type, publ->lower,
2219 publ->ref, publ->key);
2220 rc = 0;
2221 break;
2222 }
2223 tipc_nametbl_withdraw(net, publ->type, publ->lower,
2224 publ->ref, publ->key);
2225 rc = 0;
2226 }
2227 if (list_empty(&tsk->publications))
2228 tsk->published = 0;
2229 return rc;
2230}
2231
2232
2233
2234
2235void tipc_sk_reinit(struct net *net)
2236{
2237 struct tipc_net *tn = net_generic(net, tipc_net_id);
2238 const struct bucket_table *tbl;
2239 struct rhash_head *pos;
2240 struct tipc_sock *tsk;
2241 struct tipc_msg *msg;
2242 int i;
2243
2244 rcu_read_lock();
2245 tbl = rht_dereference_rcu((&tn->sk_rht)->tbl, &tn->sk_rht);
2246 for (i = 0; i < tbl->size; i++) {
2247 rht_for_each_entry_rcu(tsk, pos, tbl, i, node) {
2248 spin_lock_bh(&tsk->sk.sk_lock.slock);
2249 msg = &tsk->phdr;
2250 msg_set_prevnode(msg, tn->own_addr);
2251 msg_set_orignode(msg, tn->own_addr);
2252 spin_unlock_bh(&tsk->sk.sk_lock.slock);
2253 }
2254 }
2255 rcu_read_unlock();
2256}
2257
2258static struct tipc_sock *tipc_sk_lookup(struct net *net, u32 portid)
2259{
2260 struct tipc_net *tn = net_generic(net, tipc_net_id);
2261 struct tipc_sock *tsk;
2262
2263 rcu_read_lock();
2264 tsk = rhashtable_lookup_fast(&tn->sk_rht, &portid, tsk_rht_params);
2265 if (tsk)
2266 sock_hold(&tsk->sk);
2267 rcu_read_unlock();
2268
2269 return tsk;
2270}
2271
2272static int tipc_sk_insert(struct tipc_sock *tsk)
2273{
2274 struct sock *sk = &tsk->sk;
2275 struct net *net = sock_net(sk);
2276 struct tipc_net *tn = net_generic(net, tipc_net_id);
2277 u32 remaining = (TIPC_MAX_PORT - TIPC_MIN_PORT) + 1;
2278 u32 portid = prandom_u32() % remaining + TIPC_MIN_PORT;
2279
2280 while (remaining--) {
2281 portid++;
2282 if ((portid < TIPC_MIN_PORT) || (portid > TIPC_MAX_PORT))
2283 portid = TIPC_MIN_PORT;
2284 tsk->portid = portid;
2285 sock_hold(&tsk->sk);
2286 if (!rhashtable_lookup_insert_fast(&tn->sk_rht, &tsk->node,
2287 tsk_rht_params))
2288 return 0;
2289 sock_put(&tsk->sk);
2290 }
2291
2292 return -1;
2293}
2294
2295static void tipc_sk_remove(struct tipc_sock *tsk)
2296{
2297 struct sock *sk = &tsk->sk;
2298 struct tipc_net *tn = net_generic(sock_net(sk), tipc_net_id);
2299
2300 if (!rhashtable_remove_fast(&tn->sk_rht, &tsk->node, tsk_rht_params)) {
2301 WARN_ON(atomic_read(&sk->sk_refcnt) == 1);
2302 __sock_put(sk);
2303 }
2304}
2305
2306static const struct rhashtable_params tsk_rht_params = {
2307 .nelem_hint = 192,
2308 .head_offset = offsetof(struct tipc_sock, node),
2309 .key_offset = offsetof(struct tipc_sock, portid),
2310 .key_len = sizeof(u32),
2311 .max_size = 1048576,
2312 .min_size = 256,
2313 .automatic_shrinking = true,
2314};
2315
2316int tipc_sk_rht_init(struct net *net)
2317{
2318 struct tipc_net *tn = net_generic(net, tipc_net_id);
2319
2320 return rhashtable_init(&tn->sk_rht, &tsk_rht_params);
2321}
2322
2323void tipc_sk_rht_destroy(struct net *net)
2324{
2325 struct tipc_net *tn = net_generic(net, tipc_net_id);
2326
2327
2328 synchronize_net();
2329
2330 rhashtable_destroy(&tn->sk_rht);
2331}
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346static int tipc_setsockopt(struct socket *sock, int lvl, int opt,
2347 char __user *ov, unsigned int ol)
2348{
2349 struct sock *sk = sock->sk;
2350 struct tipc_sock *tsk = tipc_sk(sk);
2351 u32 value;
2352 int res;
2353
2354 if ((lvl == IPPROTO_TCP) && (sock->type == SOCK_STREAM))
2355 return 0;
2356 if (lvl != SOL_TIPC)
2357 return -ENOPROTOOPT;
2358 if (ol < sizeof(value))
2359 return -EINVAL;
2360 res = get_user(value, (u32 __user *)ov);
2361 if (res)
2362 return res;
2363
2364 lock_sock(sk);
2365
2366 switch (opt) {
2367 case TIPC_IMPORTANCE:
2368 res = tsk_set_importance(tsk, value);
2369 break;
2370 case TIPC_SRC_DROPPABLE:
2371 if (sock->type != SOCK_STREAM)
2372 tsk_set_unreliable(tsk, value);
2373 else
2374 res = -ENOPROTOOPT;
2375 break;
2376 case TIPC_DEST_DROPPABLE:
2377 tsk_set_unreturnable(tsk, value);
2378 break;
2379 case TIPC_CONN_TIMEOUT:
2380 tipc_sk(sk)->conn_timeout = value;
2381
2382 break;
2383 default:
2384 res = -EINVAL;
2385 }
2386
2387 release_sock(sk);
2388
2389 return res;
2390}
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405static int tipc_getsockopt(struct socket *sock, int lvl, int opt,
2406 char __user *ov, int __user *ol)
2407{
2408 struct sock *sk = sock->sk;
2409 struct tipc_sock *tsk = tipc_sk(sk);
2410 int len;
2411 u32 value;
2412 int res;
2413
2414 if ((lvl == IPPROTO_TCP) && (sock->type == SOCK_STREAM))
2415 return put_user(0, ol);
2416 if (lvl != SOL_TIPC)
2417 return -ENOPROTOOPT;
2418 res = get_user(len, ol);
2419 if (res)
2420 return res;
2421
2422 lock_sock(sk);
2423
2424 switch (opt) {
2425 case TIPC_IMPORTANCE:
2426 value = tsk_importance(tsk);
2427 break;
2428 case TIPC_SRC_DROPPABLE:
2429 value = tsk_unreliable(tsk);
2430 break;
2431 case TIPC_DEST_DROPPABLE:
2432 value = tsk_unreturnable(tsk);
2433 break;
2434 case TIPC_CONN_TIMEOUT:
2435 value = tsk->conn_timeout;
2436
2437 break;
2438 case TIPC_NODE_RECVQ_DEPTH:
2439 value = 0;
2440 break;
2441 case TIPC_SOCK_RECVQ_DEPTH:
2442 value = skb_queue_len(&sk->sk_receive_queue);
2443 break;
2444 default:
2445 res = -EINVAL;
2446 }
2447
2448 release_sock(sk);
2449
2450 if (res)
2451 return res;
2452
2453 if (len < sizeof(value))
2454 return -EINVAL;
2455
2456 if (copy_to_user(ov, &value, sizeof(value)))
2457 return -EFAULT;
2458
2459 return put_user(sizeof(value), ol);
2460}
2461
2462static int tipc_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
2463{
2464 struct sock *sk = sock->sk;
2465 struct tipc_sioc_ln_req lnr;
2466 void __user *argp = (void __user *)arg;
2467
2468 switch (cmd) {
2469 case SIOCGETLINKNAME:
2470 if (copy_from_user(&lnr, argp, sizeof(lnr)))
2471 return -EFAULT;
2472 if (!tipc_node_get_linkname(sock_net(sk),
2473 lnr.bearer_id & 0xffff, lnr.peer,
2474 lnr.linkname, TIPC_MAX_LINK_NAME)) {
2475 if (copy_to_user(argp, &lnr, sizeof(lnr)))
2476 return -EFAULT;
2477 return 0;
2478 }
2479 return -EADDRNOTAVAIL;
2480 default:
2481 return -ENOIOCTLCMD;
2482 }
2483}
2484
2485
2486
2487static const struct proto_ops msg_ops = {
2488 .owner = THIS_MODULE,
2489 .family = AF_TIPC,
2490 .release = tipc_release,
2491 .bind = tipc_bind,
2492 .connect = tipc_connect,
2493 .socketpair = sock_no_socketpair,
2494 .accept = sock_no_accept,
2495 .getname = tipc_getname,
2496 .poll = tipc_poll,
2497 .ioctl = tipc_ioctl,
2498 .listen = sock_no_listen,
2499 .shutdown = tipc_shutdown,
2500 .setsockopt = tipc_setsockopt,
2501 .getsockopt = tipc_getsockopt,
2502 .sendmsg = tipc_sendmsg,
2503 .recvmsg = tipc_recvmsg,
2504 .mmap = sock_no_mmap,
2505 .sendpage = sock_no_sendpage
2506};
2507
2508static const struct proto_ops packet_ops = {
2509 .owner = THIS_MODULE,
2510 .family = AF_TIPC,
2511 .release = tipc_release,
2512 .bind = tipc_bind,
2513 .connect = tipc_connect,
2514 .socketpair = sock_no_socketpair,
2515 .accept = tipc_accept,
2516 .getname = tipc_getname,
2517 .poll = tipc_poll,
2518 .ioctl = tipc_ioctl,
2519 .listen = tipc_listen,
2520 .shutdown = tipc_shutdown,
2521 .setsockopt = tipc_setsockopt,
2522 .getsockopt = tipc_getsockopt,
2523 .sendmsg = tipc_send_packet,
2524 .recvmsg = tipc_recvmsg,
2525 .mmap = sock_no_mmap,
2526 .sendpage = sock_no_sendpage
2527};
2528
2529static const struct proto_ops stream_ops = {
2530 .owner = THIS_MODULE,
2531 .family = AF_TIPC,
2532 .release = tipc_release,
2533 .bind = tipc_bind,
2534 .connect = tipc_connect,
2535 .socketpair = sock_no_socketpair,
2536 .accept = tipc_accept,
2537 .getname = tipc_getname,
2538 .poll = tipc_poll,
2539 .ioctl = tipc_ioctl,
2540 .listen = tipc_listen,
2541 .shutdown = tipc_shutdown,
2542 .setsockopt = tipc_setsockopt,
2543 .getsockopt = tipc_getsockopt,
2544 .sendmsg = tipc_send_stream,
2545 .recvmsg = tipc_recv_stream,
2546 .mmap = sock_no_mmap,
2547 .sendpage = sock_no_sendpage
2548};
2549
2550static const struct net_proto_family tipc_family_ops = {
2551 .owner = THIS_MODULE,
2552 .family = AF_TIPC,
2553 .create = tipc_sk_create
2554};
2555
2556static struct proto tipc_proto = {
2557 .name = "TIPC",
2558 .owner = THIS_MODULE,
2559 .obj_size = sizeof(struct tipc_sock),
2560 .sysctl_rmem = sysctl_tipc_rmem
2561};
2562
2563
2564
2565
2566
2567
2568int tipc_socket_init(void)
2569{
2570 int res;
2571
2572 res = proto_register(&tipc_proto, 1);
2573 if (res) {
2574 pr_err("Failed to register TIPC protocol type\n");
2575 goto out;
2576 }
2577
2578 res = sock_register(&tipc_family_ops);
2579 if (res) {
2580 pr_err("Failed to register TIPC socket type\n");
2581 proto_unregister(&tipc_proto);
2582 goto out;
2583 }
2584 out:
2585 return res;
2586}
2587
2588
2589
2590
2591void tipc_socket_stop(void)
2592{
2593 sock_unregister(tipc_family_ops.family);
2594 proto_unregister(&tipc_proto);
2595}
2596
2597
2598static int __tipc_nl_add_sk_con(struct sk_buff *skb, struct tipc_sock *tsk)
2599{
2600 u32 peer_node;
2601 u32 peer_port;
2602 struct nlattr *nest;
2603
2604 peer_node = tsk_peer_node(tsk);
2605 peer_port = tsk_peer_port(tsk);
2606
2607 nest = nla_nest_start(skb, TIPC_NLA_SOCK_CON);
2608
2609 if (nla_put_u32(skb, TIPC_NLA_CON_NODE, peer_node))
2610 goto msg_full;
2611 if (nla_put_u32(skb, TIPC_NLA_CON_SOCK, peer_port))
2612 goto msg_full;
2613
2614 if (tsk->conn_type != 0) {
2615 if (nla_put_flag(skb, TIPC_NLA_CON_FLAG))
2616 goto msg_full;
2617 if (nla_put_u32(skb, TIPC_NLA_CON_TYPE, tsk->conn_type))
2618 goto msg_full;
2619 if (nla_put_u32(skb, TIPC_NLA_CON_INST, tsk->conn_instance))
2620 goto msg_full;
2621 }
2622 nla_nest_end(skb, nest);
2623
2624 return 0;
2625
2626msg_full:
2627 nla_nest_cancel(skb, nest);
2628
2629 return -EMSGSIZE;
2630}
2631
2632
2633static int __tipc_nl_add_sk(struct sk_buff *skb, struct netlink_callback *cb,
2634 struct tipc_sock *tsk)
2635{
2636 int err;
2637 void *hdr;
2638 struct nlattr *attrs;
2639 struct net *net = sock_net(skb->sk);
2640 struct tipc_net *tn = net_generic(net, tipc_net_id);
2641
2642 hdr = genlmsg_put(skb, NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq,
2643 &tipc_genl_family, NLM_F_MULTI, TIPC_NL_SOCK_GET);
2644 if (!hdr)
2645 goto msg_cancel;
2646
2647 attrs = nla_nest_start(skb, TIPC_NLA_SOCK);
2648 if (!attrs)
2649 goto genlmsg_cancel;
2650 if (nla_put_u32(skb, TIPC_NLA_SOCK_REF, tsk->portid))
2651 goto attr_msg_cancel;
2652 if (nla_put_u32(skb, TIPC_NLA_SOCK_ADDR, tn->own_addr))
2653 goto attr_msg_cancel;
2654
2655 if (tsk->connected) {
2656 err = __tipc_nl_add_sk_con(skb, tsk);
2657 if (err)
2658 goto attr_msg_cancel;
2659 } else if (!list_empty(&tsk->publications)) {
2660 if (nla_put_flag(skb, TIPC_NLA_SOCK_HAS_PUBL))
2661 goto attr_msg_cancel;
2662 }
2663 nla_nest_end(skb, attrs);
2664 genlmsg_end(skb, hdr);
2665
2666 return 0;
2667
2668attr_msg_cancel:
2669 nla_nest_cancel(skb, attrs);
2670genlmsg_cancel:
2671 genlmsg_cancel(skb, hdr);
2672msg_cancel:
2673 return -EMSGSIZE;
2674}
2675
2676int tipc_nl_sk_dump(struct sk_buff *skb, struct netlink_callback *cb)
2677{
2678 int err;
2679 struct tipc_sock *tsk;
2680 const struct bucket_table *tbl;
2681 struct rhash_head *pos;
2682 struct net *net = sock_net(skb->sk);
2683 struct tipc_net *tn = net_generic(net, tipc_net_id);
2684 u32 tbl_id = cb->args[0];
2685 u32 prev_portid = cb->args[1];
2686
2687 rcu_read_lock();
2688 tbl = rht_dereference_rcu((&tn->sk_rht)->tbl, &tn->sk_rht);
2689 for (; tbl_id < tbl->size; tbl_id++) {
2690 rht_for_each_entry_rcu(tsk, pos, tbl, tbl_id, node) {
2691 spin_lock_bh(&tsk->sk.sk_lock.slock);
2692 if (prev_portid && prev_portid != tsk->portid) {
2693 spin_unlock_bh(&tsk->sk.sk_lock.slock);
2694 continue;
2695 }
2696
2697 err = __tipc_nl_add_sk(skb, cb, tsk);
2698 if (err) {
2699 prev_portid = tsk->portid;
2700 spin_unlock_bh(&tsk->sk.sk_lock.slock);
2701 goto out;
2702 }
2703 prev_portid = 0;
2704 spin_unlock_bh(&tsk->sk.sk_lock.slock);
2705 }
2706 }
2707out:
2708 rcu_read_unlock();
2709 cb->args[0] = tbl_id;
2710 cb->args[1] = prev_portid;
2711
2712 return skb->len;
2713}
2714
2715
2716static int __tipc_nl_add_sk_publ(struct sk_buff *skb,
2717 struct netlink_callback *cb,
2718 struct publication *publ)
2719{
2720 void *hdr;
2721 struct nlattr *attrs;
2722
2723 hdr = genlmsg_put(skb, NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq,
2724 &tipc_genl_family, NLM_F_MULTI, TIPC_NL_PUBL_GET);
2725 if (!hdr)
2726 goto msg_cancel;
2727
2728 attrs = nla_nest_start(skb, TIPC_NLA_PUBL);
2729 if (!attrs)
2730 goto genlmsg_cancel;
2731
2732 if (nla_put_u32(skb, TIPC_NLA_PUBL_KEY, publ->key))
2733 goto attr_msg_cancel;
2734 if (nla_put_u32(skb, TIPC_NLA_PUBL_TYPE, publ->type))
2735 goto attr_msg_cancel;
2736 if (nla_put_u32(skb, TIPC_NLA_PUBL_LOWER, publ->lower))
2737 goto attr_msg_cancel;
2738 if (nla_put_u32(skb, TIPC_NLA_PUBL_UPPER, publ->upper))
2739 goto attr_msg_cancel;
2740
2741 nla_nest_end(skb, attrs);
2742 genlmsg_end(skb, hdr);
2743
2744 return 0;
2745
2746attr_msg_cancel:
2747 nla_nest_cancel(skb, attrs);
2748genlmsg_cancel:
2749 genlmsg_cancel(skb, hdr);
2750msg_cancel:
2751 return -EMSGSIZE;
2752}
2753
2754
2755static int __tipc_nl_list_sk_publ(struct sk_buff *skb,
2756 struct netlink_callback *cb,
2757 struct tipc_sock *tsk, u32 *last_publ)
2758{
2759 int err;
2760 struct publication *p;
2761
2762 if (*last_publ) {
2763 list_for_each_entry(p, &tsk->publications, pport_list) {
2764 if (p->key == *last_publ)
2765 break;
2766 }
2767 if (p->key != *last_publ) {
2768
2769
2770
2771
2772
2773
2774 cb->prev_seq = 1;
2775 *last_publ = 0;
2776 return -EPIPE;
2777 }
2778 } else {
2779 p = list_first_entry(&tsk->publications, struct publication,
2780 pport_list);
2781 }
2782
2783 list_for_each_entry_from(p, &tsk->publications, pport_list) {
2784 err = __tipc_nl_add_sk_publ(skb, cb, p);
2785 if (err) {
2786 *last_publ = p->key;
2787 return err;
2788 }
2789 }
2790 *last_publ = 0;
2791
2792 return 0;
2793}
2794
2795int tipc_nl_publ_dump(struct sk_buff *skb, struct netlink_callback *cb)
2796{
2797 int err;
2798 u32 tsk_portid = cb->args[0];
2799 u32 last_publ = cb->args[1];
2800 u32 done = cb->args[2];
2801 struct net *net = sock_net(skb->sk);
2802 struct tipc_sock *tsk;
2803
2804 if (!tsk_portid) {
2805 struct nlattr **attrs;
2806 struct nlattr *sock[TIPC_NLA_SOCK_MAX + 1];
2807
2808 err = tipc_nlmsg_parse(cb->nlh, &attrs);
2809 if (err)
2810 return err;
2811
2812 err = nla_parse_nested(sock, TIPC_NLA_SOCK_MAX,
2813 attrs[TIPC_NLA_SOCK],
2814 tipc_nl_sock_policy);
2815 if (err)
2816 return err;
2817
2818 if (!sock[TIPC_NLA_SOCK_REF])
2819 return -EINVAL;
2820
2821 tsk_portid = nla_get_u32(sock[TIPC_NLA_SOCK_REF]);
2822 }
2823
2824 if (done)
2825 return 0;
2826
2827 tsk = tipc_sk_lookup(net, tsk_portid);
2828 if (!tsk)
2829 return -EINVAL;
2830
2831 lock_sock(&tsk->sk);
2832 err = __tipc_nl_list_sk_publ(skb, cb, tsk, &last_publ);
2833 if (!err)
2834 done = 1;
2835 release_sock(&tsk->sk);
2836 sock_put(&tsk->sk);
2837
2838 cb->args[0] = tsk_portid;
2839 cb->args[1] = last_publ;
2840 cb->args[2] = done;
2841
2842 return skb->len;
2843}
2844