diff --git a/rtnl_link.c b/rtnl_link.c index d1e9bb88..18897f30 100644 --- a/rtnl_link.c +++ b/rtnl_link.c @@ -29,15 +29,19 @@ #include "defs.h" #include "netlink_route.h" +#include "nlattr.h" #include "print_fields.h" #include "netlink.h" #include +#include "xlat/rtnl_link_attrs.h" + DECL_NETLINK_ROUTE_DECODER(decode_ifinfomsg) { struct ifinfomsg ifinfo = { .ifi_family = family }; - const size_t offset = sizeof(ifinfo.ifi_family); + size_t offset = sizeof(ifinfo.ifi_family); + bool decode_nla = false; PRINT_FIELD_XVAL("{", ifinfo, ifi_family, addrfams, "AF_???"); @@ -52,8 +56,16 @@ DECL_NETLINK_ROUTE_DECODER(decode_ifinfomsg) PRINT_FIELD_FLAGS(", ", ifinfo, ifi_flags, iffflags, "IFF_???"); PRINT_FIELD_X(", ", ifinfo, ifi_change); + decode_nla = true; } } else tprints("..."); tprints("}"); + + offset = NLMSG_ALIGN(sizeof(ifinfo)); + if (decode_nla && len > offset) { + tprints(", "); + decode_nlattr(tcp, addr + offset, len - offset, + rtnl_link_attrs, "IFLA_???", NULL, 0, NULL); + } } diff --git a/xlat/rtnl_link_attrs.in b/xlat/rtnl_link_attrs.in new file mode 100644 index 00000000..eb7f4754 --- /dev/null +++ b/xlat/rtnl_link_attrs.in @@ -0,0 +1,45 @@ +IFLA_UNSPEC 0 +IFLA_ADDRESS 1 +IFLA_BROADCAST 2 +IFLA_IFNAME 3 +IFLA_MTU 4 +IFLA_LINK 5 +IFLA_QDISC 6 +IFLA_STATS 7 +IFLA_COST 8 +IFLA_PRIORITY 9 +IFLA_MASTER 10 +IFLA_WIRELESS 11 +IFLA_PROTINFO 12 +IFLA_TXQLEN 13 +IFLA_MAP 14 +IFLA_WEIGHT 15 +IFLA_OPERSTATE 16 +IFLA_LINKMODE 17 +IFLA_LINKINFO 18 +IFLA_NET_NS_PID 19 +IFLA_IFALIAS 20 +IFLA_NUM_VF 21 +IFLA_VFINFO_LIST 22 +IFLA_STATS64 23 +IFLA_VF_PORTS 24 +IFLA_PORT_SELF 25 +IFLA_AF_SPEC 26 +IFLA_GROUP 27 +IFLA_NET_NS_FD 28 +IFLA_EXT_MASK 29 +IFLA_PROMISCUITY 30 +IFLA_NUM_TX_QUEUES 31 +IFLA_NUM_RX_QUEUES 32 +IFLA_CARRIER 33 +IFLA_PHYS_PORT_ID 34 +IFLA_CARRIER_CHANGES 35 +IFLA_PHYS_SWITCH_ID 36 +IFLA_LINK_NETNSID 37 +IFLA_PHYS_PORT_NAME 38 +IFLA_PROTO_DOWN 39 +IFLA_GSO_MAX_SEGS 40 +IFLA_GSO_MAX_SIZE 41 +IFLA_PAD 42 +IFLA_XDP 43 +IFLA_EVENT 44