* netlink_sock_diag.c (netlink_decoders): New array.
(decode_netlink_diag_msg): Use it.
* linux/netlink_diag.h (netlink_diag_ring): New structure.
---
 linux/netlink_diag.h |  7 +++++++
 netlink_sock_diag.c  | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 63 insertions(+), 1 deletion(-)

diff --git a/linux/netlink_diag.h b/linux/netlink_diag.h
index ad13aa9..11995a0 100644
--- a/linux/netlink_diag.h
+++ b/linux/netlink_diag.h
@@ -23,6 +23,13 @@ struct netlink_diag_msg {
        uint32_t ndiag_cookie[2];
 };
 
+struct netlink_diag_ring {
+       uint32_t ndr_block_size;
+       uint32_t ndr_block_nr;
+       uint32_t ndr_frame_size;
+       uint32_t ndr_frame_nr;
+};
+
 enum {
        NETLINK_DIAG_MEMINFO,
        NETLINK_DIAG_GROUPS,
diff --git a/netlink_sock_diag.c b/netlink_sock_diag.c
index dab0f1a..f5bdf84 100644
--- a/netlink_sock_diag.c
+++ b/netlink_sock_diag.c
@@ -216,6 +216,60 @@ decode_netlink_diag_req(struct tcb *const tcp,
        tprints("}");
 }
 
+static bool
+print_group(struct tcb *tcp, void *elem_buf,
+           size_t elem_size, void *opaque_data)
+{
+       if (elem_size < sizeof(kernel_ulong_t))
+               tprintf("%#0*x", (int) elem_size * 2 + 2,
+                       *(unsigned int *) elem_buf);
+       else
+               tprintf("%#0*" PRI_klx, (int) elem_size * 2 + 2,
+                       *(kernel_ulong_t *) elem_buf);
+
+       return true;
+}
+
+static bool
+decode_netlink_diag_groups(struct tcb *tcp, kernel_ulong_t addr,
+                          kernel_ulong_t len, void *const opaque_data)
+{
+       int nmemb = len / current_wordsize;
+       kernel_ulong_t buf;
+
+       print_array(tcp, addr, nmemb, &buf, current_wordsize,
+                   umoven_or_printaddr, print_group, 0);
+
+       return true;
+}
+
+static bool
+decode_netlink_diag_ring(struct tcb *tcp, kernel_ulong_t addr,
+                        kernel_ulong_t len, void *const opaque_data)
+{
+       struct netlink_diag_ring ndr;
+
+       if (len < sizeof(ndr))
+               return false;
+       if (umove_or_printaddr(tcp, addr, &ndr))
+               return true;
+
+       tprintf("{ndr_block_size=%" PRIu32 ", ndr_block_nr=%" PRIu32
+               ", ndr_frame_size=%" PRIu32 ", ndr_frame_nr=%" PRIu32,
+               ndr.ndr_block_size, ndr.ndr_block_nr,
+               ndr.ndr_frame_size, ndr.ndr_frame_nr);
+       tprints("}");
+
+       return true;
+}
+
+static nla_decoder_t netlink_decoders[] = {
+       [NETLINK_DIAG_MEMINFO]  = decode_meminfo,
+       [NETLINK_DIAG_GROUPS]   = decode_netlink_diag_groups,
+       [NETLINK_DIAG_RX_RING]  = decode_netlink_diag_ring,
+       [NETLINK_DIAG_TX_RING]  = decode_netlink_diag_ring
+};
+
 static void
 decode_netlink_diag_msg(struct tcb *const tcp,
                        const struct nlmsghdr *const nlmsghdr,
@@ -266,7 +320,8 @@ decode_netlink_diag_msg(struct tcb *const tcp,
                tprints(", ");
                decode_nlattr(tcp, addr + offset, len - offset,
                              netlink_diag_attrs, "NETLINK_DIAG_???",
-                             NULL, 0, NULL);
+                             netlink_decoders,
+                             ARRAY_SIZE(netlink_decoders), NULL);
        }
 }
 
-- 
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