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