From: JingPiao Chen Date: Mon, 4 Sep 2017 14:27:02 +0000 (+0800) Subject: rtnl_mdb: decode br_port_msg netlink attributes X-Git-Tag: v4.20~72 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8229db741ffdb969497f6922e960210aad826f71;p=strace rtnl_mdb: decode br_port_msg netlink attributes * configure.ac (AC_CHECK_TYPES): Check for struct br_mdb_entry in . (AC_CHECK_MEMBERS): Check for 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" ,"xlat/rtnl_mdba_router_attrs.h" and "xlat/rtnl_mdba_router_pattr_attrs.h". (decode_mdba_mdb_entry_info, decode_mdba_mdb_entry, decode_mdba_mdb, decode_multicast_router_type, 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_pattr_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/multicast_router_types.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. * xlat/rtnl_mdba_router_pattr_attrs.in: Likewise. --- diff --git a/configure.ac b/configure.ac index cb6571a3..c68046b0 100644 --- a/configure.ac +++ b/configure.ac @@ -448,7 +448,15 @@ AC_CHECK_HEADERS([linux/bpf.h], [ st_CHECK_UNION_BPF_ATTR([prog_flags]) ]) -AC_CHECK_TYPES([struct br_port_msg],,, [#include ]) +AC_CHECK_TYPES(m4_normalize([ + struct br_mdb_entry, + struct br_port_msg +]),,, [#include ]) +AC_CHECK_MEMBERS(m4_normalize([ + struct br_mdb_entry.flags, + struct br_mdb_entry.vid +]),,, [#include ]) + AC_CHECK_TYPES([struct dcbmsg],,, [#include ]) AC_CHECK_TYPES([struct ifaddrlblmsg],,, [#include ]) AC_CHECK_TYPES([struct netconfmsg],,, [#include ]) diff --git a/rtnl_mdb.c b/rtnl_mdb.c index ebe737dc..30c3473e 100644 --- a/rtnl_mdb.c +++ b/rtnl_mdb.c @@ -39,7 +39,169 @@ # include # include "netlink.h" +# ifdef HAVE_STRUCT_BR_MDB_ENTRY_FLAGS +# include "xlat/mdb_flags.h" +# endif +# include "xlat/mdb_states.h" +# include "xlat/multicast_router_types.h" # 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" +# include "xlat/rtnl_mdba_router_pattr_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); + PRINT_FIELD_XVAL(", ", entry, state, mdb_states, "MDB_???"); +# 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); + + tprints(", addr={"); + print_inet_addr(proto, &entry.addr.u, + sizeof(entry.addr.u), "u"); + 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_multicast_router_type(struct tcb *const tcp, + const kernel_ulong_t addr, + const unsigned int len, + const void *const opaque_data) +{ + uint8_t type; + + if (!umove_or_printaddr(tcp, addr, &type)) + printxval(multicast_router_types, type, "MDB_RTR_TYPE_???"); + + return true; +} + +static const nla_decoder_t mdba_router_pattr_nla_decoders[] = { + [MDBA_ROUTER_PATTR_TIMER] = decode_nla_u32, + [MDBA_ROUTER_PATTR_TYPE] = decode_multicast_router_type +}; + +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_router_pattr_attrs, + "MDBA_ROUTER_PATTR_???", + mdba_router_pattr_nla_decoders, + ARRAY_SIZE(mdba_router_pattr_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 +227,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 00000000..4c2f1ed3 --- /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 00000000..7a580b90 --- /dev/null +++ b/xlat/mdb_states.in @@ -0,0 +1,2 @@ +MDB_TEMPORARY +MDB_PERMANENT diff --git a/xlat/multicast_router_types.in b/xlat/multicast_router_types.in new file mode 100644 index 00000000..6a5c03c3 --- /dev/null +++ b/xlat/multicast_router_types.in @@ -0,0 +1,4 @@ +MDB_RTR_TYPE_DISABLED 0 +MDB_RTR_TYPE_TEMP_QUERY 1 +MDB_RTR_TYPE_PERM 2 +MDB_RTR_TYPE_TEMP 3 diff --git a/xlat/rtnl_mdba_mdb_attrs.in b/xlat/rtnl_mdba_mdb_attrs.in new file mode 100644 index 00000000..7ff5cce3 --- /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 00000000..c7c1b7b3 --- /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 00000000..52b18d69 --- /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 00000000..21dfeaa3 --- /dev/null +++ b/xlat/rtnl_mdba_router_attrs.in @@ -0,0 +1,2 @@ +MDBA_ROUTER_UNSPEC 0 +MDBA_ROUTER_PORT 1 diff --git a/xlat/rtnl_mdba_router_pattr_attrs.in b/xlat/rtnl_mdba_router_pattr_attrs.in new file mode 100644 index 00000000..901e4f2f --- /dev/null +++ b/xlat/rtnl_mdba_router_pattr_attrs.in @@ -0,0 +1,3 @@ +MDBA_ROUTER_PATTR_UNSPEC 0 +MDBA_ROUTER_PATTR_TIMER 1 +MDBA_ROUTER_PATTR_TYPE 2