On Wed, Jun 07, 2017 at 12:47:45PM +0800, JingPiao Chen wrote: > * netlink.c: Include xlat/netlink_get_flags.h, > xlat/netlink_new_flags.h, xlat/nl_route_get_types.h, > xlat/nl_route_new_types.h, xlat/nl_xfrm_get_types.h, > and xlat/nl_xfrm_new_types.h. > (decode_nlmsg_flags): New function. > (print_nlmsghdr): Use it. > * xlat/netlink_get_flags.in: New file. > * xlat/netlink_new_flags.in: Likewise. > * xlat/nl_route_get_types.in: Likewise. > * xlat/nl_route_new_types.in: Likewise. > * xlat/nl_xfrm_get_types.in: Likewise. > * xlat/nl_xfrm_new_types.in: Likewise. > --- > > This idea I have disscussed in irc, I do not have other idea, so I trying > > to implement this idea. > > netlink.c | 48 > +++++++++++++++++++++++++++++++++++++++++++++- > xlat/netlink_get_flags.in | 11 +++++++++++ > xlat/netlink_new_flags.in | 11 +++++++++++ > xlat/nl_route_get_types.in | 19 ++++++++++++++++++ > xlat/nl_route_new_types.in | 17 ++++++++++++++++ > xlat/nl_xfrm_get_types.in | 5 +++++ > xlat/nl_xfrm_new_types.in | 5 +++++ > 7 files changed, 115 insertions(+), 1 deletion(-) > create mode 100644 xlat/netlink_get_flags.in > create mode 100644 xlat/netlink_new_flags.in > create mode 100644 xlat/nl_route_get_types.in > create mode 100644 xlat/nl_route_new_types.in > create mode 100644 xlat/nl_xfrm_get_types.in > create mode 100644 xlat/nl_xfrm_new_types.in > > diff --git a/netlink.c b/netlink.c > index f9ff465..3168d73 100644 > --- a/netlink.c > +++ b/netlink.c > @@ -34,14 +34,20 @@ > #include <linux/rtnetlink.h> > #include <linux/xfrm.h> > #include "xlat/netlink_flags.h" > +#include "xlat/netlink_get_flags.h" > +#include "xlat/netlink_new_flags.h" > #include "xlat/netlink_protocols.h" > #include "xlat/netlink_types.h" > #include "xlat/nl_audit_types.h" > #include "xlat/nl_netfilter_msg_types.h" > #include "xlat/nl_netfilter_subsys_ids.h" > +#include "xlat/nl_route_get_types.h" > +#include "xlat/nl_route_new_types.h" > #include "xlat/nl_route_types.h" > #include "xlat/nl_selinux_types.h" > #include "xlat/nl_sock_diag_types.h" > +#include "xlat/nl_xfrm_get_types.h" > +#include "xlat/nl_xfrm_new_types.h" > #include "xlat/nl_xfrm_types.h" > > #undef NLMSG_HDRLEN > @@ -152,6 +158,45 @@ decode_nlmsg_type(const uint16_t type, const unsigned > int family) > } > } > > +static const struct { > + const struct xlat *gets; > + const struct xlat *news; > +} type_class[] = { > + [NETLINK_ROUTE] = { > + .gets = nl_route_get_types, > + .news = nl_route_new_types, > + }, > + [NETLINK_SOCK_DIAG] = { > + .gets = nl_sock_diag_types, > + }, > + [NETLINK_XFRM] = { > + .gets = nl_xfrm_get_types, > + .news = nl_xfrm_new_types, > + }, > +}; > + > +/* > + * As all valid netlink families are positive integers, use unsigned int > + * for family here to filter out NL_FAMILY_ERROR and NL_FAMILY_DEFAULT. > + */ > +static void > +decode_nlmsg_flags(const uint16_t flags, const uint16_t type, > + const unsigned int family) > +{ > + if (family < ARRAY_SIZE(type_class)) { > + if (type_class[family].gets > + && xlookup(type_class[family].gets, type)) > + printflags(netlink_get_flags, flags, "NLMSG_F_???"); > + else if (type_class[family].news > + && xlookup(type_class[family].news, type)) > + printflags(netlink_new_flags, flags, "NLMSG_F_???"); > + else > + printflags(netlink_flags, flags, "NLMSG_F_???"); > + } else { > + printflags(netlink_flags, flags, "NLMSG_F_???"); > + } > +} > +
Using xlat tables just to list constants is an overkill. For now this could be done with a switch statement, e.g. const struct xlat *table = netlink_flags; switch (family) { case NETLINK_SOCK_DIAG: table = netlink_get_flags; break; case NETLINK_ROUTE: switch (type & 3) { case 0: table = netlink_new_flags; break; case 2: table = netlink_get_flags; break; } break; case NETLINK_XFRM: switch (type) { case XFRM_MSG_NEWSA: case XFRM_MSG_NEWPOLICY: case XFRM_MSG_NEWAE: case XFRM_MSG_NEWSADINFO: case XFRM_MSG_NEWSPDINFO: table = netlink_new_flags; break; case XFRM_MSG_GETSA: case XFRM_MSG_GETPOLICY: case XFRM_MSG_GETAE: case XFRM_MSG_GETSADINFO: case XFRM_MSG_GETSPDINFO: table = netlink_get_flags; break; } break; } printflags(table, flags, "NLM_F_???"); With growing number of netfilter family decoders this could be delegated further, e.g. by extending nlmsg_types table. -- 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