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 if (srx->transport.family != rx->family && in rxrpc_validate_address()
97 srx->transport.family == AF_INET && rx->family != AF_INET6) in rxrpc_validate_address()
98 return -EAFNOSUPPORT; in rxrpc_validate_address()
100 switch (srx->transport.family) { in rxrpc_validate_address()
102 if (srx->transport_len < sizeof(struct sockaddr_in)) in rxrpc_validate_address()
103 return -EINVAL; in rxrpc_validate_address()
109 if (srx->transport_len < sizeof(struct sockaddr_in6)) in rxrpc_validate_address()
110 return -EINVAL; in rxrpc_validate_address()
117 return -EAFNOSUPPORT; in rxrpc_validate_address()
121 memset((void *)srx + tail, 0, len - tail); in rxrpc_validate_address()
122 _debug("INET: %pISp", &srx->transport); in rxrpc_validate_address()
133 struct rxrpc_sock *rx = rxrpc_sk(sock->sk); in rxrpc_bind() local
137 _enter("%p,%p,%d", rx, saddr, len); in rxrpc_bind()
139 ret = rxrpc_validate_address(rx, srx, len); in rxrpc_bind()
142 service_id = srx->srx_service; in rxrpc_bind()
144 lock_sock(&rx->sk); in rxrpc_bind()
146 switch (rx->sk.sk_state) { in rxrpc_bind()
148 rx->srx = *srx; in rxrpc_bind()
149 local = rxrpc_lookup_local(sock_net(&rx->sk), &rx->srx); in rxrpc_bind()
156 write_lock(&local->services_lock); in rxrpc_bind()
157 if (rcu_access_pointer(local->service)) in rxrpc_bind()
159 rx->local = local; in rxrpc_bind()
160 rcu_assign_pointer(local->service, rx); in rxrpc_bind()
161 write_unlock(&local->services_lock); in rxrpc_bind()
163 rx->sk.sk_state = RXRPC_SERVER_BOUND; in rxrpc_bind()
165 rx->local = local; in rxrpc_bind()
166 rx->sk.sk_state = RXRPC_CLIENT_BOUND; in rxrpc_bind()
171 ret = -EINVAL; in rxrpc_bind()
174 ret = -EADDRINUSE; in rxrpc_bind()
175 if (service_id == rx->srx.srx_service) in rxrpc_bind()
177 ret = -EINVAL; in rxrpc_bind()
178 srx->srx_service = rx->srx.srx_service; in rxrpc_bind()
179 if (memcmp(srx, &rx->srx, sizeof(*srx)) != 0) in rxrpc_bind()
181 rx->second_service = service_id; in rxrpc_bind()
182 rx->sk.sk_state = RXRPC_SERVER_BOUND2; in rxrpc_bind()
186 ret = -EINVAL; in rxrpc_bind()
190 release_sock(&rx->sk); in rxrpc_bind()
195 write_unlock(&local->services_lock); in rxrpc_bind()
198 ret = -EADDRINUSE; in rxrpc_bind()
200 release_sock(&rx->sk); in rxrpc_bind()
211 struct sock *sk = sock->sk; in rxrpc_listen()
212 struct rxrpc_sock *rx = rxrpc_sk(sk); in rxrpc_listen() local
216 _enter("%p,%d", rx, backlog); in rxrpc_listen()
218 lock_sock(&rx->sk); in rxrpc_listen()
220 switch (rx->sk.sk_state) { in rxrpc_listen()
222 ret = -EADDRNOTAVAIL; in rxrpc_listen()
226 ASSERT(rx->local != NULL); in rxrpc_listen()
228 ret = -EINVAL; in rxrpc_listen()
233 old = sk->sk_max_ack_backlog; in rxrpc_listen()
234 sk->sk_max_ack_backlog = backlog; in rxrpc_listen()
235 ret = rxrpc_service_prealloc(rx, GFP_KERNEL); in rxrpc_listen()
237 rx->sk.sk_state = RXRPC_SERVER_LISTENING; in rxrpc_listen()
239 sk->sk_max_ack_backlog = old; in rxrpc_listen()
243 rx->sk.sk_state = RXRPC_SERVER_LISTEN_DISABLED; in rxrpc_listen()
244 sk->sk_max_ack_backlog = 0; in rxrpc_listen()
245 rxrpc_discard_prealloc(rx); in rxrpc_listen()
251 ret = -EBUSY; in rxrpc_listen()
255 release_sock(&rx->sk); in rxrpc_listen()
261 * rxrpc_kernel_begin_call - Allow a kernel service to begin a call
266 * @tx_total_len: Total length of data to transmit during the call (or -1)
294 struct rxrpc_sock *rx = rxrpc_sk(sock->sk); in rxrpc_kernel_begin_call() local
299 ret = rxrpc_validate_address(rx, srx, sizeof(*srx)); in rxrpc_kernel_begin_call()
303 lock_sock(&rx->sk); in rxrpc_kernel_begin_call()
306 key = rx->key; in rxrpc_kernel_begin_call()
307 if (key && !key->payload.data[0]) in rxrpc_kernel_begin_call()
308 key = NULL; /* a no-security key */ in rxrpc_kernel_begin_call()
317 cp.local = rx->local; in rxrpc_kernel_begin_call()
319 cp.security_level = rx->min_sec_level; in rxrpc_kernel_begin_call()
322 cp.service_id = srx->srx_service; in rxrpc_kernel_begin_call()
323 call = rxrpc_new_client_call(rx, &cp, srx, &p, gfp, debug_id); in rxrpc_kernel_begin_call()
326 call->notify_rx = notify_rx; in rxrpc_kernel_begin_call()
327 mutex_unlock(&call->user_mutex); in rxrpc_kernel_begin_call()
345 * rxrpc_kernel_end_call - Allow a kernel service to end a call it was using
354 _enter("%d{%d}", call->debug_id, refcount_read(&call->ref)); in rxrpc_kernel_end_call()
356 mutex_lock(&call->user_mutex); in rxrpc_kernel_end_call()
357 rxrpc_release_call(rxrpc_sk(sock->sk), call); in rxrpc_kernel_end_call()
360 if (call->notify_rx) { in rxrpc_kernel_end_call()
361 spin_lock_bh(&call->notify_lock); in rxrpc_kernel_end_call()
362 call->notify_rx = rxrpc_dummy_notify_rx; in rxrpc_kernel_end_call()
363 spin_unlock_bh(&call->notify_lock); in rxrpc_kernel_end_call()
366 mutex_unlock(&call->user_mutex); in rxrpc_kernel_end_call()
372 * rxrpc_kernel_check_life - Check to see whether a call is still alive
376 * Allow a kernel service to find out whether a call is still alive -
382 return call->state != RXRPC_CALL_COMPLETE; in rxrpc_kernel_check_life()
387 * rxrpc_kernel_get_epoch - Retrieve the epoch value from a call.
396 return call->conn->proto.epoch; in rxrpc_kernel_get_epoch()
401 * rxrpc_kernel_new_call_notification - Get notifications of new calls
413 struct rxrpc_sock *rx = rxrpc_sk(sock->sk); in rxrpc_kernel_new_call_notification() local
415 rx->notify_new_call = notify_new_call; in rxrpc_kernel_new_call_notification()
416 rx->discard_new_call = discard_new_call; in rxrpc_kernel_new_call_notification()
421 * rxrpc_kernel_set_max_life - Set maximum lifespan on a call
434 mutex_lock(&call->user_mutex); in rxrpc_kernel_set_max_life()
438 WRITE_ONCE(call->expect_term_by, hard_timeout); in rxrpc_kernel_set_max_life()
441 mutex_unlock(&call->user_mutex); in rxrpc_kernel_set_max_life()
447 * - this just targets it at a specific destination; no actual connection
454 struct rxrpc_sock *rx = rxrpc_sk(sock->sk); in rxrpc_connect() local
457 _enter("%p,%p,%d,%d", rx, addr, addr_len, flags); in rxrpc_connect()
459 ret = rxrpc_validate_address(rx, srx, addr_len); in rxrpc_connect()
465 lock_sock(&rx->sk); in rxrpc_connect()
467 ret = -EISCONN; in rxrpc_connect()
468 if (test_bit(RXRPC_SOCK_CONNECTED, &rx->flags)) in rxrpc_connect()
471 switch (rx->sk.sk_state) { in rxrpc_connect()
473 rx->sk.sk_state = RXRPC_CLIENT_UNBOUND; in rxrpc_connect()
478 ret = -EBUSY; in rxrpc_connect()
482 rx->connect_srx = *srx; in rxrpc_connect()
483 set_bit(RXRPC_SOCK_CONNECTED, &rx->flags); in rxrpc_connect()
487 release_sock(&rx->sk); in rxrpc_connect()
493 * - in a client this does a number of things:
494 * - finds/sets up a connection for the security specified (if any)
495 * - initiates a call (ID in control data)
496 * - ends the request phase of a call (if MSG_MORE is not set)
497 * - sends a call data packet
498 * - may send an abort (abort code in control data)
500 static int rxrpc_sendmsg(struct socket *sock, struct msghdr *m, size_t len) in rxrpc_sendmsg() argument
503 struct rxrpc_sock *rx = rxrpc_sk(sock->sk); in rxrpc_sendmsg() local
506 _enter(",{%d},,%zu", rx->sk.sk_state, len); in rxrpc_sendmsg()
508 if (m->msg_flags & MSG_OOB) in rxrpc_sendmsg()
509 return -EOPNOTSUPP; in rxrpc_sendmsg()
511 if (m->msg_name) { in rxrpc_sendmsg()
512 ret = rxrpc_validate_address(rx, m->msg_name, m->msg_namelen); in rxrpc_sendmsg()
519 lock_sock(&rx->sk); in rxrpc_sendmsg()
521 switch (rx->sk.sk_state) { in rxrpc_sendmsg()
524 rx->srx.srx_family = AF_RXRPC; in rxrpc_sendmsg()
525 rx->srx.srx_service = 0; in rxrpc_sendmsg()
526 rx->srx.transport_type = SOCK_DGRAM; in rxrpc_sendmsg()
527 rx->srx.transport.family = rx->family; in rxrpc_sendmsg()
528 switch (rx->family) { in rxrpc_sendmsg()
530 rx->srx.transport_len = sizeof(struct sockaddr_in); in rxrpc_sendmsg()
534 rx->srx.transport_len = sizeof(struct sockaddr_in6); in rxrpc_sendmsg()
538 ret = -EAFNOSUPPORT; in rxrpc_sendmsg()
541 local = rxrpc_lookup_local(sock_net(sock->sk), &rx->srx); in rxrpc_sendmsg()
547 rx->local = local; in rxrpc_sendmsg()
548 rx->sk.sk_state = RXRPC_CLIENT_BOUND; in rxrpc_sendmsg()
552 if (!m->msg_name && in rxrpc_sendmsg()
553 test_bit(RXRPC_SOCK_CONNECTED, &rx->flags)) { in rxrpc_sendmsg()
554 m->msg_name = &rx->connect_srx; in rxrpc_sendmsg()
555 m->msg_namelen = sizeof(rx->connect_srx); in rxrpc_sendmsg()
560 ret = rxrpc_do_sendmsg(rx, m, len); in rxrpc_sendmsg()
564 ret = -EINVAL; in rxrpc_sendmsg()
569 release_sock(&rx->sk); in rxrpc_sendmsg()
577 if (sk->sk_state != RXRPC_UNBOUND) in rxrpc_sock_set_min_security_level()
578 return -EISCONN; in rxrpc_sock_set_min_security_level()
580 return -EINVAL; in rxrpc_sock_set_min_security_level()
582 rxrpc_sk(sk)->min_sec_level = val; in rxrpc_sock_set_min_security_level()
594 struct rxrpc_sock *rx = rxrpc_sk(sock->sk); in rxrpc_setsockopt() local
601 lock_sock(&rx->sk); in rxrpc_setsockopt()
602 ret = -EOPNOTSUPP; in rxrpc_setsockopt()
607 ret = -EINVAL; in rxrpc_setsockopt()
610 ret = -EISCONN; in rxrpc_setsockopt()
611 if (rx->sk.sk_state != RXRPC_UNBOUND) in rxrpc_setsockopt()
613 rx->exclusive = true; in rxrpc_setsockopt()
617 ret = -EINVAL; in rxrpc_setsockopt()
618 if (rx->key) in rxrpc_setsockopt()
620 ret = -EISCONN; in rxrpc_setsockopt()
621 if (rx->sk.sk_state != RXRPC_UNBOUND) in rxrpc_setsockopt()
623 ret = rxrpc_request_key(rx, optval, optlen); in rxrpc_setsockopt()
627 ret = -EINVAL; in rxrpc_setsockopt()
628 if (rx->key) in rxrpc_setsockopt()
630 ret = -EISCONN; in rxrpc_setsockopt()
631 if (rx->sk.sk_state != RXRPC_UNBOUND) in rxrpc_setsockopt()
633 ret = rxrpc_server_keyring(rx, optval, optlen); in rxrpc_setsockopt()
637 ret = -EINVAL; in rxrpc_setsockopt()
640 ret = -EISCONN; in rxrpc_setsockopt()
641 if (rx->sk.sk_state != RXRPC_UNBOUND) in rxrpc_setsockopt()
647 ret = -EINVAL; in rxrpc_setsockopt()
650 rx->min_sec_level = min_sec_level; in rxrpc_setsockopt()
654 ret = -EINVAL; in rxrpc_setsockopt()
656 rx->service_upgrade.from != 0) in rxrpc_setsockopt()
658 ret = -EISCONN; in rxrpc_setsockopt()
659 if (rx->sk.sk_state != RXRPC_SERVER_BOUND2) in rxrpc_setsockopt()
661 ret = -EFAULT; in rxrpc_setsockopt()
665 ret = -EINVAL; in rxrpc_setsockopt()
666 if ((service_upgrade[0] != rx->srx.srx_service || in rxrpc_setsockopt()
667 service_upgrade[1] != rx->second_service) && in rxrpc_setsockopt()
668 (service_upgrade[0] != rx->second_service || in rxrpc_setsockopt()
669 service_upgrade[1] != rx->srx.srx_service)) in rxrpc_setsockopt()
671 rx->service_upgrade.from = service_upgrade[0]; in rxrpc_setsockopt()
672 rx->service_upgrade.to = service_upgrade[1]; in rxrpc_setsockopt()
683 release_sock(&rx->sk); in rxrpc_setsockopt()
696 return -EOPNOTSUPP; in rxrpc_getsockopt()
699 return -EFAULT; in rxrpc_getsockopt()
704 return -ETOOSMALL; in rxrpc_getsockopt()
705 if (put_user(RXRPC__SUPPORTED - 1, (int __user *)optval) || in rxrpc_getsockopt()
707 return -EFAULT; in rxrpc_getsockopt()
711 return -EOPNOTSUPP; in rxrpc_getsockopt()
721 struct sock *sk = sock->sk; in rxrpc_poll()
722 struct rxrpc_sock *rx = rxrpc_sk(sk); in rxrpc_poll() local
728 /* the socket is readable if there are any messages waiting on the Rx in rxrpc_poll()
730 if (!list_empty(&rx->recvmsg_q)) in rxrpc_poll()
749 struct rxrpc_sock *rx; in rxrpc_create() local
757 return -EPROTONOSUPPORT; in rxrpc_create()
759 if (sock->type != SOCK_DGRAM) in rxrpc_create()
760 return -ESOCKTNOSUPPORT; in rxrpc_create()
762 sock->ops = &rxrpc_rpc_ops; in rxrpc_create()
763 sock->state = SS_UNCONNECTED; in rxrpc_create()
767 return -ENOMEM; in rxrpc_create()
771 sk->sk_state = RXRPC_UNBOUND; in rxrpc_create()
772 sk->sk_write_space = rxrpc_write_space; in rxrpc_create()
773 sk->sk_max_ack_backlog = 0; in rxrpc_create()
774 sk->sk_destruct = rxrpc_sock_destructor; in rxrpc_create()
776 rx = rxrpc_sk(sk); in rxrpc_create()
777 rx->family = protocol; in rxrpc_create()
778 rx->calls = RB_ROOT; in rxrpc_create()
780 spin_lock_init(&rx->incoming_lock); in rxrpc_create()
781 INIT_LIST_HEAD(&rx->sock_calls); in rxrpc_create()
782 INIT_LIST_HEAD(&rx->to_be_accepted); in rxrpc_create()
783 INIT_LIST_HEAD(&rx->recvmsg_q); in rxrpc_create()
784 rwlock_init(&rx->recvmsg_lock); in rxrpc_create()
785 rwlock_init(&rx->call_lock); in rxrpc_create()
786 memset(&rx->srx, 0, sizeof(rx->srx)); in rxrpc_create()
788 rxnet = rxrpc_net(sock_net(&rx->sk)); in rxrpc_create()
789 timer_reduce(&rxnet->peer_keepalive_timer, jiffies + 1); in rxrpc_create()
791 _leave(" = 0 [%p]", rx); in rxrpc_create()
800 struct sock *sk = sock->sk; in rxrpc_shutdown()
801 struct rxrpc_sock *rx = rxrpc_sk(sk); in rxrpc_shutdown() local
807 return -EOPNOTSUPP; in rxrpc_shutdown()
808 if (sk->sk_state == RXRPC_CLOSE) in rxrpc_shutdown()
809 return -ESHUTDOWN; in rxrpc_shutdown()
813 spin_lock_bh(&sk->sk_receive_queue.lock); in rxrpc_shutdown()
814 if (sk->sk_state < RXRPC_CLOSE) { in rxrpc_shutdown()
815 sk->sk_state = RXRPC_CLOSE; in rxrpc_shutdown()
816 sk->sk_shutdown = SHUTDOWN_MASK; in rxrpc_shutdown()
818 ret = -ESHUTDOWN; in rxrpc_shutdown()
820 spin_unlock_bh(&sk->sk_receive_queue.lock); in rxrpc_shutdown()
822 rxrpc_discard_prealloc(rx); in rxrpc_shutdown()
835 rxrpc_purge_queue(&sk->sk_receive_queue); in rxrpc_sock_destructor()
837 WARN_ON(refcount_read(&sk->sk_wmem_alloc)); in rxrpc_sock_destructor()
839 WARN_ON(sk->sk_socket); in rxrpc_sock_destructor()
852 struct rxrpc_sock *rx = rxrpc_sk(sk); in rxrpc_release_sock() local
854 _enter("%p{%d,%d}", sk, sk->sk_state, refcount_read(&sk->sk_refcnt)); in rxrpc_release_sock()
858 sk->sk_shutdown = SHUTDOWN_MASK; in rxrpc_release_sock()
864 switch (sk->sk_state) { in rxrpc_release_sock()
869 rx->local->service_closed = true; in rxrpc_release_sock()
873 spin_lock_bh(&sk->sk_receive_queue.lock); in rxrpc_release_sock()
874 sk->sk_state = RXRPC_CLOSE; in rxrpc_release_sock()
875 spin_unlock_bh(&sk->sk_receive_queue.lock); in rxrpc_release_sock()
877 if (rx->local && rcu_access_pointer(rx->local->service) == rx) { in rxrpc_release_sock()
878 write_lock(&rx->local->services_lock); in rxrpc_release_sock()
879 rcu_assign_pointer(rx->local->service, NULL); in rxrpc_release_sock()
880 write_unlock(&rx->local->services_lock); in rxrpc_release_sock()
884 rxrpc_discard_prealloc(rx); in rxrpc_release_sock()
885 rxrpc_release_calls_on_socket(rx); in rxrpc_release_sock()
887 rxrpc_purge_queue(&sk->sk_receive_queue); in rxrpc_release_sock()
889 rxrpc_unuse_local(rx->local); in rxrpc_release_sock()
890 rxrpc_put_local(rx->local); in rxrpc_release_sock()
891 rx->local = NULL; in rxrpc_release_sock()
892 key_put(rx->key); in rxrpc_release_sock()
893 rx->key = NULL; in rxrpc_release_sock()
894 key_put(rx->securities); in rxrpc_release_sock()
895 rx->securities = NULL; in rxrpc_release_sock()
907 struct sock *sk = sock->sk; in rxrpc_release()
914 sock->sk = NULL; in rxrpc_release()
961 int ret = -1; in af_rxrpc_init()
972 ret = -ENOMEM; in af_rxrpc_init()