[PATCH v3 2/7] Add a general netlink socket parser

Fabien Siron fabien.siron at epita.fr
Thu Jun 16 13:22:12 UTC 2016


Quoting Dmitry V. Levin (2016-06-16 01:36:47)
> On Wed, Jun 15, 2016 at 12:43:00PM +0000, Fabien Siron wrote:
> > This commit introduces a general socket netlink parser which prints
> > the header and a string for the remaining part of the buffer. It doesn't
> > handle all the netlink flags and types because the parser needs more
> > information. It will be done soon.
> > 
> > * net.c (printsock): Return family.
> > (do_msghdr): Call decode_netlink_iov().
> > (send, sendto, recv, recvfrom): Call printsockbuf().
> > * netlink.c: New file.
> > (decode_netlink): New function.
> > (_decode_netlink): New static function.
> > (decode_iov_netlink): New function.
> > * defs.h (decode_netlink, decode_netlink_iov, getfdproto): Add.
> > (printsock): Change return type.
> > * util.c (getfdproto): Remove the static keyword to the function.
> > * Makefile.am (strace_SOURCES): Add netlink.c.
> > * xlat/netlink_flags.in: New file.
> > * xlat/netlink_types.in: New file.
> > ---
> >  Makefile.am           |  1 +
> >  defs.h                |  5 ++-
> >  net.c                 | 55 ++++++++++++++++++++++++-------
> >  netlink.c             | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++
> >  util.c                |  2 +-
> >  xlat/netlink_flags.in |  6 ++++
> >  xlat/netlink_types.in |  4 +++
> >  7 files changed, 149 insertions(+), 14 deletions(-)
> >  create mode 100644 netlink.c
> >  create mode 100644 xlat/netlink_flags.in
> >  create mode 100644 xlat/netlink_types.in
> > 
> > diff --git a/Makefile.am b/Makefile.am
> > index 77e0cc8..ab0e200 100644
> > --- a/Makefile.am
> > +++ b/Makefile.am
> > @@ -156,6 +156,7 @@ strace_SOURCES =  \
> >       mtd.c           \
> >       native_defs.h   \
> >       net.c           \
> > +     netlink.c       \
> >       numa.c          \
> >       open.c          \
> >       or1k_atomic.c   \
> > diff --git a/defs.h b/defs.h
> > index ab06921..ee35dab 100644
> > --- a/defs.h
> > +++ b/defs.h
> > +static void
> > +printsockbuf(struct tcb *tcp, int fd, long addr, long addrlen)
> > +{
> > +     enum sock_proto proto;
> > +     if (show_fd_path > 1)
> > +             proto = getfdproto(tcp, fd);
> > +     else
> > +             proto = SOCK_PROTO_UNKNOWN;
> > +
> > +     switch (proto) {
> 
> There is a shorter alternative:
> 
>         switch (show_fd_path > 1 ? getfdproto(tcp, fd) : SOCK_PROTO_UNKNOWN) {
>

As verbose must be used instead of show_fd_path, the following seems better:

switch (verbose(tcp) ? getfdproto(tcp, fd) : SOCK_PROTO_UNKNOWN) {

> > @@ -947,10 +975,11 @@ SYS_FUNC(recv)
> >               printfd(tcp, tcp->u_arg[0]);
> >               tprints(", ");
> >       } else {
> > -             if (syserror(tcp))
> > +             if (syserror(tcp)) {
> 
> What's this?
> 

printsockbuf() must be called if there is no syserror. What's wrong with that?


> > diff --git a/netlink.c b/netlink.c
> > new file mode 100644
> > index 0000000..30116dd
> > --- /dev/null
> > +++ b/netlink.c
> > +static bool
> > +_decode_netlink(struct tcb *tcp, void *elem_buf, size_t elem_size,
> 
> names starting with underscore are reserved and shouldn't be used.
> 

Do you prefer something like "print_netlink_iov"?

Regards,
--
Fabien Siron




More information about the Strace-devel mailing list