All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH iproute2] ip: support of usec rtt in tcp_metrics
@ 2014-09-05 23:54 Eric Dumazet
  2014-09-06  0:02 ` Stephen Hemminger
  2014-09-28 22:59 ` Stephen Hemminger
  0 siblings, 2 replies; 4+ messages in thread
From: Eric Dumazet @ 2014-09-05 23:54 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: netdev

From: Eric Dumazet <edumazet@google.com>

Starting from linux-3.15, kernel supports new tcp metric attributes :
TCP_METRIC_RTT_US & TCP_METRIC_RTTVAR_US

Update ip command to detect their use.

Signed-off-by: Eric Dumazet <edumazet@google.com>
---
 ip/tcp_metrics.c |   31 ++++++++++++++++++++++++-------
 1 file changed, 24 insertions(+), 7 deletions(-)

diff --git a/ip/tcp_metrics.c b/ip/tcp_metrics.c
index e0f0344..bbbb4cc 100644
--- a/ip/tcp_metrics.c
+++ b/ip/tcp_metrics.c
@@ -216,6 +216,7 @@ static int process_msg(const struct sockaddr_nl *who, struct nlmsghdr *n,
 	a = attrs[TCP_METRICS_ATTR_VALS];
 	if (a) {
 		struct rtattr *m[TCP_METRIC_MAX + 1 + 1];
+		unsigned long rtt = 0, rttvar = 0;
 
 		parse_rtattr_nested(m, TCP_METRIC_MAX + 1, a);
 
@@ -225,18 +226,30 @@ static int process_msg(const struct sockaddr_nl *who, struct nlmsghdr *n,
 			a = m[i + 1];
 			if (!a)
 				continue;
-			if (metric_name[i])
-				fprintf(fp, " %s ", metric_name[i]);
-			else
-				fprintf(fp, " metric_%d ", i);
-
+			if (i != TCP_METRIC_RTT &&
+			    i != TCP_METRIC_RTT_US &&
+			    i != TCP_METRIC_RTTVAR &&
+			    i != TCP_METRIC_RTTVAR_US) {
+				if (metric_name[i])
+					fprintf(fp, " %s ", metric_name[i]);
+				else
+					fprintf(fp, " metric_%d ", i);
+			}
 			val = rta_getattr_u32(a);
 			switch (i) {
 			case TCP_METRIC_RTT:
-				fprintf(fp, "%luus", (val * 1000UL) >> 3);
+				if (!rtt)
+					rtt = (val * 1000UL) >> 3;
 				break;
 			case TCP_METRIC_RTTVAR:
-				fprintf(fp, "%luus", (val * 1000UL) >> 2);
+				if (!rttvar)
+					rttvar = (val * 1000UL) >> 2;
+				break;
+			case TCP_METRIC_RTT_US:
+				rtt = val >> 3;
+				break;
+			case TCP_METRIC_RTTVAR_US:
+				rttvar = val >> 2;
 				break;
 			case TCP_METRIC_SSTHRESH:
 			case TCP_METRIC_CWND:
@@ -246,6 +259,10 @@ static int process_msg(const struct sockaddr_nl *who, struct nlmsghdr *n,
 				break;
 			}
 		}
+		if (rtt)
+			fprintf(fp, " rtt %luus", rtt);
+		if (rttvar)
+			fprintf(fp, " rttvar %luus", rttvar);
 	}
 
 	a = attrs[TCP_METRICS_ATTR_FOPEN_MSS];

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH iproute2] ip: support of usec rtt in tcp_metrics
  2014-09-05 23:54 [PATCH iproute2] ip: support of usec rtt in tcp_metrics Eric Dumazet
@ 2014-09-06  0:02 ` Stephen Hemminger
  2014-09-06  0:22   ` Eric Dumazet
  2014-09-28 22:59 ` Stephen Hemminger
  1 sibling, 1 reply; 4+ messages in thread
From: Stephen Hemminger @ 2014-09-06  0:02 UTC (permalink / raw)
  To: Eric Dumazet; +Cc: netdev

On Fri, 05 Sep 2014 16:54:04 -0700
Eric Dumazet <eric.dumazet@gmail.com> wrote:

> +			if (i != TCP_METRIC_RTT &&
> +			    i != TCP_METRIC_RTT_US &&
> +			    i != TCP_METRIC_RTTVAR &&
> +			    i != TCP_METRIC_RTTVAR_US) {
> +				if (metric_name[i])
> +					fprintf(fp, " %s ", metric_name[i]);
> +				else
> +					fprintf(fp, " metric_%d ", i);

Why not put new metrics in metric_name array? and make the check something like:

			if (i < ARRAY_SIZE(metric_name) && metric_name[i])
				fprintf(fp, " %s ", metric_name[i]);
			else
				fprintf(fp, " metric_%d ", i)

This makes it future proof, and gets rid of the silly test.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH iproute2] ip: support of usec rtt in tcp_metrics
  2014-09-06  0:02 ` Stephen Hemminger
@ 2014-09-06  0:22   ` Eric Dumazet
  0 siblings, 0 replies; 4+ messages in thread
From: Eric Dumazet @ 2014-09-06  0:22 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: netdev

On Fri, 2014-09-05 at 17:02 -0700, Stephen Hemminger wrote:
> On Fri, 05 Sep 2014 16:54:04 -0700
> Eric Dumazet <eric.dumazet@gmail.com> wrote:
> 
> > +			if (i != TCP_METRIC_RTT &&
> > +			    i != TCP_METRIC_RTT_US &&
> > +			    i != TCP_METRIC_RTTVAR &&
> > +			    i != TCP_METRIC_RTTVAR_US) {
> > +				if (metric_name[i])
> > +					fprintf(fp, " %s ", metric_name[i]);
> > +				else
> > +					fprintf(fp, " metric_%d ", i);
> 
> Why not put new metrics in metric_name array? and make the check something like:
> 
> 			if (i < ARRAY_SIZE(metric_name) && metric_name[i])
> 				fprintf(fp, " %s ", metric_name[i]);
> 			else
> 				fprintf(fp, " metric_%d ", i)
> 
> This makes it future proof, and gets rid of the silly test.


Because for compatibility reasons, kernel gives all values,
we want to output one of them, the most accurate one.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH iproute2] ip: support of usec rtt in tcp_metrics
  2014-09-05 23:54 [PATCH iproute2] ip: support of usec rtt in tcp_metrics Eric Dumazet
  2014-09-06  0:02 ` Stephen Hemminger
@ 2014-09-28 22:59 ` Stephen Hemminger
  1 sibling, 0 replies; 4+ messages in thread
From: Stephen Hemminger @ 2014-09-28 22:59 UTC (permalink / raw)
  To: Eric Dumazet; +Cc: netdev

On Fri, 05 Sep 2014 16:54:04 -0700
Eric Dumazet <eric.dumazet@gmail.com> wrote:

> From: Eric Dumazet <edumazet@google.com>
> 
> Starting from linux-3.15, kernel supports new tcp metric attributes :
> TCP_METRIC_RTT_US & TCP_METRIC_RTTVAR_US
> 
> Update ip command to detect their use.
> 
> Signed-off-by: Eric Dumazet <edumazet@google.com>

Applied thanks

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2014-09-28 22:59 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-09-05 23:54 [PATCH iproute2] ip: support of usec rtt in tcp_metrics Eric Dumazet
2014-09-06  0:02 ` Stephen Hemminger
2014-09-06  0:22   ` Eric Dumazet
2014-09-28 22:59 ` Stephen Hemminger

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.