Lines Matching +full:rx +full:- +full:m
1 // SPDX-License-Identifier: GPL-2.0-or-later
18 #include <linux/key-type.h>
23 #include "ar-internal.h"
53 return refcount_read(&sk->sk_wmem_alloc) < (size_t) sk->sk_sndbuf; in rxrpc_writable()
64 struct socket_wq *wq = rcu_dereference(sk->sk_wq); in rxrpc_write_space()
67 wake_up_interruptible(&wq->wait); in rxrpc_write_space()
76 static int rxrpc_validate_address(struct rxrpc_sock *rx, in rxrpc_validate_address() argument
83 return -EINVAL; in rxrpc_validate_address()
85 if (srx->srx_family != AF_RXRPC) in rxrpc_validate_address()
86 return -EAFNOSUPPORT; in rxrpc_validate_address()
88 if (srx->transport_type != SOCK_DGRAM) in rxrpc_validate_address()
89 return -ESOCKTNOSUPPORT; in rxrpc_validate_address()
91 len -= offsetof(struct sockaddr_rxrpc, transport); in rxrpc_validate_address()
92 if (srx->transport_len < sizeof(sa_family_t) || in rxrpc_validate_address()
93 srx->transport_len > len) in rxrpc_validate_address()
94 return -EINVAL; in rxrpc_validate_address()
96 switch (srx->transport.family) { in rxrpc_validate_address()
98 if (rx->family != AF_INET && in rxrpc_validate_address()
99 rx->family != AF_INET6) in rxrpc_validate_address()
100 return -EAFNOSUPPORT; in rxrpc_validate_address()
101 if (srx->transport_len < sizeof(struct sockaddr_in)) in rxrpc_validate_address()
102 return -EINVAL; in rxrpc_validate_address()
108 if (rx->family != AF_INET6) in rxrpc_validate_address()
109 return -EAFNOSUPPORT; in rxrpc_validate_address()
110 if (srx->transport_len < sizeof(struct sockaddr_in6)) in rxrpc_validate_address()
111 return -EINVAL; in rxrpc_validate_address()
118 return -EAFNOSUPPORT; in rxrpc_validate_address()
122 memset((void *)srx + tail, 0, len - tail); in rxrpc_validate_address()
123 _debug("INET: %pISp", &srx->transport); in rxrpc_validate_address()
134 struct rxrpc_sock *rx = rxrpc_sk(sock->sk); in rxrpc_bind() local
138 _enter("%p,%p,%d", rx, saddr, len); in rxrpc_bind()
140 ret = rxrpc_validate_address(rx, srx, len); in rxrpc_bind()
143 service_id = srx->srx_service; in rxrpc_bind()
145 lock_sock(&rx->sk); in rxrpc_bind()
147 switch (rx->sk.sk_state) { in rxrpc_bind()
149 rx->srx = *srx; in rxrpc_bind()
150 local = rxrpc_lookup_local(sock_net(&rx->sk), &rx->srx); in rxrpc_bind()
157 write_lock(&local->services_lock); in rxrpc_bind()
158 if (local->service) in rxrpc_bind()
160 rx->local = local; in rxrpc_bind()
161 local->service = rx; in rxrpc_bind()
162 write_unlock(&local->services_lock); in rxrpc_bind()
164 rx->sk.sk_state = RXRPC_SERVER_BOUND; in rxrpc_bind()
166 rx->local = local; in rxrpc_bind()
167 rx->sk.sk_state = RXRPC_CLIENT_BOUND; in rxrpc_bind()
172 ret = -EINVAL; in rxrpc_bind()
175 ret = -EADDRINUSE; in rxrpc_bind()
176 if (service_id == rx->srx.srx_service) in rxrpc_bind()
178 ret = -EINVAL; in rxrpc_bind()
179 srx->srx_service = rx->srx.srx_service; in rxrpc_bind()
180 if (memcmp(srx, &rx->srx, sizeof(*srx)) != 0) in rxrpc_bind()
182 rx->second_service = service_id; in rxrpc_bind()
183 rx->sk.sk_state = RXRPC_SERVER_BOUND2; in rxrpc_bind()
187 ret = -EINVAL; in rxrpc_bind()
191 release_sock(&rx->sk); in rxrpc_bind()
196 write_unlock(&local->services_lock); in rxrpc_bind()
199 ret = -EADDRINUSE; in rxrpc_bind()
201 release_sock(&rx->sk); in rxrpc_bind()
212 struct sock *sk = sock->sk; in rxrpc_listen()
213 struct rxrpc_sock *rx = rxrpc_sk(sk); in rxrpc_listen() local
217 _enter("%p,%d", rx, backlog); in rxrpc_listen()
219 lock_sock(&rx->sk); in rxrpc_listen()
221 switch (rx->sk.sk_state) { in rxrpc_listen()
223 ret = -EADDRNOTAVAIL; in rxrpc_listen()
227 ASSERT(rx->local != NULL); in rxrpc_listen()
229 ret = -EINVAL; in rxrpc_listen()
234 old = sk->sk_max_ack_backlog; in rxrpc_listen()
235 sk->sk_max_ack_backlog = backlog; in rxrpc_listen()
236 ret = rxrpc_service_prealloc(rx, GFP_KERNEL); in rxrpc_listen()
238 rx->sk.sk_state = RXRPC_SERVER_LISTENING; in rxrpc_listen()
240 sk->sk_max_ack_backlog = old; in rxrpc_listen()
244 rx->sk.sk_state = RXRPC_SERVER_LISTEN_DISABLED; in rxrpc_listen()
245 sk->sk_max_ack_backlog = 0; in rxrpc_listen()
246 rxrpc_discard_prealloc(rx); in rxrpc_listen()
252 ret = -EBUSY; in rxrpc_listen()
256 release_sock(&rx->sk); in rxrpc_listen()
262 * rxrpc_kernel_begin_call - Allow a kernel service to begin a call
267 * @tx_total_len: Total length of data to transmit during the call (or -1)
297 struct rxrpc_sock *rx = rxrpc_sk(sock->sk); in rxrpc_kernel_begin_call() local
302 ret = rxrpc_validate_address(rx, srx, sizeof(*srx)); in rxrpc_kernel_begin_call()
306 lock_sock(&rx->sk); in rxrpc_kernel_begin_call()
309 key = rx->key; in rxrpc_kernel_begin_call()
310 if (key && !key->payload.data[0]) in rxrpc_kernel_begin_call()
311 key = NULL; /* a no-security key */ in rxrpc_kernel_begin_call()
321 cp.local = rx->local; in rxrpc_kernel_begin_call()
323 cp.security_level = rx->min_sec_level; in rxrpc_kernel_begin_call()
326 cp.service_id = srx->srx_service; in rxrpc_kernel_begin_call()
327 call = rxrpc_new_client_call(rx, &cp, srx, &p, gfp, debug_id); in rxrpc_kernel_begin_call()
330 call->notify_rx = notify_rx; in rxrpc_kernel_begin_call()
331 mutex_unlock(&call->user_mutex); in rxrpc_kernel_begin_call()
348 * rxrpc_kernel_shutdown_call - Allow a kernel service to shut down a call it was using
357 _enter("%d{%d}", call->debug_id, refcount_read(&call->ref)); in rxrpc_kernel_shutdown_call()
359 mutex_lock(&call->user_mutex); in rxrpc_kernel_shutdown_call()
360 if (!test_bit(RXRPC_CALL_RELEASED, &call->flags)) { in rxrpc_kernel_shutdown_call()
361 rxrpc_release_call(rxrpc_sk(sock->sk), call); in rxrpc_kernel_shutdown_call()
364 if (call->notify_rx) { in rxrpc_kernel_shutdown_call()
365 spin_lock(&call->notify_lock); in rxrpc_kernel_shutdown_call()
366 call->notify_rx = rxrpc_dummy_notify_rx; in rxrpc_kernel_shutdown_call()
367 spin_unlock(&call->notify_lock); in rxrpc_kernel_shutdown_call()
370 mutex_unlock(&call->user_mutex); in rxrpc_kernel_shutdown_call()
375 * rxrpc_kernel_put_call - Release a reference to a call
388 * rxrpc_kernel_check_life - Check to see whether a call is still alive
392 * Allow a kernel service to find out whether a call is still alive - whether
400 if (call->completion != RXRPC_CALL_SUCCEEDED) in rxrpc_kernel_check_life()
402 return !skb_queue_empty(&call->recvmsg_queue); in rxrpc_kernel_check_life()
407 * rxrpc_kernel_get_epoch - Retrieve the epoch value from a call.
416 return call->conn->proto.epoch; in rxrpc_kernel_get_epoch()
421 * rxrpc_kernel_new_call_notification - Get notifications of new calls
433 struct rxrpc_sock *rx = rxrpc_sk(sock->sk); in rxrpc_kernel_new_call_notification() local
435 rx->notify_new_call = notify_new_call; in rxrpc_kernel_new_call_notification()
436 rx->discard_new_call = discard_new_call; in rxrpc_kernel_new_call_notification()
441 * rxrpc_kernel_set_max_life - Set maximum lifespan on a call
454 mutex_lock(&call->user_mutex); in rxrpc_kernel_set_max_life()
458 WRITE_ONCE(call->expect_term_by, hard_timeout); in rxrpc_kernel_set_max_life()
461 mutex_unlock(&call->user_mutex); in rxrpc_kernel_set_max_life()
467 * - this just targets it at a specific destination; no actual connection
474 struct rxrpc_sock *rx = rxrpc_sk(sock->sk); in rxrpc_connect() local
477 _enter("%p,%p,%d,%d", rx, addr, addr_len, flags); in rxrpc_connect()
479 ret = rxrpc_validate_address(rx, srx, addr_len); in rxrpc_connect()
485 lock_sock(&rx->sk); in rxrpc_connect()
487 ret = -EISCONN; in rxrpc_connect()
488 if (test_bit(RXRPC_SOCK_CONNECTED, &rx->flags)) in rxrpc_connect()
491 switch (rx->sk.sk_state) { in rxrpc_connect()
493 rx->sk.sk_state = RXRPC_CLIENT_UNBOUND; in rxrpc_connect()
499 ret = -EBUSY; in rxrpc_connect()
503 rx->connect_srx = *srx; in rxrpc_connect()
504 set_bit(RXRPC_SOCK_CONNECTED, &rx->flags); in rxrpc_connect()
508 release_sock(&rx->sk); in rxrpc_connect()
514 * - in a client this does a number of things:
515 * - finds/sets up a connection for the security specified (if any)
516 * - initiates a call (ID in control data)
517 * - ends the request phase of a call (if MSG_MORE is not set)
518 * - sends a call data packet
519 * - may send an abort (abort code in control data)
521 static int rxrpc_sendmsg(struct socket *sock, struct msghdr *m, size_t len) in rxrpc_sendmsg() argument
524 struct rxrpc_sock *rx = rxrpc_sk(sock->sk); in rxrpc_sendmsg() local
527 _enter(",{%d},,%zu", rx->sk.sk_state, len); in rxrpc_sendmsg()
529 if (m->msg_flags & MSG_OOB) in rxrpc_sendmsg()
530 return -EOPNOTSUPP; in rxrpc_sendmsg()
532 if (m->msg_name) { in rxrpc_sendmsg()
533 ret = rxrpc_validate_address(rx, m->msg_name, m->msg_namelen); in rxrpc_sendmsg()
540 lock_sock(&rx->sk); in rxrpc_sendmsg()
542 switch (rx->sk.sk_state) { in rxrpc_sendmsg()
545 rx->srx.srx_family = AF_RXRPC; in rxrpc_sendmsg()
546 rx->srx.srx_service = 0; in rxrpc_sendmsg()
547 rx->srx.transport_type = SOCK_DGRAM; in rxrpc_sendmsg()
548 rx->srx.transport.family = rx->family; in rxrpc_sendmsg()
549 switch (rx->family) { in rxrpc_sendmsg()
551 rx->srx.transport_len = sizeof(struct sockaddr_in); in rxrpc_sendmsg()
555 rx->srx.transport_len = sizeof(struct sockaddr_in6); in rxrpc_sendmsg()
559 ret = -EAFNOSUPPORT; in rxrpc_sendmsg()
562 local = rxrpc_lookup_local(sock_net(sock->sk), &rx->srx); in rxrpc_sendmsg()
568 rx->local = local; in rxrpc_sendmsg()
569 rx->sk.sk_state = RXRPC_CLIENT_BOUND; in rxrpc_sendmsg()
573 if (!m->msg_name && in rxrpc_sendmsg()
574 test_bit(RXRPC_SOCK_CONNECTED, &rx->flags)) { in rxrpc_sendmsg()
575 m->msg_name = &rx->connect_srx; in rxrpc_sendmsg()
576 m->msg_namelen = sizeof(rx->connect_srx); in rxrpc_sendmsg()
581 ret = rxrpc_do_sendmsg(rx, m, len); in rxrpc_sendmsg()
585 ret = -EINVAL; in rxrpc_sendmsg()
590 release_sock(&rx->sk); in rxrpc_sendmsg()
598 if (sk->sk_state != RXRPC_UNBOUND) in rxrpc_sock_set_min_security_level()
599 return -EISCONN; in rxrpc_sock_set_min_security_level()
601 return -EINVAL; in rxrpc_sock_set_min_security_level()
603 rxrpc_sk(sk)->min_sec_level = val; in rxrpc_sock_set_min_security_level()
615 struct rxrpc_sock *rx = rxrpc_sk(sock->sk); in rxrpc_setsockopt() local
622 lock_sock(&rx->sk); in rxrpc_setsockopt()
623 ret = -EOPNOTSUPP; in rxrpc_setsockopt()
628 ret = -EINVAL; in rxrpc_setsockopt()
631 ret = -EISCONN; in rxrpc_setsockopt()
632 if (rx->sk.sk_state != RXRPC_UNBOUND) in rxrpc_setsockopt()
634 rx->exclusive = true; in rxrpc_setsockopt()
638 ret = -EINVAL; in rxrpc_setsockopt()
639 if (rx->key) in rxrpc_setsockopt()
641 ret = -EISCONN; in rxrpc_setsockopt()
642 if (rx->sk.sk_state != RXRPC_UNBOUND) in rxrpc_setsockopt()
644 ret = rxrpc_request_key(rx, optval, optlen); in rxrpc_setsockopt()
648 ret = -EINVAL; in rxrpc_setsockopt()
649 if (rx->key) in rxrpc_setsockopt()
651 ret = -EISCONN; in rxrpc_setsockopt()
652 if (rx->sk.sk_state != RXRPC_UNBOUND) in rxrpc_setsockopt()
654 ret = rxrpc_server_keyring(rx, optval, optlen); in rxrpc_setsockopt()
658 ret = -EINVAL; in rxrpc_setsockopt()
661 ret = -EISCONN; in rxrpc_setsockopt()
662 if (rx->sk.sk_state != RXRPC_UNBOUND) in rxrpc_setsockopt()
669 ret = -EINVAL; in rxrpc_setsockopt()
672 rx->min_sec_level = min_sec_level; in rxrpc_setsockopt()
676 ret = -EINVAL; in rxrpc_setsockopt()
678 rx->service_upgrade.from != 0) in rxrpc_setsockopt()
680 ret = -EISCONN; in rxrpc_setsockopt()
681 if (rx->sk.sk_state != RXRPC_SERVER_BOUND2) in rxrpc_setsockopt()
683 ret = -EFAULT; in rxrpc_setsockopt()
687 ret = -EINVAL; in rxrpc_setsockopt()
688 if ((service_upgrade[0] != rx->srx.srx_service || in rxrpc_setsockopt()
689 service_upgrade[1] != rx->second_service) && in rxrpc_setsockopt()
690 (service_upgrade[0] != rx->second_service || in rxrpc_setsockopt()
691 service_upgrade[1] != rx->srx.srx_service)) in rxrpc_setsockopt()
693 rx->service_upgrade.from = service_upgrade[0]; in rxrpc_setsockopt()
694 rx->service_upgrade.to = service_upgrade[1]; in rxrpc_setsockopt()
705 release_sock(&rx->sk); in rxrpc_setsockopt()
718 return -EOPNOTSUPP; in rxrpc_getsockopt()
721 return -EFAULT; in rxrpc_getsockopt()
726 return -ETOOSMALL; in rxrpc_getsockopt()
727 if (put_user(RXRPC__SUPPORTED - 1, (int __user *)optval) || in rxrpc_getsockopt()
729 return -EFAULT; in rxrpc_getsockopt()
733 return -EOPNOTSUPP; in rxrpc_getsockopt()
743 struct sock *sk = sock->sk; in rxrpc_poll()
744 struct rxrpc_sock *rx = rxrpc_sk(sk); in rxrpc_poll() local
750 /* the socket is readable if there are any messages waiting on the Rx in rxrpc_poll()
752 if (!list_empty(&rx->recvmsg_q)) in rxrpc_poll()
771 struct rxrpc_sock *rx; in rxrpc_create() local
779 return -EPROTONOSUPPORT; in rxrpc_create()
781 if (sock->type != SOCK_DGRAM) in rxrpc_create()
782 return -ESOCKTNOSUPPORT; in rxrpc_create()
784 sock->ops = &rxrpc_rpc_ops; in rxrpc_create()
785 sock->state = SS_UNCONNECTED; in rxrpc_create()
789 return -ENOMEM; in rxrpc_create()
793 sk->sk_state = RXRPC_UNBOUND; in rxrpc_create()
794 sk->sk_write_space = rxrpc_write_space; in rxrpc_create()
795 sk->sk_max_ack_backlog = 0; in rxrpc_create()
796 sk->sk_destruct = rxrpc_sock_destructor; in rxrpc_create()
798 rx = rxrpc_sk(sk); in rxrpc_create()
799 rx->family = protocol; in rxrpc_create()
800 rx->calls = RB_ROOT; in rxrpc_create()
802 spin_lock_init(&rx->incoming_lock); in rxrpc_create()
803 INIT_LIST_HEAD(&rx->sock_calls); in rxrpc_create()
804 INIT_LIST_HEAD(&rx->to_be_accepted); in rxrpc_create()
805 INIT_LIST_HEAD(&rx->recvmsg_q); in rxrpc_create()
806 spin_lock_init(&rx->recvmsg_lock); in rxrpc_create()
807 rwlock_init(&rx->call_lock); in rxrpc_create()
808 memset(&rx->srx, 0, sizeof(rx->srx)); in rxrpc_create()
810 rxnet = rxrpc_net(sock_net(&rx->sk)); in rxrpc_create()
811 timer_reduce(&rxnet->peer_keepalive_timer, jiffies + 1); in rxrpc_create()
813 _leave(" = 0 [%p]", rx); in rxrpc_create()
822 struct sock *sk = sock->sk; in rxrpc_shutdown()
823 struct rxrpc_sock *rx = rxrpc_sk(sk); in rxrpc_shutdown() local
829 return -EOPNOTSUPP; in rxrpc_shutdown()
830 if (sk->sk_state == RXRPC_CLOSE) in rxrpc_shutdown()
831 return -ESHUTDOWN; in rxrpc_shutdown()
835 if (sk->sk_state < RXRPC_CLOSE) { in rxrpc_shutdown()
836 sk->sk_state = RXRPC_CLOSE; in rxrpc_shutdown()
837 sk->sk_shutdown = SHUTDOWN_MASK; in rxrpc_shutdown()
839 ret = -ESHUTDOWN; in rxrpc_shutdown()
842 rxrpc_discard_prealloc(rx); in rxrpc_shutdown()
855 rxrpc_purge_queue(&sk->sk_receive_queue); in rxrpc_sock_destructor()
857 WARN_ON(refcount_read(&sk->sk_wmem_alloc)); in rxrpc_sock_destructor()
859 WARN_ON(sk->sk_socket); in rxrpc_sock_destructor()
872 struct rxrpc_sock *rx = rxrpc_sk(sk); in rxrpc_release_sock() local
874 _enter("%p{%d,%d}", sk, sk->sk_state, refcount_read(&sk->sk_refcnt)); in rxrpc_release_sock()
878 sk->sk_shutdown = SHUTDOWN_MASK; in rxrpc_release_sock()
884 switch (sk->sk_state) { in rxrpc_release_sock()
889 rx->local->service_closed = true; in rxrpc_release_sock()
893 sk->sk_state = RXRPC_CLOSE; in rxrpc_release_sock()
895 if (rx->local && rx->local->service == rx) { in rxrpc_release_sock()
896 write_lock(&rx->local->services_lock); in rxrpc_release_sock()
897 rx->local->service = NULL; in rxrpc_release_sock()
898 write_unlock(&rx->local->services_lock); in rxrpc_release_sock()
902 rxrpc_discard_prealloc(rx); in rxrpc_release_sock()
903 rxrpc_release_calls_on_socket(rx); in rxrpc_release_sock()
905 rxrpc_purge_queue(&sk->sk_receive_queue); in rxrpc_release_sock()
907 rxrpc_unuse_local(rx->local, rxrpc_local_unuse_release_sock); in rxrpc_release_sock()
908 rxrpc_put_local(rx->local, rxrpc_local_put_release_sock); in rxrpc_release_sock()
909 rx->local = NULL; in rxrpc_release_sock()
910 key_put(rx->key); in rxrpc_release_sock()
911 rx->key = NULL; in rxrpc_release_sock()
912 key_put(rx->securities); in rxrpc_release_sock()
913 rx->securities = NULL; in rxrpc_release_sock()
925 struct sock *sk = sock->sk; in rxrpc_release()
932 sock->sk = NULL; in rxrpc_release()
978 int ret = -1; in af_rxrpc_init()
982 ret = -ENOMEM; in af_rxrpc_init()