Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:11.4
iproute2
iproute2-2.6.37-rtt-metrics-units.diff
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File iproute2-2.6.37-rtt-metrics-units.diff of Package iproute2
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
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor