[PATCH v2 4/7] rtnl_neigh: decode ndmsg netlink attributes
JingPiao Chen
chenjingpiao at gmail.com
Tue Aug 29 07:45:20 UTC 2017
* nlattr.c: Include <netinet/in.h> and <arpa/inet.h>.
(decode_nla_be16): New function.
* nlattr.h (decode_nla_be16): New prototype.
* rtnl_neigh.c (decode_neigh_addr,
decode_nda_cacheinfo): New functions.
(ndmsg_nla_decoders): New array.
(decode_ndmsg): Use it.
---
nlattr.c | 18 ++++++++++++++++++
nlattr.h | 1 +
rtnl_neigh.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++-
3 files changed, 70 insertions(+), 1 deletion(-)
diff --git a/nlattr.c b/nlattr.c
index 396db35..e67339c 100644
--- a/nlattr.c
+++ b/nlattr.c
@@ -33,6 +33,8 @@
#include <endian.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
#include <linux/sock_diag.h>
static bool
@@ -224,6 +226,22 @@ decode_nla_ifindex(struct tcb *const tcp,
}
bool
+decode_nla_be16(struct tcb *const tcp,
+ const kernel_ulong_t addr,
+ const unsigned int len,
+ const void *const opaque_data)
+{
+ uint16_t num;
+
+ if (len < sizeof(num))
+ return false;
+ else if (!umove_or_printaddr(tcp, addr, &num))
+ tprintf("htons(%u)", ntohs(num));
+
+ return true;
+}
+
+bool
decode_nla_be64(struct tcb *const tcp,
const kernel_ulong_t addr,
const unsigned int len,
diff --git a/nlattr.h b/nlattr.h
index db1fd69..09c233e 100644
--- a/nlattr.h
+++ b/nlattr.h
@@ -56,6 +56,7 @@ DECL_NLA(s8);
DECL_NLA(s16);
DECL_NLA(s32);
DECL_NLA(s64);
+DECL_NLA(be16);
DECL_NLA(be64);
DECL_NLA(str);
DECL_NLA(strn);
diff --git a/rtnl_neigh.c b/rtnl_neigh.c
index 7191ecb..0eaadc5 100644
--- a/rtnl_neigh.c
+++ b/rtnl_neigh.c
@@ -42,6 +42,54 @@
#include "xlat/neighbor_cache_entry_states.h"
#include "xlat/rtnl_neigh_attrs.h"
+static bool
+decode_neigh_addr(struct tcb *const tcp,
+ const kernel_ulong_t addr,
+ const unsigned int len,
+ const void *const opaque_data)
+{
+ const struct ndmsg *const ndmsg = opaque_data;
+
+ decode_inet_addr(tcp, addr, len, ndmsg->ndm_family, NULL);
+
+ return true;
+}
+
+static bool
+decode_nda_cacheinfo(struct tcb *const tcp,
+ const kernel_ulong_t addr,
+ const unsigned int len,
+ const void *const opaque_data)
+{
+ struct nda_cacheinfo ci;
+
+ if (len < sizeof(ci))
+ return false;
+ else if (!umove_or_printaddr(tcp, addr, &ci)) {
+ PRINT_FIELD_U("{", ci, ndm_confirmed);
+ PRINT_FIELD_U(", ", ci, ndm_used);
+ PRINT_FIELD_U(", ", ci, ndm_updated);
+ PRINT_FIELD_U(", ", ci, ndm_refcnt);
+ tprints("}");
+ }
+
+ return true;
+}
+
+static const nla_decoder_t ndmsg_nla_decoders[] = {
+ [NDA_DST] = decode_neigh_addr,
+ [NDA_LLADDR] = decode_neigh_addr,
+ [NDA_CACHEINFO] = decode_nda_cacheinfo,
+ [NDA_PROBES] = decode_nla_u32,
+ [NDA_VLAN] = decode_nla_u16,
+ [NDA_PORT] = decode_nla_be16,
+ [NDA_VNI] = decode_nla_u32,
+ [NDA_IFINDEX] = decode_nla_ifindex,
+ [NDA_MASTER] = decode_nla_ifindex,
+ [NDA_LINK_NETNSID] = decode_nla_u32,
+ [NDA_SRC_VNI] = NULL,
+};
+
DECL_NETLINK_ROUTE_DECODER(decode_ndmsg)
{
struct ndmsg ndmsg = { .ndm_family = family };
@@ -74,7 +122,9 @@ DECL_NETLINK_ROUTE_DECODER(decode_ndmsg)
if (decode_nla && len > offset) {
tprints(", ");
decode_nlattr(tcp, addr + offset, len - offset,
- rtnl_neigh_attrs, "NDA_???", NULL, 0, NULL);
+ rtnl_neigh_attrs, "NDA_???",
+ ndmsg_nla_decoders,
+ ARRAY_SIZE(ndmsg_nla_decoders), &ndmsg);
}
}
--
2.7.4
More information about the Strace-devel
mailing list