bin/151937: [patch] netstat(1) utility lack support of displaying
rtt related counters of tcp sockets
Mykola Zubach
zuborg at FreeBSD.org
Thu Nov 4 14:00:22 UTC 2010
>Number: 151937
>Category: bin
>Synopsis: [patch] netstat(1) utility lack support of displaying rtt related counters of tcp sockets
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: change-request
>Submitter-Id: current-users
>Arrival-Date: Thu Nov 04 14:00:17 UTC 2010
>Closed-Date:
>Last-Modified:
>Originator: Mykola Zubach
>Release: FreeBSD 8.1
>Organization:
AdvancedHosters.com
>Environment:
>Description:
RTT (round-trip time) timings are useful to investigate networking issues.
There are a lot of various tools to measure rtt (like ping/mtr etc), but it would be also helpful to have possibility to see current values of rtt for some tcp socket.
Here is a patch for netstat(1) utility which adds four optional columns for tcp sockets:
RTT - smoothed rtt value (tp->t_srtt / hz / TCP_RTT_SCALE)
RTT-DEV - smoothed rtt variance (tp->t_rttvar / hz / TCP_RTTVAR_SCALE)
RTT-LOW - smallest observed rtt (tp->t_rttlow / hz)
RTT-CNT - number of times rtt sampled (tp->t_rttupdated)
First three columns provide timings, measured in seconds, with precision 0.001 s.
'-T' option is free at the moment, so I chose it for this patch since it is related to 'T'imings
>How-To-Repeat:
>Fix:
Patch attached with submission follows:
--- /usr/src/usr.bin/netstat/main.c 2010-06-14 05:09:06.000000000 +0300
+++ main.c 2010-11-03 17:55:49.000000000 +0200
@@ -338,6 +338,7 @@
static int pflag; /* show given protocol */
int rflag; /* show routing tables (or routing stats) */
int sflag; /* show protocol statistics */
+int Tflag; /* show rtt counters of tcp sockets */
int tflag; /* show i/f watchdog timers */
int Wflag; /* wide display */
int xflag; /* extra information, includes all socket buffer info */
@@ -359,7 +360,7 @@
af = AF_UNSPEC;
- while ((ch = getopt(argc, argv, "AaBbdf:ghI:iLlM:mN:np:q:rSstuWw:xz")) != -1)
+ while ((ch = getopt(argc, argv, "AaBbdf:ghI:iLlM:mN:np:q:rSsTtuWw:xz")) != -1)
switch(ch) {
case 'A':
Aflag = 1;
@@ -459,6 +460,9 @@
case 'S':
numeric_addr = 1;
break;
+ case 'T':
+ Tflag = 1;
+ break;
case 't':
tflag = 1;
break;
--- /usr/src/usr.bin/netstat/netstat.h 2010-06-14 05:09:06.000000000 +0300
+++ netstat.h 2010-11-03 17:56:08.000000000 +0200
@@ -50,6 +50,7 @@
extern int numeric_port; /* show ports numerically */
extern int rflag; /* show routing tables (or routing stats) */
extern int sflag; /* show protocol statistics */
+extern int Tflag; /* show rtt counters of tcp sockets */
extern int tflag; /* show i/f watchdog timers */
extern int Wflag; /* wide display */
extern int xflag; /* extended display, includes all socket buffer info */
--- /usr/src/usr.bin/netstat/inet.c 2010-06-14 05:09:06.000000000 +0300
+++ inet.c 2010-11-04 15:31:45.000000000 +0200
@@ -47,6 +47,7 @@
#include <sys/socket.h>
#include <sys/socketvar.h>
#include <sys/sysctl.h>
+#include <sys/time.h>
#include <net/route.h>
#include <net/if_arp.h>
@@ -313,6 +314,21 @@
struct inpcb *inp;
struct xinpgen *xig, *oxig;
struct xsocket *so;
+ struct clockinfo clockinfo;
+ int mib[2];
+ size_t ci_size;
+ int hz = 1;
+ float rtt, rtt_var, rtt_low;
+
+ ci_size = sizeof(clockinfo);
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_CLOCKRATE;
+ if (sysctl(mib, 2, &clockinfo, &ci_size, NULL, 0) < 0)
+ warn("sysctl: kern.clockrate");
+ else if (clockinfo.hz == 0)
+ warn("sysctl: kern.clockrate: hz = 0");
+ else
+ hz = clockinfo.hz;
istcp = 0;
switch (proto) {
@@ -414,15 +430,17 @@
"%-5.5s %-6.6s %-6.6s %-22.22s %-22.22s",
"Proto", "Recv-Q", "Send-Q",
"Local Address", "Foreign Address");
+ if (Tflag)
+ printf("%-6.6s %-7.7s %-7.7s %-7.7s ",
+ " RTT", "RTT-VAR",
+ "RTT-LOW", "RTT-CNT");
if (xflag)
- printf("%-6.6s %-6.6s %-6.6s %-6.6s %-6.6s %-6.6s %-6.6s %-6.6s %-6.6s %-6.6s %-6.6s %-6.6s %s\n",
+ printf("%-6.6s %-6.6s %-6.6s %-6.6s %-6.6s %-6.6s %-6.6s %-6.6s %-6.6s %-6.6s %-6.6s %-6.6s ",
"R-MBUF", "S-MBUF", "R-CLUS",
"S-CLUS", "R-HIWA", "S-HIWA",
"R-LOWA", "S-LOWA", "R-BCNT",
- "S-BCNT", "R-BMAX", "S-BMAX",
- "(state)");
- else
- printf("(state)\n");
+ "S-BCNT", "R-BMAX", "S-BMAX");
+ printf("(state)\n");
}
first = 0;
}
@@ -506,6 +524,14 @@
} /* else nothing printed now */
#endif /* INET6 */
}
+ if (istcp && Tflag && !Lflag) {
+ rtt = (float)tp->t_srtt / hz / TCP_RTT_SCALE;
+ rtt_var = (float)tp->t_rttvar / hz / TCP_RTTVAR_SCALE;
+ rtt_low = (float)tp->t_rttlow / hz;
+ printf("%6.3f %7.3f %7.3f %7lu ",
+ rtt, rtt_var, rtt_low,
+ tp->t_rttupdated);
+ }
if (xflag) {
if (Lflag)
printf("%21s %6u %6u %6u %6u %6u %6u %6u %6u %6u %6u %6u %6u ",
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list