static bool decode_tcp_bbr_info(struct tcb *const tcp, const kernel_ulong_t addr, const unsigned int len, const void *const opaque_data) { struct tcp_bbr_info bbr; if (len < sizeof(bbr)) return false; if (umove_or_printaddr(tcp, addr, &bbr)) return true; PRINT_FIELD_X("{", bbr, bbr_bw_lo); PRINT_FIELD_X(", ", bbr, bbr_bw_hi); PRINT_FIELD_U(", ", bbr, bbr_min_rtt); PRINT_FIELD_U(", ", bbr, bbr_pacing_gain); PRINT_FIELD_U(", ", bbr, bbr_cwnd_gain); tprints("}"); return true; }
static bool decode_rtnl_link_ifmap(struct tcb *const tcp, const kernel_ulong_t addr, const unsigned int len, const void *const opaque_data) { struct rtnl_link_ifmap map; const unsigned int sizeof_ifmap = offsetofend(struct rtnl_link_ifmap, port); if (len < sizeof_ifmap) return false; else if (!umoven_or_printaddr(tcp, addr, sizeof_ifmap, &map)) { PRINT_FIELD_X("{", map, mem_start); PRINT_FIELD_X(", ", map, mem_end); PRINT_FIELD_X(", ", map, base_addr); PRINT_FIELD_U(", ", map, irq); PRINT_FIELD_U(", ", map, dma); PRINT_FIELD_U(", ", map, port); tprints("}"); } return true; }
void print_xdisk_quota(int rc, void *ptr, void *arg) { struct fs_disk_quota *dq = ptr; long out_arg = (long) arg; if (((rc != 0) && out_arg) || (out_arg > 1)) { printf("%p", dq); return; } PRINT_FIELD_D("{", dq, d_version); printf(", d_flags="); printflags(xfs_dqblk_flags, (uint8_t) dq->d_flags, "XFS_???_QUOTA"); PRINT_FIELD_X(", ", dq, d_fieldmask); PRINT_FIELD_U(", ", dq, d_id); PRINT_FIELD_U(", ", dq, d_blk_hardlimit); PRINT_FIELD_U(", ", dq, d_blk_softlimit); PRINT_FIELD_U(", ", dq, d_ino_hardlimit); PRINT_FIELD_U(", ", dq, d_ino_softlimit); PRINT_FIELD_U(", ", dq, d_bcount); PRINT_FIELD_U(", ", dq, d_icount); # if VERBOSE PRINT_FIELD_D(", ", dq, d_itimer); PRINT_FIELD_D(", ", dq, d_btimer); PRINT_FIELD_U(", ", dq, d_iwarns); PRINT_FIELD_U(", ", dq, d_bwarns); PRINT_FIELD_U(", ", dq, d_rtb_hardlimit); PRINT_FIELD_U(", ", dq, d_rtb_softlimit); PRINT_FIELD_U(", ", dq, d_rtbcount); PRINT_FIELD_D(", ", dq, d_rtbtimer); PRINT_FIELD_U(", ", dq, d_rtbwarns); # else printf(", ..."); # endif /* !VERBOSE */ printf("}"); }
int main(void) { skip_if_unavailable("/proc/self/fd/"); static const struct rtnl_link_stats st = { .rx_packets = 0xabcdefac, .tx_packets = 0xbcdacdab, .rx_bytes = 0xcdbafaab, .tx_bytes = 0xdafabadb, .rx_errors = 0xeabcdaeb, .tx_errors = 0xfefabeab, .rx_dropped = 0xadbafafb, .tx_dropped = 0xbdffabda, .multicast = 0xcdabdfea, .collisions = 0xefadbaeb, .rx_length_errors = 0xfabffabd, .rx_over_errors = 0xafbafabc, .rx_crc_errors = 0xbfdabdad, .rx_frame_errors = 0xcfdabfad, .rx_fifo_errors = 0xddfdebad, .rx_missed_errors = 0xefabdcba, .tx_aborted_errors = 0xefdadbfa, .tx_carrier_errors = 0xfaefbada, .tx_fifo_errors = 0xaebdffab, .tx_heartbeat_errors = 0xbadebaaf, .tx_window_errors = 0xcdafbada, .rx_compressed = 0xdeffadbd, .tx_compressed = 0xefdadfab }; const int fd = create_nl_socket(NETLINK_ROUTE); const unsigned int hdrlen = sizeof(struct ifinfomsg); void *nlh0 = midtail_alloc(NLMSG_SPACE(hdrlen), NLA_HDRLEN + sizeof(st)); static char pattern[4096]; fill_memory_ex(pattern, sizeof(pattern), 'a', 'z' - 'a' + 1); const unsigned int nla_type = 0xffff & NLA_TYPE_MASK; char nla_type_str[256]; sprintf(nla_type_str, "%#x /* IFLA_??? */", nla_type); TEST_NLATTR_(fd, nlh0, hdrlen, init_ifinfomsg, print_ifinfomsg, nla_type, nla_type_str, 4, pattern, 4, print_quoted_hex(pattern, 4)); const int32_t netnsid = 0xacbdabda; TEST_NLATTR_OBJECT(fd, nlh0, hdrlen, init_ifinfomsg, print_ifinfomsg, IFLA_LINK_NETNSID, pattern, netnsid, printf("%d", netnsid)); TEST_NLATTR_OBJECT(fd, nlh0, hdrlen, init_ifinfomsg, print_ifinfomsg, IFLA_STATS, pattern, 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_STATS_RX_NOHANDLER PRINT_FIELD_U(", ", st, rx_nohandler); #endif printf("}")); #ifdef HAVE_STRUCT_RTNL_LINK_STATS_RX_NOHANDLER const unsigned int sizeof_stats = offsetofend(struct rtnl_link_stats, tx_compressed); TEST_NLATTR(fd, nlh0, hdrlen, init_ifinfomsg, print_ifinfomsg, IFLA_STATS, sizeof_stats, &st, sizeof_stats, 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); printf("}")); #endif /* HAVE_STRUCT_RTNL_LINK_STATS_RX_NOHANDLER */ static const struct rtnl_link_ifmap map = { .mem_start = 0xadcbefedefbcdedb, .mem_end = 0xefcbeabdecdcdefa, .base_addr = 0xaddbeabdfaacdbae, .irq = 0xefaf, .dma = 0xab, .port = 0xcd }; const unsigned int sizeof_ifmap = offsetofend(struct rtnl_link_ifmap, port); const unsigned int plen = sizeof_ifmap - 1 > DEFAULT_STRLEN ? DEFAULT_STRLEN : (int) sizeof_ifmap - 1; /* len < sizeof_ifmap */ TEST_NLATTR(fd, nlh0, hdrlen, init_ifinfomsg, print_ifinfomsg, IFLA_MAP, plen, pattern, plen, print_quoted_hex(pattern, plen)); /* short read of sizeof_ifmap */ TEST_NLATTR(fd, nlh0, hdrlen, init_ifinfomsg, print_ifinfomsg, IFLA_MAP, sizeof_ifmap, &map, sizeof_ifmap - 1, printf("%p", RTA_DATA(TEST_NLATTR_nla))); /* sizeof_ifmap */ TEST_NLATTR(fd, nlh0, hdrlen, init_ifinfomsg, print_ifinfomsg, IFLA_MAP, sizeof_ifmap, &map, sizeof_ifmap, PRINT_FIELD_X("{", map, mem_start); PRINT_FIELD_X(", ", map, mem_end); PRINT_FIELD_X(", ", map, base_addr); PRINT_FIELD_U(", ", map, irq); PRINT_FIELD_U(", ", map, dma); PRINT_FIELD_U(", ", map, port); printf("}")); #ifdef HAVE_STRUCT_RTNL_LINK_STATS64 static const struct rtnl_link_stats64 st64 = { .rx_packets = 0xadcbefedefbcdedb, .tx_packets = 0xbdabdedabdcdeabd, .rx_bytes = 0xcdbaefbaeadfabec, .tx_bytes = 0xdbaedbafabbeacdb, .rx_errors = 0xefabfdaefabaefab, .tx_errors = 0xfaebfabfabbaeabf, .rx_dropped = 0xacdbaedbadbabeba, .tx_dropped = 0xbcdeffebdabeadbe, .multicast = 0xeeffbaeabaeffabe, .collisions = 0xffbaefcefbafacef, .rx_length_errors = 0xaabbdeabceffdecb, .rx_over_errors = 0xbbdcdadebadeaeed, .rx_crc_errors= 0xccdeabecefaedbef, .rx_frame_errors = 0xddbedaedebcedaef, .rx_fifo_errors = 0xeffbadefafdaeaab, .rx_missed_errors = 0xfefaebccceadeecd, .tx_aborted_errors = 0xabcdadefcdadef, .tx_carrier_errors = 0xbccdafaeeaaefe, .tx_fifo_errors = 0xcddefdbedeadce, .tx_heartbeat_errors = 0xedaededdadcdea, .tx_window_errors = 0xfdacdeaccedcda, .rx_compressed = 0xacdbbcacdbccef, .tx_compressed = 0xbcdadefcdedfea }; TEST_NLATTR_OBJECT(fd, nlh0, hdrlen, init_ifinfomsg, print_ifinfomsg, IFLA_STATS64, pattern, st64, PRINT_FIELD_U("{", st64, rx_packets); PRINT_FIELD_U(", ", st64, tx_packets); PRINT_FIELD_U(", ", st64, rx_bytes); PRINT_FIELD_U(", ", st64, tx_bytes); PRINT_FIELD_U(", ", st64, rx_errors); PRINT_FIELD_U(", ", st64, tx_errors); PRINT_FIELD_U(", ", st64, rx_dropped); PRINT_FIELD_U(", ", st64, tx_dropped); PRINT_FIELD_U(", ", st64, multicast); PRINT_FIELD_U(", ", st64, collisions); PRINT_FIELD_U(", ", st64, rx_length_errors); PRINT_FIELD_U(", ", st64, rx_over_errors); PRINT_FIELD_U(", ", st64, rx_crc_errors); PRINT_FIELD_U(", ", st64, rx_frame_errors); PRINT_FIELD_U(", ", st64, rx_fifo_errors); PRINT_FIELD_U(", ", st64, rx_missed_errors); PRINT_FIELD_U(", ", st64, tx_aborted_errors); PRINT_FIELD_U(", ", st64, tx_carrier_errors); PRINT_FIELD_U(", ", st64, tx_fifo_errors); PRINT_FIELD_U(", ", st64, tx_heartbeat_errors); PRINT_FIELD_U(", ", st64, tx_window_errors); PRINT_FIELD_U(", ", st64, rx_compressed); PRINT_FIELD_U(", ", st64, tx_compressed); #ifdef HAVE_STRUCT_RTNL_LINK_STATS64_RX_NOHANDLER PRINT_FIELD_U(", ", st64, rx_nohandler); #endif printf("}")); #ifdef HAVE_STRUCT_RTNL_LINK_STATS64_RX_NOHANDLER const unsigned int sizeof_stats64 = offsetofend(struct rtnl_link_stats64, tx_compressed); TEST_NLATTR(fd, nlh0, hdrlen, init_ifinfomsg, print_ifinfomsg, IFLA_STATS64, sizeof_stats64, &st64, sizeof_stats64, PRINT_FIELD_U("{", st64, rx_packets); PRINT_FIELD_U(", ", st64, tx_packets); PRINT_FIELD_U(", ", st64, rx_bytes); PRINT_FIELD_U(", ", st64, tx_bytes); PRINT_FIELD_U(", ", st64, rx_errors); PRINT_FIELD_U(", ", st64, tx_errors); PRINT_FIELD_U(", ", st64, rx_dropped); PRINT_FIELD_U(", ", st64, tx_dropped); PRINT_FIELD_U(", ", st64, multicast); PRINT_FIELD_U(", ", st64, collisions); PRINT_FIELD_U(", ", st64, rx_length_errors); PRINT_FIELD_U(", ", st64, rx_over_errors); PRINT_FIELD_U(", ", st64, rx_crc_errors); PRINT_FIELD_U(", ", st64, rx_frame_errors); PRINT_FIELD_U(", ", st64, rx_fifo_errors); PRINT_FIELD_U(", ", st64, rx_missed_errors); PRINT_FIELD_U(", ", st64, tx_aborted_errors); PRINT_FIELD_U(", ", st64, tx_carrier_errors); PRINT_FIELD_U(", ", st64, tx_fifo_errors); PRINT_FIELD_U(", ", st64, tx_heartbeat_errors); PRINT_FIELD_U(", ", st64, tx_window_errors); PRINT_FIELD_U(", ", st64, rx_compressed); PRINT_FIELD_U(", ", st64, tx_compressed); printf("}")); #endif /* HAVE_STRUCT_RTNL_LINK_STATS64_RX_NOHANDLER */ #endif /* HAVE_STRUCT_RTNL_LINK_STATS64 */ struct nlattr nla = { .nla_len = sizeof(nla), .nla_type = IFLA_INFO_KIND, }; TEST_NLATTR(fd, nlh0, hdrlen, init_ifinfomsg, print_ifinfomsg, IFLA_LINKINFO, sizeof(nla), &nla, sizeof(nla), printf("{nla_len=%u, nla_type=IFLA_INFO_KIND}", nla.nla_len)); nla.nla_type = IFLA_VF_PORT; TEST_NLATTR(fd, nlh0, hdrlen, init_ifinfomsg, print_ifinfomsg, IFLA_VF_PORTS, sizeof(nla), &nla, sizeof(nla), printf("{nla_len=%u, nla_type=IFLA_VF_PORT}", nla.nla_len)); static const struct { uint32_t val; const char *str; } ifla_events[] = { { 0, "IFLA_EVENT_NONE" }, { 6, "IFLA_EVENT_BONDING_OPTIONS" }, { ARG_STR(0x7) " /* IFLA_EVENT_??? */" }, { ARG_STR(0xdeadfeed) " /* IFLA_EVENT_??? */" }, }; for (size_t i = 0; i < ARRAY_SIZE(ifla_events); i++) { TEST_NLATTR_OBJECT(fd, nlh0, hdrlen, init_ifinfomsg, print_ifinfomsg, IFLA_EVENT, pattern, ifla_events[i].val, printf("%s", ifla_events[i].str)); } puts("+++ exited with 0 +++"); return 0; }