Extended ACK reporting introduced by linux kernel commit v4.11-rc5-1382-g2d4bc93.
* netlink.h (NLM_F_CAPPED): New macro. * netlink.c (decode_payload): Pass nlmsghdr->nlmsg_flags & NLM_F_CAPPED to decode_nlmsgerr. (decode_nlmsgerr): Adjust the length pass to decode_nlmsghdr_with_payload. --- netlink.c | 16 ++++++++++++---- netlink.h | 4 ++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/netlink.c b/netlink.c index d3ad8b0..fc440da 100644 --- a/netlink.c +++ b/netlink.c @@ -297,7 +297,8 @@ decode_nlmsgerr(struct tcb *const tcp, const int fd, const int family, kernel_ulong_t addr, - kernel_ulong_t len) + kernel_ulong_t len, + const bool capped) { struct nlmsgerr err; @@ -320,10 +321,16 @@ decode_nlmsgerr(struct tcb *const tcp, len -= offsetof(struct nlmsgerr, msg); if (len) { + unsigned int payload = + len > err.msg.nlmsg_len ? err.msg.nlmsg_len : len; + + if (capped && payload > sizeof(err.msg)) + payload = sizeof(err.msg); + tprints(", msg="); - if (fetch_nlmsghdr(tcp, &err.msg, addr, len)) { + if (fetch_nlmsghdr(tcp, &err.msg, addr, payload)) { decode_nlmsghdr_with_payload(tcp, fd, family, - &err.msg, addr, len); + &err.msg, addr, payload); } } @@ -344,7 +351,8 @@ decode_payload(struct tcb *const tcp, const kernel_ulong_t len) { if (nlmsghdr->nlmsg_type == NLMSG_ERROR) { - decode_nlmsgerr(tcp, fd, family, addr, len); + decode_nlmsgerr(tcp, fd, family, addr, len, + nlmsghdr->nlmsg_flags & NLM_F_CAPPED); return; } diff --git a/netlink.h b/netlink.h index 5943229..31b7876 100644 --- a/netlink.h +++ b/netlink.h @@ -36,6 +36,10 @@ # define NETLINK_SOCK_DIAG 4 #endif +#ifndef NLM_F_CAPPED +# define NLM_F_CAPPED 0x100 +#endif + #undef NLMSG_HDRLEN #define NLMSG_HDRLEN ((unsigned int) NLMSG_ALIGN(sizeof(struct nlmsghdr))) -- 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