tools/tcptracer: print ns timestamps with -v
authorIago López Galeiras <iago@kinvolk.io>
Fri, 4 Aug 2017 16:13:05 +0000 (18:13 +0200)
committerBrenden Blanco <bblanco@gmail.com>
Fri, 11 Aug 2017 16:13:00 +0000 (09:13 -0700)
tools/tcptracer.py

index 57ed383..8822546 100755 (executable)
@@ -49,7 +49,7 @@ bpf_text = """
 #define TCP_EVENT_TYPE_CLOSE   3
 
 struct tcp_ipv4_event_t {
-    u64 ts_us;
+    u64 ts_ns;
     u32 type;
     u32 pid;
     char comm[TASK_COMM_LEN];
@@ -63,7 +63,7 @@ struct tcp_ipv4_event_t {
 BPF_PERF_OUTPUT(tcp_ipv4_event);
 
 struct tcp_ipv6_event_t {
-    u64 ts_us;
+    u64 ts_ns;
     u32 type;
     u32 pid;
     char comm[TASK_COMM_LEN];
@@ -308,7 +308,7 @@ int trace_tcp_set_state_entry(struct pt_regs *ctx, struct sock *sk, int state)
       }
 
       struct tcp_ipv4_event_t evt4 = { };
-      evt4.ts_us = bpf_ktime_get_ns() / 1000;
+      evt4.ts_ns = bpf_ktime_get_ns();
       evt4.type = TCP_EVENT_TYPE_CONNECT;
       evt4.pid = p->pid >> 32;
       evt4.ip = ipver;
@@ -344,7 +344,7 @@ int trace_tcp_set_state_entry(struct pt_regs *ctx, struct sock *sk, int state)
       }
 
       struct tcp_ipv6_event_t evt6 = { };
-      evt6.ts_us = bpf_ktime_get_ns() / 1000;
+      evt6.ts_ns = bpf_ktime_get_ns();
       evt6.type = TCP_EVENT_TYPE_CONNECT;
       evt6.pid = p->pid >> 32;
       evt6.ip = ipver;
@@ -395,7 +395,7 @@ int trace_close_entry(struct pt_regs *ctx, struct sock *sk)
       }
 
       struct tcp_ipv4_event_t evt4 = { };
-      evt4.ts_us = bpf_ktime_get_ns() / 1000;
+      evt4.ts_ns = bpf_ktime_get_ns();
       evt4.type = TCP_EVENT_TYPE_CLOSE;
       evt4.pid = pid >> 32;
       evt4.ip = ipver;
@@ -415,7 +415,7 @@ int trace_close_entry(struct pt_regs *ctx, struct sock *sk)
       }
 
       struct tcp_ipv6_event_t evt6 = { };
-      evt6.ts_us = bpf_ktime_get_ns() / 1000;
+      evt6.ts_ns = bpf_ktime_get_ns();
       evt6.type = TCP_EVENT_TYPE_CLOSE;
       evt6.pid = pid >> 32;
       evt6.ip = ipver;
@@ -468,7 +468,7 @@ int trace_accept_return(struct pt_regs *ctx)
 
       struct tcp_ipv4_event_t evt4 = { 0 };
 
-      evt4.ts_us = bpf_ktime_get_ns() / 1000;
+      evt4.ts_ns = bpf_ktime_get_ns();
       evt4.type = TCP_EVENT_TYPE_ACCEPT;
       evt4.netns = net_ns_inum;
       evt4.pid = pid >> 32;
@@ -493,7 +493,7 @@ int trace_accept_return(struct pt_regs *ctx)
 
       struct tcp_ipv6_event_t evt6 = { 0 };
 
-      evt6.ts_us = bpf_ktime_get_ns() / 1000;
+      evt6.ts_ns = bpf_ktime_get_ns();
       evt6.type = TCP_EVENT_TYPE_ACCEPT;
       evt6.netns = net_ns_inum;
       evt6.pid = pid >> 32;
@@ -525,7 +525,7 @@ TASK_COMM_LEN = 16   # linux/sched.h
 
 class TCPIPV4Evt(ctypes.Structure):
     _fields_ = [
-            ("ts_us", ctypes.c_ulonglong),
+            ("ts_ns", ctypes.c_ulonglong),
             ("type", ctypes.c_uint),
             ("pid", ctypes.c_uint),
             ("comm", ctypes.c_char * TASK_COMM_LEN),
@@ -540,7 +540,7 @@ class TCPIPV4Evt(ctypes.Structure):
 
 class TCPIPV6Evt(ctypes.Structure):
     _fields_ = [
-            ("ts_us", ctypes.c_ulonglong),
+            ("ts_ns", ctypes.c_ulonglong),
             ("type", ctypes.c_uint),
             ("pid", ctypes.c_uint),
             ("comm", ctypes.c_char * TASK_COMM_LEN),
@@ -560,10 +560,14 @@ verbose_types = {"C": "connect", "A": "accept",
 def print_ipv4_event(cpu, data, size):
     event = ctypes.cast(data, ctypes.POINTER(TCPIPV4Evt)).contents
     global start_ts
+
     if args.timestamp:
         if start_ts == 0:
-            start_ts = event.ts_us
-        print("%-9.3f" % ((float(event.ts_us) - start_ts) / 1000000), end="")
+            start_ts = event.ts_ns
+        if args.verbose:
+            print("%-14d" % (event.ts_ns - start_ts), end="")
+        else:
+            print("%-9.3f" % ((float(event.ts_ns) - start_ts) / 1000000000), end="")
     if event.type == 1:
         type_str = "C"
     elif event.type == 2:
@@ -596,8 +600,11 @@ def print_ipv6_event(cpu, data, size):
     global start_ts
     if args.timestamp:
         if start_ts == 0:
-            start_ts = event.ts_us
-        print("%-9.3f" % ((float(event.ts_us) - start_ts) / 1000000), end="")
+            start_ts = event.ts_ns
+        if args.verbose:
+            print("%-14d" % (event.ts_ns - start_ts), end="")
+        else:
+            print("%-9.3f" % ((float(event.ts_ns) - start_ts) / 1000000000), end="")
     if event.type == 1:
         type_str = "C"
     elif event.type == 2:
@@ -649,15 +656,17 @@ b.attach_kretprobe(event="inet_csk_accept", fn_name="trace_accept_return")
 print("Tracing TCP established connections. Ctrl-C to end.")
 
 # header
-if args.timestamp:
-    print("%-9s" % ("TIME(s)"), end="")
 if args.verbose:
+    if args.timestamp:
+        print("%-14s" % ("TIME(ns)"), end="")
     print("%-12s %-6s %-16s %-2s %-16s %-16s %-6s %-7s" % ("TYPE",
           "PID", "COMM", "IP", "SADDR", "DADDR", "SPORT", "DPORT"), end="")
     if not args.netns:
         print("%-8s" % "NETNS", end="")
     print()
 else:
+    if args.timestamp:
+        print("%-9s" % ("TIME(s)"), end="")
     print("%-2s %-6s %-16s %-2s %-16s %-16s %-6s %-6s" %
           ("T", "PID", "COMM", "IP", "SADDR", "DADDR", "SPORT", "DPORT"))