[PATCH v3] netlink: adjust decode_nlmsgerr for extended ACK reporting

JingPiao Chen chenjingpiao at gmail.com
Wed Jul 19 03:07:19 UTC 2017


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 | 14 +++++++++++---
 netlink.h |  4 ++++
 2 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/netlink.c b/netlink.c
index d3ad8b0..122422b 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;
+
 		tprints(", msg=");
 		if (fetch_nlmsghdr(tcp, &err.msg, addr, len)) {
+			payload = capped ? sizeof(err.msg) : err.msg.nlmsg_len;
+			if (payload > len)
+				payload = len;
+
 			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





More information about the Strace-devel mailing list