> On Jan 10, 2022, at 6:31 PM, Steven Rostedt <rostedt@xxxxxxxxxxx> wrote: > > On Mon, 10 Jan 2022 11:05:35 -0500 > Steven Rostedt <rostedt@xxxxxxxxxxx> wrote: > >>> I haven't quite been able to figure out how to handle the >>> TP_printk() part of this equation. `trace-cmd report` displays >>> something like "addr=ARG TYPE NOT FIELD BUT 7". >>> >>> Thoughts or advice appreciated. >> >> I'll take a look into it. > > If you add this to libtraceevent, it will work: Thank you Steven! I will set up my current test system with a locally-built trace-cmd and try this out. I can send a proper patch that introduces the helper macros in my cover letter's pseudo-code example today or tomorrow. > diff --git a/src/event-parse.c b/src/event-parse.c > index 9bd605d..033529c 100644 > --- a/src/event-parse.c > +++ b/src/event-parse.c > @@ -5127,6 +5127,8 @@ static int print_ipsa_arg(struct trace_seq *s, const char *ptr, char i, > unsigned char *buf; > struct sockaddr_storage *sa; > bool reverse = false; > + unsigned int offset; > + unsigned int len; > int rc = 0; > int ret; > > @@ -5152,27 +5154,42 @@ static int print_ipsa_arg(struct trace_seq *s, const char *ptr, char i, > return rc; > } > > - if (arg->type != TEP_PRINT_FIELD) { > - trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type); > - return rc; > - } > + /* evaluate if the arg has a typecast */ > + while (arg->type == TEP_PRINT_TYPE) > + arg = arg->typecast.item; > + > + if (arg->type == TEP_PRINT_FIELD) { > > - if (!arg->field.field) { > - arg->field.field = > - tep_find_any_field(event, arg->field.name); > if (!arg->field.field) { > - do_warning("%s: field %s not found", > - __func__, arg->field.name); > - return rc; > + arg->field.field = > + tep_find_any_field(event, arg->field.name); > + if (!arg->field.field) { > + do_warning("%s: field %s not found", > + __func__, arg->field.name); > + return rc; > + } > } > + > + offset = arg->field.field->offset; > + len = arg->field.field->size; > + > + } else if (arg->type == TEP_PRINT_DYNAMIC_ARRAY) { > + > + dynamic_offset_field(event->tep, arg->dynarray.field, data, > + size, &offset, &len); > + > + } else { > + trace_seq_printf(s, "ARG NOT FIELD NOR DYNAMIC ARRAY BUT TYPE %d", > + arg->type); > + return rc; > } > > - sa = (struct sockaddr_storage *) (data + arg->field.field->offset); > + sa = (struct sockaddr_storage *)(data + offset); > > if (sa->ss_family == AF_INET) { > struct sockaddr_in *sa4 = (struct sockaddr_in *) sa; > > - if (arg->field.field->size < sizeof(struct sockaddr_in)) { > + if (len < sizeof(struct sockaddr_in)) { > trace_seq_printf(s, "INVALIDIPv4"); > return rc; > } > @@ -5185,7 +5202,7 @@ static int print_ipsa_arg(struct trace_seq *s, const char *ptr, char i, > } else if (sa->ss_family == AF_INET6) { > struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *) sa; > > - if (arg->field.field->size < sizeof(struct sockaddr_in6)) { > + if (len < sizeof(struct sockaddr_in6)) { > trace_seq_printf(s, "INVALIDIPv6"); > return rc; > } -- Chuck Lever