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_MAXACKS; 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_ms_jiffies, 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_ms_jiffies, 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_ms_jiffies, 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_ms_jiffies, 63 .extra1 = (void *)&one, 64 }, 65 66 /* Values measured in seconds but used in jiffies */ 67 { 68 .procname = "max_call_lifetime", 69 .data = &rxrpc_max_call_lifetime, 70 .maxlen = sizeof(unsigned int), 71 .mode = 0644, 72 .proc_handler = proc_dointvec_jiffies, 73 .extra1 = (void *)&one, 74 }, 75 { 76 .procname = "dead_call_expiry", 77 .data = &rxrpc_dead_call_expiry, 78 .maxlen = sizeof(unsigned int), 79 .mode = 0644, 80 .proc_handler = proc_dointvec_jiffies, 81 .extra1 = (void *)&one, 82 }, 83 84 /* Values measured in seconds */ 85 { 86 .procname = "connection_expiry", 87 .data = &rxrpc_connection_expiry, 88 .maxlen = sizeof(unsigned int), 89 .mode = 0644, 90 .proc_handler = proc_dointvec_minmax, 91 .extra1 = (void *)&one, 92 }, 93 94 /* Non-time values */ 95 { 96 .procname = "max_backlog", 97 .data = &rxrpc_max_backlog, 98 .maxlen = sizeof(unsigned int), 99 .mode = 0644, 100 .proc_handler = proc_dointvec_minmax, 101 .extra1 = (void *)&four, 102 .extra2 = (void *)&thirtytwo, 103 }, 104 { 105 .procname = "rx_window_size", 106 .data = &rxrpc_rx_window_size, 107 .maxlen = sizeof(unsigned int), 108 .mode = 0644, 109 .proc_handler = proc_dointvec_minmax, 110 .extra1 = (void *)&one, 111 .extra2 = (void *)&n_max_acks, 112 }, 113 { 114 .procname = "rx_mtu", 115 .data = &rxrpc_rx_mtu, 116 .maxlen = sizeof(unsigned int), 117 .mode = 0644, 118 .proc_handler = proc_dointvec_minmax, 119 .extra1 = (void *)&one, 120 .extra2 = (void *)&n_65535, 121 }, 122 { 123 .procname = "rx_jumbo_max", 124 .data = &rxrpc_rx_jumbo_max, 125 .maxlen = sizeof(unsigned int), 126 .mode = 0644, 127 .proc_handler = proc_dointvec_minmax, 128 .extra1 = (void *)&one, 129 .extra2 = (void *)&four, 130 }, 131 132 { } 133 }; 134 135 int __init rxrpc_sysctl_init(void) 136 { 137 rxrpc_sysctl_reg_table = register_net_sysctl(&init_net, "net/rxrpc", 138 rxrpc_sysctl_table); 139 if (!rxrpc_sysctl_reg_table) 140 return -ENOMEM; 141 return 0; 142 } 143 144 void rxrpc_sysctl_exit(void) 145 { 146 if (rxrpc_sysctl_reg_table) 147 unregister_net_sysctl_table(rxrpc_sysctl_reg_table); 148 } 149