xprtsock.c (dea034b963c8901bdcc3d3880c04f0d75c95112f) xprtsock.c (75eb6af7acdf566c68d61e98e67ee2f235201c02)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * linux/net/sunrpc/xprtsock.c
4 *
5 * Client-side transport implementation for sockets.
6 *
7 * TCP callback races fixes (C) 1998 Red Hat
8 * TCP send fixes (C) 1998 Red Hat

--- 34 unchanged lines hidden (view full) ---

43#include <linux/sunrpc/bc_xprt.h>
44#endif
45
46#include <net/sock.h>
47#include <net/checksum.h>
48#include <net/udp.h>
49#include <net/tcp.h>
50#include <net/tls.h>
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * linux/net/sunrpc/xprtsock.c
4 *
5 * Client-side transport implementation for sockets.
6 *
7 * TCP callback races fixes (C) 1998 Red Hat
8 * TCP send fixes (C) 1998 Red Hat

--- 34 unchanged lines hidden (view full) ---

43#include <linux/sunrpc/bc_xprt.h>
44#endif
45
46#include <net/sock.h>
47#include <net/checksum.h>
48#include <net/udp.h>
49#include <net/tcp.h>
50#include <net/tls.h>
51#include <net/handshake.h>
51
52#include <linux/bvec.h>
53#include <linux/highmem.h>
54#include <linux/uio.h>
55#include <linux/sched/mm.h>
56
57#include <trace/events/sock.h>
58#include <trace/events/sunrpc.h>

--- 34 unchanged lines hidden (view full) ---

93static unsigned int xprt_min_resvport_limit = RPC_MIN_RESVPORT;
94static unsigned int xprt_max_resvport_limit = RPC_MAX_RESVPORT;
95
96static struct ctl_table_header *sunrpc_table_header;
97
98static struct xprt_class xs_local_transport;
99static struct xprt_class xs_udp_transport;
100static struct xprt_class xs_tcp_transport;
52
53#include <linux/bvec.h>
54#include <linux/highmem.h>
55#include <linux/uio.h>
56#include <linux/sched/mm.h>
57
58#include <trace/events/sock.h>
59#include <trace/events/sunrpc.h>

--- 34 unchanged lines hidden (view full) ---

