* configure.ac (AC_CHECK_TYPES): Check for struct br_mdb_entry in <linux/if_bridge.h>. (AC_CHECK_MEMBERS): Check for state, flags and vid fields in struct br_mdb_entry. * rtnl_mdb.c: Include "xlat/mdb_flags.h", "xlat/mdb_states.h", "xlat/rtnl_mdba_mdb_attrs.h", "xlat/rtnl_mdba_mdb_eattr_attrs.h", "xlat/rtnl_mdba_mdb_entry_attrs.h" and "xlat/rtnl_mdba_router_attrs.h". (decode_mdba_mdb_entry_info, decode_mdba_mdb_entry, decode_mdba_mdb, decode_mdba_router_port, decode_mdba_router): New functions. (mdba_mdb_eattr_nla_decoders, mdba_mdb_entry_nla_decoders, mdba_mdb_nla_decoders, mdba_router_nla_decoders, br_port_msg_nla_decoders): New arrays. (decode_br_port_msg): Use br_port_msg_nla_decoders. * xlat/mdb_flags.in: New file. * xlat/mdb_states.in: Likewise. * xlat/rtnl_mdba_mdb_attrs.in: Likewise. * xlat/rtnl_mdba_mdb_eattr_attrs.in: Likewise. * xlat/rtnl_mdba_mdb_entry_attrs.in: Likewise. * xlat/rtnl_mdba_router_attrs.in: Likewise. --- configure.ac | 11 ++- rtnl_mdb.c | 151 +++++++++++++++++++++++++++++++++++++- xlat/mdb_flags.in | 1 + xlat/mdb_states.in | 2 + xlat/rtnl_mdba_mdb_attrs.in | 2 + xlat/rtnl_mdba_mdb_eattr_attrs.in | 2 + xlat/rtnl_mdba_mdb_entry_attrs.in | 2 + xlat/rtnl_mdba_router_attrs.in | 2 + 8 files changed, 171 insertions(+), 2 deletions(-) create mode 100644 xlat/mdb_flags.in create mode 100644 xlat/mdb_states.in create mode 100644 xlat/rtnl_mdba_mdb_attrs.in create mode 100644 xlat/rtnl_mdba_mdb_eattr_attrs.in create mode 100644 xlat/rtnl_mdba_mdb_entry_attrs.in create mode 100644 xlat/rtnl_mdba_router_attrs.in
diff --git a/configure.ac b/configure.ac index cb6571a..2990a03 100644 --- a/configure.ac +++ b/configure.ac @@ -448,7 +448,16 @@ AC_CHECK_HEADERS([linux/bpf.h], [ st_CHECK_UNION_BPF_ATTR([prog_flags]) ]) -AC_CHECK_TYPES([struct br_port_msg],,, [#include <linux/if_bridge.h>]) +AC_CHECK_TYPES(m4_normalize([ + struct br_mdb_entry, + struct br_port_msg +]),,, [#include <linux/if_bridge.h>]) +AC_CHECK_MEMBERS(m4_normalize([ + struct br_mdb_entry.flags, + struct br_mdb_entry.state, + struct br_mdb_entry.vid +]),,, [#include <linux/if_bridge.h>]) + AC_CHECK_TYPES([struct dcbmsg],,, [#include <linux/dcbnl.h>]) AC_CHECK_TYPES([struct ifaddrlblmsg],,, [#include <linux/if_addrlabel.h>]) AC_CHECK_TYPES([struct netconfmsg],,, [#include <linux/netconf.h>]) diff --git a/rtnl_mdb.c b/rtnl_mdb.c index ebe737d..7ec3c86 100644 --- a/rtnl_mdb.c +++ b/rtnl_mdb.c @@ -39,7 +39,154 @@ # include <linux/if_bridge.h> # include "netlink.h" +# ifdef HAVE_STRUCT_BR_MDB_ENTRY_FLAGS +# include "xlat/mdb_flags.h" +# endif +# ifdef HAVE_STRUCT_BR_MDB_ENTRY_STATE +# include "xlat/mdb_states.h" +# endif # include "xlat/rtnl_mdb_attrs.h" +# include "xlat/rtnl_mdba_mdb_attrs.h" +# include "xlat/rtnl_mdba_mdb_eattr_attrs.h" +# include "xlat/rtnl_mdba_mdb_entry_attrs.h" +# include "xlat/rtnl_mdba_router_attrs.h" + +static const nla_decoder_t mdba_mdb_eattr_nla_decoders[] = { + [MDBA_MDB_EATTR_TIMER] = decode_nla_u32 +}; + +static bool +decode_mdba_mdb_entry_info(struct tcb *const tcp, + const kernel_ulong_t addr, + const unsigned int len, + const void *const opaque_data) +{ +# ifdef HAVE_STRUCT_BR_MDB_ENTRY + struct br_mdb_entry entry; + + if (len < sizeof(entry)) + return false; + else if (!umove_or_printaddr(tcp, addr, &entry)) { + PRINT_FIELD_IFINDEX("{", entry, ifindex); +# ifdef HAVE_STRUCT_BR_MDB_ENTRY_STATE + PRINT_FIELD_XVAL(", ", entry, state, mdb_states, "MDB_???"); +# endif +# ifdef HAVE_STRUCT_BR_MDB_ENTRY_FLAGS + PRINT_FIELD_FLAGS(", ", entry, flags, + mdb_flags, "MDB_FLAGS_???"); +# endif +# ifdef HAVE_STRUCT_BR_MDB_ENTRY_VID + PRINT_FIELD_U(", ", entry, vid); +# endif + + const int proto = ntohs(entry.addr.proto); + const char *const str = proto == AF_INET || proto == AF_INET6 + ? (proto == AF_INET ? "ip4" : "ip6") + : "u"; + + tprints(", addr={"); + print_inet_addr(proto, &entry.addr.u, + sizeof(entry.addr.u), str); + tprints(", proto=htons("); + printxval(addrfams, proto, "AF_???"); + tprints(")}}"); + } + + const size_t offset = NLMSG_ALIGN(sizeof(entry)); + if (len > offset) { + tprints(", "); + decode_nlattr(tcp, addr + offset, len - offset, + rtnl_mdba_mdb_eattr_attrs, "MDBA_MDB_EATTR_???", + mdba_mdb_eattr_nla_decoders, + ARRAY_SIZE(mdba_mdb_eattr_nla_decoders), NULL); + } + + return true; +# else + return false; +# endif /* HAVE_STRUCT_BR_MDB_ENTRY */ +} + +static const nla_decoder_t mdba_mdb_entry_nla_decoders[] = { + [MDBA_MDB_ENTRY_INFO] = decode_mdba_mdb_entry_info +}; + +static bool +decode_mdba_mdb_entry(struct tcb *const tcp, + const kernel_ulong_t addr, + const unsigned int len, + const void *const opaque_data) +{ + decode_nlattr(tcp, addr, len, rtnl_mdba_mdb_entry_attrs, + "MDBA_MDB_ENTRY_???", mdba_mdb_entry_nla_decoders, + ARRAY_SIZE(mdba_mdb_entry_nla_decoders), NULL); + + return true; +} + +static const nla_decoder_t mdba_mdb_nla_decoders[] = { + [MDBA_MDB_ENTRY] = decode_mdba_mdb_entry +}; + +static bool +decode_mdba_mdb(struct tcb *const tcp, + const kernel_ulong_t addr, + const unsigned int len, + const void *const opaque_data) +{ + decode_nlattr(tcp, addr, len, rtnl_mdba_mdb_attrs, "MDBA_MDB_???", + mdba_mdb_nla_decoders, + ARRAY_SIZE(mdba_mdb_nla_decoders), NULL); + + return true; +} + +static bool +decode_mdba_router_port(struct tcb *const tcp, + const kernel_ulong_t addr, + const unsigned int len, + const void *const opaque_data) +{ + uint32_t ifindex; + + if (len < sizeof(ifindex)) + return false; + else if (!umove_or_printaddr(tcp, addr, &ifindex)) + print_ifindex(ifindex); + + const size_t offset = NLMSG_ALIGN(sizeof(ifindex)); + if (len > offset) { + tprints(", "); + decode_nlattr(tcp, addr + offset, len - offset, + rtnl_mdba_mdb_eattr_attrs, "MDBA_MDB_EATTR_???", + mdba_mdb_eattr_nla_decoders, + ARRAY_SIZE(mdba_mdb_eattr_nla_decoders), NULL); + } + + return true; +} + +static const nla_decoder_t mdba_router_nla_decoders[] = { + [MDBA_ROUTER_PORT] = decode_mdba_router_port +}; + +static bool +decode_mdba_router(struct tcb *const tcp, + const kernel_ulong_t addr, + const unsigned int len, + const void *const opaque_data) +{ + decode_nlattr(tcp, addr, len, rtnl_mdba_router_attrs, "MDBA_ROUTER_???", + mdba_router_nla_decoders, + ARRAY_SIZE(mdba_router_nla_decoders), NULL); + + return true; +} + +static const nla_decoder_t br_port_msg_nla_decoders[] = { + [MDBA_MDB] = decode_mdba_mdb, + [MDBA_ROUTER] = decode_mdba_router +}; DECL_NETLINK_ROUTE_DECODER(decode_br_port_msg) { @@ -65,7 +212,9 @@ DECL_NETLINK_ROUTE_DECODER(decode_br_port_msg) if (decode_nla && len > offset) { tprints(", "); decode_nlattr(tcp, addr + offset, len - offset, - rtnl_mdb_attrs, "MDBA_???", NULL, 0, NULL); + rtnl_mdb_attrs, "MDBA_???", + br_port_msg_nla_decoders, + ARRAY_SIZE(br_port_msg_nla_decoders), NULL); } } diff --git a/xlat/mdb_flags.in b/xlat/mdb_flags.in new file mode 100644 index 0000000..4c2f1ed --- /dev/null +++ b/xlat/mdb_flags.in @@ -0,0 +1 @@ +MDB_FLAGS_OFFLOAD diff --git a/xlat/mdb_states.in b/xlat/mdb_states.in new file mode 100644 index 0000000..7a580b9 --- /dev/null +++ b/xlat/mdb_states.in @@ -0,0 +1,2 @@ +MDB_TEMPORARY +MDB_PERMANENT diff --git a/xlat/rtnl_mdba_mdb_attrs.in b/xlat/rtnl_mdba_mdb_attrs.in new file mode 100644 index 0000000..7ff5cce --- /dev/null +++ b/xlat/rtnl_mdba_mdb_attrs.in @@ -0,0 +1,2 @@ +MDBA_MDB_UNSPEC 0 +MDBA_MDB_ENTRY 1 diff --git a/xlat/rtnl_mdba_mdb_eattr_attrs.in b/xlat/rtnl_mdba_mdb_eattr_attrs.in new file mode 100644 index 0000000..c7c1b7b --- /dev/null +++ b/xlat/rtnl_mdba_mdb_eattr_attrs.in @@ -0,0 +1,2 @@ +MDBA_MDB_EATTR_UNSPEC 0 +MDBA_MDB_EATTR_TIMER 1 diff --git a/xlat/rtnl_mdba_mdb_entry_attrs.in b/xlat/rtnl_mdba_mdb_entry_attrs.in new file mode 100644 index 0000000..52b18d6 --- /dev/null +++ b/xlat/rtnl_mdba_mdb_entry_attrs.in @@ -0,0 +1,2 @@ +MDBA_MDB_ENTRY_UNSPEC 0 +MDBA_MDB_ENTRY_INFO 1 diff --git a/xlat/rtnl_mdba_router_attrs.in b/xlat/rtnl_mdba_router_attrs.in new file mode 100644 index 0000000..21dfeaa --- /dev/null +++ b/xlat/rtnl_mdba_router_attrs.in @@ -0,0 +1,2 @@ +MDBA_ROUTER_UNSPEC 0 +MDBA_ROUTER_PORT 1 -- 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