* 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_???"); + } +} + static int print_nlmsghdr(struct tcb *tcp, const int fd, @@ -170,7 +215,8 @@ print_nlmsghdr(struct tcb *tcp, decode_nlmsg_type(nlmsghdr->nlmsg_type, hdr_family); tprints(", flags="); - printflags(netlink_flags, nlmsghdr->nlmsg_flags, "NLM_F_???"); + decode_nlmsg_flags(nlmsghdr->nlmsg_flags, + nlmsghdr->nlmsg_type, hdr_family); tprintf(", seq=%u, pid=%u}", nlmsghdr->nlmsg_seq, nlmsghdr->nlmsg_pid); diff --git a/xlat/netlink_get_flags.in b/xlat/netlink_get_flags.in new file mode 100644 index 0000000..0b68ba9 --- /dev/null +++ b/xlat/netlink_get_flags.in @@ -0,0 +1,11 @@ +NLM_F_REQUEST +NLM_F_MULTI +NLM_F_ACK +NLM_F_ECHO +NLM_F_DUMP_INTR +NLM_F_DUMP_FILTERED + +NLM_F_DUMP +NLM_F_ROOT +NLM_F_MATCH +NLM_F_ATOMIC diff --git a/xlat/netlink_new_flags.in b/xlat/netlink_new_flags.in new file mode 100644 index 0000000..fa0c859 --- /dev/null +++ b/xlat/netlink_new_flags.in @@ -0,0 +1,11 @@ +NLM_F_REQUEST +NLM_F_MULTI +NLM_F_ACK +NLM_F_ECHO +NLM_F_DUMP_INTR +NLM_F_DUMP_FILTERED + +NLM_F_REPLACE +NLM_F_EXCL +NLM_F_CREATE +NLM_F_APPEND diff --git a/xlat/nl_route_get_types.in b/xlat/nl_route_get_types.in new file mode 100644 index 0000000..48022c9 --- /dev/null +++ b/xlat/nl_route_get_types.in @@ -0,0 +1,19 @@ +RTM_GETLINK 18 +RTM_GETADDR 22 +RTM_GETROUTE 26 +RTM_GETNEIGH 30 +RTM_GETRULE 34 +RTM_GETQDISC 38 +RTM_GETTCLASS 42 +RTM_GETTFILTER 46 +RTM_GETACTION 50 +RTM_GETPREFIX 54 +RTM_GETMULTICAST 58 +RTM_GETANYCAST 62 +RTM_GETNEIGHTBL 66 +RTM_GETADDRLABEL 74 +RTM_GETDCB 78 +RTM_GETNETCONF 82 +RTM_GETMDB 86 +RTM_GETNSID 90 +RTM_GETSTATS 94 diff --git a/xlat/nl_route_new_types.in b/xlat/nl_route_new_types.in new file mode 100644 index 0000000..72b652b --- /dev/null +++ b/xlat/nl_route_new_types.in @@ -0,0 +1,17 @@ +RTM_NEWLINK 16 +RTM_NEWADDR 20 +RTM_NEWROUTE 24 +RTM_NEWNEIGH 28 +RTM_NEWRULE 32 +RTM_NEWQDISC 36 +RTM_NEWTCLASS 40 +RTM_NEWTFILTER 44 +RTM_NEWACTION 48 +RTM_NEWPREFIX 52 +RTM_NEWNEIGHTBL 64 +RTM_NEWNDUSEROPT 68 +RTM_NEWADDRLABEL 72 +RTM_NEWNETCONF 80 +RTM_NEWMDB 84 +RTM_NEWNSID 88 +RTM_NEWSTATS 92 diff --git a/xlat/nl_xfrm_get_types.in b/xlat/nl_xfrm_get_types.in new file mode 100644 index 0000000..5b69157 --- /dev/null +++ b/xlat/nl_xfrm_get_types.in @@ -0,0 +1,5 @@ +XFRM_MSG_GETSA +XFRM_MSG_GETPOLICY +XFRM_MSG_GETAE +XFRM_MSG_GETSADINFO +XFRM_MSG_GETSPDINFO diff --git a/xlat/nl_xfrm_new_types.in b/xlat/nl_xfrm_new_types.in new file mode 100644 index 0000000..1c2b66d --- /dev/null +++ b/xlat/nl_xfrm_new_types.in @@ -0,0 +1,5 @@ +XFRM_MSG_NEWSA +XFRM_MSG_NEWPOLICY +XFRM_MSG_NEWAE +XFRM_MSG_NEWSADINFO +XFRM_MSG_NEWSPDINFO -- 2.7.4 ------------------------------------------------------------------------------ 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