Switch IPv4 saddr/daddr to u32's within tools/tcpstates.py (#1862)
make types appropriate for ipaddr/protocol etc.
diff --git a/tools/tcplife.py b/tools/tcplife.py
index 1f4454c..ac32fbd 100755
--- a/tools/tcplife.py
+++ b/tools/tcplife.py
@@ -78,9 +78,9 @@
struct ipv4_data_t {
// XXX: switch some to u32's when supported
u64 ts_us;
- u64 pid;
- u64 saddr;
- u64 daddr;
+ u32 pid;
+ u32 saddr;
+ u32 daddr;
u64 ports;
u64 rx_b;
u64 tx_b;
@@ -91,7 +91,7 @@
struct ipv6_data_t {
u64 ts_us;
- u64 pid;
+ u32 pid;
unsigned __int128 saddr;
unsigned __int128 daddr;
u64 ports;
@@ -195,8 +195,10 @@
u16 family = sk->__sk_common.skc_family;
if (family == AF_INET) {
- struct ipv4_data_t data4 = {.span_us = delta_us,
- .rx_b = rx_b, .tx_b = tx_b};
+ struct ipv4_data_t data4 = {};
+ data4.span_us = delta_us;
+ data4.rx_b = rx_b;
+ data4.tx_b = tx_b;
data4.ts_us = bpf_ktime_get_ns() / 1000;
data4.saddr = sk->__sk_common.skc_rcv_saddr;
data4.daddr = sk->__sk_common.skc_daddr;
@@ -316,11 +318,13 @@
tx_b = tp->bytes_acked;
if (args->family == AF_INET) {
- struct ipv4_data_t data4 = {.span_us = delta_us,
- .rx_b = rx_b, .tx_b = tx_b};
+ struct ipv4_data_t data4 = {};
+ data4.span_us = delta_us;
+ data4.rx_b = rx_b;
+ data4.tx_b = tx_b;
data4.ts_us = bpf_ktime_get_ns() / 1000;
- bpf_probe_read(&data4.saddr, sizeof(u32), args->saddr);
- bpf_probe_read(&data4.daddr, sizeof(u32), args->daddr);
+ __builtin_memcpy(&data4.saddr, args->saddr, sizeof(data4.saddr));
+ __builtin_memcpy(&data4.daddr, args->daddr, sizeof(data4.daddr));
// a workaround until data4 compiles with separate lport/dport
data4.ports = dport + ((0ULL + lport) << 32);
data4.pid = pid;
@@ -336,8 +340,8 @@
struct ipv6_data_t data6 = {.span_us = delta_us,
.rx_b = rx_b, .tx_b = tx_b};
data6.ts_us = bpf_ktime_get_ns() / 1000;
- bpf_probe_read(&data6.saddr, sizeof(data6.saddr), args->saddr_v6);
- bpf_probe_read(&data6.daddr, sizeof(data6.daddr), args->saddr_v6);
+ __builtin_memcpy(&data6.saddr, args->saddr_v6, sizeof(data6.saddr));
+ __builtin_memcpy(&data6.daddr, args->daddr_v6, sizeof(data6.daddr));
// a workaround until data6 compiles with separate lport/dport
data6.ports = dport + ((0ULL + lport) << 32);
data6.pid = pid;
@@ -390,9 +394,9 @@
class Data_ipv4(ct.Structure):
_fields_ = [
("ts_us", ct.c_ulonglong),
- ("pid", ct.c_ulonglong),
- ("saddr", ct.c_ulonglong),
- ("daddr", ct.c_ulonglong),
+ ("pid", ct.c_uint),
+ ("saddr", ct.c_uint),
+ ("daddr", ct.c_uint),
("ports", ct.c_ulonglong),
("rx_b", ct.c_ulonglong),
("tx_b", ct.c_ulonglong),
@@ -403,7 +407,7 @@
class Data_ipv6(ct.Structure):
_fields_ = [
("ts_us", ct.c_ulonglong),
- ("pid", ct.c_ulonglong),
+ ("pid", ct.c_uint),
("saddr", (ct.c_ulonglong * 2)),
("daddr", (ct.c_ulonglong * 2)),
("ports", ct.c_ulonglong),