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 static const unsigned long one_jiffy = 1; 25 static const unsigned long max_jiffies = MAX_JIFFY_OFFSET; 26 27 /* 28 * RxRPC operating parameters. 29 * 30 * See Documentation/networking/rxrpc.txt and the variable definitions for more 31 * information on the individual parameters. 32 */ 33 static struct ctl_table rxrpc_sysctl_table[] = { 34 /* Values measured in milliseconds but used in jiffies */ 35 { 36 .procname = "req_ack_delay", 37 .data = &rxrpc_requested_ack_delay, 38 .maxlen = sizeof(unsigned long), 39 .mode = 0644, 40 .proc_handler = proc_doulongvec_ms_jiffies_minmax, 41 .extra1 = (void *)&one_jiffy, 42 .extra2 = (void *)&max_jiffies, 43 }, 44 { 45 .procname = "soft_ack_delay", 46 .data = &rxrpc_soft_ack_delay, 47 .maxlen = sizeof(unsigned long), 48 .mode = 0644, 49 .proc_handler = proc_doulongvec_ms_jiffies_minmax, 50 .extra1 = (void *)&one_jiffy, 51 .extra2 = (void *)&max_jiffies, 52 }, 53 { 54 .procname = "idle_ack_delay", 55 .data = &rxrpc_idle_ack_delay, 56 .maxlen = sizeof(unsigned long), 57 .mode = 0644, 58 .proc_handler = proc_doulongvec_ms_jiffies_minmax, 59 .extra1 = (void *)&one_jiffy, 60 .extra2 = (void *)&max_jiffies, 61 }, 62 { 63 .procname = "idle_conn_expiry", 64 .data = &rxrpc_conn_idle_client_expiry, 65 .maxlen = sizeof(unsigned long), 66 .mode = 0644, 67 .proc_handler = proc_doulongvec_ms_jiffies_minmax, 68 .extra1 = (void *)&one_jiffy, 69 .extra2 = (void *)&max_jiffies, 70 }, 71 { 72 .procname = "idle_conn_fast_expiry", 73 .data = &rxrpc_conn_idle_client_fast_expiry, 74 .maxlen = sizeof(unsigned long), 75 .mode = 0644, 76 .proc_handler = proc_doulongvec_ms_jiffies_minmax, 77 .extra1 = (void *)&one_jiffy, 78 .extra2 = (void *)&max_jiffies, 79 }, 80 { 81 .procname = "resend_timeout", 82 .data = &rxrpc_resend_timeout, 83 .maxlen = sizeof(unsigned long), 84 .mode = 0644, 85 .proc_handler = proc_doulongvec_ms_jiffies_minmax, 86 .extra1 = (void *)&one_jiffy, 87 .extra2 = (void *)&max_jiffies, 88 }, 89 90 /* Non-time values */ 91 { 92 .procname = "max_client_conns", 93 .data = &rxrpc_max_client_connections, 94 .maxlen = sizeof(unsigned int), 95 .mode = 0644, 96 .proc_handler = proc_dointvec_minmax, 97 .extra1 = (void *)&rxrpc_reap_client_connections, 98 }, 99 { 100 .procname = "reap_client_conns", 101 .data = &rxrpc_reap_client_connections, 102 .maxlen = sizeof(unsigned int), 103 .mode = 0644, 104 .proc_handler = proc_dointvec_minmax, 105 .extra1 = (void *)&one, 106 .extra2 = (void *)&rxrpc_max_client_connections, 107 }, 108 { 109 .procname = "max_backlog", 110 .data = &rxrpc_max_backlog, 111 .maxlen = sizeof(unsigned int), 112 .mode = 0644, 113 .proc_handler = proc_dointvec_minmax, 114 .extra1 = (void *)&four, 115 .extra2 = (void *)&thirtytwo, 116 }, 117 { 118 .procname = "rx_window_size", 119 .data = &rxrpc_rx_window_size, 120 .maxlen = sizeof(unsigned int), 121 .mode = 0644, 122 .proc_handler = proc_dointvec_minmax, 123 .extra1 = (void *)&one, 124 .extra2 = (void *)&n_max_acks, 125 }, 126 { 127 .procname = "rx_mtu", 128 .data = &rxrpc_rx_mtu, 129 .maxlen = sizeof(unsigned int), 130 .mode = 0644, 131 .proc_handler = proc_dointvec_minmax, 132 .extra1 = (void *)&one, 133 .extra2 = (void *)&n_65535, 134 }, 135 { 136 .procname = "rx_jumbo_max", 137 .data = &rxrpc_rx_jumbo_max, 138 .maxlen = sizeof(unsigned int), 139 .mode = 0644, 140 .proc_handler = proc_dointvec_minmax, 141 .extra1 = (void *)&one, 142 .extra2 = (void *)&four, 143 }, 144 145 { } 146 }; 147 148 int __init rxrpc_sysctl_init(void) 149 { 150 rxrpc_sysctl_reg_table = register_net_sysctl(&init_net, "net/rxrpc", 151 rxrpc_sysctl_table); 152 if (!rxrpc_sysctl_reg_table) 153 return -ENOMEM; 154 return 0; 155 } 156 157 void rxrpc_sysctl_exit(void) 158 { 159 if (rxrpc_sysctl_reg_table) 160 unregister_net_sysctl_table(rxrpc_sysctl_reg_table); 161 } 162