94static unsigned int xprt_min_resvport_limit = RPC_MIN_RESVPORT;
95static unsigned int xprt_max_resvport_limit = RPC_MAX_RESVPORT;
96
97static struct ctl_table_header *sunrpc_table_header;
98
99static struct xprt_class xs_local_transport;
100static struct xprt_class xs_udp_transport;
101static struct xprt_class xs_tcp_transport;
102static struct xprt_class xs_tcp_tls_transport;
101static struct xprt_class xs_bc_tcp_transport;
102
103/*
104 * FIXME: changing the UDP slot table size should also resize the UDP
105 * socket buffers for existing UDP transports
106 */
107static struct ctl_table xs_tunables_table[] = {
108 {

--- 75 unchanged lines hidden (view full) ---

184
185/*
186 * TCP idle timeout; client drops the transport socket if it is idle
187 * for this long. Note that we also timeout UDP sockets to prevent
188 * holding port numbers when there is no RPC traffic.
189 */
190#define XS_IDLE_DISC_TO (5U * 60 * HZ)
191
103static struct xprt_class xs_bc_tcp_transport;
104
105/*
106 * FIXME: changing the UDP slot table size should also resize the UDP
107 * socket buffers for existing UDP transports
108 */
109static struct ctl_table xs_tunables_table[] = {
110 {

--- 75 unchanged lines hidden (view full) ---

186
187/*
188 * TCP idle timeout; client drops the transport socket if it is idle
189 * for this long. Note that we also timeout UDP sockets to prevent
190 * holding port numbers when there is no RPC traffic.
191 */
192#define XS_IDLE_DISC_TO (5U * 60 * HZ)
193
194/*
195 * TLS handshake timeout.
196 */
197#define XS_TLS_HANDSHAKE_TO (10U * HZ)
198
192#if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
193# undef RPC_DEBUG_DATA
194# define RPCDBG_FACILITY RPCDBG_TRANS
195#endif
196
197#ifdef RPC_DEBUG_DATA
198static void xs_pktdump(char *msg, u32 *packet, unsigned int count)
199{

--- 1038 unchanged lines hidden (view full) ---

1238 WARN_ON_ONCE(1);
1239 set_bit(XPRT_CLOSE_WAIT, &xprt->state);
1240 return;
1241 }
1242
1243 if (atomic_read(&transport->xprt.swapper))
1244 sk_clear_memalloc(sk);
1245
199#if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
200# undef RPC_DEBUG_DATA
201# define RPCDBG_FACILITY RPCDBG_TRANS
202#endif
203
204#ifdef RPC_DEBUG_DATA
205static void xs_pktdump(char *msg, u32 *packet, unsigned int count)
206{

--- 1038 unchanged lines hidden (view full) ---

1245 WARN_ON_ONCE(1);
1246 set_bit(XPRT_CLOSE_WAIT, &xprt->state);
1247 return;
1248 }
1249
1250 if (atomic_read(&transport->xprt.swapper))
1251 sk_clear_memalloc(sk);
1252
1253 tls_handshake_cancel(sk);
1254
1246 kernel_sock_shutdown(sock, SHUT_RDWR);
1247
1248 mutex_lock(&transport->recv_mutex);
1249 lock_sock(sk);
1250 transport->inet = NULL;
1251 transport->sock = NULL;
1252 transport->file = NULL;
1253

--- 1157 unchanged lines hidden (view full) ---

2411 xs_tcp_force_close(xprt);
2412out:
2413 xprt_clear_connecting(xprt);
2414out_unlock:
2415 xprt_unlock_connect(xprt, transport);
2416 current_restore_flags(pflags, PF_MEMALLOC);
2417}
2418
1255 kernel_sock_shutdown(sock, SHUT_RDWR);
1256
1257 mutex_lock(&transport->recv_mutex);
1258 lock_sock(sk);
1259 transport->inet = NULL;
1260 transport->sock = NULL;
1261 transport->file = NULL;
1262

--- 1157 unchanged lines hidden (view full) ---

2420 xs_tcp_force_close(xprt);
2421out:
2422 xprt_clear_connecting(xprt);
2423out_unlock:
2424 xprt_unlock_connect(xprt, transport);
2425 current_restore_flags(pflags, PF_MEMALLOC);
2426}
2427
2428/*
2429 * Transfer the connected socket to @upper_transport, then mark that
2430 * xprt CONNECTED.
2431 */
2432static int xs_tcp_tls_finish_connecting(struct rpc_xprt *lower_xprt,
2433 struct sock_xprt *upper_transport)
2434{
2435 struct sock_xprt *lower_transport =
2436 container_of(lower_xprt, struct sock_xprt, xprt);
2437 struct rpc_xprt *upper_xprt = &upper_transport->xprt;
2438
2439 if (!upper_transport->inet) {
2440 struct socket *sock = lower_transport->sock;
2441 struct sock *sk = sock->sk;
2442
2443 /* Avoid temporary address, they are bad for long-lived
2444 * connections such as NFS mounts.
2445 * RFC4941, section 3.6 suggests that:
2446 * Individual applications, which have specific
2447 * knowledge about the normal duration of connections,
2448 * MAY override this as appropriate.
2449 */
2450 if (xs_addr(upper_xprt)->sa_family == PF_INET6)
2451 ip6_sock_set_addr_preferences(sk, IPV6_PREFER_SRC_PUBLIC);
2452
2453 xs_tcp_set_socket_timeouts(upper_xprt, sock);
2454 tcp_sock_set_nodelay(sk);
2455
2456 lock_sock(sk);
2457
2458 /* @sk is already connected, so it now has the RPC callbacks.
2459 * Reach into @lower_transport to save the original ones.
2460 */
2461 upper_transport->old_data_ready = lower_transport->old_data_ready;
2462 upper_transport->old_state_change = lower_transport->old_state_change;
2463 upper_transport->old_write_space = lower_transport->old_write_space;
2464 upper_transport->old_error_report = lower_transport->old_error_report;
2465 sk->sk_user_data = upper_xprt;
2466
2467 /* socket options */
2468 sock_reset_flag(sk, SOCK_LINGER);
2469
2470 xprt_clear_connected(upper_xprt);
2471
2472 upper_transport->sock = sock;
2473 upper_transport->inet = sk;
2474 upper_transport->file = lower_transport->file;
2475
2476 release_sock(sk);
2477
2478 /* Reset lower_transport before shutting down its clnt */
2479 mutex_lock(&lower_transport->recv_mutex);
2480 lower_transport->inet = NULL;
2481 lower_transport->sock = NULL;
2482 lower_transport->file = NULL;
2483
2484 xprt_clear_connected(lower_xprt);
2485 xs_sock_reset_connection_flags(lower_xprt);
2486 xs_stream_reset_connect(lower_transport);
2487 mutex_unlock(&lower_transport->recv_mutex);
2488 }
2489
2490 if (!xprt_bound(upper_xprt))
2491 return -ENOTCONN;
2492
2493 xs_set_memalloc(upper_xprt);
2494
2495 if (!xprt_test_and_set_connected(upper_xprt)) {
2496 upper_xprt->connect_cookie++;
2497 clear_bit(XPRT_SOCK_CONNECTING, &upper_transport->sock_state);
2498 xprt_clear_connecting(upper_xprt);
2499
2500 upper_xprt->stat.connect_count++;
2501 upper_xprt->stat.connect_time += (long)jiffies -
2502 upper_xprt->stat.connect_start;
2503 xs_run_error_worker(upper_transport, XPRT_SOCK_WAKE_PENDING);
2504 }
2505 return 0;
2506}
2507
2419/**
2508/**
2509 * xs_tls_handshake_done - TLS handshake completion handler
2510 * @data: address of xprt to wake
2511 * @status: status of handshake
2512 * @peerid: serial number of key containing the remote's identity
2513 *
2514 */
2515static void xs_tls_handshake_done(void *data, int status, key_serial_t peerid)
2516{
2517 struct rpc_xprt *lower_xprt = data;
2518 struct sock_xprt *lower_transport =
2519 container_of(lower_xprt, struct sock_xprt, xprt);
2520
2521 lower_transport->xprt_err = status ? -EACCES : 0;
2522 complete(&lower_transport->handshake_done);
2523 xprt_put(lower_xprt);
2524}
2525
2526static int xs_tls_handshake_sync(struct rpc_xprt *lower_xprt, struct xprtsec_parms *xprtsec)
2527{
2528 struct sock_xprt *lower_transport =
2529 container_of(lower_xprt, struct sock_xprt, xprt);
2530 struct tls_handshake_args args = {
2531 .ta_sock = lower_transport->sock,
2532 .ta_done = xs_tls_handshake_done,
2533 .ta_data = xprt_get(lower_xprt),
2534 .ta_peername = lower_xprt->servername,
2535 };
2536 struct sock *sk = lower_transport->inet;
2537 int rc;
2538
2539 init_completion(&lower_transport->handshake_done);
2540 set_bit(XPRT_SOCK_IGNORE_RECV, &lower_transport->sock_state);
2541 lower_transport->xprt_err = -ETIMEDOUT;
2542 switch (xprtsec->policy) {
2543 case RPC_XPRTSEC_TLS_ANON:
2544 rc = tls_client_hello_anon(&args, GFP_KERNEL);
2545 if (rc)
2546 goto out_put_xprt;
2547 break;
2548 case RPC_XPRTSEC_TLS_X509:
2549 args.ta_my_cert = xprtsec->cert_serial;
2550 args.ta_my_privkey = xprtsec->privkey_serial;
2551 rc = tls_client_hello_x509(&args, GFP_KERNEL);
2552 if (rc)
2553 goto out_put_xprt;
2554 break;
2555 default:
2556 rc = -EACCES;
2557 goto out_put_xprt;
2558 }
2559
2560 rc = wait_for_completion_interruptible_timeout(&lower_transport->handshake_done,
2561 XS_TLS_HANDSHAKE_TO);
2562 if (rc <= 0) {
2563 if (!tls_handshake_cancel(sk)) {
2564 if (rc == 0)
2565 rc = -ETIMEDOUT;
2566 goto out_put_xprt;
2567 }
2568 }
2569
2570 rc = lower_transport->xprt_err;
2571
2572out:
2573 xs_stream_reset_connect(lower_transport);
2574 clear_bit(XPRT_SOCK_IGNORE_RECV, &lower_transport->sock_state);
2575 return rc;
2576
2577out_put_xprt:
2578 xprt_put(lower_xprt);
2579 goto out;
2580}
2581
2582/**
2583 * xs_tcp_tls_setup_socket - establish a TLS session on a TCP socket
2584 * @work: queued work item
2585 *
2586 * Invoked by a work queue tasklet.
2587 *
2588 * For RPC-with-TLS, there is a two-stage connection process.
2589 *
2590 * The "upper-layer xprt" is visible to the RPC consumer. Once it has
2591 * been marked connected, the consumer knows that a TCP connection and
2592 * a TLS session have been established.
2593 *
2594 * A "lower-layer xprt", created in this function, handles the mechanics
2595 * of connecting the TCP socket, performing the RPC_AUTH_TLS probe, and
2596 * then driving the TLS handshake. Once all that is complete, the upper
2597 * layer xprt is marked connected.
2598 */
2599static void xs_tcp_tls_setup_socket(struct work_struct *work)
2600{
2601 struct sock_xprt *upper_transport =
2602 container_of(work, struct sock_xprt, connect_worker.work);
2603 struct rpc_clnt *upper_clnt = upper_transport->clnt;
2604 struct rpc_xprt *upper_xprt = &upper_transport->xprt;
2605 struct rpc_create_args args = {
2606 .net = upper_xprt->xprt_net,
2607 .protocol = upper_xprt->prot,
2608 .address = (struct sockaddr *)&upper_xprt->addr,
2609 .addrsize = upper_xprt->addrlen,
2610 .timeout = upper_clnt->cl_timeout,
2611 .servername = upper_xprt->servername,
2612 .program = upper_clnt->cl_program,
2613 .prognumber = upper_clnt->cl_prog,
2614 .version = upper_clnt->cl_vers,
2615 .authflavor = RPC_AUTH_TLS,
2616 .cred = upper_clnt->cl_cred,
2617 .xprtsec = {
2618 .policy = RPC_XPRTSEC_NONE,
2619 },
2620 };
2621 unsigned int pflags = current->flags;
2622 struct rpc_clnt *lower_clnt;
2623 struct rpc_xprt *lower_xprt;
2624 int status;
2625
2626 if (atomic_read(&upper_xprt->swapper))
2627 current->flags |= PF_MEMALLOC;
2628
2629 xs_stream_start_connect(upper_transport);
2630
2631 /* This implicitly sends an RPC_AUTH_TLS probe */
2632 lower_clnt = rpc_create(&args);
2633 if (IS_ERR(lower_clnt)) {
2634 trace_rpc_tls_unavailable(upper_clnt, upper_xprt);
2635 clear_bit(XPRT_SOCK_CONNECTING, &upper_transport->sock_state);
2636 xprt_clear_connecting(upper_xprt);
2637 xprt_wake_pending_tasks(upper_xprt, PTR_ERR(lower_clnt));
2638 xs_run_error_worker(upper_transport, XPRT_SOCK_WAKE_PENDING);
2639 goto out_unlock;
2640 }
2641
2642 /* RPC_AUTH_TLS probe was successful. Try a TLS handshake on
2643 * the lower xprt.
2644 */
2645 rcu_read_lock();
2646 lower_xprt = rcu_dereference(lower_clnt->cl_xprt);
2647 rcu_read_unlock();
2648 status = xs_tls_handshake_sync(lower_xprt, &upper_xprt->xprtsec);
2649 if (status) {
2650 trace_rpc_tls_not_started(upper_clnt, upper_xprt);
2651 goto out_close;
2652 }
2653
2654 status = xs_tcp_tls_finish_connecting(lower_xprt, upper_transport);
2655 if (status)
2656 goto out_close;
2657
2658 trace_rpc_socket_connect(upper_xprt, upper_transport->sock, 0);
2659 if (!xprt_test_and_set_connected(upper_xprt)) {
2660 upper_xprt->connect_cookie++;
2661 clear_bit(XPRT_SOCK_CONNECTING, &upper_transport->sock_state);
2662 xprt_clear_connecting(upper_xprt);
2663
2664 upper_xprt->stat.connect_count++;
2665 upper_xprt->stat.connect_time += (long)jiffies -
2666 upper_xprt->stat.connect_start;
2667 xs_run_error_worker(upper_transport, XPRT_SOCK_WAKE_PENDING);
2668 }
2669 rpc_shutdown_client(lower_clnt);
2670
2671out_unlock:
2672 current_restore_flags(pflags, PF_MEMALLOC);
2673 upper_transport->clnt = NULL;
2674 xprt_unlock_connect(upper_xprt, upper_transport);
2675 return;
2676
2677out_close:
2678 rpc_shutdown_client(lower_clnt);
2679
2680 /* xprt_force_disconnect() wakes tasks with a fixed tk_status code.
2681 * Wake them first here to ensure they get our tk_status code.
2682 */
2683 xprt_wake_pending_tasks(upper_xprt, status);
2684 xs_tcp_force_close(upper_xprt);
2685 xprt_clear_connecting(upper_xprt);
2686 goto out_unlock;
2687}
2688
2689/**
2420 * xs_connect - connect a socket to a remote endpoint
2421 * @xprt: pointer to transport structure
2422 * @task: address of RPC task that manages state of connect request
2423 *
2424 * TCP: If the remote end dropped the connection, delay reconnecting.
2425 *
2426 * UDP socket connects are synchronous, but we use a work queue anyway
2427 * to guarantee that even unprivileged user processes can set up a

--- 14 unchanged lines hidden (view full) ---

2442 "seconds\n", xprt, xprt->reestablish_timeout / HZ);
2443
2444 delay = xprt_reconnect_delay(xprt);
2445 xprt_reconnect_backoff(xprt, XS_TCP_INIT_REEST_TO);
2446
2447 } else
2448 dprintk("RPC: xs_connect scheduled xprt %p\n", xprt);
2449
2690 * xs_connect - connect a socket to a remote endpoint
2691 * @xprt: pointer to transport structure
2692 * @task: address of RPC task that manages state of connect request
2693 *
2694 * TCP: If the remote end dropped the connection, delay reconnecting.
2695 *
2696 * UDP socket connects are synchronous, but we use a work queue anyway
2697 * to guarantee that even unprivileged user processes can set up a

--- 14 unchanged lines hidden (view full) ---

2712 "seconds\n", xprt, xprt->reestablish_timeout / HZ);
2713
2714 delay = xprt_reconnect_delay(xprt);
2715 xprt_reconnect_backoff(xprt, XS_TCP_INIT_REEST_TO);
2716
2717 } else
2718 dprintk("RPC: xs_connect scheduled xprt %p\n", xprt);
2719
2720 transport->clnt = task->tk_client;
2450 queue_delayed_work(xprtiod_workqueue,
2451 &transport->connect_worker,
2452 delay);
2453}
2454
2455static void xs_wake_disconnect(struct sock_xprt *transport)
2456{
2457 if (test_and_clear_bit(XPRT_SOCK_WAKE_DISCONNECT, &transport->sock_state))

--- 638 unchanged lines hidden (view full) ---

3096 return xprt;
3097 ret = ERR_PTR(-EINVAL);
3098out_err:
3099 xs_xprt_free(xprt);
3100 return ret;
3101}
3102
3103/**
2721 queue_delayed_work(xprtiod_workqueue,
2722 &transport->connect_worker,
2723 delay);
2724}
2725
2726static void xs_wake_disconnect(struct sock_xprt *transport)
2727{
2728 if (test_and_clear_bit(XPRT_SOCK_WAKE_DISCONNECT, &transport->sock_state))

--- 638 unchanged lines hidden (view full) ---

3367 return xprt;
3368 ret = ERR_PTR(-EINVAL);
3369out_err:
3370 xs_xprt_free(xprt);
3371 return ret;
3372}
3373
3374/**
3375 * xs_setup_tcp_tls - Set up transport to use a TCP with TLS
3376 * @args: rpc transport creation arguments
3377 *
3378 */
3379static struct rpc_xprt *xs_setup_tcp_tls(struct xprt_create *args)
3380{
3381 struct sockaddr *addr = args->dstaddr;
3382 struct rpc_xprt *xprt;
3383 struct sock_xprt *transport;
3384 struct rpc_xprt *ret;
3385 unsigned int max_slot_table_size = xprt_max_tcp_slot_table_entries;
3386
3387 if (args->flags & XPRT_CREATE_INFINITE_SLOTS)
3388 max_slot_table_size = RPC_MAX_SLOT_TABLE_LIMIT;
3389
3390 xprt = xs_setup_xprt(args, xprt_tcp_slot_table_entries,
3391 max_slot_table_size);
3392 if (IS_ERR(xprt))
3393 return xprt;
3394 transport = container_of(xprt, struct sock_xprt, xprt);
3395
3396 xprt->prot = IPPROTO_TCP;
3397 xprt->xprt_class = &xs_tcp_transport;
3398 xprt->max_payload = RPC_MAX_FRAGMENT_SIZE;
3399
3400 xprt->bind_timeout = XS_BIND_TO;
3401 xprt->reestablish_timeout = XS_TCP_INIT_REEST_TO;
3402 xprt->idle_timeout = XS_IDLE_DISC_TO;
3403
3404 xprt->ops = &xs_tcp_ops;
3405 xprt->timeout = &xs_tcp_default_timeout;
3406
3407 xprt->max_reconnect_timeout = xprt->timeout->to_maxval;
3408 xprt->connect_timeout = xprt->timeout->to_initval *
3409 (xprt->timeout->to_retries + 1);
3410
3411 INIT_WORK(&transport->recv_worker, xs_stream_data_receive_workfn);
3412 INIT_WORK(&transport->error_worker, xs_error_handle);
3413
3414 switch (args->xprtsec.policy) {
3415 case RPC_XPRTSEC_TLS_ANON:
3416 case RPC_XPRTSEC_TLS_X509:
3417 xprt->xprtsec = args->xprtsec;
3418 INIT_DELAYED_WORK(&transport->connect_worker,
3419 xs_tcp_tls_setup_socket);
3420 break;
3421 default:
3422 ret = ERR_PTR(-EACCES);
3423 goto out_err;
3424 }
3425
3426 switch (addr->sa_family) {
3427 case AF_INET:
3428 if (((struct sockaddr_in *)addr)->sin_port != htons(0))
3429 xprt_set_bound(xprt);
3430
3431 xs_format_peer_addresses(xprt, "tcp", RPCBIND_NETID_TCP);
3432 break;
3433 case AF_INET6:
3434 if (((struct sockaddr_in6 *)addr)->sin6_port != htons(0))
3435 xprt_set_bound(xprt);
3436
3437 xs_format_peer_addresses(xprt, "tcp", RPCBIND_NETID_TCP6);
3438 break;
3439 default:
3440 ret = ERR_PTR(-EAFNOSUPPORT);
3441 goto out_err;
3442 }
3443
3444 if (xprt_bound(xprt))
3445 dprintk("RPC: set up xprt to %s (port %s) via %s\n",
3446 xprt->address_strings[RPC_DISPLAY_ADDR],
3447 xprt->address_strings[RPC_DISPLAY_PORT],
3448 xprt->address_strings[RPC_DISPLAY_PROTO]);
3449 else
3450 dprintk("RPC: set up xprt to %s (autobind) via %s\n",
3451 xprt->address_strings[RPC_DISPLAY_ADDR],
3452 xprt->address_strings[RPC_DISPLAY_PROTO]);
3453
3454 if (try_module_get(THIS_MODULE))
3455 return xprt;
3456 ret = ERR_PTR(-EINVAL);
3457out_err:
3458 xs_xprt_free(xprt);
3459 return ret;
3460}
3461
3462/**
3104 * xs_setup_bc_tcp - Set up transport to use a TCP backchannel socket
3105 * @args: rpc transport creation arguments
3106 *
3107 */
3108static struct rpc_xprt *xs_setup_bc_tcp(struct xprt_create *args)
3109{
3110 struct sockaddr *addr = args->dstaddr;
3111 struct rpc_xprt *xprt;

--- 92 unchanged lines hidden (view full) ---

3204 .list = LIST_HEAD_INIT(xs_tcp_transport.list),
3205 .name = "tcp",
3206 .owner = THIS_MODULE,
3207 .ident = XPRT_TRANSPORT_TCP,
3208 .setup = xs_setup_tcp,
3209 .netid = { "tcp", "tcp6", "" },
3210};
3211
3463 * xs_setup_bc_tcp - Set up transport to use a TCP backchannel socket
3464 * @args: rpc transport creation arguments
3465 *
3466 */
3467static struct rpc_xprt *xs_setup_bc_tcp(struct xprt_create *args)
3468{
3469 struct sockaddr *addr = args->dstaddr;
3470 struct rpc_xprt *xprt;

--- 92 unchanged lines hidden (view full) ---

3563 .list = LIST_HEAD_INIT(xs_tcp_transport.list),
3564 .name = "tcp",
3565 .owner = THIS_MODULE,
3566 .ident = XPRT_TRANSPORT_TCP,
3567 .setup = xs_setup_tcp,
3568 .netid = { "tcp", "tcp6", "" },
3569};
3570
3571static struct xprt_class xs_tcp_tls_transport = {
3572 .list = LIST_HEAD_INIT(xs_tcp_tls_transport.list),
3573 .name = "tcp-with-tls",
3574 .owner = THIS_MODULE,
3575 .ident = XPRT_TRANSPORT_TCP_TLS,
3576 .setup = xs_setup_tcp_tls,
3577 .netid = { "tcp", "tcp6", "" },
3578};
3579
3212static struct xprt_class xs_bc_tcp_transport = {
3213 .list = LIST_HEAD_INIT(xs_bc_tcp_transport.list),
3214 .name = "tcp NFSv4.1 backchannel",
3215 .owner = THIS_MODULE,
3216 .ident = XPRT_TRANSPORT_BC_TCP,
3217 .setup = xs_setup_bc_tcp,
3218 .netid = { "" },
3219};

--- 5 unchanged lines hidden (view full) ---

3225int init_socket_xprt(void)
3226{
3227 if (!sunrpc_table_header)
3228 sunrpc_table_header = register_sysctl("sunrpc", xs_tunables_table);
3229
3230 xprt_register_transport(&xs_local_transport);
3231 xprt_register_transport(&xs_udp_transport);
3232 xprt_register_transport(&xs_tcp_transport);
3580static struct xprt_class xs_bc_tcp_transport = {
3581 .list = LIST_HEAD_INIT(xs_bc_tcp_transport.list),
3582 .name = "tcp NFSv4.1 backchannel",
3583 .owner = THIS_MODULE,
3584 .ident = XPRT_TRANSPORT_BC_TCP,
3585 .setup = xs_setup_bc_tcp,
3586 .netid = { "" },
3587};

--- 5 unchanged lines hidden (view full) ---

3593int init_socket_xprt(void)
3594{
3595 if (!sunrpc_table_header)
3596 sunrpc_table_header = register_sysctl("sunrpc", xs_tunables_table);
3597
3598 xprt_register_transport(&xs_local_transport);
3599 xprt_register_transport(&xs_udp_transport);
3600 xprt_register_transport(&xs_tcp_transport);
3601 xprt_register_transport(&xs_tcp_tls_transport);
3233 xprt_register_transport(&xs_bc_tcp_transport);
3234
3235 return 0;
3236}
3237
3238/**
3239 * cleanup_socket_xprt - remove xprtsock's sysctls, unregister
3240 *
3241 */
3242void cleanup_socket_xprt(void)
3243{
3244 if (sunrpc_table_header) {
3245 unregister_sysctl_table(sunrpc_table_header);
3246 sunrpc_table_header = NULL;
3247 }
3248
3249 xprt_unregister_transport(&xs_local_transport);
3250 xprt_unregister_transport(&xs_udp_transport);
3251 xprt_unregister_transport(&xs_tcp_transport);
3602 xprt_register_transport(&xs_bc_tcp_transport);
3603
3604 return 0;
3605}
3606
3607/**
3608 * cleanup_socket_xprt - remove xprtsock's sysctls, unregister
3609 *
3610 */
3611void cleanup_socket_xprt(void)
3612{
3613 if (sunrpc_table_header) {
3614 unregister_sysctl_table(sunrpc_table_header);
3615 sunrpc_table_header = NULL;
3616 }
3617
3618 xprt_unregister_transport(&xs_local_transport);
3619 xprt_unregister_transport(&xs_udp_transport);
3620 xprt_unregister_transport(&xs_tcp_transport);
3621 xprt_unregister_transport(&xs_tcp_tls_transport);
3252 xprt_unregister_transport(&xs_bc_tcp_transport);
3253}
3254
3255static int param_set_portnr(const char *val, const struct kernel_param *kp)
3256{
3257 return param_set_uint_minmax(val, kp,
3258 RPC_MIN_RESVPORT,
3259 RPC_MAX_RESVPORT);

--- 51 unchanged lines hidden ---
3622 xprt_unregister_transport(&xs_bc_tcp_transport);
3623}
3624
3625static int param_set_portnr(const char *val, const struct kernel_param *kp)
3626{
3627 return param_set_uint_minmax(val, kp,
3628 RPC_MIN_RESVPORT,
3629 RPC_MAX_RESVPORT);

--- 51 unchanged lines hidden ---