* 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

Reply via email to