Lines Matching +full:imp +full:- +full:res +full:- +full:offset +full:- +full:value
4 * Copyright (c) 2001-2007, 2012-2019, Ericsson AB
5 * Copyright (c) 2004-2008, 2010-2013, Wind River Systems
6 * Copyright (c) 2020-2021, Red Hat Inc
75 * struct tipc_sock - TIPC socket structure
76 * @sk: socket - interacts with 'port' and with user via the socket API
100 * @nagle_start: current nagle value
172 return msg_prevnode(&tsk->phdr); in tsk_own_node()
177 return msg_destnode(&tsk->phdr); in tsk_peer_node()
182 return msg_destport(&tsk->phdr); in tsk_peer_port()
187 return msg_src_droppable(&tsk->phdr) != 0; in tsk_unreliable()
192 msg_set_src_droppable(&tsk->phdr, unreliable ? 1 : 0); in tsk_set_unreliable()
197 return msg_dest_droppable(&tsk->phdr) != 0; in tsk_unreturnable()
202 msg_set_dest_droppable(&tsk->phdr, unreturnable ? 1 : 0); in tsk_set_unreturnable()
207 return msg_importance(&tsk->phdr); in tsk_importance()
215 int tsk_set_importance(struct sock *sk, int imp) in tsk_set_importance() argument
217 if (imp > TIPC_CRITICAL_IMPORTANCE) in tsk_set_importance()
218 return -EINVAL; in tsk_set_importance()
219 msg_set_importance(&tipc_sk(sk)->phdr, (u32)imp); in tsk_set_importance()
225 return tsk->snt_unacked > tsk->snd_win; in tsk_conn_cong()
243 * - If block based flow control is not supported by peer we
248 if (likely(tsk->peer_caps & TIPC_BLOCK_FLOWCTL)) in tsk_inc()
253 /* tsk_set_nagle - enable/disable nagle property by manipulating maxnagle
257 struct sock *sk = &tsk->sk; in tsk_set_nagle()
259 tsk->maxnagle = 0; in tsk_set_nagle()
260 if (sk->sk_type != SOCK_STREAM) in tsk_set_nagle()
262 if (tsk->nodelay) in tsk_set_nagle()
264 if (!(tsk->peer_caps & TIPC_NAGLE)) in tsk_set_nagle()
267 if (tsk->max_pkt == MAX_MSG_SIZE) in tsk_set_nagle()
268 tsk->maxnagle = 1500; in tsk_set_nagle()
270 tsk->maxnagle = tsk->max_pkt; in tsk_set_nagle()
274 * tsk_advance_rx_queue - discard first buffer in socket receive queue
282 kfree_skb(__skb_dequeue(&sk->sk_receive_queue)); in tsk_advance_rx_queue()
303 * tsk_rej_rx_queue - reject all buffers in socket receive queue
313 while ((skb = __skb_dequeue(&sk->sk_receive_queue))) in tsk_rej_rx_queue()
319 return READ_ONCE(sk->sk_state) == TIPC_ESTABLISHED; in tipc_sk_connected()
322 /* tipc_sk_type_connectionless - check if the socket is datagram socket
329 return sk->sk_type == SOCK_RDM || sk->sk_type == SOCK_DGRAM; in tipc_sk_type_connectionless()
332 /* tsk_peer_msg - verify if message was sent by connected port's peer
339 struct sock *sk = &tsk->sk; in tsk_peer_msg()
365 /* tipc_set_sk_state - set the sk_state of the socket
374 int oldsk_state = sk->sk_state; in tipc_set_sk_state()
375 int res = -EINVAL; in tipc_set_sk_state() local
379 res = 0; in tipc_set_sk_state()
384 res = 0; in tipc_set_sk_state()
389 res = 0; in tipc_set_sk_state()
394 res = 0; in tipc_set_sk_state()
398 if (!res) in tipc_set_sk_state()
399 sk->sk_state = state; in tipc_set_sk_state()
401 return res; in tipc_set_sk_state()
406 struct sock *sk = sock->sk; in tipc_sk_sock_err()
408 int typ = sock->type; in tipc_sk_sock_err()
413 if (sk->sk_state == TIPC_DISCONNECTING) in tipc_sk_sock_err()
414 return -EPIPE; in tipc_sk_sock_err()
416 return -ENOTCONN; in tipc_sk_sock_err()
419 return -EAGAIN; in tipc_sk_sock_err()
435 sk_ = (sock_)->sk; \
450 * tipc_sk_create - create a TIPC socket
452 * @sock: pre-allocated socket structure
471 return -EPROTONOSUPPORT; in tipc_sk_create()
473 switch (sock->type) { in tipc_sk_create()
485 return -EPROTOTYPE; in tipc_sk_create()
491 return -ENOMEM; in tipc_sk_create()
494 tsk->max_pkt = MAX_PKT_DEFAULT; in tipc_sk_create()
495 tsk->maxnagle = 0; in tipc_sk_create()
496 tsk->nagle_start = NAGLE_START_INIT; in tipc_sk_create()
497 INIT_LIST_HEAD(&tsk->publications); in tipc_sk_create()
498 INIT_LIST_HEAD(&tsk->cong_links); in tipc_sk_create()
499 msg = &tsk->phdr; in tipc_sk_create()
502 sock->ops = ops; in tipc_sk_create()
508 return -EINVAL; in tipc_sk_create()
517 msg_set_origport(msg, tsk->portid); in tipc_sk_create()
518 timer_setup(&sk->sk_timer, tipc_sk_timeout, 0); in tipc_sk_create()
519 sk->sk_shutdown = 0; in tipc_sk_create()
520 sk->sk_backlog_rcv = tipc_sk_backlog_rcv; in tipc_sk_create()
521 sk->sk_rcvbuf = READ_ONCE(sysctl_tipc_rmem[1]); in tipc_sk_create()
522 sk->sk_data_ready = tipc_data_ready; in tipc_sk_create()
523 sk->sk_write_space = tipc_write_space; in tipc_sk_create()
524 sk->sk_destruct = tipc_sock_destruct; in tipc_sk_create()
525 tsk->conn_timeout = CONN_TIMEOUT_DEFAULT; in tipc_sk_create()
526 tsk->group_is_open = true; in tipc_sk_create()
527 atomic_set(&tsk->dupl_rcvcnt, 0); in tipc_sk_create()
530 tsk->snd_win = tsk_adv_blocks(RCVBUF_MIN); in tipc_sk_create()
531 tsk->rcv_win = tsk->snd_win; in tipc_sk_create()
535 if (sock->type == SOCK_DGRAM) in tipc_sk_create()
538 __skb_queue_head_init(&tsk->mc_method.deferredq); in tipc_sk_create()
547 sock_put(&tsk->sk); in tipc_sk_callback()
553 struct sock *sk = sock->sk; in __tipc_shutdown()
560 /* Avoid that hi-prio shutdown msgs bypass msgs in link wakeup queue */ in __tipc_shutdown()
561 tipc_wait_for_cond(sock, &timeout, (!tsk->cong_link_cnt && in __tipc_shutdown()
567 __skb_queue_purge(&sk->sk_write_queue); in __tipc_shutdown()
570 skb = skb_peek(&sk->sk_receive_queue); in __tipc_shutdown()
571 if (skb && TIPC_SKB_CB(skb)->bytes_read) { in __tipc_shutdown()
572 __skb_unlink(skb, &sk->sk_receive_queue); in __tipc_shutdown()
582 switch (sk->sk_state) { in __tipc_shutdown()
586 tipc_node_remove_conn(net, dnode, tsk->portid); in __tipc_shutdown()
587 /* Send a FIN+/- to its peer */ in __tipc_shutdown()
588 skb = __skb_dequeue(&sk->sk_receive_queue); in __tipc_shutdown()
590 __skb_queue_purge(&sk->sk_receive_queue); in __tipc_shutdown()
597 tsk->portid, error); in __tipc_shutdown()
599 tipc_node_xmit_skb(net, skb, dnode, tsk->portid); in __tipc_shutdown()
606 __skb_queue_purge(&sk->sk_receive_queue); in __tipc_shutdown()
612 * tipc_release - destroy a TIPC socket
619 * is partially-read, it is discarded and the next one is rejected instead.)
629 struct sock *sk = sock->sk; in tipc_release()
634 * releases a pre-allocated child socket that was never used) in tipc_release()
644 sk->sk_shutdown = SHUTDOWN_MASK; in tipc_release()
647 __skb_queue_purge(&tsk->mc_method.deferredq); in tipc_release()
648 sk_stop_timer(sk, &sk->sk_timer); in tipc_release()
654 tipc_dest_list_purge(&tsk->cong_links); in tipc_release()
655 tsk->cong_link_cnt = 0; in tipc_release()
656 call_rcu(&tsk->rcu, tipc_sk_callback); in tipc_release()
657 sock->sk = NULL; in tipc_release()
663 * __tipc_bind - associate or disassocate TIPC name(s) with a socket
668 * Name and name sequence binding are indicated using a positive scope value;
669 * a negative scope value unbinds the specified name. Specifying no name
675 * access any non-constant socket information.
680 struct tipc_sock *tsk = tipc_sk(sock->sk); in __tipc_bind()
686 if (ua->addrtype == TIPC_SERVICE_ADDR) { in __tipc_bind()
687 ua->addrtype = TIPC_SERVICE_RANGE; in __tipc_bind()
688 ua->sr.upper = ua->sr.lower; in __tipc_bind()
690 if (ua->scope < 0) { in __tipc_bind()
692 ua->scope = -ua->scope; in __tipc_bind()
695 if (ua->scope != TIPC_NODE_SCOPE) in __tipc_bind()
696 ua->scope = TIPC_CLUSTER_SCOPE; in __tipc_bind()
698 if (tsk->group) in __tipc_bind()
699 return -EACCES; in __tipc_bind()
708 int res; in tipc_sk_bind() local
710 lock_sock(sock->sk); in tipc_sk_bind()
711 res = __tipc_bind(sock, skaddr, alen); in tipc_sk_bind()
712 release_sock(sock->sk); in tipc_sk_bind()
713 return res; in tipc_sk_bind()
719 u32 atype = ua->addrtype; in tipc_bind()
723 return -EINVAL; in tipc_bind()
725 return -EAFNOSUPPORT; in tipc_bind()
726 if (ua->sr.type < TIPC_RESERVED_TYPES) { in tipc_bind()
728 ua->sr.type); in tipc_bind()
729 return -EACCES; in tipc_bind()
736 * tipc_getname - get port ID of socket or peer socket
751 struct sock *sk = sock->sk; in tipc_getname()
757 ((peer != 2) || (sk->sk_state != TIPC_DISCONNECTING))) in tipc_getname()
758 return -ENOTCONN; in tipc_getname()
759 addr->addr.id.ref = tsk_peer_port(tsk); in tipc_getname()
760 addr->addr.id.node = tsk_peer_node(tsk); in tipc_getname()
762 addr->addr.id.ref = tsk->portid; in tipc_getname()
763 addr->addr.id.node = tipc_own_addr(sock_net(sk)); in tipc_getname()
766 addr->addrtype = TIPC_SOCKET_ADDR; in tipc_getname()
767 addr->family = AF_TIPC; in tipc_getname()
768 addr->scope = 0; in tipc_getname()
769 addr->addr.name.domain = 0; in tipc_getname()
775 * tipc_poll - read and possibly block on pollmask
780 * Return: pollmask value
784 * since the pollmask info is potentially out-of-date the moment this routine
795 struct sock *sk = sock->sk; in tipc_poll()
802 if (sk->sk_shutdown & RCV_SHUTDOWN) in tipc_poll()
804 if (sk->sk_shutdown == SHUTDOWN_MASK) in tipc_poll()
807 switch (sk->sk_state) { in tipc_poll()
809 if (!tsk->cong_link_cnt && !tsk_conn_cong(tsk)) in tipc_poll()
814 if (!skb_queue_empty_lockless(&sk->sk_receive_queue)) in tipc_poll()
818 if (tsk->group_is_open && !tsk->cong_link_cnt) in tipc_poll()
822 if (skb_queue_empty_lockless(&sk->sk_receive_queue)) in tipc_poll()
834 * tipc_sendmcast - send multicast message
847 struct sock *sk = sock->sk; in tipc_sendmcast()
849 struct tipc_msg *hdr = &tsk->phdr; in tipc_sendmcast()
856 if (tsk->group) in tipc_sendmcast()
857 return -EACCES; in tipc_sendmcast()
860 rc = tipc_wait_for_cond(sock, &timeout, !tsk->cong_link_cnt); in tipc_sendmcast()
868 return -EHOSTUNREACH; in tipc_sendmcast()
876 msg_set_nametype(hdr, ua->sr.type); in tipc_sendmcast()
877 msg_set_namelower(hdr, ua->sr.lower); in tipc_sendmcast()
878 msg_set_nameupper(hdr, ua->sr.upper); in tipc_sendmcast()
888 rc = tipc_mcast_xmit(net, &pkts, &tsk->mc_method, &dsts, in tipc_sendmcast()
889 &tsk->cong_link_cnt); in tipc_sendmcast()
898 * tipc_send_group_msg - send a message to a member in the group
911 u16 bc_snd_nxt = tipc_group_bc_snd_nxt(tsk->group); in tipc_send_group_msg()
912 struct tipc_mc_method *method = &tsk->mc_method; in tipc_send_group_msg()
914 struct tipc_msg *hdr = &tsk->phdr; in tipc_send_group_msg()
927 mtu = tipc_node_get_mtu(net, dnode, tsk->portid, false); in tipc_send_group_msg()
933 rc = tipc_node_xmit(net, &pkts, dnode, tsk->portid); in tipc_send_group_msg()
934 if (unlikely(rc == -ELINKCONG)) { in tipc_send_group_msg()
935 tipc_dest_push(&tsk->cong_links, dnode, 0); in tipc_send_group_msg()
936 tsk->cong_link_cnt++; in tipc_send_group_msg()
943 method->rcast = true; in tipc_send_group_msg()
944 method->mandatory = true; in tipc_send_group_msg()
949 * tipc_send_group_unicast - send message to a member in the group
961 struct sock *sk = sock->sk; in tipc_send_group_unicast()
962 struct tipc_uaddr *ua = (struct tipc_uaddr *)m->msg_name; in tipc_send_group_unicast()
970 node = ua->sk.node; in tipc_send_group_unicast()
971 port = ua->sk.ref; in tipc_send_group_unicast()
973 return -EHOSTUNREACH; in tipc_send_group_unicast()
977 !tipc_dest_find(&tsk->cong_links, node, 0) && in tipc_send_group_unicast()
978 tsk->group && in tipc_send_group_unicast()
979 !tipc_group_cong(tsk->group, node, port, blks, in tipc_send_group_unicast()
985 return -EHOSTUNREACH; in tipc_send_group_unicast()
993 * tipc_send_group_anycast - send message to any member with given identity
1005 struct tipc_uaddr *ua = (struct tipc_uaddr *)m->msg_name; in tipc_send_group_anycast()
1006 struct sock *sk = sock->sk; in tipc_send_group_anycast()
1008 struct list_head *cong_links = &tsk->cong_links; in tipc_send_group_anycast()
1010 struct tipc_msg *hdr = &tsk->phdr; in tipc_send_group_anycast()
1021 ua->sa.type = msg_nametype(hdr); in tipc_send_group_anycast()
1022 ua->scope = msg_lookup_scope(hdr); in tipc_send_group_anycast()
1025 exclude = tipc_group_exclude(tsk->group); in tipc_send_group_anycast()
1029 /* Look for a non-congested destination member, if any */ in tipc_send_group_anycast()
1033 return -EHOSTUNREACH; in tipc_send_group_anycast()
1035 cong = tipc_group_cong(tsk->group, node, port, blks, in tipc_send_group_anycast()
1055 tsk->group && in tipc_send_group_anycast()
1056 !tipc_group_cong(tsk->group, node, port, in tipc_send_group_anycast()
1067 return -EHOSTUNREACH; in tipc_send_group_anycast()
1075 * tipc_send_group_bcast - send message to all members in communication group
1087 struct tipc_uaddr *ua = (struct tipc_uaddr *)m->msg_name; in tipc_send_group_bcast()
1088 struct sock *sk = sock->sk; in tipc_send_group_bcast()
1092 struct tipc_mc_method *method = &tsk->mc_method; in tipc_send_group_bcast()
1093 bool ack = method->mandatory && method->rcast; in tipc_send_group_bcast()
1095 struct tipc_msg *hdr = &tsk->phdr; in tipc_send_group_bcast()
1098 int rc = -EHOSTUNREACH; in tipc_send_group_bcast()
1102 !tsk->cong_link_cnt && tsk->group && in tipc_send_group_bcast()
1103 !tipc_group_bc_cong(tsk->group, blks)); in tipc_send_group_bcast()
1107 dsts = tipc_group_dests(tsk->group); in tipc_send_group_bcast()
1108 if (!dsts->local && !dsts->remote) in tipc_send_group_bcast()
1109 return -EHOSTUNREACH; in tipc_send_group_bcast()
1114 msg_set_nameinst(hdr, ua->sa.instance); in tipc_send_group_bcast()
1122 msg_set_grp_bc_seqno(hdr, tipc_group_bc_snd_nxt(tsk->group)); in tipc_send_group_bcast()
1134 rc = tipc_mcast_xmit(net, &pkts, method, dsts, &tsk->cong_link_cnt); in tipc_send_group_bcast()
1139 tipc_group_update_bc_members(tsk->group, blks, ack); in tipc_send_group_bcast()
1142 method->mandatory = false; in tipc_send_group_bcast()
1143 method->expires = jiffies; in tipc_send_group_bcast()
1149 * tipc_send_group_mcast - send message to all members with given identity
1161 struct tipc_uaddr *ua = (struct tipc_uaddr *)m->msg_name; in tipc_send_group_mcast()
1162 struct sock *sk = sock->sk; in tipc_send_group_mcast()
1164 struct tipc_group *grp = tsk->group; in tipc_send_group_mcast()
1165 struct tipc_msg *hdr = &tsk->phdr; in tipc_send_group_mcast()
1171 ua->sa.type = msg_nametype(hdr); in tipc_send_group_mcast()
1172 ua->scope = msg_lookup_scope(hdr); in tipc_send_group_mcast()
1176 return -EHOSTUNREACH; in tipc_send_group_mcast()
1179 tipc_dest_pop(&dsts, &ua->sk.node, &ua->sk.ref); in tipc_send_group_mcast()
1188 * tipc_sk_mcast_rcv - Deliver multicast messages to all destination sockets
1193 * Multi-threaded: parallel calls with reference to same queues may occur
1212 skb = tipc_skb_peek(arrvq, &inputq->lock); in tipc_sk_mcast_rcv()
1213 for (; skb; skb = tipc_skb_peek(arrvq, &inputq->lock)) { in tipc_sk_mcast_rcv()
1228 spin_lock_bh(&inputq->lock); in tipc_sk_mcast_rcv()
1234 spin_unlock_bh(&inputq->lock); in tipc_sk_mcast_rcv()
1259 spin_lock_bh(&inputq->lock); in tipc_sk_mcast_rcv()
1265 spin_unlock_bh(&inputq->lock); in tipc_sk_mcast_rcv()
1277 struct sk_buff_head *txq = &tsk->sk.sk_write_queue; in tipc_sk_push_backlog()
1279 struct net *net = sock_net(&tsk->sk); in tipc_sk_push_backlog()
1284 tsk->pkt_cnt += skb_queue_len(txq); in tipc_sk_push_backlog()
1285 if (!tsk->pkt_cnt || tsk->msg_acc / tsk->pkt_cnt < 2) { in tipc_sk_push_backlog()
1286 tsk->oneway = 0; in tipc_sk_push_backlog()
1287 if (tsk->nagle_start < NAGLE_START_MAX) in tipc_sk_push_backlog()
1288 tsk->nagle_start *= 2; in tipc_sk_push_backlog()
1289 tsk->expect_ack = false; in tipc_sk_push_backlog()
1290 pr_debug("tsk %10u: bad nagle %u -> %u, next start %u!\n", in tipc_sk_push_backlog()
1291 tsk->portid, tsk->msg_acc, tsk->pkt_cnt, in tipc_sk_push_backlog()
1292 tsk->nagle_start); in tipc_sk_push_backlog()
1294 tsk->nagle_start = NAGLE_START_INIT; in tipc_sk_push_backlog()
1297 tsk->expect_ack = true; in tipc_sk_push_backlog()
1299 tsk->expect_ack = false; in tipc_sk_push_backlog()
1302 tsk->msg_acc = 0; in tipc_sk_push_backlog()
1303 tsk->pkt_cnt = 0; in tipc_sk_push_backlog()
1306 if (!skb || tsk->cong_link_cnt) in tipc_sk_push_backlog()
1313 if (tsk->msg_acc) in tipc_sk_push_backlog()
1314 tsk->pkt_cnt += skb_queue_len(txq); in tipc_sk_push_backlog()
1315 tsk->snt_unacked += tsk->snd_backlog; in tipc_sk_push_backlog()
1316 tsk->snd_backlog = 0; in tipc_sk_push_backlog()
1317 rc = tipc_node_xmit(net, txq, dnode, tsk->portid); in tipc_sk_push_backlog()
1318 if (rc == -ELINKCONG) in tipc_sk_push_backlog()
1319 tsk->cong_link_cnt = 1; in tipc_sk_push_backlog()
1323 * tipc_sk_conn_proto_rcv - receive a connection mng protocol message
1335 struct sock *sk = &tsk->sk; in tipc_sk_conn_proto_rcv()
1349 sk->sk_state_change(sk); in tipc_sk_conn_proto_rcv()
1352 * - convert msg to abort msg and add to inqueue in tipc_sk_conn_proto_rcv()
1362 tsk->probe_unacked = false; in tipc_sk_conn_proto_rcv()
1372 tsk->snt_unacked -= msg_conn_ack(hdr); in tipc_sk_conn_proto_rcv()
1373 if (tsk->peer_caps & TIPC_BLOCK_FLOWCTL) in tipc_sk_conn_proto_rcv()
1374 tsk->snd_win = msg_adv_win(hdr); in tipc_sk_conn_proto_rcv()
1376 sk->sk_write_space(sk); in tipc_sk_conn_proto_rcv()
1385 * tipc_sendmsg - send message in connectionless manner
1400 struct sock *sk = sock->sk; in tipc_sendmsg()
1412 struct sock *sk = sock->sk; in __tipc_sendmsg()
1415 struct tipc_uaddr *ua = (struct tipc_uaddr *)m->msg_name; in __tipc_sendmsg()
1416 long timeout = sock_sndtimeo(sk, m->msg_flags & MSG_DONTWAIT); in __tipc_sendmsg()
1417 struct list_head *clinks = &tsk->cong_links; in __tipc_sendmsg()
1419 struct tipc_group *grp = tsk->group; in __tipc_sendmsg()
1420 struct tipc_msg *hdr = &tsk->phdr; in __tipc_sendmsg()
1426 return -EMSGSIZE; in __tipc_sendmsg()
1429 if (!tipc_uaddr_valid(ua, m->msg_namelen)) in __tipc_sendmsg()
1430 return -EINVAL; in __tipc_sendmsg()
1431 atype = ua->addrtype; in __tipc_sendmsg()
1444 return -EINVAL; in __tipc_sendmsg()
1448 ua = (struct tipc_uaddr *)&tsk->peer; in __tipc_sendmsg()
1449 if (!syn && ua->family != AF_TIPC) in __tipc_sendmsg()
1450 return -EDESTADDRREQ; in __tipc_sendmsg()
1451 atype = ua->addrtype; in __tipc_sendmsg()
1455 if (sk->sk_state == TIPC_LISTEN) in __tipc_sendmsg()
1456 return -EPIPE; in __tipc_sendmsg()
1457 if (sk->sk_state != TIPC_OPEN) in __tipc_sendmsg()
1458 return -EISCONN; in __tipc_sendmsg()
1459 if (tsk->published) in __tipc_sendmsg()
1460 return -EOPNOTSUPP; in __tipc_sendmsg()
1462 tsk->conn_addrtype = atype; in __tipc_sendmsg()
1472 skaddr.node = ua->lookup_node; in __tipc_sendmsg()
1473 ua->scope = tipc_node2scope(skaddr.node); in __tipc_sendmsg()
1475 return -EHOSTUNREACH; in __tipc_sendmsg()
1477 skaddr = ua->sk; in __tipc_sendmsg()
1479 return -EINVAL; in __tipc_sendmsg()
1494 msg_set_nametype(hdr, ua->sa.type); in __tipc_sendmsg()
1495 msg_set_nameinst(hdr, ua->sa.instance); in __tipc_sendmsg()
1496 msg_set_lookup_scope(hdr, ua->scope); in __tipc_sendmsg()
1505 mtu = tipc_node_get_mtu(net, skaddr.node, tsk->portid, true); in __tipc_sendmsg()
1509 if (unlikely(syn && !tipc_msg_skb_clone(&pkts, &sk->sk_write_queue))) { in __tipc_sendmsg()
1511 return -ENOMEM; in __tipc_sendmsg()
1516 rc = tipc_node_xmit(net, &pkts, skaddr.node, tsk->portid); in __tipc_sendmsg()
1517 if (unlikely(rc == -ELINKCONG)) { in __tipc_sendmsg()
1519 tsk->cong_link_cnt++; in __tipc_sendmsg()
1535 * tipc_sendstream - send stream-oriented data
1547 struct sock *sk = sock->sk; in tipc_sendstream()
1559 struct sock *sk = sock->sk; in __tipc_sendstream()
1560 DECLARE_SOCKADDR(struct sockaddr_tipc *, dest, m->msg_name); in __tipc_sendstream()
1561 long timeout = sock_sndtimeo(sk, m->msg_flags & MSG_DONTWAIT); in __tipc_sendstream()
1562 struct sk_buff_head *txq = &sk->sk_write_queue; in __tipc_sendstream()
1564 struct tipc_msg *hdr = &tsk->phdr; in __tipc_sendstream()
1568 int maxnagle = tsk->maxnagle; in __tipc_sendstream()
1569 int maxpkt = tsk->max_pkt; in __tipc_sendstream()
1574 return -EMSGSIZE; in __tipc_sendstream()
1577 if (unlikely(dest && sk->sk_state == TIPC_OPEN)) { in __tipc_sendstream()
1580 tsk->peer_caps = tipc_node_get_capabilities(net, dnode); in __tipc_sendstream()
1581 tsk->snt_unacked = tsk_inc(tsk, dlen + msg_hdr_sz(hdr)); in __tipc_sendstream()
1588 (!tsk->cong_link_cnt && in __tipc_sendstream()
1593 send = min_t(size_t, dlen - sent, TIPC_MAX_USER_MSG_SIZE); in __tipc_sendstream()
1594 blocks = tsk->snd_backlog; in __tipc_sendstream()
1595 if (tsk->oneway++ >= tsk->nagle_start && maxnagle && in __tipc_sendstream()
1601 tsk->msg_acc++; in __tipc_sendstream()
1602 if (blocks <= 64 && tsk->expect_ack) { in __tipc_sendstream()
1603 tsk->snd_backlog = blocks; in __tipc_sendstream()
1607 tsk->pkt_cnt += skb_queue_len(txq); in __tipc_sendstream()
1612 tsk->expect_ack = true; in __tipc_sendstream()
1614 tsk->expect_ack = false; in __tipc_sendstream()
1616 tsk->msg_acc = 0; in __tipc_sendstream()
1617 tsk->pkt_cnt = 0; in __tipc_sendstream()
1627 rc = tipc_node_xmit(net, txq, dnode, tsk->portid); in __tipc_sendstream()
1628 if (unlikely(rc == -ELINKCONG)) { in __tipc_sendstream()
1629 tsk->cong_link_cnt = 1; in __tipc_sendstream()
1633 tsk->snt_unacked += blocks; in __tipc_sendstream()
1634 tsk->snd_backlog = 0; in __tipc_sendstream()
1643 * tipc_send_packet - send a connection-oriented message
1655 return -EMSGSIZE; in tipc_send_packet()
1660 /* tipc_sk_finish_conn - complete the setup of a connection
1665 struct sock *sk = &tsk->sk; in tipc_sk_finish_conn()
1667 struct tipc_msg *msg = &tsk->phdr; in tipc_sk_finish_conn()
1676 sk_reset_timer(sk, &sk->sk_timer, jiffies + CONN_PROBING_INTV); in tipc_sk_finish_conn()
1678 tipc_node_add_conn(net, peer_node, tsk->portid, peer_port); in tipc_sk_finish_conn()
1679 tsk->max_pkt = tipc_node_get_mtu(net, peer_node, tsk->portid, true); in tipc_sk_finish_conn()
1680 tsk->peer_caps = tipc_node_get_capabilities(net, peer_node); in tipc_sk_finish_conn()
1682 __skb_queue_purge(&sk->sk_write_queue); in tipc_sk_finish_conn()
1683 if (tsk->peer_caps & TIPC_BLOCK_FLOWCTL) in tipc_sk_finish_conn()
1687 tsk->rcv_win = FLOWCTL_MSG_WIN; in tipc_sk_finish_conn()
1688 tsk->snd_win = FLOWCTL_MSG_WIN; in tipc_sk_finish_conn()
1692 * tipc_sk_set_orig_addr - capture sender's address for received message
1700 DECLARE_SOCKADDR(struct sockaddr_pair *, srcaddr, m->msg_name); in tipc_sk_set_orig_addr()
1706 srcaddr->sock.family = AF_TIPC; in tipc_sk_set_orig_addr()
1707 srcaddr->sock.addrtype = TIPC_SOCKET_ADDR; in tipc_sk_set_orig_addr()
1708 srcaddr->sock.scope = 0; in tipc_sk_set_orig_addr()
1709 srcaddr->sock.addr.id.ref = msg_origport(hdr); in tipc_sk_set_orig_addr()
1710 srcaddr->sock.addr.id.node = msg_orignode(hdr); in tipc_sk_set_orig_addr()
1711 srcaddr->sock.addr.name.domain = 0; in tipc_sk_set_orig_addr()
1712 m->msg_namelen = sizeof(struct sockaddr_tipc); in tipc_sk_set_orig_addr()
1718 srcaddr->member.family = AF_TIPC; in tipc_sk_set_orig_addr()
1719 srcaddr->member.addrtype = TIPC_SERVICE_ADDR; in tipc_sk_set_orig_addr()
1720 srcaddr->member.scope = 0; in tipc_sk_set_orig_addr()
1721 srcaddr->member.addr.name.name.type = msg_nametype(hdr); in tipc_sk_set_orig_addr()
1722 srcaddr->member.addr.name.name.instance = TIPC_SKB_CB(skb)->orig_member; in tipc_sk_set_orig_addr()
1723 srcaddr->member.addr.name.domain = 0; in tipc_sk_set_orig_addr()
1724 m->msg_namelen = sizeof(*srcaddr); in tipc_sk_set_orig_addr()
1728 * tipc_sk_anc_data_recv - optionally capture ancillary data for received message
1745 if (likely(m->msg_controllen == 0)) in tipc_sk_anc_data_recv()
1754 return -ENOMEM; in tipc_sk_anc_data_recv()
1781 has_addr = !!tsk->conn_addrtype; in tipc_sk_anc_data_recv()
1782 data[0] = msg_nametype(&tsk->phdr); in tipc_sk_anc_data_recv()
1783 data[1] = msg_nameinst(&tsk->phdr); in tipc_sk_anc_data_recv()
1796 struct sock *sk = &tsk->sk; in tipc_sk_build_ack()
1806 tsk->portid, TIPC_OK); in tipc_sk_build_ack()
1810 msg_set_conn_ack(msg, tsk->rcv_unacked); in tipc_sk_build_ack()
1811 tsk->rcv_unacked = 0; in tipc_sk_build_ack()
1814 if (tsk->peer_caps & TIPC_BLOCK_FLOWCTL) { in tipc_sk_build_ack()
1815 tsk->rcv_win = tsk_adv_blocks(tsk->sk.sk_rcvbuf); in tipc_sk_build_ack()
1816 msg_set_adv_win(msg, tsk->rcv_win); in tipc_sk_build_ack()
1829 tipc_node_xmit_skb(sock_net(&tsk->sk), skb, tsk_peer_node(tsk), in tipc_sk_send_ack()
1835 struct sock *sk = sock->sk; in tipc_wait_for_rcvmsg()
1844 if (timeo && skb_queue_empty(&sk->sk_receive_queue)) { in tipc_wait_for_rcvmsg()
1845 if (sk->sk_shutdown & RCV_SHUTDOWN) { in tipc_wait_for_rcvmsg()
1846 err = -ENOTCONN; in tipc_wait_for_rcvmsg()
1857 if (!skb_queue_empty(&sk->sk_receive_queue)) in tipc_wait_for_rcvmsg()
1859 err = -EAGAIN; in tipc_wait_for_rcvmsg()
1875 * tipc_recvmsg - receive packet-oriented message
1889 struct sock *sk = sock->sk; in tipc_recvmsg()
1902 return -EINVAL; in tipc_recvmsg()
1905 if (unlikely(connected && sk->sk_state == TIPC_OPEN)) { in tipc_recvmsg()
1906 rc = -ENOTCONN; in tipc_recvmsg()
1916 skb = skb_peek(&sk->sk_receive_queue); in tipc_recvmsg()
1935 /* Capture data if non-error msg, otherwise just set return value */ in tipc_recvmsg()
1937 int offset = skb_cb->bytes_read; in tipc_recvmsg() local
1939 copy = min_t(int, dlen - offset, buflen); in tipc_recvmsg()
1940 rc = skb_copy_datagram_msg(skb, hlen + offset, m, copy); in tipc_recvmsg()
1943 if (unlikely(offset + copy < dlen)) { in tipc_recvmsg()
1946 skb_cb->bytes_read = offset + copy; in tipc_recvmsg()
1948 m->msg_flags |= MSG_TRUNC; in tipc_recvmsg()
1949 skb_cb->bytes_read = 0; in tipc_recvmsg()
1953 m->msg_flags |= MSG_EOR; in tipc_recvmsg()
1954 skb_cb->bytes_read = 0; in tipc_recvmsg()
1959 if (err != TIPC_CONN_SHUTDOWN && connected && !m->msg_control) { in tipc_recvmsg()
1960 rc = -ECONNRESET; in tipc_recvmsg()
1968 m->msg_flags |= MSG_EOR; in tipc_recvmsg()
1969 m->msg_flags |= MSG_OOB; in tipc_recvmsg()
1978 if (tsk->group && msg_in_group(hdr) && !grp_evt) { in tipc_recvmsg()
1980 tipc_group_update_rcv_win(tsk->group, tsk_blocks(hlen + dlen), in tipc_recvmsg()
1986 if (skb_cb->bytes_read) in tipc_recvmsg()
1995 tsk->rcv_unacked += tsk_inc(tsk, hlen + dlen); in tipc_recvmsg()
1996 if (tsk->rcv_unacked >= tsk->rcv_win / TIPC_ACK_RATE) in tipc_recvmsg()
2004 * tipc_recvstream - receive stream-oriented data
2018 struct sock *sk = sock->sk; in tipc_recvstream()
2024 int offset, required, copy, copied = 0; in tipc_recvstream() local
2030 return -EINVAL; in tipc_recvstream()
2034 if (unlikely(sk->sk_state == TIPC_OPEN)) { in tipc_recvstream()
2035 rc = -ENOTCONN; in tipc_recvstream()
2046 skb = skb_peek(&sk->sk_receive_queue); in tipc_recvstream()
2053 /* Discard any empty non-errored (SYN-) message */ in tipc_recvstream()
2070 offset = skb_cb->bytes_read; in tipc_recvstream()
2071 copy = min_t(int, dlen - offset, buflen - copied); in tipc_recvstream()
2072 rc = skb_copy_datagram_msg(skb, hlen + offset, m, copy); in tipc_recvstream()
2076 offset += copy; in tipc_recvstream()
2077 if (unlikely(offset < dlen)) { in tipc_recvstream()
2079 skb_cb->bytes_read = offset; in tipc_recvstream()
2084 if ((err != TIPC_CONN_SHUTDOWN) && !m->msg_control) in tipc_recvstream()
2085 rc = -ECONNRESET; in tipc_recvstream()
2096 tsk->rcv_unacked += tsk_inc(tsk, hlen + dlen); in tipc_recvstream()
2097 if (tsk->rcv_unacked >= tsk->rcv_win / TIPC_ACK_RATE) in tipc_recvstream()
2104 } while (!skb_queue_empty(&sk->sk_receive_queue) || copied < required); in tipc_recvstream()
2111 * tipc_write_space - wake up thread if port congestion is released
2119 wq = rcu_dereference(sk->sk_wq); in tipc_write_space()
2121 wake_up_interruptible_sync_poll(&wq->wait, EPOLLOUT | in tipc_write_space()
2127 * tipc_data_ready - wake up threads to indicate messages have been received
2137 wq = rcu_dereference(sk->sk_wq); in tipc_data_ready()
2139 wake_up_interruptible_sync_poll(&wq->wait, EPOLLIN | in tipc_data_ready()
2146 __skb_queue_purge(&sk->sk_receive_queue); in tipc_sock_destruct()
2156 struct tipc_group *grp = tsk->group; in tipc_sk_proto_rcv()
2164 tipc_dest_del(&tsk->cong_links, msg_orignode(hdr), 0); in tipc_sk_proto_rcv()
2167 tsk->cong_link_cnt--; in tipc_sk_proto_rcv()
2175 tipc_group_member_evt(tsk->group, &wakeup, &sk->sk_rcvbuf, in tipc_sk_proto_rcv()
2183 sk->sk_write_space(sk); in tipc_sk_proto_rcv()
2189 * tipc_sk_filter_connect - check incoming message for a connection-based socket
2198 struct sock *sk = &tsk->sk; in tipc_sk_filter_connect()
2211 tsk->oneway = 0; in tipc_sk_filter_connect()
2213 switch (sk->sk_state) { in tipc_sk_filter_connect()
2220 msg_set_importance(&tsk->phdr, msg_importance(hdr)); in tipc_sk_filter_connect()
2224 /* Empty ACK-, - wake up sleeping connect() and drop */ in tipc_sk_filter_connect()
2225 sk->sk_state_change(sk); in tipc_sk_filter_connect()
2238 if (skb_queue_empty(&sk->sk_write_queue)) in tipc_sk_filter_connect()
2241 delay %= (tsk->conn_timeout / 4); in tipc_sk_filter_connect()
2243 sk_reset_timer(sk, &sk->sk_timer, jiffies + delay); in tipc_sk_filter_connect()
2257 if (!skb_queue_empty(&sk->sk_write_queue)) in tipc_sk_filter_connect()
2259 /* Accept only connection-based messages sent by peer */ in tipc_sk_filter_connect()
2278 tipc_node_remove_conn(net, pnode, tsk->portid); in tipc_sk_filter_connect()
2279 sk->sk_state_change(sk); in tipc_sk_filter_connect()
2282 pr_err("Unknown sk_state %u\n", sk->sk_state); in tipc_sk_filter_connect()
2286 sk->sk_err = ECONNREFUSED; in tipc_sk_filter_connect()
2287 sk->sk_state_change(sk); in tipc_sk_filter_connect()
2292 * rcvbuf_limit - get proper overload limit of socket receive queue
2315 return READ_ONCE(sk->sk_rcvbuf); in rcvbuf_limit()
2318 return READ_ONCE(sk->sk_rcvbuf) << msg_importance(hdr); in rcvbuf_limit()
2320 if (likely(tsk->peer_caps & TIPC_BLOCK_FLOWCTL)) in rcvbuf_limit()
2321 return READ_ONCE(sk->sk_rcvbuf); in rcvbuf_limit()
2327 * tipc_sk_filter_rcv - validate incoming message
2342 struct tipc_group *grp = tsk->group; in tipc_sk_filter_rcv()
2350 TIPC_SKB_CB(skb)->bytes_read = 0; in tipc_sk_filter_rcv()
2361 tipc_mcast_filter_msg(net, &tsk->mc_method.deferredq, &inputq); in tipc_sk_filter_rcv()
2371 else if (sk_rmem_alloc_get(sk) + skb->truesize >= limit) { in tipc_sk_filter_rcv()
2374 atomic_inc(&sk->sk_drops); in tipc_sk_filter_rcv()
2387 __skb_queue_tail(&sk->sk_receive_queue, skb); in tipc_sk_filter_rcv()
2391 sk->sk_data_ready(sk); in tipc_sk_filter_rcv()
2396 * tipc_sk_backlog_rcv - handle incoming message from backlog queue
2411 added = sk_rmem_alloc_get(sk) - before; in tipc_sk_backlog_rcv()
2412 atomic_add(added, &tipc_sk(sk)->dupl_rcvcnt); in tipc_sk_backlog_rcv()
2420 * tipc_sk_enqueue - extract all buffers with destination 'dport' from
2452 /* Try backlog, compensating for double-counted bytes */ in tipc_sk_enqueue()
2453 dcnt = &tipc_sk(sk)->dupl_rcvcnt; in tipc_sk_enqueue()
2454 if (!sk->sk_backlog.len) in tipc_sk_enqueue()
2466 atomic_inc(&sk->sk_drops); in tipc_sk_enqueue()
2477 * tipc_sk_rcv - handle a chain of incoming buffers
2498 sk = &tsk->sk; in tipc_sk_rcv()
2499 if (likely(spin_trylock_bh(&sk->sk_lock.slock))) { in tipc_sk_rcv()
2501 spin_unlock_bh(&sk->sk_lock.slock); in tipc_sk_rcv()
2532 struct sock *sk = sock->sk; in tipc_wait_for_connect()
2540 return -ETIMEDOUT; in tipc_wait_for_connect()
2543 if (sk->sk_state == TIPC_DISCONNECTING) in tipc_wait_for_connect()
2556 if (addr->family != AF_TIPC) in tipc_sockaddr_is_sane()
2558 if (addr->addrtype == TIPC_SERVICE_RANGE) in tipc_sockaddr_is_sane()
2559 return (addr->addr.nameseq.lower <= addr->addr.nameseq.upper); in tipc_sockaddr_is_sane()
2560 return (addr->addrtype == TIPC_SERVICE_ADDR || in tipc_sockaddr_is_sane()
2561 addr->addrtype == TIPC_SOCKET_ADDR); in tipc_sockaddr_is_sane()
2565 * tipc_connect - establish a connection to another TIPC port
2569 * @flags: file-related flags associated with socket
2576 struct sock *sk = sock->sk; in tipc_connect()
2580 long timeout = (flags & O_NONBLOCK) ? 0 : tsk->conn_timeout; in tipc_connect()
2582 int res = 0; in tipc_connect() local
2585 return -EINVAL; in tipc_connect()
2589 if (tsk->group) { in tipc_connect()
2590 res = -EINVAL; in tipc_connect()
2594 if (dst->family == AF_UNSPEC) { in tipc_connect()
2595 memset(&tsk->peer, 0, sizeof(struct sockaddr_tipc)); in tipc_connect()
2597 res = -EINVAL; in tipc_connect()
2601 res = -EINVAL; in tipc_connect()
2606 memcpy(&tsk->peer, dest, destlen); in tipc_connect()
2608 } else if (dst->addrtype == TIPC_SERVICE_RANGE) { in tipc_connect()
2609 res = -EINVAL; in tipc_connect()
2613 previous = sk->sk_state; in tipc_connect()
2615 switch (sk->sk_state) { in tipc_connect()
2617 /* Send a 'SYN-' to destination */ in tipc_connect()
2622 /* If connect is in non-blocking case, set MSG_DONTWAIT to in tipc_connect()
2628 res = __tipc_sendmsg(sock, &m, 0); in tipc_connect()
2629 if ((res < 0) && (res != -EWOULDBLOCK)) in tipc_connect()
2633 * difference is that return value in non-blocking in tipc_connect()
2636 res = -EINPROGRESS; in tipc_connect()
2641 res = -EALREADY; in tipc_connect()
2646 res = tipc_wait_for_connect(sock, &timeout); in tipc_connect()
2649 res = -EISCONN; in tipc_connect()
2652 res = -EINVAL; in tipc_connect()
2657 return res; in tipc_connect()
2661 * tipc_listen - allow socket to listen for incoming connections
2669 struct sock *sk = sock->sk; in tipc_listen()
2670 int res; in tipc_listen() local
2673 res = tipc_set_sk_state(sk, TIPC_LISTEN); in tipc_listen()
2676 return res; in tipc_listen()
2681 struct sock *sk = sock->sk; in tipc_wait_for_accept()
2685 /* True wake-one mechanism for incoming connections: only in tipc_wait_for_accept()
2691 if (timeo && skb_queue_empty(&sk->sk_receive_queue)) { in tipc_wait_for_accept()
2699 if (!skb_queue_empty(&sk->sk_receive_queue)) in tipc_wait_for_accept()
2701 err = -EAGAIN; in tipc_wait_for_accept()
2712 * tipc_accept - wait for connection request
2715 * @flags: file-related flags associated with socket
2723 struct sock *new_sk, *sk = sock->sk; in tipc_accept()
2729 int res; in tipc_accept() local
2733 if (sk->sk_state != TIPC_LISTEN) { in tipc_accept()
2734 res = -EINVAL; in tipc_accept()
2738 res = tipc_wait_for_accept(sock, timeo); in tipc_accept()
2739 if (res) in tipc_accept()
2742 buf = skb_peek(&sk->sk_receive_queue); in tipc_accept()
2744 res = tipc_sk_create(sock_net(sock->sk), new_sock, 0, kern); in tipc_accept()
2745 if (res) in tipc_accept()
2747 security_sk_clone(sock->sk, new_sock->sk); in tipc_accept()
2749 new_sk = new_sock->sk; in tipc_accept()
2767 new_tsock->conn_addrtype = TIPC_SERVICE_ADDR; in tipc_accept()
2768 msg_set_nametype(&new_tsock->phdr, msg_nametype(msg)); in tipc_accept()
2769 msg_set_nameinst(&new_tsock->phdr, msg_nameinst(msg)); in tipc_accept()
2773 * Respond to 'SYN-' by discarding it & returning 'ACK'. in tipc_accept()
2779 __skb_dequeue(&sk->sk_receive_queue); in tipc_accept()
2780 __skb_queue_head(&new_sk->sk_receive_queue, buf); in tipc_accept()
2788 return res; in tipc_accept()
2792 * tipc_shutdown - shutdown socket connection
2802 struct sock *sk = sock->sk; in tipc_shutdown()
2803 int res; in tipc_shutdown() local
2806 return -EINVAL; in tipc_shutdown()
2812 sk->sk_shutdown = SHUTDOWN_MASK; in tipc_shutdown()
2814 if (sk->sk_state == TIPC_DISCONNECTING) { in tipc_shutdown()
2816 __skb_queue_purge(&sk->sk_receive_queue); in tipc_shutdown()
2818 res = 0; in tipc_shutdown()
2820 res = -ENOTCONN; in tipc_shutdown()
2823 sk->sk_state_change(sk); in tipc_shutdown()
2826 return res; in tipc_shutdown()
2836 u32 oport = tsk->portid; in tipc_sk_check_probing_state()
2839 if (tsk->probe_unacked) { in tipc_sk_check_probing_state()
2841 sk->sk_err = ECONNABORTED; in tipc_sk_check_probing_state()
2843 sk->sk_state_change(sk); in tipc_sk_check_probing_state()
2851 tsk->probe_unacked = true; in tipc_sk_check_probing_state()
2852 sk_reset_timer(sk, &sk->sk_timer, jiffies + CONN_PROBING_INTV); in tipc_sk_check_probing_state()
2860 if (tsk->cong_link_cnt) { in tipc_sk_retry_connect()
2861 sk_reset_timer(sk, &sk->sk_timer, in tipc_sk_retry_connect()
2866 tipc_msg_skb_clone(&sk->sk_write_queue, list); in tipc_sk_retry_connect()
2882 sk_reset_timer(sk, &sk->sk_timer, jiffies + HZ / 20); in tipc_sk_timeout()
2888 if (sk->sk_state == TIPC_ESTABLISHED) in tipc_sk_timeout()
2890 else if (sk->sk_state == TIPC_CONNECTING) in tipc_sk_timeout()
2896 rc = tipc_node_xmit(sock_net(sk), &list, pnode, tsk->portid); in tipc_sk_timeout()
2899 if (rc == -ELINKCONG) { in tipc_sk_timeout()
2900 tipc_dest_push(&tsk->cong_links, pnode, 0); in tipc_sk_timeout()
2901 tsk->cong_link_cnt = 1; in tipc_sk_timeout()
2908 struct sock *sk = &tsk->sk; in tipc_sk_publish()
2915 return -EINVAL; in tipc_sk_publish()
2916 key = tsk->portid + tsk->pub_count + 1; in tipc_sk_publish()
2917 if (key == tsk->portid) in tipc_sk_publish()
2918 return -EADDRINUSE; in tipc_sk_publish()
2919 skaddr.ref = tsk->portid; in tipc_sk_publish()
2923 return -EINVAL; in tipc_sk_publish()
2925 list_add(&p->binding_sock, &tsk->publications); in tipc_sk_publish()
2926 tsk->pub_count++; in tipc_sk_publish()
2927 tsk->published = true; in tipc_sk_publish()
2933 struct net *net = sock_net(&tsk->sk); in tipc_sk_withdraw()
2936 int rc = -EINVAL; in tipc_sk_withdraw()
2938 list_for_each_entry_safe(p, safe, &tsk->publications, binding_sock) { in tipc_sk_withdraw()
2940 tipc_uaddr(&_ua, TIPC_SERVICE_RANGE, p->scope, in tipc_sk_withdraw()
2941 p->sr.type, p->sr.lower, p->sr.upper); in tipc_sk_withdraw()
2942 tipc_nametbl_withdraw(net, &_ua, &p->sk, p->key); in tipc_sk_withdraw()
2946 if (p->scope != ua->scope) in tipc_sk_withdraw()
2948 if (p->sr.type != ua->sr.type) in tipc_sk_withdraw()
2950 if (p->sr.lower != ua->sr.lower) in tipc_sk_withdraw()
2952 if (p->sr.upper != ua->sr.upper) in tipc_sk_withdraw()
2954 tipc_nametbl_withdraw(net, ua, &p->sk, p->key); in tipc_sk_withdraw()
2958 if (list_empty(&tsk->publications)) { in tipc_sk_withdraw()
2959 tsk->published = 0; in tipc_sk_withdraw()
2965 /* tipc_sk_reinit: set non-zero address in all existing sockets
2975 rhashtable_walk_enter(&tn->sk_rht, &iter); in tipc_sk_reinit()
2981 sock_hold(&tsk->sk); in tipc_sk_reinit()
2983 lock_sock(&tsk->sk); in tipc_sk_reinit()
2984 msg = &tsk->phdr; in tipc_sk_reinit()
2987 release_sock(&tsk->sk); in tipc_sk_reinit()
2989 sock_put(&tsk->sk); in tipc_sk_reinit()
2993 } while (tsk == ERR_PTR(-EAGAIN)); in tipc_sk_reinit()
3004 tsk = rhashtable_lookup(&tn->sk_rht, &portid, tsk_rht_params); in tipc_sk_lookup()
3006 sock_hold(&tsk->sk); in tipc_sk_lookup()
3014 struct sock *sk = &tsk->sk; in tipc_sk_insert()
3017 u32 remaining = (TIPC_MAX_PORT - TIPC_MIN_PORT) + 1; in tipc_sk_insert()
3020 while (remaining--) { in tipc_sk_insert()
3024 tsk->portid = portid; in tipc_sk_insert()
3025 sock_hold(&tsk->sk); in tipc_sk_insert()
3026 if (!rhashtable_lookup_insert_fast(&tn->sk_rht, &tsk->node, in tipc_sk_insert()
3029 sock_put(&tsk->sk); in tipc_sk_insert()
3032 return -1; in tipc_sk_insert()
3037 struct sock *sk = &tsk->sk; in tipc_sk_remove()
3040 if (!rhashtable_remove_fast(&tn->sk_rht, &tsk->node, tsk_rht_params)) { in tipc_sk_remove()
3041 WARN_ON(refcount_read(&sk->sk_refcnt) == 1); in tipc_sk_remove()
3060 return rhashtable_init(&tn->sk_rht, &tsk_rht_params); in tipc_sk_rht_init()
3070 rhashtable_destroy(&tn->sk_rht); in tipc_sk_rht_destroy()
3075 struct net *net = sock_net(&tsk->sk); in tipc_sk_join()
3076 struct tipc_group *grp = tsk->group; in tipc_sk_join()
3077 struct tipc_msg *hdr = &tsk->phdr; in tipc_sk_join()
3081 if (mreq->type < TIPC_RESERVED_TYPES) in tipc_sk_join()
3082 return -EACCES; in tipc_sk_join()
3083 if (mreq->scope > TIPC_NODE_SCOPE) in tipc_sk_join()
3084 return -EINVAL; in tipc_sk_join()
3085 if (mreq->scope != TIPC_NODE_SCOPE) in tipc_sk_join()
3086 mreq->scope = TIPC_CLUSTER_SCOPE; in tipc_sk_join()
3088 return -EACCES; in tipc_sk_join()
3089 grp = tipc_group_create(net, tsk->portid, mreq, &tsk->group_is_open); in tipc_sk_join()
3091 return -ENOMEM; in tipc_sk_join()
3092 tsk->group = grp; in tipc_sk_join()
3093 msg_set_lookup_scope(hdr, mreq->scope); in tipc_sk_join()
3094 msg_set_nametype(hdr, mreq->type); in tipc_sk_join()
3096 tipc_uaddr(&ua, TIPC_SERVICE_RANGE, mreq->scope, in tipc_sk_join()
3097 mreq->type, mreq->instance, mreq->instance); in tipc_sk_join()
3102 tsk->group = NULL; in tipc_sk_join()
3106 tsk->mc_method.rcast = true; in tipc_sk_join()
3107 tsk->mc_method.mandatory = true; in tipc_sk_join()
3108 tipc_group_join(net, grp, &tsk->sk.sk_rcvbuf); in tipc_sk_join()
3114 struct net *net = sock_net(&tsk->sk); in tipc_sk_leave()
3115 struct tipc_group *grp = tsk->group; in tipc_sk_leave()
3120 return -EINVAL; in tipc_sk_leave()
3125 tsk->group = NULL; in tipc_sk_leave()
3131 * tipc_setsockopt - set socket option
3135 * @ov: pointer to new option value
3136 * @ol: length of option value
3146 struct sock *sk = sock->sk; in tipc_setsockopt()
3149 u32 value = 0; in tipc_setsockopt() local
3150 int res = 0; in tipc_setsockopt() local
3152 if ((lvl == IPPROTO_TCP) && (sock->type == SOCK_STREAM)) in tipc_setsockopt()
3155 return -ENOPROTOOPT; in tipc_setsockopt()
3163 if (ol < sizeof(value)) in tipc_setsockopt()
3164 return -EINVAL; in tipc_setsockopt()
3165 if (copy_from_sockptr(&value, ov, sizeof(u32))) in tipc_setsockopt()
3166 return -EFAULT; in tipc_setsockopt()
3170 return -EINVAL; in tipc_setsockopt()
3172 return -EFAULT; in tipc_setsockopt()
3176 return -EINVAL; in tipc_setsockopt()
3183 res = tsk_set_importance(sk, value); in tipc_setsockopt()
3186 if (sock->type != SOCK_STREAM) in tipc_setsockopt()
3187 tsk_set_unreliable(tsk, value); in tipc_setsockopt()
3189 res = -ENOPROTOOPT; in tipc_setsockopt()
3192 tsk_set_unreturnable(tsk, value); in tipc_setsockopt()
3195 tipc_sk(sk)->conn_timeout = value; in tipc_setsockopt()
3198 tsk->mc_method.rcast = false; in tipc_setsockopt()
3199 tsk->mc_method.mandatory = true; in tipc_setsockopt()
3202 tsk->mc_method.rcast = true; in tipc_setsockopt()
3203 tsk->mc_method.mandatory = true; in tipc_setsockopt()
3206 res = tipc_sk_join(tsk, &mreq); in tipc_setsockopt()
3209 res = tipc_sk_leave(tsk); in tipc_setsockopt()
3212 tsk->nodelay = !!value; in tipc_setsockopt()
3216 res = -EINVAL; in tipc_setsockopt()
3221 return res; in tipc_setsockopt()
3225 * tipc_getsockopt - get socket option
3229 * @ov: receptacle for option value
3230 * @ol: receptacle for length of option value
3240 struct sock *sk = sock->sk; in tipc_getsockopt()
3244 u32 value; in tipc_getsockopt() local
3245 int res; in tipc_getsockopt() local
3247 if ((lvl == IPPROTO_TCP) && (sock->type == SOCK_STREAM)) in tipc_getsockopt()
3250 return -ENOPROTOOPT; in tipc_getsockopt()
3251 res = get_user(len, ol); in tipc_getsockopt()
3252 if (res) in tipc_getsockopt()
3253 return res; in tipc_getsockopt()
3259 value = tsk_importance(tsk); in tipc_getsockopt()
3262 value = tsk_unreliable(tsk); in tipc_getsockopt()
3265 value = tsk_unreturnable(tsk); in tipc_getsockopt()
3268 value = tsk->conn_timeout; in tipc_getsockopt()
3269 /* no need to set "res", since already 0 at this point */ in tipc_getsockopt()
3272 value = 0; /* was tipc_queue_size, now obsolete */ in tipc_getsockopt()
3275 value = skb_queue_len(&sk->sk_receive_queue); in tipc_getsockopt()
3278 value = sk_rmem_alloc_get(sk); in tipc_getsockopt()
3282 if (tsk->group) in tipc_getsockopt()
3283 tipc_group_self(tsk->group, &seq, &scope); in tipc_getsockopt()
3284 value = seq.type; in tipc_getsockopt()
3287 res = -EINVAL; in tipc_getsockopt()
3292 if (res) in tipc_getsockopt()
3293 return res; /* "get" failed */ in tipc_getsockopt()
3295 if (len < sizeof(value)) in tipc_getsockopt()
3296 return -EINVAL; in tipc_getsockopt()
3298 if (copy_to_user(ov, &value, sizeof(value))) in tipc_getsockopt()
3299 return -EFAULT; in tipc_getsockopt()
3301 return put_user(sizeof(value), ol); in tipc_getsockopt()
3306 struct net *net = sock_net(sock->sk); in tipc_ioctl()
3314 return -EFAULT; in tipc_ioctl()
3319 return -EFAULT; in tipc_ioctl()
3322 return -EADDRNOTAVAIL; in tipc_ioctl()
3325 return -EFAULT; in tipc_ioctl()
3327 return -EADDRNOTAVAIL; in tipc_ioctl()
3329 return -EFAULT; in tipc_ioctl()
3332 return -ENOIOCTLCMD; in tipc_ioctl()
3338 struct tipc_sock *tsk2 = tipc_sk(sock2->sk); in tipc_socketpair()
3339 struct tipc_sock *tsk1 = tipc_sk(sock1->sk); in tipc_socketpair()
3340 u32 onode = tipc_own_addr(sock_net(sock1->sk)); in tipc_socketpair()
3342 tsk1->peer.family = AF_TIPC; in tipc_socketpair()
3343 tsk1->peer.addrtype = TIPC_SOCKET_ADDR; in tipc_socketpair()
3344 tsk1->peer.scope = TIPC_NODE_SCOPE; in tipc_socketpair()
3345 tsk1->peer.addr.id.ref = tsk2->portid; in tipc_socketpair()
3346 tsk1->peer.addr.id.node = onode; in tipc_socketpair()
3347 tsk2->peer.family = AF_TIPC; in tipc_socketpair()
3348 tsk2->peer.addrtype = TIPC_SOCKET_ADDR; in tipc_socketpair()
3349 tsk2->peer.scope = TIPC_NODE_SCOPE; in tipc_socketpair()
3350 tsk2->peer.addr.id.ref = tsk1->portid; in tipc_socketpair()
3351 tsk2->peer.addr.id.node = onode; in tipc_socketpair()
3353 tipc_sk_finish_conn(tsk1, tsk2->portid, onode); in tipc_socketpair()
3354 tipc_sk_finish_conn(tsk2, tsk1->portid, onode); in tipc_socketpair()
3434 * tipc_socket_init - initialize TIPC socket interface
3440 int res; in tipc_socket_init() local
3442 res = proto_register(&tipc_proto, 1); in tipc_socket_init()
3443 if (res) { in tipc_socket_init()
3448 res = sock_register(&tipc_family_ops); in tipc_socket_init()
3449 if (res) { in tipc_socket_init()
3455 return res; in tipc_socket_init()
3459 * tipc_socket_stop - stop TIPC socket interface
3476 conn_type = msg_nametype(&tsk->phdr); in __tipc_nl_add_sk_con()
3477 conn_instance = msg_nameinst(&tsk->phdr); in __tipc_nl_add_sk_con()
3480 return -EMSGSIZE; in __tipc_nl_add_sk_con()
3487 if (tsk->conn_addrtype != 0) { in __tipc_nl_add_sk_con()
3502 return -EMSGSIZE; in __tipc_nl_add_sk_con()
3508 struct net *net = sock_net(skb->sk); in __tipc_nl_add_sk_info()
3509 struct sock *sk = &tsk->sk; in __tipc_nl_add_sk_info()
3511 if (nla_put_u32(skb, TIPC_NLA_SOCK_REF, tsk->portid) || in __tipc_nl_add_sk_info()
3513 return -EMSGSIZE; in __tipc_nl_add_sk_info()
3517 return -EMSGSIZE; in __tipc_nl_add_sk_info()
3518 } else if (!list_empty(&tsk->publications)) { in __tipc_nl_add_sk_info()
3520 return -EMSGSIZE; in __tipc_nl_add_sk_info()
3532 hdr = genlmsg_put(skb, NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq, in __tipc_nl_add_sk()
3554 return -EMSGSIZE; in __tipc_nl_add_sk()
3562 struct rhashtable_iter *iter = (void *)cb->args[4]; in tipc_nl_sk_walk()
3570 if (err == -EAGAIN) { in tipc_nl_sk_walk()
3577 sock_hold(&tsk->sk); in tipc_nl_sk_walk()
3579 lock_sock(&tsk->sk); in tipc_nl_sk_walk()
3582 release_sock(&tsk->sk); in tipc_nl_sk_walk()
3583 sock_put(&tsk->sk); in tipc_nl_sk_walk()
3586 release_sock(&tsk->sk); in tipc_nl_sk_walk()
3588 sock_put(&tsk->sk); in tipc_nl_sk_walk()
3592 return skb->len; in tipc_nl_sk_walk()
3598 return __tipc_dump_start(cb, sock_net(cb->skb->sk)); in tipc_dump_start()
3604 /* tipc_nl_name_table_dump() uses cb->args[0...3]. */ in __tipc_dump_start()
3605 struct rhashtable_iter *iter = (void *)cb->args[4]; in __tipc_dump_start()
3611 return -ENOMEM; in __tipc_dump_start()
3613 cb->args[4] = (long)iter; in __tipc_dump_start()
3616 rhashtable_walk_enter(&tn->sk_rht, iter); in __tipc_dump_start()
3622 struct rhashtable_iter *hti = (void *)cb->args[4]; in tipc_dump_done()
3634 struct sock *sk = &tsk->sk; in tipc_sk_fill_sock_diag()
3639 if (!(sk_filter_state & (1 << sk->sk_state))) in tipc_sk_fill_sock_diag()
3649 if (nla_put_u32(skb, TIPC_NLA_SOCK_TYPE, (u32)sk->sk_type) || in tipc_sk_fill_sock_diag()
3650 nla_put_u32(skb, TIPC_NLA_SOCK_TIPC_STATE, (u32)sk->sk_state) || in tipc_sk_fill_sock_diag()
3653 from_kuid_munged(sk_user_ns(NETLINK_CB(cb->skb).sk), in tipc_sk_fill_sock_diag()
3665 skb_queue_len(&sk->sk_receive_queue)) || in tipc_sk_fill_sock_diag()
3667 skb_queue_len(&sk->sk_write_queue)) || in tipc_sk_fill_sock_diag()
3669 atomic_read(&sk->sk_drops))) in tipc_sk_fill_sock_diag()
3672 if (tsk->cong_link_cnt && in tipc_sk_fill_sock_diag()
3682 if (tsk->group) in tipc_sk_fill_sock_diag()
3683 if (tipc_group_fill_sock_diag(tsk->group, skb)) in tipc_sk_fill_sock_diag()
3695 return -EMSGSIZE; in tipc_sk_fill_sock_diag()
3712 hdr = genlmsg_put(skb, NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq, in __tipc_nl_add_sk_publ()
3721 if (nla_put_u32(skb, TIPC_NLA_PUBL_KEY, publ->key)) in __tipc_nl_add_sk_publ()
3723 if (nla_put_u32(skb, TIPC_NLA_PUBL_TYPE, publ->sr.type)) in __tipc_nl_add_sk_publ()
3725 if (nla_put_u32(skb, TIPC_NLA_PUBL_LOWER, publ->sr.lower)) in __tipc_nl_add_sk_publ()
3727 if (nla_put_u32(skb, TIPC_NLA_PUBL_UPPER, publ->sr.upper)) in __tipc_nl_add_sk_publ()
3740 return -EMSGSIZE; in __tipc_nl_add_sk_publ()
3752 list_for_each_entry(p, &tsk->publications, binding_sock) { in __tipc_nl_list_sk_publ()
3753 if (p->key == *last_publ) in __tipc_nl_list_sk_publ()
3756 if (list_entry_is_head(p, &tsk->publications, binding_sock)) { in __tipc_nl_list_sk_publ()
3763 cb->prev_seq = 1; in __tipc_nl_list_sk_publ()
3765 return -EPIPE; in __tipc_nl_list_sk_publ()
3768 p = list_first_entry(&tsk->publications, struct publication, in __tipc_nl_list_sk_publ()
3772 list_for_each_entry_from(p, &tsk->publications, binding_sock) { in __tipc_nl_list_sk_publ()
3775 *last_publ = p->key; in __tipc_nl_list_sk_publ()
3787 u32 tsk_portid = cb->args[0]; in tipc_nl_publ_dump()
3788 u32 last_publ = cb->args[1]; in tipc_nl_publ_dump()
3789 u32 done = cb->args[2]; in tipc_nl_publ_dump()
3790 struct net *net = sock_net(skb->sk); in tipc_nl_publ_dump()
3794 struct nlattr **attrs = genl_dumpit_info(cb)->info.attrs; in tipc_nl_publ_dump()
3798 return -EINVAL; in tipc_nl_publ_dump()
3807 return -EINVAL; in tipc_nl_publ_dump()
3817 return -EINVAL; in tipc_nl_publ_dump()
3819 lock_sock(&tsk->sk); in tipc_nl_publ_dump()
3823 release_sock(&tsk->sk); in tipc_nl_publ_dump()
3824 sock_put(&tsk->sk); in tipc_nl_publ_dump()
3826 cb->args[0] = tsk_portid; in tipc_nl_publ_dump()
3827 cb->args[1] = last_publ; in tipc_nl_publ_dump()
3828 cb->args[2] = done; in tipc_nl_publ_dump()
3830 return skb->len; in tipc_nl_publ_dump()
3834 * tipc_sk_filtering - check if a socket should be traced
3841 * (value 0 = 'any') or when there is no tuple set (all = 0),
3866 return (_port == tsk->portid); in tipc_sk_filtering()
3868 if (_sktype && _sktype != sk->sk_type) in tipc_sk_filtering()
3871 if (tsk->published) { in tipc_sk_filtering()
3872 p = list_first_entry_or_null(&tsk->publications, in tipc_sk_filtering()
3875 type = p->sr.type; in tipc_sk_filtering()
3876 lower = p->sr.lower; in tipc_sk_filtering()
3877 upper = p->sr.upper; in tipc_sk_filtering()
3882 type = msg_nametype(&tsk->phdr); in tipc_sk_filtering()
3883 lower = msg_nameinst(&tsk->phdr); in tipc_sk_filtering()
3896 return (sk) ? (tipc_sk(sk))->portid : 0; in tipc_sock_get_portid()
3900 * tipc_sk_overlimit1 - check if socket rx queue is about to be overloaded,
3910 atomic_t *dcnt = &tipc_sk(sk)->dupl_rcvcnt; in tipc_sk_overlimit1()
3912 unsigned int qsize = sk->sk_backlog.len + sk_rmem_alloc_get(sk); in tipc_sk_overlimit1()
3918 * tipc_sk_overlimit2 - check if socket rx queue is about to be overloaded,
3935 * tipc_sk_dump - dump TIPC socket
3938 * - TIPC_DUMP_NONE: don't dump socket queues
3939 * - TIPC_DUMP_SK_SNDQ: dump socket send queue
3940 * - TIPC_DUMP_SK_RCVQ: dump socket rcv queue
3941 * - TIPC_DUMP_SK_BKLGQ: dump socket backlog queue
3942 * - TIPC_DUMP_ALL: dump all the socket queues above
3962 i += scnprintf(buf, sz, "sk data: %u", sk->sk_type); in tipc_sk_dump()
3963 i += scnprintf(buf + i, sz - i, " %d", sk->sk_state); in tipc_sk_dump()
3964 i += scnprintf(buf + i, sz - i, " %x", tsk_own_node(tsk)); in tipc_sk_dump()
3965 i += scnprintf(buf + i, sz - i, " %u", tsk->portid); in tipc_sk_dump()
3966 i += scnprintf(buf + i, sz - i, " | %u", tsk_connected); in tipc_sk_dump()
3968 i += scnprintf(buf + i, sz - i, " %x", tsk_peer_node(tsk)); in tipc_sk_dump()
3969 i += scnprintf(buf + i, sz - i, " %u", tsk_peer_port(tsk)); in tipc_sk_dump()
3970 conn_type = msg_nametype(&tsk->phdr); in tipc_sk_dump()
3971 conn_instance = msg_nameinst(&tsk->phdr); in tipc_sk_dump()
3972 i += scnprintf(buf + i, sz - i, " %u", conn_type); in tipc_sk_dump()
3973 i += scnprintf(buf + i, sz - i, " %u", conn_instance); in tipc_sk_dump()
3975 i += scnprintf(buf + i, sz - i, " | %u", tsk->published); in tipc_sk_dump()
3976 if (tsk->published) { in tipc_sk_dump()
3977 p = list_first_entry_or_null(&tsk->publications, in tipc_sk_dump()
3979 i += scnprintf(buf + i, sz - i, " %u", (p) ? p->sr.type : 0); in tipc_sk_dump()
3980 i += scnprintf(buf + i, sz - i, " %u", (p) ? p->sr.lower : 0); in tipc_sk_dump()
3981 i += scnprintf(buf + i, sz - i, " %u", (p) ? p->sr.upper : 0); in tipc_sk_dump()
3983 i += scnprintf(buf + i, sz - i, " | %u", tsk->snd_win); in tipc_sk_dump()
3984 i += scnprintf(buf + i, sz - i, " %u", tsk->rcv_win); in tipc_sk_dump()
3985 i += scnprintf(buf + i, sz - i, " %u", tsk->max_pkt); in tipc_sk_dump()
3986 i += scnprintf(buf + i, sz - i, " %x", tsk->peer_caps); in tipc_sk_dump()
3987 i += scnprintf(buf + i, sz - i, " %u", tsk->cong_link_cnt); in tipc_sk_dump()
3988 i += scnprintf(buf + i, sz - i, " %u", tsk->snt_unacked); in tipc_sk_dump()
3989 i += scnprintf(buf + i, sz - i, " %u", tsk->rcv_unacked); in tipc_sk_dump()
3990 i += scnprintf(buf + i, sz - i, " %u", atomic_read(&tsk->dupl_rcvcnt)); in tipc_sk_dump()
3991 i += scnprintf(buf + i, sz - i, " %u", sk->sk_shutdown); in tipc_sk_dump()
3992 i += scnprintf(buf + i, sz - i, " | %d", sk_wmem_alloc_get(sk)); in tipc_sk_dump()
3993 i += scnprintf(buf + i, sz - i, " %d", sk->sk_sndbuf); in tipc_sk_dump()
3994 i += scnprintf(buf + i, sz - i, " | %d", sk_rmem_alloc_get(sk)); in tipc_sk_dump()
3995 i += scnprintf(buf + i, sz - i, " %d", sk->sk_rcvbuf); in tipc_sk_dump()
3996 i += scnprintf(buf + i, sz - i, " | %d\n", READ_ONCE(sk->sk_backlog.len)); in tipc_sk_dump()
3999 i += scnprintf(buf + i, sz - i, "sk_write_queue: "); in tipc_sk_dump()
4000 i += tipc_list_dump(&sk->sk_write_queue, false, buf + i); in tipc_sk_dump()
4004 i += scnprintf(buf + i, sz - i, "sk_receive_queue: "); in tipc_sk_dump()
4005 i += tipc_list_dump(&sk->sk_receive_queue, false, buf + i); in tipc_sk_dump()
4009 i += scnprintf(buf + i, sz - i, "sk_backlog:\n head "); in tipc_sk_dump()
4010 i += tipc_skb_dump(sk->sk_backlog.head, false, buf + i); in tipc_sk_dump()
4011 if (sk->sk_backlog.tail != sk->sk_backlog.head) { in tipc_sk_dump()
4012 i += scnprintf(buf + i, sz - i, " tail "); in tipc_sk_dump()
4013 i += tipc_skb_dump(sk->sk_backlog.tail, false, in tipc_sk_dump()