On 10/16/17 3:46 PM, Cong Wang wrote: > Well, for NULL case, the entry->saddr_v6 will not be filled with > your patch.
I think you meant daddr_v6 and yes it will not get filled in, but 0 is better than a panic ;-) > > How about using sk->sk_v6_daddr? > That works, but then both addresses should come from sk and not np: diff --git a/include/trace/events/tcp.h b/include/trace/events/tcp.h index 1ffab6d96e94..7989c2dcedf1 100644 --- a/include/trace/events/tcp.h +++ b/include/trace/events/tcp.h @@ -46,9 +46,9 @@ TRACE_EVENT(tcp_retransmit_skb, if (np) { pin6 = (struct in6_addr *)__entry->saddr_v6; - *pin6 = np->saddr; + *pin6 = sk->sk_v6_rcv_saddr; pin6 = (struct in6_addr *)__entry->daddr_v6; - *pin6 = *(np->daddr_cache); + *pin6 = sk->sk_v6_daddr; } else { pin6 = (struct in6_addr *)__entry->saddr_v6; ipv6_addr_set_v4mapped(inet->inet_saddr, pin6); So np is just a trigger for IPv6 versus v4 mapped. I do have a question about why ipv4 addresses are non-NULL: $ perf script swapper 0 [000] 25.025102: tcp:tcp_retransmit_skb: sport=22 dport=48076 saddr=127.0.0.6 daddr=127.0.0.6 saddrv6=2001:db8:1::4 daddrv6=2001:db8:1::64 swapper 0 [000] 25.231125: tcp:tcp_retransmit_skb: sport=22 dport=48076 saddr=127.0.0.6 daddr=127.0.0.6 saddrv6=2001:db8:1::4 daddrv6=2001:db8:1::64