425 lines
13 KiB
Diff
425 lines
13 KiB
Diff
From: Vladislav Yasevich <vladislav.yasevich@hp.com>
|
|
Date: Tue, 22 Aug 2006 20:29:17 +0000 (-0700)
|
|
Subject: [SCTP]: Remove multiple levels of msecs to jiffies conversions.
|
|
X-Git-Tag: v2.6.19-rc1
|
|
X-Git-Url: http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=3fd091e73b81f131e1567c4d4a1ec042940bf2f7
|
|
|
|
[SCTP]: Remove multiple levels of msecs to jiffies conversions.
|
|
|
|
The SCTP sysctl entries are displayed in milliseconds, but stored
|
|
internally in jiffies. This results in multiple levels of msecs to
|
|
jiffies conversion and as a result produces a truncation error. This
|
|
patch makes things consistent in that we store and display defaults
|
|
in milliseconds and only convert once for use by association.
|
|
This patch also adds some sane min/max values so that we don't go off
|
|
the deep end.
|
|
|
|
Signed-off-by: Vladislav Yasevich <vladislav.yasevich@hp.com>
|
|
Signed-off-by: Sridhar Samudrala <sri@us.ibm.com>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
---
|
|
|
|
--- a/include/net/sctp/constants.h
|
|
+++ b/include/net/sctp/constants.h
|
|
@@ -264,10 +264,10 @@ enum { SCTP_MAX_DUP_TSNS = 16 };
|
|
enum { SCTP_MAX_GABS = 16 };
|
|
|
|
/* Heartbeat interval - 30 secs */
|
|
-#define SCTP_DEFAULT_TIMEOUT_HEARTBEAT (30 * HZ)
|
|
+#define SCTP_DEFAULT_TIMEOUT_HEARTBEAT (30*1000)
|
|
|
|
/* Delayed sack timer - 200ms */
|
|
-#define SCTP_DEFAULT_TIMEOUT_SACK ((200 * HZ) / 1000)
|
|
+#define SCTP_DEFAULT_TIMEOUT_SACK (200)
|
|
|
|
/* RTO.Initial - 3 seconds
|
|
* RTO.Min - 1 second
|
|
@@ -275,9 +275,9 @@ enum { SCTP_MAX_GABS = 16 };
|
|
* RTO.Alpha - 1/8
|
|
* RTO.Beta - 1/4
|
|
*/
|
|
-#define SCTP_RTO_INITIAL (3 * HZ)
|
|
-#define SCTP_RTO_MIN (1 * HZ)
|
|
-#define SCTP_RTO_MAX (60 * HZ)
|
|
+#define SCTP_RTO_INITIAL (3 * 1000)
|
|
+#define SCTP_RTO_MIN (1 * 1000)
|
|
+#define SCTP_RTO_MAX (60 * 1000)
|
|
|
|
#define SCTP_RTO_ALPHA 3 /* 1/8 when converted to right shifts. */
|
|
#define SCTP_RTO_BETA 2 /* 1/4 when converted to right shifts. */
|
|
@@ -290,8 +290,7 @@ enum { SCTP_MAX_GABS = 16 };
|
|
#define SCTP_DEF_MAX_INIT 6
|
|
#define SCTP_DEF_MAX_SEND 10
|
|
|
|
-#define SCTP_DEFAULT_COOKIE_LIFE_SEC 60 /* seconds */
|
|
-#define SCTP_DEFAULT_COOKIE_LIFE_USEC 0 /* microseconds */
|
|
+#define SCTP_DEFAULT_COOKIE_LIFE (60 * 1000) /* 60 seconds */
|
|
|
|
#define SCTP_DEFAULT_MINWINDOW 1500 /* default minimum rwnd size */
|
|
#define SCTP_DEFAULT_MAXWINDOW 65535 /* default rwnd size */
|
|
--- a/include/net/sctp/structs.h
|
|
+++ b/include/net/sctp/structs.h
|
|
@@ -128,9 +128,9 @@ extern struct sctp_globals {
|
|
* RTO.Alpha - 1/8 (3 when converted to right shifts.)
|
|
* RTO.Beta - 1/4 (2 when converted to right shifts.)
|
|
*/
|
|
- unsigned long rto_initial;
|
|
- unsigned long rto_min;
|
|
- unsigned long rto_max;
|
|
+ unsigned int rto_initial;
|
|
+ unsigned int rto_min;
|
|
+ unsigned int rto_max;
|
|
|
|
/* Note: rto_alpha and rto_beta are really defined as inverse
|
|
* powers of two to facilitate integer operations.
|
|
@@ -145,13 +145,13 @@ extern struct sctp_globals {
|
|
int cookie_preserve_enable;
|
|
|
|
/* Valid.Cookie.Life - 60 seconds */
|
|
- unsigned long valid_cookie_life;
|
|
+ unsigned int valid_cookie_life;
|
|
|
|
/* Delayed SACK timeout 200ms default*/
|
|
- unsigned long sack_timeout;
|
|
+ unsigned int sack_timeout;
|
|
|
|
/* HB.interval - 30 seconds */
|
|
- unsigned long hb_interval;
|
|
+ unsigned int hb_interval;
|
|
|
|
/* Association.Max.Retrans - 10 attempts
|
|
* Path.Max.Retrans - 5 attempts (per destination address)
|
|
--- a/net/sctp/protocol.c
|
|
+++ b/net/sctp/protocol.c
|
|
@@ -1049,7 +1049,7 @@ SCTP_STATIC __init int sctp_init(void)
|
|
sctp_rto_beta = SCTP_RTO_BETA;
|
|
|
|
/* Valid.Cookie.Life - 60 seconds */
|
|
- sctp_valid_cookie_life = 60 * HZ;
|
|
+ sctp_valid_cookie_life = SCTP_DEFAULT_COOKIE_LIFE;
|
|
|
|
/* Whether Cookie Preservative is enabled(1) or not(0) */
|
|
sctp_cookie_preserve_enable = 1;
|
|
--- a/net/sctp/socket.c
|
|
+++ b/net/sctp/socket.c
|
|
@@ -3045,14 +3045,14 @@ SCTP_STATIC int sctp_init_sock(struct so
|
|
sp->initmsg.sinit_num_ostreams = sctp_max_outstreams;
|
|
sp->initmsg.sinit_max_instreams = sctp_max_instreams;
|
|
sp->initmsg.sinit_max_attempts = sctp_max_retrans_init;
|
|
- sp->initmsg.sinit_max_init_timeo = jiffies_to_msecs(sctp_rto_max);
|
|
+ sp->initmsg.sinit_max_init_timeo = sctp_rto_max;
|
|
|
|
/* Initialize default RTO related parameters. These parameters can
|
|
* be modified for with the SCTP_RTOINFO socket option.
|
|
*/
|
|
- sp->rtoinfo.srto_initial = jiffies_to_msecs(sctp_rto_initial);
|
|
- sp->rtoinfo.srto_max = jiffies_to_msecs(sctp_rto_max);
|
|
- sp->rtoinfo.srto_min = jiffies_to_msecs(sctp_rto_min);
|
|
+ sp->rtoinfo.srto_initial = sctp_rto_initial;
|
|
+ sp->rtoinfo.srto_max = sctp_rto_max;
|
|
+ sp->rtoinfo.srto_min = sctp_rto_min;
|
|
|
|
/* Initialize default association related parameters. These parameters
|
|
* can be modified with the SCTP_ASSOCINFO socket option.
|
|
@@ -3061,8 +3061,7 @@ SCTP_STATIC int sctp_init_sock(struct so
|
|
sp->assocparams.sasoc_number_peer_destinations = 0;
|
|
sp->assocparams.sasoc_peer_rwnd = 0;
|
|
sp->assocparams.sasoc_local_rwnd = 0;
|
|
- sp->assocparams.sasoc_cookie_life =
|
|
- jiffies_to_msecs(sctp_valid_cookie_life);
|
|
+ sp->assocparams.sasoc_cookie_life = sctp_valid_cookie_life;
|
|
|
|
/* Initialize default event subscriptions. By default, all the
|
|
* options are off.
|
|
@@ -3072,10 +3071,10 @@ SCTP_STATIC int sctp_init_sock(struct so
|
|
/* Default Peer Address Parameters. These defaults can
|
|
* be modified via SCTP_PEER_ADDR_PARAMS
|
|
*/
|
|
- sp->hbinterval = jiffies_to_msecs(sctp_hb_interval);
|
|
+ sp->hbinterval = sctp_hb_interval;
|
|
sp->pathmaxrxt = sctp_max_retrans_path;
|
|
sp->pathmtu = 0; // allow default discovery
|
|
- sp->sackdelay = jiffies_to_msecs(sctp_sack_timeout);
|
|
+ sp->sackdelay = sctp_sack_timeout;
|
|
sp->param_flags = SPP_HB_ENABLE |
|
|
SPP_PMTUD_ENABLE |
|
|
SPP_SACKDELAY_ENABLE;
|
|
--- a/net/sctp/sysctl.c
|
|
+++ b/net/sctp/sysctl.c
|
|
@@ -45,9 +45,10 @@
|
|
#include <net/sctp/sctp.h>
|
|
#include <linux/sysctl.h>
|
|
|
|
-static ctl_handler sctp_sysctl_jiffies_ms;
|
|
-static long rto_timer_min = 1;
|
|
-static long rto_timer_max = 86400000; /* One day */
|
|
+static int zero = 0;
|
|
+static int one = 1;
|
|
+static int timer_max = 86400000; /* ms in one day */
|
|
+static int int_max = INT_MAX;
|
|
static long sack_timer_min = 1;
|
|
static long sack_timer_max = 500;
|
|
|
|
@@ -56,45 +57,45 @@ static ctl_table sctp_table[] = {
|
|
.ctl_name = NET_SCTP_RTO_INITIAL,
|
|
.procname = "rto_initial",
|
|
.data = &sctp_rto_initial,
|
|
- .maxlen = sizeof(long),
|
|
+ .maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
- .proc_handler = &proc_doulongvec_ms_jiffies_minmax,
|
|
- .strategy = &sctp_sysctl_jiffies_ms,
|
|
- .extra1 = &rto_timer_min,
|
|
- .extra2 = &rto_timer_max
|
|
+ .proc_handler = &proc_dointvec_minmax,
|
|
+ .strategy = &sysctl_intvec,
|
|
+ .extra1 = &one,
|
|
+ .extra2 = &timer_max
|
|
},
|
|
{
|
|
.ctl_name = NET_SCTP_RTO_MIN,
|
|
.procname = "rto_min",
|
|
.data = &sctp_rto_min,
|
|
- .maxlen = sizeof(long),
|
|
+ .maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
- .proc_handler = &proc_doulongvec_ms_jiffies_minmax,
|
|
- .strategy = &sctp_sysctl_jiffies_ms,
|
|
- .extra1 = &rto_timer_min,
|
|
- .extra2 = &rto_timer_max
|
|
+ .proc_handler = &proc_dointvec_minmax,
|
|
+ .strategy = &sysctl_intvec,
|
|
+ .extra1 = &one,
|
|
+ .extra2 = &timer_max
|
|
},
|
|
{
|
|
.ctl_name = NET_SCTP_RTO_MAX,
|
|
.procname = "rto_max",
|
|
.data = &sctp_rto_max,
|
|
- .maxlen = sizeof(long),
|
|
+ .maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
- .proc_handler = &proc_doulongvec_ms_jiffies_minmax,
|
|
- .strategy = &sctp_sysctl_jiffies_ms,
|
|
- .extra1 = &rto_timer_min,
|
|
- .extra2 = &rto_timer_max
|
|
+ .proc_handler = &proc_dointvec_minmax,
|
|
+ .strategy = &sysctl_intvec,
|
|
+ .extra1 = &one,
|
|
+ .extra2 = &timer_max
|
|
},
|
|
{
|
|
.ctl_name = NET_SCTP_VALID_COOKIE_LIFE,
|
|
.procname = "valid_cookie_life",
|
|
.data = &sctp_valid_cookie_life,
|
|
- .maxlen = sizeof(long),
|
|
+ .maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
- .proc_handler = &proc_doulongvec_ms_jiffies_minmax,
|
|
- .strategy = &sctp_sysctl_jiffies_ms,
|
|
- .extra1 = &rto_timer_min,
|
|
- .extra2 = &rto_timer_max
|
|
+ .proc_handler = &proc_dointvec_minmax,
|
|
+ .strategy = &sysctl_intvec,
|
|
+ .extra1 = &one,
|
|
+ .extra2 = &timer_max
|
|
},
|
|
{
|
|
.ctl_name = NET_SCTP_MAX_BURST,
|
|
@@ -102,7 +103,10 @@ static ctl_table sctp_table[] = {
|
|
.data = &sctp_max_burst,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
- .proc_handler = &proc_dointvec
|
|
+ .proc_handler = &proc_dointvec_minmax,
|
|
+ .strategy = &sysctl_intvec,
|
|
+ .extra1 = &zero,
|
|
+ .extra2 = &int_max
|
|
},
|
|
{
|
|
.ctl_name = NET_SCTP_ASSOCIATION_MAX_RETRANS,
|
|
@@ -110,7 +114,10 @@ static ctl_table sctp_table[] = {
|
|
.data = &sctp_max_retrans_association,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
- .proc_handler = &proc_dointvec
|
|
+ .proc_handler = &proc_dointvec_minmax,
|
|
+ .strategy = &sysctl_intvec,
|
|
+ .extra1 = &one,
|
|
+ .extra2 = &int_max
|
|
},
|
|
{
|
|
.ctl_name = NET_SCTP_SNDBUF_POLICY,
|
|
@@ -118,7 +125,8 @@ static ctl_table sctp_table[] = {
|
|
.data = &sctp_sndbuf_policy,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
- .proc_handler = &proc_dointvec
|
|
+ .proc_handler = &proc_dointvec,
|
|
+ .strategy = &sysctl_intvec
|
|
},
|
|
{
|
|
.ctl_name = NET_SCTP_RCVBUF_POLICY,
|
|
@@ -126,7 +134,8 @@ static ctl_table sctp_table[] = {
|
|
.data = &sctp_rcvbuf_policy,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
- .proc_handler = &proc_dointvec
|
|
+ .proc_handler = &proc_dointvec,
|
|
+ .strategy = &sysctl_intvec
|
|
},
|
|
{
|
|
.ctl_name = NET_SCTP_PATH_MAX_RETRANS,
|
|
@@ -134,7 +143,10 @@ static ctl_table sctp_table[] = {
|
|
.data = &sctp_max_retrans_path,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
- .proc_handler = &proc_dointvec
|
|
+ .proc_handler = &proc_dointvec_minmax,
|
|
+ .strategy = &sysctl_intvec,
|
|
+ .extra1 = &one,
|
|
+ .extra2 = &int_max
|
|
},
|
|
{
|
|
.ctl_name = NET_SCTP_MAX_INIT_RETRANSMITS,
|
|
@@ -142,18 +154,21 @@ static ctl_table sctp_table[] = {
|
|
.data = &sctp_max_retrans_init,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
- .proc_handler = &proc_dointvec
|
|
+ .proc_handler = &proc_dointvec_minmax,
|
|
+ .strategy = &sysctl_intvec,
|
|
+ .extra1 = &one,
|
|
+ .extra2 = &int_max
|
|
},
|
|
{
|
|
.ctl_name = NET_SCTP_HB_INTERVAL,
|
|
.procname = "hb_interval",
|
|
.data = &sctp_hb_interval,
|
|
- .maxlen = sizeof(long),
|
|
+ .maxlen = sizeof(unsigned int),
|
|
.mode = 0644,
|
|
- .proc_handler = &proc_doulongvec_ms_jiffies_minmax,
|
|
- .strategy = &sctp_sysctl_jiffies_ms,
|
|
- .extra1 = &rto_timer_min,
|
|
- .extra2 = &rto_timer_max
|
|
+ .proc_handler = &proc_dointvec_minmax,
|
|
+ .strategy = &sysctl_intvec,
|
|
+ .extra1 = &one,
|
|
+ .extra2 = &timer_max
|
|
},
|
|
{
|
|
.ctl_name = NET_SCTP_PRESERVE_ENABLE,
|
|
@@ -161,23 +176,26 @@ static ctl_table sctp_table[] = {
|
|
.data = &sctp_cookie_preserve_enable,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
- .proc_handler = &proc_dointvec
|
|
+ .proc_handler = &proc_dointvec,
|
|
+ .strategy = &sysctl_intvec
|
|
},
|
|
{
|
|
.ctl_name = NET_SCTP_RTO_ALPHA,
|
|
.procname = "rto_alpha_exp_divisor",
|
|
.data = &sctp_rto_alpha,
|
|
.maxlen = sizeof(int),
|
|
- .mode = 0644,
|
|
- .proc_handler = &proc_dointvec
|
|
+ .mode = 0444,
|
|
+ .proc_handler = &proc_dointvec,
|
|
+ .strategy = &sysctl_intvec
|
|
},
|
|
{
|
|
.ctl_name = NET_SCTP_RTO_BETA,
|
|
.procname = "rto_beta_exp_divisor",
|
|
.data = &sctp_rto_beta,
|
|
.maxlen = sizeof(int),
|
|
- .mode = 0644,
|
|
- .proc_handler = &proc_dointvec
|
|
+ .mode = 0444,
|
|
+ .proc_handler = &proc_dointvec,
|
|
+ .strategy = &sysctl_intvec
|
|
},
|
|
{
|
|
.ctl_name = NET_SCTP_ADDIP_ENABLE,
|
|
@@ -185,7 +203,8 @@ static ctl_table sctp_table[] = {
|
|
.data = &sctp_addip_enable,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
- .proc_handler = &proc_dointvec
|
|
+ .proc_handler = &proc_dointvec,
|
|
+ .strategy = &sysctl_intvec
|
|
},
|
|
{
|
|
.ctl_name = NET_SCTP_PRSCTP_ENABLE,
|
|
@@ -193,7 +212,8 @@ static ctl_table sctp_table[] = {
|
|
.data = &sctp_prsctp_enable,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
- .proc_handler = &proc_dointvec
|
|
+ .proc_handler = &proc_dointvec,
|
|
+ .strategy = &sysctl_intvec
|
|
},
|
|
{
|
|
.ctl_name = NET_SCTP_SACK_TIMEOUT,
|
|
@@ -201,8 +221,8 @@ static ctl_table sctp_table[] = {
|
|
.data = &sctp_sack_timeout,
|
|
.maxlen = sizeof(long),
|
|
.mode = 0644,
|
|
- .proc_handler = &proc_doulongvec_ms_jiffies_minmax,
|
|
- .strategy = &sctp_sysctl_jiffies_ms,
|
|
+ .proc_handler = &proc_dointvec_minmax,
|
|
+ .strategy = &sysctl_intvec,
|
|
.extra1 = &sack_timer_min,
|
|
.extra2 = &sack_timer_max,
|
|
},
|
|
@@ -242,37 +262,3 @@ void sctp_sysctl_unregister(void)
|
|
{
|
|
unregister_sysctl_table(sctp_sysctl_header);
|
|
}
|
|
-
|
|
-/* Strategy function to convert jiffies to milliseconds. */
|
|
-static int sctp_sysctl_jiffies_ms(ctl_table *table, int __user *name, int nlen,
|
|
- void __user *oldval, size_t __user *oldlenp,
|
|
- void __user *newval, size_t newlen, void **context) {
|
|
-
|
|
- if (oldval) {
|
|
- size_t olen;
|
|
-
|
|
- if (oldlenp) {
|
|
- if (get_user(olen, oldlenp))
|
|
- return -EFAULT;
|
|
-
|
|
- if (olen != sizeof (int))
|
|
- return -EINVAL;
|
|
- }
|
|
- if (put_user((*(int *)(table->data) * 1000) / HZ,
|
|
- (int __user *)oldval) ||
|
|
- (oldlenp && put_user(sizeof (int), oldlenp)))
|
|
- return -EFAULT;
|
|
- }
|
|
- if (newval && newlen) {
|
|
- int new;
|
|
-
|
|
- if (newlen != sizeof (int))
|
|
- return -EINVAL;
|
|
-
|
|
- if (get_user(new, (int __user *)newval))
|
|
- return -EFAULT;
|
|
-
|
|
- *(int *)(table->data) = (new * HZ) / 1000;
|
|
- }
|
|
- return 1;
|
|
-}
|
|
--- a/net/sctp/transport.c
|
|
+++ b/net/sctp/transport.c
|
|
@@ -75,7 +75,7 @@ static struct sctp_transport *sctp_trans
|
|
* parameter 'RTO.Initial'.
|
|
*/
|
|
peer->rtt = 0;
|
|
- peer->rto = sctp_rto_initial;
|
|
+ peer->rto = msecs_to_jiffies(sctp_rto_initial);
|
|
peer->rttvar = 0;
|
|
peer->srtt = 0;
|
|
peer->rto_pending = 0;
|