On Thu, Jul 06, 2017 at 02:45:23PM +0300, Dmitry V. Levin wrote: > On Thu, Jul 06, 2017 at 09:57:29AM +0800, JingPiao Chen wrote: > > * netlink_sock_diag.c: Include "xlat/packet_diag_info_flags.h". > > (decode_packet_diag_info, decode_packet_diag_mclist, > > decode_packet_diag_ring, decode_packet_diag_filter): New functions. > > (packet_diag_msg_nla_decoders): New array. > > (decode_packet_diag_msg): Use it. > > * print_fields.h (PRINT_FIELD_QUOTED_STRING): New macro. > > * linux/packet_diag.h (packet_diag_info, packet_diag_mclist, > > packet_diag_ring): New structures. > > (PDI_*): New macros. > > * xlat/packet_diag_info_flags.in: New file. > > --- > > linux/packet_diag.h | 33 ++++++++++++ > > netlink_sock_diag.c | 115 > > ++++++++++++++++++++++++++++++++++++++++- > > print_fields.h | 6 +++ > > xlat/packet_diag_info_flags.in | 5 ++ > > 4 files changed, 158 insertions(+), 1 deletion(-) > > create mode 100644 xlat/packet_diag_info_flags.in > > > > diff --git a/linux/packet_diag.h b/linux/packet_diag.h > > index 3e8120b..368e26f 100644 > > --- a/linux/packet_diag.h > > +++ b/linux/packet_diag.h > > @@ -37,4 +37,37 @@ enum { > > PACKET_DIAG_FILTER, > > }; > > > > +struct packet_diag_info { > > + uint32_t pdi_index; > > + uint32_t pdi_version; > > + uint32_t pdi_reserve; > > + uint32_t pdi_copy_thresh; > > + uint32_t pdi_tstamp; > > + uint32_t pdi_flags; > > + > > +#define PDI_RUNNING 0x1 > > +#define PDI_AUXDATA 0x2 > > +#define PDI_ORIGDEV 0x4 > > +#define PDI_VNETHDR 0x8 > > +#define PDI_LOSS 0x10 > > +}; > > + > > +struct packet_diag_mclist { > > + uint32_t pdmc_index; > > + uint32_t pdmc_count; > > + uint16_t pdmc_type; > > + uint16_t pdmc_alen; > > + uint8_t pdmc_addr[32]; /* MAX_ADDR_LEN */ > > +}; > > + > > +struct packet_diag_ring { > > + uint32_t pdr_block_size; > > + uint32_t pdr_block_nr; > > + uint32_t pdr_frame_size; > > + uint32_t pdr_frame_nr; > > + uint32_t pdr_retire_tmo; > > + uint32_t pdr_sizeof_priv; > > + uint32_t pdr_features; > > +}; > > + > > #endif /* !STRACE_LINUX_PACKET_DIAG_H */ > > diff --git a/netlink_sock_diag.c b/netlink_sock_diag.c > > index 3888934..f0466b9 100644 > > --- a/netlink_sock_diag.c > > +++ b/netlink_sock_diag.c > > @@ -55,6 +55,7 @@ > > #include "xlat/netlink_states.h" > > > > #include "xlat/packet_diag_attrs.h" > > +#include "xlat/packet_diag_info_flags.h" > > #include "xlat/packet_diag_show.h" > > > > #ifdef AF_SMC > > @@ -447,6 +448,117 @@ decode_packet_diag_req(struct tcb *const tcp, > > tprints("}"); > > } > > > > +static bool > > +decode_packet_diag_info(struct tcb *const tcp, > > + const kernel_ulong_t addr, > > + const kernel_ulong_t len, > > + const void *const opaque_data) > > +{ > > + struct packet_diag_info pinfo; > > + > > + if (len < sizeof(pinfo)) > > + return false; > > + if (umove_or_printaddr(tcp, addr, &pinfo)) > > + return true; > > + > > + PRINT_FIELD_U("{", pinfo, pdi_index); > > + PRINT_FIELD_U(", ", pinfo, pdi_version); > > + PRINT_FIELD_U(", ", pinfo, pdi_reserve); > > + PRINT_FIELD_U(", ", pinfo, pdi_copy_thresh); > > + PRINT_FIELD_U(", ", pinfo, pdi_tstamp); > > + PRINT_FIELD_FLAGS(", ", pinfo, pdi_flags, > > + packet_diag_info_flags, "PDI_???"); > > + > > + tprints("}"); > > + > > + return true; > > +} > > + > > +static bool > > +print_packet_diag_mclist(struct tcb *tcp, void *elem_buf, > > + size_t elem_size, void *opaque_data) > > +{ > > + struct packet_diag_mclist *dml = elem_buf; > > + uint16_t alen = dml->pdmc_alen > sizeof(dml->pdmc_addr) ? > > + sizeof(dml->pdmc_addr) : dml->pdmc_alen; > > + > > + tprints("{pdmc_index="); > > + print_ifindex(dml->pdmc_index); > > + PRINT_FIELD_U(", ", *dml, pdmc_count); > > + PRINT_FIELD_U(", ", *dml, pdmc_type); > > + PRINT_FIELD_U(", ", *dml, pdmc_alen); > > + PRINT_FIELD_QUOTED_STRING(", ", *dml, pdmc_addr, alen, 0); > > Don't you think the address should be printed in hex? > > > + tprints("}"); > > + > > + return true; > > +} > > + > > +static bool > > +decode_packet_diag_mclist(struct tcb *const tcp, > > + const kernel_ulong_t addr, > > + const kernel_ulong_t len, > > + const void *const opaque_data) > > +{ > > + struct packet_diag_mclist dml; > > + const size_t nmemb = len / sizeof(dml); > > + > > + if (!nmemb) > > + return false; > > + > > + print_array(tcp, addr, nmemb, &dml, sizeof(dml), > > + umoven_or_printaddr, print_packet_diag_mclist, 0); > > + > > + return true; > > +} > > + > > +static bool > > +decode_packet_diag_ring(struct tcb *const tcp, > > + const kernel_ulong_t addr, > > + const kernel_ulong_t len, > > + const void *const opaque_data) > > +{ > > + struct packet_diag_ring pdr; > > + > > + if (len < sizeof(pdr)) > > + return false; > > + if (umove_or_printaddr(tcp, addr, &pdr)) > > + return true; > > + > > + PRINT_FIELD_U("{", pdr, pdr_block_size); > > + PRINT_FIELD_U(", ", pdr, pdr_block_nr); > > + PRINT_FIELD_U(", ", pdr, pdr_frame_size); > > + PRINT_FIELD_U(", ", pdr, pdr_frame_nr); > > + PRINT_FIELD_U(", ", pdr, pdr_retire_tmo); > > + PRINT_FIELD_U(", ", pdr, pdr_sizeof_priv); > > + PRINT_FIELD_U(", ", pdr, pdr_features); > > + tprints("}"); > > + > > + return true; > > +} > > + > > +static bool > > +decode_packet_diag_filter(struct tcb *const tcp, > > + const kernel_ulong_t addr, > > + const kernel_ulong_t len, > > + const void *const opaque_data) > > +{ > > + print_seccomp_fprog(tcp, addr, len); > > + > > + return true; > > +} > > This bpf filter is not a seccomp filter, although it shares a lot with it. > In particular, SECCOMP_RET_* stuff is not applicable here. > > Looks like print_seccomp_fprog needs to be generalized. > I'll have a look.
So I implemented decoding of socket filter programs, too, and changed decode_packet_diag_filter accordingly. Note that the code was not correct also because print_seccomp_fprog (as well as new function print_sock_fprog) takes the number of sock_filter elements, not the number of bytes. -- ldv
signature.asc
Description: PGP signature
------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel