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

Attachment: 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

Reply via email to