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
17static struct ctl_table_header *rxrpc_sysctl_reg_table;
18static const unsigned zero = 0;
19static const unsigned one = 1;
20static const unsigned four = 4;
21static const unsigned n_65535 = 65535;
22static 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 */
30static 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
133int __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
142void rxrpc_sysctl_exit(void)
143{
144	if (rxrpc_sysctl_reg_table)
145		unregister_net_sysctl_table(rxrpc_sysctl_reg_table);
146}
147