1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38#include <linux/rhashtable.h>
39#include <linux/sched/signal.h>
40
41#include "core.h"
42#include "name_table.h"
43#include "node.h"
44#include "link.h"
45#include "name_distr.h"
46#include "socket.h"
47#include "bcast.h"
48#include "netlink.h"
49#include "group.h"
50#include "trace.h"
51
52#define NAGLE_START_INIT 4
53#define NAGLE_START_MAX 1024
54#define CONN_TIMEOUT_DEFAULT 8000
55#define CONN_PROBING_INTV msecs_to_jiffies(3600000)
56#define TIPC_MAX_PORT 0xffffffff
57#define TIPC_MIN_PORT 1
58#define TIPC_ACK_RATE 4
59
60enum {
61 TIPC_LISTEN = TCP_LISTEN,
62 TIPC_ESTABLISHED = TCP_ESTABLISHED,
63 TIPC_OPEN = TCP_CLOSE,
64 TIPC_DISCONNECTING = TCP_CLOSE_WAIT,
65 TIPC_CONNECTING = TCP_SYN_SENT,
66};
67
68struct sockaddr_pair {
69 struct sockaddr_tipc sock;
70 struct sockaddr_tipc member;
71};
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109struct tipc_sock {
110 struct sock sk;
111 u32 max_pkt;
112 u32 maxnagle;
113 u32 portid;
114 struct tipc_msg phdr;
115 struct list_head cong_links;
116 struct list_head publications;
117 u32 pub_count;
118 atomic_t dupl_rcvcnt;
119 u16 conn_timeout;
120 bool probe_unacked;
121 u16 cong_link_cnt;
122 u16 snt_unacked;
123 u16 snd_win;
124 u16 peer_caps;
125 u16 rcv_unacked;
126 u16 rcv_win;
127 struct sockaddr_tipc peer;
128 struct rhash_head node;
129 struct tipc_mc_method mc_method;
130 struct rcu_head rcu;
131 struct tipc_group *group;
132 u32 oneway;
133 u32 nagle_start;
134 u16 snd_backlog;
135 u16 msg_acc;
136 u16 pkt_cnt;
137 bool expect_ack;
138 bool nodelay;
139 bool group_is_open;
140 bool published;
141 u8 conn_addrtype;
142};
143
144static int tipc_sk_backlog_rcv(struct sock *sk, struct sk_buff *skb);
145static void tipc_data_ready(struct sock *sk);
146static void tipc_write_space(struct sock *sk);
147static void tipc_sock_destruct(struct sock *sk);
148static int tipc_release(struct socket *sock);
149static int tipc_accept(struct socket *sock, struct socket *new_sock, int flags,
150 bool kern);
151static void tipc_sk_timeout(struct timer_list *t);
152static int tipc_sk_publish(struct tipc_sock *tsk, struct tipc_uaddr *ua);
153static int tipc_sk_withdraw(struct tipc_sock *tsk, struct tipc_uaddr *ua);
154static int tipc_sk_leave(struct tipc_sock *tsk);
155static struct tipc_sock *tipc_sk_lookup(struct net *net, u32 portid);
156static int tipc_sk_insert(struct tipc_sock *tsk);
157static void tipc_sk_remove(struct tipc_sock *tsk);
158static int __tipc_sendstream(struct socket *sock, struct msghdr *m, size_t dsz);
159static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dsz);
160static void tipc_sk_push_backlog(struct tipc_sock *tsk, bool nagle_ack);
161static int tipc_wait_for_connect(struct socket *sock, long *timeo_p);
162
163static const struct proto_ops packet_ops;
164static const struct proto_ops stream_ops;
165static const struct proto_ops msg_ops;
166static struct proto tipc_proto;
167static const struct rhashtable_params tsk_rht_params;
168
169static u32 tsk_own_node(struct tipc_sock *tsk)
170{
171 return msg_prevnode(&tsk->phdr);
172}
173
174static u32 tsk_peer_node(struct tipc_sock *tsk)
175{
176 return msg_destnode(&tsk->phdr);
177}
178
179static u32 tsk_peer_port(struct tipc_sock *tsk)
180{
181 return msg_destport(&tsk->phdr);
182}
183
184static bool tsk_unreliable(struct tipc_sock *tsk)
185{
186 return msg_src_droppable(&tsk->phdr) != 0;
187}
188
189static void tsk_set_unreliable(struct tipc_sock *tsk, bool unreliable)
190{
191 msg_set_src_droppable(&tsk->phdr, unreliable ? 1 : 0);
192}
193
194static bool tsk_unreturnable(struct tipc_sock *tsk)
195{
196 return msg_dest_droppable(&tsk->phdr) != 0;
197}
198
199static void tsk_set_unreturnable(struct tipc_sock *tsk, bool unreturnable)
200{
201 msg_set_dest_droppable(&tsk->phdr, unreturnable ? 1 : 0);
202}
203
204static int tsk_importance(struct tipc_sock *tsk)
205{
206 return msg_importance(&tsk->phdr);
207}
208
209static struct tipc_sock *tipc_sk(const struct sock *sk)
210{
211 return container_of(sk, struct tipc_sock, sk);
212}
213
214int tsk_set_importance(struct sock *sk, int imp)
215{
216 if (imp > TIPC_CRITICAL_IMPORTANCE)
217 return -EINVAL;
218 msg_set_importance(&tipc_sk(sk)->phdr, (u32)imp);
219 return 0;
220}
221
222static bool tsk_conn_cong(struct tipc_sock *tsk)
223{
224 return tsk->snt_unacked > tsk->snd_win;
225}
226
227static u16 tsk_blocks(int len)
228{
229 return ((len / FLOWCTL_BLK_SZ) + 1);
230}
231
232
233
234
235
236static u16 tsk_adv_blocks(int len)
237{
238 return len / FLOWCTL_BLK_SZ / 4;
239}
240
241
242
243
244
245static u16 tsk_inc(struct tipc_sock *tsk, int msglen)
246{
247 if (likely(tsk->peer_caps & TIPC_BLOCK_FLOWCTL))
248 return ((msglen / FLOWCTL_BLK_SZ) + 1);
249 return 1;
250}
251
252
253
254static void tsk_set_nagle(struct tipc_sock *tsk)
255{
256 struct sock *sk = &tsk->sk;
257
258 tsk->maxnagle = 0;
259 if (sk->sk_type != SOCK_STREAM)
260 return;
261 if (tsk->nodelay)
262 return;
263 if (!(tsk->peer_caps & TIPC_NAGLE))
264 return;
265
266 if (tsk->max_pkt == MAX_MSG_SIZE)
267 tsk->maxnagle = 1500;
268 else
269 tsk->maxnagle = tsk->max_pkt;
270}
271
272
273
274
275
276
277
278static void tsk_advance_rx_queue(struct sock *sk)
279{
280 trace_tipc_sk_advance_rx(sk, NULL, TIPC_DUMP_SK_RCVQ, " ");
281 kfree_skb(__skb_dequeue(&sk->sk_receive_queue));
282}
283
284
285
286static void tipc_sk_respond(struct sock *sk, struct sk_buff *skb, int err)
287{
288 u32 selector;
289 u32 dnode;
290 u32 onode = tipc_own_addr(sock_net(sk));
291
292 if (!tipc_msg_reverse(onode, &skb, err))
293 return;
294
295 trace_tipc_sk_rej_msg(sk, skb, TIPC_DUMP_NONE, "@sk_respond!");
296 dnode = msg_destnode(buf_msg(skb));
297 selector = msg_origport(buf_msg(skb));
298 tipc_node_xmit_skb(sock_net(sk), skb, dnode, selector);
299}
300
301
302
303
304
305
306
307
308static void tsk_rej_rx_queue(struct sock *sk, int error)
309{
310 struct sk_buff *skb;
311
312 while ((skb = __skb_dequeue(&sk->sk_receive_queue)))
313 tipc_sk_respond(sk, skb, error);
314}
315
316static bool tipc_sk_connected(struct sock *sk)
317{
318 return sk->sk_state == TIPC_ESTABLISHED;
319}
320
321
322
323
324
325
326static bool tipc_sk_type_connectionless(struct sock *sk)
327{
328 return sk->sk_type == SOCK_RDM || sk->sk_type == SOCK_DGRAM;
329}
330
331
332
333
334
335
336static bool tsk_peer_msg(struct tipc_sock *tsk, struct tipc_msg *msg)
337{
338 struct sock *sk = &tsk->sk;
339 u32 self = tipc_own_addr(sock_net(sk));
340 u32 peer_port = tsk_peer_port(tsk);
341 u32 orig_node, peer_node;
342
343 if (unlikely(!tipc_sk_connected(sk)))
344 return false;
345
346 if (unlikely(msg_origport(msg) != peer_port))
347 return false;
348
349 orig_node = msg_orignode(msg);
350 peer_node = tsk_peer_node(tsk);
351
352 if (likely(orig_node == peer_node))
353 return true;
354
355 if (!orig_node && peer_node == self)
356 return true;
357
358 if (!peer_node && orig_node == self)
359 return true;
360
361 return false;
362}
363
364
365
366
367
368
369
370
371static int tipc_set_sk_state(struct sock *sk, int state)
372{
373 int oldsk_state = sk->sk_state;
374 int res = -EINVAL;
375
376 switch (state) {
377 case TIPC_OPEN:
378 res = 0;
379 break;
380 case TIPC_LISTEN:
381 case TIPC_CONNECTING:
382 if (oldsk_state == TIPC_OPEN)
383 res = 0;
384 break;
385 case TIPC_ESTABLISHED:
386 if (oldsk_state == TIPC_CONNECTING ||
387 oldsk_state == TIPC_OPEN)
388 res = 0;
389 break;
390 case TIPC_DISCONNECTING:
391 if (oldsk_state == TIPC_CONNECTING ||
392 oldsk_state == TIPC_ESTABLISHED)
393 res = 0;
394 break;
395 }
396
397 if (!res)
398 sk->sk_state = state;
399
400 return res;
401}
402
403static int tipc_sk_sock_err(struct socket *sock, long *timeout)
404{
405 struct sock *sk = sock->sk;
406 int err = sock_error(sk);
407 int typ = sock->type;
408
409 if (err)
410 return err;
411 if (typ == SOCK_STREAM || typ == SOCK_SEQPACKET) {
412 if (sk->sk_state == TIPC_DISCONNECTING)
413 return -EPIPE;
414 else if (!tipc_sk_connected(sk))
415 return -ENOTCONN;
416 }
417 if (!*timeout)
418 return -EAGAIN;
419 if (signal_pending(current))
420 return sock_intr_errno(*timeout);
421
422 return 0;
423}
424
425#define tipc_wait_for_cond(sock_, timeo_, condition_) \
426({ \
427 DEFINE_WAIT_FUNC(wait_, woken_wake_function); \
428 struct sock *sk_; \
429 int rc_; \
430 \
431 while ((rc_ = !(condition_))) { \
432 \
433 smp_rmb(); \
434 sk_ = (sock_)->sk; \
435 rc_ = tipc_sk_sock_err((sock_), timeo_); \
436 if (rc_) \
437 break; \
438 add_wait_queue(sk_sleep(sk_), &wait_); \
439 release_sock(sk_); \
440 *(timeo_) = wait_woken(&wait_, TASK_INTERRUPTIBLE, *(timeo_)); \
441 sched_annotate_sleep(); \
442 lock_sock(sk_); \
443 remove_wait_queue(sk_sleep(sk_), &wait_); \
444 } \
445 rc_; \
446})
447
448
449
450
451
452
453
454
455
456
457
458
459
460static int tipc_sk_create(struct net *net, struct socket *sock,
461 int protocol, int kern)
462{
463 const struct proto_ops *ops;
464 struct sock *sk;
465 struct tipc_sock *tsk;
466 struct tipc_msg *msg;
467
468
469 if (unlikely(protocol != 0))
470 return -EPROTONOSUPPORT;
471
472 switch (sock->type) {
473 case SOCK_STREAM:
474 ops = &stream_ops;
475 break;
476 case SOCK_SEQPACKET:
477 ops = &packet_ops;
478 break;
479 case SOCK_DGRAM:
480 case SOCK_RDM:
481 ops = &msg_ops;
482 break;
483 default:
484 return -EPROTOTYPE;
485 }
486
487
488 sk = sk_alloc(net, AF_TIPC, GFP_KERNEL, &tipc_proto, kern);
489 if (sk == NULL)
490 return -ENOMEM;
491
492 tsk = tipc_sk(sk);
493 tsk->max_pkt = MAX_PKT_DEFAULT;
494 tsk->maxnagle = 0;
495 tsk->nagle_start = NAGLE_START_INIT;
496 INIT_LIST_HEAD(&tsk->publications);
497 INIT_LIST_HEAD(&tsk->cong_links);
498 msg = &tsk->phdr;
499
500
501 sock->ops = ops;
502 sock_init_data(sock, sk);
503 tipc_set_sk_state(sk, TIPC_OPEN);
504 if (tipc_sk_insert(tsk)) {
505 pr_warn("Socket create failed; port number exhausted\n");
506 return -EINVAL;
507 }
508
509
510 smp_mb();
511
512 tipc_msg_init(tipc_own_addr(net), msg, TIPC_LOW_IMPORTANCE,
513 TIPC_NAMED_MSG, NAMED_H_SIZE, 0);
514
515 msg_set_origport(msg, tsk->portid);
516 timer_setup(&sk->sk_timer, tipc_sk_timeout, 0);
517 sk->sk_shutdown = 0;
518 sk->sk_backlog_rcv = tipc_sk_backlog_rcv;
519 sk->sk_rcvbuf = sysctl_tipc_rmem[1];
520 sk->sk_data_ready = tipc_data_ready;
521 sk->sk_write_space = tipc_write_space;
522 sk->sk_destruct = tipc_sock_destruct;
523 tsk->conn_timeout = CONN_TIMEOUT_DEFAULT;
524 tsk->group_is_open = true;
525 atomic_set(&tsk->dupl_rcvcnt, 0);
526
527
528 tsk->snd_win = tsk_adv_blocks(RCVBUF_MIN);
529 tsk->rcv_win = tsk->snd_win;
530
531 if (tipc_sk_type_connectionless(sk)) {
532 tsk_set_unreturnable(tsk, true);
533 if (sock->type == SOCK_DGRAM)
534 tsk_set_unreliable(tsk, true);
535 }
536 __skb_queue_head_init(&tsk->mc_method.deferredq);
537 trace_tipc_sk_create(sk, NULL, TIPC_DUMP_NONE, " ");
538 return 0;
539}
540
541static void tipc_sk_callback(struct rcu_head *head)
542{
543 struct tipc_sock *tsk = container_of(head, struct tipc_sock, rcu);
544
545 sock_put(&tsk->sk);
546}
547
548
549static void __tipc_shutdown(struct socket *sock, int error)
550{
551 struct sock *sk = sock->sk;
552 struct tipc_sock *tsk = tipc_sk(sk);
553 struct net *net = sock_net(sk);
554 long timeout = msecs_to_jiffies(CONN_TIMEOUT_DEFAULT);
555 u32 dnode = tsk_peer_node(tsk);
556 struct sk_buff *skb;
557
558
559 tipc_wait_for_cond(sock, &timeout, (!tsk->cong_link_cnt &&
560 !tsk_conn_cong(tsk)));
561
562
563 tipc_sk_push_backlog(tsk, false);
564
565 __skb_queue_purge(&sk->sk_write_queue);
566
567
568 skb = skb_peek(&sk->sk_receive_queue);
569 if (skb && TIPC_SKB_CB(skb)->bytes_read) {
570 __skb_unlink(skb, &sk->sk_receive_queue);
571 kfree_skb(skb);
572 }
573
574
575 if (tipc_sk_type_connectionless(sk)) {
576 tsk_rej_rx_queue(sk, error);
577 return;
578 }
579
580 switch (sk->sk_state) {
581 case TIPC_CONNECTING:
582 case TIPC_ESTABLISHED:
583 tipc_set_sk_state(sk, TIPC_DISCONNECTING);
584 tipc_node_remove_conn(net, dnode, tsk->portid);
585
586 skb = __skb_dequeue(&sk->sk_receive_queue);
587 if (skb) {
588 __skb_queue_purge(&sk->sk_receive_queue);
589 tipc_sk_respond(sk, skb, error);
590 break;
591 }
592 skb = tipc_msg_create(TIPC_CRITICAL_IMPORTANCE,
593 TIPC_CONN_MSG, SHORT_H_SIZE, 0, dnode,
594 tsk_own_node(tsk), tsk_peer_port(tsk),
595 tsk->portid, error);
596 if (skb)
597 tipc_node_xmit_skb(net, skb, dnode, tsk->portid);
598 break;
599 case TIPC_LISTEN:
600
601 tsk_rej_rx_queue(sk, error);
602 break;
603 default:
604 __skb_queue_purge(&sk->sk_receive_queue);
605 break;
606 }
607}
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625static int tipc_release(struct socket *sock)
626{
627 struct sock *sk = sock->sk;
628 struct tipc_sock *tsk;
629
630
631
632
633
634 if (sk == NULL)
635 return 0;
636
637 tsk = tipc_sk(sk);
638 lock_sock(sk);
639
640 trace_tipc_sk_release(sk, NULL, TIPC_DUMP_ALL, " ");
641 __tipc_shutdown(sock, TIPC_ERR_NO_PORT);
642 sk->sk_shutdown = SHUTDOWN_MASK;
643 tipc_sk_leave(tsk);
644 tipc_sk_withdraw(tsk, NULL);
645 __skb_queue_purge(&tsk->mc_method.deferredq);
646 sk_stop_timer(sk, &sk->sk_timer);
647 tipc_sk_remove(tsk);
648
649 sock_orphan(sk);
650
651 release_sock(sk);
652 tipc_dest_list_purge(&tsk->cong_links);
653 tsk->cong_link_cnt = 0;
654 call_rcu(&tsk->rcu, tipc_sk_callback);
655 sock->sk = NULL;
656
657 return 0;
658}
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675static int __tipc_bind(struct socket *sock, struct sockaddr *skaddr, int alen)
676{
677 struct tipc_uaddr *ua = (struct tipc_uaddr *)skaddr;
678 struct tipc_sock *tsk = tipc_sk(sock->sk);
679 bool unbind = false;
680
681 if (unlikely(!alen))
682 return tipc_sk_withdraw(tsk, NULL);
683
684 if (ua->addrtype == TIPC_SERVICE_ADDR) {
685 ua->addrtype = TIPC_SERVICE_RANGE;
686 ua->sr.upper = ua->sr.lower;
687 }
688 if (ua->scope < 0) {
689 unbind = true;
690 ua->scope = -ua->scope;
691 }
692
693 if (ua->scope != TIPC_NODE_SCOPE)
694 ua->scope = TIPC_CLUSTER_SCOPE;
695
696 if (tsk->group)
697 return -EACCES;
698
699 if (unbind)
700 return tipc_sk_withdraw(tsk, ua);
701 return tipc_sk_publish(tsk, ua);
702}
703
704int tipc_sk_bind(struct socket *sock, struct sockaddr *skaddr, int alen)
705{
706 int res;
707
708 lock_sock(sock->sk);
709 res = __tipc_bind(sock, skaddr, alen);
710 release_sock(sock->sk);
711 return res;
712}
713
714static int tipc_bind(struct socket *sock, struct sockaddr *skaddr, int alen)
715{
716 struct tipc_uaddr *ua = (struct tipc_uaddr *)skaddr;
717 u32 atype = ua->addrtype;
718
719 if (alen) {
720 if (!tipc_uaddr_valid(ua, alen))
721 return -EINVAL;
722 if (atype == TIPC_SOCKET_ADDR)
723 return -EAFNOSUPPORT;
724 if (ua->sr.type < TIPC_RESERVED_TYPES) {
725 pr_warn_once("Can't bind to reserved service type %u\n",
726 ua->sr.type);
727 return -EACCES;
728 }
729 }
730 return tipc_sk_bind(sock, skaddr, alen);
731}
732
733
734
735
736
737
738
739
740
741
742
743
744
745static int tipc_getname(struct socket *sock, struct sockaddr *uaddr,
746 int peer)
747{
748 struct sockaddr_tipc *addr = (struct sockaddr_tipc *)uaddr;
749 struct sock *sk = sock->sk;
750 struct tipc_sock *tsk = tipc_sk(sk);
751
752 memset(addr, 0, sizeof(*addr));
753 if (peer) {
754 if ((!tipc_sk_connected(sk)) &&
755 ((peer != 2) || (sk->sk_state != TIPC_DISCONNECTING)))
756 return -ENOTCONN;
757 addr->addr.id.ref = tsk_peer_port(tsk);
758 addr->addr.id.node = tsk_peer_node(tsk);
759 } else {
760 addr->addr.id.ref = tsk->portid;
761 addr->addr.id.node = tipc_own_addr(sock_net(sk));
762 }
763
764 addr->addrtype = TIPC_SOCKET_ADDR;
765 addr->family = AF_TIPC;
766 addr->scope = 0;
767 addr->addr.name.domain = 0;
768
769 return sizeof(*addr);
770}
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790static __poll_t tipc_poll(struct file *file, struct socket *sock,
791 poll_table *wait)
792{
793 struct sock *sk = sock->sk;
794 struct tipc_sock *tsk = tipc_sk(sk);
795 __poll_t revents = 0;
796
797 sock_poll_wait(file, sock, wait);
798 trace_tipc_sk_poll(sk, NULL, TIPC_DUMP_ALL, " ");
799
800 if (sk->sk_shutdown & RCV_SHUTDOWN)
801 revents |= EPOLLRDHUP | EPOLLIN | EPOLLRDNORM;
802 if (sk->sk_shutdown == SHUTDOWN_MASK)
803 revents |= EPOLLHUP;
804
805 switch (sk->sk_state) {
806 case TIPC_ESTABLISHED:
807 if (!tsk->cong_link_cnt && !tsk_conn_cong(tsk))
808 revents |= EPOLLOUT;
809 fallthrough;
810 case TIPC_LISTEN:
811 case TIPC_CONNECTING:
812 if (!skb_queue_empty_lockless(&sk->sk_receive_queue))
813 revents |= EPOLLIN | EPOLLRDNORM;
814 break;
815 case TIPC_OPEN:
816 if (tsk->group_is_open && !tsk->cong_link_cnt)
817 revents |= EPOLLOUT;
818 if (!tipc_sk_type_connectionless(sk))
819 break;
820 if (skb_queue_empty_lockless(&sk->sk_receive_queue))
821 break;
822 revents |= EPOLLIN | EPOLLRDNORM;
823 break;
824 case TIPC_DISCONNECTING:
825 revents = EPOLLIN | EPOLLRDNORM | EPOLLHUP;
826 break;
827 }
828 return revents;
829}
830
831
832
833
834
835
836
837
838
839
840
841
842static int tipc_sendmcast(struct socket *sock, struct tipc_uaddr *ua,
843 struct msghdr *msg, size_t dlen, long timeout)
844{
845 struct sock *sk = sock->sk;
846 struct tipc_sock *tsk = tipc_sk(sk);
847 struct tipc_msg *hdr = &tsk->phdr;
848 struct net *net = sock_net(sk);
849 int mtu = tipc_bcast_get_mtu(net);
850 struct sk_buff_head pkts;
851 struct tipc_nlist dsts;
852 int rc;
853
854 if (tsk->group)
855 return -EACCES;
856
857
858 rc = tipc_wait_for_cond(sock, &timeout, !tsk->cong_link_cnt);
859 if (unlikely(rc))
860 return rc;
861
862
863 tipc_nlist_init(&dsts, tipc_own_addr(net));
864 tipc_nametbl_lookup_mcast_nodes(net, ua, &dsts);
865 if (!dsts.local && !dsts.remote)
866 return -EHOSTUNREACH;
867
868
869 msg_set_type(hdr, TIPC_MCAST_MSG);
870 msg_set_hdr_sz(hdr, MCAST_H_SIZE);
871 msg_set_lookup_scope(hdr, TIPC_CLUSTER_SCOPE);
872 msg_set_destport(hdr, 0);
873 msg_set_destnode(hdr, 0);
874 msg_set_nametype(hdr, ua->sr.type);
875 msg_set_namelower(hdr, ua->sr.lower);
876 msg_set_nameupper(hdr, ua->sr.upper);
877
878
879 __skb_queue_head_init(&pkts);
880 rc = tipc_msg_build(hdr, msg, 0, dlen, mtu, &pkts);
881
882
883 if (unlikely(rc == dlen)) {
884 trace_tipc_sk_sendmcast(sk, skb_peek(&pkts),
885 TIPC_DUMP_SK_SNDQ, " ");
886 rc = tipc_mcast_xmit(net, &pkts, &tsk->mc_method, &dsts,
887 &tsk->cong_link_cnt);
888 }
889
890 tipc_nlist_purge(&dsts);
891
892 return rc ? rc : dlen;
893}
894
895
896
897
898
899
900
901
902
903
904
905static int tipc_send_group_msg(struct net *net, struct tipc_sock *tsk,
906 struct msghdr *m, struct tipc_member *mb,
907 u32 dnode, u32 dport, int dlen)
908{
909 u16 bc_snd_nxt = tipc_group_bc_snd_nxt(tsk->group);
910 struct tipc_mc_method *method = &tsk->mc_method;
911 int blks = tsk_blocks(GROUP_H_SIZE + dlen);
912 struct tipc_msg *hdr = &tsk->phdr;
913 struct sk_buff_head pkts;
914 int mtu, rc;
915
916
917 msg_set_type(hdr, TIPC_GRP_UCAST_MSG);
918 msg_set_hdr_sz(hdr, GROUP_H_SIZE);
919 msg_set_destport(hdr, dport);
920 msg_set_destnode(hdr, dnode);
921 msg_set_grp_bc_seqno(hdr, bc_snd_nxt);
922
923
924 __skb_queue_head_init(&pkts);
925 mtu = tipc_node_get_mtu(net, dnode, tsk->portid, false);
926 rc = tipc_msg_build(hdr, m, 0, dlen, mtu, &pkts);
927 if (unlikely(rc != dlen))
928 return rc;
929
930
931 rc = tipc_node_xmit(net, &pkts, dnode, tsk->portid);
932 if (unlikely(rc == -ELINKCONG)) {
933 tipc_dest_push(&tsk->cong_links, dnode, 0);
934 tsk->cong_link_cnt++;
935 }
936
937
938 tipc_group_update_member(mb, blks);
939
940
941 method->rcast = true;
942 method->mandatory = true;
943 return dlen;
944}
945
946
947
948
949
950
951
952
953
954
955
956static int tipc_send_group_unicast(struct socket *sock, struct msghdr *m,
957 int dlen, long timeout)
958{
959 struct sock *sk = sock->sk;
960 struct tipc_uaddr *ua = (struct tipc_uaddr *)m->msg_name;
961 int blks = tsk_blocks(GROUP_H_SIZE + dlen);
962 struct tipc_sock *tsk = tipc_sk(sk);
963 struct net *net = sock_net(sk);
964 struct tipc_member *mb = NULL;
965 u32 node, port;
966 int rc;
967
968 node = ua->sk.node;
969 port = ua->sk.ref;
970 if (!port && !node)
971 return -EHOSTUNREACH;
972
973
974 rc = tipc_wait_for_cond(sock, &timeout,
975 !tipc_dest_find(&tsk->cong_links, node, 0) &&
976 tsk->group &&
977 !tipc_group_cong(tsk->group, node, port, blks,
978 &mb));
979 if (unlikely(rc))
980 return rc;
981
982 if (unlikely(!mb))
983 return -EHOSTUNREACH;
984
985 rc = tipc_send_group_msg(net, tsk, m, mb, node, port, dlen);
986
987 return rc ? rc : dlen;
988}
989
990
991
992
993
994
995
996
997
998
999
1000static int tipc_send_group_anycast(struct socket *sock, struct msghdr *m,
1001 int dlen, long timeout)
1002{
1003 struct tipc_uaddr *ua = (struct tipc_uaddr *)m->msg_name;
1004 struct sock *sk = sock->sk;
1005 struct tipc_sock *tsk = tipc_sk(sk);
1006 struct list_head *cong_links = &tsk->cong_links;
1007 int blks = tsk_blocks(GROUP_H_SIZE + dlen);
1008 struct tipc_msg *hdr = &tsk->phdr;
1009 struct tipc_member *first = NULL;
1010 struct tipc_member *mbr = NULL;
1011 struct net *net = sock_net(sk);
1012 u32 node, port, exclude;
1013 struct list_head dsts;
1014 int lookups = 0;
1015 int dstcnt, rc;
1016 bool cong;
1017
1018 INIT_LIST_HEAD(&dsts);
1019 ua->sa.type = msg_nametype(hdr);
1020 ua->scope = msg_lookup_scope(hdr);
1021
1022 while (++lookups < 4) {
1023 exclude = tipc_group_exclude(tsk->group);
1024
1025 first = NULL;
1026
1027
1028 while (1) {
1029 if (!tipc_nametbl_lookup_group(net, ua, &dsts, &dstcnt,
1030 exclude, false))
1031 return -EHOSTUNREACH;
1032 tipc_dest_pop(&dsts, &node, &port);
1033 cong = tipc_group_cong(tsk->group, node, port, blks,
1034 &mbr);
1035 if (!cong)
1036 break;
1037 if (mbr == first)
1038 break;
1039 if (!first)
1040 first = mbr;
1041 }
1042
1043
1044 if (unlikely(!mbr))
1045 continue;
1046
1047 if (likely(!cong && !tipc_dest_find(cong_links, node, 0)))
1048 break;
1049
1050
1051 rc = tipc_wait_for_cond(sock, &timeout,
1052 !tipc_dest_find(cong_links, node, 0) &&
1053 tsk->group &&
1054 !tipc_group_cong(tsk->group, node, port,
1055 blks, &mbr));
1056 if (unlikely(rc))
1057 return rc;
1058
1059
1060 if (likely(mbr))
1061 break;
1062 }
1063
1064 if (unlikely(lookups >= 4))
1065 return -EHOSTUNREACH;
1066
1067 rc = tipc_send_group_msg(net, tsk, m, mbr, node, port, dlen);
1068
1069 return rc ? rc : dlen;
1070}
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082static int tipc_send_group_bcast(struct socket *sock, struct msghdr *m,
1083 int dlen, long timeout)
1084{
1085 struct tipc_uaddr *ua = (struct tipc_uaddr *)m->msg_name;
1086 struct sock *sk = sock->sk;
1087 struct net *net = sock_net(sk);
1088 struct tipc_sock *tsk = tipc_sk(sk);
1089 struct tipc_nlist *dsts;
1090 struct tipc_mc_method *method = &tsk->mc_method;
1091 bool ack = method->mandatory && method->rcast;
1092 int blks = tsk_blocks(MCAST_H_SIZE + dlen);
1093 struct tipc_msg *hdr = &tsk->phdr;
1094 int mtu = tipc_bcast_get_mtu(net);
1095 struct sk_buff_head pkts;
1096 int rc = -EHOSTUNREACH;
1097
1098
1099 rc = tipc_wait_for_cond(sock, &timeout,
1100 !tsk->cong_link_cnt && tsk->group &&
1101 !tipc_group_bc_cong(tsk->group, blks));
1102 if (unlikely(rc))
1103 return rc;
1104
1105 dsts = tipc_group_dests(tsk->group);
1106 if (!dsts->local && !dsts->remote)
1107 return -EHOSTUNREACH;
1108
1109
1110 if (ua) {
1111 msg_set_type(hdr, TIPC_GRP_MCAST_MSG);
1112 msg_set_nameinst(hdr, ua->sa.instance);
1113 } else {
1114 msg_set_type(hdr, TIPC_GRP_BCAST_MSG);
1115 msg_set_nameinst(hdr, 0);
1116 }
1117 msg_set_hdr_sz(hdr, GROUP_H_SIZE);
1118 msg_set_destport(hdr, 0);
1119 msg_set_destnode(hdr, 0);
1120 msg_set_grp_bc_seqno(hdr, tipc_group_bc_snd_nxt(tsk->group));
1121
1122
1123 msg_set_grp_bc_ack_req(hdr, ack);
1124
1125
1126 __skb_queue_head_init(&pkts);
1127 rc = tipc_msg_build(hdr, m, 0, dlen, mtu, &pkts);
1128 if (unlikely(rc != dlen))
1129 return rc;
1130
1131
1132 rc = tipc_mcast_xmit(net, &pkts, method, dsts, &tsk->cong_link_cnt);
1133 if (unlikely(rc))
1134 return rc;
1135
1136
1137 tipc_group_update_bc_members(tsk->group, blks, ack);
1138
1139
1140 method->mandatory = false;
1141 method->expires = jiffies;
1142
1143 return dlen;
1144}
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156static int tipc_send_group_mcast(struct socket *sock, struct msghdr *m,
1157 int dlen, long timeout)
1158{
1159 struct tipc_uaddr *ua = (struct tipc_uaddr *)m->msg_name;
1160 struct sock *sk = sock->sk;
1161 struct tipc_sock *tsk = tipc_sk(sk);
1162 struct tipc_group *grp = tsk->group;
1163 struct tipc_msg *hdr = &tsk->phdr;
1164 struct net *net = sock_net(sk);
1165 struct list_head dsts;
1166 u32 dstcnt, exclude;
1167
1168 INIT_LIST_HEAD(&dsts);
1169 ua->sa.type = msg_nametype(hdr);
1170 ua->scope = msg_lookup_scope(hdr);
1171 exclude = tipc_group_exclude(grp);
1172
1173 if (!tipc_nametbl_lookup_group(net, ua, &dsts, &dstcnt, exclude, true))
1174 return -EHOSTUNREACH;
1175
1176 if (dstcnt == 1) {
1177 tipc_dest_pop(&dsts, &ua->sk.node, &ua->sk.ref);
1178 return tipc_send_group_unicast(sock, m, dlen, timeout);
1179 }
1180
1181 tipc_dest_list_purge(&dsts);
1182 return tipc_send_group_bcast(sock, m, dlen, timeout);
1183}
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193void tipc_sk_mcast_rcv(struct net *net, struct sk_buff_head *arrvq,
1194 struct sk_buff_head *inputq)
1195{
1196 u32 self = tipc_own_addr(net);
1197 struct sk_buff *skb, *_skb;
1198 u32 portid, onode;
1199 struct sk_buff_head tmpq;
1200 struct list_head dports;
1201 struct tipc_msg *hdr;
1202 struct tipc_uaddr ua;
1203 int user, mtyp, hlen;
1204
1205 __skb_queue_head_init(&tmpq);
1206 INIT_LIST_HEAD(&dports);
1207 ua.addrtype = TIPC_SERVICE_RANGE;
1208
1209
1210 skb = tipc_skb_peek(arrvq, &inputq->lock);
1211 for (; skb; skb = tipc_skb_peek(arrvq, &inputq->lock)) {
1212 hdr = buf_msg(skb);
1213 user = msg_user(hdr);
1214 mtyp = msg_type(hdr);
1215 hlen = skb_headroom(skb) + msg_hdr_sz(hdr);
1216 onode = msg_orignode(hdr);
1217 ua.sr.type = msg_nametype(hdr);
1218 ua.sr.lower = msg_namelower(hdr);
1219 ua.sr.upper = msg_nameupper(hdr);
1220 if (onode == self)
1221 ua.scope = TIPC_ANY_SCOPE;
1222 else
1223 ua.scope = TIPC_CLUSTER_SCOPE;
1224
1225 if (mtyp == TIPC_GRP_UCAST_MSG || user == GROUP_PROTOCOL) {
1226 spin_lock_bh(&inputq->lock);
1227 if (skb_peek(arrvq) == skb) {
1228 __skb_dequeue(arrvq);
1229 __skb_queue_tail(inputq, skb);
1230 }
1231 kfree_skb(skb);
1232 spin_unlock_bh(&inputq->lock);
1233 continue;
1234 }
1235
1236
1237 if (msg_in_group(hdr)) {
1238 ua.sr.lower = 0;
1239 ua.sr.upper = ~0;
1240 ua.scope = msg_lookup_scope(hdr);
1241 }
1242
1243
1244 tipc_nametbl_lookup_mcast_sockets(net, &ua, &dports);
1245
1246
1247 while (tipc_dest_pop(&dports, NULL, &portid)) {
1248 _skb = __pskb_copy(skb, hlen, GFP_ATOMIC);
1249 if (_skb) {
1250 msg_set_destport(buf_msg(_skb), portid);
1251 __skb_queue_tail(&tmpq, _skb);
1252 continue;
1253 }
1254 pr_warn("Failed to clone mcast rcv buffer\n");
1255 }
1256
1257 spin_lock_bh(&inputq->lock);
1258 if (skb_peek(arrvq) == skb) {
1259 skb_queue_splice_tail_init(&tmpq, inputq);
1260
1261 kfree_skb(__skb_dequeue(arrvq));
1262 }
1263 spin_unlock_bh(&inputq->lock);
1264 __skb_queue_purge(&tmpq);
1265 kfree_skb(skb);
1266 }
1267 tipc_sk_rcv(net, inputq);
1268}
1269
1270
1271
1272
1273static void tipc_sk_push_backlog(struct tipc_sock *tsk, bool nagle_ack)
1274{
1275 struct sk_buff_head *txq = &tsk->sk.sk_write_queue;
1276 struct sk_buff *skb = skb_peek_tail(txq);
1277 struct net *net = sock_net(&tsk->sk);
1278 u32 dnode = tsk_peer_node(tsk);
1279 int rc;
1280
1281 if (nagle_ack) {
1282 tsk->pkt_cnt += skb_queue_len(txq);
1283 if (!tsk->pkt_cnt || tsk->msg_acc / tsk->pkt_cnt < 2) {
1284 tsk->oneway = 0;
1285 if (tsk->nagle_start < NAGLE_START_MAX)
1286 tsk->nagle_start *= 2;
1287 tsk->expect_ack = false;
1288 pr_debug("tsk %10u: bad nagle %u -> %u, next start %u!\n",
1289 tsk->portid, tsk->msg_acc, tsk->pkt_cnt,
1290 tsk->nagle_start);
1291 } else {
1292 tsk->nagle_start = NAGLE_START_INIT;
1293 if (skb) {
1294 msg_set_ack_required(buf_msg(skb));
1295 tsk->expect_ack = true;
1296 } else {
1297 tsk->expect_ack = false;
1298 }
1299 }
1300 tsk->msg_acc = 0;
1301 tsk->pkt_cnt = 0;
1302 }
1303
1304 if (!skb || tsk->cong_link_cnt)
1305 return;
1306
1307
1308 if (msg_is_syn(buf_msg(skb)))
1309 return;
1310
1311 if (tsk->msg_acc)
1312 tsk->pkt_cnt += skb_queue_len(txq);
1313 tsk->snt_unacked += tsk->snd_backlog;
1314 tsk->snd_backlog = 0;
1315 rc = tipc_node_xmit(net, txq, dnode, tsk->portid);
1316 if (rc == -ELINKCONG)
1317 tsk->cong_link_cnt = 1;
1318}
1319
1320
1321
1322
1323
1324
1325
1326
1327static void tipc_sk_conn_proto_rcv(struct tipc_sock *tsk, struct sk_buff *skb,
1328 struct sk_buff_head *inputq,
1329 struct sk_buff_head *xmitq)
1330{
1331 struct tipc_msg *hdr = buf_msg(skb);
1332 u32 onode = tsk_own_node(tsk);
1333 struct sock *sk = &tsk->sk;
1334 int mtyp = msg_type(hdr);
1335 bool was_cong;
1336
1337
1338 if (!tsk_peer_msg(tsk, hdr)) {
1339 trace_tipc_sk_drop_msg(sk, skb, TIPC_DUMP_NONE, "@proto_rcv!");
1340 goto exit;
1341 }
1342
1343 if (unlikely(msg_errcode(hdr))) {
1344 tipc_set_sk_state(sk, TIPC_DISCONNECTING);
1345 tipc_node_remove_conn(sock_net(sk), tsk_peer_node(tsk),
1346 tsk_peer_port(tsk));
1347 sk->sk_state_change(sk);
1348
1349
1350
1351
1352 msg_set_user(hdr, TIPC_CRITICAL_IMPORTANCE);
1353 msg_set_type(hdr, TIPC_CONN_MSG);
1354 msg_set_size(hdr, BASIC_H_SIZE);
1355 msg_set_hdr_sz(hdr, BASIC_H_SIZE);
1356 __skb_queue_tail(inputq, skb);
1357 return;
1358 }
1359
1360 tsk->probe_unacked = false;
1361
1362 if (mtyp == CONN_PROBE) {
1363 msg_set_type(hdr, CONN_PROBE_REPLY);
1364 if (tipc_msg_reverse(onode, &skb, TIPC_OK))
1365 __skb_queue_tail(xmitq, skb);
1366 return;
1367 } else if (mtyp == CONN_ACK) {
1368 was_cong = tsk_conn_cong(tsk);
1369 tipc_sk_push_backlog(tsk, msg_nagle_ack(hdr));
1370 tsk->snt_unacked -= msg_conn_ack(hdr);
1371 if (tsk->peer_caps & TIPC_BLOCK_FLOWCTL)
1372 tsk->snd_win = msg_adv_win(hdr);
1373 if (was_cong && !tsk_conn_cong(tsk))
1374 sk->sk_write_space(sk);
1375 } else if (mtyp != CONN_PROBE_REPLY) {
1376 pr_warn("Received unknown CONN_PROTO msg\n");
1377 }
1378exit:
1379 kfree_skb(skb);
1380}
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395static int tipc_sendmsg(struct socket *sock,
1396 struct msghdr *m, size_t dsz)
1397{
1398 struct sock *sk = sock->sk;
1399 int ret;
1400
1401 lock_sock(sk);
1402 ret = __tipc_sendmsg(sock, m, dsz);
1403 release_sock(sk);
1404
1405 return ret;
1406}
1407
1408static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dlen)
1409{
1410 struct sock *sk = sock->sk;
1411 struct net *net = sock_net(sk);
1412 struct tipc_sock *tsk = tipc_sk(sk);
1413 struct tipc_uaddr *ua = (struct tipc_uaddr *)m->msg_name;
1414 long timeout = sock_sndtimeo(sk, m->msg_flags & MSG_DONTWAIT);
1415 struct list_head *clinks = &tsk->cong_links;
1416 bool syn = !tipc_sk_type_connectionless(sk);
1417 struct tipc_group *grp = tsk->group;
1418 struct tipc_msg *hdr = &tsk->phdr;
1419 struct tipc_socket_addr skaddr;
1420 struct sk_buff_head pkts;
1421 int atype, mtu, rc;
1422
1423 if (unlikely(dlen > TIPC_MAX_USER_MSG_SIZE))
1424 return -EMSGSIZE;
1425
1426 if (ua) {
1427 if (!tipc_uaddr_valid(ua, m->msg_namelen))
1428 return -EINVAL;
1429 atype = ua->addrtype;
1430 }
1431
1432
1433 if (grp) {
1434 if (!ua)
1435 return tipc_send_group_bcast(sock, m, dlen, timeout);
1436 if (atype == TIPC_SERVICE_ADDR)
1437 return tipc_send_group_anycast(sock, m, dlen, timeout);
1438 if (atype == TIPC_SOCKET_ADDR)
1439 return tipc_send_group_unicast(sock, m, dlen, timeout);
1440 if (atype == TIPC_SERVICE_RANGE)
1441 return tipc_send_group_mcast(sock, m, dlen, timeout);
1442 return -EINVAL;
1443 }
1444
1445 if (!ua) {
1446 ua = (struct tipc_uaddr *)&tsk->peer;
1447 if (!syn && ua->family != AF_TIPC)
1448 return -EDESTADDRREQ;
1449 atype = ua->addrtype;
1450 }
1451
1452 if (unlikely(syn)) {
1453 if (sk->sk_state == TIPC_LISTEN)
1454 return -EPIPE;
1455 if (sk->sk_state != TIPC_OPEN)
1456 return -EISCONN;
1457 if (tsk->published)
1458 return -EOPNOTSUPP;
1459 if (atype == TIPC_SERVICE_ADDR)
1460 tsk->conn_addrtype = atype;
1461 msg_set_syn(hdr, 1);
1462 }
1463
1464
1465 if (atype == TIPC_SERVICE_RANGE) {
1466 return tipc_sendmcast(sock, ua, m, dlen, timeout);
1467 } else if (atype == TIPC_SERVICE_ADDR) {
1468 skaddr.node = ua->lookup_node;
1469 ua->scope = tipc_node2scope(skaddr.node);
1470 if (!tipc_nametbl_lookup_anycast(net, ua, &skaddr))
1471 return -EHOSTUNREACH;
1472 } else if (atype == TIPC_SOCKET_ADDR) {
1473 skaddr = ua->sk;
1474 } else {
1475 return -EINVAL;
1476 }
1477
1478
1479 rc = tipc_wait_for_cond(sock, &timeout,
1480 !tipc_dest_find(clinks, skaddr.node, 0));
1481 if (unlikely(rc))
1482 return rc;
1483
1484
1485 msg_set_destnode(hdr, skaddr.node);
1486 msg_set_destport(hdr, skaddr.ref);
1487 if (atype == TIPC_SERVICE_ADDR) {
1488 msg_set_type(hdr, TIPC_NAMED_MSG);
1489 msg_set_hdr_sz(hdr, NAMED_H_SIZE);
1490 msg_set_nametype(hdr, ua->sa.type);
1491 msg_set_nameinst(hdr, ua->sa.instance);
1492 msg_set_lookup_scope(hdr, ua->scope);
1493 } else {
1494 msg_set_type(hdr, TIPC_DIRECT_MSG);
1495 msg_set_lookup_scope(hdr, 0);
1496 msg_set_hdr_sz(hdr, BASIC_H_SIZE);
1497 }
1498
1499
1500 __skb_queue_head_init(&pkts);
1501 mtu = tipc_node_get_mtu(net, skaddr.node, tsk->portid, true);
1502 rc = tipc_msg_build(hdr, m, 0, dlen, mtu, &pkts);
1503 if (unlikely(rc != dlen))
1504 return rc;
1505 if (unlikely(syn && !tipc_msg_skb_clone(&pkts, &sk->sk_write_queue))) {
1506 __skb_queue_purge(&pkts);
1507 return -ENOMEM;
1508 }
1509
1510
1511 trace_tipc_sk_sendmsg(sk, skb_peek(&pkts), TIPC_DUMP_SK_SNDQ, " ");
1512 rc = tipc_node_xmit(net, &pkts, skaddr.node, tsk->portid);
1513 if (unlikely(rc == -ELINKCONG)) {
1514 tipc_dest_push(clinks, skaddr.node, 0);
1515 tsk->cong_link_cnt++;
1516 rc = 0;
1517 }
1518
1519 if (unlikely(syn && !rc)) {
1520 tipc_set_sk_state(sk, TIPC_CONNECTING);
1521 if (dlen && timeout) {
1522 timeout = msecs_to_jiffies(timeout);
1523 tipc_wait_for_connect(sock, &timeout);
1524 }
1525 }
1526
1527 return rc ? rc : dlen;
1528}
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541static int tipc_sendstream(struct socket *sock, struct msghdr *m, size_t dsz)
1542{
1543 struct sock *sk = sock->sk;
1544 int ret;
1545
1546 lock_sock(sk);
1547 ret = __tipc_sendstream(sock, m, dsz);
1548 release_sock(sk);
1549
1550 return ret;
1551}
1552
1553static int __tipc_sendstream(struct socket *sock, struct msghdr *m, size_t dlen)
1554{
1555 struct sock *sk = sock->sk;
1556 DECLARE_SOCKADDR(struct sockaddr_tipc *, dest, m->msg_name);
1557 long timeout = sock_sndtimeo(sk, m->msg_flags & MSG_DONTWAIT);
1558 struct sk_buff_head *txq = &sk->sk_write_queue;
1559 struct tipc_sock *tsk = tipc_sk(sk);
1560 struct tipc_msg *hdr = &tsk->phdr;
1561 struct net *net = sock_net(sk);
1562 struct sk_buff *skb;
1563 u32 dnode = tsk_peer_node(tsk);
1564 int maxnagle = tsk->maxnagle;
1565 int maxpkt = tsk->max_pkt;
1566 int send, sent = 0;
1567 int blocks, rc = 0;
1568
1569 if (unlikely(dlen > INT_MAX))
1570 return -EMSGSIZE;
1571
1572
1573 if (unlikely(dest && sk->sk_state == TIPC_OPEN)) {
1574 rc = __tipc_sendmsg(sock, m, dlen);
1575 if (dlen && dlen == rc) {
1576 tsk->peer_caps = tipc_node_get_capabilities(net, dnode);
1577 tsk->snt_unacked = tsk_inc(tsk, dlen + msg_hdr_sz(hdr));
1578 }
1579 return rc;
1580 }
1581
1582 do {
1583 rc = tipc_wait_for_cond(sock, &timeout,
1584 (!tsk->cong_link_cnt &&
1585 !tsk_conn_cong(tsk) &&
1586 tipc_sk_connected(sk)));
1587 if (unlikely(rc))
1588 break;
1589 send = min_t(size_t, dlen - sent, TIPC_MAX_USER_MSG_SIZE);
1590 blocks = tsk->snd_backlog;
1591 if (tsk->oneway++ >= tsk->nagle_start && maxnagle &&
1592 send <= maxnagle) {
1593 rc = tipc_msg_append(hdr, m, send, maxnagle, txq);
1594 if (unlikely(rc < 0))
1595 break;
1596 blocks += rc;
1597 tsk->msg_acc++;
1598 if (blocks <= 64 && tsk->expect_ack) {
1599 tsk->snd_backlog = blocks;
1600 sent += send;
1601 break;
1602 } else if (blocks > 64) {
1603 tsk->pkt_cnt += skb_queue_len(txq);
1604 } else {
1605 skb = skb_peek_tail(txq);
1606 if (skb) {
1607 msg_set_ack_required(buf_msg(skb));
1608 tsk->expect_ack = true;
1609 } else {
1610 tsk->expect_ack = false;
1611 }
1612 tsk->msg_acc = 0;
1613 tsk->pkt_cnt = 0;
1614 }
1615 } else {
1616 rc = tipc_msg_build(hdr, m, sent, send, maxpkt, txq);
1617 if (unlikely(rc != send))
1618 break;
1619 blocks += tsk_inc(tsk, send + MIN_H_SIZE);
1620 }
1621 trace_tipc_sk_sendstream(sk, skb_peek(txq),
1622 TIPC_DUMP_SK_SNDQ, " ");
1623 rc = tipc_node_xmit(net, txq, dnode, tsk->portid);
1624 if (unlikely(rc == -ELINKCONG)) {
1625 tsk->cong_link_cnt = 1;
1626 rc = 0;
1627 }
1628 if (likely(!rc)) {
1629 tsk->snt_unacked += blocks;
1630 tsk->snd_backlog = 0;
1631 sent += send;
1632 }
1633 } while (sent < dlen && !rc);
1634
1635 return sent ? sent : rc;
1636}
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648static int tipc_send_packet(struct socket *sock, struct msghdr *m, size_t dsz)
1649{
1650 if (dsz > TIPC_MAX_USER_MSG_SIZE)
1651 return -EMSGSIZE;
1652
1653 return tipc_sendstream(sock, m, dsz);
1654}
1655
1656
1657
1658static void tipc_sk_finish_conn(struct tipc_sock *tsk, u32 peer_port,
1659 u32 peer_node)
1660{
1661 struct sock *sk = &tsk->sk;
1662 struct net *net = sock_net(sk);
1663 struct tipc_msg *msg = &tsk->phdr;
1664
1665 msg_set_syn(msg, 0);
1666 msg_set_destnode(msg, peer_node);
1667 msg_set_destport(msg, peer_port);
1668 msg_set_type(msg, TIPC_CONN_MSG);
1669 msg_set_lookup_scope(msg, 0);
1670 msg_set_hdr_sz(msg, SHORT_H_SIZE);
1671
1672 sk_reset_timer(sk, &sk->sk_timer, jiffies + CONN_PROBING_INTV);
1673 tipc_set_sk_state(sk, TIPC_ESTABLISHED);
1674 tipc_node_add_conn(net, peer_node, tsk->portid, peer_port);
1675 tsk->max_pkt = tipc_node_get_mtu(net, peer_node, tsk->portid, true);
1676 tsk->peer_caps = tipc_node_get_capabilities(net, peer_node);
1677 tsk_set_nagle(tsk);
1678 __skb_queue_purge(&sk->sk_write_queue);
1679 if (tsk->peer_caps & TIPC_BLOCK_FLOWCTL)
1680 return;
1681
1682
1683 tsk->rcv_win = FLOWCTL_MSG_WIN;
1684 tsk->snd_win = FLOWCTL_MSG_WIN;
1685}
1686
1687
1688
1689
1690
1691
1692
1693
1694static void tipc_sk_set_orig_addr(struct msghdr *m, struct sk_buff *skb)
1695{
1696 DECLARE_SOCKADDR(struct sockaddr_pair *, srcaddr, m->msg_name);
1697 struct tipc_msg *hdr = buf_msg(skb);
1698
1699 if (!srcaddr)
1700 return;
1701
1702 srcaddr->sock.family = AF_TIPC;
1703 srcaddr->sock.addrtype = TIPC_SOCKET_ADDR;
1704 srcaddr->sock.scope = 0;
1705 srcaddr->sock.addr.id.ref = msg_origport(hdr);
1706 srcaddr->sock.addr.id.node = msg_orignode(hdr);
1707 srcaddr->sock.addr.name.domain = 0;
1708 m->msg_namelen = sizeof(struct sockaddr_tipc);
1709
1710 if (!msg_in_group(hdr))
1711 return;
1712
1713
1714 srcaddr->member.family = AF_TIPC;
1715 srcaddr->member.addrtype = TIPC_SERVICE_ADDR;
1716 srcaddr->member.scope = 0;
1717 srcaddr->member.addr.name.name.type = msg_nametype(hdr);
1718 srcaddr->member.addr.name.name.instance = TIPC_SKB_CB(skb)->orig_member;
1719 srcaddr->member.addr.name.domain = 0;
1720 m->msg_namelen = sizeof(*srcaddr);
1721}
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733static int tipc_sk_anc_data_recv(struct msghdr *m, struct sk_buff *skb,
1734 struct tipc_sock *tsk)
1735{
1736 struct tipc_msg *hdr;
1737 u32 data[3] = {0,};
1738 bool has_addr;
1739 int dlen, rc;
1740
1741 if (likely(m->msg_controllen == 0))
1742 return 0;
1743
1744 hdr = buf_msg(skb);
1745 dlen = msg_data_sz(hdr);
1746
1747
1748 if (msg_errcode(hdr)) {
1749 if (skb_linearize(skb))
1750 return -ENOMEM;
1751 hdr = buf_msg(skb);
1752 data[0] = msg_errcode(hdr);
1753 data[1] = dlen;
1754 rc = put_cmsg(m, SOL_TIPC, TIPC_ERRINFO, 8, data);
1755 if (rc || !dlen)
1756 return rc;
1757 rc = put_cmsg(m, SOL_TIPC, TIPC_RETDATA, dlen, msg_data(hdr));
1758 if (rc)
1759 return rc;
1760 }
1761
1762
1763 switch (msg_type(hdr)) {
1764 case TIPC_NAMED_MSG:
1765 has_addr = true;
1766 data[0] = msg_nametype(hdr);
1767 data[1] = msg_namelower(hdr);
1768 data[2] = data[1];
1769 break;
1770 case TIPC_MCAST_MSG:
1771 has_addr = true;
1772 data[0] = msg_nametype(hdr);
1773 data[1] = msg_namelower(hdr);
1774 data[2] = msg_nameupper(hdr);
1775 break;
1776 case TIPC_CONN_MSG:
1777 has_addr = !!tsk->conn_addrtype;
1778 data[0] = msg_nametype(&tsk->phdr);
1779 data[1] = msg_nameinst(&tsk->phdr);
1780 data[2] = data[1];
1781 break;
1782 default:
1783 has_addr = false;
1784 }
1785 if (!has_addr)
1786 return 0;
1787 return put_cmsg(m, SOL_TIPC, TIPC_DESTNAME, 12, data);
1788}
1789
1790static struct sk_buff *tipc_sk_build_ack(struct tipc_sock *tsk)
1791{
1792 struct sock *sk = &tsk->sk;
1793 struct sk_buff *skb = NULL;
1794 struct tipc_msg *msg;
1795 u32 peer_port = tsk_peer_port(tsk);
1796 u32 dnode = tsk_peer_node(tsk);
1797
1798 if (!tipc_sk_connected(sk))
1799 return NULL;
1800 skb = tipc_msg_create(CONN_MANAGER, CONN_ACK, INT_H_SIZE, 0,
1801 dnode, tsk_own_node(tsk), peer_port,
1802 tsk->portid, TIPC_OK);
1803 if (!skb)
1804 return NULL;
1805 msg = buf_msg(skb);
1806 msg_set_conn_ack(msg, tsk->rcv_unacked);
1807 tsk->rcv_unacked = 0;
1808
1809
1810 if (tsk->peer_caps & TIPC_BLOCK_FLOWCTL) {
1811 tsk->rcv_win = tsk_adv_blocks(tsk->sk.sk_rcvbuf);
1812 msg_set_adv_win(msg, tsk->rcv_win);
1813 }
1814 return skb;
1815}
1816
1817static void tipc_sk_send_ack(struct tipc_sock *tsk)
1818{
1819 struct sk_buff *skb;
1820
1821 skb = tipc_sk_build_ack(tsk);
1822 if (!skb)
1823 return;
1824
1825 tipc_node_xmit_skb(sock_net(&tsk->sk), skb, tsk_peer_node(tsk),
1826 msg_link_selector(buf_msg(skb)));
1827}
1828
1829static int tipc_wait_for_rcvmsg(struct socket *sock, long *timeop)
1830{
1831 struct sock *sk = sock->sk;
1832 DEFINE_WAIT_FUNC(wait, woken_wake_function);
1833 long timeo = *timeop;
1834 int err = sock_error(sk);
1835
1836 if (err)
1837 return err;
1838
1839 for (;;) {
1840 if (timeo && skb_queue_empty(&sk->sk_receive_queue)) {
1841 if (sk->sk_shutdown & RCV_SHUTDOWN) {
1842 err = -ENOTCONN;
1843 break;
1844 }
1845 add_wait_queue(sk_sleep(sk), &wait);
1846 release_sock(sk);
1847 timeo = wait_woken(&wait, TASK_INTERRUPTIBLE, timeo);
1848 sched_annotate_sleep();
1849 lock_sock(sk);
1850 remove_wait_queue(sk_sleep(sk), &wait);
1851 }
1852 err = 0;
1853 if (!skb_queue_empty(&sk->sk_receive_queue))
1854 break;
1855 err = -EAGAIN;
1856 if (!timeo)
1857 break;
1858 err = sock_intr_errno(timeo);
1859 if (signal_pending(current))
1860 break;
1861
1862 err = sock_error(sk);
1863 if (err)
1864 break;
1865 }
1866 *timeop = timeo;
1867 return err;
1868}
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882static int tipc_recvmsg(struct socket *sock, struct msghdr *m,
1883 size_t buflen, int flags)
1884{
1885 struct sock *sk = sock->sk;
1886 bool connected = !tipc_sk_type_connectionless(sk);
1887 struct tipc_sock *tsk = tipc_sk(sk);
1888 int rc, err, hlen, dlen, copy;
1889 struct sk_buff_head xmitq;
1890 struct tipc_msg *hdr;
1891 struct sk_buff *skb;
1892 bool grp_evt;
1893 long timeout;
1894
1895
1896 if (unlikely(!buflen))
1897 return -EINVAL;
1898
1899 lock_sock(sk);
1900 if (unlikely(connected && sk->sk_state == TIPC_OPEN)) {
1901 rc = -ENOTCONN;
1902 goto exit;
1903 }
1904 timeout = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
1905
1906
1907 do {
1908 rc = tipc_wait_for_rcvmsg(sock, &timeout);
1909 if (unlikely(rc))
1910 goto exit;
1911 skb = skb_peek(&sk->sk_receive_queue);
1912 hdr = buf_msg(skb);
1913 dlen = msg_data_sz(hdr);
1914 hlen = msg_hdr_sz(hdr);
1915 err = msg_errcode(hdr);
1916 grp_evt = msg_is_grp_evt(hdr);
1917 if (likely(dlen || err))
1918 break;
1919 tsk_advance_rx_queue(sk);
1920 } while (1);
1921
1922
1923 tipc_sk_set_orig_addr(m, skb);
1924 rc = tipc_sk_anc_data_recv(m, skb, tsk);
1925 if (unlikely(rc))
1926 goto exit;
1927 hdr = buf_msg(skb);
1928
1929
1930 if (likely(!err)) {
1931 copy = min_t(int, dlen, buflen);
1932 if (unlikely(copy != dlen))
1933 m->msg_flags |= MSG_TRUNC;
1934 rc = skb_copy_datagram_msg(skb, hlen, m, copy);
1935 } else {
1936 copy = 0;
1937 rc = 0;
1938 if (err != TIPC_CONN_SHUTDOWN && connected && !m->msg_control)
1939 rc = -ECONNRESET;
1940 }
1941 if (unlikely(rc))
1942 goto exit;
1943
1944
1945 if (unlikely(grp_evt)) {
1946 if (msg_grp_evt(hdr) == TIPC_WITHDRAWN)
1947 m->msg_flags |= MSG_EOR;
1948 m->msg_flags |= MSG_OOB;
1949 copy = 0;
1950 }
1951
1952
1953 if (unlikely(flags & MSG_PEEK))
1954 goto exit;
1955
1956
1957 if (tsk->group && msg_in_group(hdr) && !grp_evt) {
1958 __skb_queue_head_init(&xmitq);
1959 tipc_group_update_rcv_win(tsk->group, tsk_blocks(hlen + dlen),
1960 msg_orignode(hdr), msg_origport(hdr),
1961 &xmitq);
1962 tipc_node_distr_xmit(sock_net(sk), &xmitq);
1963 }
1964
1965 tsk_advance_rx_queue(sk);
1966
1967 if (likely(!connected))
1968 goto exit;
1969
1970
1971 tsk->rcv_unacked += tsk_inc(tsk, hlen + dlen);
1972 if (tsk->rcv_unacked >= tsk->rcv_win / TIPC_ACK_RATE)
1973 tipc_sk_send_ack(tsk);
1974exit:
1975 release_sock(sk);
1976 return rc ? rc : copy;
1977}
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991static int tipc_recvstream(struct socket *sock, struct msghdr *m,
1992 size_t buflen, int flags)
1993{
1994 struct sock *sk = sock->sk;
1995 struct tipc_sock *tsk = tipc_sk(sk);
1996 struct sk_buff *skb;
1997 struct tipc_msg *hdr;
1998 struct tipc_skb_cb *skb_cb;
1999 bool peek = flags & MSG_PEEK;
2000 int offset, required, copy, copied = 0;
2001 int hlen, dlen, err, rc;
2002 long timeout;
2003
2004
2005 if (unlikely(!buflen))
2006 return -EINVAL;
2007
2008 lock_sock(sk);
2009
2010 if (unlikely(sk->sk_state == TIPC_OPEN)) {
2011 rc = -ENOTCONN;
2012 goto exit;
2013 }
2014 required = sock_rcvlowat(sk, flags & MSG_WAITALL, buflen);
2015 timeout = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
2016
2017 do {
2018
2019 rc = tipc_wait_for_rcvmsg(sock, &timeout);
2020 if (unlikely(rc))
2021 break;
2022 skb = skb_peek(&sk->sk_receive_queue);
2023 skb_cb = TIPC_SKB_CB(skb);
2024 hdr = buf_msg(skb);
2025 dlen = msg_data_sz(hdr);
2026 hlen = msg_hdr_sz(hdr);
2027 err = msg_errcode(hdr);
2028
2029
2030 if (unlikely(!dlen && !err)) {
2031 tsk_advance_rx_queue(sk);
2032 continue;
2033 }
2034
2035
2036 if (!copied) {
2037 tipc_sk_set_orig_addr(m, skb);
2038 rc = tipc_sk_anc_data_recv(m, skb, tsk);
2039 if (rc)
2040 break;
2041 hdr = buf_msg(skb);
2042 }
2043
2044
2045 if (likely(!err)) {
2046 offset = skb_cb->bytes_read;
2047 copy = min_t(int, dlen - offset, buflen - copied);
2048 rc = skb_copy_datagram_msg(skb, hlen + offset, m, copy);
2049 if (unlikely(rc))
2050 break;
2051 copied += copy;
2052 offset += copy;
2053 if (unlikely(offset < dlen)) {
2054 if (!peek)
2055 skb_cb->bytes_read = offset;
2056 break;
2057 }
2058 } else {
2059 rc = 0;
2060 if ((err != TIPC_CONN_SHUTDOWN) && !m->msg_control)
2061 rc = -ECONNRESET;
2062 if (copied || rc)
2063 break;
2064 }
2065
2066 if (unlikely(peek))
2067 break;
2068
2069 tsk_advance_rx_queue(sk);
2070
2071
2072 tsk->rcv_unacked += tsk_inc(tsk, hlen + dlen);
2073 if (tsk->rcv_unacked >= tsk->rcv_win / TIPC_ACK_RATE)
2074 tipc_sk_send_ack(tsk);
2075
2076
2077 if (copied == buflen || err)
2078 break;
2079
2080 } while (!skb_queue_empty(&sk->sk_receive_queue) || copied < required);
2081exit:
2082 release_sock(sk);
2083 return copied ? copied : rc;
2084}
2085
2086
2087
2088
2089
2090static void tipc_write_space(struct sock *sk)
2091{
2092 struct socket_wq *wq;
2093
2094 rcu_read_lock();
2095 wq = rcu_dereference(sk->sk_wq);
2096 if (skwq_has_sleeper(wq))
2097 wake_up_interruptible_sync_poll(&wq->wait, EPOLLOUT |
2098 EPOLLWRNORM | EPOLLWRBAND);
2099 rcu_read_unlock();
2100}
2101
2102
2103
2104
2105
2106static void tipc_data_ready(struct sock *sk)
2107{
2108 struct socket_wq *wq;
2109
2110 rcu_read_lock();
2111 wq = rcu_dereference(sk->sk_wq);
2112 if (skwq_has_sleeper(wq))
2113 wake_up_interruptible_sync_poll(&wq->wait, EPOLLIN |
2114 EPOLLRDNORM | EPOLLRDBAND);
2115 rcu_read_unlock();
2116}
2117
2118static void tipc_sock_destruct(struct sock *sk)
2119{
2120 __skb_queue_purge(&sk->sk_receive_queue);
2121}
2122
2123static void tipc_sk_proto_rcv(struct sock *sk,
2124 struct sk_buff_head *inputq,
2125 struct sk_buff_head *xmitq)
2126{
2127 struct sk_buff *skb = __skb_dequeue(inputq);
2128 struct tipc_sock *tsk = tipc_sk(sk);
2129 struct tipc_msg *hdr = buf_msg(skb);
2130 struct tipc_group *grp = tsk->group;
2131 bool wakeup = false;
2132
2133 switch (msg_user(hdr)) {
2134 case CONN_MANAGER:
2135 tipc_sk_conn_proto_rcv(tsk, skb, inputq, xmitq);
2136 return;
2137 case SOCK_WAKEUP:
2138 tipc_dest_del(&tsk->cong_links, msg_orignode(hdr), 0);
2139
2140 smp_wmb();
2141 tsk->cong_link_cnt--;
2142 wakeup = true;
2143 tipc_sk_push_backlog(tsk, false);
2144 break;
2145 case GROUP_PROTOCOL:
2146 tipc_group_proto_rcv(grp, &wakeup, hdr, inputq, xmitq);
2147 break;
2148 case TOP_SRV:
2149 tipc_group_member_evt(tsk->group, &wakeup, &sk->sk_rcvbuf,
2150 hdr, inputq, xmitq);
2151 break;
2152 default:
2153 break;
2154 }
2155
2156 if (wakeup)
2157 sk->sk_write_space(sk);
2158
2159 kfree_skb(skb);
2160}
2161
2162
2163
2164
2165
2166
2167
2168
2169static bool tipc_sk_filter_connect(struct tipc_sock *tsk, struct sk_buff *skb,
2170 struct sk_buff_head *xmitq)
2171{
2172 struct sock *sk = &tsk->sk;
2173 struct net *net = sock_net(sk);
2174 struct tipc_msg *hdr = buf_msg(skb);
2175 bool con_msg = msg_connected(hdr);
2176 u32 pport = tsk_peer_port(tsk);
2177 u32 pnode = tsk_peer_node(tsk);
2178 u32 oport = msg_origport(hdr);
2179 u32 onode = msg_orignode(hdr);
2180 int err = msg_errcode(hdr);
2181 unsigned long delay;
2182
2183 if (unlikely(msg_mcast(hdr)))
2184 return false;
2185 tsk->oneway = 0;
2186
2187 switch (sk->sk_state) {
2188 case TIPC_CONNECTING:
2189
2190 if (likely(con_msg)) {
2191 if (err)
2192 break;
2193 tipc_sk_finish_conn(tsk, oport, onode);
2194 msg_set_importance(&tsk->phdr, msg_importance(hdr));
2195
2196 if (msg_data_sz(hdr))
2197 return true;
2198
2199 sk->sk_state_change(sk);
2200 msg_set_dest_droppable(hdr, 1);
2201 return false;
2202 }
2203
2204 if (oport != pport || onode != pnode)
2205 return false;
2206
2207
2208 if (err != TIPC_ERR_OVERLOAD)
2209 break;
2210
2211
2212 if (skb_queue_empty(&sk->sk_write_queue))
2213 break;
2214 get_random_bytes(&delay, 2);
2215 delay %= (tsk->conn_timeout / 4);
2216 delay = msecs_to_jiffies(delay + 100);
2217 sk_reset_timer(sk, &sk->sk_timer, jiffies + delay);
2218 return false;
2219 case TIPC_OPEN:
2220 case TIPC_DISCONNECTING:
2221 return false;
2222 case TIPC_LISTEN:
2223
2224 if (!msg_is_syn(hdr) &&
2225 tipc_node_get_capabilities(net, onode) & TIPC_SYN_BIT)
2226 return false;
2227 if (!con_msg && !err)
2228 return true;
2229 return false;
2230 case TIPC_ESTABLISHED:
2231 if (!skb_queue_empty(&sk->sk_write_queue))
2232 tipc_sk_push_backlog(tsk, false);
2233
2234 if (likely(con_msg && !err && pport == oport &&
2235 pnode == onode)) {
2236 if (msg_ack_required(hdr)) {
2237 struct sk_buff *skb;
2238
2239 skb = tipc_sk_build_ack(tsk);
2240 if (skb) {
2241 msg_set_nagle_ack(buf_msg(skb));
2242 __skb_queue_tail(xmitq, skb);
2243 }
2244 }
2245 return true;
2246 }
2247 if (!tsk_peer_msg(tsk, hdr))
2248 return false;
2249 if (!err)
2250 return true;
2251 tipc_set_sk_state(sk, TIPC_DISCONNECTING);
2252 tipc_node_remove_conn(net, pnode, tsk->portid);
2253 sk->sk_state_change(sk);
2254 return true;
2255 default:
2256 pr_err("Unknown sk_state %u\n", sk->sk_state);
2257 }
2258
2259 tipc_set_sk_state(sk, TIPC_DISCONNECTING);
2260 sk->sk_err = ECONNREFUSED;
2261 sk->sk_state_change(sk);
2262 return true;
2263}
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283static unsigned int rcvbuf_limit(struct sock *sk, struct sk_buff *skb)
2284{
2285 struct tipc_sock *tsk = tipc_sk(sk);
2286 struct tipc_msg *hdr = buf_msg(skb);
2287
2288 if (unlikely(msg_in_group(hdr)))
2289 return READ_ONCE(sk->sk_rcvbuf);
2290
2291 if (unlikely(!msg_connected(hdr)))
2292 return READ_ONCE(sk->sk_rcvbuf) << msg_importance(hdr);
2293
2294 if (likely(tsk->peer_caps & TIPC_BLOCK_FLOWCTL))
2295 return READ_ONCE(sk->sk_rcvbuf);
2296
2297 return FLOWCTL_MSG_LIM;
2298}
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311static void tipc_sk_filter_rcv(struct sock *sk, struct sk_buff *skb,
2312 struct sk_buff_head *xmitq)
2313{
2314 bool sk_conn = !tipc_sk_type_connectionless(sk);
2315 struct tipc_sock *tsk = tipc_sk(sk);
2316 struct tipc_group *grp = tsk->group;
2317 struct tipc_msg *hdr = buf_msg(skb);
2318 struct net *net = sock_net(sk);
2319 struct sk_buff_head inputq;
2320 int mtyp = msg_type(hdr);
2321 int limit, err = TIPC_OK;
2322
2323 trace_tipc_sk_filter_rcv(sk, skb, TIPC_DUMP_ALL, " ");
2324 TIPC_SKB_CB(skb)->bytes_read = 0;
2325 __skb_queue_head_init(&inputq);
2326 __skb_queue_tail(&inputq, skb);
2327
2328 if (unlikely(!msg_isdata(hdr)))
2329 tipc_sk_proto_rcv(sk, &inputq, xmitq);
2330
2331 if (unlikely(grp))
2332 tipc_group_filter_msg(grp, &inputq, xmitq);
2333
2334 if (unlikely(!grp) && mtyp == TIPC_MCAST_MSG)
2335 tipc_mcast_filter_msg(net, &tsk->mc_method.deferredq, &inputq);
2336
2337
2338 while ((skb = __skb_dequeue(&inputq))) {
2339 hdr = buf_msg(skb);
2340 limit = rcvbuf_limit(sk, skb);
2341 if ((sk_conn && !tipc_sk_filter_connect(tsk, skb, xmitq)) ||
2342 (!sk_conn && msg_connected(hdr)) ||
2343 (!grp && msg_in_group(hdr)))
2344 err = TIPC_ERR_NO_PORT;
2345 else if (sk_rmem_alloc_get(sk) + skb->truesize >= limit) {
2346 trace_tipc_sk_dump(sk, skb, TIPC_DUMP_ALL,
2347 "err_overload2!");
2348 atomic_inc(&sk->sk_drops);
2349 err = TIPC_ERR_OVERLOAD;
2350 }
2351
2352 if (unlikely(err)) {
2353 if (tipc_msg_reverse(tipc_own_addr(net), &skb, err)) {
2354 trace_tipc_sk_rej_msg(sk, skb, TIPC_DUMP_NONE,
2355 "@filter_rcv!");
2356 __skb_queue_tail(xmitq, skb);
2357 }
2358 err = TIPC_OK;
2359 continue;
2360 }
2361 __skb_queue_tail(&sk->sk_receive_queue, skb);
2362 skb_set_owner_r(skb, sk);
2363 trace_tipc_sk_overlimit2(sk, skb, TIPC_DUMP_ALL,
2364 "rcvq >90% allocated!");
2365 sk->sk_data_ready(sk);
2366 }
2367}
2368
2369
2370
2371
2372
2373
2374
2375
2376static int tipc_sk_backlog_rcv(struct sock *sk, struct sk_buff *skb)
2377{
2378 unsigned int before = sk_rmem_alloc_get(sk);
2379 struct sk_buff_head xmitq;
2380 unsigned int added;
2381
2382 __skb_queue_head_init(&xmitq);
2383
2384 tipc_sk_filter_rcv(sk, skb, &xmitq);
2385 added = sk_rmem_alloc_get(sk) - before;
2386 atomic_add(added, &tipc_sk(sk)->dupl_rcvcnt);
2387
2388
2389 tipc_node_distr_xmit(sock_net(sk), &xmitq);
2390 return 0;
2391}
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403static void tipc_sk_enqueue(struct sk_buff_head *inputq, struct sock *sk,
2404 u32 dport, struct sk_buff_head *xmitq)
2405{
2406 unsigned long time_limit = jiffies + 2;
2407 struct sk_buff *skb;
2408 unsigned int lim;
2409 atomic_t *dcnt;
2410 u32 onode;
2411
2412 while (skb_queue_len(inputq)) {
2413 if (unlikely(time_after_eq(jiffies, time_limit)))
2414 return;
2415
2416 skb = tipc_skb_dequeue(inputq, dport);
2417 if (unlikely(!skb))
2418 return;
2419
2420
2421 if (!sock_owned_by_user(sk)) {
2422 tipc_sk_filter_rcv(sk, skb, xmitq);
2423 continue;
2424 }
2425
2426
2427 dcnt = &tipc_sk(sk)->dupl_rcvcnt;
2428 if (!sk->sk_backlog.len)
2429 atomic_set(dcnt, 0);
2430 lim = rcvbuf_limit(sk, skb) + atomic_read(dcnt);
2431 if (likely(!sk_add_backlog(sk, skb, lim))) {
2432 trace_tipc_sk_overlimit1(sk, skb, TIPC_DUMP_ALL,
2433 "bklg & rcvq >90% allocated!");
2434 continue;
2435 }
2436
2437 trace_tipc_sk_dump(sk, skb, TIPC_DUMP_ALL, "err_overload!");
2438
2439 onode = tipc_own_addr(sock_net(sk));
2440 atomic_inc(&sk->sk_drops);
2441 if (tipc_msg_reverse(onode, &skb, TIPC_ERR_OVERLOAD)) {
2442 trace_tipc_sk_rej_msg(sk, skb, TIPC_DUMP_ALL,
2443 "@sk_enqueue!");
2444 __skb_queue_tail(xmitq, skb);
2445 }
2446 break;
2447 }
2448}
2449
2450
2451
2452
2453
2454
2455
2456
2457void tipc_sk_rcv(struct net *net, struct sk_buff_head *inputq)
2458{
2459 struct sk_buff_head xmitq;
2460 u32 dnode, dport = 0;
2461 int err;
2462 struct tipc_sock *tsk;
2463 struct sock *sk;
2464 struct sk_buff *skb;
2465
2466 __skb_queue_head_init(&xmitq);
2467 while (skb_queue_len(inputq)) {
2468 dport = tipc_skb_peek_port(inputq, dport);
2469 tsk = tipc_sk_lookup(net, dport);
2470
2471 if (likely(tsk)) {
2472 sk = &tsk->sk;
2473 if (likely(spin_trylock_bh(&sk->sk_lock.slock))) {
2474 tipc_sk_enqueue(inputq, sk, dport, &xmitq);
2475 spin_unlock_bh(&sk->sk_lock.slock);
2476 }
2477
2478 tipc_node_distr_xmit(sock_net(sk), &xmitq);
2479 sock_put(sk);
2480 continue;
2481 }
2482
2483 skb = tipc_skb_dequeue(inputq, dport);
2484 if (!skb)
2485 return;
2486
2487
2488 err = TIPC_ERR_NO_PORT;
2489 if (tipc_msg_lookup_dest(net, skb, &err))
2490 goto xmit;
2491
2492
2493 if (!tipc_msg_reverse(tipc_own_addr(net), &skb, err))
2494 continue;
2495
2496 trace_tipc_sk_rej_msg(NULL, skb, TIPC_DUMP_NONE, "@sk_rcv!");
2497xmit:
2498 dnode = msg_destnode(buf_msg(skb));
2499 tipc_node_xmit_skb(net, skb, dnode, dport);
2500 }
2501}
2502
2503static int tipc_wait_for_connect(struct socket *sock, long *timeo_p)
2504{
2505 DEFINE_WAIT_FUNC(wait, woken_wake_function);
2506 struct sock *sk = sock->sk;
2507 int done;
2508
2509 do {
2510 int err = sock_error(sk);
2511 if (err)
2512 return err;
2513 if (!*timeo_p)
2514 return -ETIMEDOUT;
2515 if (signal_pending(current))
2516 return sock_intr_errno(*timeo_p);
2517 if (sk->sk_state == TIPC_DISCONNECTING)
2518 break;
2519
2520 add_wait_queue(sk_sleep(sk), &wait);
2521 done = sk_wait_event(sk, timeo_p, tipc_sk_connected(sk),
2522 &wait);
2523 remove_wait_queue(sk_sleep(sk), &wait);
2524 } while (!done);
2525 return 0;
2526}
2527
2528static bool tipc_sockaddr_is_sane(struct sockaddr_tipc *addr)
2529{
2530 if (addr->family != AF_TIPC)
2531 return false;
2532 if (addr->addrtype == TIPC_SERVICE_RANGE)
2533 return (addr->addr.nameseq.lower <= addr->addr.nameseq.upper);
2534 return (addr->addrtype == TIPC_SERVICE_ADDR ||
2535 addr->addrtype == TIPC_SOCKET_ADDR);
2536}
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547static int tipc_connect(struct socket *sock, struct sockaddr *dest,
2548 int destlen, int flags)
2549{
2550 struct sock *sk = sock->sk;
2551 struct tipc_sock *tsk = tipc_sk(sk);
2552 struct sockaddr_tipc *dst = (struct sockaddr_tipc *)dest;
2553 struct msghdr m = {NULL,};
2554 long timeout = (flags & O_NONBLOCK) ? 0 : tsk->conn_timeout;
2555 int previous;
2556 int res = 0;
2557
2558 if (destlen != sizeof(struct sockaddr_tipc))
2559 return -EINVAL;
2560
2561 lock_sock(sk);
2562
2563 if (tsk->group) {
2564 res = -EINVAL;
2565 goto exit;
2566 }
2567
2568 if (dst->family == AF_UNSPEC) {
2569 memset(&tsk->peer, 0, sizeof(struct sockaddr_tipc));
2570 if (!tipc_sk_type_connectionless(sk))
2571 res = -EINVAL;
2572 goto exit;
2573 }
2574 if (!tipc_sockaddr_is_sane(dst)) {
2575 res = -EINVAL;
2576 goto exit;
2577 }
2578
2579 if (tipc_sk_type_connectionless(sk)) {
2580 memcpy(&tsk->peer, dest, destlen);
2581 goto exit;
2582 } else if (dst->addrtype == TIPC_SERVICE_RANGE) {
2583 res = -EINVAL;
2584 goto exit;
2585 }
2586
2587 previous = sk->sk_state;
2588
2589 switch (sk->sk_state) {
2590 case TIPC_OPEN:
2591
2592 m.msg_name = dest;
2593 m.msg_namelen = destlen;
2594
2595
2596
2597
2598 if (!timeout)
2599 m.msg_flags = MSG_DONTWAIT;
2600
2601 res = __tipc_sendmsg(sock, &m, 0);
2602 if ((res < 0) && (res != -EWOULDBLOCK))
2603 goto exit;
2604
2605
2606
2607
2608
2609 res = -EINPROGRESS;
2610 fallthrough;
2611 case TIPC_CONNECTING:
2612 if (!timeout) {
2613 if (previous == TIPC_CONNECTING)
2614 res = -EALREADY;
2615 goto exit;
2616 }
2617 timeout = msecs_to_jiffies(timeout);
2618
2619 res = tipc_wait_for_connect(sock, &timeout);
2620 break;
2621 case TIPC_ESTABLISHED:
2622 res = -EISCONN;
2623 break;
2624 default:
2625 res = -EINVAL;
2626 }
2627
2628exit:
2629 release_sock(sk);
2630 return res;
2631}
2632
2633
2634
2635
2636
2637
2638
2639
2640static int tipc_listen(struct socket *sock, int len)
2641{
2642 struct sock *sk = sock->sk;
2643 int res;
2644
2645 lock_sock(sk);
2646 res = tipc_set_sk_state(sk, TIPC_LISTEN);
2647 release_sock(sk);
2648
2649 return res;
2650}
2651
2652static int tipc_wait_for_accept(struct socket *sock, long timeo)
2653{
2654 struct sock *sk = sock->sk;
2655 DEFINE_WAIT_FUNC(wait, woken_wake_function);
2656 int err;
2657
2658
2659
2660
2661
2662
2663 for (;;) {
2664 if (timeo && skb_queue_empty(&sk->sk_receive_queue)) {
2665 add_wait_queue(sk_sleep(sk), &wait);
2666 release_sock(sk);
2667 timeo = wait_woken(&wait, TASK_INTERRUPTIBLE, timeo);
2668 lock_sock(sk);
2669 remove_wait_queue(sk_sleep(sk), &wait);
2670 }
2671 err = 0;
2672 if (!skb_queue_empty(&sk->sk_receive_queue))
2673 break;
2674 err = -EAGAIN;
2675 if (!timeo)
2676 break;
2677 err = sock_intr_errno(timeo);
2678 if (signal_pending(current))
2679 break;
2680 }
2681 return err;
2682}
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693static int tipc_accept(struct socket *sock, struct socket *new_sock, int flags,
2694 bool kern)
2695{
2696 struct sock *new_sk, *sk = sock->sk;
2697 struct tipc_sock *new_tsock;
2698 struct msghdr m = {NULL,};
2699 struct tipc_msg *msg;
2700 struct sk_buff *buf;
2701 long timeo;
2702 int res;
2703
2704 lock_sock(sk);
2705
2706 if (sk->sk_state != TIPC_LISTEN) {
2707 res = -EINVAL;
2708 goto exit;
2709 }
2710 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
2711 res = tipc_wait_for_accept(sock, timeo);
2712 if (res)
2713 goto exit;
2714
2715 buf = skb_peek(&sk->sk_receive_queue);
2716
2717 res = tipc_sk_create(sock_net(sock->sk), new_sock, 0, kern);
2718 if (res)
2719 goto exit;
2720 security_sk_clone(sock->sk, new_sock->sk);
2721
2722 new_sk = new_sock->sk;
2723 new_tsock = tipc_sk(new_sk);
2724 msg = buf_msg(buf);
2725
2726
2727 lock_sock_nested(new_sk, SINGLE_DEPTH_NESTING);
2728
2729
2730
2731
2732
2733 tsk_rej_rx_queue(new_sk, TIPC_ERR_NO_PORT);
2734
2735
2736 tipc_sk_finish_conn(new_tsock, msg_origport(msg), msg_orignode(msg));
2737
2738 tsk_set_importance(new_sk, msg_importance(msg));
2739 if (msg_named(msg)) {
2740 new_tsock->conn_addrtype = TIPC_SERVICE_ADDR;
2741 msg_set_nametype(&new_tsock->phdr, msg_nametype(msg));
2742 msg_set_nameinst(&new_tsock->phdr, msg_nameinst(msg));
2743 }
2744
2745
2746
2747
2748
2749 if (!msg_data_sz(msg)) {
2750 tsk_advance_rx_queue(sk);
2751 } else {
2752 __skb_dequeue(&sk->sk_receive_queue);
2753 __skb_queue_head(&new_sk->sk_receive_queue, buf);
2754 skb_set_owner_r(buf, new_sk);
2755 }
2756 __tipc_sendstream(new_sock, &m, 0);
2757 release_sock(new_sk);
2758exit:
2759 release_sock(sk);
2760 return res;
2761}
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772static int tipc_shutdown(struct socket *sock, int how)
2773{
2774 struct sock *sk = sock->sk;
2775 int res;
2776
2777 if (how != SHUT_RDWR)
2778 return -EINVAL;
2779
2780 lock_sock(sk);
2781
2782 trace_tipc_sk_shutdown(sk, NULL, TIPC_DUMP_ALL, " ");
2783 __tipc_shutdown(sock, TIPC_CONN_SHUTDOWN);
2784 sk->sk_shutdown = SHUTDOWN_MASK;
2785
2786 if (sk->sk_state == TIPC_DISCONNECTING) {
2787
2788 __skb_queue_purge(&sk->sk_receive_queue);
2789
2790 res = 0;
2791 } else {
2792 res = -ENOTCONN;
2793 }
2794
2795 sk->sk_state_change(sk);
2796
2797 release_sock(sk);
2798 return res;
2799}
2800
2801static void tipc_sk_check_probing_state(struct sock *sk,
2802 struct sk_buff_head *list)
2803{
2804 struct tipc_sock *tsk = tipc_sk(sk);
2805 u32 pnode = tsk_peer_node(tsk);
2806 u32 pport = tsk_peer_port(tsk);
2807 u32 self = tsk_own_node(tsk);
2808 u32 oport = tsk->portid;
2809 struct sk_buff *skb;
2810
2811 if (tsk->probe_unacked) {
2812 tipc_set_sk_state(sk, TIPC_DISCONNECTING);
2813 sk->sk_err = ECONNABORTED;
2814 tipc_node_remove_conn(sock_net(sk), pnode, pport);
2815 sk->sk_state_change(sk);
2816 return;
2817 }
2818
2819 skb = tipc_msg_create(CONN_MANAGER, CONN_PROBE, INT_H_SIZE, 0,
2820 pnode, self, pport, oport, TIPC_OK);
2821 if (skb)
2822 __skb_queue_tail(list, skb);
2823 tsk->probe_unacked = true;
2824 sk_reset_timer(sk, &sk->sk_timer, jiffies + CONN_PROBING_INTV);
2825}
2826
2827static void tipc_sk_retry_connect(struct sock *sk, struct sk_buff_head *list)
2828{
2829 struct tipc_sock *tsk = tipc_sk(sk);
2830
2831
2832 if (tsk->cong_link_cnt) {
2833 sk_reset_timer(sk, &sk->sk_timer, msecs_to_jiffies(100));
2834 return;
2835 }
2836
2837 tipc_msg_skb_clone(&sk->sk_write_queue, list);
2838}
2839
2840static void tipc_sk_timeout(struct timer_list *t)
2841{
2842 struct sock *sk = from_timer(sk, t, sk_timer);
2843 struct tipc_sock *tsk = tipc_sk(sk);
2844 u32 pnode = tsk_peer_node(tsk);
2845 struct sk_buff_head list;
2846 int rc = 0;
2847
2848 __skb_queue_head_init(&list);
2849 bh_lock_sock(sk);
2850
2851
2852 if (sock_owned_by_user(sk)) {
2853 sk_reset_timer(sk, &sk->sk_timer, jiffies + HZ / 20);
2854 bh_unlock_sock(sk);
2855 sock_put(sk);
2856 return;
2857 }
2858
2859 if (sk->sk_state == TIPC_ESTABLISHED)
2860 tipc_sk_check_probing_state(sk, &list);
2861 else if (sk->sk_state == TIPC_CONNECTING)
2862 tipc_sk_retry_connect(sk, &list);
2863
2864 bh_unlock_sock(sk);
2865
2866 if (!skb_queue_empty(&list))
2867 rc = tipc_node_xmit(sock_net(sk), &list, pnode, tsk->portid);
2868
2869
2870 if (rc == -ELINKCONG) {
2871 tipc_dest_push(&tsk->cong_links, pnode, 0);
2872 tsk->cong_link_cnt = 1;
2873 }
2874 sock_put(sk);
2875}
2876
2877static int tipc_sk_publish(struct tipc_sock *tsk, struct tipc_uaddr *ua)
2878{
2879 struct sock *sk = &tsk->sk;
2880 struct net *net = sock_net(sk);
2881 struct tipc_socket_addr skaddr;
2882 struct publication *p;
2883 u32 key;
2884
2885 if (tipc_sk_connected(sk))
2886 return -EINVAL;
2887 key = tsk->portid + tsk->pub_count + 1;
2888 if (key == tsk->portid)
2889 return -EADDRINUSE;
2890 skaddr.ref = tsk->portid;
2891 skaddr.node = tipc_own_addr(net);
2892 p = tipc_nametbl_publish(net, ua, &skaddr, key);
2893 if (unlikely(!p))
2894 return -EINVAL;
2895
2896 list_add(&p->binding_sock, &tsk->publications);
2897 tsk->pub_count++;
2898 tsk->published = true;
2899 return 0;
2900}
2901
2902static int tipc_sk_withdraw(struct tipc_sock *tsk, struct tipc_uaddr *ua)
2903{
2904 struct net *net = sock_net(&tsk->sk);
2905 struct publication *safe, *p;
2906 struct tipc_uaddr _ua;
2907 int rc = -EINVAL;
2908
2909 list_for_each_entry_safe(p, safe, &tsk->publications, binding_sock) {
2910 if (!ua) {
2911 tipc_uaddr(&_ua, TIPC_SERVICE_RANGE, p->scope,
2912 p->sr.type, p->sr.lower, p->sr.upper);
2913 tipc_nametbl_withdraw(net, &_ua, &p->sk, p->key);
2914 continue;
2915 }
2916
2917 if (p->scope != ua->scope)
2918 continue;
2919 if (p->sr.type != ua->sr.type)
2920 continue;
2921 if (p->sr.lower != ua->sr.lower)
2922 continue;
2923 if (p->sr.upper != ua->sr.upper)
2924 break;
2925 tipc_nametbl_withdraw(net, ua, &p->sk, p->key);
2926 rc = 0;
2927 break;
2928 }
2929 if (list_empty(&tsk->publications)) {
2930 tsk->published = 0;
2931 rc = 0;
2932 }
2933 return rc;
2934}
2935
2936
2937
2938
2939void tipc_sk_reinit(struct net *net)
2940{
2941 struct tipc_net *tn = net_generic(net, tipc_net_id);
2942 struct rhashtable_iter iter;
2943 struct tipc_sock *tsk;
2944 struct tipc_msg *msg;
2945
2946 rhashtable_walk_enter(&tn->sk_rht, &iter);
2947
2948 do {
2949 rhashtable_walk_start(&iter);
2950
2951 while ((tsk = rhashtable_walk_next(&iter)) && !IS_ERR(tsk)) {
2952 sock_hold(&tsk->sk);
2953 rhashtable_walk_stop(&iter);
2954 lock_sock(&tsk->sk);
2955 msg = &tsk->phdr;
2956 msg_set_prevnode(msg, tipc_own_addr(net));
2957 msg_set_orignode(msg, tipc_own_addr(net));
2958 release_sock(&tsk->sk);
2959 rhashtable_walk_start(&iter);
2960 sock_put(&tsk->sk);
2961 }
2962
2963 rhashtable_walk_stop(&iter);
2964 } while (tsk == ERR_PTR(-EAGAIN));
2965
2966 rhashtable_walk_exit(&iter);
2967}
2968
2969static struct tipc_sock *tipc_sk_lookup(struct net *net, u32 portid)
2970{
2971 struct tipc_net *tn = net_generic(net, tipc_net_id);
2972 struct tipc_sock *tsk;
2973
2974 rcu_read_lock();
2975 tsk = rhashtable_lookup(&tn->sk_rht, &portid, tsk_rht_params);
2976 if (tsk)
2977 sock_hold(&tsk->sk);
2978 rcu_read_unlock();
2979
2980 return tsk;
2981}
2982
2983static int tipc_sk_insert(struct tipc_sock *tsk)
2984{
2985 struct sock *sk = &tsk->sk;
2986 struct net *net = sock_net(sk);
2987 struct tipc_net *tn = net_generic(net, tipc_net_id);
2988 u32 remaining = (TIPC_MAX_PORT - TIPC_MIN_PORT) + 1;
2989 u32 portid = prandom_u32() % remaining + TIPC_MIN_PORT;
2990
2991 while (remaining--) {
2992 portid++;
2993 if ((portid < TIPC_MIN_PORT) || (portid > TIPC_MAX_PORT))
2994 portid = TIPC_MIN_PORT;
2995 tsk->portid = portid;
2996 sock_hold(&tsk->sk);
2997 if (!rhashtable_lookup_insert_fast(&tn->sk_rht, &tsk->node,
2998 tsk_rht_params))
2999 return 0;
3000 sock_put(&tsk->sk);
3001 }
3002
3003 return -1;
3004}
3005
3006static void tipc_sk_remove(struct tipc_sock *tsk)
3007{
3008 struct sock *sk = &tsk->sk;
3009 struct tipc_net *tn = net_generic(sock_net(sk), tipc_net_id);
3010
3011 if (!rhashtable_remove_fast(&tn->sk_rht, &tsk->node, tsk_rht_params)) {
3012 WARN_ON(refcount_read(&sk->sk_refcnt) == 1);
3013 __sock_put(sk);
3014 }
3015}
3016
3017static const struct rhashtable_params tsk_rht_params = {
3018 .nelem_hint = 192,
3019 .head_offset = offsetof(struct tipc_sock, node),
3020 .key_offset = offsetof(struct tipc_sock, portid),
3021 .key_len = sizeof(u32),
3022 .max_size = 1048576,
3023 .min_size = 256,
3024 .automatic_shrinking = true,
3025};
3026
3027int tipc_sk_rht_init(struct net *net)
3028{
3029 struct tipc_net *tn = net_generic(net, tipc_net_id);
3030
3031 return rhashtable_init(&tn->sk_rht, &tsk_rht_params);
3032}
3033
3034void tipc_sk_rht_destroy(struct net *net)
3035{
3036 struct tipc_net *tn = net_generic(net, tipc_net_id);
3037
3038
3039 synchronize_net();
3040
3041 rhashtable_destroy(&tn->sk_rht);
3042}
3043
3044static int tipc_sk_join(struct tipc_sock *tsk, struct tipc_group_req *mreq)
3045{
3046 struct net *net = sock_net(&tsk->sk);
3047 struct tipc_group *grp = tsk->group;
3048 struct tipc_msg *hdr = &tsk->phdr;
3049 struct tipc_uaddr ua;
3050 int rc;
3051
3052 if (mreq->type < TIPC_RESERVED_TYPES)
3053 return -EACCES;
3054 if (mreq->scope > TIPC_NODE_SCOPE)
3055 return -EINVAL;
3056 if (mreq->scope != TIPC_NODE_SCOPE)
3057 mreq->scope = TIPC_CLUSTER_SCOPE;
3058 if (grp)
3059 return -EACCES;
3060 grp = tipc_group_create(net, tsk->portid, mreq, &tsk->group_is_open);
3061 if (!grp)
3062 return -ENOMEM;
3063 tsk->group = grp;
3064 msg_set_lookup_scope(hdr, mreq->scope);
3065 msg_set_nametype(hdr, mreq->type);
3066 msg_set_dest_droppable(hdr, true);
3067 tipc_uaddr(&ua, TIPC_SERVICE_RANGE, mreq->scope,
3068 mreq->type, mreq->instance, mreq->instance);
3069 tipc_nametbl_build_group(net, grp, &ua);
3070 rc = tipc_sk_publish(tsk, &ua);
3071 if (rc) {
3072 tipc_group_delete(net, grp);
3073 tsk->group = NULL;
3074 return rc;
3075 }
3076
3077 tsk->mc_method.rcast = true;
3078 tsk->mc_method.mandatory = true;
3079 tipc_group_join(net, grp, &tsk->sk.sk_rcvbuf);
3080 return rc;
3081}
3082
3083static int tipc_sk_leave(struct tipc_sock *tsk)
3084{
3085 struct net *net = sock_net(&tsk->sk);
3086 struct tipc_group *grp = tsk->group;
3087 struct tipc_uaddr ua;
3088 int scope;
3089
3090 if (!grp)
3091 return -EINVAL;
3092 ua.addrtype = TIPC_SERVICE_RANGE;
3093 tipc_group_self(grp, &ua.sr, &scope);
3094 ua.scope = scope;
3095 tipc_group_delete(net, grp);
3096 tsk->group = NULL;
3097 tipc_sk_withdraw(tsk, &ua);
3098 return 0;
3099}
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114static int tipc_setsockopt(struct socket *sock, int lvl, int opt,
3115 sockptr_t ov, unsigned int ol)
3116{
3117 struct sock *sk = sock->sk;
3118 struct tipc_sock *tsk = tipc_sk(sk);
3119 struct tipc_group_req mreq;
3120 u32 value = 0;
3121 int res = 0;
3122
3123 if ((lvl == IPPROTO_TCP) && (sock->type == SOCK_STREAM))
3124 return 0;
3125 if (lvl != SOL_TIPC)
3126 return -ENOPROTOOPT;
3127
3128 switch (opt) {
3129 case TIPC_IMPORTANCE:
3130 case TIPC_SRC_DROPPABLE:
3131 case TIPC_DEST_DROPPABLE:
3132 case TIPC_CONN_TIMEOUT:
3133 case TIPC_NODELAY:
3134 if (ol < sizeof(value))
3135 return -EINVAL;
3136 if (copy_from_sockptr(&value, ov, sizeof(u32)))
3137 return -EFAULT;
3138 break;
3139 case TIPC_GROUP_JOIN:
3140 if (ol < sizeof(mreq))
3141 return -EINVAL;
3142 if (copy_from_sockptr(&mreq, ov, sizeof(mreq)))
3143 return -EFAULT;
3144 break;
3145 default:
3146 if (!sockptr_is_null(ov) || ol)
3147 return -EINVAL;
3148 }
3149
3150 lock_sock(sk);
3151
3152 switch (opt) {
3153 case TIPC_IMPORTANCE:
3154 res = tsk_set_importance(sk, value);
3155 break;
3156 case TIPC_SRC_DROPPABLE:
3157 if (sock->type != SOCK_STREAM)
3158 tsk_set_unreliable(tsk, value);
3159 else
3160 res = -ENOPROTOOPT;
3161 break;
3162 case TIPC_DEST_DROPPABLE:
3163 tsk_set_unreturnable(tsk, value);
3164 break;
3165 case TIPC_CONN_TIMEOUT:
3166 tipc_sk(sk)->conn_timeout = value;
3167 break;
3168 case TIPC_MCAST_BROADCAST:
3169 tsk->mc_method.rcast = false;
3170 tsk->mc_method.mandatory = true;
3171 break;
3172 case TIPC_MCAST_REPLICAST:
3173 tsk->mc_method.rcast = true;
3174 tsk->mc_method.mandatory = true;
3175 break;
3176 case TIPC_GROUP_JOIN:
3177 res = tipc_sk_join(tsk, &mreq);
3178 break;
3179 case TIPC_GROUP_LEAVE:
3180 res = tipc_sk_leave(tsk);
3181 break;
3182 case TIPC_NODELAY:
3183 tsk->nodelay = !!value;
3184 tsk_set_nagle(tsk);
3185 break;
3186 default:
3187 res = -EINVAL;
3188 }
3189
3190 release_sock(sk);
3191
3192 return res;
3193}
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208static int tipc_getsockopt(struct socket *sock, int lvl, int opt,
3209 char __user *ov, int __user *ol)
3210{
3211 struct sock *sk = sock->sk;
3212 struct tipc_sock *tsk = tipc_sk(sk);
3213 struct tipc_service_range seq;
3214 int len, scope;
3215 u32 value;
3216 int res;
3217
3218 if ((lvl == IPPROTO_TCP) && (sock->type == SOCK_STREAM))
3219 return put_user(0, ol);
3220 if (lvl != SOL_TIPC)
3221 return -ENOPROTOOPT;
3222 res = get_user(len, ol);
3223 if (res)
3224 return res;
3225
3226 lock_sock(sk);
3227
3228 switch (opt) {
3229 case TIPC_IMPORTANCE:
3230 value = tsk_importance(tsk);
3231 break;
3232 case TIPC_SRC_DROPPABLE:
3233 value = tsk_unreliable(tsk);
3234 break;
3235 case TIPC_DEST_DROPPABLE:
3236 value = tsk_unreturnable(tsk);
3237 break;
3238 case TIPC_CONN_TIMEOUT:
3239 value = tsk->conn_timeout;
3240
3241 break;
3242 case TIPC_NODE_RECVQ_DEPTH:
3243 value = 0;
3244 break;
3245 case TIPC_SOCK_RECVQ_DEPTH:
3246 value = skb_queue_len(&sk->sk_receive_queue);
3247 break;
3248 case TIPC_SOCK_RECVQ_USED:
3249 value = sk_rmem_alloc_get(sk);
3250 break;
3251 case TIPC_GROUP_JOIN:
3252 seq.type = 0;
3253 if (tsk->group)
3254 tipc_group_self(tsk->group, &seq, &scope);
3255 value = seq.type;
3256 break;
3257 default:
3258 res = -EINVAL;
3259 }
3260
3261 release_sock(sk);
3262
3263 if (res)
3264 return res;
3265
3266 if (len < sizeof(value))
3267 return -EINVAL;
3268
3269 if (copy_to_user(ov, &value, sizeof(value)))
3270 return -EFAULT;
3271
3272 return put_user(sizeof(value), ol);
3273}
3274
3275static int tipc_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
3276{
3277 struct net *net = sock_net(sock->sk);
3278 struct tipc_sioc_nodeid_req nr = {0};
3279 struct tipc_sioc_ln_req lnr;
3280 void __user *argp = (void __user *)arg;
3281
3282 switch (cmd) {
3283 case SIOCGETLINKNAME:
3284 if (copy_from_user(&lnr, argp, sizeof(lnr)))
3285 return -EFAULT;
3286 if (!tipc_node_get_linkname(net,
3287 lnr.bearer_id & 0xffff, lnr.peer,
3288 lnr.linkname, TIPC_MAX_LINK_NAME)) {
3289 if (copy_to_user(argp, &lnr, sizeof(lnr)))
3290 return -EFAULT;
3291 return 0;
3292 }
3293 return -EADDRNOTAVAIL;
3294 case SIOCGETNODEID:
3295 if (copy_from_user(&nr, argp, sizeof(nr)))
3296 return -EFAULT;
3297 if (!tipc_node_get_id(net, nr.peer, nr.node_id))
3298 return -EADDRNOTAVAIL;
3299 if (copy_to_user(argp, &nr, sizeof(nr)))
3300 return -EFAULT;
3301 return 0;
3302 default:
3303 return -ENOIOCTLCMD;
3304 }
3305}
3306
3307static int tipc_socketpair(struct socket *sock1, struct socket *sock2)
3308{
3309 struct tipc_sock *tsk2 = tipc_sk(sock2->sk);
3310 struct tipc_sock *tsk1 = tipc_sk(sock1->sk);
3311 u32 onode = tipc_own_addr(sock_net(sock1->sk));
3312
3313 tsk1->peer.family = AF_TIPC;
3314 tsk1->peer.addrtype = TIPC_SOCKET_ADDR;
3315 tsk1->peer.scope = TIPC_NODE_SCOPE;
3316 tsk1->peer.addr.id.ref = tsk2->portid;
3317 tsk1->peer.addr.id.node = onode;
3318 tsk2->peer.family = AF_TIPC;
3319 tsk2->peer.addrtype = TIPC_SOCKET_ADDR;
3320 tsk2->peer.scope = TIPC_NODE_SCOPE;
3321 tsk2->peer.addr.id.ref = tsk1->portid;
3322 tsk2->peer.addr.id.node = onode;
3323
3324 tipc_sk_finish_conn(tsk1, tsk2->portid, onode);
3325 tipc_sk_finish_conn(tsk2, tsk1->portid, onode);
3326 return 0;
3327}
3328
3329
3330
3331static const struct proto_ops msg_ops = {
3332 .owner = THIS_MODULE,
3333 .family = AF_TIPC,
3334 .release = tipc_release,
3335 .bind = tipc_bind,
3336 .connect = tipc_connect,
3337 .socketpair = tipc_socketpair,
3338 .accept = sock_no_accept,
3339 .getname = tipc_getname,
3340 .poll = tipc_poll,
3341 .ioctl = tipc_ioctl,
3342 .listen = sock_no_listen,
3343 .shutdown = tipc_shutdown,
3344 .setsockopt = tipc_setsockopt,
3345 .getsockopt = tipc_getsockopt,
3346 .sendmsg = tipc_sendmsg,
3347 .recvmsg = tipc_recvmsg,
3348 .mmap = sock_no_mmap,
3349 .sendpage = sock_no_sendpage
3350};
3351
3352static const struct proto_ops packet_ops = {
3353 .owner = THIS_MODULE,
3354 .family = AF_TIPC,
3355 .release = tipc_release,
3356 .bind = tipc_bind,
3357 .connect = tipc_connect,
3358 .socketpair = tipc_socketpair,
3359 .accept = tipc_accept,
3360 .getname = tipc_getname,
3361 .poll = tipc_poll,
3362 .ioctl = tipc_ioctl,
3363 .listen = tipc_listen,
3364 .shutdown = tipc_shutdown,
3365 .setsockopt = tipc_setsockopt,
3366 .getsockopt = tipc_getsockopt,
3367 .sendmsg = tipc_send_packet,
3368 .recvmsg = tipc_recvmsg,
3369 .mmap = sock_no_mmap,
3370 .sendpage = sock_no_sendpage
3371};
3372
3373static const struct proto_ops stream_ops = {
3374 .owner = THIS_MODULE,
3375 .family = AF_TIPC,
3376 .release = tipc_release,
3377 .bind = tipc_bind,
3378 .connect = tipc_connect,
3379 .socketpair = tipc_socketpair,
3380 .accept = tipc_accept,
3381 .getname = tipc_getname,
3382 .poll = tipc_poll,
3383 .ioctl = tipc_ioctl,
3384 .listen = tipc_listen,
3385 .shutdown = tipc_shutdown,
3386 .setsockopt = tipc_setsockopt,
3387 .getsockopt = tipc_getsockopt,
3388 .sendmsg = tipc_sendstream,
3389 .recvmsg = tipc_recvstream,
3390 .mmap = sock_no_mmap,
3391 .sendpage = sock_no_sendpage
3392};
3393
3394static const struct net_proto_family tipc_family_ops = {
3395 .owner = THIS_MODULE,
3396 .family = AF_TIPC,
3397 .create = tipc_sk_create
3398};
3399
3400static struct proto tipc_proto = {
3401 .name = "TIPC",
3402 .owner = THIS_MODULE,
3403 .obj_size = sizeof(struct tipc_sock),
3404 .sysctl_rmem = sysctl_tipc_rmem
3405};
3406
3407
3408
3409
3410
3411
3412int tipc_socket_init(void)
3413{
3414 int res;
3415
3416 res = proto_register(&tipc_proto, 1);
3417 if (res) {
3418 pr_err("Failed to register TIPC protocol type\n");
3419 goto out;
3420 }
3421
3422 res = sock_register(&tipc_family_ops);
3423 if (res) {
3424 pr_err("Failed to register TIPC socket type\n");
3425 proto_unregister(&tipc_proto);
3426 goto out;
3427 }
3428 out:
3429 return res;
3430}
3431
3432
3433
3434
3435void tipc_socket_stop(void)
3436{
3437 sock_unregister(tipc_family_ops.family);
3438 proto_unregister(&tipc_proto);
3439}
3440
3441
3442static int __tipc_nl_add_sk_con(struct sk_buff *skb, struct tipc_sock *tsk)
3443{
3444 u32 peer_node, peer_port;
3445 u32 conn_type, conn_instance;
3446 struct nlattr *nest;
3447
3448 peer_node = tsk_peer_node(tsk);
3449 peer_port = tsk_peer_port(tsk);
3450 conn_type = msg_nametype(&tsk->phdr);
3451 conn_instance = msg_nameinst(&tsk->phdr);
3452 nest = nla_nest_start_noflag(skb, TIPC_NLA_SOCK_CON);
3453 if (!nest)
3454 return -EMSGSIZE;
3455
3456 if (nla_put_u32(skb, TIPC_NLA_CON_NODE, peer_node))
3457 goto msg_full;
3458 if (nla_put_u32(skb, TIPC_NLA_CON_SOCK, peer_port))
3459 goto msg_full;
3460
3461 if (tsk->conn_addrtype != 0) {
3462 if (nla_put_flag(skb, TIPC_NLA_CON_FLAG))
3463 goto msg_full;
3464 if (nla_put_u32(skb, TIPC_NLA_CON_TYPE, conn_type))
3465 goto msg_full;
3466 if (nla_put_u32(skb, TIPC_NLA_CON_INST, conn_instance))
3467 goto msg_full;
3468 }
3469 nla_nest_end(skb, nest);
3470
3471 return 0;
3472
3473msg_full:
3474 nla_nest_cancel(skb, nest);
3475
3476 return -EMSGSIZE;
3477}
3478
3479static int __tipc_nl_add_sk_info(struct sk_buff *skb, struct tipc_sock
3480 *tsk)
3481{
3482 struct net *net = sock_net(skb->sk);
3483 struct sock *sk = &tsk->sk;
3484
3485 if (nla_put_u32(skb, TIPC_NLA_SOCK_REF, tsk->portid) ||
3486 nla_put_u32(skb, TIPC_NLA_SOCK_ADDR, tipc_own_addr(net)))
3487 return -EMSGSIZE;
3488
3489 if (tipc_sk_connected(sk)) {
3490 if (__tipc_nl_add_sk_con(skb, tsk))
3491 return -EMSGSIZE;
3492 } else if (!list_empty(&tsk->publications)) {
3493 if (nla_put_flag(skb, TIPC_NLA_SOCK_HAS_PUBL))
3494 return -EMSGSIZE;
3495 }
3496 return 0;
3497}
3498
3499
3500static int __tipc_nl_add_sk(struct sk_buff *skb, struct netlink_callback *cb,
3501 struct tipc_sock *tsk)
3502{
3503 struct nlattr *attrs;
3504 void *hdr;
3505
3506 hdr = genlmsg_put(skb, NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq,
3507 &tipc_genl_family, NLM_F_MULTI, TIPC_NL_SOCK_GET);
3508 if (!hdr)
3509 goto msg_cancel;
3510
3511 attrs = nla_nest_start_noflag(skb, TIPC_NLA_SOCK);
3512 if (!attrs)
3513 goto genlmsg_cancel;
3514
3515 if (__tipc_nl_add_sk_info(skb, tsk))
3516 goto attr_msg_cancel;
3517
3518 nla_nest_end(skb, attrs);
3519 genlmsg_end(skb, hdr);
3520
3521 return 0;
3522
3523attr_msg_cancel:
3524 nla_nest_cancel(skb, attrs);
3525genlmsg_cancel:
3526 genlmsg_cancel(skb, hdr);
3527msg_cancel:
3528 return -EMSGSIZE;
3529}
3530
3531int tipc_nl_sk_walk(struct sk_buff *skb, struct netlink_callback *cb,
3532 int (*skb_handler)(struct sk_buff *skb,
3533 struct netlink_callback *cb,
3534 struct tipc_sock *tsk))
3535{
3536 struct rhashtable_iter *iter = (void *)cb->args[4];
3537 struct tipc_sock *tsk;
3538 int err;
3539
3540 rhashtable_walk_start(iter);
3541 while ((tsk = rhashtable_walk_next(iter)) != NULL) {
3542 if (IS_ERR(tsk)) {
3543 err = PTR_ERR(tsk);
3544 if (err == -EAGAIN) {
3545 err = 0;
3546 continue;
3547 }
3548 break;
3549 }
3550
3551 sock_hold(&tsk->sk);
3552 rhashtable_walk_stop(iter);
3553 lock_sock(&tsk->sk);
3554 err = skb_handler(skb, cb, tsk);
3555 if (err) {
3556 release_sock(&tsk->sk);
3557 sock_put(&tsk->sk);
3558 goto out;
3559 }
3560 release_sock(&tsk->sk);
3561 rhashtable_walk_start(iter);
3562 sock_put(&tsk->sk);
3563 }
3564 rhashtable_walk_stop(iter);
3565out:
3566 return skb->len;
3567}
3568EXPORT_SYMBOL(tipc_nl_sk_walk);
3569
3570int tipc_dump_start(struct netlink_callback *cb)
3571{
3572 return __tipc_dump_start(cb, sock_net(cb->skb->sk));
3573}
3574EXPORT_SYMBOL(tipc_dump_start);
3575
3576int __tipc_dump_start(struct netlink_callback *cb, struct net *net)
3577{
3578
3579 struct rhashtable_iter *iter = (void *)cb->args[4];
3580 struct tipc_net *tn = tipc_net(net);
3581
3582 if (!iter) {
3583 iter = kmalloc(sizeof(*iter), GFP_KERNEL);
3584 if (!iter)
3585 return -ENOMEM;
3586
3587 cb->args[4] = (long)iter;
3588 }
3589
3590 rhashtable_walk_enter(&tn->sk_rht, iter);
3591 return 0;
3592}
3593
3594int tipc_dump_done(struct netlink_callback *cb)
3595{
3596 struct rhashtable_iter *hti = (void *)cb->args[4];
3597
3598 rhashtable_walk_exit(hti);
3599 kfree(hti);
3600 return 0;
3601}
3602EXPORT_SYMBOL(tipc_dump_done);
3603
3604int tipc_sk_fill_sock_diag(struct sk_buff *skb, struct netlink_callback *cb,
3605 struct tipc_sock *tsk, u32 sk_filter_state,
3606 u64 (*tipc_diag_gen_cookie)(struct sock *sk))
3607{
3608 struct sock *sk = &tsk->sk;
3609 struct nlattr *attrs;
3610 struct nlattr *stat;
3611
3612
3613 if (!(sk_filter_state & (1 << sk->sk_state)))
3614 return 0;
3615
3616 attrs = nla_nest_start_noflag(skb, TIPC_NLA_SOCK);
3617 if (!attrs)
3618 goto msg_cancel;
3619
3620 if (__tipc_nl_add_sk_info(skb, tsk))
3621 goto attr_msg_cancel;
3622
3623 if (nla_put_u32(skb, TIPC_NLA_SOCK_TYPE, (u32)sk->sk_type) ||
3624 nla_put_u32(skb, TIPC_NLA_SOCK_TIPC_STATE, (u32)sk->sk_state) ||
3625 nla_put_u32(skb, TIPC_NLA_SOCK_INO, sock_i_ino(sk)) ||
3626 nla_put_u32(skb, TIPC_NLA_SOCK_UID,
3627 from_kuid_munged(sk_user_ns(NETLINK_CB(cb->skb).sk),
3628 sock_i_uid(sk))) ||
3629 nla_put_u64_64bit(skb, TIPC_NLA_SOCK_COOKIE,
3630 tipc_diag_gen_cookie(sk),
3631 TIPC_NLA_SOCK_PAD))
3632 goto attr_msg_cancel;
3633
3634 stat = nla_nest_start_noflag(skb, TIPC_NLA_SOCK_STAT);
3635 if (!stat)
3636 goto attr_msg_cancel;
3637
3638 if (nla_put_u32(skb, TIPC_NLA_SOCK_STAT_RCVQ,
3639 skb_queue_len(&sk->sk_receive_queue)) ||
3640 nla_put_u32(skb, TIPC_NLA_SOCK_STAT_SENDQ,
3641 skb_queue_len(&sk->sk_write_queue)) ||
3642 nla_put_u32(skb, TIPC_NLA_SOCK_STAT_DROP,
3643 atomic_read(&sk->sk_drops)))
3644 goto stat_msg_cancel;
3645
3646 if (tsk->cong_link_cnt &&
3647 nla_put_flag(skb, TIPC_NLA_SOCK_STAT_LINK_CONG))
3648 goto stat_msg_cancel;
3649
3650 if (tsk_conn_cong(tsk) &&
3651 nla_put_flag(skb, TIPC_NLA_SOCK_STAT_CONN_CONG))
3652 goto stat_msg_cancel;
3653
3654 nla_nest_end(skb, stat);
3655
3656 if (tsk->group)
3657 if (tipc_group_fill_sock_diag(tsk->group, skb))
3658 goto stat_msg_cancel;
3659
3660 nla_nest_end(skb, attrs);
3661
3662 return 0;
3663
3664stat_msg_cancel:
3665 nla_nest_cancel(skb, stat);
3666attr_msg_cancel:
3667 nla_nest_cancel(skb, attrs);
3668msg_cancel:
3669 return -EMSGSIZE;
3670}
3671EXPORT_SYMBOL(tipc_sk_fill_sock_diag);
3672
3673int tipc_nl_sk_dump(struct sk_buff *skb, struct netlink_callback *cb)
3674{
3675 return tipc_nl_sk_walk(skb, cb, __tipc_nl_add_sk);
3676}
3677
3678
3679static int __tipc_nl_add_sk_publ(struct sk_buff *skb,
3680 struct netlink_callback *cb,
3681 struct publication *publ)
3682{
3683 void *hdr;
3684 struct nlattr *attrs;
3685
3686 hdr = genlmsg_put(skb, NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq,
3687 &tipc_genl_family, NLM_F_MULTI, TIPC_NL_PUBL_GET);
3688 if (!hdr)
3689 goto msg_cancel;
3690
3691 attrs = nla_nest_start_noflag(skb, TIPC_NLA_PUBL);
3692 if (!attrs)
3693 goto genlmsg_cancel;
3694
3695 if (nla_put_u32(skb, TIPC_NLA_PUBL_KEY, publ->key))
3696 goto attr_msg_cancel;
3697 if (nla_put_u32(skb, TIPC_NLA_PUBL_TYPE, publ->sr.type))
3698 goto attr_msg_cancel;
3699 if (nla_put_u32(skb, TIPC_NLA_PUBL_LOWER, publ->sr.lower))
3700 goto attr_msg_cancel;
3701 if (nla_put_u32(skb, TIPC_NLA_PUBL_UPPER, publ->sr.upper))
3702 goto attr_msg_cancel;
3703
3704 nla_nest_end(skb, attrs);
3705 genlmsg_end(skb, hdr);
3706
3707 return 0;
3708
3709attr_msg_cancel:
3710 nla_nest_cancel(skb, attrs);
3711genlmsg_cancel:
3712 genlmsg_cancel(skb, hdr);
3713msg_cancel:
3714 return -EMSGSIZE;
3715}
3716
3717
3718static int __tipc_nl_list_sk_publ(struct sk_buff *skb,
3719 struct netlink_callback *cb,
3720 struct tipc_sock *tsk, u32 *last_publ)
3721{
3722 int err;
3723 struct publication *p;
3724
3725 if (*last_publ) {
3726 list_for_each_entry(p, &tsk->publications, binding_sock) {
3727 if (p->key == *last_publ)
3728 break;
3729 }
3730 if (p->key != *last_publ) {
3731
3732
3733
3734
3735
3736
3737 cb->prev_seq = 1;
3738 *last_publ = 0;
3739 return -EPIPE;
3740 }
3741 } else {
3742 p = list_first_entry(&tsk->publications, struct publication,
3743 binding_sock);
3744 }
3745
3746 list_for_each_entry_from(p, &tsk->publications, binding_sock) {
3747 err = __tipc_nl_add_sk_publ(skb, cb, p);
3748 if (err) {
3749 *last_publ = p->key;
3750 return err;
3751 }
3752 }
3753 *last_publ = 0;
3754
3755 return 0;
3756}
3757
3758int tipc_nl_publ_dump(struct sk_buff *skb, struct netlink_callback *cb)
3759{
3760 int err;
3761 u32 tsk_portid = cb->args[0];
3762 u32 last_publ = cb->args[1];
3763 u32 done = cb->args[2];
3764 struct net *net = sock_net(skb->sk);
3765 struct tipc_sock *tsk;
3766
3767 if (!tsk_portid) {
3768 struct nlattr **attrs = genl_dumpit_info(cb)->attrs;
3769 struct nlattr *sock[TIPC_NLA_SOCK_MAX + 1];
3770
3771 if (!attrs[TIPC_NLA_SOCK])
3772 return -EINVAL;
3773
3774 err = nla_parse_nested_deprecated(sock, TIPC_NLA_SOCK_MAX,
3775 attrs[TIPC_NLA_SOCK],
3776 tipc_nl_sock_policy, NULL);
3777 if (err)
3778 return err;
3779
3780 if (!sock[TIPC_NLA_SOCK_REF])
3781 return -EINVAL;
3782
3783 tsk_portid = nla_get_u32(sock[TIPC_NLA_SOCK_REF]);
3784 }
3785
3786 if (done)
3787 return 0;
3788
3789 tsk = tipc_sk_lookup(net, tsk_portid);
3790 if (!tsk)
3791 return -EINVAL;
3792
3793 lock_sock(&tsk->sk);
3794 err = __tipc_nl_list_sk_publ(skb, cb, tsk, &last_publ);
3795 if (!err)
3796 done = 1;
3797 release_sock(&tsk->sk);
3798 sock_put(&tsk->sk);
3799
3800 cb->args[0] = tsk_portid;
3801 cb->args[1] = last_publ;
3802 cb->args[2] = done;
3803
3804 return skb->len;
3805}
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818bool tipc_sk_filtering(struct sock *sk)
3819{
3820 struct tipc_sock *tsk;
3821 struct publication *p;
3822 u32 _port, _sktype, _type, _lower, _upper;
3823 u32 type = 0, lower = 0, upper = 0;
3824
3825 if (!sk)
3826 return true;
3827
3828 tsk = tipc_sk(sk);
3829
3830 _port = sysctl_tipc_sk_filter[0];
3831 _sktype = sysctl_tipc_sk_filter[1];
3832 _type = sysctl_tipc_sk_filter[2];
3833 _lower = sysctl_tipc_sk_filter[3];
3834 _upper = sysctl_tipc_sk_filter[4];
3835
3836 if (!_port && !_sktype && !_type && !_lower && !_upper)
3837 return true;
3838
3839 if (_port)
3840 return (_port == tsk->portid);
3841
3842 if (_sktype && _sktype != sk->sk_type)
3843 return false;
3844
3845 if (tsk->published) {
3846 p = list_first_entry_or_null(&tsk->publications,
3847 struct publication, binding_sock);
3848 if (p) {
3849 type = p->sr.type;
3850 lower = p->sr.lower;
3851 upper = p->sr.upper;
3852 }
3853 }
3854
3855 if (!tipc_sk_type_connectionless(sk)) {
3856 type = msg_nametype(&tsk->phdr);
3857 lower = msg_nameinst(&tsk->phdr);
3858 upper = lower;
3859 }
3860
3861 if ((_type && _type != type) || (_lower && _lower != lower) ||
3862 (_upper && _upper != upper))
3863 return false;
3864
3865 return true;
3866}
3867
3868u32 tipc_sock_get_portid(struct sock *sk)
3869{
3870 return (sk) ? (tipc_sk(sk))->portid : 0;
3871}
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882bool tipc_sk_overlimit1(struct sock *sk, struct sk_buff *skb)
3883{
3884 atomic_t *dcnt = &tipc_sk(sk)->dupl_rcvcnt;
3885 unsigned int lim = rcvbuf_limit(sk, skb) + atomic_read(dcnt);
3886 unsigned int qsize = sk->sk_backlog.len + sk_rmem_alloc_get(sk);
3887
3888 return (qsize > lim * 90 / 100);
3889}
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900bool tipc_sk_overlimit2(struct sock *sk, struct sk_buff *skb)
3901{
3902 unsigned int lim = rcvbuf_limit(sk, skb);
3903 unsigned int qsize = sk_rmem_alloc_get(sk);
3904
3905 return (qsize > lim * 90 / 100);
3906}
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919int tipc_sk_dump(struct sock *sk, u16 dqueues, char *buf)
3920{
3921 int i = 0;
3922 size_t sz = (dqueues) ? SK_LMAX : SK_LMIN;
3923 u32 conn_type, conn_instance;
3924 struct tipc_sock *tsk;
3925 struct publication *p;
3926 bool tsk_connected;
3927
3928 if (!sk) {
3929 i += scnprintf(buf, sz, "sk data: (null)\n");
3930 return i;
3931 }
3932
3933 tsk = tipc_sk(sk);
3934 tsk_connected = !tipc_sk_type_connectionless(sk);
3935
3936 i += scnprintf(buf, sz, "sk data: %u", sk->sk_type);
3937 i += scnprintf(buf + i, sz - i, " %d", sk->sk_state);
3938 i += scnprintf(buf + i, sz - i, " %x", tsk_own_node(tsk));
3939 i += scnprintf(buf + i, sz - i, " %u", tsk->portid);
3940 i += scnprintf(buf + i, sz - i, " | %u", tsk_connected);
3941 if (tsk_connected) {
3942 i += scnprintf(buf + i, sz - i, " %x", tsk_peer_node(tsk));
3943 i += scnprintf(buf + i, sz - i, " %u", tsk_peer_port(tsk));
3944 conn_type = msg_nametype(&tsk->phdr);
3945 conn_instance = msg_nameinst(&tsk->phdr);
3946 i += scnprintf(buf + i, sz - i, " %u", conn_type);
3947 i += scnprintf(buf + i, sz - i, " %u", conn_instance);
3948 }
3949 i += scnprintf(buf + i, sz - i, " | %u", tsk->published);
3950 if (tsk->published) {
3951 p = list_first_entry_or_null(&tsk->publications,
3952 struct publication, binding_sock);
3953 i += scnprintf(buf + i, sz - i, " %u", (p) ? p->sr.type : 0);
3954 i += scnprintf(buf + i, sz - i, " %u", (p) ? p->sr.lower : 0);
3955 i += scnprintf(buf + i, sz - i, " %u", (p) ? p->sr.upper : 0);
3956 }
3957 i += scnprintf(buf + i, sz - i, " | %u", tsk->snd_win);
3958 i += scnprintf(buf + i, sz - i, " %u", tsk->rcv_win);
3959 i += scnprintf(buf + i, sz - i, " %u", tsk->max_pkt);
3960 i += scnprintf(buf + i, sz - i, " %x", tsk->peer_caps);
3961 i += scnprintf(buf + i, sz - i, " %u", tsk->cong_link_cnt);
3962 i += scnprintf(buf + i, sz - i, " %u", tsk->snt_unacked);
3963 i += scnprintf(buf + i, sz - i, " %u", tsk->rcv_unacked);
3964 i += scnprintf(buf + i, sz - i, " %u", atomic_read(&tsk->dupl_rcvcnt));
3965 i += scnprintf(buf + i, sz - i, " %u", sk->sk_shutdown);
3966 i += scnprintf(buf + i, sz - i, " | %d", sk_wmem_alloc_get(sk));
3967 i += scnprintf(buf + i, sz - i, " %d", sk->sk_sndbuf);
3968 i += scnprintf(buf + i, sz - i, " | %d", sk_rmem_alloc_get(sk));
3969 i += scnprintf(buf + i, sz - i, " %d", sk->sk_rcvbuf);
3970 i += scnprintf(buf + i, sz - i, " | %d\n", READ_ONCE(sk->sk_backlog.len));
3971
3972 if (dqueues & TIPC_DUMP_SK_SNDQ) {
3973 i += scnprintf(buf + i, sz - i, "sk_write_queue: ");
3974 i += tipc_list_dump(&sk->sk_write_queue, false, buf + i);
3975 }
3976
3977 if (dqueues & TIPC_DUMP_SK_RCVQ) {
3978 i += scnprintf(buf + i, sz - i, "sk_receive_queue: ");
3979 i += tipc_list_dump(&sk->sk_receive_queue, false, buf + i);
3980 }
3981
3982 if (dqueues & TIPC_DUMP_SK_BKLGQ) {
3983 i += scnprintf(buf + i, sz - i, "sk_backlog:\n head ");
3984 i += tipc_skb_dump(sk->sk_backlog.head, false, buf + i);
3985 if (sk->sk_backlog.tail != sk->sk_backlog.head) {
3986 i += scnprintf(buf + i, sz - i, " tail ");
3987 i += tipc_skb_dump(sk->sk_backlog.tail, false,
3988 buf + i);
3989 }
3990 }
3991
3992 return i;
3993}
3994