Lines Matching +full:rpc +full:- +full:if
1 // SPDX-License-Identifier: GPL-2.0
5 * Client-side transport implementation for sockets.
166 * Wait duration for a reply from the RPC portmapper.
171 * Delay if a UDP socket connect error occurs. This is most likely some
183 * increase over time if the server is down or not responding.
188 * TCP idle timeout; client drops the transport socket if it is idle
190 * holding port numbers when there is no RPC traffic.
199 #if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
210 dprintk("RPC: %s\n", msg); in xs_pktdump()
212 if (!(j & 31)) { in xs_pktdump()
213 if (j) in xs_pktdump()
231 return (struct rpc_xprt *) sk->sk_user_data; in xprt_from_sock()
236 return (struct sockaddr *) &xprt->addr; in xs_addr()
241 return (struct sockaddr_un *) &xprt->addr; in xs_addr_un()
246 return (struct sockaddr_in *) &xprt->addr; in xs_addr_in()
251 return (struct sockaddr_in6 *) &xprt->addr; in xs_addr_in6()
262 switch (sap->sa_family) { in xs_format_common_peer_addresses()
265 if (sun->sun_path[0]) { in xs_format_common_peer_addresses()
266 strscpy(buf, sun->sun_path, sizeof(buf)); in xs_format_common_peer_addresses()
269 strscpy(buf+1, sun->sun_path+1, sizeof(buf)-1); in xs_format_common_peer_addresses()
271 xprt->address_strings[RPC_DISPLAY_ADDR] = in xs_format_common_peer_addresses()
276 xprt->address_strings[RPC_DISPLAY_ADDR] = in xs_format_common_peer_addresses()
279 snprintf(buf, sizeof(buf), "%08x", ntohl(sin->sin_addr.s_addr)); in xs_format_common_peer_addresses()
283 xprt->address_strings[RPC_DISPLAY_ADDR] = in xs_format_common_peer_addresses()
286 snprintf(buf, sizeof(buf), "%pi6", &sin6->sin6_addr); in xs_format_common_peer_addresses()
292 xprt->address_strings[RPC_DISPLAY_HEX_ADDR] = kstrdup(buf, GFP_KERNEL); in xs_format_common_peer_addresses()
301 xprt->address_strings[RPC_DISPLAY_PORT] = kstrdup(buf, GFP_KERNEL); in xs_format_common_peer_ports()
304 xprt->address_strings[RPC_DISPLAY_HEX_PORT] = kstrdup(buf, GFP_KERNEL); in xs_format_common_peer_ports()
311 xprt->address_strings[RPC_DISPLAY_PROTO] = protocol; in xs_format_peer_addresses()
312 xprt->address_strings[RPC_DISPLAY_NETID] = netid; in xs_format_peer_addresses()
319 kfree(xprt->address_strings[RPC_DISPLAY_HEX_PORT]); in xs_update_peer_port()
320 kfree(xprt->address_strings[RPC_DISPLAY_PORT]); in xs_update_peer_port()
335 kfree(xprt->address_strings[i]); in xs_free_peer_addresses()
344 if (!want || !(buf->flags & XDRBUF_SPARSE_PAGES)) in xs_alloc_sparse_pages()
346 n = (buf->page_base + want + PAGE_SIZE - 1) >> PAGE_SHIFT; in xs_alloc_sparse_pages()
348 if (buf->pages[i]) in xs_alloc_sparse_pages()
350 buf->bvec[i].bv_page = buf->pages[i] = alloc_page(gfp); in xs_alloc_sparse_pages()
351 if (!buf->pages[i]) { in xs_alloc_sparse_pages()
353 return i > buf->page_base ? i - buf->page_base : 0; in xs_alloc_sparse_pages()
363 u8 content_type = tls_get_record_type(sock->sk, cmsg); in xs_sock_process_cmsg()
377 tls_alert_recv(sock->sk, msg, &level, &description); in xs_sock_process_cmsg()
379 -EACCES : -EAGAIN; in xs_sock_process_cmsg()
383 ret = -EAGAIN; in xs_sock_process_cmsg()
410 if (ret > 0) { in xs_sock_recv_cmsg()
411 if (tls_get_record_type(sock->sk, &u.cmsg) == TLS_RECORD_TYPE_ALERT) in xs_sock_recv_cmsg()
414 -EAGAIN); in xs_sock_recv_cmsg()
423 if (seek != 0) in xs_sock_recvmsg()
424 iov_iter_advance(&msg->msg_iter, seek); in xs_sock_recvmsg()
427 if (msg->msg_flags & MSG_CTRUNC) { in xs_sock_recvmsg()
428 msg->msg_flags &= ~(MSG_CTRUNC | MSG_EOR); in xs_sock_recvmsg()
429 if (ret == 0 || ret == -EIO) in xs_sock_recvmsg()
430 ret = xs_sock_recv_cmsg(sock, &msg->msg_flags, flags); in xs_sock_recvmsg()
439 iov_iter_kvec(&msg->msg_iter, ITER_DEST, kvec, 1, count); in xs_read_kvec()
448 iov_iter_bvec(&msg->msg_iter, ITER_DEST, bvec, nr, count); in xs_read_bvec()
456 iov_iter_discard(&msg->msg_iter, ITER_DEST, count); in xs_read_discard()
460 #if ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE
487 want = min_t(size_t, count, buf->head[0].iov_len); in xs_read_xdr_buf()
488 if (seek < want) { in xs_read_xdr_buf()
489 ret = xs_read_kvec(sock, msg, flags, &buf->head[0], want, seek); in xs_read_xdr_buf()
490 if (ret <= 0) in xs_read_xdr_buf()
493 if (offset == count || msg->msg_flags & (MSG_EOR|MSG_TRUNC)) in xs_read_xdr_buf()
495 if (ret != want) in xs_read_xdr_buf()
499 seek -= want; in xs_read_xdr_buf()
504 buf, min_t(size_t, count - offset, buf->page_len), in xs_read_xdr_buf()
506 if (seek < want) { in xs_read_xdr_buf()
507 ret = xs_read_bvec(sock, msg, flags, buf->bvec, in xs_read_xdr_buf()
509 want + buf->page_base, in xs_read_xdr_buf()
510 seek + buf->page_base); in xs_read_xdr_buf()
511 if (ret <= 0) in xs_read_xdr_buf()
513 xs_flush_bvec(buf->bvec, ret, seek + buf->page_base); in xs_read_xdr_buf()
514 ret -= buf->page_base; in xs_read_xdr_buf()
516 if (offset == count || msg->msg_flags & (MSG_EOR|MSG_TRUNC)) in xs_read_xdr_buf()
518 if (ret != want) in xs_read_xdr_buf()
522 seek -= want; in xs_read_xdr_buf()
526 want = min_t(size_t, count - offset, buf->tail[0].iov_len); in xs_read_xdr_buf()
527 if (seek < want) { in xs_read_xdr_buf()
528 ret = xs_read_kvec(sock, msg, flags, &buf->tail[0], want, seek); in xs_read_xdr_buf()
529 if (ret <= 0) in xs_read_xdr_buf()
532 if (offset == count || msg->msg_flags & (MSG_EOR|MSG_TRUNC)) in xs_read_xdr_buf()
534 if (ret != want) in xs_read_xdr_buf()
536 } else if (offset < seek_init) in xs_read_xdr_buf()
538 ret = -EMSGSIZE; in xs_read_xdr_buf()
540 *read = offset - seek_init; in xs_read_xdr_buf()
550 if (!transport->recv.copied) { in xs_read_header()
551 if (buf->head[0].iov_len >= transport->recv.offset) in xs_read_header()
552 memcpy(buf->head[0].iov_base, in xs_read_header()
553 &transport->recv.xid, in xs_read_header()
554 transport->recv.offset); in xs_read_header()
555 transport->recv.copied = transport->recv.offset; in xs_read_header()
562 return transport->recv.fraghdr & cpu_to_be32(RPC_LAST_STREAM_FRAGMENT); in xs_read_stream_request_done()
569 if (xs_read_stream_request_done(transport)) in xs_read_stream_check_eor()
570 msg->msg_flags |= MSG_EOR; in xs_read_stream_check_eor()
577 struct xdr_buf *buf = &req->rq_private_buf; in xs_read_stream_request()
583 want = transport->recv.len - transport->recv.offset; in xs_read_stream_request()
584 if (want != 0) { in xs_read_stream_request()
585 ret = xs_read_xdr_buf(transport->sock, msg, flags, buf, in xs_read_stream_request()
586 transport->recv.copied + want, in xs_read_stream_request()
587 transport->recv.copied, in xs_read_stream_request()
589 transport->recv.offset += read; in xs_read_stream_request()
590 transport->recv.copied += read; in xs_read_stream_request()
593 if (transport->recv.offset == transport->recv.len) in xs_read_stream_request()
596 if (want == 0) in xs_read_stream_request()
602 case -EFAULT: in xs_read_stream_request()
603 case -EMSGSIZE: in xs_read_stream_request()
604 msg->msg_flags |= MSG_TRUNC; in xs_read_stream_request()
607 return -ESHUTDOWN; in xs_read_stream_request()
615 if (isfrag) in xs_read_stream_headersize()
625 .iov_base = &transport->recv.fraghdr, in xs_read_stream_header()
628 return xs_read_kvec(transport->sock, msg, flags, &kvec, want, seek); in xs_read_stream_header()
631 #if defined(CONFIG_SUNRPC_BACKCHANNEL)
635 struct rpc_xprt *xprt = &transport->xprt; in xs_read_stream_call()
640 if (!xprt->bc_serv) in xs_read_stream_call()
641 return -ESHUTDOWN; in xs_read_stream_call()
644 req = xprt_lookup_bc_request(xprt, transport->recv.xid); in xs_read_stream_call()
645 if (!req) { in xs_read_stream_call()
647 return -ESHUTDOWN; in xs_read_stream_call()
649 if (transport->recv.copied && !req->rq_private_buf.len) in xs_read_stream_call()
650 return -ESHUTDOWN; in xs_read_stream_call()
653 if (msg->msg_flags & (MSG_EOR|MSG_TRUNC)) in xs_read_stream_call()
654 xprt_complete_bc_request(req, transport->recv.copied); in xs_read_stream_call()
656 req->rq_private_buf.len = transport->recv.copied; in xs_read_stream_call()
664 return -ESHUTDOWN; in xs_read_stream_call()
671 struct rpc_xprt *xprt = &transport->xprt; in xs_read_stream_reply()
676 spin_lock(&xprt->queue_lock); in xs_read_stream_reply()
677 req = xprt_lookup_rqst(xprt, transport->recv.xid); in xs_read_stream_reply()
678 if (!req || (transport->recv.copied && !req->rq_private_buf.len)) { in xs_read_stream_reply()
679 msg->msg_flags |= MSG_TRUNC; in xs_read_stream_reply()
683 spin_unlock(&xprt->queue_lock); in xs_read_stream_reply()
687 spin_lock(&xprt->queue_lock); in xs_read_stream_reply()
688 if (msg->msg_flags & (MSG_EOR|MSG_TRUNC)) in xs_read_stream_reply()
689 xprt_complete_rqst(req->rq_task, transport->recv.copied); in xs_read_stream_reply()
691 req->rq_private_buf.len = transport->recv.copied; in xs_read_stream_reply()
694 spin_unlock(&xprt->queue_lock); in xs_read_stream_reply()
705 if (transport->recv.len == 0) { in xs_read_stream()
706 want = xs_read_stream_headersize(transport->recv.copied != 0); in xs_read_stream()
708 transport->recv.offset); in xs_read_stream()
709 if (ret <= 0) in xs_read_stream()
711 transport->recv.offset = ret; in xs_read_stream()
712 if (transport->recv.offset != want) in xs_read_stream()
713 return transport->recv.offset; in xs_read_stream()
714 transport->recv.len = be32_to_cpu(transport->recv.fraghdr) & in xs_read_stream()
716 transport->recv.offset -= sizeof(transport->recv.fraghdr); in xs_read_stream()
720 switch (be32_to_cpu(transport->recv.calldir)) { in xs_read_stream()
730 if (msg.msg_flags & MSG_TRUNC) { in xs_read_stream()
731 transport->recv.calldir = cpu_to_be32(-1); in xs_read_stream()
732 transport->recv.copied = -1; in xs_read_stream()
734 if (ret < 0) in xs_read_stream()
737 if (transport->recv.offset < transport->recv.len) { in xs_read_stream()
738 if (!(msg.msg_flags & MSG_TRUNC)) in xs_read_stream()
741 ret = xs_read_discard(transport->sock, &msg, flags, in xs_read_stream()
742 transport->recv.len - transport->recv.offset); in xs_read_stream()
743 if (ret <= 0) in xs_read_stream()
745 transport->recv.offset += ret; in xs_read_stream()
747 if (transport->recv.offset != transport->recv.len) in xs_read_stream()
750 if (xs_read_stream_request_done(transport)) { in xs_read_stream()
752 transport->recv.copied = 0; in xs_read_stream()
754 transport->recv.offset = 0; in xs_read_stream()
755 transport->recv.len = 0; in xs_read_stream()
758 return ret != 0 ? ret : -ESHUTDOWN; in xs_read_stream()
763 return transport->sock->ops->poll(transport->file, transport->sock, in xs_poll_socket()
777 clear_bit(XPRT_SOCK_DATA_READY, &transport->sock_state); in xs_poll_check_readable()
778 if (test_bit(XPRT_SOCK_IGNORE_RECV, &transport->sock_state)) in xs_poll_check_readable()
780 if (!xs_poll_socket_readable(transport)) in xs_poll_check_readable()
782 if (!test_and_set_bit(XPRT_SOCK_DATA_READY, &transport->sock_state)) in xs_poll_check_readable()
783 queue_work(xprtiod_workqueue, &transport->recv_worker); in xs_poll_check_readable()
791 mutex_lock(&transport->recv_mutex); in xs_stream_data_receive()
792 if (transport->sock == NULL) in xs_stream_data_receive()
796 if (ret < 0) in xs_stream_data_receive()
801 if (ret == -ESHUTDOWN) in xs_stream_data_receive()
802 kernel_sock_shutdown(transport->sock, SHUT_RDWR); in xs_stream_data_receive()
803 else if (ret == -EACCES) in xs_stream_data_receive()
804 xprt_wake_pending_tasks(&transport->xprt, -EACCES); in xs_stream_data_receive()
808 mutex_unlock(&transport->recv_mutex); in xs_stream_data_receive()
809 trace_xs_stream_read_data(&transport->xprt, ret, read); in xs_stream_data_receive()
825 transport->recv.offset = 0; in xs_stream_reset_connect()
826 transport->recv.len = 0; in xs_stream_reset_connect()
827 transport->recv.copied = 0; in xs_stream_reset_connect()
828 transport->xmit.offset = 0; in xs_stream_reset_connect()
834 transport->xprt.stat.connect_count++; in xs_stream_start_connect()
835 transport->xprt.stat.connect_start = jiffies; in xs_stream_start_connect()
841 * xs_nospace - handle transmit was incomplete
842 * @req: pointer to RPC request
848 struct rpc_xprt *xprt = &transport->xprt; in xs_nospace()
849 struct sock *sk = transport->inet; in xs_nospace()
850 int ret = -EAGAIN; in xs_nospace()
855 spin_lock(&xprt->transport_lock); in xs_nospace()
858 if (xprt_connected(xprt)) { in xs_nospace()
860 set_bit(XPRT_SOCK_NOSPACE, &transport->sock_state); in xs_nospace()
861 set_bit(SOCK_NOSPACE, &sk->sk_socket->flags); in xs_nospace()
862 sk->sk_write_pending++; in xs_nospace()
865 ret = -ENOTCONN; in xs_nospace()
867 spin_unlock(&xprt->transport_lock); in xs_nospace()
874 container_of(req->rq_xprt, struct sock_xprt, xprt); in xs_sock_nospace()
875 struct sock *sk = transport->inet; in xs_sock_nospace()
876 int ret = -EAGAIN; in xs_sock_nospace()
879 if (!sock_writeable(sk)) in xs_sock_nospace()
888 container_of(req->rq_xprt, struct sock_xprt, xprt); in xs_stream_nospace()
889 struct sock *sk = transport->inet; in xs_stream_nospace()
890 int ret = -EAGAIN; in xs_stream_nospace()
892 if (vm_wait) in xs_stream_nospace()
893 return -ENOBUFS; in xs_stream_nospace()
895 if (!sk_stream_memory_free(sk)) in xs_stream_nospace()
908 struct rpc_xprt *xprt = req->rq_xprt; in xs_stream_abort_send_request()
912 if (transport->xmit.offset != 0 && in xs_stream_abort_send_request()
913 !test_bit(XPRT_CLOSE_WAIT, &xprt->state)) in xs_stream_abort_send_request()
918 * Determine if the previous message in the stream was aborted before it
924 return transport->xmit.offset != 0 && req->rq_bytes_sent == 0; in xs_send_request_was_aborted()
928 * Return the stream record marker field for a record of length < 2^31-1
933 if (!xdr->len) in xs_stream_record_marker()
935 return cpu_to_be32(RPC_LAST_STREAM_FRAGMENT | (u32)xdr->len); in xs_stream_record_marker()
939 * xs_local_send_request - write an RPC request to an AF_LOCAL socket
940 * @req: pointer to RPC request
951 struct rpc_xprt *xprt = req->rq_xprt; in xs_local_send_request()
954 struct xdr_buf *xdr = &req->rq_snd_buf; in xs_local_send_request()
956 unsigned int msglen = rm ? req->rq_slen + sizeof(rm) : req->rq_slen; in xs_local_send_request()
964 /* Close the stream if the previous transmission was incomplete */ in xs_local_send_request()
965 if (xs_send_request_was_aborted(transport, req)) { in xs_local_send_request()
967 return -ENOTCONN; in xs_local_send_request()
971 req->rq_svec->iov_base, req->rq_svec->iov_len); in xs_local_send_request()
973 vm_wait = sk_stream_is_writeable(transport->inet) ? true : false; in xs_local_send_request()
975 req->rq_xtime = ktime_get(); in xs_local_send_request()
976 status = xprt_sock_sendmsg(transport->sock, &msg, xdr, in xs_local_send_request()
977 transport->xmit.offset, rm, &sent); in xs_local_send_request()
978 dprintk("RPC: %s(%u) = %d\n", in xs_local_send_request()
979 __func__, xdr->len - transport->xmit.offset, status); in xs_local_send_request()
981 if (likely(sent > 0) || status == 0) { in xs_local_send_request()
982 transport->xmit.offset += sent; in xs_local_send_request()
983 req->rq_bytes_sent = transport->xmit.offset; in xs_local_send_request()
984 if (likely(req->rq_bytes_sent >= msglen)) { in xs_local_send_request()
985 req->rq_xmit_bytes_sent += transport->xmit.offset; in xs_local_send_request()
986 transport->xmit.offset = 0; in xs_local_send_request()
989 status = -EAGAIN; in xs_local_send_request()
994 case -EAGAIN: in xs_local_send_request()
998 dprintk("RPC: sendmsg returned unrecognized error %d\n", in xs_local_send_request()
999 -status); in xs_local_send_request()
1001 case -EPIPE: in xs_local_send_request()
1003 status = -ENOTCONN; in xs_local_send_request()
1010 * xs_udp_send_request - write an RPC request to a UDP socket
1011 * @req: pointer to RPC request
1022 struct rpc_xprt *xprt = req->rq_xprt; in xs_udp_send_request()
1024 struct xdr_buf *xdr = &req->rq_snd_buf; in xs_udp_send_request()
1027 .msg_namelen = xprt->addrlen, in xs_udp_send_request()
1034 req->rq_svec->iov_base, in xs_udp_send_request()
1035 req->rq_svec->iov_len); in xs_udp_send_request()
1037 if (!xprt_bound(xprt)) in xs_udp_send_request()
1038 return -ENOTCONN; in xs_udp_send_request()
1040 if (!xprt_request_get_cong(xprt, req)) in xs_udp_send_request()
1041 return -EBADSLT; in xs_udp_send_request()
1044 if (status < 0) in xs_udp_send_request()
1046 req->rq_xtime = ktime_get(); in xs_udp_send_request()
1047 status = xprt_sock_sendmsg(transport->sock, &msg, xdr, 0, 0, &sent); in xs_udp_send_request()
1049 dprintk("RPC: xs_udp_send_request(%u) = %d\n", in xs_udp_send_request()
1050 xdr->len, status); in xs_udp_send_request()
1052 /* firewall is blocking us, don't return -EAGAIN or we end up looping */ in xs_udp_send_request()
1053 if (status == -EPERM) in xs_udp_send_request()
1056 if (status == -EAGAIN && sock_writeable(transport->inet)) in xs_udp_send_request()
1057 status = -ENOBUFS; in xs_udp_send_request()
1059 if (sent > 0 || status == 0) { in xs_udp_send_request()
1060 req->rq_xmit_bytes_sent += sent; in xs_udp_send_request()
1061 if (sent >= req->rq_slen) in xs_udp_send_request()
1064 status = -EAGAIN; in xs_udp_send_request()
1069 case -ENOTSOCK: in xs_udp_send_request()
1070 status = -ENOTCONN; in xs_udp_send_request()
1073 case -EAGAIN: in xs_udp_send_request()
1076 case -ENETUNREACH: in xs_udp_send_request()
1077 case -ENOBUFS: in xs_udp_send_request()
1078 case -EPIPE: in xs_udp_send_request()
1079 case -ECONNREFUSED: in xs_udp_send_request()
1080 case -EPERM: in xs_udp_send_request()
1085 dprintk("RPC: sendmsg returned unrecognized error %d\n", in xs_udp_send_request()
1086 -status); in xs_udp_send_request()
1093 * xs_tcp_send_request - write an RPC request to a TCP socket
1094 * @req: pointer to RPC request
1104 * if sendmsg is not able to make progress?
1108 struct rpc_xprt *xprt = req->rq_xprt; in xs_tcp_send_request()
1110 struct xdr_buf *xdr = &req->rq_snd_buf; in xs_tcp_send_request()
1112 unsigned int msglen = rm ? req->rq_slen + sizeof(rm) : req->rq_slen; in xs_tcp_send_request()
1120 /* Close the stream if the previous transmission was incomplete */ in xs_tcp_send_request()
1121 if (xs_send_request_was_aborted(transport, req)) { in xs_tcp_send_request()
1122 if (transport->sock != NULL) in xs_tcp_send_request()
1123 kernel_sock_shutdown(transport->sock, SHUT_RDWR); in xs_tcp_send_request()
1124 return -ENOTCONN; in xs_tcp_send_request()
1126 if (!transport->inet) in xs_tcp_send_request()
1127 return -ENOTCONN; in xs_tcp_send_request()
1130 req->rq_svec->iov_base, in xs_tcp_send_request()
1131 req->rq_svec->iov_len); in xs_tcp_send_request()
1133 if (test_bit(XPRT_SOCK_UPD_TIMEOUT, &transport->sock_state)) in xs_tcp_send_request()
1134 xs_tcp_set_socket_timeouts(xprt, transport->sock); in xs_tcp_send_request()
1136 xs_set_srcport(transport, transport->sock); in xs_tcp_send_request()
1141 req->rq_xtime = ktime_get(); in xs_tcp_send_request()
1142 tcp_sock_set_cork(transport->inet, true); in xs_tcp_send_request()
1144 vm_wait = sk_stream_is_writeable(transport->inet) ? true : false; in xs_tcp_send_request()
1147 status = xprt_sock_sendmsg(transport->sock, &msg, xdr, in xs_tcp_send_request()
1148 transport->xmit.offset, rm, &sent); in xs_tcp_send_request()
1150 dprintk("RPC: xs_tcp_send_request(%u) = %d\n", in xs_tcp_send_request()
1151 xdr->len - transport->xmit.offset, status); in xs_tcp_send_request()
1153 /* If we've sent the entire packet, immediately in xs_tcp_send_request()
1155 transport->xmit.offset += sent; in xs_tcp_send_request()
1156 req->rq_bytes_sent = transport->xmit.offset; in xs_tcp_send_request()
1157 if (likely(req->rq_bytes_sent >= msglen)) { in xs_tcp_send_request()
1158 req->rq_xmit_bytes_sent += transport->xmit.offset; in xs_tcp_send_request()
1159 transport->xmit.offset = 0; in xs_tcp_send_request()
1160 if (atomic_long_read(&xprt->xmit_queuelen) == 1) in xs_tcp_send_request()
1161 tcp_sock_set_cork(transport->inet, false); in xs_tcp_send_request()
1167 if (sent > 0) in xs_tcp_send_request()
1173 case -ENOTSOCK: in xs_tcp_send_request()
1174 status = -ENOTCONN; in xs_tcp_send_request()
1177 case -EAGAIN: in xs_tcp_send_request()
1180 case -ECONNRESET: in xs_tcp_send_request()
1181 case -ECONNREFUSED: in xs_tcp_send_request()
1182 case -ENOTCONN: in xs_tcp_send_request()
1183 case -EADDRINUSE: in xs_tcp_send_request()
1184 case -ENOBUFS: in xs_tcp_send_request()
1185 case -EPIPE: in xs_tcp_send_request()
1188 dprintk("RPC: sendmsg returned unrecognized error %d\n", in xs_tcp_send_request()
1189 -status); in xs_tcp_send_request()
1197 transport->old_data_ready = sk->sk_data_ready; in xs_save_old_callbacks()
1198 transport->old_state_change = sk->sk_state_change; in xs_save_old_callbacks()
1199 transport->old_write_space = sk->sk_write_space; in xs_save_old_callbacks()
1200 transport->old_error_report = sk->sk_error_report; in xs_save_old_callbacks()
1205 sk->sk_data_ready = transport->old_data_ready; in xs_restore_old_callbacks()
1206 sk->sk_state_change = transport->old_state_change; in xs_restore_old_callbacks()
1207 sk->sk_write_space = transport->old_write_space; in xs_restore_old_callbacks()
1208 sk->sk_error_report = transport->old_error_report; in xs_restore_old_callbacks()
1215 transport->xprt_err = 0; in xs_sock_reset_state_flags()
1216 clear_bit(XPRT_SOCK_DATA_READY, &transport->sock_state); in xs_sock_reset_state_flags()
1217 clear_bit(XPRT_SOCK_WAKE_ERROR, &transport->sock_state); in xs_sock_reset_state_flags()
1218 clear_bit(XPRT_SOCK_WAKE_WRITE, &transport->sock_state); in xs_sock_reset_state_flags()
1219 clear_bit(XPRT_SOCK_WAKE_DISCONNECT, &transport->sock_state); in xs_sock_reset_state_flags()
1220 clear_bit(XPRT_SOCK_NOSPACE, &transport->sock_state); in xs_sock_reset_state_flags()
1221 clear_bit(XPRT_SOCK_UPD_TIMEOUT, &transport->sock_state); in xs_sock_reset_state_flags()
1226 set_bit(nr, &transport->sock_state); in xs_run_error_worker()
1227 queue_work(xprtiod_workqueue, &transport->error_worker); in xs_run_error_worker()
1232 xprt->connect_cookie++; in xs_sock_reset_connection_flags()
1234 clear_bit(XPRT_CLOSE_WAIT, &xprt->state); in xs_sock_reset_connection_flags()
1235 clear_bit(XPRT_CLOSING, &xprt->state); in xs_sock_reset_connection_flags()
1241 * xs_error_report - callback to handle TCP socket state errors
1245 * using the socket, and so we don't want to clear sk->sk_err.
1252 if (!(xprt = xprt_from_sock(sk))) in xs_error_report()
1256 transport->xprt_err = -sk->sk_err; in xs_error_report()
1257 if (transport->xprt_err == 0) in xs_error_report()
1259 dprintk("RPC: xs_error_report client %p, error=%d...\n", in xs_error_report()
1260 xprt, -transport->xprt_err); in xs_error_report()
1261 trace_rpc_socket_error(xprt, sk->sk_socket, transport->xprt_err); in xs_error_report()
1270 struct socket *sock = transport->sock; in xs_reset_transport()
1271 struct sock *sk = transport->inet; in xs_reset_transport()
1272 struct rpc_xprt *xprt = &transport->xprt; in xs_reset_transport()
1273 struct file *filp = transport->file; in xs_reset_transport()
1275 if (sk == NULL) in xs_reset_transport()
1282 if (!(current->flags & PF_WQ_WORKER)) { in xs_reset_transport()
1284 set_bit(XPRT_CLOSE_WAIT, &xprt->state); in xs_reset_transport()
1288 if (atomic_read(&transport->xprt.swapper)) in xs_reset_transport()
1295 mutex_lock(&transport->recv_mutex); in xs_reset_transport()
1297 transport->inet = NULL; in xs_reset_transport()
1298 transport->sock = NULL; in xs_reset_transport()
1299 transport->file = NULL; in xs_reset_transport()
1301 sk->sk_user_data = NULL; in xs_reset_transport()
1302 sk->sk_sndtimeo = 0; in xs_reset_transport()
1310 mutex_unlock(&transport->recv_mutex); in xs_reset_transport()
1319 * xs_close - close a socket
1332 dprintk("RPC: xs_close xprt %p\n", xprt); in xs_close()
1334 if (transport->sock) in xs_close()
1335 tls_handshake_close(transport->sock); in xs_close()
1337 xprt->reestablish_timeout = 0; in xs_close()
1342 dprintk("RPC: injecting transport disconnect on xprt=%p\n", in xs_inject_disconnect()
1354 * xs_destroy - prepare to shutdown a transport
1362 dprintk("RPC: xs_destroy xprt %p\n", xprt); in xs_destroy()
1364 cancel_delayed_work_sync(&transport->connect_worker); in xs_destroy()
1366 cancel_work_sync(&transport->recv_worker); in xs_destroy()
1367 cancel_work_sync(&transport->error_worker); in xs_destroy()
1373 * xs_udp_data_read_skb - receive callback for UDP sockets
1389 repsize = skb->len; in xs_udp_data_read_skb()
1390 if (repsize < 4) { in xs_udp_data_read_skb()
1391 dprintk("RPC: impossible RPC reply size %d!\n", repsize); in xs_udp_data_read_skb()
1397 if (xp == NULL) in xs_udp_data_read_skb()
1401 spin_lock(&xprt->queue_lock); in xs_udp_data_read_skb()
1403 if (!rovr) in xs_udp_data_read_skb()
1406 xprt_update_rtt(rovr->rq_task); in xs_udp_data_read_skb()
1407 spin_unlock(&xprt->queue_lock); in xs_udp_data_read_skb()
1408 task = rovr->rq_task; in xs_udp_data_read_skb()
1410 if ((copied = rovr->rq_private_buf.buflen) > repsize) in xs_udp_data_read_skb()
1413 /* Suck it into the iovec, verify checksum if not done by hw. */ in xs_udp_data_read_skb()
1414 if (csum_partial_copy_to_xdr(&rovr->rq_private_buf, skb)) { in xs_udp_data_read_skb()
1415 spin_lock(&xprt->queue_lock); in xs_udp_data_read_skb()
1421 spin_lock(&xprt->transport_lock); in xs_udp_data_read_skb()
1423 spin_unlock(&xprt->transport_lock); in xs_udp_data_read_skb()
1424 spin_lock(&xprt->queue_lock); in xs_udp_data_read_skb()
1430 spin_unlock(&xprt->queue_lock); in xs_udp_data_read_skb()
1439 mutex_lock(&transport->recv_mutex); in xs_udp_data_receive()
1440 sk = transport->inet; in xs_udp_data_receive()
1441 if (sk == NULL) in xs_udp_data_receive()
1445 if (skb == NULL) in xs_udp_data_receive()
1447 xs_udp_data_read_skb(&transport->xprt, sk, skb); in xs_udp_data_receive()
1453 mutex_unlock(&transport->recv_mutex); in xs_udp_data_receive()
1467 * xs_data_ready - "data ready" callback for sockets
1478 if (xprt != NULL) { in xs_data_ready()
1484 transport->old_data_ready(sk); in xs_data_ready()
1486 if (test_bit(XPRT_SOCK_IGNORE_RECV, &transport->sock_state)) in xs_data_ready()
1492 if (xprt->reestablish_timeout) in xs_data_ready()
1493 xprt->reestablish_timeout = 0; in xs_data_ready()
1494 if (!test_and_set_bit(XPRT_SOCK_DATA_READY, &transport->sock_state)) in xs_data_ready()
1495 queue_work(xprtiod_workqueue, &transport->recv_worker); in xs_data_ready()
1500 * Helper function to force a TCP close if the server is sending
1508 #if defined(CONFIG_SUNRPC_BACKCHANNEL)
1516 * xs_local_state_change - callback to handle AF_LOCAL socket state changes
1525 if (!(xprt = xprt_from_sock(sk))) in xs_local_state_change()
1528 if (sk->sk_shutdown & SHUTDOWN_MASK) { in xs_local_state_change()
1529 clear_bit(XPRT_CONNECTED, &xprt->state); in xs_local_state_change()
1536 * xs_tcp_state_change - callback to handle TCP socket state changes
1545 if (!(xprt = xprt_from_sock(sk))) in xs_tcp_state_change()
1547 dprintk("RPC: xs_tcp_state_change client %p...\n", xprt); in xs_tcp_state_change()
1548 dprintk("RPC: state %x conn %d dead %d zapped %d sk_shutdown %d\n", in xs_tcp_state_change()
1549 sk->sk_state, xprt_connected(xprt), in xs_tcp_state_change()
1552 sk->sk_shutdown); in xs_tcp_state_change()
1555 trace_rpc_socket_state_change(xprt, sk->sk_socket); in xs_tcp_state_change()
1556 switch (sk->sk_state) { in xs_tcp_state_change()
1558 if (!xprt_test_and_set_connected(xprt)) { in xs_tcp_state_change()
1559 xprt->connect_cookie++; in xs_tcp_state_change()
1560 clear_bit(XPRT_SOCK_CONNECTING, &transport->sock_state); in xs_tcp_state_change()
1563 xprt->stat.connect_count++; in xs_tcp_state_change()
1564 xprt->stat.connect_time += (long)jiffies - in xs_tcp_state_change()
1565 xprt->stat.connect_start; in xs_tcp_state_change()
1571 xprt->connect_cookie++; in xs_tcp_state_change()
1572 xprt->reestablish_timeout = 0; in xs_tcp_state_change()
1573 set_bit(XPRT_CLOSING, &xprt->state); in xs_tcp_state_change()
1575 clear_bit(XPRT_CONNECTED, &xprt->state); in xs_tcp_state_change()
1576 clear_bit(XPRT_CLOSE_WAIT, &xprt->state); in xs_tcp_state_change()
1581 xprt->connect_cookie++; in xs_tcp_state_change()
1582 clear_bit(XPRT_CONNECTED, &xprt->state); in xs_tcp_state_change()
1587 * If the server closed down the connection, make sure that in xs_tcp_state_change()
1590 if (xprt->reestablish_timeout < XS_TCP_INIT_REEST_TO) in xs_tcp_state_change()
1591 xprt->reestablish_timeout = XS_TCP_INIT_REEST_TO; in xs_tcp_state_change()
1594 set_bit(XPRT_CLOSING, &xprt->state); in xs_tcp_state_change()
1596 clear_bit(XPRT_CONNECTED, &xprt->state); in xs_tcp_state_change()
1600 if (test_and_clear_bit(XPRT_SOCK_CONNECTING, in xs_tcp_state_change()
1601 &transport->sock_state)) { in xs_tcp_state_change()
1605 clear_bit(XPRT_CLOSING, &xprt->state); in xs_tcp_state_change()
1616 if (!sk->sk_socket) in xs_write_space()
1618 clear_bit(SOCK_NOSPACE, &sk->sk_socket->flags); in xs_write_space()
1620 if (unlikely(!(xprt = xprt_from_sock(sk)))) in xs_write_space()
1623 if (!test_and_clear_bit(XPRT_SOCK_NOSPACE, &transport->sock_state)) in xs_write_space()
1626 sk->sk_write_pending--; in xs_write_space()
1630 * xs_udp_write_space - callback invoked when socket buffer space
1642 if (sock_writeable(sk)) in xs_udp_write_space()
1647 * xs_tcp_write_space - callback invoked when socket buffer space
1659 if (sk_stream_is_writeable(sk)) in xs_tcp_write_space()
1666 struct sock *sk = transport->inet; in xs_udp_do_set_buffer_size()
1668 if (transport->rcvsize) { in xs_udp_do_set_buffer_size()
1669 sk->sk_userlocks |= SOCK_RCVBUF_LOCK; in xs_udp_do_set_buffer_size()
1670 sk->sk_rcvbuf = transport->rcvsize * xprt->max_reqs * 2; in xs_udp_do_set_buffer_size()
1672 if (transport->sndsize) { in xs_udp_do_set_buffer_size()
1673 sk->sk_userlocks |= SOCK_SNDBUF_LOCK; in xs_udp_do_set_buffer_size()
1674 sk->sk_sndbuf = transport->sndsize * xprt->max_reqs * 2; in xs_udp_do_set_buffer_size()
1675 sk->sk_write_space(sk); in xs_udp_do_set_buffer_size()
1680 * xs_udp_set_buffer_size - set send and receive limits
1691 transport->sndsize = 0; in xs_udp_set_buffer_size()
1692 if (sndsize) in xs_udp_set_buffer_size()
1693 transport->sndsize = sndsize + 1024; in xs_udp_set_buffer_size()
1694 transport->rcvsize = 0; in xs_udp_set_buffer_size()
1695 if (rcvsize) in xs_udp_set_buffer_size()
1696 transport->rcvsize = rcvsize + 1024; in xs_udp_set_buffer_size()
1702 * xs_udp_timer - called when a retransmit timeout occurs on a UDP transport
1710 spin_lock(&xprt->transport_lock); in xs_udp_timer()
1711 xprt_adjust_cwnd(xprt, task, -ETIMEDOUT); in xs_udp_timer()
1712 spin_unlock(&xprt->transport_lock); in xs_udp_timer()
1721 if (max < min) in xs_get_random_port()
1722 return -EADDRINUSE; in xs_get_random_port()
1723 range = max - min + 1; in xs_get_random_port()
1733 if (kernel_getsockname(sock, (struct sockaddr *)&buf) < 0) in xs_sock_getport()
1737 port = ntohs(((struct sockaddr_in6 *)&buf)->sin6_port); in xs_sock_getport()
1740 port = ntohs(((struct sockaddr_in *)&buf)->sin_port); in xs_sock_getport()
1747 * xs_set_port - reset the port number in the remote endpoint address
1754 dprintk("RPC: setting port for xprt %p to %u\n", xprt, port); in xs_set_port()
1762 transport->srcport = 0; in xs_reset_srcport()
1767 if (transport->srcport == 0 && transport->xprt.reuseport) in xs_set_srcport()
1768 transport->srcport = xs_sock_getport(sock); in xs_set_srcport()
1773 int port = transport->srcport; in xs_get_srcport()
1775 if (port == 0 && transport->xprt.resvport) in xs_get_srcport()
1784 mutex_lock(&sock->recv_mutex); in xs_sock_srcport()
1785 if (sock->sock) in xs_sock_srcport()
1786 ret = xs_sock_getport(sock->sock); in xs_sock_srcport()
1787 mutex_unlock(&sock->recv_mutex); in xs_sock_srcport()
1798 int ret = -ENOTCONN; in xs_sock_srcaddr()
1800 mutex_lock(&sock->recv_mutex); in xs_sock_srcaddr()
1801 if (sock->sock) { in xs_sock_srcaddr()
1802 ret = kernel_getsockname(sock->sock, &saddr.sa); in xs_sock_srcaddr()
1803 if (ret >= 0) in xs_sock_srcaddr()
1806 mutex_unlock(&sock->recv_mutex); in xs_sock_srcaddr()
1812 if (transport->srcport != 0) in xs_next_srcport()
1813 transport->srcport = 0; in xs_next_srcport()
1814 if (!transport->xprt.resvport) in xs_next_srcport()
1816 if (port <= xprt_min_resvport || port > xprt_max_resvport) in xs_next_srcport()
1818 return --port; in xs_next_srcport()
1828 * If we are asking for any ephemeral port (i.e. port == 0 && in xs_bind()
1829 * transport->xprt.resvport == 0), don't bind. Let the local in xs_bind()
1838 * If we're asking for any reserved port (i.e. port == 0 && in xs_bind()
1839 * transport->xprt.resvport == 1) xs_get_srcport above will in xs_bind()
1840 * ensure that port is non-zero and we will bind as needed. in xs_bind()
1842 if (port <= 0) in xs_bind()
1845 memcpy(&myaddr, &transport->srcaddr, transport->xprt.addrlen); in xs_bind()
1849 transport->xprt.addrlen); in xs_bind()
1850 if (err == 0) { in xs_bind()
1851 if (transport->xprt.reuseport) in xs_bind()
1852 transport->srcport = port; in xs_bind()
1857 if (port > last) in xs_bind()
1859 } while (err == -EADDRINUSE && nloop != 2); in xs_bind()
1861 if (myaddr.ss_family == AF_INET) in xs_bind()
1862 dprintk("RPC: %s %pI4:%u: %s (%d)\n", __func__, in xs_bind()
1863 &((struct sockaddr_in *)&myaddr)->sin_addr, in xs_bind()
1866 dprintk("RPC: %s %pI6:%u: %s (%d)\n", __func__, in xs_bind()
1867 &((struct sockaddr_in6 *)&myaddr)->sin6_addr, in xs_bind()
1877 xprt_set_bound(task->tk_xprt); in xs_local_rpcbind()
1890 struct sock *sk = sock->sk; in xs_reclassify_socketu()
1892 sock_lock_init_class_and_name(sk, "slock-AF_LOCAL-RPC", in xs_reclassify_socketu()
1893 &xs_slock_key[0], "sk_lock-AF_LOCAL-RPC", &xs_key[0]); in xs_reclassify_socketu()
1898 struct sock *sk = sock->sk; in xs_reclassify_socket4()
1900 sock_lock_init_class_and_name(sk, "slock-AF_INET-RPC", in xs_reclassify_socket4()
1901 &xs_slock_key[1], "sk_lock-AF_INET-RPC", &xs_key[1]); in xs_reclassify_socket4()
1906 struct sock *sk = sock->sk; in xs_reclassify_socket6()
1908 sock_lock_init_class_and_name(sk, "slock-AF_INET6-RPC", in xs_reclassify_socket6()
1909 &xs_slock_key[2], "sk_lock-AF_INET6-RPC", &xs_key[2]); in xs_reclassify_socket6()
1914 if (WARN_ON_ONCE(!sock_allow_reclassification(sock->sk))) in xs_reclassify_socket()
1947 err = __sock_create(xprt->xprt_net, family, type, protocol, &sock, 1); in xs_create_sock()
1948 if (err < 0) { in xs_create_sock()
1949 dprintk("RPC: can't create %d transport socket (%d).\n", in xs_create_sock()
1950 protocol, -err); in xs_create_sock()
1955 if (reuseport) in xs_create_sock()
1956 sock_set_reuseport(sock->sk); in xs_create_sock()
1959 if (err) { in xs_create_sock()
1964 if (protocol == IPPROTO_TCP) in xs_create_sock()
1965 sk_net_refcnt_upgrade(sock->sk); in xs_create_sock()
1968 if (IS_ERR(filp)) in xs_create_sock()
1970 transport->file = filp; in xs_create_sock()
1983 if (!transport->inet) { in xs_local_finish_connecting()
1984 struct sock *sk = sock->sk; in xs_local_finish_connecting()
1990 sk->sk_user_data = xprt; in xs_local_finish_connecting()
1991 sk->sk_data_ready = xs_data_ready; in xs_local_finish_connecting()
1992 sk->sk_write_space = xs_udp_write_space; in xs_local_finish_connecting()
1993 sk->sk_state_change = xs_local_state_change; in xs_local_finish_connecting()
1994 sk->sk_error_report = xs_error_report; in xs_local_finish_connecting()
1995 sk->sk_use_task_frag = false; in xs_local_finish_connecting()
2000 transport->sock = sock; in xs_local_finish_connecting()
2001 transport->inet = sk; in xs_local_finish_connecting()
2008 return kernel_connect(sock, xs_addr(xprt), xprt->addrlen, 0); in xs_local_finish_connecting()
2012 * xs_local_setup_socket - create AF_LOCAL socket, connect to a local endpoint
2017 struct rpc_xprt *xprt = &transport->xprt; in xs_local_setup_socket()
2022 status = __sock_create(xprt->xprt_net, AF_LOCAL, in xs_local_setup_socket()
2024 if (status < 0) { in xs_local_setup_socket()
2025 dprintk("RPC: can't create AF_LOCAL " in xs_local_setup_socket()
2026 "transport socket (%d).\n", -status); in xs_local_setup_socket()
2032 if (IS_ERR(filp)) { in xs_local_setup_socket()
2036 transport->file = filp; in xs_local_setup_socket()
2038 dprintk("RPC: worker connecting xprt %p via AF_LOCAL to %s\n", in xs_local_setup_socket()
2039 xprt, xprt->address_strings[RPC_DISPLAY_ADDR]); in xs_local_setup_socket()
2045 dprintk("RPC: xprt %p connected to %s\n", in xs_local_setup_socket()
2046 xprt, xprt->address_strings[RPC_DISPLAY_ADDR]); in xs_local_setup_socket()
2047 xprt->stat.connect_count++; in xs_local_setup_socket()
2048 xprt->stat.connect_time += (long)jiffies - in xs_local_setup_socket()
2049 xprt->stat.connect_start; in xs_local_setup_socket()
2052 case -ENOBUFS: in xs_local_setup_socket()
2054 case -ENOENT: in xs_local_setup_socket()
2055 dprintk("RPC: xprt %p: socket %s does not exist\n", in xs_local_setup_socket()
2056 xprt, xprt->address_strings[RPC_DISPLAY_ADDR]); in xs_local_setup_socket()
2058 case -ECONNREFUSED: in xs_local_setup_socket()
2059 dprintk("RPC: xprt %p: connection refused for %s\n", in xs_local_setup_socket()
2060 xprt, xprt->address_strings[RPC_DISPLAY_ADDR]); in xs_local_setup_socket()
2064 __func__, -status, in xs_local_setup_socket()
2065 xprt->address_strings[RPC_DISPLAY_ADDR]); in xs_local_setup_socket()
2079 if (transport->file) in xs_local_connect()
2082 if (RPC_IS_ASYNC(task)) { in xs_local_connect()
2085 * filesystem namespace of the process making the rpc in xs_local_connect()
2088 * If we want to support asynchronous AF_LOCAL calls, in xs_local_connect()
2092 rpc_task_set_rpc_status(task, -ENOTCONN); in xs_local_connect()
2096 if (ret && !RPC_IS_SOFTCONN(task)) in xs_local_connect()
2103 xprt_wake_pending_tasks(xprt, -ENOTCONN); in xs_local_connect()
2106 #if IS_ENABLED(CONFIG_SUNRPC_SWAP)
2118 * If there's no sock, then we have nothing to set. The in xs_set_memalloc()
2121 if (!transport->inet) in xs_set_memalloc()
2123 if (atomic_read(&xprt->swapper)) in xs_set_memalloc()
2124 sk_set_memalloc(transport->inet); in xs_set_memalloc()
2128 * xs_enable_swap - Tag this transport as being used for swap.
2132 * optionally mark it for swapping if it wasn't already.
2139 mutex_lock(&xs->recv_mutex); in xs_enable_swap()
2140 if (atomic_inc_return(&xprt->swapper) == 1 && in xs_enable_swap()
2141 xs->inet) in xs_enable_swap()
2142 sk_set_memalloc(xs->inet); in xs_enable_swap()
2143 mutex_unlock(&xs->recv_mutex); in xs_enable_swap()
2148 * xs_disable_swap - Untag this transport as being used for swap.
2151 * Drop a "swapper" reference to this xprt on behalf of the rpc_clnt. If the
2159 mutex_lock(&xs->recv_mutex); in xs_disable_swap()
2160 if (atomic_dec_and_test(&xprt->swapper) && in xs_disable_swap()
2161 xs->inet) in xs_disable_swap()
2162 sk_clear_memalloc(xs->inet); in xs_disable_swap()
2163 mutex_unlock(&xs->recv_mutex); in xs_disable_swap()
2173 return -EINVAL; in xs_enable_swap()
2186 if (!transport->inet) { in xs_udp_finish_connecting()
2187 struct sock *sk = sock->sk; in xs_udp_finish_connecting()
2193 sk->sk_user_data = xprt; in xs_udp_finish_connecting()
2194 sk->sk_data_ready = xs_data_ready; in xs_udp_finish_connecting()
2195 sk->sk_write_space = xs_udp_write_space; in xs_udp_finish_connecting()
2196 sk->sk_use_task_frag = false; in xs_udp_finish_connecting()
2201 transport->sock = sock; in xs_udp_finish_connecting()
2202 transport->inet = sk; in xs_udp_finish_connecting()
2210 xprt->stat.connect_start = jiffies; in xs_udp_finish_connecting()
2217 struct rpc_xprt *xprt = &transport->xprt; in xs_udp_setup_socket()
2219 int status = -EIO; in xs_udp_setup_socket()
2220 unsigned int pflags = current->flags; in xs_udp_setup_socket()
2222 if (atomic_read(&xprt->swapper)) in xs_udp_setup_socket()
2223 current->flags |= PF_MEMALLOC; in xs_udp_setup_socket()
2225 xs_addr(xprt)->sa_family, SOCK_DGRAM, in xs_udp_setup_socket()
2227 if (IS_ERR(sock)) in xs_udp_setup_socket()
2230 dprintk("RPC: worker connecting xprt %p via %s to " in xs_udp_setup_socket()
2232 xprt->address_strings[RPC_DISPLAY_PROTO], in xs_udp_setup_socket()
2233 xprt->address_strings[RPC_DISPLAY_ADDR], in xs_udp_setup_socket()
2234 xprt->address_strings[RPC_DISPLAY_PORT]); in xs_udp_setup_socket()
2247 * xs_tcp_shutdown - gracefully shut down a TCP socket
2256 struct socket *sock = transport->sock; in xs_tcp_shutdown()
2257 int skst = transport->inet ? transport->inet->sk_state : TCP_CLOSE; in xs_tcp_shutdown()
2259 if (sock == NULL) in xs_tcp_shutdown()
2261 if (!xprt->reuseport) { in xs_tcp_shutdown()
2284 struct net *net = sock_net(sock->sk); in xs_tcp_set_socket_timeouts()
2292 spin_lock(&xprt->transport_lock); in xs_tcp_set_socket_timeouts()
2293 keepidle = DIV_ROUND_UP(xprt->timeout->to_initval, HZ); in xs_tcp_set_socket_timeouts()
2294 keepcnt = xprt->timeout->to_retries + 1; in xs_tcp_set_socket_timeouts()
2295 timeo = jiffies_to_msecs(xprt->timeout->to_initval) * in xs_tcp_set_socket_timeouts()
2296 (xprt->timeout->to_retries + 1); in xs_tcp_set_socket_timeouts()
2297 clear_bit(XPRT_SOCK_UPD_TIMEOUT, &transport->sock_state); in xs_tcp_set_socket_timeouts()
2298 spin_unlock(&xprt->transport_lock); in xs_tcp_set_socket_timeouts()
2301 sock_set_keepalive(sock->sk); in xs_tcp_set_socket_timeouts()
2302 tcp_sock_set_keepidle(sock->sk, keepidle); in xs_tcp_set_socket_timeouts()
2303 tcp_sock_set_keepintvl(sock->sk, keepidle); in xs_tcp_set_socket_timeouts()
2304 tcp_sock_set_keepcnt(sock->sk, keepcnt); in xs_tcp_set_socket_timeouts()
2307 tcp_sock_set_user_timeout(sock->sk, timeo); in xs_tcp_set_socket_timeouts()
2311 DIV_ROUND_UP(xprt->connect_timeout, HZ), 1); in xs_tcp_set_socket_timeouts()
2313 READ_ONCE(net->ipv4.sysctl_tcp_syn_retries), 1); in xs_tcp_set_socket_timeouts()
2316 if (t <= syn_retries) in xs_tcp_set_socket_timeouts()
2317 tcp_sock_set_syncnt(sock->sk, t - 1); in xs_tcp_set_socket_timeouts()
2328 memcpy(&to, xprt->timeout, sizeof(to)); in xs_tcp_do_set_connect_timeout()
2334 memcpy(&transport->tcp_timeout, &to, sizeof(transport->tcp_timeout)); in xs_tcp_do_set_connect_timeout()
2335 xprt->timeout = &transport->tcp_timeout; in xs_tcp_do_set_connect_timeout()
2336 xprt->connect_timeout = connect_timeout; in xs_tcp_do_set_connect_timeout()
2345 spin_lock(&xprt->transport_lock); in xs_tcp_set_connect_timeout()
2346 if (reconnect_timeout < xprt->max_reconnect_timeout) in xs_tcp_set_connect_timeout()
2347 xprt->max_reconnect_timeout = reconnect_timeout; in xs_tcp_set_connect_timeout()
2348 if (connect_timeout < xprt->connect_timeout) in xs_tcp_set_connect_timeout()
2350 set_bit(XPRT_SOCK_UPD_TIMEOUT, &transport->sock_state); in xs_tcp_set_connect_timeout()
2351 spin_unlock(&xprt->transport_lock); in xs_tcp_set_connect_timeout()
2358 if (!transport->inet) { in xs_tcp_finish_connecting()
2359 struct sock *sk = sock->sk; in xs_tcp_finish_connecting()
2361 /* Avoid temporary address, they are bad for long-lived in xs_tcp_finish_connecting()
2368 if (xs_addr(xprt)->sa_family == PF_INET6) { in xs_tcp_finish_connecting()
2380 sk->sk_user_data = xprt; in xs_tcp_finish_connecting()
2381 sk->sk_data_ready = xs_data_ready; in xs_tcp_finish_connecting()
2382 sk->sk_state_change = xs_tcp_state_change; in xs_tcp_finish_connecting()
2383 sk->sk_write_space = xs_tcp_write_space; in xs_tcp_finish_connecting()
2384 sk->sk_error_report = xs_error_report; in xs_tcp_finish_connecting()
2385 sk->sk_use_task_frag = false; in xs_tcp_finish_connecting()
2393 transport->sock = sock; in xs_tcp_finish_connecting()
2394 transport->inet = sk; in xs_tcp_finish_connecting()
2399 if (!xprt_bound(xprt)) in xs_tcp_finish_connecting()
2400 return -ENOTCONN; in xs_tcp_finish_connecting()
2407 set_bit(XPRT_SOCK_CONNECTING, &transport->sock_state); in xs_tcp_finish_connecting()
2408 return kernel_connect(sock, xs_addr(xprt), xprt->addrlen, O_NONBLOCK); in xs_tcp_finish_connecting()
2412 * xs_tcp_setup_socket - create a TCP socket and connect to a remote endpoint
2421 struct socket *sock = transport->sock; in xs_tcp_setup_socket()
2422 struct rpc_xprt *xprt = &transport->xprt; in xs_tcp_setup_socket()
2424 unsigned int pflags = current->flags; in xs_tcp_setup_socket()
2426 if (atomic_read(&xprt->swapper)) in xs_tcp_setup_socket()
2427 current->flags |= PF_MEMALLOC; in xs_tcp_setup_socket()
2429 if (xprt_connected(xprt)) in xs_tcp_setup_socket()
2431 if (test_and_clear_bit(XPRT_SOCK_CONNECT_SENT, in xs_tcp_setup_socket()
2432 &transport->sock_state) || in xs_tcp_setup_socket()
2435 sock = xs_create_sock(xprt, transport, xs_addr(xprt)->sa_family, in xs_tcp_setup_socket()
2437 if (IS_ERR(sock)) { in xs_tcp_setup_socket()
2443 dprintk("RPC: worker connecting xprt %p via %s to " in xs_tcp_setup_socket()
2445 xprt->address_strings[RPC_DISPLAY_PROTO], in xs_tcp_setup_socket()
2446 xprt->address_strings[RPC_DISPLAY_ADDR], in xs_tcp_setup_socket()
2447 xprt->address_strings[RPC_DISPLAY_PORT]); in xs_tcp_setup_socket()
2451 dprintk("RPC: %p connect status %d connected %d sock state %d\n", in xs_tcp_setup_socket()
2452 xprt, -status, xprt_connected(xprt), in xs_tcp_setup_socket()
2453 sock->sk->sk_state); in xs_tcp_setup_socket()
2456 case -EINPROGRESS: in xs_tcp_setup_socket()
2458 set_bit(XPRT_SOCK_CONNECT_SENT, &transport->sock_state); in xs_tcp_setup_socket()
2459 if (xprt->reestablish_timeout < XS_TCP_INIT_REEST_TO) in xs_tcp_setup_socket()
2460 xprt->reestablish_timeout = XS_TCP_INIT_REEST_TO; in xs_tcp_setup_socket()
2462 case -EALREADY: in xs_tcp_setup_socket()
2464 case -EADDRNOTAVAIL: in xs_tcp_setup_socket()
2466 transport->srcport = 0; in xs_tcp_setup_socket()
2467 status = -EAGAIN; in xs_tcp_setup_socket()
2469 case -EPERM: in xs_tcp_setup_socket()
2470 /* Happens, for instance, if a BPF program is preventing in xs_tcp_setup_socket()
2474 status = -ECONNREFUSED; in xs_tcp_setup_socket()
2476 case -EINVAL: in xs_tcp_setup_socket()
2477 /* Happens, for instance, if the user specified a link in xs_tcp_setup_socket()
2478 * local IPv6 address without a scope-id. in xs_tcp_setup_socket()
2480 case -ECONNREFUSED: in xs_tcp_setup_socket()
2481 case -ECONNRESET: in xs_tcp_setup_socket()
2482 case -ENETDOWN: in xs_tcp_setup_socket()
2483 case -ENETUNREACH: in xs_tcp_setup_socket()
2484 case -EHOSTUNREACH: in xs_tcp_setup_socket()
2485 case -EADDRINUSE: in xs_tcp_setup_socket()
2486 case -ENOBUFS: in xs_tcp_setup_socket()
2487 case -ENOTCONN: in xs_tcp_setup_socket()
2492 status = -EAGAIN; in xs_tcp_setup_socket()
2516 struct rpc_xprt *upper_xprt = &upper_transport->xprt; in xs_tcp_tls_finish_connecting()
2518 if (!upper_transport->inet) { in xs_tcp_tls_finish_connecting()
2519 struct socket *sock = lower_transport->sock; in xs_tcp_tls_finish_connecting()
2520 struct sock *sk = sock->sk; in xs_tcp_tls_finish_connecting()
2522 /* Avoid temporary address, they are bad for long-lived in xs_tcp_tls_finish_connecting()
2529 if (xs_addr(upper_xprt)->sa_family == PF_INET6) in xs_tcp_tls_finish_connecting()
2537 /* @sk is already connected, so it now has the RPC callbacks. in xs_tcp_tls_finish_connecting()
2540 upper_transport->old_data_ready = lower_transport->old_data_ready; in xs_tcp_tls_finish_connecting()
2541 upper_transport->old_state_change = lower_transport->old_state_change; in xs_tcp_tls_finish_connecting()
2542 upper_transport->old_write_space = lower_transport->old_write_space; in xs_tcp_tls_finish_connecting()
2543 upper_transport->old_error_report = lower_transport->old_error_report; in xs_tcp_tls_finish_connecting()
2544 sk->sk_user_data = upper_xprt; in xs_tcp_tls_finish_connecting()
2551 upper_transport->sock = sock; in xs_tcp_tls_finish_connecting()
2552 upper_transport->inet = sk; in xs_tcp_tls_finish_connecting()
2553 upper_transport->file = lower_transport->file; in xs_tcp_tls_finish_connecting()
2558 mutex_lock(&lower_transport->recv_mutex); in xs_tcp_tls_finish_connecting()
2559 lower_transport->inet = NULL; in xs_tcp_tls_finish_connecting()
2560 lower_transport->sock = NULL; in xs_tcp_tls_finish_connecting()
2561 lower_transport->file = NULL; in xs_tcp_tls_finish_connecting()
2566 mutex_unlock(&lower_transport->recv_mutex); in xs_tcp_tls_finish_connecting()
2569 if (!xprt_bound(upper_xprt)) in xs_tcp_tls_finish_connecting()
2570 return -ENOTCONN; in xs_tcp_tls_finish_connecting()
2574 if (!xprt_test_and_set_connected(upper_xprt)) { in xs_tcp_tls_finish_connecting()
2575 upper_xprt->connect_cookie++; in xs_tcp_tls_finish_connecting()
2576 clear_bit(XPRT_SOCK_CONNECTING, &upper_transport->sock_state); in xs_tcp_tls_finish_connecting()
2579 upper_xprt->stat.connect_count++; in xs_tcp_tls_finish_connecting()
2580 upper_xprt->stat.connect_time += (long)jiffies - in xs_tcp_tls_finish_connecting()
2581 upper_xprt->stat.connect_start; in xs_tcp_tls_finish_connecting()
2588 * xs_tls_handshake_done - TLS handshake completion handler
2602 case -EACCES: in xs_tls_handshake_done()
2603 case -ETIMEDOUT: in xs_tls_handshake_done()
2604 lower_transport->xprt_err = status; in xs_tls_handshake_done()
2607 lower_transport->xprt_err = -EACCES; in xs_tls_handshake_done()
2609 complete(&lower_transport->handshake_done); in xs_tls_handshake_done()
2618 .ta_sock = lower_transport->sock, in xs_tls_handshake_sync()
2621 .ta_peername = lower_xprt->servername, in xs_tls_handshake_sync()
2623 struct sock *sk = lower_transport->inet; in xs_tls_handshake_sync()
2626 init_completion(&lower_transport->handshake_done); in xs_tls_handshake_sync()
2627 set_bit(XPRT_SOCK_IGNORE_RECV, &lower_transport->sock_state); in xs_tls_handshake_sync()
2628 lower_transport->xprt_err = -ETIMEDOUT; in xs_tls_handshake_sync()
2629 switch (xprtsec->policy) { in xs_tls_handshake_sync()
2632 if (rc) in xs_tls_handshake_sync()
2636 args.ta_my_cert = xprtsec->cert_serial; in xs_tls_handshake_sync()
2637 args.ta_my_privkey = xprtsec->privkey_serial; in xs_tls_handshake_sync()
2639 if (rc) in xs_tls_handshake_sync()
2643 rc = -EACCES; in xs_tls_handshake_sync()
2647 rc = wait_for_completion_interruptible_timeout(&lower_transport->handshake_done, in xs_tls_handshake_sync()
2649 if (rc <= 0) { in xs_tls_handshake_sync()
2651 if (rc == 0) in xs_tls_handshake_sync()
2652 rc = -ETIMEDOUT; in xs_tls_handshake_sync()
2656 rc = lower_transport->xprt_err; in xs_tls_handshake_sync()
2660 clear_bit(XPRT_SOCK_IGNORE_RECV, &lower_transport->sock_state); in xs_tls_handshake_sync()
2669 * xs_tcp_tls_setup_socket - establish a TLS session on a TCP socket
2674 * For RPC-with-TLS, there is a two-stage connection process.
2676 * The "upper-layer xprt" is visible to the RPC consumer. Once it has
2680 * A "lower-layer xprt", created in this function, handles the mechanics
2689 struct rpc_clnt *upper_clnt = upper_transport->clnt; in xs_tcp_tls_setup_socket()
2690 struct rpc_xprt *upper_xprt = &upper_transport->xprt; in xs_tcp_tls_setup_socket()
2692 .net = upper_xprt->xprt_net, in xs_tcp_tls_setup_socket()
2693 .protocol = upper_xprt->prot, in xs_tcp_tls_setup_socket()
2694 .address = (struct sockaddr *)&upper_xprt->addr, in xs_tcp_tls_setup_socket()
2695 .addrsize = upper_xprt->addrlen, in xs_tcp_tls_setup_socket()
2696 .timeout = upper_clnt->cl_timeout, in xs_tcp_tls_setup_socket()
2697 .servername = upper_xprt->servername, in xs_tcp_tls_setup_socket()
2698 .program = upper_clnt->cl_program, in xs_tcp_tls_setup_socket()
2699 .prognumber = upper_clnt->cl_prog, in xs_tcp_tls_setup_socket()
2700 .version = upper_clnt->cl_vers, in xs_tcp_tls_setup_socket()
2702 .cred = upper_clnt->cl_cred, in xs_tcp_tls_setup_socket()
2706 .stats = upper_clnt->cl_stats, in xs_tcp_tls_setup_socket()
2708 unsigned int pflags = current->flags; in xs_tcp_tls_setup_socket()
2713 if (atomic_read(&upper_xprt->swapper)) in xs_tcp_tls_setup_socket()
2714 current->flags |= PF_MEMALLOC; in xs_tcp_tls_setup_socket()
2720 if (IS_ERR(lower_clnt)) { in xs_tcp_tls_setup_socket()
2722 clear_bit(XPRT_SOCK_CONNECTING, &upper_transport->sock_state); in xs_tcp_tls_setup_socket()
2733 lower_xprt = rcu_dereference(lower_clnt->cl_xprt); in xs_tcp_tls_setup_socket()
2736 if (wait_on_bit_lock(&lower_xprt->state, XPRT_LOCKED, TASK_KILLABLE)) in xs_tcp_tls_setup_socket()
2739 status = xs_tls_handshake_sync(lower_xprt, &upper_xprt->xprtsec); in xs_tcp_tls_setup_socket()
2740 if (status) { in xs_tcp_tls_setup_socket()
2746 if (status) in xs_tcp_tls_setup_socket()
2749 trace_rpc_socket_connect(upper_xprt, upper_transport->sock, 0); in xs_tcp_tls_setup_socket()
2753 * ->data_ready callback was set up. in xs_tcp_tls_setup_socket()
2759 upper_transport->clnt = NULL; in xs_tcp_tls_setup_socket()
2777 * xs_connect - connect a socket to a remote endpoint
2779 * @task: address of RPC task that manages state of connect request
2781 * TCP: If the remote end dropped the connection, delay reconnecting.
2787 * If a UDP socket connect fails, the delay behavior here prevents
2797 if (transport->sock != NULL) { in xs_connect()
2798 dprintk("RPC: xs_connect delayed xprt %p for %lu " in xs_connect()
2799 "seconds\n", xprt, xprt->reestablish_timeout / HZ); in xs_connect()
2805 dprintk("RPC: xs_connect scheduled xprt %p\n", xprt); in xs_connect()
2807 transport->clnt = task->tk_client; in xs_connect()
2809 &transport->connect_worker, in xs_connect()
2815 if (test_and_clear_bit(XPRT_SOCK_WAKE_DISCONNECT, &transport->sock_state)) in xs_wake_disconnect()
2816 xs_tcp_force_close(&transport->xprt); in xs_wake_disconnect()
2821 if (test_and_clear_bit(XPRT_SOCK_WAKE_WRITE, &transport->sock_state)) in xs_wake_write()
2822 xprt_write_space(&transport->xprt); in xs_wake_write()
2829 if (!test_and_clear_bit(XPRT_SOCK_WAKE_ERROR, &transport->sock_state)) in xs_wake_error()
2831 sockerr = xchg(&transport->xprt_err, 0); in xs_wake_error()
2832 if (sockerr < 0) { in xs_wake_error()
2833 xprt_wake_pending_tasks(&transport->xprt, sockerr); in xs_wake_error()
2834 xs_tcp_force_close(&transport->xprt); in xs_wake_error()
2840 if (test_and_clear_bit(XPRT_SOCK_WAKE_PENDING, &transport->sock_state)) in xs_wake_pending()
2841 xprt_wake_pending_tasks(&transport->xprt, -EAGAIN); in xs_wake_pending()
2856 * xs_local_print_stats - display AF_LOCAL socket-specific stats
2865 if (xprt_connected(xprt)) in xs_local_print_stats()
2866 idle_time = (long)(jiffies - xprt->last_used) / HZ; in xs_local_print_stats()
2870 xprt->stat.bind_count, in xs_local_print_stats()
2871 xprt->stat.connect_count, in xs_local_print_stats()
2872 xprt->stat.connect_time / HZ, in xs_local_print_stats()
2874 xprt->stat.sends, in xs_local_print_stats()
2875 xprt->stat.recvs, in xs_local_print_stats()
2876 xprt->stat.bad_xids, in xs_local_print_stats()
2877 xprt->stat.req_u, in xs_local_print_stats()
2878 xprt->stat.bklog_u, in xs_local_print_stats()
2879 xprt->stat.max_slots, in xs_local_print_stats()
2880 xprt->stat.sending_u, in xs_local_print_stats()
2881 xprt->stat.pending_u); in xs_local_print_stats()
2885 * xs_udp_print_stats - display UDP socket-specific stats
2896 transport->srcport, in xs_udp_print_stats()
2897 xprt->stat.bind_count, in xs_udp_print_stats()
2898 xprt->stat.sends, in xs_udp_print_stats()
2899 xprt->stat.recvs, in xs_udp_print_stats()
2900 xprt->stat.bad_xids, in xs_udp_print_stats()
2901 xprt->stat.req_u, in xs_udp_print_stats()
2902 xprt->stat.bklog_u, in xs_udp_print_stats()
2903 xprt->stat.max_slots, in xs_udp_print_stats()
2904 xprt->stat.sending_u, in xs_udp_print_stats()
2905 xprt->stat.pending_u); in xs_udp_print_stats()
2909 * xs_tcp_print_stats - display TCP socket-specific stats
2919 if (xprt_connected(xprt)) in xs_tcp_print_stats()
2920 idle_time = (long)(jiffies - xprt->last_used) / HZ; in xs_tcp_print_stats()
2924 transport->srcport, in xs_tcp_print_stats()
2925 xprt->stat.bind_count, in xs_tcp_print_stats()
2926 xprt->stat.connect_count, in xs_tcp_print_stats()
2927 xprt->stat.connect_time / HZ, in xs_tcp_print_stats()
2929 xprt->stat.sends, in xs_tcp_print_stats()
2930 xprt->stat.recvs, in xs_tcp_print_stats()
2931 xprt->stat.bad_xids, in xs_tcp_print_stats()
2932 xprt->stat.req_u, in xs_tcp_print_stats()
2933 xprt->stat.bklog_u, in xs_tcp_print_stats()
2934 xprt->stat.max_slots, in xs_tcp_print_stats()
2935 xprt->stat.sending_u, in xs_tcp_print_stats()
2936 xprt->stat.pending_u); in xs_tcp_print_stats()
2940 * Allocate a bunch of pages for a scratch buffer for the rpc code. The reason
2946 struct rpc_rqst *rqst = task->tk_rqstp; in bc_malloc()
2947 size_t size = rqst->rq_callsize; in bc_malloc()
2951 if (size > PAGE_SIZE - sizeof(struct rpc_buffer)) { in bc_malloc()
2954 return -EINVAL; in bc_malloc()
2958 if (!page) in bc_malloc()
2959 return -ENOMEM; in bc_malloc()
2962 buf->len = PAGE_SIZE; in bc_malloc()
2964 rqst->rq_buffer = buf->data; in bc_malloc()
2965 rqst->rq_rbuffer = (char *)rqst->rq_buffer + rqst->rq_callsize; in bc_malloc()
2974 void *buffer = task->tk_rqstp->rq_buffer; in bc_free()
2983 struct xdr_buf *xdr = &req->rq_snd_buf; in bc_sendto()
2985 container_of(req->rq_xprt, struct sock_xprt, xprt); in bc_sendto()
2990 (u32)xdr->len); in bc_sendto()
2994 req->rq_xtime = ktime_get(); in bc_sendto()
2996 if (err < 0) in bc_sendto()
2998 err = xprt_sock_sendmsg(transport->sock, &msg, xdr, 0, marker, &sent); in bc_sendto()
3000 if (err < 0 || sent != (xdr->len + sizeof(marker))) in bc_sendto()
3001 return -EAGAIN; in bc_sendto()
3006 * bc_send_request - Send a backchannel Call on a TCP socket
3013 * %0 if the message was sent successfully
3014 * %ENOTCONN if the message was not sent
3024 xprt = req->rq_xprt->bc_xprt; in bc_send_request()
3030 mutex_lock(&xprt->xpt_mutex); in bc_send_request()
3031 if (test_bit(XPT_DEAD, &xprt->xpt_flags)) in bc_send_request()
3032 len = -ENOTCONN; in bc_send_request()
3035 mutex_unlock(&xprt->xpt_mutex); in bc_send_request()
3037 if (len > 0) in bc_send_request()
3050 dprintk("RPC: bc_destroy xprt %p\n", xprt); in bc_destroy()
3176 dprintk("RPC: %s: Bad address family\n", __func__); in xs_init_anyaddr()
3177 return -EAFNOSUPPORT; in xs_init_anyaddr()
3189 if (args->addrlen > sizeof(xprt->addr)) { in xs_setup_xprt()
3190 dprintk("RPC: xs_setup_xprt: address too large\n"); in xs_setup_xprt()
3191 return ERR_PTR(-EBADF); in xs_setup_xprt()
3194 xprt = xprt_alloc(args->net, sizeof(*new), slot_table_size, in xs_setup_xprt()
3196 if (xprt == NULL) { in xs_setup_xprt()
3197 dprintk("RPC: xs_setup_xprt: couldn't allocate " in xs_setup_xprt()
3199 return ERR_PTR(-ENOMEM); in xs_setup_xprt()
3203 mutex_init(&new->recv_mutex); in xs_setup_xprt()
3204 memcpy(&xprt->addr, args->dstaddr, args->addrlen); in xs_setup_xprt()
3205 xprt->addrlen = args->addrlen; in xs_setup_xprt()
3206 if (args->srcaddr) in xs_setup_xprt()
3207 memcpy(&new->srcaddr, args->srcaddr, args->addrlen); in xs_setup_xprt()
3210 err = xs_init_anyaddr(args->dstaddr->sa_family, in xs_setup_xprt()
3211 (struct sockaddr *)&new->srcaddr); in xs_setup_xprt()
3212 if (err != 0) { in xs_setup_xprt()
3228 * xs_setup_local - Set up transport to use an AF_LOCAL socket
3229 * @args: rpc transport creation arguments
3235 struct sockaddr_un *sun = (struct sockaddr_un *)args->dstaddr; in xs_setup_local()
3242 if (IS_ERR(xprt)) in xs_setup_local()
3246 xprt->prot = 0; in xs_setup_local()
3247 xprt->xprt_class = &xs_local_transport; in xs_setup_local()
3248 xprt->max_payload = RPC_MAX_FRAGMENT_SIZE; in xs_setup_local()
3250 xprt->bind_timeout = XS_BIND_TO; in xs_setup_local()
3251 xprt->reestablish_timeout = XS_TCP_INIT_REEST_TO; in xs_setup_local()
3252 xprt->idle_timeout = XS_IDLE_DISC_TO; in xs_setup_local()
3254 xprt->ops = &xs_local_ops; in xs_setup_local()
3255 xprt->timeout = &xs_local_default_timeout; in xs_setup_local()
3257 INIT_WORK(&transport->recv_worker, xs_stream_data_receive_workfn); in xs_setup_local()
3258 INIT_WORK(&transport->error_worker, xs_error_handle); in xs_setup_local()
3259 INIT_DELAYED_WORK(&transport->connect_worker, xs_dummy_setup_socket); in xs_setup_local()
3261 switch (sun->sun_family) { in xs_setup_local()
3263 if (sun->sun_path[0] != '/' && sun->sun_path[0] != '\0') { in xs_setup_local()
3264 dprintk("RPC: bad AF_LOCAL address: %s\n", in xs_setup_local()
3265 sun->sun_path); in xs_setup_local()
3266 ret = ERR_PTR(-EINVAL); in xs_setup_local()
3273 ret = ERR_PTR(-EAFNOSUPPORT); in xs_setup_local()
3277 dprintk("RPC: set up xprt to %s via AF_LOCAL\n", in xs_setup_local()
3278 xprt->address_strings[RPC_DISPLAY_ADDR]); in xs_setup_local()
3280 if (try_module_get(THIS_MODULE)) in xs_setup_local()
3282 ret = ERR_PTR(-EINVAL); in xs_setup_local()
3296 * xs_setup_udp - Set up transport to use a UDP socket
3297 * @args: rpc transport creation arguments
3302 struct sockaddr *addr = args->dstaddr; in xs_setup_udp()
3309 if (IS_ERR(xprt)) in xs_setup_udp()
3313 xprt->prot = IPPROTO_UDP; in xs_setup_udp()
3314 xprt->xprt_class = &xs_udp_transport; in xs_setup_udp()
3316 xprt->max_payload = (1U << 16) - (MAX_HEADER << 3); in xs_setup_udp()
3318 xprt->bind_timeout = XS_BIND_TO; in xs_setup_udp()
3319 xprt->reestablish_timeout = XS_UDP_REEST_TO; in xs_setup_udp()
3320 xprt->idle_timeout = XS_IDLE_DISC_TO; in xs_setup_udp()
3322 xprt->ops = &xs_udp_ops; in xs_setup_udp()
3324 xprt->timeout = &xs_udp_default_timeout; in xs_setup_udp()
3326 INIT_WORK(&transport->recv_worker, xs_udp_data_receive_workfn); in xs_setup_udp()
3327 INIT_WORK(&transport->error_worker, xs_error_handle); in xs_setup_udp()
3328 INIT_DELAYED_WORK(&transport->connect_worker, xs_udp_setup_socket); in xs_setup_udp()
3330 switch (addr->sa_family) { in xs_setup_udp()
3332 if (((struct sockaddr_in *)addr)->sin_port != htons(0)) in xs_setup_udp()
3338 if (((struct sockaddr_in6 *)addr)->sin6_port != htons(0)) in xs_setup_udp()
3344 ret = ERR_PTR(-EAFNOSUPPORT); in xs_setup_udp()
3348 if (xprt_bound(xprt)) in xs_setup_udp()
3349 dprintk("RPC: set up xprt to %s (port %s) via %s\n", in xs_setup_udp()
3350 xprt->address_strings[RPC_DISPLAY_ADDR], in xs_setup_udp()
3351 xprt->address_strings[RPC_DISPLAY_PORT], in xs_setup_udp()
3352 xprt->address_strings[RPC_DISPLAY_PROTO]); in xs_setup_udp()
3354 dprintk("RPC: set up xprt to %s (autobind) via %s\n", in xs_setup_udp()
3355 xprt->address_strings[RPC_DISPLAY_ADDR], in xs_setup_udp()
3356 xprt->address_strings[RPC_DISPLAY_PROTO]); in xs_setup_udp()
3358 if (try_module_get(THIS_MODULE)) in xs_setup_udp()
3360 ret = ERR_PTR(-EINVAL); in xs_setup_udp()
3373 * xs_setup_tcp - Set up transport to use a TCP socket
3374 * @args: rpc transport creation arguments
3379 struct sockaddr *addr = args->dstaddr; in xs_setup_tcp()
3385 if (args->flags & XPRT_CREATE_INFINITE_SLOTS) in xs_setup_tcp()
3390 if (IS_ERR(xprt)) in xs_setup_tcp()
3394 xprt->prot = IPPROTO_TCP; in xs_setup_tcp()
3395 xprt->xprt_class = &xs_tcp_transport; in xs_setup_tcp()
3396 xprt->max_payload = RPC_MAX_FRAGMENT_SIZE; in xs_setup_tcp()
3398 xprt->bind_timeout = XS_BIND_TO; in xs_setup_tcp()
3399 xprt->reestablish_timeout = XS_TCP_INIT_REEST_TO; in xs_setup_tcp()
3400 xprt->idle_timeout = XS_IDLE_DISC_TO; in xs_setup_tcp()
3402 xprt->ops = &xs_tcp_ops; in xs_setup_tcp()
3403 xprt->timeout = &xs_tcp_default_timeout; in xs_setup_tcp()
3405 xprt->max_reconnect_timeout = xprt->timeout->to_maxval; in xs_setup_tcp()
3406 if (args->reconnect_timeout) in xs_setup_tcp()
3407 xprt->max_reconnect_timeout = args->reconnect_timeout; in xs_setup_tcp()
3409 xprt->connect_timeout = xprt->timeout->to_initval * in xs_setup_tcp()
3410 (xprt->timeout->to_retries + 1); in xs_setup_tcp()
3411 if (args->connect_timeout) in xs_setup_tcp()
3412 xs_tcp_do_set_connect_timeout(xprt, args->connect_timeout); in xs_setup_tcp()
3414 INIT_WORK(&transport->recv_worker, xs_stream_data_receive_workfn); in xs_setup_tcp()
3415 INIT_WORK(&transport->error_worker, xs_error_handle); in xs_setup_tcp()
3416 INIT_DELAYED_WORK(&transport->connect_worker, xs_tcp_setup_socket); in xs_setup_tcp()
3418 switch (addr->sa_family) { in xs_setup_tcp()
3420 if (((struct sockaddr_in *)addr)->sin_port != htons(0)) in xs_setup_tcp()
3426 if (((struct sockaddr_in6 *)addr)->sin6_port != htons(0)) in xs_setup_tcp()
3432 ret = ERR_PTR(-EAFNOSUPPORT); in xs_setup_tcp()
3436 if (xprt_bound(xprt)) in xs_setup_tcp()
3437 dprintk("RPC: set up xprt to %s (port %s) via %s\n", in xs_setup_tcp()
3438 xprt->address_strings[RPC_DISPLAY_ADDR], in xs_setup_tcp()
3439 xprt->address_strings[RPC_DISPLAY_PORT], in xs_setup_tcp()
3440 xprt->address_strings[RPC_DISPLAY_PROTO]); in xs_setup_tcp()
3442 dprintk("RPC: set up xprt to %s (autobind) via %s\n", in xs_setup_tcp()
3443 xprt->address_strings[RPC_DISPLAY_ADDR], in xs_setup_tcp()
3444 xprt->address_strings[RPC_DISPLAY_PROTO]); in xs_setup_tcp()
3446 if (try_module_get(THIS_MODULE)) in xs_setup_tcp()
3448 ret = ERR_PTR(-EINVAL); in xs_setup_tcp()
3455 * xs_setup_tcp_tls - Set up transport to use a TCP with TLS
3456 * @args: rpc transport creation arguments
3461 struct sockaddr *addr = args->dstaddr; in xs_setup_tcp_tls()
3467 if (args->flags & XPRT_CREATE_INFINITE_SLOTS) in xs_setup_tcp_tls()
3472 if (IS_ERR(xprt)) in xs_setup_tcp_tls()
3476 xprt->prot = IPPROTO_TCP; in xs_setup_tcp_tls()
3477 xprt->xprt_class = &xs_tcp_transport; in xs_setup_tcp_tls()
3478 xprt->max_payload = RPC_MAX_FRAGMENT_SIZE; in xs_setup_tcp_tls()
3480 xprt->bind_timeout = XS_BIND_TO; in xs_setup_tcp_tls()
3481 xprt->reestablish_timeout = XS_TCP_INIT_REEST_TO; in xs_setup_tcp_tls()
3482 xprt->idle_timeout = XS_IDLE_DISC_TO; in xs_setup_tcp_tls()
3484 xprt->ops = &xs_tcp_ops; in xs_setup_tcp_tls()
3485 xprt->timeout = &xs_tcp_default_timeout; in xs_setup_tcp_tls()
3487 xprt->max_reconnect_timeout = xprt->timeout->to_maxval; in xs_setup_tcp_tls()
3488 xprt->connect_timeout = xprt->timeout->to_initval * in xs_setup_tcp_tls()
3489 (xprt->timeout->to_retries + 1); in xs_setup_tcp_tls()
3491 INIT_WORK(&transport->recv_worker, xs_stream_data_receive_workfn); in xs_setup_tcp_tls()
3492 INIT_WORK(&transport->error_worker, xs_error_handle); in xs_setup_tcp_tls()
3494 switch (args->xprtsec.policy) { in xs_setup_tcp_tls()
3497 xprt->xprtsec = args->xprtsec; in xs_setup_tcp_tls()
3498 INIT_DELAYED_WORK(&transport->connect_worker, in xs_setup_tcp_tls()
3502 ret = ERR_PTR(-EACCES); in xs_setup_tcp_tls()
3506 switch (addr->sa_family) { in xs_setup_tcp_tls()
3508 if (((struct sockaddr_in *)addr)->sin_port != htons(0)) in xs_setup_tcp_tls()
3514 if (((struct sockaddr_in6 *)addr)->sin6_port != htons(0)) in xs_setup_tcp_tls()
3520 ret = ERR_PTR(-EAFNOSUPPORT); in xs_setup_tcp_tls()
3524 if (xprt_bound(xprt)) in xs_setup_tcp_tls()
3525 dprintk("RPC: set up xprt to %s (port %s) via %s\n", in xs_setup_tcp_tls()
3526 xprt->address_strings[RPC_DISPLAY_ADDR], in xs_setup_tcp_tls()
3527 xprt->address_strings[RPC_DISPLAY_PORT], in xs_setup_tcp_tls()
3528 xprt->address_strings[RPC_DISPLAY_PROTO]); in xs_setup_tcp_tls()
3530 dprintk("RPC: set up xprt to %s (autobind) via %s\n", in xs_setup_tcp_tls()
3531 xprt->address_strings[RPC_DISPLAY_ADDR], in xs_setup_tcp_tls()
3532 xprt->address_strings[RPC_DISPLAY_PROTO]); in xs_setup_tcp_tls()
3534 if (try_module_get(THIS_MODULE)) in xs_setup_tcp_tls()
3536 ret = ERR_PTR(-EINVAL); in xs_setup_tcp_tls()
3543 * xs_setup_bc_tcp - Set up transport to use a TCP backchannel socket
3544 * @args: rpc transport creation arguments
3549 struct sockaddr *addr = args->dstaddr; in xs_setup_bc_tcp()
3557 if (IS_ERR(xprt)) in xs_setup_bc_tcp()
3561 xprt->prot = IPPROTO_TCP; in xs_setup_bc_tcp()
3562 xprt->xprt_class = &xs_bc_tcp_transport; in xs_setup_bc_tcp()
3563 xprt->max_payload = RPC_MAX_FRAGMENT_SIZE; in xs_setup_bc_tcp()
3564 xprt->timeout = &xs_tcp_default_timeout; in xs_setup_bc_tcp()
3568 xprt->bind_timeout = 0; in xs_setup_bc_tcp()
3569 xprt->reestablish_timeout = 0; in xs_setup_bc_tcp()
3570 xprt->idle_timeout = 0; in xs_setup_bc_tcp()
3572 xprt->ops = &bc_tcp_ops; in xs_setup_bc_tcp()
3574 switch (addr->sa_family) { in xs_setup_bc_tcp()
3584 ret = ERR_PTR(-EAFNOSUPPORT); in xs_setup_bc_tcp()
3588 dprintk("RPC: set up xprt to %s (port %s) via %s\n", in xs_setup_bc_tcp()
3589 xprt->address_strings[RPC_DISPLAY_ADDR], in xs_setup_bc_tcp()
3590 xprt->address_strings[RPC_DISPLAY_PORT], in xs_setup_bc_tcp()
3591 xprt->address_strings[RPC_DISPLAY_PROTO]); in xs_setup_bc_tcp()
3600 args->bc_xprt->xpt_bc_xprt = xprt; in xs_setup_bc_tcp()
3601 xprt->bc_xprt = args->bc_xprt; in xs_setup_bc_tcp()
3602 bc_sock = container_of(args->bc_xprt, struct svc_sock, sk_xprt); in xs_setup_bc_tcp()
3603 transport->sock = bc_sock->sk_sock; in xs_setup_bc_tcp()
3604 transport->inet = bc_sock->sk_sk; in xs_setup_bc_tcp()
3612 if (try_module_get(THIS_MODULE)) in xs_setup_bc_tcp()
3615 args->bc_xprt->xpt_bc_xprt = NULL; in xs_setup_bc_tcp()
3616 args->bc_xprt->xpt_bc_xps = NULL; in xs_setup_bc_tcp()
3618 ret = ERR_PTR(-EINVAL); in xs_setup_bc_tcp()
3653 .name = "tcp-with-tls",
3670 * init_socket_xprt - set up xprtsock's sysctls, register with RPC client
3675 if (!sunrpc_table_header) in init_socket_xprt()
3688 * cleanup_socket_xprt - remove xprtsock's sysctls, unregister
3693 if (sunrpc_table_header) { in cleanup_socket_xprt()