Hi Steve, you should made this generic (not ipv4/ipv6 specific) and use something like this: TP_PROTO(const char *hostname, __u64 conn_id, const struct sockaddr_storage *dst_addr) TP_STRUCT__entry( __string(hostname, hostname) __field(__u64, conn_id) __field(struct sockaddr_storage, dst_addr) TP_fast_assign( __entry->conn_id = conn_id; __entry->dst_addr = *dst_addr; __assign_str(hostname, hostname); ), With that you should be able to use this: TP_printk("conn_id=0x%llx server=%s addr=%pISpsfc", __entry->conn_id, __get_str(hostname), &__entry->dst_addr) I hope that helps. metze Am 04.11.21 um 07:09 schrieb Steve French: > It wasn't obvious to me the best way to pass in a pointer to the ipv4 > (and ipv6 address) to a dynamic trace point (unless I create a temp > string first in generic_ip_connect and do the conversion (via "%pI4" > and "%pI6" with sprintf) e.g. > > sprintf(ses->ip_addr, "%pI4", &addr->sin_addr); > > The approach I tried passing in the pointer to sin_addr (the > ipv4_address) caused an oops on loading it the first time and the > warning: > > [14928.818532] event smb3_ipv4_connect has unsafe dereference of argument 3 > [14928.818534] print_fmt: "conn_id=0x%llx server=%s addr=%pI4:%d", > REC->conn_id, __get_str(hostname), REC->ipaddr, REC->port > > > What I tried was the following (also see attached diff) to print the > ipv4 address that we were trying to connect to > > DECLARE_EVENT_CLASS(smb3_connect_class, > TP_PROTO(char *hostname, > __u64 conn_id, > __u16 port, > struct in_addr *ipaddr), > TP_ARGS(hostname, conn_id, port, ipaddr), > TP_STRUCT__entry( > __string(hostname, hostname) > __field(__u64, conn_id) > __field(__u16, port) > __field(const void *, ipaddr) > ), > TP_fast_assign( > __entry->port = port; > __entry->conn_id = conn_id; > __entry->ipaddr = ipaddr; > __assign_str(hostname, hostname); > ), > TP_printk("conn_id=0x%llx server=%s addr=%pI4:%d", > __entry->conn_id, > __get_str(hostname), > __entry->ipaddr, > __entry->port) > ) > > #define DEFINE_SMB3_CONNECT_EVENT(name) \ > DEFINE_EVENT(smb3_connect_class, smb3_##name, \ > TP_PROTO(char *hostname, \ > __u64 conn_id, \ > __u16 port, \ > struct in_addr *ipaddr), \ > TP_ARGS(hostname, conn_id, port, ipaddr)) > > DEFINE_SMB3_CONNECT_EVENT(ipv4_connect); > > Any ideas how to pass in the ipv4 address - or is it better to convert > it to a string before we call the trace point (which seems wasteful to > me but there must be examples of how to pass in structs to printks in > trace in Linux) >