Accepting request 57997 from home:mtomaschewski:branches:security:netfilter

OBS-URL: https://build.opensuse.org/request/show/57997
OBS-URL: https://build.opensuse.org/package/show/security:netfilter/iproute2?expand=0&rev=20
This commit is contained in:
Jan Engelhardt 2011-01-12 18:07:52 +00:00 committed by Git OBS Bridge
parent 2fdd3822b6
commit 42f8849604
3 changed files with 205 additions and 0 deletions

View File

@ -0,0 +1,197 @@
From ff2e5a2ada6196ce4ed89a76b5e86f047c9a63f4 Mon Sep 17 00:00:00 2001
From: Marius Tomaschewski <mt@suse.de>
Date: Wed, 12 Jan 2011 16:41:45 +0100
Subject: [PATCH] ip route rtt metrics time unit is milliseconds
Adopted ip route rtt,rttvar,rto_min metrics time unit to milliseconds
instead of jiffies as required by recent kernels (>=2.6.27).
Added an get_rtt_metrics_units function providing the unit and the
get_time_in_units as successor of get_jiffies function, allowing to
specify the unit. The get_rtt_metrics_units can be extended to detect
and handle also older kernels.
This fixes also the inconsistent use of get_user_hz in print_route
and get_hz in get_jiffies function that return different units.
---
include/utils.h | 1 +
ip/iproute.c | 38 ++++++++++++++++++++++++++------------
lib/utils.c | 24 +++++++++++++-----------
3 files changed, 40 insertions(+), 23 deletions(-)
diff --git a/include/utils.h b/include/utils.h
index 3da6998..3d98c01 100644
--- a/include/utils.h
+++ b/include/utils.h
@@ -80,6 +80,7 @@ extern int mask2bits(__u32 netmask);
extern int get_integer(int *val, const char *arg, int base);
extern int get_unsigned(unsigned *val, const char *arg, int base);
extern int get_jiffies(unsigned *val, const char *arg, int base, int *raw);
+extern int get_time_in_units(unsigned *val, const char *arg, int base, int *raw, unsigned unit);
#define get_byte get_u8
#define get_ushort get_u16
#define get_short get_s16
diff --git a/ip/iproute.c b/ip/iproute.c
index 0d69290..830b0a3 100644
--- a/ip/iproute.c
+++ b/ip/iproute.c
@@ -33,6 +33,21 @@
#define RTAX_RTTVAR RTAX_HOPS
#endif
+#define TIME_UNIT_MS 1000
+
+static unsigned get_rtt_metrics_units(void)
+{
+ /*
+ * recent kernels (>=2.6.27) are using milliseconds base.
+ * Note: To support older kernels, return the proper HZ...
+ *
+ * final unit for rto_min: unit
+ * rttvar: unit * 4
+ * rtt: unit * 8
+ */
+ return TIME_UNIT_MS;
+}
+
enum list_action {
IPROUTE_LIST,
IPROUTE_FLUSH,
@@ -522,12 +537,11 @@ int print_route(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
mxlock = *(unsigned*)RTA_DATA(mxrta[RTAX_LOCK]);
for (i=2; i<= RTAX_MAX; i++) {
- unsigned val;
+ unsigned long long val; /* val *= 1000 below */
+ unsigned unit = get_rtt_metrics_units();
if (mxrta[i] == NULL)
continue;
- if (!hz)
- hz = get_user_hz();
if (i < sizeof(mx_names)/sizeof(char*) && mx_names[i])
fprintf(fp, " %s", mx_names[i]);
@@ -543,24 +557,24 @@ int print_route(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
val = 0;
/* fall through */
default:
- fprintf(fp, " %u", val);
+ fprintf(fp, " %llu", val);
break;
case RTAX_RTT:
case RTAX_RTTVAR:
case RTAX_RTO_MIN:
- val *= 1000;
+ val *= TIME_UNIT_MS;
if (i == RTAX_RTT)
val /= 8;
else if (i == RTAX_RTTVAR)
val /= 4;
- if (val >= hz)
+ if (val >= unit)
fprintf(fp, " %llums",
- (unsigned long long) val / hz);
+ val / unit);
else
- fprintf(fp, " %.2fms",
- (double)val / hz);
+ fprintf(fp, " %.8fms",
+ (double)val / unit);
}
}
}
@@ -840,7 +854,7 @@ int iproute_modify(int cmd, unsigned flags, int argc, char **argv)
mxlock |= (1<<RTAX_RTT);
NEXT_ARG();
}
- if (get_jiffies(&rtt, *argv, 0, &raw))
+ if (get_time_in_units(&rtt, *argv, 0, &raw, get_rtt_metrics_units()))
invarg("\"rtt\" value is invalid\n", *argv);
rta_addattr32(mxrta, sizeof(mxbuf), RTAX_RTT,
(raw) ? rtt : rtt * 8);
@@ -848,7 +862,7 @@ int iproute_modify(int cmd, unsigned flags, int argc, char **argv)
unsigned rto_min;
NEXT_ARG();
mxlock |= (1<<RTAX_RTO_MIN);
- if (get_jiffies(&rto_min, *argv, 0, &raw))
+ if (get_time_in_units(&rto_min, *argv, 0, &raw, get_rtt_metrics_units()))
invarg("\"rto_min\" value is invalid\n",
*argv);
rta_addattr32(mxrta, sizeof(mxbuf), RTAX_RTO_MIN,
@@ -900,7 +914,7 @@ int iproute_modify(int cmd, unsigned flags, int argc, char **argv)
mxlock |= (1<<RTAX_RTTVAR);
NEXT_ARG();
}
- if (get_jiffies(&win, *argv, 0, &raw))
+ if (get_time_in_units(&win, *argv, 0, &raw, get_rtt_metrics_units()))
invarg("\"rttvar\" value is invalid\n", *argv);
rta_addattr32(mxrta, sizeof(mxbuf), RTAX_RTTVAR,
(raw) ? win : win * 4);
diff --git a/lib/utils.c b/lib/utils.c
index a60d884..a21a2ae 100644
--- a/lib/utils.c
+++ b/lib/utils.c
@@ -102,6 +102,11 @@ int get_unsigned(unsigned *val, const char *arg, int base)
int get_jiffies(unsigned *jiffies, const char *arg, int base, int *raw)
{
+ return get_time_in_units(jiffies, arg, base, raw, get_hz());
+}
+
+int get_time_in_units(unsigned *val, const char *arg, int base, int *raw, unsigned unit)
+{
double t;
unsigned long res;
char *p;
@@ -120,37 +125,34 @@ int get_jiffies(unsigned *jiffies, const char *arg, int base, int *raw)
if (p == arg)
return -1;
- if (__iproute2_hz_internal == 0)
- __iproute2_hz_internal = __get_hz();
-
*raw = 1;
if (*p) {
*raw = 0;
if (strcasecmp(p, "s") == 0 || strcasecmp(p, "sec")==0 ||
strcasecmp(p, "secs")==0)
- t *= __iproute2_hz_internal;
+ t *= unit;
else if (strcasecmp(p, "ms") == 0 || strcasecmp(p, "msec")==0 ||
strcasecmp(p, "msecs") == 0)
- t *= __iproute2_hz_internal/1000.0;
+ t *= unit/1000.0;
else if (strcasecmp(p, "us") == 0 || strcasecmp(p, "usec")==0 ||
strcasecmp(p, "usecs") == 0)
- t *= __iproute2_hz_internal/1000000.0;
+ t *= unit/1000000.0;
else if (strcasecmp(p, "ns") == 0 || strcasecmp(p, "nsec")==0 ||
strcasecmp(p, "nsecs") == 0)
- t *= __iproute2_hz_internal/1000000000.0;
+ t *= unit/1000000000.0;
else if (strcasecmp(p, "j") == 0 || strcasecmp(p, "hz") == 0 ||
strcasecmp(p,"jiffies") == 0)
- t *= 1.0; /* allow suffix, do nothing */
+ t *= unit/(double)get_hz();
else
return -1;
}
/* emulate ceil() without having to bring-in -lm and always be >= 1 */
- *jiffies = t;
- if (*jiffies < t)
- *jiffies += 1;
+ *val = t;
+ if (*val < t)
+ *val += 1;
return 0;
--
1.7.1

View File

@ -1,3 +1,9 @@
-------------------------------------------------------------------
Wed Jan 12 16:02:26 UTC 2011 - mt@suse.de
- Adopted ip route rtt,rttvar,rto_min metrics time unit to
milliseconds as required by recent kernels (bnc#659746).
-------------------------------------------------------------------
Tue Jan 11 00:45:02 UTC 2011 - jengelh@medozas.de

View File

@ -39,6 +39,7 @@ Patch8: %name-2.6.29-1-skbedit-memset.diff
Patch9: %name-2.6.29-1-iptunnel-fclose.diff
Patch10: %name-2.6.29-1-ss-pclose.diff
Patch13: %name-2.6.29-1-memleak.diff
Patch14: %name-2.6.37-rtt-metrics-units.diff
BuildRoot: %{_tmppath}/%{name}-%{version}-build
%description
@ -84,6 +85,7 @@ as well as examples and other outdated files.
%patch9
%patch10
%patch13
%patch14 -p1
find . -name *.orig -print0 | xargs -r0 rm -v
%build