[SCTP]: Remove multiple levels of msecs to jiffies conversions.
authorVladislav Yasevich <vladislav.yasevich@hp.com>
Tue, 22 Aug 2006 20:29:17 +0000 (13:29 -0700)
committerDavid S. Miller <davem@sunset.davemloft.net>
Fri, 22 Sep 2006 21:55:39 +0000 (14:55 -0700)
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>
include/net/sctp/constants.h
include/net/sctp/structs.h
net/sctp/protocol.c
net/sctp/socket.c
net/sctp/sysctl.c
net/sctp/transport.c

index 57166bfdf8eb031b0f43a24d44413420ecd433e8..6c632e26f72dfb6e2fb7ebbc3c01ae767efdccd7 100644 (file)
@@ -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 */
index 0412e730c76537d97077e2b000645fcb1482aaa5..c6d93bb0dcd2a7654785756bcd9ebecca2eb9b07 100644 (file)
@@ -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)
index 1ab03a27a76e76f99d8986a45ea8b05ea04cb4c9..5692ef5485d35654b384962f84a13b765436cdaf 100644 (file)
@@ -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;
index 3b6e82cb372f45c0846e694a8a150dcb2ea5427d..7c1dbb1d10df9f478b8850aa87e62de01d72326c 100644 (file)
@@ -3045,14 +3045,14 @@ SCTP_STATIC int sctp_init_sock(struct sock *sk)
        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 sock *sk)
        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 sock *sk)
        /* 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;
index dc6f3ff32358c0dafd1b8ae1f63d610a5106e9b5..633cd178654b48da2c3acbba632ade51673bedcb 100644 (file)
 #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;
-}
index 2763aa93de1af40ced0919b8656e47ae54c1891c..3e5936a5f671db698f560e65b4f5761ad3edd579 100644 (file)
@@ -75,7 +75,7 @@ static struct sctp_transport *sctp_transport_init(struct sctp_transport *peer,
         * 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;