[PATCH 4/7] rtnl_neightbl: decode ndtmsg netlink attributes

JingPiao Chen chenjingpiao at gmail.com
Thu Aug 31 02:39:22 UTC 2017


* configure.ac (AC_CHECK_TYPES): Check for ndt_config
and ndt_stats structures in <linux/neighbour.h>.
(AC_CHECK_MEMBERS): Check for ndts_table_fulls field in struct ndt_stats.
* rtnl_neightbl.c: Include "xlat/rtnl_neightbl_parms_attrs.h".
(decode_ndt_config, decode_ndta_parms, decode_ndta_parms): New functions.
(ndt_parms_nla_decoders, ndtmsg_nla_decoders): New arrays.
(decode_ndtmsg): Use ndtmsg_nla_decoders.
* xlat/rtnl_neightbl_parms_attrs.in: New file.
---
 configure.ac                      |   6 ++
 rtnl_neightbl.c                   | 115 +++++++++++++++++++++++++++++++++++++-
 xlat/rtnl_neightbl_parms_attrs.in |  19 +++++++
 3 files changed, 139 insertions(+), 1 deletion(-)
 create mode 100644 xlat/rtnl_neightbl_parms_attrs.in

diff --git a/configure.ac b/configure.ac
index bcf5129..28e9a34 100644
--- a/configure.ac
+++ b/configure.ac
@@ -454,6 +454,12 @@ AC_CHECK_TYPES(m4_normalize([
 	struct rtvia
 ]),,, [#include <linux/rtnetlink.h>])
 
+AC_CHECK_MEMBERS([struct ndt_stats.ndts_table_fulls],,, [#include <linux/neighbour.h>])
+AC_CHECK_TYPES(m4_normalize([
+	struct ndt_config,
+	struct ndt_stats
+]),,, [#include <linux/neighbour.h>])
+
 AC_CHECK_TYPES([struct rtnl_link_stats64],,, [#include <linux/if_link.h>])
 AC_CHECK_MEMBERS(m4_normalize([
 	struct rtnl_link_stats.rx_nohandler,
diff --git a/rtnl_neightbl.c b/rtnl_neightbl.c
index 41f8c92..bf4d98e 100644
--- a/rtnl_neightbl.c
+++ b/rtnl_neightbl.c
@@ -39,6 +39,117 @@
 #endif
 
 #include "xlat/rtnl_neightbl_attrs.h"
+#include "xlat/rtnl_neightbl_parms_attrs.h"
+
+static bool
+decode_ndt_config(struct tcb *const tcp,
+		  const kernel_ulong_t addr,
+		  const unsigned int len,
+		  const void *const opaque_data)
+{
+#ifdef HAVE_STRUCT_NDT_CONFIG
+	struct ndt_config ndtc;
+
+	if (len < sizeof(ndtc))
+		return false;
+	else if (!umove_or_printaddr(tcp, addr, &ndtc)) {
+		PRINT_FIELD_U("{", ndtc, ndtc_key_len);
+		PRINT_FIELD_U(", ", ndtc, ndtc_entry_size);
+		PRINT_FIELD_U(", ", ndtc, ndtc_entries);
+		PRINT_FIELD_U(", ", ndtc, ndtc_last_flush);
+		PRINT_FIELD_U(", ", ndtc, ndtc_last_rand);
+		PRINT_FIELD_U(", ", ndtc, ndtc_hash_rnd);
+		PRINT_FIELD_0X(", ", ndtc, ndtc_hash_mask);
+		PRINT_FIELD_U(", ", ndtc, ndtc_hash_chain_gc);
+		PRINT_FIELD_U(", ", ndtc, ndtc_proxy_qlen);
+		tprints("}");
+	}
+
+	return true;
+#else
+	return false;
+#endif
+}
+
+static const nla_decoder_t ndt_parms_nla_decoders[] = {
+	[NDTPA_IFINDEX]			= decode_nla_ifindex,
+	[NDTPA_REFCNT]			= decode_nla_u32,
+	[NDTPA_REACHABLE_TIME]		= decode_nla_u64,
+	[NDTPA_BASE_REACHABLE_TIME]	= decode_nla_u64,
+	[NDTPA_RETRANS_TIME]		= decode_nla_u64,
+	[NDTPA_GC_STALETIME]		= decode_nla_u64,
+	[NDTPA_DELAY_PROBE_TIME]	= decode_nla_u64,
+	[NDTPA_QUEUE_LEN]		= decode_nla_u32,
+	[NDTPA_APP_PROBES]		= decode_nla_u32,
+	[NDTPA_UCAST_PROBES]		= decode_nla_u32,
+	[NDTPA_MCAST_PROBES]		= decode_nla_u32,
+	[NDTPA_ANYCAST_DELAY]		= decode_nla_u64,
+	[NDTPA_PROXY_DELAY]		= decode_nla_u64,
+	[NDTPA_PROXY_QLEN]		= decode_nla_u32,
+	[NDTPA_LOCKTIME]		= decode_nla_u64,
+	[NDTPA_QUEUE_LENBYTES]		= decode_nla_u32,
+	[NDTPA_MCAST_REPROBES]		= decode_nla_u32,
+	[NDTPA_PAD]			= NULL
+};
+
+static bool
+decode_ndta_parms(struct tcb *const tcp,
+		  const kernel_ulong_t addr,
+		  const unsigned int len,
+		  const void *const opaque_data)
+{
+	decode_nlattr(tcp, addr, len, rtnl_neightbl_parms_attrs, "NDTPA_???",
+		      ndt_parms_nla_decoders,
+		      ARRAY_SIZE(ndt_parms_nla_decoders), opaque_data);
+
+	return true;
+}
+
+static bool
+decode_ndt_stats(struct tcb *const tcp,
+		 const kernel_ulong_t addr,
+		 const unsigned int len,
+		 const void *const opaque_data)
+{
+#ifdef HAVE_STRUCT_NDT_STATS
+	struct ndt_stats ndtst;
+
+	if (len < sizeof(ndtst))
+		return false;
+	else if (!umove_or_printaddr(tcp, addr, &ndtst)) {
+		PRINT_FIELD_U("{", ndtst, ndts_allocs);
+		PRINT_FIELD_U(", ", ndtst, ndts_destroys);
+		PRINT_FIELD_U(", ", ndtst, ndts_hash_grows);
+		PRINT_FIELD_U(", ", ndtst, ndts_res_failed);
+		PRINT_FIELD_U(", ", ndtst, ndts_lookups);
+		PRINT_FIELD_U(", ", ndtst, ndts_hits);
+		PRINT_FIELD_U(", ", ndtst, ndts_rcv_probes_mcast);
+		PRINT_FIELD_U(", ", ndtst, ndts_rcv_probes_ucast);
+		PRINT_FIELD_U(", ", ndtst, ndts_periodic_gc_runs);
+		PRINT_FIELD_U(", ", ndtst, ndts_forced_gc_runs);
+#ifdef HAVE_STRUCT_NDT_STATS_NDTS_TABLE_FULLS
+		PRINT_FIELD_U(", ", ndtst, ndts_table_fulls);
+#endif
+		tprints("}");
+	}
+
+	return true;
+#else
+	return false;
+#endif /* HAVE_STRUCT_NDT_STATS */
+}
+
+static const nla_decoder_t ndtmsg_nla_decoders[] = {
+	[NDTA_NAME]		= decode_nla_str,
+	[NDTA_THRESH1]		= decode_nla_u32,
+	[NDTA_THRESH2]		= decode_nla_u32,
+	[NDTA_THRESH3]		= decode_nla_u32,
+	[NDTA_CONFIG]		= decode_ndt_config,
+	[NDTA_PARMS]		= decode_ndta_parms,
+	[NDTA_STATS]		= decode_ndt_stats,
+	[NDTA_GC_INTERVAL]	= decode_nla_u64,
+	[NDTA_PAD]		= NULL,
+};
 
 DECL_NETLINK_ROUTE_DECODER(decode_ndtmsg)
 {
@@ -51,6 +162,8 @@ DECL_NETLINK_ROUTE_DECODER(decode_ndtmsg)
 	if (len > offset) {
 		tprints(", ");
 		decode_nlattr(tcp, addr + offset, len - offset,
-			      rtnl_neightbl_attrs, "NDTA_???", NULL, 0, NULL);
+			      rtnl_neightbl_attrs, "NDTA_???",
+			      ndtmsg_nla_decoders,
+			      ARRAY_SIZE(ndtmsg_nla_decoders), NULL);
 	}
 }
diff --git a/xlat/rtnl_neightbl_parms_attrs.in b/xlat/rtnl_neightbl_parms_attrs.in
new file mode 100644
index 0000000..9fcbff0
--- /dev/null
+++ b/xlat/rtnl_neightbl_parms_attrs.in
@@ -0,0 +1,19 @@
+NDTPA_UNSPEC			0
+NDTPA_IFINDEX			1
+NDTPA_REFCNT			2
+NDTPA_REACHABLE_TIME		3
+NDTPA_BASE_REACHABLE_TIME	4
+NDTPA_RETRANS_TIME		5
+NDTPA_GC_STALETIME		6
+NDTPA_DELAY_PROBE_TIME		7
+NDTPA_QUEUE_LEN			8
+NDTPA_APP_PROBES		9
+NDTPA_UCAST_PROBES		10
+NDTPA_MCAST_PROBES		11
+NDTPA_ANYCAST_DELAY		12
+NDTPA_PROXY_DELAY		13
+NDTPA_PROXY_QLEN		14
+NDTPA_LOCKTIME			15
+NDTPA_QUEUE_LENBYTES		16
+NDTPA_MCAST_REPROBES		17
+NDTPA_PAD			18
-- 
2.7.4





More information about the Strace-devel mailing list