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_packet_diag_info(struct tcb *const tcp, const kernel_ulong_t addr, const unsigned int len, const void *const opaque_data) { struct packet_diag_info pinfo; if (len < sizeof(pinfo)) return false; if (umove_or_printaddr(tcp, addr, &pinfo)) return true; PRINT_FIELD_U("{", pinfo, pdi_index); PRINT_FIELD_U(", ", pinfo, pdi_version); PRINT_FIELD_U(", ", pinfo, pdi_reserve); PRINT_FIELD_U(", ", pinfo, pdi_copy_thresh); PRINT_FIELD_U(", ", pinfo, pdi_tstamp); PRINT_FIELD_FLAGS(", ", pinfo, pdi_flags, packet_diag_info_flags, "PDI_???"); tprints("}"); return true; }