static bool decode_ifla_xdp(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_xdp_attrs, "IFLA_XDP_???", ARRSZ_PAIR(ifla_xdp_nla_decoders), opaque_data); return true; }
static bool decode_ifla_vf_ports(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_vf_port_attrs, "IFLA_VF_PORT_???", ifla_vf_port_nla_decoders, ARRAY_SIZE(ifla_vf_port_nla_decoders), opaque_data); return true; }
static bool decode_ifla_linkinfo(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_info_attrs, "IFLA_INFO_???", ifla_linkinfo_nla_decoders, ARRAY_SIZE(ifla_linkinfo_nla_decoders), opaque_data); return true; }
static bool decode_tca_stab(struct tcb *const tcp, const kernel_ulong_t addr, const unsigned int len, const void *const opaque_data) { decode_nlattr(tcp, addr, len, rtnl_tca_stab_attrs, "TCA_STAB_???", tca_stab_nla_decoders, ARRAY_SIZE(tca_stab_nla_decoders), opaque_data); return true; }
bool decode_nla_linkinfo_data_tun(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_info_data_tun_attrs, "IFLA_TUN_???", ARRSZ_PAIR(ifla_info_data_tun_nla_decoders), opaque_data); return true; }
static void decode_inet_diag_req_compat(struct tcb *const tcp, const struct nlmsghdr *const nlmsghdr, const uint8_t family, const kernel_ulong_t addr, const unsigned int len) { struct inet_diag_req req = { .idiag_family = family }; size_t offset = sizeof(req.idiag_family); bool decode_nla = false; PRINT_FIELD_XVAL("{", req, idiag_family, addrfams, "AF_???"); tprints(", "); if (len >= sizeof(req)) { if (!umoven_or_printaddr(tcp, addr + offset, sizeof(req) - offset, (char *) &req + offset)) { PRINT_FIELD_U("", req, idiag_src_len); PRINT_FIELD_U(", ", req, idiag_dst_len); PRINT_FIELD_FLAGS(", ", req, idiag_ext, inet_diag_extended_flags, "1<<INET_DIAG_\?\?\?-1"); PRINT_FIELD_INET_DIAG_SOCKID(", ", req, id, req.idiag_family); PRINT_FIELD_FLAGS(", ", req, idiag_states, tcp_state_flags, "1<<TCP_???"); PRINT_FIELD_U(", ", req, idiag_dbs); decode_nla = true; } } else tprints("..."); tprints("}"); offset = NLMSG_ALIGN(sizeof(req)); if (decode_nla && len > offset) { tprints(", "); decode_nlattr(tcp, addr + offset, len - offset, inet_diag_req_attrs, "INET_DIAG_REQ_???", inet_diag_req_nla_decoders, ARRAY_SIZE(inet_diag_req_nla_decoders), NULL); } }
static bool decode_ifla_linkinfo(struct tcb *const tcp, const kernel_ulong_t addr, const unsigned int len, const void *const opaque_data) { struct ifla_linkinfo_ctx ctx = { .kind = "", }; decode_nlattr(tcp, addr, len, rtnl_ifla_info_attrs, "IFLA_INFO_???", ARRSZ_PAIR(ifla_linkinfo_nla_decoders), &ctx); return true; } static bool decode_rtnl_link_stats64(struct tcb *const tcp, const kernel_ulong_t addr, const unsigned int len, const void *const opaque_data) { #ifdef HAVE_STRUCT_RTNL_LINK_STATS64 struct rtnl_link_stats64 st; const unsigned int min_size = offsetofend(struct rtnl_link_stats64, tx_compressed); const unsigned int def_size = sizeof(st); const unsigned int size = (len >= def_size) ? def_size : ((len == min_size) ? min_size : 0); if (!size) return false; if (!umoven_or_printaddr(tcp, addr, size, &st)) { PRINT_FIELD_U("{", st, rx_packets); PRINT_FIELD_U(", ", st, tx_packets); PRINT_FIELD_U(", ", st, rx_bytes); PRINT_FIELD_U(", ", st, tx_bytes); PRINT_FIELD_U(", ", st, rx_errors); PRINT_FIELD_U(", ", st, tx_errors); PRINT_FIELD_U(", ", st, rx_dropped); PRINT_FIELD_U(", ", st, tx_dropped); PRINT_FIELD_U(", ", st, multicast); PRINT_FIELD_U(", ", st, collisions); PRINT_FIELD_U(", ", st, rx_length_errors); PRINT_FIELD_U(", ", st, rx_over_errors); PRINT_FIELD_U(", ", st, rx_crc_errors); PRINT_FIELD_U(", ", st, rx_frame_errors); PRINT_FIELD_U(", ", st, rx_fifo_errors); PRINT_FIELD_U(", ", st, rx_missed_errors); PRINT_FIELD_U(", ", st, tx_aborted_errors); PRINT_FIELD_U(", ", st, tx_carrier_errors); PRINT_FIELD_U(", ", st, tx_fifo_errors); PRINT_FIELD_U(", ", st, tx_heartbeat_errors); PRINT_FIELD_U(", ", st, tx_window_errors); PRINT_FIELD_U(", ", st, rx_compressed); PRINT_FIELD_U(", ", st, tx_compressed); #ifdef HAVE_STRUCT_RTNL_LINK_STATS64_RX_NOHANDLER if (len >= def_size) PRINT_FIELD_U(", ", st, rx_nohandler); #endif tprints("}"); } return true; #else return false; #endif } static bool decode_ifla_port_vsi(struct tcb *const tcp, const kernel_ulong_t addr, const unsigned int len, const void *const opaque_data) { #ifdef HAVE_STRUCT_IFLA_PORT_VSI struct ifla_port_vsi vsi; if (len < sizeof(vsi)) return false; else if (!umove_or_printaddr(tcp, addr, &vsi)) { PRINT_FIELD_U("{", vsi, vsi_mgr_id); PRINT_FIELD_STRING(", ", vsi, vsi_type_id, sizeof(vsi.vsi_type_id), QUOTE_FORCE_HEX); PRINT_FIELD_U(", ", vsi, vsi_type_version); tprints("}"); } return true; #else return false; #endif } static const nla_decoder_t ifla_port_nla_decoders[] = { [IFLA_PORT_VF] = decode_nla_u32, [IFLA_PORT_PROFILE] = decode_nla_str, [IFLA_PORT_VSI_TYPE] = decode_ifla_port_vsi, [IFLA_PORT_INSTANCE_UUID] = NULL, /* default parser */ [IFLA_PORT_HOST_UUID] = NULL, /* default parser */ [IFLA_PORT_REQUEST] = decode_nla_u8, [IFLA_PORT_RESPONSE] = decode_nla_u16 };