1 /* sysctls for configuring RxRPC operating parameters 2 * 3 * Copyright (C) 2014 Red Hat, Inc. All Rights Reserved. 4 * Written by David Howells (dhowells@redhat.com) 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public Licence 8 * as published by the Free Software Foundation; either version 9 * 2 of the Licence, or (at your option) any later version. 10 */ 11 12 #include <linux/sysctl.h> 13 #include <net/sock.h> 14 #include <net/af_rxrpc.h> 15 #include "ar-internal.h" 16 17 static struct ctl_table_header *rxrpc_sysctl_reg_table; 18 static const unsigned int zero = 0; 19 static const unsigned int one = 1; 20 static const unsigned int four = 4; 21 static const unsigned int thirtytwo = 32; 22 static const unsigned int n_65535 = 65535; 23 static const unsigned int n_max_acks = RXRPC_RXTX_BUFF_SIZE - 1; 24 25 /* 26 * RxRPC operating parameters. 27 * 28 * See Documentation/networking/rxrpc.txt and the variable definitions for more 29 * information on the individual parameters. 30 */ 31 static struct ctl_table rxrpc_sysctl_table[] = { 32 /* Values measured in milliseconds */ 33 { 34 .procname = "req_ack_delay", 35 .data = &rxrpc_requested_ack_delay, 36 .maxlen = sizeof(unsigned int), 37 .mode = 0644, 38 .proc_handler = proc_dointvec, 39 .extra1 = (void *)&zero, 40 }, 41 { 42 .procname = "soft_ack_delay", 43 .data = &rxrpc_soft_ack_delay, 44 .maxlen = sizeof(unsigned int), 45 .mode = 0644, 46 .proc_handler = proc_dointvec, 47 .extra1 = (void *)&one, 48 }, 49 { 50 .procname = "idle_ack_delay", 51 .data = &rxrpc_idle_ack_delay, 52 .maxlen = sizeof(unsigned int), 53 .mode = 0644, 54 .proc_handler = proc_dointvec, 55 .extra1 = (void *)&one, 56 }, 57 { 58 .procname = "resend_timeout", 59 .data = &rxrpc_resend_timeout, 60 .maxlen = sizeof(unsigned int), 61 .mode = 0644, 62 .proc_handler = proc_dointvec, 63 .extra1 = (void *)&one, 64 }, 65 { 66 .procname = "idle_conn_expiry", 67 .data = &rxrpc_conn_idle_client_expiry, 68 .maxlen = sizeof(unsigned int), 69 .mode = 0644, 70 .proc_handler = proc_dointvec_ms_jiffies, 71 .extra1 = (void *)&one, 72 }, 73 { 74 .procname = "idle_conn_fast_expiry", 75 .data = &rxrpc_conn_idle_client_fast_expiry, 76 .maxlen = sizeof(unsigned int), 77 .mode = 0644, 78 .proc_handler = proc_dointvec_ms_jiffies, 79 .extra1 = (void *)&one, 80 }, 81 82 /* Values measured in seconds but used in jiffies */ 83 { 84 .procname = "max_call_lifetime", 85 .data = &rxrpc_max_call_lifetime, 86 .maxlen = sizeof(unsigned int), 87 .mode = 0644, 88 .proc_handler = proc_dointvec, 89 .extra1 = (void *)&one, 90 }, 91 92 /* Non-time values */ 93 { 94 .procname = "max_client_conns", 95 .data = &rxrpc_max_client_connections, 96 .maxlen = sizeof(unsigned int), 97 .mode = 0644, 98 .proc_handler = proc_dointvec_minmax, 99 .extra1 = (void *)&rxrpc_reap_client_connections, 100 }, 101 { 102 .procname = "reap_client_conns", 103 .data = &rxrpc_reap_client_connections, 104 .maxlen = sizeof(unsigned int), 105 .mode = 0644, 106 .proc_handler = proc_dointvec_minmax, 107 .extra1 = (void *)&one, 108 .extra2 = (void *)&rxrpc_max_client_connections, 109 }, 110 { 111 .procname = "max_backlog", 112 .data = &rxrpc_max_backlog, 113 .maxlen = sizeof(unsigned int), 114 .mode = 0644, 115 .proc_handler = proc_dointvec_minmax, 116 .extra1 = (void *)&four, 117 .extra2 = (void *)&thirtytwo, 118 }, 119 { 120 .procname = "rx_window_size", 121 .data = &rxrpc_rx_window_size, 122 .maxlen = sizeof(unsigned int), 123 .mode = 0644, 124 .proc_handler = proc_dointvec_minmax, 125 .extra1 = (void *)&one, 126 .extra2 = (void *)&n_max_acks, 127 }, 128 { 129 .procname = "rx_mtu", 130 .data = &rxrpc_rx_mtu, 131 .maxlen = sizeof(unsigned int), 132 .mode = 0644, 133 .proc_handler = proc_dointvec_minmax, 134 .extra1 = (void *)&one, 135 .extra2 = (void *)&n_65535, 136 }, 137 { 138 .procname = "rx_jumbo_max", 139 .data = &rxrpc_rx_jumbo_max, 140 .maxlen = sizeof(unsigned int), 141 .mode = 0644, 142 .proc_handler = proc_dointvec_minmax, 143 .extra1 = (void *)&one, 144 .extra2 = (void *)&four, 145 }, 146 147 { } 148 }; 149 150 int __init rxrpc_sysctl_init(void) 151 { 152 rxrpc_sysctl_reg_table = register_net_sysctl(&init_net, "net/rxrpc", 153 rxrpc_sysctl_table); 154 if (!rxrpc_sysctl_reg_table) 155 return -ENOMEM; 156 return 0; 157 } 158 159 void rxrpc_sysctl_exit(void) 160 { 161 if (rxrpc_sysctl_reg_table) 162 unregister_net_sysctl_table(rxrpc_sysctl_reg_table); 163 } 164