Lines Matching +full:imp +full:- +full:res +full:- +full:offset +full:- +full:value
4 * Copyright (c) 2001-2007, 2012-2017, Ericsson AB
5 * Copyright (c) 2004-2008, 2010-2013, Wind River Systems
73 * struct tipc_sock - TIPC socket structure
74 * @sk: socket - interacts with 'port' and with user via the socket API
77 * @published: non-zero if port has one or more associated names
160 return msg_prevnode(&tsk->phdr); in tsk_own_node()
165 return msg_destnode(&tsk->phdr); in tsk_peer_node()
170 return msg_destport(&tsk->phdr); in tsk_peer_port()
175 return msg_src_droppable(&tsk->phdr) != 0; in tsk_unreliable()
180 msg_set_src_droppable(&tsk->phdr, unreliable ? 1 : 0); in tsk_set_unreliable()
185 return msg_dest_droppable(&tsk->phdr) != 0; in tsk_unreturnable()
190 msg_set_dest_droppable(&tsk->phdr, unreturnable ? 1 : 0); in tsk_set_unreturnable()
195 return msg_importance(&tsk->phdr); in tsk_importance()
203 int tsk_set_importance(struct sock *sk, int imp) in tsk_set_importance() argument
205 if (imp > TIPC_CRITICAL_IMPORTANCE) in tsk_set_importance()
206 return -EINVAL; in tsk_set_importance()
207 msg_set_importance(&tipc_sk(sk)->phdr, (u32)imp); in tsk_set_importance()
213 return tsk->snt_unacked > tsk->snd_win; in tsk_conn_cong()
231 * - If block based flow control is not supported by peer we
236 if (likely(tsk->peer_caps & TIPC_BLOCK_FLOWCTL)) in tsk_inc()
241 /* tsk_set_nagle - enable/disable nagle property by manipulating maxnagle
245 struct sock *sk = &tsk->sk; in tsk_set_nagle()
247 tsk->maxnagle = 0; in tsk_set_nagle()
248 if (sk->sk_type != SOCK_STREAM) in tsk_set_nagle()
250 if (tsk->nodelay) in tsk_set_nagle()
252 if (!(tsk->peer_caps & TIPC_NAGLE)) in tsk_set_nagle()
255 if (tsk->max_pkt == MAX_MSG_SIZE) in tsk_set_nagle()
256 tsk->maxnagle = 1500; in tsk_set_nagle()
258 tsk->maxnagle = tsk->max_pkt; in tsk_set_nagle()
262 * tsk_advance_rx_queue - discard first buffer in socket receive queue
269 kfree_skb(__skb_dequeue(&sk->sk_receive_queue)); in tsk_advance_rx_queue()
290 * tsk_rej_rx_queue - reject all buffers in socket receive queue
298 while ((skb = __skb_dequeue(&sk->sk_receive_queue))) in tsk_rej_rx_queue()
304 return sk->sk_state == TIPC_ESTABLISHED; in tipc_sk_connected()
307 /* tipc_sk_type_connectionless - check if the socket is datagram socket
314 return sk->sk_type == SOCK_RDM || sk->sk_type == SOCK_DGRAM; in tipc_sk_type_connectionless()
317 /* tsk_peer_msg - verify if message was sent by connected port's peer
324 struct sock *sk = &tsk->sk; in tsk_peer_msg()
350 /* tipc_set_sk_state - set the sk_state of the socket
359 int oldsk_state = sk->sk_state; in tipc_set_sk_state()
360 int res = -EINVAL; in tipc_set_sk_state() local
364 res = 0; in tipc_set_sk_state()
369 res = 0; in tipc_set_sk_state()
374 res = 0; in tipc_set_sk_state()
379 res = 0; in tipc_set_sk_state()
383 if (!res) in tipc_set_sk_state()
384 sk->sk_state = state; in tipc_set_sk_state()
386 return res; in tipc_set_sk_state()
391 struct sock *sk = sock->sk; in tipc_sk_sock_err()
393 int typ = sock->type; in tipc_sk_sock_err()
398 if (sk->sk_state == TIPC_DISCONNECTING) in tipc_sk_sock_err()
399 return -EPIPE; in tipc_sk_sock_err()
401 return -ENOTCONN; in tipc_sk_sock_err()
404 return -EAGAIN; in tipc_sk_sock_err()
420 sk_ = (sock_)->sk; \
435 * tipc_sk_create - create a TIPC socket
437 * @sock: pre-allocated socket structure
456 return -EPROTONOSUPPORT; in tipc_sk_create()
458 switch (sock->type) { in tipc_sk_create()
470 return -EPROTOTYPE; in tipc_sk_create()
476 return -ENOMEM; in tipc_sk_create()
479 tsk->max_pkt = MAX_PKT_DEFAULT; in tipc_sk_create()
480 tsk->maxnagle = 0; in tipc_sk_create()
481 tsk->nagle_start = NAGLE_START_INIT; in tipc_sk_create()
482 INIT_LIST_HEAD(&tsk->publications); in tipc_sk_create()
483 INIT_LIST_HEAD(&tsk->cong_links); in tipc_sk_create()
484 msg = &tsk->phdr; in tipc_sk_create()
487 sock->ops = ops; in tipc_sk_create()
492 return -EINVAL; in tipc_sk_create()
501 msg_set_origport(msg, tsk->portid); in tipc_sk_create()
502 timer_setup(&sk->sk_timer, tipc_sk_timeout, 0); in tipc_sk_create()
503 sk->sk_shutdown = 0; in tipc_sk_create()
504 sk->sk_backlog_rcv = tipc_sk_backlog_rcv; in tipc_sk_create()
505 sk->sk_rcvbuf = sysctl_tipc_rmem[1]; in tipc_sk_create()
506 sk->sk_data_ready = tipc_data_ready; in tipc_sk_create()
507 sk->sk_write_space = tipc_write_space; in tipc_sk_create()
508 sk->sk_destruct = tipc_sock_destruct; in tipc_sk_create()
509 tsk->conn_timeout = CONN_TIMEOUT_DEFAULT; in tipc_sk_create()
510 tsk->group_is_open = true; in tipc_sk_create()
511 atomic_set(&tsk->dupl_rcvcnt, 0); in tipc_sk_create()
514 tsk->snd_win = tsk_adv_blocks(RCVBUF_MIN); in tipc_sk_create()
515 tsk->rcv_win = tsk->snd_win; in tipc_sk_create()
519 if (sock->type == SOCK_DGRAM) in tipc_sk_create()
522 __skb_queue_head_init(&tsk->mc_method.deferredq); in tipc_sk_create()
531 sock_put(&tsk->sk); in tipc_sk_callback()
537 struct sock *sk = sock->sk; in __tipc_shutdown()
544 /* Avoid that hi-prio shutdown msgs bypass msgs in link wakeup queue */ in __tipc_shutdown()
545 tipc_wait_for_cond(sock, &timeout, (!tsk->cong_link_cnt && in __tipc_shutdown()
551 __skb_queue_purge(&sk->sk_write_queue); in __tipc_shutdown()
554 skb = skb_peek(&sk->sk_receive_queue); in __tipc_shutdown()
555 if (skb && TIPC_SKB_CB(skb)->bytes_read) { in __tipc_shutdown()
556 __skb_unlink(skb, &sk->sk_receive_queue); in __tipc_shutdown()
566 switch (sk->sk_state) { in __tipc_shutdown()
570 tipc_node_remove_conn(net, dnode, tsk->portid); in __tipc_shutdown()
571 /* Send a FIN+/- to its peer */ in __tipc_shutdown()
572 skb = __skb_dequeue(&sk->sk_receive_queue); in __tipc_shutdown()
574 __skb_queue_purge(&sk->sk_receive_queue); in __tipc_shutdown()
581 tsk->portid, error); in __tipc_shutdown()
583 tipc_node_xmit_skb(net, skb, dnode, tsk->portid); in __tipc_shutdown()
590 __skb_queue_purge(&sk->sk_receive_queue); in __tipc_shutdown()
596 * tipc_release - destroy a TIPC socket
603 * is partially-read, it is discarded and the next one is rejected instead.)
613 struct sock *sk = sock->sk; in tipc_release()
618 * releases a pre-allocated child socket that was never used) in tipc_release()
628 sk->sk_shutdown = SHUTDOWN_MASK; in tipc_release()
631 __skb_queue_purge(&tsk->mc_method.deferredq); in tipc_release()
632 sk_stop_timer(sk, &sk->sk_timer); in tipc_release()
638 tipc_dest_list_purge(&tsk->cong_links); in tipc_release()
639 tsk->cong_link_cnt = 0; in tipc_release()
640 call_rcu(&tsk->rcu, tipc_sk_callback); in tipc_release()
641 sock->sk = NULL; in tipc_release()
647 * tipc_bind - associate or disassocate TIPC name(s) with a socket
652 * Name and name sequence binding is indicated using a positive scope value;
653 * a negative scope value unbinds the specified name. Specifying no name
659 * access any non-constant socket information.
664 struct sock *sk = sock->sk; in tipc_bind()
667 int res = -EINVAL; in tipc_bind() local
671 res = tipc_sk_withdraw(tsk, 0, NULL); in tipc_bind()
674 if (tsk->group) { in tipc_bind()
675 res = -EACCES; in tipc_bind()
679 res = -EINVAL; in tipc_bind()
682 if (addr->family != AF_TIPC) { in tipc_bind()
683 res = -EAFNOSUPPORT; in tipc_bind()
687 if (addr->addrtype == TIPC_ADDR_NAME) in tipc_bind()
688 addr->addr.nameseq.upper = addr->addr.nameseq.lower; in tipc_bind()
689 else if (addr->addrtype != TIPC_ADDR_NAMESEQ) { in tipc_bind()
690 res = -EAFNOSUPPORT; in tipc_bind()
694 if ((addr->addr.nameseq.type < TIPC_RESERVED_TYPES) && in tipc_bind()
695 (addr->addr.nameseq.type != TIPC_TOP_SRV) && in tipc_bind()
696 (addr->addr.nameseq.type != TIPC_CFG_SRV)) { in tipc_bind()
697 res = -EACCES; in tipc_bind()
701 res = (addr->scope >= 0) ? in tipc_bind()
702 tipc_sk_publish(tsk, addr->scope, &addr->addr.nameseq) : in tipc_bind()
703 tipc_sk_withdraw(tsk, -addr->scope, &addr->addr.nameseq); in tipc_bind()
706 return res; in tipc_bind()
710 * tipc_getname - get port ID of socket or peer socket
725 struct sock *sk = sock->sk; in tipc_getname()
731 ((peer != 2) || (sk->sk_state != TIPC_DISCONNECTING))) in tipc_getname()
732 return -ENOTCONN; in tipc_getname()
733 addr->addr.id.ref = tsk_peer_port(tsk); in tipc_getname()
734 addr->addr.id.node = tsk_peer_node(tsk); in tipc_getname()
736 addr->addr.id.ref = tsk->portid; in tipc_getname()
737 addr->addr.id.node = tipc_own_addr(sock_net(sk)); in tipc_getname()
740 addr->addrtype = TIPC_ADDR_ID; in tipc_getname()
741 addr->family = AF_TIPC; in tipc_getname()
742 addr->scope = 0; in tipc_getname()
743 addr->addr.name.domain = 0; in tipc_getname()
749 * tipc_poll - read and possibly block on pollmask
754 * Returns pollmask value
758 * since the pollmask info is potentially out-of-date the moment this routine
769 struct sock *sk = sock->sk; in tipc_poll()
776 if (sk->sk_shutdown & RCV_SHUTDOWN) in tipc_poll()
778 if (sk->sk_shutdown == SHUTDOWN_MASK) in tipc_poll()
781 switch (sk->sk_state) { in tipc_poll()
783 if (!tsk->cong_link_cnt && !tsk_conn_cong(tsk)) in tipc_poll()
788 if (!skb_queue_empty_lockless(&sk->sk_receive_queue)) in tipc_poll()
792 if (tsk->group_is_open && !tsk->cong_link_cnt) in tipc_poll()
796 if (skb_queue_empty_lockless(&sk->sk_receive_queue)) in tipc_poll()
808 * tipc_sendmcast - send multicast message
821 struct sock *sk = sock->sk; in tipc_sendmcast()
823 struct tipc_msg *hdr = &tsk->phdr; in tipc_sendmcast()
826 struct tipc_mc_method *method = &tsk->mc_method; in tipc_sendmcast()
831 if (tsk->group) in tipc_sendmcast()
832 return -EACCES; in tipc_sendmcast()
835 rc = tipc_wait_for_cond(sock, &timeout, !tsk->cong_link_cnt); in tipc_sendmcast()
841 tipc_nametbl_lookup_dst_nodes(net, seq->type, seq->lower, in tipc_sendmcast()
842 seq->upper, &dsts); in tipc_sendmcast()
844 return -EHOSTUNREACH; in tipc_sendmcast()
852 msg_set_nametype(hdr, seq->type); in tipc_sendmcast()
853 msg_set_namelower(hdr, seq->lower); in tipc_sendmcast()
854 msg_set_nameupper(hdr, seq->upper); in tipc_sendmcast()
865 &tsk->cong_link_cnt); in tipc_sendmcast()
874 * tipc_send_group_msg - send a message to a member in the group
886 u16 bc_snd_nxt = tipc_group_bc_snd_nxt(tsk->group); in tipc_send_group_msg()
887 struct tipc_mc_method *method = &tsk->mc_method; in tipc_send_group_msg()
889 struct tipc_msg *hdr = &tsk->phdr; in tipc_send_group_msg()
902 mtu = tipc_node_get_mtu(net, dnode, tsk->portid, false); in tipc_send_group_msg()
908 rc = tipc_node_xmit(net, &pkts, dnode, tsk->portid); in tipc_send_group_msg()
909 if (unlikely(rc == -ELINKCONG)) { in tipc_send_group_msg()
910 tipc_dest_push(&tsk->cong_links, dnode, 0); in tipc_send_group_msg()
911 tsk->cong_link_cnt++; in tipc_send_group_msg()
918 method->rcast = true; in tipc_send_group_msg()
919 method->mandatory = true; in tipc_send_group_msg()
924 * tipc_send_group_unicast - send message to a member in the group
936 struct sock *sk = sock->sk; in tipc_send_group_unicast()
937 DECLARE_SOCKADDR(struct sockaddr_tipc *, dest, m->msg_name); in tipc_send_group_unicast()
945 node = dest->addr.id.node; in tipc_send_group_unicast()
946 port = dest->addr.id.ref; in tipc_send_group_unicast()
948 return -EHOSTUNREACH; in tipc_send_group_unicast()
952 !tipc_dest_find(&tsk->cong_links, node, 0) && in tipc_send_group_unicast()
953 tsk->group && in tipc_send_group_unicast()
954 !tipc_group_cong(tsk->group, node, port, blks, in tipc_send_group_unicast()
960 return -EHOSTUNREACH; in tipc_send_group_unicast()
968 * tipc_send_group_anycast - send message to any member with given identity
980 DECLARE_SOCKADDR(struct sockaddr_tipc *, dest, m->msg_name); in tipc_send_group_anycast()
981 struct sock *sk = sock->sk; in tipc_send_group_anycast()
983 struct list_head *cong_links = &tsk->cong_links; in tipc_send_group_anycast()
985 struct tipc_msg *hdr = &tsk->phdr; in tipc_send_group_anycast()
999 inst = dest->addr.name.name.instance; in tipc_send_group_anycast()
1003 exclude = tipc_group_exclude(tsk->group); in tipc_send_group_anycast()
1007 /* Look for a non-congested destination member, if any */ in tipc_send_group_anycast()
1011 return -EHOSTUNREACH; in tipc_send_group_anycast()
1013 cong = tipc_group_cong(tsk->group, node, port, blks, in tipc_send_group_anycast()
1033 tsk->group && in tipc_send_group_anycast()
1034 !tipc_group_cong(tsk->group, node, port, in tipc_send_group_anycast()
1045 return -EHOSTUNREACH; in tipc_send_group_anycast()
1053 * tipc_send_group_bcast - send message to all members in communication group
1065 DECLARE_SOCKADDR(struct sockaddr_tipc *, dest, m->msg_name); in tipc_send_group_bcast()
1066 struct sock *sk = sock->sk; in tipc_send_group_bcast()
1070 struct tipc_mc_method *method = &tsk->mc_method; in tipc_send_group_bcast()
1071 bool ack = method->mandatory && method->rcast; in tipc_send_group_bcast()
1073 struct tipc_msg *hdr = &tsk->phdr; in tipc_send_group_bcast()
1076 int rc = -EHOSTUNREACH; in tipc_send_group_bcast()
1080 !tsk->cong_link_cnt && tsk->group && in tipc_send_group_bcast()
1081 !tipc_group_bc_cong(tsk->group, blks)); in tipc_send_group_bcast()
1085 dsts = tipc_group_dests(tsk->group); in tipc_send_group_bcast()
1086 if (!dsts->local && !dsts->remote) in tipc_send_group_bcast()
1087 return -EHOSTUNREACH; in tipc_send_group_bcast()
1092 msg_set_nameinst(hdr, dest->addr.name.name.instance); in tipc_send_group_bcast()
1100 msg_set_grp_bc_seqno(hdr, tipc_group_bc_snd_nxt(tsk->group)); in tipc_send_group_bcast()
1112 rc = tipc_mcast_xmit(net, &pkts, method, dsts, &tsk->cong_link_cnt); in tipc_send_group_bcast()
1117 tipc_group_update_bc_members(tsk->group, blks, ack); in tipc_send_group_bcast()
1120 method->mandatory = false; in tipc_send_group_bcast()
1121 method->expires = jiffies; in tipc_send_group_bcast()
1127 * tipc_send_group_mcast - send message to all members with given identity
1139 struct sock *sk = sock->sk; in tipc_send_group_mcast()
1140 DECLARE_SOCKADDR(struct sockaddr_tipc *, dest, m->msg_name); in tipc_send_group_mcast()
1142 struct tipc_group *grp = tsk->group; in tipc_send_group_mcast()
1143 struct tipc_msg *hdr = &tsk->phdr; in tipc_send_group_mcast()
1152 inst = dest->addr.name.name.instance; in tipc_send_group_mcast()
1158 return -EHOSTUNREACH; in tipc_send_group_mcast()
1161 tipc_dest_pop(&dsts, &dest->addr.id.node, &dest->addr.id.ref); in tipc_send_group_mcast()
1170 * tipc_sk_mcast_rcv - Deliver multicast messages to all destination sockets
1174 * Multi-threaded: parallel calls with reference to same queues may occur
1192 skb = tipc_skb_peek(arrvq, &inputq->lock); in tipc_sk_mcast_rcv()
1193 for (; skb; skb = tipc_skb_peek(arrvq, &inputq->lock)) { in tipc_sk_mcast_rcv()
1202 spin_lock_bh(&inputq->lock); in tipc_sk_mcast_rcv()
1208 spin_unlock_bh(&inputq->lock); in tipc_sk_mcast_rcv()
1244 spin_lock_bh(&inputq->lock); in tipc_sk_mcast_rcv()
1249 spin_unlock_bh(&inputq->lock); in tipc_sk_mcast_rcv()
1261 struct sk_buff_head *txq = &tsk->sk.sk_write_queue; in tipc_sk_push_backlog()
1263 struct net *net = sock_net(&tsk->sk); in tipc_sk_push_backlog()
1268 tsk->pkt_cnt += skb_queue_len(txq); in tipc_sk_push_backlog()
1269 if (!tsk->pkt_cnt || tsk->msg_acc / tsk->pkt_cnt < 2) { in tipc_sk_push_backlog()
1270 tsk->oneway = 0; in tipc_sk_push_backlog()
1271 if (tsk->nagle_start < NAGLE_START_MAX) in tipc_sk_push_backlog()
1272 tsk->nagle_start *= 2; in tipc_sk_push_backlog()
1273 tsk->expect_ack = false; in tipc_sk_push_backlog()
1274 pr_debug("tsk %10u: bad nagle %u -> %u, next start %u!\n", in tipc_sk_push_backlog()
1275 tsk->portid, tsk->msg_acc, tsk->pkt_cnt, in tipc_sk_push_backlog()
1276 tsk->nagle_start); in tipc_sk_push_backlog()
1278 tsk->nagle_start = NAGLE_START_INIT; in tipc_sk_push_backlog()
1281 tsk->expect_ack = true; in tipc_sk_push_backlog()
1283 tsk->expect_ack = false; in tipc_sk_push_backlog()
1286 tsk->msg_acc = 0; in tipc_sk_push_backlog()
1287 tsk->pkt_cnt = 0; in tipc_sk_push_backlog()
1290 if (!skb || tsk->cong_link_cnt) in tipc_sk_push_backlog()
1297 if (tsk->msg_acc) in tipc_sk_push_backlog()
1298 tsk->pkt_cnt += skb_queue_len(txq); in tipc_sk_push_backlog()
1299 tsk->snt_unacked += tsk->snd_backlog; in tipc_sk_push_backlog()
1300 tsk->snd_backlog = 0; in tipc_sk_push_backlog()
1301 rc = tipc_node_xmit(net, txq, dnode, tsk->portid); in tipc_sk_push_backlog()
1302 if (rc == -ELINKCONG) in tipc_sk_push_backlog()
1303 tsk->cong_link_cnt = 1; in tipc_sk_push_backlog()
1307 * tipc_sk_conn_proto_rcv - receive a connection mng protocol message
1317 struct sock *sk = &tsk->sk; in tipc_sk_conn_proto_rcv()
1331 sk->sk_state_change(sk); in tipc_sk_conn_proto_rcv()
1334 * - convert msg to abort msg and add to inqueue in tipc_sk_conn_proto_rcv()
1344 tsk->probe_unacked = false; in tipc_sk_conn_proto_rcv()
1354 tsk->snt_unacked -= msg_conn_ack(hdr); in tipc_sk_conn_proto_rcv()
1355 if (tsk->peer_caps & TIPC_BLOCK_FLOWCTL) in tipc_sk_conn_proto_rcv()
1356 tsk->snd_win = msg_adv_win(hdr); in tipc_sk_conn_proto_rcv()
1358 sk->sk_write_space(sk); in tipc_sk_conn_proto_rcv()
1367 * tipc_sendmsg - send message in connectionless manner
1382 struct sock *sk = sock->sk; in tipc_sendmsg()
1394 struct sock *sk = sock->sk; in __tipc_sendmsg()
1397 DECLARE_SOCKADDR(struct sockaddr_tipc *, dest, m->msg_name); in __tipc_sendmsg()
1398 long timeout = sock_sndtimeo(sk, m->msg_flags & MSG_DONTWAIT); in __tipc_sendmsg()
1399 struct list_head *clinks = &tsk->cong_links; in __tipc_sendmsg()
1401 struct tipc_group *grp = tsk->group; in __tipc_sendmsg()
1402 struct tipc_msg *hdr = &tsk->phdr; in __tipc_sendmsg()
1410 return -EMSGSIZE; in __tipc_sendmsg()
1413 if (unlikely(m->msg_namelen < sizeof(*dest))) in __tipc_sendmsg()
1414 return -EINVAL; in __tipc_sendmsg()
1415 if (unlikely(dest->family != AF_TIPC)) in __tipc_sendmsg()
1416 return -EINVAL; in __tipc_sendmsg()
1422 if (dest->addrtype == TIPC_ADDR_NAME) in __tipc_sendmsg()
1424 if (dest->addrtype == TIPC_ADDR_ID) in __tipc_sendmsg()
1426 if (dest->addrtype == TIPC_ADDR_MCAST) in __tipc_sendmsg()
1428 return -EINVAL; in __tipc_sendmsg()
1432 dest = &tsk->peer; in __tipc_sendmsg()
1433 if (!syn && dest->family != AF_TIPC) in __tipc_sendmsg()
1434 return -EDESTADDRREQ; in __tipc_sendmsg()
1438 if (sk->sk_state == TIPC_LISTEN) in __tipc_sendmsg()
1439 return -EPIPE; in __tipc_sendmsg()
1440 if (sk->sk_state != TIPC_OPEN) in __tipc_sendmsg()
1441 return -EISCONN; in __tipc_sendmsg()
1442 if (tsk->published) in __tipc_sendmsg()
1443 return -EOPNOTSUPP; in __tipc_sendmsg()
1444 if (dest->addrtype == TIPC_ADDR_NAME) { in __tipc_sendmsg()
1445 tsk->conn_type = dest->addr.name.name.type; in __tipc_sendmsg()
1446 tsk->conn_instance = dest->addr.name.name.instance; in __tipc_sendmsg()
1451 seq = &dest->addr.nameseq; in __tipc_sendmsg()
1452 if (dest->addrtype == TIPC_ADDR_MCAST) in __tipc_sendmsg()
1455 if (dest->addrtype == TIPC_ADDR_NAME) { in __tipc_sendmsg()
1456 type = dest->addr.name.name.type; in __tipc_sendmsg()
1457 inst = dest->addr.name.name.instance; in __tipc_sendmsg()
1458 dnode = dest->addr.name.domain; in __tipc_sendmsg()
1461 return -EHOSTUNREACH; in __tipc_sendmsg()
1462 } else if (dest->addrtype == TIPC_ADDR_ID) { in __tipc_sendmsg()
1463 dnode = dest->addr.id.node; in __tipc_sendmsg()
1465 return -EINVAL; in __tipc_sendmsg()
1474 if (dest->addrtype == TIPC_ADDR_NAME) { in __tipc_sendmsg()
1486 msg_set_destport(hdr, dest->addr.id.ref); in __tipc_sendmsg()
1491 mtu = tipc_node_get_mtu(net, dnode, tsk->portid, true); in __tipc_sendmsg()
1495 if (unlikely(syn && !tipc_msg_skb_clone(&pkts, &sk->sk_write_queue))) { in __tipc_sendmsg()
1497 return -ENOMEM; in __tipc_sendmsg()
1501 rc = tipc_node_xmit(net, &pkts, dnode, tsk->portid); in __tipc_sendmsg()
1502 if (unlikely(rc == -ELINKCONG)) { in __tipc_sendmsg()
1504 tsk->cong_link_cnt++; in __tipc_sendmsg()
1515 * tipc_sendstream - send stream-oriented data
1527 struct sock *sk = sock->sk; in tipc_sendstream()
1539 struct sock *sk = sock->sk; in __tipc_sendstream()
1540 DECLARE_SOCKADDR(struct sockaddr_tipc *, dest, m->msg_name); in __tipc_sendstream()
1541 long timeout = sock_sndtimeo(sk, m->msg_flags & MSG_DONTWAIT); in __tipc_sendstream()
1542 struct sk_buff_head *txq = &sk->sk_write_queue; in __tipc_sendstream()
1544 struct tipc_msg *hdr = &tsk->phdr; in __tipc_sendstream()
1548 int maxnagle = tsk->maxnagle; in __tipc_sendstream()
1549 int maxpkt = tsk->max_pkt; in __tipc_sendstream()
1554 return -EMSGSIZE; in __tipc_sendstream()
1560 tsk->peer_caps = tipc_node_get_capabilities(net, dnode); in __tipc_sendstream()
1561 tsk->snt_unacked = tsk_inc(tsk, dlen + msg_hdr_sz(hdr)); in __tipc_sendstream()
1568 (!tsk->cong_link_cnt && in __tipc_sendstream()
1573 send = min_t(size_t, dlen - sent, TIPC_MAX_USER_MSG_SIZE); in __tipc_sendstream()
1574 blocks = tsk->snd_backlog; in __tipc_sendstream()
1575 if (tsk->oneway++ >= tsk->nagle_start && maxnagle && in __tipc_sendstream()
1581 tsk->msg_acc++; in __tipc_sendstream()
1582 if (blocks <= 64 && tsk->expect_ack) { in __tipc_sendstream()
1583 tsk->snd_backlog = blocks; in __tipc_sendstream()
1587 tsk->pkt_cnt += skb_queue_len(txq); in __tipc_sendstream()
1592 tsk->expect_ack = true; in __tipc_sendstream()
1594 tsk->expect_ack = false; in __tipc_sendstream()
1596 tsk->msg_acc = 0; in __tipc_sendstream()
1597 tsk->pkt_cnt = 0; in __tipc_sendstream()
1607 rc = tipc_node_xmit(net, txq, dnode, tsk->portid); in __tipc_sendstream()
1608 if (unlikely(rc == -ELINKCONG)) { in __tipc_sendstream()
1609 tsk->cong_link_cnt = 1; in __tipc_sendstream()
1613 tsk->snt_unacked += blocks; in __tipc_sendstream()
1614 tsk->snd_backlog = 0; in __tipc_sendstream()
1623 * tipc_send_packet - send a connection-oriented message
1635 return -EMSGSIZE; in tipc_send_packet()
1640 /* tipc_sk_finish_conn - complete the setup of a connection
1645 struct sock *sk = &tsk->sk; in tipc_sk_finish_conn()
1647 struct tipc_msg *msg = &tsk->phdr; in tipc_sk_finish_conn()
1656 sk_reset_timer(sk, &sk->sk_timer, jiffies + CONN_PROBING_INTV); in tipc_sk_finish_conn()
1658 tipc_node_add_conn(net, peer_node, tsk->portid, peer_port); in tipc_sk_finish_conn()
1659 tsk->max_pkt = tipc_node_get_mtu(net, peer_node, tsk->portid, true); in tipc_sk_finish_conn()
1660 tsk->peer_caps = tipc_node_get_capabilities(net, peer_node); in tipc_sk_finish_conn()
1662 __skb_queue_purge(&sk->sk_write_queue); in tipc_sk_finish_conn()
1663 if (tsk->peer_caps & TIPC_BLOCK_FLOWCTL) in tipc_sk_finish_conn()
1667 tsk->rcv_win = FLOWCTL_MSG_WIN; in tipc_sk_finish_conn()
1668 tsk->snd_win = FLOWCTL_MSG_WIN; in tipc_sk_finish_conn()
1672 * tipc_sk_set_orig_addr - capture sender's address for received message
1680 DECLARE_SOCKADDR(struct sockaddr_pair *, srcaddr, m->msg_name); in tipc_sk_set_orig_addr()
1686 srcaddr->sock.family = AF_TIPC; in tipc_sk_set_orig_addr()
1687 srcaddr->sock.addrtype = TIPC_ADDR_ID; in tipc_sk_set_orig_addr()
1688 srcaddr->sock.scope = 0; in tipc_sk_set_orig_addr()
1689 srcaddr->sock.addr.id.ref = msg_origport(hdr); in tipc_sk_set_orig_addr()
1690 srcaddr->sock.addr.id.node = msg_orignode(hdr); in tipc_sk_set_orig_addr()
1691 srcaddr->sock.addr.name.domain = 0; in tipc_sk_set_orig_addr()
1692 m->msg_namelen = sizeof(struct sockaddr_tipc); in tipc_sk_set_orig_addr()
1698 srcaddr->member.family = AF_TIPC; in tipc_sk_set_orig_addr()
1699 srcaddr->member.addrtype = TIPC_ADDR_NAME; in tipc_sk_set_orig_addr()
1700 srcaddr->member.scope = 0; in tipc_sk_set_orig_addr()
1701 srcaddr->member.addr.name.name.type = msg_nametype(hdr); in tipc_sk_set_orig_addr()
1702 srcaddr->member.addr.name.name.instance = TIPC_SKB_CB(skb)->orig_member; in tipc_sk_set_orig_addr()
1703 srcaddr->member.addr.name.domain = 0; in tipc_sk_set_orig_addr()
1704 m->msg_namelen = sizeof(*srcaddr); in tipc_sk_set_orig_addr()
1708 * tipc_sk_anc_data_recv - optionally capture ancillary data for received message
1725 int res; in tipc_sk_anc_data_recv() local
1727 if (likely(m->msg_controllen == 0)) in tipc_sk_anc_data_recv()
1736 res = put_cmsg(m, SOL_TIPC, TIPC_ERRINFO, 8, anc_data); in tipc_sk_anc_data_recv()
1737 if (res) in tipc_sk_anc_data_recv()
1738 return res; in tipc_sk_anc_data_recv()
1741 return -ENOMEM; in tipc_sk_anc_data_recv()
1743 res = put_cmsg(m, SOL_TIPC, TIPC_RETDATA, anc_data[1], in tipc_sk_anc_data_recv()
1745 if (res) in tipc_sk_anc_data_recv()
1746 return res; in tipc_sk_anc_data_recv()
1766 has_name = (tsk->conn_type != 0); in tipc_sk_anc_data_recv()
1767 anc_data[0] = tsk->conn_type; in tipc_sk_anc_data_recv()
1768 anc_data[1] = tsk->conn_instance; in tipc_sk_anc_data_recv()
1769 anc_data[2] = tsk->conn_instance; in tipc_sk_anc_data_recv()
1775 res = put_cmsg(m, SOL_TIPC, TIPC_DESTNAME, 12, anc_data); in tipc_sk_anc_data_recv()
1776 if (res) in tipc_sk_anc_data_recv()
1777 return res; in tipc_sk_anc_data_recv()
1785 struct sock *sk = &tsk->sk; in tipc_sk_build_ack()
1795 tsk->portid, TIPC_OK); in tipc_sk_build_ack()
1799 msg_set_conn_ack(msg, tsk->rcv_unacked); in tipc_sk_build_ack()
1800 tsk->rcv_unacked = 0; in tipc_sk_build_ack()
1803 if (tsk->peer_caps & TIPC_BLOCK_FLOWCTL) { in tipc_sk_build_ack()
1804 tsk->rcv_win = tsk_adv_blocks(tsk->sk.sk_rcvbuf); in tipc_sk_build_ack()
1805 msg_set_adv_win(msg, tsk->rcv_win); in tipc_sk_build_ack()
1818 tipc_node_xmit_skb(sock_net(&tsk->sk), skb, tsk_peer_node(tsk), in tipc_sk_send_ack()
1824 struct sock *sk = sock->sk; in tipc_wait_for_rcvmsg()
1833 if (timeo && skb_queue_empty(&sk->sk_receive_queue)) { in tipc_wait_for_rcvmsg()
1834 if (sk->sk_shutdown & RCV_SHUTDOWN) { in tipc_wait_for_rcvmsg()
1835 err = -ENOTCONN; in tipc_wait_for_rcvmsg()
1846 if (!skb_queue_empty(&sk->sk_receive_queue)) in tipc_wait_for_rcvmsg()
1848 err = -EAGAIN; in tipc_wait_for_rcvmsg()
1864 * tipc_recvmsg - receive packet-oriented message
1877 struct sock *sk = sock->sk; in tipc_recvmsg()
1889 return -EINVAL; in tipc_recvmsg()
1892 if (unlikely(connected && sk->sk_state == TIPC_OPEN)) { in tipc_recvmsg()
1893 rc = -ENOTCONN; in tipc_recvmsg()
1903 skb = skb_peek(&sk->sk_receive_queue); in tipc_recvmsg()
1921 /* Capture data if non-error msg, otherwise just set return value */ in tipc_recvmsg()
1925 m->msg_flags |= MSG_TRUNC; in tipc_recvmsg()
1930 if (err != TIPC_CONN_SHUTDOWN && connected && !m->msg_control) in tipc_recvmsg()
1931 rc = -ECONNRESET; in tipc_recvmsg()
1939 m->msg_flags |= MSG_EOR; in tipc_recvmsg()
1940 m->msg_flags |= MSG_OOB; in tipc_recvmsg()
1949 if (tsk->group && msg_in_group(hdr) && !grp_evt) { in tipc_recvmsg()
1951 tipc_group_update_rcv_win(tsk->group, tsk_blocks(hlen + dlen), in tipc_recvmsg()
1963 tsk->rcv_unacked += tsk_inc(tsk, hlen + dlen); in tipc_recvmsg()
1964 if (tsk->rcv_unacked >= tsk->rcv_win / TIPC_ACK_RATE) in tipc_recvmsg()
1972 * tipc_recvstream - receive stream-oriented data
1985 struct sock *sk = sock->sk; in tipc_recvstream()
1991 int offset, required, copy, copied = 0; in tipc_recvstream() local
1997 return -EINVAL; in tipc_recvstream()
2001 if (unlikely(sk->sk_state == TIPC_OPEN)) { in tipc_recvstream()
2002 rc = -ENOTCONN; in tipc_recvstream()
2013 skb = skb_peek(&sk->sk_receive_queue); in tipc_recvstream()
2020 /* Discard any empty non-errored (SYN-) message */ in tipc_recvstream()
2037 offset = skb_cb->bytes_read; in tipc_recvstream()
2038 copy = min_t(int, dlen - offset, buflen - copied); in tipc_recvstream()
2039 rc = skb_copy_datagram_msg(skb, hlen + offset, m, copy); in tipc_recvstream()
2043 offset += copy; in tipc_recvstream()
2044 if (unlikely(offset < dlen)) { in tipc_recvstream()
2046 skb_cb->bytes_read = offset; in tipc_recvstream()
2051 if ((err != TIPC_CONN_SHUTDOWN) && !m->msg_control) in tipc_recvstream()
2052 rc = -ECONNRESET; in tipc_recvstream()
2063 tsk->rcv_unacked += tsk_inc(tsk, hlen + dlen); in tipc_recvstream()
2064 if (tsk->rcv_unacked >= tsk->rcv_win / TIPC_ACK_RATE) in tipc_recvstream()
2071 } while (!skb_queue_empty(&sk->sk_receive_queue) || copied < required); in tipc_recvstream()
2078 * tipc_write_space - wake up thread if port congestion is released
2086 wq = rcu_dereference(sk->sk_wq); in tipc_write_space()
2088 wake_up_interruptible_sync_poll(&wq->wait, EPOLLOUT | in tipc_write_space()
2094 * tipc_data_ready - wake up threads to indicate messages have been received
2102 wq = rcu_dereference(sk->sk_wq); in tipc_data_ready()
2104 wake_up_interruptible_sync_poll(&wq->wait, EPOLLIN | in tipc_data_ready()
2111 __skb_queue_purge(&sk->sk_receive_queue); in tipc_sock_destruct()
2121 struct tipc_group *grp = tsk->group; in tipc_sk_proto_rcv()
2129 tipc_dest_del(&tsk->cong_links, msg_orignode(hdr), 0); in tipc_sk_proto_rcv()
2132 tsk->cong_link_cnt--; in tipc_sk_proto_rcv()
2140 tipc_group_member_evt(tsk->group, &wakeup, &sk->sk_rcvbuf, in tipc_sk_proto_rcv()
2148 sk->sk_write_space(sk); in tipc_sk_proto_rcv()
2154 * tipc_sk_filter_connect - check incoming message for a connection-based socket
2163 struct sock *sk = &tsk->sk; in tipc_sk_filter_connect()
2176 tsk->oneway = 0; in tipc_sk_filter_connect()
2178 switch (sk->sk_state) { in tipc_sk_filter_connect()
2185 msg_set_importance(&tsk->phdr, msg_importance(hdr)); in tipc_sk_filter_connect()
2189 /* Empty ACK-, - wake up sleeping connect() and drop */ in tipc_sk_filter_connect()
2190 sk->sk_state_change(sk); in tipc_sk_filter_connect()
2203 if (skb_queue_empty(&sk->sk_write_queue)) in tipc_sk_filter_connect()
2206 delay %= (tsk->conn_timeout / 4); in tipc_sk_filter_connect()
2208 sk_reset_timer(sk, &sk->sk_timer, jiffies + delay); in tipc_sk_filter_connect()
2222 if (!skb_queue_empty(&sk->sk_write_queue)) in tipc_sk_filter_connect()
2224 /* Accept only connection-based messages sent by peer */ in tipc_sk_filter_connect()
2243 tipc_node_remove_conn(net, pnode, tsk->portid); in tipc_sk_filter_connect()
2244 sk->sk_state_change(sk); in tipc_sk_filter_connect()
2247 pr_err("Unknown sk_state %u\n", sk->sk_state); in tipc_sk_filter_connect()
2251 sk->sk_err = ECONNREFUSED; in tipc_sk_filter_connect()
2252 sk->sk_state_change(sk); in tipc_sk_filter_connect()
2257 * rcvbuf_limit - get proper overload limit of socket receive queue
2280 return READ_ONCE(sk->sk_rcvbuf); in rcvbuf_limit()
2283 return READ_ONCE(sk->sk_rcvbuf) << msg_importance(hdr); in rcvbuf_limit()
2285 if (likely(tsk->peer_caps & TIPC_BLOCK_FLOWCTL)) in rcvbuf_limit()
2286 return READ_ONCE(sk->sk_rcvbuf); in rcvbuf_limit()
2292 * tipc_sk_filter_rcv - validate incoming message
2307 struct tipc_group *grp = tsk->group; in tipc_sk_filter_rcv()
2315 TIPC_SKB_CB(skb)->bytes_read = 0; in tipc_sk_filter_rcv()
2326 tipc_mcast_filter_msg(net, &tsk->mc_method.deferredq, &inputq); in tipc_sk_filter_rcv()
2336 else if (sk_rmem_alloc_get(sk) + skb->truesize >= limit) { in tipc_sk_filter_rcv()
2339 atomic_inc(&sk->sk_drops); in tipc_sk_filter_rcv()
2352 __skb_queue_tail(&sk->sk_receive_queue, skb); in tipc_sk_filter_rcv()
2356 sk->sk_data_ready(sk); in tipc_sk_filter_rcv()
2361 * tipc_sk_backlog_rcv - handle incoming message from backlog queue
2376 added = sk_rmem_alloc_get(sk) - before; in tipc_sk_backlog_rcv()
2377 atomic_add(added, &tipc_sk(sk)->dupl_rcvcnt); in tipc_sk_backlog_rcv()
2385 * tipc_sk_enqueue - extract all buffers with destination 'dport' from
2416 /* Try backlog, compensating for double-counted bytes */ in tipc_sk_enqueue()
2417 dcnt = &tipc_sk(sk)->dupl_rcvcnt; in tipc_sk_enqueue()
2418 if (!sk->sk_backlog.len) in tipc_sk_enqueue()
2430 atomic_inc(&sk->sk_drops); in tipc_sk_enqueue()
2441 * tipc_sk_rcv - handle a chain of incoming buffers
2461 sk = &tsk->sk; in tipc_sk_rcv()
2462 if (likely(spin_trylock_bh(&sk->sk_lock.slock))) { in tipc_sk_rcv()
2464 spin_unlock_bh(&sk->sk_lock.slock); in tipc_sk_rcv()
2495 struct sock *sk = sock->sk; in tipc_wait_for_connect()
2503 return -ETIMEDOUT; in tipc_wait_for_connect()
2506 if (sk->sk_state == TIPC_DISCONNECTING) in tipc_wait_for_connect()
2519 if (addr->family != AF_TIPC) in tipc_sockaddr_is_sane()
2521 if (addr->addrtype == TIPC_SERVICE_RANGE) in tipc_sockaddr_is_sane()
2522 return (addr->addr.nameseq.lower <= addr->addr.nameseq.upper); in tipc_sockaddr_is_sane()
2523 return (addr->addrtype == TIPC_SERVICE_ADDR || in tipc_sockaddr_is_sane()
2524 addr->addrtype == TIPC_SOCKET_ADDR); in tipc_sockaddr_is_sane()
2528 * tipc_connect - establish a connection to another TIPC port
2532 * @flags: file-related flags associated with socket
2539 struct sock *sk = sock->sk; in tipc_connect()
2543 long timeout = (flags & O_NONBLOCK) ? 0 : tsk->conn_timeout; in tipc_connect()
2545 int res = 0; in tipc_connect() local
2548 return -EINVAL; in tipc_connect()
2552 if (tsk->group) { in tipc_connect()
2553 res = -EINVAL; in tipc_connect()
2557 if (dst->family == AF_UNSPEC) { in tipc_connect()
2558 memset(&tsk->peer, 0, sizeof(struct sockaddr_tipc)); in tipc_connect()
2560 res = -EINVAL; in tipc_connect()
2564 res = -EINVAL; in tipc_connect()
2569 memcpy(&tsk->peer, dest, destlen); in tipc_connect()
2571 } else if (dst->addrtype == TIPC_SERVICE_RANGE) { in tipc_connect()
2572 res = -EINVAL; in tipc_connect()
2576 previous = sk->sk_state; in tipc_connect()
2578 switch (sk->sk_state) { in tipc_connect()
2580 /* Send a 'SYN-' to destination */ in tipc_connect()
2584 /* If connect is in non-blocking case, set MSG_DONTWAIT to in tipc_connect()
2590 res = __tipc_sendmsg(sock, &m, 0); in tipc_connect()
2591 if ((res < 0) && (res != -EWOULDBLOCK)) in tipc_connect()
2595 * difference is that return value in non-blocking in tipc_connect()
2598 res = -EINPROGRESS; in tipc_connect()
2603 res = -EALREADY; in tipc_connect()
2608 res = tipc_wait_for_connect(sock, &timeout); in tipc_connect()
2611 res = -EISCONN; in tipc_connect()
2614 res = -EINVAL; in tipc_connect()
2619 return res; in tipc_connect()
2623 * tipc_listen - allow socket to listen for incoming connections
2631 struct sock *sk = sock->sk; in tipc_listen()
2632 int res; in tipc_listen() local
2635 res = tipc_set_sk_state(sk, TIPC_LISTEN); in tipc_listen()
2638 return res; in tipc_listen()
2643 struct sock *sk = sock->sk; in tipc_wait_for_accept()
2647 /* True wake-one mechanism for incoming connections: only in tipc_wait_for_accept()
2655 if (timeo && skb_queue_empty(&sk->sk_receive_queue)) { in tipc_wait_for_accept()
2661 if (!skb_queue_empty(&sk->sk_receive_queue)) in tipc_wait_for_accept()
2663 err = -EAGAIN; in tipc_wait_for_accept()
2675 * tipc_accept - wait for connection request
2678 * @flags: file-related flags associated with socket
2685 struct sock *new_sk, *sk = sock->sk; in tipc_accept()
2690 int res; in tipc_accept() local
2694 if (sk->sk_state != TIPC_LISTEN) { in tipc_accept()
2695 res = -EINVAL; in tipc_accept()
2699 res = tipc_wait_for_accept(sock, timeo); in tipc_accept()
2700 if (res) in tipc_accept()
2703 buf = skb_peek(&sk->sk_receive_queue); in tipc_accept()
2705 res = tipc_sk_create(sock_net(sock->sk), new_sock, 0, kern); in tipc_accept()
2706 if (res) in tipc_accept()
2708 security_sk_clone(sock->sk, new_sock->sk); in tipc_accept()
2710 new_sk = new_sock->sk; in tipc_accept()
2728 new_tsock->conn_type = msg_nametype(msg); in tipc_accept()
2729 new_tsock->conn_instance = msg_nameinst(msg); in tipc_accept()
2733 * Respond to 'SYN-' by discarding it & returning 'ACK'-. in tipc_accept()
2742 __skb_dequeue(&sk->sk_receive_queue); in tipc_accept()
2743 __skb_queue_head(&new_sk->sk_receive_queue, buf); in tipc_accept()
2749 return res; in tipc_accept()
2753 * tipc_shutdown - shutdown socket connection
2763 struct sock *sk = sock->sk; in tipc_shutdown()
2764 int res; in tipc_shutdown() local
2767 return -EINVAL; in tipc_shutdown()
2773 sk->sk_shutdown = SHUTDOWN_MASK; in tipc_shutdown()
2775 if (sk->sk_state == TIPC_DISCONNECTING) { in tipc_shutdown()
2777 __skb_queue_purge(&sk->sk_receive_queue); in tipc_shutdown()
2779 res = 0; in tipc_shutdown()
2781 res = -ENOTCONN; in tipc_shutdown()
2784 sk->sk_state_change(sk); in tipc_shutdown()
2787 return res; in tipc_shutdown()
2797 u32 oport = tsk->portid; in tipc_sk_check_probing_state()
2800 if (tsk->probe_unacked) { in tipc_sk_check_probing_state()
2802 sk->sk_err = ECONNABORTED; in tipc_sk_check_probing_state()
2804 sk->sk_state_change(sk); in tipc_sk_check_probing_state()
2812 tsk->probe_unacked = true; in tipc_sk_check_probing_state()
2813 sk_reset_timer(sk, &sk->sk_timer, jiffies + CONN_PROBING_INTV); in tipc_sk_check_probing_state()
2821 if (tsk->cong_link_cnt) { in tipc_sk_retry_connect()
2822 sk_reset_timer(sk, &sk->sk_timer, msecs_to_jiffies(100)); in tipc_sk_retry_connect()
2826 tipc_msg_skb_clone(&sk->sk_write_queue, list); in tipc_sk_retry_connect()
2842 sk_reset_timer(sk, &sk->sk_timer, jiffies + HZ / 20); in tipc_sk_timeout()
2848 if (sk->sk_state == TIPC_ESTABLISHED) in tipc_sk_timeout()
2850 else if (sk->sk_state == TIPC_CONNECTING) in tipc_sk_timeout()
2856 rc = tipc_node_xmit(sock_net(sk), &list, pnode, tsk->portid); in tipc_sk_timeout()
2859 if (rc == -ELINKCONG) { in tipc_sk_timeout()
2860 tipc_dest_push(&tsk->cong_links, pnode, 0); in tipc_sk_timeout()
2861 tsk->cong_link_cnt = 1; in tipc_sk_timeout()
2869 struct sock *sk = &tsk->sk; in tipc_sk_publish()
2878 return -EINVAL; in tipc_sk_publish()
2879 key = tsk->portid + tsk->pub_count + 1; in tipc_sk_publish()
2880 if (key == tsk->portid) in tipc_sk_publish()
2881 return -EADDRINUSE; in tipc_sk_publish()
2883 publ = tipc_nametbl_publish(net, seq->type, seq->lower, seq->upper, in tipc_sk_publish()
2884 scope, tsk->portid, key); in tipc_sk_publish()
2886 return -EINVAL; in tipc_sk_publish()
2888 list_add(&publ->binding_sock, &tsk->publications); in tipc_sk_publish()
2889 tsk->pub_count++; in tipc_sk_publish()
2890 tsk->published = 1; in tipc_sk_publish()
2897 struct net *net = sock_net(&tsk->sk); in tipc_sk_withdraw()
2900 int rc = -EINVAL; in tipc_sk_withdraw()
2905 list_for_each_entry_safe(publ, safe, &tsk->publications, binding_sock) { in tipc_sk_withdraw()
2907 if (publ->scope != scope) in tipc_sk_withdraw()
2909 if (publ->type != seq->type) in tipc_sk_withdraw()
2911 if (publ->lower != seq->lower) in tipc_sk_withdraw()
2913 if (publ->upper != seq->upper) in tipc_sk_withdraw()
2915 tipc_nametbl_withdraw(net, publ->type, publ->lower, in tipc_sk_withdraw()
2916 publ->upper, publ->key); in tipc_sk_withdraw()
2920 tipc_nametbl_withdraw(net, publ->type, publ->lower, in tipc_sk_withdraw()
2921 publ->upper, publ->key); in tipc_sk_withdraw()
2924 if (list_empty(&tsk->publications)) in tipc_sk_withdraw()
2925 tsk->published = 0; in tipc_sk_withdraw()
2929 /* tipc_sk_reinit: set non-zero address in all existing sockets
2939 rhashtable_walk_enter(&tn->sk_rht, &iter); in tipc_sk_reinit()
2945 sock_hold(&tsk->sk); in tipc_sk_reinit()
2947 lock_sock(&tsk->sk); in tipc_sk_reinit()
2948 msg = &tsk->phdr; in tipc_sk_reinit()
2951 release_sock(&tsk->sk); in tipc_sk_reinit()
2953 sock_put(&tsk->sk); in tipc_sk_reinit()
2957 } while (tsk == ERR_PTR(-EAGAIN)); in tipc_sk_reinit()
2968 tsk = rhashtable_lookup(&tn->sk_rht, &portid, tsk_rht_params); in tipc_sk_lookup()
2970 sock_hold(&tsk->sk); in tipc_sk_lookup()
2978 struct sock *sk = &tsk->sk; in tipc_sk_insert()
2981 u32 remaining = (TIPC_MAX_PORT - TIPC_MIN_PORT) + 1; in tipc_sk_insert()
2984 while (remaining--) { in tipc_sk_insert()
2988 tsk->portid = portid; in tipc_sk_insert()
2989 sock_hold(&tsk->sk); in tipc_sk_insert()
2990 if (!rhashtable_lookup_insert_fast(&tn->sk_rht, &tsk->node, in tipc_sk_insert()
2993 sock_put(&tsk->sk); in tipc_sk_insert()
2996 return -1; in tipc_sk_insert()
3001 struct sock *sk = &tsk->sk; in tipc_sk_remove()
3004 if (!rhashtable_remove_fast(&tn->sk_rht, &tsk->node, tsk_rht_params)) { in tipc_sk_remove()
3005 WARN_ON(refcount_read(&sk->sk_refcnt) == 1); in tipc_sk_remove()
3024 return rhashtable_init(&tn->sk_rht, &tsk_rht_params); in tipc_sk_rht_init()
3034 rhashtable_destroy(&tn->sk_rht); in tipc_sk_rht_destroy()
3039 struct net *net = sock_net(&tsk->sk); in tipc_sk_join()
3040 struct tipc_group *grp = tsk->group; in tipc_sk_join()
3041 struct tipc_msg *hdr = &tsk->phdr; in tipc_sk_join()
3045 if (mreq->type < TIPC_RESERVED_TYPES) in tipc_sk_join()
3046 return -EACCES; in tipc_sk_join()
3047 if (mreq->scope > TIPC_NODE_SCOPE) in tipc_sk_join()
3048 return -EINVAL; in tipc_sk_join()
3050 return -EACCES; in tipc_sk_join()
3051 grp = tipc_group_create(net, tsk->portid, mreq, &tsk->group_is_open); in tipc_sk_join()
3053 return -ENOMEM; in tipc_sk_join()
3054 tsk->group = grp; in tipc_sk_join()
3055 msg_set_lookup_scope(hdr, mreq->scope); in tipc_sk_join()
3056 msg_set_nametype(hdr, mreq->type); in tipc_sk_join()
3058 seq.type = mreq->type; in tipc_sk_join()
3059 seq.lower = mreq->instance; in tipc_sk_join()
3061 tipc_nametbl_build_group(net, grp, mreq->type, mreq->scope); in tipc_sk_join()
3062 rc = tipc_sk_publish(tsk, mreq->scope, &seq); in tipc_sk_join()
3065 tsk->group = NULL; in tipc_sk_join()
3069 tsk->mc_method.rcast = true; in tipc_sk_join()
3070 tsk->mc_method.mandatory = true; in tipc_sk_join()
3071 tipc_group_join(net, grp, &tsk->sk.sk_rcvbuf); in tipc_sk_join()
3077 struct net *net = sock_net(&tsk->sk); in tipc_sk_leave()
3078 struct tipc_group *grp = tsk->group; in tipc_sk_leave()
3083 return -EINVAL; in tipc_sk_leave()
3086 tsk->group = NULL; in tipc_sk_leave()
3092 * tipc_setsockopt - set socket option
3096 * @ov: pointer to new option value
3097 * @ol: length of option value
3107 struct sock *sk = sock->sk; in tipc_setsockopt()
3110 u32 value = 0; in tipc_setsockopt() local
3111 int res = 0; in tipc_setsockopt() local
3113 if ((lvl == IPPROTO_TCP) && (sock->type == SOCK_STREAM)) in tipc_setsockopt()
3116 return -ENOPROTOOPT; in tipc_setsockopt()
3124 if (ol < sizeof(value)) in tipc_setsockopt()
3125 return -EINVAL; in tipc_setsockopt()
3126 if (copy_from_sockptr(&value, ov, sizeof(u32))) in tipc_setsockopt()
3127 return -EFAULT; in tipc_setsockopt()
3131 return -EINVAL; in tipc_setsockopt()
3133 return -EFAULT; in tipc_setsockopt()
3137 return -EINVAL; in tipc_setsockopt()
3144 res = tsk_set_importance(sk, value); in tipc_setsockopt()
3147 if (sock->type != SOCK_STREAM) in tipc_setsockopt()
3148 tsk_set_unreliable(tsk, value); in tipc_setsockopt()
3150 res = -ENOPROTOOPT; in tipc_setsockopt()
3153 tsk_set_unreturnable(tsk, value); in tipc_setsockopt()
3156 tipc_sk(sk)->conn_timeout = value; in tipc_setsockopt()
3159 tsk->mc_method.rcast = false; in tipc_setsockopt()
3160 tsk->mc_method.mandatory = true; in tipc_setsockopt()
3163 tsk->mc_method.rcast = true; in tipc_setsockopt()
3164 tsk->mc_method.mandatory = true; in tipc_setsockopt()
3167 res = tipc_sk_join(tsk, &mreq); in tipc_setsockopt()
3170 res = tipc_sk_leave(tsk); in tipc_setsockopt()
3173 tsk->nodelay = !!value; in tipc_setsockopt()
3177 res = -EINVAL; in tipc_setsockopt()
3182 return res; in tipc_setsockopt()
3186 * tipc_getsockopt - get socket option
3190 * @ov: receptacle for option value
3191 * @ol: receptacle for length of option value
3201 struct sock *sk = sock->sk; in tipc_getsockopt()
3205 u32 value; in tipc_getsockopt() local
3206 int res; in tipc_getsockopt() local
3208 if ((lvl == IPPROTO_TCP) && (sock->type == SOCK_STREAM)) in tipc_getsockopt()
3211 return -ENOPROTOOPT; in tipc_getsockopt()
3212 res = get_user(len, ol); in tipc_getsockopt()
3213 if (res) in tipc_getsockopt()
3214 return res; in tipc_getsockopt()
3220 value = tsk_importance(tsk); in tipc_getsockopt()
3223 value = tsk_unreliable(tsk); in tipc_getsockopt()
3226 value = tsk_unreturnable(tsk); in tipc_getsockopt()
3229 value = tsk->conn_timeout; in tipc_getsockopt()
3230 /* no need to set "res", since already 0 at this point */ in tipc_getsockopt()
3233 value = 0; /* was tipc_queue_size, now obsolete */ in tipc_getsockopt()
3236 value = skb_queue_len(&sk->sk_receive_queue); in tipc_getsockopt()
3239 value = sk_rmem_alloc_get(sk); in tipc_getsockopt()
3243 if (tsk->group) in tipc_getsockopt()
3244 tipc_group_self(tsk->group, &seq, &scope); in tipc_getsockopt()
3245 value = seq.type; in tipc_getsockopt()
3248 res = -EINVAL; in tipc_getsockopt()
3253 if (res) in tipc_getsockopt()
3254 return res; /* "get" failed */ in tipc_getsockopt()
3256 if (len < sizeof(value)) in tipc_getsockopt()
3257 return -EINVAL; in tipc_getsockopt()
3259 if (copy_to_user(ov, &value, sizeof(value))) in tipc_getsockopt()
3260 return -EFAULT; in tipc_getsockopt()
3262 return put_user(sizeof(value), ol); in tipc_getsockopt()
3267 struct net *net = sock_net(sock->sk); in tipc_ioctl()
3275 return -EFAULT; in tipc_ioctl()
3280 return -EFAULT; in tipc_ioctl()
3283 return -EADDRNOTAVAIL; in tipc_ioctl()
3286 return -EFAULT; in tipc_ioctl()
3288 return -EADDRNOTAVAIL; in tipc_ioctl()
3290 return -EFAULT; in tipc_ioctl()
3293 return -ENOIOCTLCMD; in tipc_ioctl()
3299 struct tipc_sock *tsk2 = tipc_sk(sock2->sk); in tipc_socketpair()
3300 struct tipc_sock *tsk1 = tipc_sk(sock1->sk); in tipc_socketpair()
3301 u32 onode = tipc_own_addr(sock_net(sock1->sk)); in tipc_socketpair()
3303 tsk1->peer.family = AF_TIPC; in tipc_socketpair()
3304 tsk1->peer.addrtype = TIPC_ADDR_ID; in tipc_socketpair()
3305 tsk1->peer.scope = TIPC_NODE_SCOPE; in tipc_socketpair()
3306 tsk1->peer.addr.id.ref = tsk2->portid; in tipc_socketpair()
3307 tsk1->peer.addr.id.node = onode; in tipc_socketpair()
3308 tsk2->peer.family = AF_TIPC; in tipc_socketpair()
3309 tsk2->peer.addrtype = TIPC_ADDR_ID; in tipc_socketpair()
3310 tsk2->peer.scope = TIPC_NODE_SCOPE; in tipc_socketpair()
3311 tsk2->peer.addr.id.ref = tsk1->portid; in tipc_socketpair()
3312 tsk2->peer.addr.id.node = onode; in tipc_socketpair()
3314 tipc_sk_finish_conn(tsk1, tsk2->portid, onode); in tipc_socketpair()
3315 tipc_sk_finish_conn(tsk2, tsk1->portid, onode); in tipc_socketpair()
3398 * tipc_socket_init - initialize TIPC socket interface
3404 int res; in tipc_socket_init() local
3406 res = proto_register(&tipc_proto, 1); in tipc_socket_init()
3407 if (res) { in tipc_socket_init()
3412 res = sock_register(&tipc_family_ops); in tipc_socket_init()
3413 if (res) { in tipc_socket_init()
3419 return res; in tipc_socket_init()
3423 * tipc_socket_stop - stop TIPC socket interface
3443 return -EMSGSIZE; in __tipc_nl_add_sk_con()
3450 if (tsk->conn_type != 0) { in __tipc_nl_add_sk_con()
3453 if (nla_put_u32(skb, TIPC_NLA_CON_TYPE, tsk->conn_type)) in __tipc_nl_add_sk_con()
3455 if (nla_put_u32(skb, TIPC_NLA_CON_INST, tsk->conn_instance)) in __tipc_nl_add_sk_con()
3465 return -EMSGSIZE; in __tipc_nl_add_sk_con()
3471 struct net *net = sock_net(skb->sk); in __tipc_nl_add_sk_info()
3472 struct sock *sk = &tsk->sk; in __tipc_nl_add_sk_info()
3474 if (nla_put_u32(skb, TIPC_NLA_SOCK_REF, tsk->portid) || in __tipc_nl_add_sk_info()
3476 return -EMSGSIZE; in __tipc_nl_add_sk_info()
3480 return -EMSGSIZE; in __tipc_nl_add_sk_info()
3481 } else if (!list_empty(&tsk->publications)) { in __tipc_nl_add_sk_info()
3483 return -EMSGSIZE; in __tipc_nl_add_sk_info()
3495 hdr = genlmsg_put(skb, NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq, in __tipc_nl_add_sk()
3517 return -EMSGSIZE; in __tipc_nl_add_sk()
3525 struct rhashtable_iter *iter = (void *)cb->args[4]; in tipc_nl_sk_walk()
3533 if (err == -EAGAIN) { in tipc_nl_sk_walk()
3540 sock_hold(&tsk->sk); in tipc_nl_sk_walk()
3542 lock_sock(&tsk->sk); in tipc_nl_sk_walk()
3545 release_sock(&tsk->sk); in tipc_nl_sk_walk()
3546 sock_put(&tsk->sk); in tipc_nl_sk_walk()
3549 release_sock(&tsk->sk); in tipc_nl_sk_walk()
3551 sock_put(&tsk->sk); in tipc_nl_sk_walk()
3555 return skb->len; in tipc_nl_sk_walk()
3561 return __tipc_dump_start(cb, sock_net(cb->skb->sk)); in tipc_dump_start()
3567 /* tipc_nl_name_table_dump() uses cb->args[0...3]. */ in __tipc_dump_start()
3568 struct rhashtable_iter *iter = (void *)cb->args[4]; in __tipc_dump_start()
3574 return -ENOMEM; in __tipc_dump_start()
3576 cb->args[4] = (long)iter; in __tipc_dump_start()
3579 rhashtable_walk_enter(&tn->sk_rht, iter); in __tipc_dump_start()
3585 struct rhashtable_iter *hti = (void *)cb->args[4]; in tipc_dump_done()
3597 struct sock *sk = &tsk->sk; in tipc_sk_fill_sock_diag()
3602 if (!(sk_filter_state & (1 << sk->sk_state))) in tipc_sk_fill_sock_diag()
3612 if (nla_put_u32(skb, TIPC_NLA_SOCK_TYPE, (u32)sk->sk_type) || in tipc_sk_fill_sock_diag()
3613 nla_put_u32(skb, TIPC_NLA_SOCK_TIPC_STATE, (u32)sk->sk_state) || in tipc_sk_fill_sock_diag()
3616 from_kuid_munged(sk_user_ns(NETLINK_CB(cb->skb).sk), in tipc_sk_fill_sock_diag()
3628 skb_queue_len(&sk->sk_receive_queue)) || in tipc_sk_fill_sock_diag()
3630 skb_queue_len(&sk->sk_write_queue)) || in tipc_sk_fill_sock_diag()
3632 atomic_read(&sk->sk_drops))) in tipc_sk_fill_sock_diag()
3635 if (tsk->cong_link_cnt && in tipc_sk_fill_sock_diag()
3645 if (tsk->group) in tipc_sk_fill_sock_diag()
3646 if (tipc_group_fill_sock_diag(tsk->group, skb)) in tipc_sk_fill_sock_diag()
3658 return -EMSGSIZE; in tipc_sk_fill_sock_diag()
3675 hdr = genlmsg_put(skb, NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq, in __tipc_nl_add_sk_publ()
3684 if (nla_put_u32(skb, TIPC_NLA_PUBL_KEY, publ->key)) in __tipc_nl_add_sk_publ()
3686 if (nla_put_u32(skb, TIPC_NLA_PUBL_TYPE, publ->type)) in __tipc_nl_add_sk_publ()
3688 if (nla_put_u32(skb, TIPC_NLA_PUBL_LOWER, publ->lower)) in __tipc_nl_add_sk_publ()
3690 if (nla_put_u32(skb, TIPC_NLA_PUBL_UPPER, publ->upper)) in __tipc_nl_add_sk_publ()
3703 return -EMSGSIZE; in __tipc_nl_add_sk_publ()
3715 list_for_each_entry(p, &tsk->publications, binding_sock) { in __tipc_nl_list_sk_publ()
3716 if (p->key == *last_publ) in __tipc_nl_list_sk_publ()
3719 if (p->key != *last_publ) { in __tipc_nl_list_sk_publ()
3726 cb->prev_seq = 1; in __tipc_nl_list_sk_publ()
3728 return -EPIPE; in __tipc_nl_list_sk_publ()
3731 p = list_first_entry(&tsk->publications, struct publication, in __tipc_nl_list_sk_publ()
3735 list_for_each_entry_from(p, &tsk->publications, binding_sock) { in __tipc_nl_list_sk_publ()
3738 *last_publ = p->key; in __tipc_nl_list_sk_publ()
3750 u32 tsk_portid = cb->args[0]; in tipc_nl_publ_dump()
3751 u32 last_publ = cb->args[1]; in tipc_nl_publ_dump()
3752 u32 done = cb->args[2]; in tipc_nl_publ_dump()
3753 struct net *net = sock_net(skb->sk); in tipc_nl_publ_dump()
3757 struct nlattr **attrs = genl_dumpit_info(cb)->attrs; in tipc_nl_publ_dump()
3761 return -EINVAL; in tipc_nl_publ_dump()
3770 return -EINVAL; in tipc_nl_publ_dump()
3780 return -EINVAL; in tipc_nl_publ_dump()
3782 lock_sock(&tsk->sk); in tipc_nl_publ_dump()
3786 release_sock(&tsk->sk); in tipc_nl_publ_dump()
3787 sock_put(&tsk->sk); in tipc_nl_publ_dump()
3789 cb->args[0] = tsk_portid; in tipc_nl_publ_dump()
3790 cb->args[1] = last_publ; in tipc_nl_publ_dump()
3791 cb->args[2] = done; in tipc_nl_publ_dump()
3793 return skb->len; in tipc_nl_publ_dump()
3797 * tipc_sk_filtering - check if a socket should be traced
3803 * (value 0 = 'any') or when there is no tuple set (all = 0),
3828 return (_port == tsk->portid); in tipc_sk_filtering()
3830 if (_sktype && _sktype != sk->sk_type) in tipc_sk_filtering()
3833 if (tsk->published) { in tipc_sk_filtering()
3834 p = list_first_entry_or_null(&tsk->publications, in tipc_sk_filtering()
3837 type = p->type; in tipc_sk_filtering()
3838 lower = p->lower; in tipc_sk_filtering()
3839 upper = p->upper; in tipc_sk_filtering()
3844 type = tsk->conn_type; in tipc_sk_filtering()
3845 lower = tsk->conn_instance; in tipc_sk_filtering()
3846 upper = tsk->conn_instance; in tipc_sk_filtering()
3858 return (sk) ? (tipc_sk(sk))->portid : 0; in tipc_sock_get_portid()
3862 * tipc_sk_overlimit1 - check if socket rx queue is about to be overloaded,
3872 atomic_t *dcnt = &tipc_sk(sk)->dupl_rcvcnt; in tipc_sk_overlimit1()
3874 unsigned int qsize = sk->sk_backlog.len + sk_rmem_alloc_get(sk); in tipc_sk_overlimit1()
3880 * tipc_sk_overlimit2 - check if socket rx queue is about to be overloaded,
3897 * tipc_sk_dump - dump TIPC socket
3900 * - TIPC_DUMP_NONE: don't dump socket queues
3901 * - TIPC_DUMP_SK_SNDQ: dump socket send queue
3902 * - TIPC_DUMP_SK_RCVQ: dump socket rcv queue
3903 * - TIPC_DUMP_SK_BKLGQ: dump socket backlog queue
3904 * - TIPC_DUMP_ALL: dump all the socket queues above
3923 i += scnprintf(buf, sz, "sk data: %u", sk->sk_type); in tipc_sk_dump()
3924 i += scnprintf(buf + i, sz - i, " %d", sk->sk_state); in tipc_sk_dump()
3925 i += scnprintf(buf + i, sz - i, " %x", tsk_own_node(tsk)); in tipc_sk_dump()
3926 i += scnprintf(buf + i, sz - i, " %u", tsk->portid); in tipc_sk_dump()
3927 i += scnprintf(buf + i, sz - i, " | %u", tsk_connected); in tipc_sk_dump()
3929 i += scnprintf(buf + i, sz - i, " %x", tsk_peer_node(tsk)); in tipc_sk_dump()
3930 i += scnprintf(buf + i, sz - i, " %u", tsk_peer_port(tsk)); in tipc_sk_dump()
3931 i += scnprintf(buf + i, sz - i, " %u", tsk->conn_type); in tipc_sk_dump()
3932 i += scnprintf(buf + i, sz - i, " %u", tsk->conn_instance); in tipc_sk_dump()
3934 i += scnprintf(buf + i, sz - i, " | %u", tsk->published); in tipc_sk_dump()
3935 if (tsk->published) { in tipc_sk_dump()
3936 p = list_first_entry_or_null(&tsk->publications, in tipc_sk_dump()
3938 i += scnprintf(buf + i, sz - i, " %u", (p) ? p->type : 0); in tipc_sk_dump()
3939 i += scnprintf(buf + i, sz - i, " %u", (p) ? p->lower : 0); in tipc_sk_dump()
3940 i += scnprintf(buf + i, sz - i, " %u", (p) ? p->upper : 0); in tipc_sk_dump()
3942 i += scnprintf(buf + i, sz - i, " | %u", tsk->snd_win); in tipc_sk_dump()
3943 i += scnprintf(buf + i, sz - i, " %u", tsk->rcv_win); in tipc_sk_dump()
3944 i += scnprintf(buf + i, sz - i, " %u", tsk->max_pkt); in tipc_sk_dump()
3945 i += scnprintf(buf + i, sz - i, " %x", tsk->peer_caps); in tipc_sk_dump()
3946 i += scnprintf(buf + i, sz - i, " %u", tsk->cong_link_cnt); in tipc_sk_dump()
3947 i += scnprintf(buf + i, sz - i, " %u", tsk->snt_unacked); in tipc_sk_dump()
3948 i += scnprintf(buf + i, sz - i, " %u", tsk->rcv_unacked); in tipc_sk_dump()
3949 i += scnprintf(buf + i, sz - i, " %u", atomic_read(&tsk->dupl_rcvcnt)); in tipc_sk_dump()
3950 i += scnprintf(buf + i, sz - i, " %u", sk->sk_shutdown); in tipc_sk_dump()
3951 i += scnprintf(buf + i, sz - i, " | %d", sk_wmem_alloc_get(sk)); in tipc_sk_dump()
3952 i += scnprintf(buf + i, sz - i, " %d", sk->sk_sndbuf); in tipc_sk_dump()
3953 i += scnprintf(buf + i, sz - i, " | %d", sk_rmem_alloc_get(sk)); in tipc_sk_dump()
3954 i += scnprintf(buf + i, sz - i, " %d", sk->sk_rcvbuf); in tipc_sk_dump()
3955 i += scnprintf(buf + i, sz - i, " | %d\n", READ_ONCE(sk->sk_backlog.len)); in tipc_sk_dump()
3958 i += scnprintf(buf + i, sz - i, "sk_write_queue: "); in tipc_sk_dump()
3959 i += tipc_list_dump(&sk->sk_write_queue, false, buf + i); in tipc_sk_dump()
3963 i += scnprintf(buf + i, sz - i, "sk_receive_queue: "); in tipc_sk_dump()
3964 i += tipc_list_dump(&sk->sk_receive_queue, false, buf + i); in tipc_sk_dump()
3968 i += scnprintf(buf + i, sz - i, "sk_backlog:\n head "); in tipc_sk_dump()
3969 i += tipc_skb_dump(sk->sk_backlog.head, false, buf + i); in tipc_sk_dump()
3970 if (sk->sk_backlog.tail != sk->sk_backlog.head) { in tipc_sk_dump()
3971 i += scnprintf(buf + i, sz - i, " tail "); in tipc_sk_dump()
3972 i += tipc_skb_dump(sk->sk_backlog.tail, false, in tipc_sk_dump()