static bool print_packet_diag_mclist(struct tcb *const tcp, void *const elem_buf, const size_t elem_size, void *const opaque_data) { struct packet_diag_mclist *dml = elem_buf; uint16_t alen = dml->pdmc_alen > sizeof(dml->pdmc_addr) ? sizeof(dml->pdmc_addr) : dml->pdmc_alen; PRINT_FIELD_IFINDEX("{", *dml, pdmc_index); PRINT_FIELD_U(", ", *dml, pdmc_count); PRINT_FIELD_U(", ", *dml, pdmc_type); PRINT_FIELD_U(", ", *dml, pdmc_alen); PRINT_FIELD_STRING(", ", *dml, pdmc_addr, alen, QUOTE_FORCE_HEX); tprints("}"); return true; }
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 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 };