]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
ip: support of usec rtt in tcp_metrics
authorEric Dumazet <edumazet@google.com>
Fri, 5 Sep 2014 23:54:04 +0000 (16:54 -0700)
committerStephen Hemminger <stephen@networkplumber.org>
Sun, 28 Sep 2014 22:58:36 +0000 (15:58 -0700)
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

index e0f03449e94bb6bad40cf7147e195c83dc07ea6f..bbbb4cc0cfff36ab5b1bbafd2f3259ef23ed4fe7 100644 (file)
@@ -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];