rtnl_mdb: decode br_port_msg netlink attributes
* configure.ac (AC_CHECK_TYPES): Check for struct br_mdb_entry in <linux/if_bridge.h>. (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.
This commit is contained in:
parent
2baaf7302e
commit
8229db741f
10
configure.ac
10
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 <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.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>])
|
||||
|
166
rtnl_mdb.c
166
rtnl_mdb.c
@ -39,7 +39,169 @@
|
||||
# include <linux/if_bridge.h>
|
||||
# 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
1
xlat/mdb_flags.in
Normal file
1
xlat/mdb_flags.in
Normal file
@ -0,0 +1 @@
|
||||
MDB_FLAGS_OFFLOAD
|
2
xlat/mdb_states.in
Normal file
2
xlat/mdb_states.in
Normal file
@ -0,0 +1,2 @@
|
||||
MDB_TEMPORARY
|
||||
MDB_PERMANENT
|
4
xlat/multicast_router_types.in
Normal file
4
xlat/multicast_router_types.in
Normal file
@ -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
|
2
xlat/rtnl_mdba_mdb_attrs.in
Normal file
2
xlat/rtnl_mdba_mdb_attrs.in
Normal file
@ -0,0 +1,2 @@
|
||||
MDBA_MDB_UNSPEC 0
|
||||
MDBA_MDB_ENTRY 1
|
2
xlat/rtnl_mdba_mdb_eattr_attrs.in
Normal file
2
xlat/rtnl_mdba_mdb_eattr_attrs.in
Normal file
@ -0,0 +1,2 @@
|
||||
MDBA_MDB_EATTR_UNSPEC 0
|
||||
MDBA_MDB_EATTR_TIMER 1
|
2
xlat/rtnl_mdba_mdb_entry_attrs.in
Normal file
2
xlat/rtnl_mdba_mdb_entry_attrs.in
Normal file
@ -0,0 +1,2 @@
|
||||
MDBA_MDB_ENTRY_UNSPEC 0
|
||||
MDBA_MDB_ENTRY_INFO 1
|
2
xlat/rtnl_mdba_router_attrs.in
Normal file
2
xlat/rtnl_mdba_router_attrs.in
Normal file
@ -0,0 +1,2 @@
|
||||
MDBA_ROUTER_UNSPEC 0
|
||||
MDBA_ROUTER_PORT 1
|
3
xlat/rtnl_mdba_router_pattr_attrs.in
Normal file
3
xlat/rtnl_mdba_router_pattr_attrs.in
Normal file
@ -0,0 +1,3 @@
|
||||
MDBA_ROUTER_PATTR_UNSPEC 0
|
||||
MDBA_ROUTER_PATTR_TIMER 1
|
||||
MDBA_ROUTER_PATTR_TYPE 2
|
Loading…
x
Reference in New Issue
Block a user