1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* sysctls for configuring RxRPC operating parameters 3 * 4 * Copyright (C) 2014 Red Hat, Inc. All Rights Reserved. 5 * Written by David Howells (dhowells@redhat.com) 6 */ 7 8 #include <linux/sysctl.h> 9 #include <net/sock.h> 10 #include <net/af_rxrpc.h> 11 #include "ar-internal.h" 12 13 static struct ctl_table_header *rxrpc_sysctl_reg_table; 14 static const unsigned int four = 4; 15 static const unsigned int max_backlog = RXRPC_BACKLOG_MAX - 1; 16 static const unsigned int n_65535 = 65535; 17 static const unsigned int n_max_acks = 255; 18 static const unsigned long one_jiffy = 1; 19 static const unsigned long max_jiffies = MAX_JIFFY_OFFSET; 20 #ifdef CONFIG_AF_RXRPC_INJECT_RX_DELAY 21 static const unsigned long max_500 = 500; 22 #endif 23 24 /* 25 * RxRPC operating parameters. 26 * 27 * See Documentation/networking/rxrpc.rst and the variable definitions for more 28 * information on the individual parameters. 29 */ 30 static struct ctl_table rxrpc_sysctl_table[] = { 31 /* Values measured in milliseconds but used in jiffies */ 32 { 33 .procname = "soft_ack_delay", 34 .data = &rxrpc_soft_ack_delay, 35 .maxlen = sizeof(unsigned long), 36 .mode = 0644, 37 .proc_handler = proc_doulongvec_ms_jiffies_minmax, 38 .extra1 = (void *)&one_jiffy, 39 .extra2 = (void *)&max_jiffies, 40 }, 41 { 42 .procname = "idle_ack_delay", 43 .data = &rxrpc_idle_ack_delay, 44 .maxlen = sizeof(unsigned long), 45 .mode = 0644, 46 .proc_handler = proc_doulongvec_ms_jiffies_minmax, 47 .extra1 = (void *)&one_jiffy, 48 .extra2 = (void *)&max_jiffies, 49 }, 50 { 51 .procname = "idle_conn_expiry", 52 .data = &rxrpc_conn_idle_client_expiry, 53 .maxlen = sizeof(unsigned long), 54 .mode = 0644, 55 .proc_handler = proc_doulongvec_ms_jiffies_minmax, 56 .extra1 = (void *)&one_jiffy, 57 .extra2 = (void *)&max_jiffies, 58 }, 59 { 60 .procname = "idle_conn_fast_expiry", 61 .data = &rxrpc_conn_idle_client_fast_expiry, 62 .maxlen = sizeof(unsigned long), 63 .mode = 0644, 64 .proc_handler = proc_doulongvec_ms_jiffies_minmax, 65 .extra1 = (void *)&one_jiffy, 66 .extra2 = (void *)&max_jiffies, 67 }, 68 69 /* Values used in milliseconds */ 70 #ifdef CONFIG_AF_RXRPC_INJECT_RX_DELAY 71 { 72 .procname = "inject_rx_delay", 73 .data = &rxrpc_inject_rx_delay, 74 .maxlen = sizeof(unsigned long), 75 .mode = 0644, 76 .proc_handler = proc_doulongvec_minmax, 77 .extra1 = (void *)SYSCTL_LONG_ZERO, 78 .extra2 = (void *)&max_500, 79 }, 80 #endif 81 82 /* Non-time values */ 83 { 84 .procname = "reap_client_conns", 85 .data = &rxrpc_reap_client_connections, 86 .maxlen = sizeof(unsigned int), 87 .mode = 0644, 88 .proc_handler = proc_dointvec_minmax, 89 .extra1 = (void *)SYSCTL_ONE, 90 .extra2 = (void *)&n_65535, 91 }, 92 { 93 .procname = "max_backlog", 94 .data = &rxrpc_max_backlog, 95 .maxlen = sizeof(unsigned int), 96 .mode = 0644, 97 .proc_handler = proc_dointvec_minmax, 98 .extra1 = (void *)&four, 99 .extra2 = (void *)&max_backlog, 100 }, 101 { 102 .procname = "rx_window_size", 103 .data = &rxrpc_rx_window_size, 104 .maxlen = sizeof(unsigned int), 105 .mode = 0644, 106 .proc_handler = proc_dointvec_minmax, 107 .extra1 = (void *)SYSCTL_ONE, 108 .extra2 = (void *)&n_max_acks, 109 }, 110 { 111 .procname = "rx_mtu", 112 .data = &rxrpc_rx_mtu, 113 .maxlen = sizeof(unsigned int), 114 .mode = 0644, 115 .proc_handler = proc_dointvec_minmax, 116 .extra1 = (void *)SYSCTL_ONE, 117 .extra2 = (void *)&n_65535, 118 }, 119 { 120 .procname = "rx_jumbo_max", 121 .data = &rxrpc_rx_jumbo_max, 122 .maxlen = sizeof(unsigned int), 123 .mode = 0644, 124 .proc_handler = proc_dointvec_minmax, 125 .extra1 = (void *)SYSCTL_ONE, 126 .extra2 = (void *)&four, 127 }, 128 { } 129 }; 130 131 int __init rxrpc_sysctl_init(void) 132 { 133 rxrpc_sysctl_reg_table = register_net_sysctl(&init_net, "net/rxrpc", 134 rxrpc_sysctl_table); 135 if (!rxrpc_sysctl_reg_table) 136 return -ENOMEM; 137 return 0; 138 } 139 140 void rxrpc_sysctl_exit(void) 141 { 142 if (rxrpc_sysctl_reg_table) 143 unregister_net_sysctl_table(rxrpc_sysctl_reg_table); 144 } 145