From 496a12551c61d4852098e8fdb2212c1857b65e97 Mon Sep 17 00:00:00 2001 From: JingPiao Chen Date: Sun, 27 Aug 2017 16:12:11 +0800 Subject: [PATCH] rtnl_link: decode IFLA_PROTINFO netlink attribute of ifinfomsg * configure.ac (AC_CHECK_TYPES): Check for ifla_bridge_id and rtnl_link_stats64 structures in . * rtnl_link.c: Include "xlat/rtnl_ifla_brport_attrs.h". (decode_ifla_bridge_id, decode_ifla_protinfo): New functions. (ifla_brport_nla_decoders): New array. (ifinfomsg_nla_decoders) : Use decode_ifla_protinfo. * xlat/rtnl_ifla_brport_attrs.in: New file. --- configure.ac | 5 ++- rtnl_link.c | 73 +++++++++++++++++++++++++++++++++- xlat/rtnl_ifla_brport_attrs.in | 31 +++++++++++++++ 3 files changed, 107 insertions(+), 2 deletions(-) create mode 100644 xlat/rtnl_ifla_brport_attrs.in diff --git a/configure.ac b/configure.ac index 28e9a34a..81f7dad7 100644 --- a/configure.ac +++ b/configure.ac @@ -460,7 +460,10 @@ AC_CHECK_TYPES(m4_normalize([ struct ndt_stats ]),,, [#include ]) -AC_CHECK_TYPES([struct rtnl_link_stats64],,, [#include ]) +AC_CHECK_TYPES(m4_normalize([ + struct ifla_bridge_id, + struct rtnl_link_stats64 +]),,, [#include ]) AC_CHECK_MEMBERS(m4_normalize([ struct rtnl_link_stats.rx_nohandler, struct rtnl_link_stats64.rx_nohandler diff --git a/rtnl_link.c b/rtnl_link.c index 227a452a..99096842 100644 --- a/rtnl_link.c +++ b/rtnl_link.c @@ -38,6 +38,7 @@ #endif #include +#include "xlat/rtnl_ifla_brport_attrs.h" #include "xlat/rtnl_link_attrs.h" static bool @@ -90,6 +91,76 @@ decode_rtnl_link_stats(struct tcb *const tcp, return true; } +static bool +decode_ifla_bridge_id(struct tcb *const tcp, + const kernel_ulong_t addr, + const unsigned int len, + const void *const opaque_data) +{ +#ifdef HAVE_STRUCT_IFLA_BRIDGE_ID + struct ifla_bridge_id id; + + if (len < sizeof(id)) + return false; + else if (!umove_or_printaddr(tcp, addr, &id)) { + tprintf("{prio=[%u, %u], addr=%02x:%02x:%02x:%02x:%02x:%02x}", + id.prio[0], id.prio[1], + id.addr[0], id.addr[1], id.addr[2], + id.addr[3], id.addr[4], id.addr[5]); + } + + return true; +#else + return false; +#endif +} + +static const nla_decoder_t ifla_brport_nla_decoders[] = { + [IFLA_BRPORT_STATE] = decode_nla_u8, + [IFLA_BRPORT_PRIORITY] = decode_nla_u16, + [IFLA_BRPORT_COST] = decode_nla_u32, + [IFLA_BRPORT_MODE] = decode_nla_u8, + [IFLA_BRPORT_GUARD] = decode_nla_u8, + [IFLA_BRPORT_PROTECT] = decode_nla_u8, + [IFLA_BRPORT_FAST_LEAVE] = decode_nla_u8, + [IFLA_BRPORT_LEARNING] = decode_nla_u8, + [IFLA_BRPORT_UNICAST_FLOOD] = decode_nla_u8, + [IFLA_BRPORT_PROXYARP] = decode_nla_u8, + [IFLA_BRPORT_LEARNING_SYNC] = decode_nla_u8, + [IFLA_BRPORT_PROXYARP_WIFI] = decode_nla_u8, + [IFLA_BRPORT_ROOT_ID] = decode_ifla_bridge_id, + [IFLA_BRPORT_BRIDGE_ID] = decode_ifla_bridge_id, + [IFLA_BRPORT_DESIGNATED_PORT] = decode_nla_u16, + [IFLA_BRPORT_DESIGNATED_COST] = decode_nla_u16, + [IFLA_BRPORT_ID] = decode_nla_u16, + [IFLA_BRPORT_NO] = decode_nla_u16, + [IFLA_BRPORT_TOPOLOGY_CHANGE_ACK] = decode_nla_u8, + [IFLA_BRPORT_CONFIG_PENDING] = decode_nla_u8, + [IFLA_BRPORT_MESSAGE_AGE_TIMER] = decode_nla_u64, + [IFLA_BRPORT_FORWARD_DELAY_TIMER] = decode_nla_u64, + [IFLA_BRPORT_HOLD_TIMER] = decode_nla_u64, + [IFLA_BRPORT_FLUSH] = NULL, + [IFLA_BRPORT_MULTICAST_ROUTER] = decode_nla_u8, + [IFLA_BRPORT_PAD] = NULL, + [IFLA_BRPORT_MCAST_FLOOD] = decode_nla_u8, + [IFLA_BRPORT_MCAST_TO_UCAST] = decode_nla_u8, + [IFLA_BRPORT_VLAN_TUNNEL] = decode_nla_u8, + [IFLA_BRPORT_BCAST_FLOOD] = decode_nla_u8 +}; + +static bool +decode_ifla_protinfo(struct tcb *const tcp, + const kernel_ulong_t addr, + const unsigned int len, + const void *const opaque_data) +{ + decode_nlattr(tcp, addr, len, rtnl_ifla_brport_attrs, + "IFLA_BRPORT_???", ifla_brport_nla_decoders, + ARRAY_SIZE(ifla_brport_nla_decoders), opaque_data); + + return true; +} + static bool decode_rtnl_link_ifmap(struct tcb *const tcp, const kernel_ulong_t addr, @@ -181,7 +252,7 @@ static const nla_decoder_t ifinfomsg_nla_decoders[] = { [IFLA_PRIORITY] = NULL, /* unused */ [IFLA_MASTER] = decode_nla_u32, [IFLA_WIRELESS] = NULL, /* unimplemented */ - [IFLA_PROTINFO] = NULL, /* unimplemented */ + [IFLA_PROTINFO] = decode_ifla_protinfo, [IFLA_TXQLEN] = decode_nla_u32, [IFLA_MAP] = decode_rtnl_link_ifmap, [IFLA_WEIGHT] = decode_nla_u32, diff --git a/xlat/rtnl_ifla_brport_attrs.in b/xlat/rtnl_ifla_brport_attrs.in new file mode 100644 index 00000000..e18e8c52 --- /dev/null +++ b/xlat/rtnl_ifla_brport_attrs.in @@ -0,0 +1,31 @@ +IFLA_BRPORT_UNSPEC 0 +IFLA_BRPORT_STATE 1 +IFLA_BRPORT_PRIORITY 2 +IFLA_BRPORT_COST 3 +IFLA_BRPORT_MODE 4 +IFLA_BRPORT_GUARD 5 +IFLA_BRPORT_PROTECT 6 +IFLA_BRPORT_FAST_LEAVE 7 +IFLA_BRPORT_LEARNING 8 +IFLA_BRPORT_UNICAST_FLOOD 9 +IFLA_BRPORT_PROXYARP 10 +IFLA_BRPORT_LEARNING_SYNC 11 +IFLA_BRPORT_PROXYARP_WIFI 12 +IFLA_BRPORT_ROOT_ID 13 +IFLA_BRPORT_BRIDGE_ID 14 +IFLA_BRPORT_DESIGNATED_PORT 15 +IFLA_BRPORT_DESIGNATED_COST 16 +IFLA_BRPORT_ID 17 +IFLA_BRPORT_NO 18 +IFLA_BRPORT_TOPOLOGY_CHANGE_ACK 19 +IFLA_BRPORT_CONFIG_PENDING 20 +IFLA_BRPORT_MESSAGE_AGE_TIMER 21 +IFLA_BRPORT_FORWARD_DELAY_TIMER 22 +IFLA_BRPORT_HOLD_TIMER 23 +IFLA_BRPORT_FLUSH 24 +IFLA_BRPORT_MULTICAST_ROUTER 25 +IFLA_BRPORT_PAD 26 +IFLA_BRPORT_MCAST_FLOOD 27 +IFLA_BRPORT_MCAST_TO_UCAST 28 +IFLA_BRPORT_VLAN_TUNNEL 29 +IFLA_BRPORT_BCAST_FLOOD 30 -- 2.40.0