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 zero = 0; 19 static const unsigned one = 1; 20 static const unsigned four = 4; 21 static const unsigned n_65535 = 65535; 22 static const unsigned n_max_acks = RXRPC_MAXACKS; 23 24 /* 25 * RxRPC operating parameters. 26 * 27 * See Documentation/networking/rxrpc.txt 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 */ 32 { 33 .procname = "req_ack_delay", 34 .data = &rxrpc_requested_ack_delay, 35 .maxlen = sizeof(unsigned), 36 .mode = 0644, 37 .proc_handler = proc_dointvec_ms_jiffies, 38 .extra1 = (void *)&zero, 39 }, 40 { 41 .procname = "soft_ack_delay", 42 .data = &rxrpc_soft_ack_delay, 43 .maxlen = sizeof(unsigned), 44 .mode = 0644, 45 .proc_handler = proc_dointvec_ms_jiffies, 46 .extra1 = (void *)&one, 47 }, 48 { 49 .procname = "idle_ack_delay", 50 .data = &rxrpc_idle_ack_delay, 51 .maxlen = sizeof(unsigned), 52 .mode = 0644, 53 .proc_handler = proc_dointvec_ms_jiffies, 54 .extra1 = (void *)&one, 55 }, 56 { 57 .procname = "resend_timeout", 58 .data = &rxrpc_resend_timeout, 59 .maxlen = sizeof(unsigned), 60 .mode = 0644, 61 .proc_handler = proc_dointvec_ms_jiffies, 62 .extra1 = (void *)&one, 63 }, 64 65 /* Values measured in seconds but used in jiffies */ 66 { 67 .procname = "max_call_lifetime", 68 .data = &rxrpc_max_call_lifetime, 69 .maxlen = sizeof(unsigned), 70 .mode = 0644, 71 .proc_handler = proc_dointvec_jiffies, 72 .extra1 = (void *)&one, 73 }, 74 { 75 .procname = "dead_call_expiry", 76 .data = &rxrpc_dead_call_expiry, 77 .maxlen = sizeof(unsigned), 78 .mode = 0644, 79 .proc_handler = proc_dointvec_jiffies, 80 .extra1 = (void *)&one, 81 }, 82 83 /* Values measured in seconds */ 84 { 85 .procname = "connection_expiry", 86 .data = &rxrpc_connection_expiry, 87 .maxlen = sizeof(unsigned), 88 .mode = 0644, 89 .proc_handler = proc_dointvec_minmax, 90 .extra1 = (void *)&one, 91 }, 92 { 93 .procname = "transport_expiry", 94 .data = &rxrpc_transport_expiry, 95 .maxlen = sizeof(unsigned), 96 .mode = 0644, 97 .proc_handler = proc_dointvec_minmax, 98 .extra1 = (void *)&one, 99 }, 100 101 /* Non-time values */ 102 { 103 .procname = "rx_window_size", 104 .data = &rxrpc_rx_window_size, 105 .maxlen = sizeof(unsigned), 106 .mode = 0644, 107 .proc_handler = proc_dointvec_minmax, 108 .extra1 = (void *)&one, 109 .extra2 = (void *)&n_max_acks, 110 }, 111 { 112 .procname = "rx_mtu", 113 .data = &rxrpc_rx_mtu, 114 .maxlen = sizeof(unsigned), 115 .mode = 0644, 116 .proc_handler = proc_dointvec_minmax, 117 .extra1 = (void *)&one, 118 .extra1 = (void *)&n_65535, 119 }, 120 { 121 .procname = "rx_jumbo_max", 122 .data = &rxrpc_rx_jumbo_max, 123 .maxlen = sizeof(unsigned), 124 .mode = 0644, 125 .proc_handler = proc_dointvec_minmax, 126 .extra1 = (void *)&one, 127 .extra2 = (void *)&four, 128 }, 129 130 { } 131 }; 132 133 int __init rxrpc_sysctl_init(void) 134 { 135 rxrpc_sysctl_reg_table = register_net_sysctl(&init_net, "net/rxrpc", 136 rxrpc_sysctl_table); 137 if (!rxrpc_sysctl_reg_table) 138 return -ENOMEM; 139 return 0; 140 } 141 142 void rxrpc_sysctl_exit(void) 143 { 144 if (rxrpc_sysctl_reg_table) 145 unregister_net_sysctl_table(rxrpc_sysctl_reg_table); 146 } 147