diff options
author | David Ahern <dsahern@kernel.org> | 2024-01-08 19:25:43 +0000 |
---|---|---|
committer | David Ahern <dsahern@kernel.org> | 2024-01-08 19:25:43 +0000 |
commit | 97d3edd74383628a01d7d6a1197196dd500d5357 (patch) | |
tree | 3b93e399a62fcd92a0728484cc74f2879fb4714d | |
parent | 45dc10463dd5a51eef944b110a4f046feb1b46db (diff) | |
parent | 3dc3445bbfa9b84d4166e5837f8d5a4994faf2e7 (diff) | |
download | iproute2-97d3edd74383628a01d7d6a1197196dd500d5357.tar.gz |
Merge remote-tracking branch 'main/main' into next
Signed-off-by: David Ahern <dsahern@kernel.org>
-rw-r--r-- | bridge/bridge.c | 2 | ||||
-rw-r--r-- | bridge/vlan.c | 38 | ||||
-rw-r--r-- | bridge/vni.c | 113 | ||||
-rwxr-xr-x | configure | 47 | ||||
-rw-r--r-- | include/json_print.h | 2 | ||||
-rw-r--r-- | include/libnetlink.h | 4 | ||||
-rw-r--r-- | include/version.h | 2 | ||||
-rw-r--r-- | ip/ipaddress.c | 2 | ||||
-rw-r--r-- | ip/iplink.c | 4 | ||||
-rw-r--r-- | lib/json_print.c | 15 | ||||
-rw-r--r-- | lib/mnl_utils.c | 7 | ||||
-rw-r--r-- | man/man8/ip-address.8.in | 4 | ||||
-rw-r--r-- | man/man8/ip-link.8.in | 9 | ||||
-rw-r--r-- | man/man8/ip-route.8.in | 36 | ||||
-rw-r--r-- | man/man8/rdma.8 | 12 | ||||
-rw-r--r-- | misc/lnstat.c | 4 | ||||
-rw-r--r-- | misc/ss.c | 5 | ||||
-rw-r--r-- | rdma/dev.c | 56 | ||||
-rw-r--r-- | rdma/link.c | 66 | ||||
-rw-r--r-- | rdma/rdma.c | 21 | ||||
-rw-r--r-- | rdma/rdma.h | 11 | ||||
-rw-r--r-- | rdma/res-cmid.c | 46 | ||||
-rw-r--r-- | rdma/res-cq.c | 37 | ||||
-rw-r--r-- | rdma/res-ctx.c | 14 | ||||
-rw-r--r-- | rdma/res-mr.c | 29 | ||||
-rw-r--r-- | rdma/res-pd.c | 24 | ||||
-rw-r--r-- | rdma/res-qp.c | 57 | ||||
-rw-r--r-- | rdma/res-srq.c | 38 | ||||
-rw-r--r-- | rdma/res.c | 67 | ||||
-rw-r--r-- | rdma/res.h | 18 | ||||
-rw-r--r-- | rdma/stat-mr.c | 10 | ||||
-rw-r--r-- | rdma/stat.c | 83 | ||||
-rw-r--r-- | rdma/stat.h | 4 | ||||
-rw-r--r-- | rdma/sys.c | 11 | ||||
-rw-r--r-- | rdma/utils.c | 88 |
35 files changed, 463 insertions, 523 deletions
diff --git a/bridge/bridge.c b/bridge/bridge.c index 339101a87..f4805092b 100644 --- a/bridge/bridge.c +++ b/bridge/bridge.c @@ -36,7 +36,7 @@ static void usage(void) fprintf(stderr, "Usage: bridge [ OPTIONS ] OBJECT { COMMAND | help }\n" " bridge [ -force ] -batch filename\n" -"where OBJECT := { link | fdb | mdb | vlan | monitor }\n" +"where OBJECT := { link | fdb | mdb | vlan | vni | monitor }\n" " OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] |\n" " -o[neline] | -t[imestamp] | -n[etns] name |\n" " -c[ompressvlans] -color -p[retty] -j[son] }\n"); diff --git a/bridge/vlan.c b/bridge/vlan.c index dfc62f83a..5352eb24f 100644 --- a/bridge/vlan.c +++ b/bridge/vlan.c @@ -590,20 +590,6 @@ static void close_vlan_port(void) close_json_object(); } -static unsigned int print_range(const char *name, __u32 start, __u32 id) -{ - char end[64]; - int width; - - snprintf(end, sizeof(end), "%sEnd", name); - - width = print_uint(PRINT_ANY, name, "%u", start); - if (start != id) - width += print_uint(PRINT_ANY, end, "-%u", id); - - return width; -} - static void print_vlan_tunnel_info(struct rtattr *tb, int ifindex) { struct rtattr *i, *list = tb; @@ -661,16 +647,8 @@ static void print_vlan_tunnel_info(struct rtattr *tb, int ifindex) open_json_object(NULL); width = print_range("vlan", last_vid_start, tunnel_vid); - if (width <= VLAN_ID_LEN) { - char buf[VLAN_ID_LEN + 1]; - - snprintf(buf, sizeof(buf), "%-*s", - VLAN_ID_LEN - width, ""); - print_string(PRINT_FP, NULL, "%s ", buf); - } else { - fprintf(stderr, "BUG: vlan range too wide, %u\n", - width); - } + if (!is_json_context()) + printf("%-*s ", VLAN_ID_LEN - width, ""); print_range("tunid", last_tunid_start, tunnel_id); close_json_object(); print_nl(); @@ -873,7 +851,7 @@ static void print_vlan_global_opts(struct rtattr *a, int ifindex) struct rtattr *vtb[BRIDGE_VLANDB_GOPTS_MAX + 1], *vattr; __u16 vid, vrange = 0; - if ((a->rta_type & NLA_TYPE_MASK) != BRIDGE_VLANDB_GLOBAL_OPTIONS) + if (rta_type(a) != BRIDGE_VLANDB_GLOBAL_OPTIONS) return; parse_rtattr_flags(vtb, BRIDGE_VLANDB_GOPTS_MAX, RTA_DATA(a), @@ -982,7 +960,7 @@ static void print_vlan_opts(struct rtattr *a, int ifindex) __u16 vrange = 0; __u8 state = 0; - if ((a->rta_type & NLA_TYPE_MASK) != BRIDGE_VLANDB_ENTRY) + if (rta_type(a) != BRIDGE_VLANDB_ENTRY) return; parse_rtattr_flags(vtb, BRIDGE_VLANDB_ENTRY_MAX, RTA_DATA(a), @@ -1108,14 +1086,14 @@ int print_vlan_rtm(struct nlmsghdr *n, void *arg, bool monitor, bool global_only rem = len; for (a = BRVLAN_RTA(bvm); RTA_OK(a, rem); a = RTA_NEXT(a, rem)) { - unsigned short rta_type = a->rta_type & NLA_TYPE_MASK; + unsigned short attr_type = rta_type(a); /* skip unknown attributes */ - if (rta_type > BRIDGE_VLANDB_MAX || - (global_only && rta_type != BRIDGE_VLANDB_GLOBAL_OPTIONS)) + if (attr_type > BRIDGE_VLANDB_MAX || + (global_only && attr_type != BRIDGE_VLANDB_GLOBAL_OPTIONS)) continue; - switch (rta_type) { + switch (attr_type) { case BRIDGE_VLANDB_ENTRY: print_vlan_opts(a, bvm->ifindex); break; diff --git a/bridge/vni.c b/bridge/vni.c index e804cb3f4..a7abe6de5 100644 --- a/bridge/vni.c +++ b/bridge/vni.c @@ -23,7 +23,8 @@ static unsigned int filter_index; -#define VXLAN_ID_LEN 15 +/* max len of "<start>-<end>" */ +#define VXLAN_ID_LEN 17 #define __stringify_1(x...) #x #define __stringify(x...) __stringify_1(x) @@ -33,8 +34,8 @@ static void usage(void) fprintf(stderr, "Usage: bridge vni { add | del } vni VNI\n" " [ { group | remote } IP_ADDRESS ]\n" - " [ dev DEV ]\n" - " bridge vni { show }\n" + " dev DEV\n" + " bridge vni { show } [ dev DEV ]\n" "\n" "Where: VNI := 0-16777215\n" ); @@ -92,7 +93,7 @@ static int vni_modify(int cmd, int argc, char **argv) .n.nlmsg_type = cmd, .tmsg.family = PF_BRIDGE, }; - bool group_present = false; + bool daddr_present = false; inet_prefix daddr; char *vni = NULL; char *d = NULL; @@ -104,27 +105,22 @@ static int vni_modify(int cmd, int argc, char **argv) } else if (strcmp(*argv, "vni") == 0) { NEXT_ARG(); if (vni) - invarg("duplicate vni", *argv); + duparg("vni", *argv); vni = *argv; } else if (strcmp(*argv, "group") == 0) { - if (group_present) - invarg("duplicate group", *argv); - if (is_addrtype_inet_not_multi(&daddr)) { - fprintf(stderr, "vxlan: both group and remote"); - fprintf(stderr, " cannot be specified\n"); - return -1; - } NEXT_ARG(); + if (daddr_present) + duparg("destination", *argv); get_addr(&daddr, *argv, AF_UNSPEC); if (!is_addrtype_inet_multi(&daddr)) invarg("invalid group address", *argv); - group_present = true; + daddr_present = true; } else if (strcmp(*argv, "remote") == 0) { - if (group_present) - invarg("duplicate group", *argv); NEXT_ARG(); + if (daddr_present) + duparg("destination", *argv); get_addr(&daddr, *argv, AF_UNSPEC); - group_present = true; + daddr_present = true; } else { if (strcmp(*argv, "help") == 0) usage(); @@ -138,7 +134,7 @@ static int vni_modify(int cmd, int argc, char **argv) } parse_vni_filter(vni, &req.n, sizeof(req), - (group_present ? &daddr : NULL)); + (daddr_present ? &daddr : NULL)); req.tmsg.ifindex = ll_name_to_index(d); if (req.tmsg.ifindex == 0) { @@ -152,7 +148,7 @@ static int vni_modify(int cmd, int argc, char **argv) return 0; } -static void open_vni_port(int ifi_index, const char *fmt) +static void open_vni_port(int ifi_index) { open_json_object(NULL); print_color_string(PRINT_ANY, COLOR_IFNAME, "ifname", @@ -167,18 +163,6 @@ static void close_vni_port(void) close_json_object(); } -static void print_range(const char *name, __u32 start, __u32 id) -{ - char end[64]; - - snprintf(end, sizeof(end), "%sEnd", name); - - print_uint(PRINT_ANY, name, " %u", start); - if (start != id) - print_uint(PRINT_ANY, end, "-%-14u ", id); - -} - static void print_vnifilter_entry_stats(struct rtattr *stats_attr) { struct rtattr *stb[VNIFILTER_ENTRY_STATS_MAX+1]; @@ -189,8 +173,8 @@ static void print_vnifilter_entry_stats(struct rtattr *stats_attr) RTA_PAYLOAD(stats_attr), NLA_F_NESTED); print_nl(); - print_string(PRINT_FP, NULL, "%-" __stringify(IFNAMSIZ) "s ", ""); - print_string(PRINT_FP, NULL, "RX: ", ""); + print_string(PRINT_FP, NULL, "%-" __stringify(IFNAMSIZ) "s RX: ", + ""); if (stb[VNIFILTER_ENTRY_STATS_RX_BYTES]) { stat = rta_getattr_u64(stb[VNIFILTER_ENTRY_STATS_RX_BYTES]); @@ -210,8 +194,8 @@ static void print_vnifilter_entry_stats(struct rtattr *stats_attr) } print_nl(); - print_string(PRINT_FP, NULL, "%-" __stringify(IFNAMSIZ) "s ", ""); - print_string(PRINT_FP, NULL, "TX: ", ""); + print_string(PRINT_FP, NULL, "%-" __stringify(IFNAMSIZ) "s TX: ", + ""); if (stb[VNIFILTER_ENTRY_STATS_TX_BYTES]) { stat = rta_getattr_u64(stb[VNIFILTER_ENTRY_STATS_TX_BYTES]); @@ -236,7 +220,8 @@ static void print_vni(struct rtattr *t, int ifindex) { struct rtattr *ttb[VXLAN_VNIFILTER_ENTRY_MAX+1]; __u32 vni_start = 0; - __u32 vni_end = 0; + unsigned int width; + __u32 vni_end; parse_rtattr_flags(ttb, VXLAN_VNIFILTER_ENTRY_MAX, RTA_DATA(t), RTA_PAYLOAD(t), NLA_F_NESTED); @@ -246,11 +231,13 @@ static void print_vni(struct rtattr *t, int ifindex) if (ttb[VXLAN_VNIFILTER_ENTRY_END]) vni_end = rta_getattr_u32(ttb[VXLAN_VNIFILTER_ENTRY_END]); - - if (vni_end) - print_range("vni", vni_start, vni_end); else - print_uint(PRINT_ANY, "vni", " %-14u", vni_start); + vni_end = vni_start; + + open_json_object(NULL); + width = print_range("vni", vni_start, vni_end); + if (!is_json_context()) + printf("%-*s ", VXLAN_ID_LEN - width, ""); if (ttb[VXLAN_VNIFILTER_ENTRY_GROUP]) { __be32 addr = rta_getattr_u32(ttb[VXLAN_VNIFILTER_ENTRY_GROUP]); @@ -259,12 +246,12 @@ static void print_vni(struct rtattr *t, int ifindex) if (IN_MULTICAST(ntohl(addr))) print_string(PRINT_ANY, "group", - " %s", + "%s", format_host(AF_INET, 4, &addr)); else print_string(PRINT_ANY, "remote", - " %s", + "%s", format_host(AF_INET, 4, &addr)); } } else if (ttb[VXLAN_VNIFILTER_ENTRY_GROUP6]) { @@ -275,14 +262,14 @@ static void print_vni(struct rtattr *t, int ifindex) if (IN6_IS_ADDR_MULTICAST(&addr)) print_string(PRINT_ANY, "group", - " %s", + "%s", format_host(AF_INET6, sizeof(struct in6_addr), &addr)); else print_string(PRINT_ANY, "remote", - " %s", + "%s", format_host(AF_INET6, sizeof(struct in6_addr), &addr)); @@ -293,14 +280,14 @@ static void print_vni(struct rtattr *t, int ifindex) print_vnifilter_entry_stats(ttb[VXLAN_VNIFILTER_ENTRY_STATS]); close_json_object(); - print_string(PRINT_FP, NULL, "%s", _SL_); + print_nl(); } int print_vnifilter_rtm(struct nlmsghdr *n, void *arg) { struct tunnel_msg *tmsg = NLMSG_DATA(n); int len = n->nlmsg_len; - bool first = true; + bool opened = false; struct rtattr *t; FILE *fp = arg; int rem; @@ -332,34 +319,26 @@ int print_vnifilter_rtm(struct nlmsghdr *n, void *arg) rem = len; for (t = TUNNEL_RTA(tmsg); RTA_OK(t, rem); t = RTA_NEXT(t, rem)) { - unsigned short rta_type = t->rta_type & NLA_TYPE_MASK; - - if (rta_type != VXLAN_VNIFILTER_ENTRY) + if (rta_type(t) != VXLAN_VNIFILTER_ENTRY) continue; - if (first) { - open_vni_port(tmsg->ifindex, "%s"); - open_json_object(NULL); - first = false; + + if (!opened) { + open_vni_port(tmsg->ifindex); + opened = true; } else { - open_json_object(NULL); print_string(PRINT_FP, NULL, "%-" __stringify(IFNAMSIZ) "s ", ""); } print_vni(t, tmsg->ifindex); } - close_vni_port(); - print_string(PRINT_FP, NULL, "%s", _SL_); + if (opened) + close_vni_port(); fflush(stdout); return 0; } -static int print_vnifilter_rtm_filter(struct nlmsghdr *n, void *arg) -{ - return print_vnifilter_rtm(n, arg); -} - static int vni_show(int argc, char **argv) { char *filter_dev = NULL; @@ -392,15 +371,12 @@ static int vni_show(int argc, char **argv) exit(1); } - if (!is_json_context()) { + if (!is_json_context()) printf("%-" __stringify(IFNAMSIZ) "s %-" - __stringify(VXLAN_ID_LEN) "s %-" - __stringify(15) "s", - "dev", "vni", "group/remote"); - printf("\n"); - } + __stringify(VXLAN_ID_LEN) "s group/remote\n", "dev", + "vni"); - ret = rtnl_dump_filter(&rth, print_vnifilter_rtm_filter, NULL); + ret = rtnl_dump_filter(&rth, print_vnifilter_rtm, NULL); if (ret < 0) { fprintf(stderr, "Dump ternminated\n"); exit(1); @@ -419,7 +395,8 @@ int do_vni(int argc, char **argv) if (argc > 0) { if (strcmp(*argv, "add") == 0) return vni_modify(RTM_NEWTUNNEL, argc-1, argv+1); - if (strcmp(*argv, "delete") == 0) + if (strcmp(*argv, "delete") == 0 || + strcmp(*argv, "del") == 0) return vni_modify(RTM_DELTUNNEL, argc-1, argv+1); if (strcmp(*argv, "show") == 0 || strcmp(*argv, "lst") == 0 || @@ -26,26 +26,6 @@ check_toolchain() echo "YACC:=${YACC}" >>$CONFIG } -check_atm() -{ - cat >$TMPDIR/atmtest.c <<EOF -#include <atm.h> -int main(int argc, char **argv) { - struct atm_qos qos; - (void) text2qos("aal5,ubr:sdu=9180,rx:none",&qos,0); - return 0; -} -EOF - - if $CC -I$INCLUDE -o $TMPDIR/atmtest $TMPDIR/atmtest.c -latm >/dev/null 2>&1; then - echo "TC_CONFIG_ATM:=y" >>$CONFIG - echo yes - else - echo no - fi - rm -f $TMPDIR/atmtest.c $TMPDIR/atmtest -} - check_xtables() { if ! ${PKG_CONFIG} xtables --exists; then @@ -241,8 +221,8 @@ check_elf() echo "HAVE_ELF:=y" >>$CONFIG echo "yes" - echo 'CFLAGS += -DHAVE_ELF' `${PKG_CONFIG} libelf --cflags` >> $CONFIG - echo 'LDLIBS += ' `${PKG_CONFIG} libelf --libs` >>$CONFIG + echo 'CFLAGS += -DHAVE_ELF' "$(${PKG_CONFIG} libelf --cflags)" >> $CONFIG + echo 'LDLIBS += ' "$(${PKG_CONFIG} libelf --libs)" >>$CONFIG else echo "no" fi @@ -360,8 +340,8 @@ check_selinux() echo "HAVE_SELINUX:=y" >>$CONFIG echo "yes" - echo 'LDLIBS +=' `${PKG_CONFIG} --libs libselinux` >>$CONFIG - echo 'CFLAGS += -DHAVE_SELINUX' `${PKG_CONFIG} --cflags libselinux` >>$CONFIG + echo 'LDLIBS +=' "$(${PKG_CONFIG} --libs libselinux)" >>$CONFIG + echo 'CFLAGS += -DHAVE_SELINUX' "$(${PKG_CONFIG} --cflags libselinux)" >>$CONFIG else echo "no" fi @@ -373,8 +353,8 @@ check_tirpc() echo "HAVE_RPC:=y" >>$CONFIG echo "yes" - echo 'LDLIBS +=' `${PKG_CONFIG} --libs libtirpc` >>$CONFIG - echo 'CFLAGS += -DHAVE_RPC' `${PKG_CONFIG} --cflags libtirpc` >>$CONFIG + echo 'LDLIBS +=' "$(${PKG_CONFIG} --libs libtirpc)" >>$CONFIG + echo 'CFLAGS += -DHAVE_RPC' "$(${PKG_CONFIG} --cflags libtirpc)" >>$CONFIG else echo "no" fi @@ -386,8 +366,8 @@ check_mnl() echo "HAVE_MNL:=y" >>$CONFIG echo "yes" - echo 'CFLAGS += -DHAVE_LIBMNL' `${PKG_CONFIG} libmnl --cflags` >>$CONFIG - echo 'LDLIBS +=' `${PKG_CONFIG} libmnl --libs` >> $CONFIG + echo 'CFLAGS += -DHAVE_LIBMNL' "$(${PKG_CONFIG} libmnl --cflags)" >>$CONFIG + echo 'LDLIBS +=' "$(${PKG_CONFIG} libmnl --libs)" >> $CONFIG else echo "no" fi @@ -428,8 +408,8 @@ EOF echo "no" else if ${PKG_CONFIG} libbsd --exists; then - echo 'CFLAGS += -DHAVE_LIBBSD' `${PKG_CONFIG} libbsd --cflags` >>$CONFIG - echo 'LDLIBS +=' `${PKG_CONFIG} libbsd --libs` >> $CONFIG + echo 'CFLAGS += -DHAVE_LIBBSD' "$(${PKG_CONFIG} libbsd --cflags)" >>$CONFIG + echo 'LDLIBS +=' "$(${PKG_CONFIG} libbsd --libs)" >> $CONFIG echo "no" else echo 'CFLAGS += -DNEED_STRLCPY' >>$CONFIG @@ -445,8 +425,8 @@ check_cap() echo "HAVE_CAP:=y" >>$CONFIG echo "yes" - echo 'CFLAGS += -DHAVE_LIBCAP' `${PKG_CONFIG} libcap --cflags` >>$CONFIG - echo 'LDLIBS +=' `${PKG_CONFIG} libcap --libs` >> $CONFIG + echo 'CFLAGS += -DHAVE_LIBCAP' "$(${PKG_CONFIG} libcap --cflags)" >>$CONFIG + echo 'LDLIBS +=' "$(${PKG_CONFIG} libcap --libs)" >> $CONFIG else echo "no" fi @@ -588,9 +568,6 @@ check_toolchain echo "TC schedulers" -echo -n " ATM " -check_atm - check_xtables if ! grep -q TC_CONFIG_NO_XT $CONFIG; then echo -n " IPT " diff --git a/include/json_print.h b/include/json_print.h index 0b1d84f78..daebcf5d2 100644 --- a/include/json_print.h +++ b/include/json_print.h @@ -97,6 +97,8 @@ static inline int print_rate(bool use_iec, enum output_type t, return print_color_rate(use_iec, t, COLOR_NONE, key, fmt, rate); } +unsigned int print_range(const char *name, __u32 start, __u32 end); + int print_color_bool_opt(enum output_type type, enum color_attr color, const char *key, bool value, bool show); diff --git a/include/libnetlink.h b/include/libnetlink.h index 39ed87a79..ad7e71272 100644 --- a/include/libnetlink.h +++ b/include/libnetlink.h @@ -275,6 +275,10 @@ static inline const char *rta_getattr_str(const struct rtattr *rta) { return (const char *)RTA_DATA(rta); } +static inline int rta_type(const struct rtattr *rta) +{ + return rta->rta_type & NLA_TYPE_MASK; +} int rtnl_listen_all_nsid(struct rtnl_handle *); int rtnl_listen(struct rtnl_handle *, rtnl_listen_filter_t handler, diff --git a/include/version.h b/include/version.h index 298dc7b9b..a3ec1bb77 100644 --- a/include/version.h +++ b/include/version.h @@ -1 +1 @@ -static const char version[] = "6.6.0"; +static const char version[] = "6.7.0"; diff --git a/ip/ipaddress.c b/ip/ipaddress.c index 8197709d1..e536912fc 100644 --- a/ip/ipaddress.c +++ b/ip/ipaddress.c @@ -929,9 +929,7 @@ static int print_linkinfo_brief(FILE *fp, const char *name, ifi->ifi_type, b1, sizeof(b1))); } - } - if (filter.family == AF_PACKET) { print_link_flags(fp, ifi->ifi_flags, m_flag); print_string(PRINT_FP, NULL, "%s", "\n"); } diff --git a/ip/iplink.c b/ip/iplink.c index 40d5d8a52..95314af5a 100644 --- a/ip/iplink.c +++ b/ip/iplink.c @@ -1311,12 +1311,14 @@ static int iplink_afstats(int argc, char **argv) if (rtnl_statsdump_req_filter(&rth, AF_UNSPEC, filt_mask, NULL, NULL) < 0) { - perror("Cannont send dump request"); + perror("Cannot send dump request"); + delete_json_obj(); return 1; } if (rtnl_dump_filter(&rth, print_af_stats, &ctx) < 0) { fprintf(stderr, "Dump terminated\n"); + delete_json_obj(); return 1; } diff --git a/lib/json_print.c b/lib/json_print.c index 602de027c..7b3b6c3fa 100644 --- a/lib/json_print.c +++ b/lib/json_print.c @@ -374,3 +374,18 @@ int print_color_rate(bool use_iec, enum output_type type, enum color_attr color, free(buf); return rc; } + +unsigned int print_range(const char *name, __u32 start, __u32 end) +{ + int width; + + width = print_uint(PRINT_ANY, name, "%u", start); + if (start != end) { + char buf[64]; + + snprintf(buf, sizeof(buf), "%sEnd", name); + width += print_uint(PRINT_ANY, buf, "-%u", end); + } + + return width; +} diff --git a/lib/mnl_utils.c b/lib/mnl_utils.c index 1c7822282..af5aa4f9e 100644 --- a/lib/mnl_utils.c +++ b/lib/mnl_utils.c @@ -61,6 +61,8 @@ static int mnlu_cb_error(const struct nlmsghdr *nlh, void *data) { const struct nlmsgerr *err = mnl_nlmsg_get_payload(nlh); + if (mnl_nlmsg_get_payload_len(nlh) < sizeof(*err)) + return MNL_CB_STOP; /* Netlink subsystems returns the errno value with different signess */ if (err->error < 0) errno = -err->error; @@ -75,8 +77,11 @@ static int mnlu_cb_error(const struct nlmsghdr *nlh, void *data) static int mnlu_cb_stop(const struct nlmsghdr *nlh, void *data) { - int len = *(int *)NLMSG_DATA(nlh); + int len; + if (mnl_nlmsg_get_payload_len(nlh) < sizeof(len)) + return MNL_CB_STOP; + len = *(int *)mnl_nlmsg_get_payload(nlh); if (len < 0) { errno = -len; nl_dump_ext_ack_done(nlh, sizeof(int), len); diff --git a/man/man8/ip-address.8.in b/man/man8/ip-address.8.in index 9d34a6a1b..a5ae47acd 100644 --- a/man/man8/ip-address.8.in +++ b/man/man8/ip-address.8.in @@ -210,8 +210,8 @@ The maximum allowed total length of label is 15 characters. .BI scope " SCOPE_VALUE" the scope of the area where this address is valid. The available scopes are listed in -.BR "@SYSCONF_USR_DIR@/rt_scopes" or -.BR "@SYSCONF_ETC_DIR@/rt_scopes" (has precedence if exists). +.BR @SYSCONF_USR_DIR@/rt_scopes " or " @SYSCONF_ETC_DIR@/rt_scopes +(has precedence if exists). Predefined scope values are: .in +8 diff --git a/man/man8/ip-link.8.in b/man/man8/ip-link.8.in index ca49b0081..dd686ae15 100644 --- a/man/man8/ip-link.8.in +++ b/man/man8/ip-link.8.in @@ -2305,8 +2305,8 @@ give the device a symbolic name for easy reference. .BI group " GROUP" specify the group the device belongs to. The available groups are listed in -.BR "@SYSCONF_USR_DIR@/group" or -.BR "@SYSCONF_ETC_DIR@/group" (has precedence if exists). +.BR @SYSCONF_USR_DIR@/group " or " @SYSCONF_ETC_DIR@/group +(has precedence if exists). .TP .BI vf " NUM" @@ -2843,7 +2843,7 @@ are supported: locally terminated traffic for the given DSA switch user port. For a description of which network interfaces are suitable for serving as conduit interfaces of this user port, please see -https://www.kernel.org/doc/html/latest/networking/dsa/configuration.html#affinity-of-user-ports-to-cpu-ports +https://docs.kernel.org/networking/dsa/configuration.html#affinity-of-user-ports-to-cpu-ports as well as what is supported by the driver in use. .sp @@ -2916,8 +2916,7 @@ specifies which help of link type to display. .SS .I GROUP may be a number or a string from -.B @SYSCONF_USR_DIR@/group or -.B @SYSCONF_ETC_DIR@/group +.BR @SYSCONF_USR_DIR@/group " or " @SYSCONF_ETC_DIR@/group which can be manually filled and has precedence if exists. .SH "EXAMPLES" diff --git a/man/man8/ip-route.8.in b/man/man8/ip-route.8.in index 7a97d7447..10387bca6 100644 --- a/man/man8/ip-route.8.in +++ b/man/man8/ip-route.8.in @@ -357,8 +357,8 @@ normal routing tables. .B Route tables: Linux-2.x can pack routes into several routing tables identified by a number in the range from 1 to 2^32-1 or by name from -.B @SYSCONF_USR_DIR@/rt_tables or -.B @SYSCONF_ETC_DIR@/rt_tables (has precedence if exists). +.BR @SYSCONF_USR_DIR@/rt_tables " or " @SYSCONF_ETC_DIR@/rt_tables +(has precedence if exists). By default all normal routes are inserted into the .B main table (ID 254) and the kernel only uses this table when calculating routes. @@ -421,8 +421,8 @@ may still match a route with a zero TOS. .I TOS is either an 8 bit hexadecimal number or an identifier from -.BR "@SYSCONF_USR_DIR@/rt_dsfield" or -.BR "@SYSCONF_ETC_DIR@/rt_dsfield" (has precedence if exists). +.BR @SYSCONF_USR_DIR@/rt_dsfield " or " @SYSCONF_ETC_DIR@/rt_dsfield +(has precedence if exists). .TP .BI metric " NUMBER" @@ -437,8 +437,8 @@ is an arbitrary 32bit number, where routes with lower values are preferred. the table to add this route to. .I TABLEID may be a number or a string from -.BR "@SYSCONF_USR_DIR@/rt_tables" or -.BR "@SYSCONF_ETC_DIR@/rt_tables" (has precedence if exists). +.BR @SYSCONF_USR_DIR@/rt_tables " or " @SYSCONF_ETC_DIR@/rt_tables +(has precedence if exists). If this parameter is omitted, .B ip assumes the @@ -479,8 +479,8 @@ covered by the route prefix. the realm to which this route is assigned. .I REALMID may be a number or a string from -.BR "@SYSCONF_USR_DIR@/rt_realms" or -.BR "@SYSCONF_ETC_DIR@/rt_realms" (has precedence if exists). +.BR @SYSCONF_USR_DIR@/rt_realms " or " @SYSCONF_ETC_DIR@/rt_realms +(has precedence if exists). .TP .BI mtu " MTU" @@ -631,8 +631,8 @@ command. the scope of the destinations covered by the route prefix. .I SCOPE_VAL may be a number or a string from -.BR "@SYSCONF_USR_DIR@/rt_scopes" or -.BR "@SYSCONF_ETC_DIR@/rt_scopes" (has precedence if exists). +.BR @SYSCONF_USR_DIR@/rt_scopes " or " @SYSCONF_ETC_DIR@/rt_scopes +(has precedence if exists). If this parameter is omitted, .B ip assumes scope @@ -652,8 +652,8 @@ routes. the routing protocol identifier of this route. .I RTPROTO may be a number or a string from -.BR "@SYSCONF_ETC_DIR@/rt_protos" or -.BR "@SYSCONF_ETC_DIR@/rt_protos" (has precedence if exists). +.BR @SYSCONF_USR_DIR@/rt_protos " or " @SYSCONF_ETC_DIR@/rt_protos +(has precedence if exists). If the routing protocol ID is not given, .B ip assumes protocol .B boot @@ -892,8 +892,8 @@ matching packets are dropped. specified lookup table. .I TABLEID is either a number or a string from -.BR "@SYSCONF_USR_DIR@/rt_tables" or -.BR "@SYSCONF_ETC_DIR@/rt_tables" (has precedence if exists). +.BR @SYSCONF_USR_DIR@/rt_tables " or " @SYSCONF_ETC_DIR@/rt_tables +(has precedence if exists). If .B vrftable is used, the argument must be a VRF device associated with @@ -909,8 +909,8 @@ and an inner IPv6 packet. Other matching packets are dropped. specified lookup table. .I TABLEID is either a number or a string from -.BR "@SYSCONF_USR_DIR@/rt_tables" or -.BR "@SYSCONF_ETC_DIR@/rt_tables" (has precedence if exists). +.BR @SYSCONF_USR_DIR@/rt_tables " or " @SYSCONF_ETC_DIR@/rt_tables +(has precedence if exists). The argument must be a VRF device associated with the table id. Moreover, the VRF table associated with the table id must be configured with the VRF strict mode turned on (net.vrf.strict_mode=1). This action @@ -923,8 +923,8 @@ at all, and an inner IPv4 packet. Other matching packets are dropped. to the specified lookup table. .I TABLEID is either a number or a string from -.BR "@SYSCONF_USR_DIR@/rt_tables" or -.BR "@SYSCONF_ETC_DIR@/rt_tables" (has precedence if exists). +.BR @SYSCONF_USR_DIR@/rt_tables " or " @SYSCONF_ETC_DIR@/rt_tables +(has precedence if exists). The argument must be a VRF device associated with the table id. Moreover, the VRF table associated with the table id must be configured with the VRF strict mode turned on (net.vrf.strict_mode=1). This action diff --git a/man/man8/rdma.8 b/man/man8/rdma.8 index c9e5d50d5..5088b9ec3 100644 --- a/man/man8/rdma.8 +++ b/man/man8/rdma.8 @@ -25,8 +25,9 @@ rdma \- RDMA tool .ti -8 .IR OPTIONS " := { " \fB\-V\fR[\fIersion\fR] | -\fB\-d\fR[\fIetails\fR] } -\fB\-j\fR[\fIson\fR] } +\fB\-d\fR[\fIetails\fR] | +\fB\-j\fR[\fIson\fR] | +\fB\-o\fR[\fIneline\fR] | \fB\-p\fR[\fIretty\fR] } .SH OPTIONS @@ -63,6 +64,13 @@ When combined with -j generate a pretty JSON output. .BR "\-j" , " --json" Generate JSON output. +.TP +.BR "\-o" , " \-oneline" +output each record on a single line, replacing line feeds +with the +.B '\e' +character. + .SS .I OBJECT diff --git a/misc/lnstat.c b/misc/lnstat.c index c3f2999cc..f802a0f35 100644 --- a/misc/lnstat.c +++ b/misc/lnstat.c @@ -112,6 +112,10 @@ static void print_json(FILE *of, const struct lnstat_file *lnstat_files, json_writer_t *jw = jsonw_new(of); int i; + if (jw == NULL) { + fprintf(stderr, "Failed to create JSON writer\n"); + exit(1); + } jsonw_start_object(jw); for (i = 0; i < fp->num; i++) { const struct lnstat_field *lf = fp->params[i].lf; @@ -100,8 +100,8 @@ enum col_id { COL_SERV, COL_RADDR, COL_RSERV, - COL_EXT, COL_PROC, + COL_EXT, COL_MAX }; @@ -5819,6 +5819,9 @@ int main(int argc, char *argv[]) if (ssfilter_parse(¤t_filter.f, argc, argv, filter_fp)) usage(); + if (!show_processes) + columns[COL_PROC].disabled = 1; + if (!(current_filter.dbs & (current_filter.dbs - 1))) columns[COL_NETID].disabled = 1; diff --git a/rdma/dev.c b/rdma/dev.c index 585bec54f..f495b7138 100644 --- a/rdma/dev.c +++ b/rdma/dev.c @@ -84,7 +84,7 @@ static const char *dev_caps_to_str(uint32_t idx) return "UNKNOWN"; } -static void dev_print_caps(struct rd *rd, struct nlattr **tb) +static void dev_print_caps(struct nlattr **tb) { uint64_t caps; uint32_t idx; @@ -94,11 +94,11 @@ static void dev_print_caps(struct rd *rd, struct nlattr **tb) caps = mnl_attr_get_u64(tb[RDMA_NLDEV_ATTR_CAP_FLAGS]); - print_color_string(PRINT_FP, COLOR_NONE, NULL, "\n caps: <", NULL); + print_string(PRINT_FP, NULL, "%s caps: <", _SL_); open_json_array(PRINT_JSON, "caps"); for (idx = 0; caps; idx++) { if (caps & 0x1) - print_color_string(PRINT_ANY, COLOR_NONE, NULL, + print_string(PRINT_ANY, NULL, caps >> 0x1 ? "%s, " : "%s", dev_caps_to_str(idx)); caps >>= 0x1; @@ -106,17 +106,18 @@ static void dev_print_caps(struct rd *rd, struct nlattr **tb) close_json_array(PRINT_ANY, ">"); } -static void dev_print_fw(struct rd *rd, struct nlattr **tb) +static void dev_print_fw(struct nlattr **tb) { const char *str; + if (!tb[RDMA_NLDEV_ATTR_FW_VERSION]) return; str = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_FW_VERSION]); - print_color_string(PRINT_ANY, COLOR_NONE, "fw", "fw %s ", str); + print_string(PRINT_ANY, "fw", "fw %s ", str); } -static void dev_print_node_guid(struct rd *rd, struct nlattr **tb) +static void dev_print_node_guid(struct nlattr **tb) { uint64_t node_guid; uint16_t vp[4]; @@ -128,11 +129,11 @@ static void dev_print_node_guid(struct rd *rd, struct nlattr **tb) node_guid = mnl_attr_get_u64(tb[RDMA_NLDEV_ATTR_NODE_GUID]); memcpy(vp, &node_guid, sizeof(uint64_t)); snprintf(str, 32, "%04x:%04x:%04x:%04x", vp[3], vp[2], vp[1], vp[0]); - print_color_string(PRINT_ANY, COLOR_NONE, "node_guid", "node_guid %s ", + print_string(PRINT_ANY, "node_guid", "node_guid %s ", str); } -static void dev_print_sys_image_guid(struct rd *rd, struct nlattr **tb) +static void dev_print_sys_image_guid(struct nlattr **tb) { uint64_t sys_image_guid; uint16_t vp[4]; @@ -144,11 +145,10 @@ static void dev_print_sys_image_guid(struct rd *rd, struct nlattr **tb) sys_image_guid = mnl_attr_get_u64(tb[RDMA_NLDEV_ATTR_SYS_IMAGE_GUID]); memcpy(vp, &sys_image_guid, sizeof(uint64_t)); snprintf(str, 32, "%04x:%04x:%04x:%04x", vp[3], vp[2], vp[1], vp[0]); - print_color_string(PRINT_ANY, COLOR_NONE, "sys_image_guid", - "sys_image_guid %s ", str); + print_string(PRINT_ANY, "sys_image_guid", "sys_image_guid %s ", str); } -static void dev_print_dim_setting(struct rd *rd, struct nlattr **tb) +static void dev_print_dim_setting(struct nlattr **tb) { uint8_t dim_setting; @@ -175,7 +175,7 @@ static const char *node_type_to_str(uint8_t node_type) return "unknown"; } -static void dev_print_node_type(struct rd *rd, struct nlattr **tb) +static void dev_print_node_type(struct nlattr **tb) { const char *node_str; uint8_t node_type; @@ -185,11 +185,10 @@ static void dev_print_node_type(struct rd *rd, struct nlattr **tb) node_type = mnl_attr_get_u8(tb[RDMA_NLDEV_ATTR_DEV_NODE_TYPE]); node_str = node_type_to_str(node_type); - print_color_string(PRINT_ANY, COLOR_NONE, "node_type", "node_type %s ", - node_str); + print_string(PRINT_ANY, "node_type", "node_type %s ", node_str); } -static void dev_print_dev_proto(struct rd *rd, struct nlattr **tb) +static void dev_print_dev_proto(struct nlattr **tb) { const char *str; @@ -197,7 +196,7 @@ static void dev_print_dev_proto(struct rd *rd, struct nlattr **tb) return; str = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_PROTOCOL]); - print_color_string(PRINT_ANY, COLOR_NONE, "protocol", "protocol %s ", str); + print_string(PRINT_ANY, "protocol", "protocol %s ", str); } static int dev_parse_cb(const struct nlmsghdr *nlh, void *data) @@ -210,23 +209,26 @@ static int dev_parse_cb(const struct nlmsghdr *nlh, void *data) mnl_attr_parse(nlh, 0, rd_attr_cb, tb); if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || !tb[RDMA_NLDEV_ATTR_DEV_NAME]) return MNL_CB_ERROR; + open_json_object(NULL); idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); - print_color_uint(PRINT_ANY, COLOR_NONE, "ifindex", "%u: ", idx); - print_color_string(PRINT_ANY, COLOR_NONE, "ifname", "%s: ", name); - - dev_print_node_type(rd, tb); - dev_print_dev_proto(rd, tb); - dev_print_fw(rd, tb); - dev_print_node_guid(rd, tb); - dev_print_sys_image_guid(rd, tb); + print_uint(PRINT_ANY, "ifindex", "%u: ", idx); + print_string(PRINT_ANY, "ifname", "%s: ", name); + + dev_print_node_type(tb); + dev_print_dev_proto(tb); + dev_print_fw(tb); + dev_print_node_guid(tb); + dev_print_sys_image_guid(tb); if (rd->show_details) { - dev_print_dim_setting(rd, tb); - dev_print_caps(rd, tb); + dev_print_dim_setting(tb); + dev_print_caps(tb); } - newline(rd); + close_json_object(); + newline(); + return MNL_CB_OK; } diff --git a/rdma/link.c b/rdma/link.c index bf24b849a..853181733 100644 --- a/rdma/link.c +++ b/rdma/link.c @@ -86,7 +86,7 @@ static const char *caps_to_str(uint32_t idx) return "UNKNOWN"; } -static void link_print_caps(struct rd *rd, struct nlattr **tb) +static void link_print_caps(struct nlattr **tb) { uint64_t caps; uint32_t idx; @@ -96,11 +96,11 @@ static void link_print_caps(struct rd *rd, struct nlattr **tb) caps = mnl_attr_get_u64(tb[RDMA_NLDEV_ATTR_CAP_FLAGS]); - print_color_string(PRINT_FP, COLOR_NONE, NULL, "\n caps: <", NULL); + print_string(PRINT_FP, NULL, "%s caps: <", _SL_); open_json_array(PRINT_JSON, "caps"); for (idx = 0; caps; idx++) { if (caps & 0x1) - print_color_string(PRINT_ANY, COLOR_NONE, NULL, + print_string(PRINT_ANY, NULL, caps >> 0x1 ? "%s, " : "%s", caps_to_str(idx)); caps >>= 0x1; @@ -108,7 +108,7 @@ static void link_print_caps(struct rd *rd, struct nlattr **tb) close_json_array(PRINT_ANY, ">"); } -static void link_print_subnet_prefix(struct rd *rd, struct nlattr **tb) +static void link_print_subnet_prefix(struct nlattr **tb) { uint64_t subnet_prefix; uint16_t vp[4]; @@ -120,11 +120,10 @@ static void link_print_subnet_prefix(struct rd *rd, struct nlattr **tb) subnet_prefix = mnl_attr_get_u64(tb[RDMA_NLDEV_ATTR_SUBNET_PREFIX]); memcpy(vp, &subnet_prefix, sizeof(uint64_t)); snprintf(str, 32, "%04x:%04x:%04x:%04x", vp[3], vp[2], vp[1], vp[0]); - print_color_string(PRINT_ANY, COLOR_NONE, "subnet_prefix", - "subnet_prefix %s ", str); + print_string(PRINT_ANY, "subnet_prefix", "subnet_prefix %s ", str); } -static void link_print_lid(struct rd *rd, struct nlattr **tb) +static void link_print_lid(struct nlattr **tb) { uint32_t lid; @@ -132,10 +131,10 @@ static void link_print_lid(struct rd *rd, struct nlattr **tb) return; lid = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_LID]); - print_color_uint(PRINT_ANY, COLOR_NONE, "lid", "lid %u ", lid); + print_uint(PRINT_ANY, "lid", "lid %u ", lid); } -static void link_print_sm_lid(struct rd *rd, struct nlattr **tb) +static void link_print_sm_lid(struct nlattr **tb) { uint32_t sm_lid; @@ -143,10 +142,10 @@ static void link_print_sm_lid(struct rd *rd, struct nlattr **tb) return; sm_lid = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_SM_LID]); - print_color_uint(PRINT_ANY, COLOR_NONE, "sm_lid", "sm_lid %u ", sm_lid); + print_uint(PRINT_ANY, "sm_lid", "sm_lid %u ", sm_lid); } -static void link_print_lmc(struct rd *rd, struct nlattr **tb) +static void link_print_lmc(struct nlattr **tb) { uint8_t lmc; @@ -154,7 +153,7 @@ static void link_print_lmc(struct rd *rd, struct nlattr **tb) return; lmc = mnl_attr_get_u8(tb[RDMA_NLDEV_ATTR_LMC]); - print_color_uint(PRINT_ANY, COLOR_NONE, "lmc", "lmc %u ", lmc); + print_uint(PRINT_ANY, "lmc", "lmc %u ", lmc); } static const char *link_state_to_str(uint8_t link_state) @@ -168,7 +167,7 @@ static const char *link_state_to_str(uint8_t link_state) return "UNKNOWN"; } -static void link_print_state(struct rd *rd, struct nlattr **tb) +static void link_print_state(struct nlattr **tb) { uint8_t state; @@ -176,8 +175,7 @@ static void link_print_state(struct rd *rd, struct nlattr **tb) return; state = mnl_attr_get_u8(tb[RDMA_NLDEV_ATTR_PORT_STATE]); - print_color_string(PRINT_ANY, COLOR_NONE, "state", "state %s ", - link_state_to_str(state)); + print_string(PRINT_ANY, "state", "state %s ", link_state_to_str(state)); } static const char *phys_state_to_str(uint8_t phys_state) @@ -194,7 +192,7 @@ static const char *phys_state_to_str(uint8_t phys_state) return "UNKNOWN"; }; -static void link_print_phys_state(struct rd *rd, struct nlattr **tb) +static void link_print_phys_state(struct nlattr **tb) { uint8_t phys_state; @@ -202,11 +200,11 @@ static void link_print_phys_state(struct rd *rd, struct nlattr **tb) return; phys_state = mnl_attr_get_u8(tb[RDMA_NLDEV_ATTR_PORT_PHYS_STATE]); - print_color_string(PRINT_ANY, COLOR_NONE, "physical_state", - "physical_state %s ", phys_state_to_str(phys_state)); + print_string(PRINT_ANY, "physical_state", "physical_state %s ", + phys_state_to_str(phys_state)); } -static void link_print_netdev(struct rd *rd, struct nlattr **tb) +static void link_print_netdev(const struct rd * rd, struct nlattr **tb) { const char *netdev_name; uint32_t idx; @@ -216,10 +214,8 @@ static void link_print_netdev(struct rd *rd, struct nlattr **tb) netdev_name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_NDEV_NAME]); idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_NDEV_INDEX]); - print_color_string(PRINT_ANY, COLOR_NONE, "netdev", "netdev %s ", - netdev_name); - print_color_uint(PRINT_ANY, COLOR_NONE, "netdev_index", - rd->show_details ? "netdev_index %u " : "", idx); + print_string(PRINT_ANY, "netdev", "netdev %s ", netdev_name); + print_uint(PRINT_ANY, "netdev_index", rd->show_details ? "netdev_index %u " : "", idx); } static int link_parse_cb(const struct nlmsghdr *nlh, void *data) @@ -243,20 +239,22 @@ static int link_parse_cb(const struct nlmsghdr *nlh, void *data) name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); open_json_object(NULL); - print_color_uint(PRINT_JSON, COLOR_NONE, "ifindex", NULL, idx); - print_color_string(PRINT_ANY, COLOR_NONE, "ifname", "link %s/", name); - print_color_uint(PRINT_ANY, COLOR_NONE, "port", "%u ", port); - link_print_subnet_prefix(rd, tb); - link_print_lid(rd, tb); - link_print_sm_lid(rd, tb); - link_print_lmc(rd, tb); - link_print_state(rd, tb); - link_print_phys_state(rd, tb); + print_uint(PRINT_JSON, "ifindex", NULL, idx); + print_string(PRINT_ANY, "ifname", "link %s/", name); + print_uint(PRINT_ANY, "port", "%u ", port); + link_print_subnet_prefix(tb); + link_print_lid(tb); + link_print_sm_lid(tb); + link_print_lmc(tb); + link_print_state(tb); + link_print_phys_state(tb); link_print_netdev(rd, tb); if (rd->show_details) - link_print_caps(rd, tb); + link_print_caps(tb); + + close_json_object(); + newline(); - newline(rd); return MNL_CB_OK; } diff --git a/rdma/rdma.c b/rdma/rdma.c index 8dc2d3e34..131c6b2ab 100644 --- a/rdma/rdma.c +++ b/rdma/rdma.c @@ -8,12 +8,15 @@ #include "version.h" #include "color.h" +/* Global utils flags */ +int json; + static void help(char *name) { pr_out("Usage: %s [ OPTIONS ] OBJECT { COMMAND | help }\n" " %s [ -f[orce] ] -b[atch] filename\n" "where OBJECT := { dev | link | resource | system | statistic | help }\n" - " OPTIONS := { -V[ersion] | -d[etails] | -j[son] | -p[retty] -r[aw]}\n", name, name); + " OPTIONS := { -V[ersion] | -d[etails] | -j[son] | -p[retty] | -r[aw]}\n", name, name); } static int cmd_help(struct rd *rd) @@ -86,6 +89,7 @@ int main(int argc, char **argv) { "version", no_argument, NULL, 'V' }, { "help", no_argument, NULL, 'h' }, { "json", no_argument, NULL, 'j' }, + { "oneline", no_argument, NULL, 'o' }, { "pretty", no_argument, NULL, 'p' }, { "details", no_argument, NULL, 'd' }, { "raw", no_argument, NULL, 'r' }, @@ -96,16 +100,16 @@ int main(int argc, char **argv) bool show_driver_details = false; const char *batch_file = NULL; bool show_details = false; - bool json_output = false; bool show_raw = false; bool force = false; + bool oneline = false; struct rd rd = {}; char *filename; int opt; int err; filename = basename(argv[0]); - while ((opt = getopt_long(argc, argv, ":Vhdrpjfb:", + while ((opt = getopt_long(argc, argv, ":Vhdropjfb:", long_options, NULL)) >= 0) { switch (opt) { case 'V': @@ -113,7 +117,7 @@ int main(int argc, char **argv) filename, version); return EXIT_SUCCESS; case 'p': - pretty = 1; + ++pretty; break; case 'd': if (show_details) @@ -124,8 +128,11 @@ int main(int argc, char **argv) case 'r': show_raw = true; break; + case 'o': + oneline = true; + break; case 'j': - json_output = 1; + ++json; break; case 'f': force = true; @@ -149,10 +156,10 @@ int main(int argc, char **argv) argc -= optind; argv += optind; + _SL_ = oneline ? "\\" : "\n"; + rd.show_details = show_details; rd.show_driver_details = show_driver_details; - rd.json_output = json_output; - rd.pretty_output = pretty; rd.show_raw = show_raw; err = rd_init(&rd, filename); diff --git a/rdma/rdma.h b/rdma/rdma.h index 0bf77f4dc..1f8f83269 100644 --- a/rdma/rdma.h +++ b/rdma/rdma.h @@ -61,6 +61,7 @@ struct rd { uint8_t show_details:1; uint8_t show_driver_details:1; uint8_t show_raw:1; + uint8_t suppress_errors:1; struct list_head dev_map_list; uint32_t dev_idx; uint32_t port_idx; @@ -68,9 +69,6 @@ struct rd { struct nlmsghdr *nlh; char *buff; json_writer_t *jw; - int json_output; - int pretty_output; - bool suppress_errors; struct list_head filter_list; char *link_name; char *link_type; @@ -137,9 +135,10 @@ int rd_attr_cb(const struct nlattr *attr, void *data); */ void print_driver_table(struct rd *rd, struct nlattr *tb); void print_raw_data(struct rd *rd, struct nlattr **nla_line); -void newline(struct rd *rd); -void newline_indent(struct rd *rd); -void print_raw_data(struct rd *rd, struct nlattr **nla_line); +void newline_indent(void); +void newline(void); + #define MAX_LINE_LENGTH 80 + #endif /* _RDMA_TOOL_H_ */ diff --git a/rdma/res-cmid.c b/rdma/res-cmid.c index 7371c3a68..17a89cc4c 100644 --- a/rdma/res-cmid.c +++ b/rdma/res-cmid.c @@ -37,28 +37,25 @@ static const char *cm_id_ps_to_str(uint32_t ps) } } -static void print_cm_id_state(struct rd *rd, uint8_t state) +static void print_cm_id_state(uint8_t state) { - print_color_string(PRINT_ANY, COLOR_NONE, "state", "state %s ", - cm_id_state_to_str(state)); + print_string(PRINT_ANY, "state", "state %s ", cm_id_state_to_str(state)); } -static void print_ps(struct rd *rd, uint32_t ps) +static void print_ps(uint32_t ps) { - print_color_string(PRINT_ANY, COLOR_NONE, "ps", "ps %s ", - cm_id_ps_to_str(ps)); + print_string(PRINT_ANY, "ps", "ps %s ", cm_id_ps_to_str(ps)); } -static void print_ipaddr(struct rd *rd, const char *key, char *addrstr, - uint16_t port) +static void print_ipaddr(const char *key, char *addrstr, uint16_t port) { int name_size = INET6_ADDRSTRLEN + strlen(":65535"); char json_name[name_size]; snprintf(json_name, name_size, "%s:%u", addrstr, port); - print_color_string(PRINT_ANY, COLOR_NONE, key, key, json_name); - print_color_string(PRINT_FP, COLOR_NONE, NULL, " %s:", addrstr); - print_color_uint(PRINT_FP, COLOR_NONE, NULL, "%u ", port); + print_string(PRINT_ANY, key, key, json_name); + print_string(PRINT_FP, NULL, " %s:", addrstr); + print_uint(PRINT_FP, NULL, "%u ", port); } static int ss_ntop(struct nlattr *nla_line, char *addr_str, uint16_t *port) @@ -102,6 +99,7 @@ static int res_cm_id_line(struct rd *rd, const char *name, int idx, uint32_t lqpn = 0, ps; uint32_t cm_idn = 0; char *comm = NULL; + SPRINT_BUF(b); if (!nla_line[RDMA_NLDEV_ATTR_RES_STATE] || !nla_line[RDMA_NLDEV_ATTR_RES_PS]) @@ -159,8 +157,6 @@ static int res_cm_id_line(struct rd *rd, const char *name, int idx, goto out; if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { - SPRINT_BUF(b); - pid = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PID]); if (!get_task_name(pid, b, sizeof(b))) comm = b; @@ -181,24 +177,24 @@ static int res_cm_id_line(struct rd *rd, const char *name, int idx, goto out; open_json_object(NULL); - print_link(rd, idx, name, port, nla_line); - res_print_u32(rd, "cm-idn", cm_idn, - nla_line[RDMA_NLDEV_ATTR_RES_CM_IDN]); - res_print_u32(rd, "lqpn", lqpn, nla_line[RDMA_NLDEV_ATTR_RES_LQPN]); + print_link(idx, name, port, nla_line); + res_print_u32("cm-idn", cm_idn, nla_line[RDMA_NLDEV_ATTR_RES_CM_IDN]); + res_print_u32("lqpn", lqpn, nla_line[RDMA_NLDEV_ATTR_RES_LQPN]); if (nla_line[RDMA_NLDEV_ATTR_RES_TYPE]) - print_qp_type(rd, type); - print_cm_id_state(rd, state); - print_ps(rd, ps); - res_print_u32(rd, "pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]); - print_comm(rd, comm, nla_line); + print_qp_type(type); + print_cm_id_state(state); + print_ps(ps); + res_print_u32("pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]); + print_comm(comm, nla_line); if (nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR]) - print_ipaddr(rd, "src-addr", src_addr_str, src_port); + print_ipaddr("src-addr", src_addr_str, src_port); if (nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR]) - print_ipaddr(rd, "dst-addr", dst_addr_str, dst_port); + print_ipaddr("dst-addr", dst_addr_str, dst_port); print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); - newline(rd); + close_json_object(); + newline(); out: return MNL_CB_OK; diff --git a/rdma/res-cq.c b/rdma/res-cq.c index 2cfa4994e..0cab3fe04 100644 --- a/rdma/res-cq.c +++ b/rdma/res-cq.c @@ -17,15 +17,14 @@ static const char *poll_ctx_to_str(uint8_t idx) return "UNKNOWN"; } -static void print_poll_ctx(struct rd *rd, uint8_t poll_ctx, struct nlattr *attr) +static void print_poll_ctx(uint8_t poll_ctx, struct nlattr *attr) { if (!attr) return; - print_color_string(PRINT_ANY, COLOR_NONE, "poll-ctx", "poll-ctx %s ", - poll_ctx_to_str(poll_ctx)); + print_string(PRINT_ANY, "poll-ctx", "poll-ctx %s ", poll_ctx_to_str(poll_ctx)); } -static void print_cq_dim_setting(struct rd *rd, struct nlattr *attr) +static void print_cq_dim_setting(struct nlattr *attr) { uint8_t dim_setting; @@ -46,9 +45,10 @@ static int res_cq_line_raw(struct rd *rd, const char *name, int idx, return MNL_CB_ERROR; open_json_object(NULL); - print_dev(rd, idx, name); + print_dev(idx, name); print_raw_data(rd, nla_line); - newline(rd); + close_json_object(); + newline(); return MNL_CB_OK; } @@ -63,6 +63,7 @@ static int res_cq_line(struct rd *rd, const char *name, int idx, uint32_t cqn = 0; uint64_t users; uint32_t cqe; + SPRINT_BUF(b); if (!nla_line[RDMA_NLDEV_ATTR_RES_CQE] || !nla_line[RDMA_NLDEV_ATTR_RES_USECNT]) @@ -84,8 +85,6 @@ static int res_cq_line(struct rd *rd, const char *name, int idx, goto out; if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { - SPRINT_BUF(b); - pid = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PID]); if (!get_task_name(pid, b, sizeof(b))) comm = b; @@ -111,19 +110,19 @@ static int res_cq_line(struct rd *rd, const char *name, int idx, goto out; open_json_object(NULL); - print_dev(rd, idx, name); - res_print_u32(rd, "cqn", cqn, nla_line[RDMA_NLDEV_ATTR_RES_CQN]); - res_print_u32(rd, "cqe", cqe, nla_line[RDMA_NLDEV_ATTR_RES_CQE]); - res_print_u64(rd, "users", users, - nla_line[RDMA_NLDEV_ATTR_RES_USECNT]); - print_poll_ctx(rd, poll_ctx, nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX]); - print_cq_dim_setting(rd, nla_line[RDMA_NLDEV_ATTR_DEV_DIM]); - res_print_u32(rd, "ctxn", ctxn, nla_line[RDMA_NLDEV_ATTR_RES_CTXN]); - res_print_u32(rd, "pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]); - print_comm(rd, comm, nla_line); + print_dev(idx, name); + res_print_u32("cqn", cqn, nla_line[RDMA_NLDEV_ATTR_RES_CQN]); + res_print_u32("cqe", cqe, nla_line[RDMA_NLDEV_ATTR_RES_CQE]); + res_print_u64("users", users, nla_line[RDMA_NLDEV_ATTR_RES_USECNT]); + print_poll_ctx(poll_ctx, nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX]); + print_cq_dim_setting(nla_line[RDMA_NLDEV_ATTR_DEV_DIM]); + res_print_u32("ctxn", ctxn, nla_line[RDMA_NLDEV_ATTR_RES_CTXN]); + res_print_u32("pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]); + print_comm(comm, nla_line); print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); - newline(rd); + close_json_object(); + newline(); out: return MNL_CB_OK; diff --git a/rdma/res-ctx.c b/rdma/res-ctx.c index 500186d9f..235c837ac 100644 --- a/rdma/res-ctx.c +++ b/rdma/res-ctx.c @@ -13,13 +13,12 @@ static int res_ctx_line(struct rd *rd, const char *name, int idx, char *comm = NULL; uint32_t ctxn = 0; uint32_t pid = 0; + SPRINT_BUF(b); if (!nla_line[RDMA_NLDEV_ATTR_RES_CTXN]) return MNL_CB_ERROR; if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { - SPRINT_BUF(b); - pid = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PID]); if (!get_task_name(pid, b, sizeof(b))) comm = b; @@ -41,13 +40,14 @@ static int res_ctx_line(struct rd *rd, const char *name, int idx, goto out; open_json_object(NULL); - print_dev(rd, idx, name); - res_print_u32(rd, "ctxn", ctxn, nla_line[RDMA_NLDEV_ATTR_RES_CTXN]); - res_print_u32(rd, "pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]); - print_comm(rd, comm, nla_line); + print_dev(idx, name); + res_print_u32("ctxn", ctxn, nla_line[RDMA_NLDEV_ATTR_RES_CTXN]); + res_print_u32("pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]); + print_comm(comm, nla_line); print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); - newline(rd); + close_json_object(); + newline(); out: return MNL_CB_OK; diff --git a/rdma/res-mr.c b/rdma/res-mr.c index fb48d5df6..f6c2534aa 100644 --- a/rdma/res-mr.c +++ b/rdma/res-mr.c @@ -14,9 +14,10 @@ static int res_mr_line_raw(struct rd *rd, const char *name, int idx, return MNL_CB_ERROR; open_json_object(NULL); - print_dev(rd, idx, name); + print_dev(idx, name); print_raw_data(rd, nla_line); - newline(rd); + close_json_object(); + newline(); return MNL_CB_OK; } @@ -30,6 +31,7 @@ static int res_mr_line(struct rd *rd, const char *name, int idx, uint32_t pdn = 0; uint32_t mrn = 0; uint32_t pid = 0; + SPRINT_BUF(b); if (!nla_line[RDMA_NLDEV_ATTR_RES_MRLEN]) return MNL_CB_ERROR; @@ -47,8 +49,6 @@ static int res_mr_line(struct rd *rd, const char *name, int idx, goto out; if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { - SPRINT_BUF(b); - pid = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PID]); if (!get_task_name(pid, b, sizeof(b))) comm = b; @@ -75,19 +75,20 @@ static int res_mr_line(struct rd *rd, const char *name, int idx, goto out; open_json_object(NULL); - print_dev(rd, idx, name); - res_print_u32(rd, "mrn", mrn, nla_line[RDMA_NLDEV_ATTR_RES_MRN]); - print_key(rd, "rkey", rkey, nla_line[RDMA_NLDEV_ATTR_RES_RKEY]); - print_key(rd, "lkey", lkey, nla_line[RDMA_NLDEV_ATTR_RES_LKEY]); - print_key(rd, "iova", iova, nla_line[RDMA_NLDEV_ATTR_RES_IOVA]); - res_print_u64(rd, "mrlen", mrlen, nla_line[RDMA_NLDEV_ATTR_RES_MRLEN]); - res_print_u32(rd, "pdn", pdn, nla_line[RDMA_NLDEV_ATTR_RES_PDN]); - res_print_u32(rd, "pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]); - print_comm(rd, comm, nla_line); + print_dev(idx, name); + res_print_u32("mrn", mrn, nla_line[RDMA_NLDEV_ATTR_RES_MRN]); + print_key("rkey", rkey, nla_line[RDMA_NLDEV_ATTR_RES_RKEY]); + print_key("lkey", lkey, nla_line[RDMA_NLDEV_ATTR_RES_LKEY]); + print_key("iova", iova, nla_line[RDMA_NLDEV_ATTR_RES_IOVA]); + res_print_u64("mrlen", mrlen, nla_line[RDMA_NLDEV_ATTR_RES_MRLEN]); + res_print_u32("pdn", pdn, nla_line[RDMA_NLDEV_ATTR_RES_PDN]); + res_print_u32("pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]); + print_comm(comm, nla_line); print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); print_raw_data(rd, nla_line); - newline(rd); + close_json_object(); + newline(); out: return MNL_CB_OK; diff --git a/rdma/res-pd.c b/rdma/res-pd.c index 66f91f428..8b9f7aa68 100644 --- a/rdma/res-pd.c +++ b/rdma/res-pd.c @@ -16,6 +16,7 @@ static int res_pd_line(struct rd *rd, const char *name, int idx, uint32_t pid = 0; uint32_t pdn = 0; uint64_t users; + SPRINT_BUF(b); if (!nla_line[RDMA_NLDEV_ATTR_RES_USECNT]) return MNL_CB_ERROR; @@ -34,8 +35,6 @@ static int res_pd_line(struct rd *rd, const char *name, int idx, nla_line[RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY]); if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { - SPRINT_BUF(b); - pid = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PID]); if (!get_task_name(pid, b, sizeof(b))) comm = b; @@ -63,21 +62,20 @@ static int res_pd_line(struct rd *rd, const char *name, int idx, goto out; open_json_object(NULL); - print_dev(rd, idx, name); - res_print_u32(rd, "pdn", pdn, nla_line[RDMA_NLDEV_ATTR_RES_PDN]); - print_key(rd, "local_dma_lkey", local_dma_lkey, + print_dev(idx, name); + res_print_u32("pdn", pdn, nla_line[RDMA_NLDEV_ATTR_RES_PDN]); + print_key("local_dma_lkey", local_dma_lkey, nla_line[RDMA_NLDEV_ATTR_RES_LOCAL_DMA_LKEY]); - res_print_u64(rd, "users", users, - nla_line[RDMA_NLDEV_ATTR_RES_USECNT]); - print_key(rd, "unsafe_global_rkey", unsafe_global_rkey, + res_print_u64("users", users, nla_line[RDMA_NLDEV_ATTR_RES_USECNT]); + print_key("unsafe_global_rkey", unsafe_global_rkey, nla_line[RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY]); - res_print_u32(rd, "ctxn", ctxn, nla_line[RDMA_NLDEV_ATTR_RES_CTXN]); - res_print_u32(rd, "pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]); - print_comm(rd, comm, nla_line); + res_print_u32("ctxn", ctxn, nla_line[RDMA_NLDEV_ATTR_RES_CTXN]); + res_print_u32("pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]); + print_comm(comm, nla_line); print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); - newline(rd); - + close_json_object(); + newline(); out: return MNL_CB_OK; } diff --git a/rdma/res-qp.c b/rdma/res-qp.c index c180a97e3..65ff54ab7 100644 --- a/rdma/res-qp.c +++ b/rdma/res-qp.c @@ -28,40 +28,37 @@ static const char *qp_states_to_str(uint8_t idx) return "UNKNOWN"; } -static void print_rqpn(struct rd *rd, uint32_t val, struct nlattr **nla_line) +static void print_rqpn(uint32_t val, struct nlattr **nla_line) { if (!nla_line[RDMA_NLDEV_ATTR_RES_RQPN]) return; - print_color_uint(PRINT_ANY, COLOR_NONE, "rqpn", "rqpn %d ", val); + print_uint(PRINT_ANY, "rqpn", "rqpn %d ", val); } -static void print_type(struct rd *rd, uint32_t val) +static void print_type(uint32_t val) { - print_color_string(PRINT_ANY, COLOR_NONE, "type", "type %s ", - qp_types_to_str(val)); + print_string(PRINT_ANY, "type", "type %s ", qp_types_to_str(val)); } -static void print_state(struct rd *rd, uint32_t val) +static void print_state(uint32_t val) { - print_color_string(PRINT_ANY, COLOR_NONE, "state", "state %s ", - qp_states_to_str(val)); + print_string(PRINT_ANY, "state", "state %s ", qp_states_to_str(val)); } -static void print_rqpsn(struct rd *rd, uint32_t val, struct nlattr **nla_line) +static void print_rqpsn(uint32_t val, struct nlattr **nla_line) { if (!nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN]) return; - print_color_uint(PRINT_ANY, COLOR_NONE, "rq-psn", "rq-psn %d ", val); + print_uint(PRINT_ANY, "rq-psn", "rq-psn %d ", val); } -static void print_pathmig(struct rd *rd, uint32_t val, struct nlattr **nla_line) +static void print_pathmig(uint32_t val, struct nlattr **nla_line) { if (!nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]) return; - print_color_string(PRINT_ANY, COLOR_NONE, "path-mig-state", - "path-mig-state %s ", path_mig_to_str(val)); + print_string(PRINT_ANY, "path-mig-state", "path-mig-state %s ", path_mig_to_str(val)); } static int res_qp_line_raw(struct rd *rd, const char *name, int idx, @@ -71,9 +68,10 @@ static int res_qp_line_raw(struct rd *rd, const char *name, int idx, return MNL_CB_ERROR; open_json_object(NULL); - print_link(rd, idx, name, rd->port_idx, nla_line); + print_link(idx, name, rd->port_idx, nla_line); print_raw_data(rd, nla_line); - newline(rd); + close_json_object(); + newline(); return MNL_CB_OK; } @@ -86,6 +84,7 @@ static int res_qp_line(struct rd *rd, const char *name, int idx, uint32_t port = 0, pid = 0; uint32_t pdn = 0; char *comm = NULL; + SPRINT_BUF(b); if (!nla_line[RDMA_NLDEV_ATTR_RES_LQPN] || !nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN] || @@ -146,8 +145,6 @@ static int res_qp_line(struct rd *rd, const char *name, int idx, goto out; if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { - SPRINT_BUF(b); - pid = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PID]); if (!get_task_name(pid, b, sizeof(b))) comm = b; @@ -162,24 +159,24 @@ static int res_qp_line(struct rd *rd, const char *name, int idx, goto out; open_json_object(NULL); - print_link(rd, idx, name, port, nla_line); - res_print_u32(rd, "lqpn", lqpn, nla_line[RDMA_NLDEV_ATTR_RES_LQPN]); - print_rqpn(rd, rqpn, nla_line); + print_link(idx, name, port, nla_line); + res_print_u32("lqpn", lqpn, nla_line[RDMA_NLDEV_ATTR_RES_LQPN]); + print_rqpn(rqpn, nla_line); - print_type(rd, type); - print_state(rd, state); + print_type(type); + print_state(state); - print_rqpsn(rd, rq_psn, nla_line); - res_print_u32(rd, "sq-psn", sq_psn, - nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN]); + print_rqpsn(rq_psn, nla_line); + res_print_u32("sq-psn", sq_psn, nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN]); - print_pathmig(rd, path_mig_state, nla_line); - res_print_u32(rd, "pdn", pdn, nla_line[RDMA_NLDEV_ATTR_RES_PDN]); - res_print_u32(rd, "pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]); - print_comm(rd, comm, nla_line); + print_pathmig(path_mig_state, nla_line); + res_print_u32("pdn", pdn, nla_line[RDMA_NLDEV_ATTR_RES_PDN]); + res_print_u32("pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]); + print_comm(comm, nla_line); print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); - newline(rd); + close_json_object(); + newline(); out: return MNL_CB_OK; } diff --git a/rdma/res-srq.c b/rdma/res-srq.c index cf9209d77..8ab2538ae 100644 --- a/rdma/res-srq.c +++ b/rdma/res-srq.c @@ -20,10 +20,9 @@ static const char *srq_types_to_str(uint8_t idx) return "UNKNOWN"; } -static void print_type(struct rd *rd, uint32_t val) +static void print_type(uint32_t val) { - print_color_string(PRINT_ANY, COLOR_NONE, "type", "type %s ", - srq_types_to_str(val)); + print_string(PRINT_ANY, "type", "type %s ", srq_types_to_str(val)); } static void print_qps(char *qp_str) @@ -34,15 +33,15 @@ static void print_qps(char *qp_str) return; open_json_array(PRINT_ANY, "lqpn"); - print_color_string(PRINT_FP, COLOR_NONE, NULL, " ", NULL); + print_string(PRINT_FP, NULL, " ", NULL); qpn = strtok(qp_str, ","); while (qpn) { - print_color_string(PRINT_ANY, COLOR_NONE, NULL, "%s", qpn); + print_string(PRINT_ANY, NULL, "%s", qpn); qpn = strtok(NULL, ","); if (qpn) - print_color_string(PRINT_FP, COLOR_NONE, NULL, ",", NULL); + print_string(PRINT_FP, NULL, ",", NULL); } - print_color_string(PRINT_FP, COLOR_NONE, NULL, " ", NULL); + print_string(PRINT_FP, NULL, " ", NULL); close_json_array(PRINT_JSON, NULL); } @@ -169,9 +168,10 @@ static int res_srq_line_raw(struct rd *rd, const char *name, int idx, return MNL_CB_ERROR; open_json_object(NULL); - print_dev(rd, idx, name); + print_dev(idx, name); print_raw_data(rd, nla_line); - newline(rd); + close_json_object(); + newline(); return MNL_CB_OK; } @@ -183,13 +183,12 @@ static int res_srq_line(struct rd *rd, const char *name, int idx, char qp_str[MAX_QP_STR_LEN] = {}; char *comm = NULL; uint8_t type = 0; + SPRINT_BUF(b); if (!nla_line[RDMA_NLDEV_ATTR_RES_SRQN]) return MNL_CB_ERROR; if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { - SPRINT_BUF(b); - pid = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PID]); if (!get_task_name(pid, b, sizeof(b))) comm = b; @@ -232,17 +231,18 @@ static int res_srq_line(struct rd *rd, const char *name, int idx, goto out; open_json_object(NULL); - print_dev(rd, idx, name); - res_print_u32(rd, "srqn", srqn, nla_line[RDMA_NLDEV_ATTR_RES_SRQN]); - print_type(rd, type); + print_dev(idx, name); + res_print_u32("srqn", srqn, nla_line[RDMA_NLDEV_ATTR_RES_SRQN]); + print_type(type); print_qps(qp_str); - res_print_u32(rd, "pdn", pdn, nla_line[RDMA_NLDEV_ATTR_RES_PDN]); - res_print_u32(rd, "cqn", cqn, nla_line[RDMA_NLDEV_ATTR_RES_CQN]); - res_print_u32(rd, "pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]); - print_comm(rd, comm, nla_line); + res_print_u32("pdn", pdn, nla_line[RDMA_NLDEV_ATTR_RES_PDN]); + res_print_u32("cqn", cqn, nla_line[RDMA_NLDEV_ATTR_RES_CQN]); + res_print_u32("pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]); + print_comm(comm, nla_line); print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); - newline(rd); + close_json_object(); + newline(); out: return MNL_CB_OK; diff --git a/rdma/res.c b/rdma/res.c index 854f21c7c..3e024134d 100644 --- a/rdma/res.c +++ b/rdma/res.c @@ -29,7 +29,7 @@ static int res_help(struct rd *rd) return 0; } -static int res_print_summary(struct rd *rd, struct nlattr **tb) +static int res_print_summary(struct nlattr **tb) { struct nlattr *nla_table = tb[RDMA_NLDEV_ATTR_RES_SUMMARY]; struct nlattr *nla_entry; @@ -51,9 +51,7 @@ static int res_print_summary(struct rd *rd, struct nlattr **tb) name = mnl_attr_get_str(nla_line[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_NAME]); curr = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_CURR]); - res_print_u64( - rd, name, curr, - nla_line[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_CURR]); + res_print_u64(name, curr, nla_line[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_CURR]); } return 0; } @@ -66,7 +64,6 @@ static int res_no_args_idx_parse_cb(const struct nlmsghdr *nlh, void *data) static int res_no_args_parse_cb(const struct nlmsghdr *nlh, void *data) { struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; - struct rd *rd = data; const char *name; uint32_t idx; @@ -79,10 +76,12 @@ static int res_no_args_parse_cb(const struct nlmsghdr *nlh, void *data) idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); open_json_object(NULL); - print_color_uint(PRINT_ANY, COLOR_NONE, "ifindex", "%u: ", idx); - print_color_string(PRINT_ANY, COLOR_NONE, "ifname", "%s: ", name); - res_print_summary(rd, tb); - newline(rd); + print_uint(PRINT_ANY, "ifindex", "%u: ", idx); + print_string(PRINT_ANY, "ifname", "%s: ", name); + res_print_summary(tb); + close_json_object(); + newline(); + return MNL_CB_OK; } @@ -154,76 +153,70 @@ const char *qp_types_to_str(uint8_t idx) return (idx == 0xFF) ? "DRIVER" : "UNKNOWN"; } -void print_comm(struct rd *rd, const char *str, struct nlattr **nla_line) +void print_comm(const char *str, struct nlattr **nla_line) { char tmp[18]; if (!str) return; - if (nla_line[RDMA_NLDEV_ATTR_RES_PID] || rd->json_output) + if (nla_line[RDMA_NLDEV_ATTR_RES_PID] || is_json_context()) snprintf(tmp, sizeof(tmp), "%s", str); else snprintf(tmp, sizeof(tmp), "[%s]", str); - print_color_string(PRINT_ANY, COLOR_NONE, "comm", "comm %s ", tmp); + print_string(PRINT_ANY, "comm", "comm %s ", tmp); } -void print_dev(struct rd *rd, uint32_t idx, const char *name) +void print_dev(uint32_t idx, const char *name) { - print_color_int(PRINT_ANY, COLOR_NONE, "ifindex", NULL, idx); - print_color_string(PRINT_ANY, COLOR_NONE, "ifname", "dev %s ", name); + print_int(PRINT_ANY, "ifindex", NULL, idx); + print_string(PRINT_ANY, "ifname", "dev %s ", name); } -void print_link(struct rd *rd, uint32_t idx, const char *name, uint32_t port, +void print_link(uint32_t idx, const char *name, uint32_t port, struct nlattr **nla_line) { char tmp[64] = {}; - print_color_uint(PRINT_JSON, COLOR_NONE, "ifindex", NULL, idx); - print_color_string(PRINT_ANY, COLOR_NONE, "ifname", NULL, name); + print_uint(PRINT_JSON, "ifindex", NULL, idx); + print_string(PRINT_ANY, "ifname", NULL, name); if (nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]) { - print_color_uint(PRINT_ANY, COLOR_NONE, "port", NULL, port); + print_uint(PRINT_ANY, "port", NULL, port); snprintf(tmp, sizeof(tmp), "%s/%d", name, port); } else { snprintf(tmp, sizeof(tmp), "%s/-", name); } - if (!rd->json_output) - print_color_string(PRINT_ANY, COLOR_NONE, NULL, "link %s ", - tmp); + print_string(PRINT_FP, NULL, "link %s ", tmp); } -void print_qp_type(struct rd *rd, uint32_t val) +void print_qp_type(uint32_t val) { - print_color_string(PRINT_ANY, COLOR_NONE, "qp-type", "qp-type %s ", - qp_types_to_str(val)); + print_string(PRINT_ANY, "qp-type", "qp-type %s ", qp_types_to_str(val)); } -void print_key(struct rd *rd, const char *name, uint64_t val, - struct nlattr *nlattr) +void print_key(const char *name, uint64_t val, struct nlattr *nlattr) { if (!nlattr) return; - print_color_string(PRINT_FP, COLOR_NONE, NULL, name, NULL); - print_color_hex(PRINT_ANY, COLOR_NONE, name, " 0x%" PRIx64 " ", val); + print_string(PRINT_FP, NULL, name, NULL); + print_hex(PRINT_ANY, name, " 0x%" PRIx64 " ", val); } -void res_print_u32(struct rd *rd, const char *name, uint32_t val, - struct nlattr *nlattr) +void res_print_u32(const char *name, uint32_t val, struct nlattr *nlattr) { if (!nlattr) return; - print_color_uint(PRINT_ANY, COLOR_NONE, name, name, val); - print_color_uint(PRINT_FP, COLOR_NONE, NULL, " %" PRIu32 " ", val); + print_uint(PRINT_ANY, name, name, val); + print_uint(PRINT_FP, NULL, " %" PRIu32 " ", val); } -void res_print_u64(struct rd *rd, const char *name, uint64_t val, - struct nlattr *nlattr) +void res_print_u64(const char *name, uint64_t val, struct nlattr *nlattr) { if (!nlattr) return; - print_color_u64(PRINT_ANY, COLOR_NONE, name, name, val); - print_color_u64(PRINT_FP, COLOR_NONE, NULL, " %" PRIu64 " ", val); + print_u64(PRINT_ANY, name, name, val); + print_u64(PRINT_FP, NULL, " %" PRIu64 " ", val); } RES_FUNC(res_no_args, RDMA_NLDEV_CMD_RES_GET, NULL, true, 0); diff --git a/rdma/res.h b/rdma/res.h index e880c28be..fd09ce7dc 100644 --- a/rdma/res.h +++ b/rdma/res.h @@ -185,16 +185,12 @@ struct filters srq_valid_filters[MAX_NUMBER_OF_FILTERS] = { RES_FUNC(res_srq, RDMA_NLDEV_CMD_RES_SRQ_GET, srq_valid_filters, true, RDMA_NLDEV_ATTR_RES_SRQN); -void print_dev(struct rd *rd, uint32_t idx, const char *name); -void print_link(struct rd *rd, uint32_t idx, const char *name, uint32_t port, - struct nlattr **nla_line); -void print_key(struct rd *rd, const char *name, uint64_t val, - struct nlattr *nlattr); -void res_print_u32(struct rd *rd, const char *name, uint32_t val, - struct nlattr *nlattr); -void res_print_u64(struct rd *rd, const char *name, uint64_t val, - struct nlattr *nlattr); -void print_comm(struct rd *rd, const char *str, struct nlattr **nla_line); +void print_dev(uint32_t idx, const char *name); +void print_link(uint32_t idx, const char *name, uint32_t port, struct nlattr **nla_line); +void print_key(const char *name, uint64_t val, struct nlattr *nlattr); +void res_print_u32(const char *name, uint32_t val, struct nlattr *nlattr); +void res_print_u64(const char *name, uint64_t val, struct nlattr *nlattr); +void print_comm(const char *str, struct nlattr **nla_line); const char *qp_types_to_str(uint8_t idx); -void print_qp_type(struct rd *rd, uint32_t val); +void print_qp_type(uint32_t val); #endif /* _RDMA_TOOL_RES_H_ */ diff --git a/rdma/stat-mr.c b/rdma/stat-mr.c index 2ba6cb076..8f9eb17f0 100644 --- a/rdma/stat-mr.c +++ b/rdma/stat-mr.c @@ -21,17 +21,17 @@ static int stat_mr_line(struct rd *rd, const char *name, int idx, goto out; open_json_object(NULL); - print_dev(rd, idx, name); - res_print_u32(rd, "mrn", mrn, nla_line[RDMA_NLDEV_ATTR_RES_MRN]); + print_dev(idx, name); + res_print_u32("mrn", mrn, nla_line[RDMA_NLDEV_ATTR_RES_MRN]); if (nla_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTERS]) { - ret = res_get_hwcounters( - rd, nla_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTERS], true); + ret = res_get_hwcounters(nla_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTERS], true); if (ret != MNL_CB_OK) return ret; } - newline(rd); + close_json_object(); + print_nl(); out: return MNL_CB_OK; } diff --git a/rdma/stat.c b/rdma/stat.c index 3df2c98f4..bf78f7cc7 100644 --- a/rdma/stat.c +++ b/rdma/stat.c @@ -62,8 +62,7 @@ static struct counter_param auto_params[] = { { NULL }, }; -static int prepare_auto_mode_str(struct nlattr **tb, uint32_t mask, - char *output, int len) +static int prepare_auto_mode_str(uint32_t mask, char *output, int len) { char s[] = "qp auto"; int i, outlen = strlen(s); @@ -105,7 +104,6 @@ static int qp_link_get_mode_parse_cb(const struct nlmsghdr *nlh, void *data) struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; uint32_t mode = 0, mask = 0; char output[128] = {}; - struct rd *rd = data; uint32_t idx, port; const char *name; @@ -128,15 +126,17 @@ static int qp_link_get_mode_parse_cb(const struct nlmsghdr *nlh, void *data) if (!tb[RDMA_NLDEV_ATTR_STAT_AUTO_MODE_MASK]) return MNL_CB_ERROR; mask = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_STAT_AUTO_MODE_MASK]); - prepare_auto_mode_str(tb, mask, output, sizeof(output)); + prepare_auto_mode_str(mask, output, sizeof(output)); } else { snprintf(output, sizeof(output), "qp auto off"); } open_json_object(NULL); - print_link(rd, idx, name, port, tb); - print_color_string(PRINT_ANY, COLOR_NONE, "mode", "mode %s ", output); - newline(rd); + print_link(idx, name, port, tb); + print_string(PRINT_ANY, "mode", "mode %s ", output); + close_json_object(); + newline(); + return MNL_CB_OK; } @@ -184,7 +184,7 @@ static int stat_qp_get_mode(struct rd *rd) return rd_exec_cmd(rd, cmds, "parameter"); } -int res_get_hwcounters(struct rd *rd, struct nlattr *hwc_table, bool print) +int res_get_hwcounters(struct nlattr *hwc_table, bool print) { struct nlattr *nla_entry; const char *nm; @@ -208,9 +208,8 @@ int res_get_hwcounters(struct rd *rd, struct nlattr *hwc_table, bool print) nm = mnl_attr_get_str(hw_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_NAME]); v = mnl_attr_get_u64(hw_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_VALUE]); - if (rd->pretty_output && !rd->json_output) - newline_indent(rd); - res_print_u64(rd, nm, v, hw_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_NAME]); + newline_indent(); + res_print_u64(nm, v, hw_line[RDMA_NLDEV_ATTR_STAT_HWCOUNTER_ENTRY_NAME]); } return MNL_CB_OK; @@ -223,6 +222,7 @@ static int res_counter_line(struct rd *rd, const char *name, int index, struct nlattr *hwc_table, *qp_table; struct nlattr *nla_entry; const char *comm = NULL; + SPRINT_BUF(b); bool isfirst; int err; @@ -248,8 +248,6 @@ static int res_counter_line(struct rd *rd, const char *name, int index, return MNL_CB_OK; if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { - SPRINT_BUF(b); - pid = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PID]); if (!get_task_name(pid, b, sizeof(b))) comm = b; @@ -279,20 +277,20 @@ static int res_counter_line(struct rd *rd, const char *name, int index, return MNL_CB_OK; } - err = res_get_hwcounters(rd, hwc_table, false); + err = res_get_hwcounters(hwc_table, false); if (err != MNL_CB_OK) return err; open_json_object(NULL); - print_link(rd, index, name, port, nla_line); - print_color_uint(PRINT_ANY, COLOR_NONE, "cntn", "cntn %u ", cntn); + print_link(index, name, port, nla_line); + print_uint(PRINT_ANY, "cntn", "cntn %u ", cntn); if (nla_line[RDMA_NLDEV_ATTR_RES_TYPE]) - print_qp_type(rd, qp_type); - res_print_u64(rd, "pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]); - print_comm(rd, comm, nla_line); - res_get_hwcounters(rd, hwc_table, true); + print_qp_type(qp_type); + res_print_u64("pid", pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]); + print_comm(comm, nla_line); + res_get_hwcounters(hwc_table, true); isfirst = true; open_json_array(PRINT_JSON, "lqpn"); - print_color_string(PRINT_FP, COLOR_NONE, NULL, "\n LQPN: <", NULL); + print_string(PRINT_FP, NULL, "%s LQPN: <", _SL_); mnl_attr_for_each_nested(nla_entry, qp_table) { struct nlattr *qp_line[RDMA_NLDEV_ATTR_MAX] = {}; err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, qp_line); @@ -304,13 +302,14 @@ static int res_counter_line(struct rd *rd, const char *name, int index, qpn = mnl_attr_get_u32(qp_line[RDMA_NLDEV_ATTR_RES_LQPN]); if (!isfirst) - print_color_string(PRINT_FP, COLOR_NONE, NULL, ",", - NULL); - print_color_uint(PRINT_ANY, COLOR_NONE, NULL, "%d", qpn); + print_string(PRINT_FP, NULL, ",", NULL); + print_uint(PRINT_ANY, NULL, "%d", qpn); isfirst = false; } close_json_array(PRINT_ANY, ">"); - newline(rd); + close_json_object(); + newline(); + return MNL_CB_OK; } @@ -759,7 +758,6 @@ static int do_stat_mode_parse_cb(const struct nlmsghdr *nlh, void *data, struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; struct nlattr *nla_entry; const char *dev, *name; - struct rd *rd = data; int enabled, err = 0; bool isfirst = true; uint32_t port; @@ -790,34 +788,29 @@ static int do_stat_mode_parse_cb(const struct nlmsghdr *nlh, void *data, if (supported || enabled) { if (isfirst) { open_json_object(NULL); - print_color_string(PRINT_ANY, COLOR_NONE, - "ifname", "link %s/", dev); - print_color_uint(PRINT_ANY, COLOR_NONE, "port", - "%u ", port); + print_string(PRINT_ANY, "ifname", "link %s/", dev); + print_uint(PRINT_ANY, "port", "%u ", port); if (supported) open_json_array(PRINT_ANY, - "supported optional-counters"); + "supported optional-counters"); else open_json_array(PRINT_ANY, "optional-counters"); - print_color_string(PRINT_FP, COLOR_NONE, NULL, - " ", NULL); + print_string(PRINT_FP, NULL, " ", NULL); isfirst = false; } else { - print_color_string(PRINT_FP, COLOR_NONE, NULL, - ",", NULL); + print_string(PRINT_FP, NULL, ",", NULL); } - if (rd->pretty_output && !rd->json_output) - newline_indent(rd); + newline_indent(); - print_color_string(PRINT_ANY, COLOR_NONE, NULL, "%s", - name); + print_string(PRINT_ANY, NULL, "%s", name); } } if (!isfirst) { close_json_array(PRINT_JSON, NULL); - newline(rd); + close_json_object(); + newline(); } return 0; @@ -1060,7 +1053,6 @@ static int stat_unset(struct rd *rd) static int stat_show_parse_cb(const struct nlmsghdr *nlh, void *data) { struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; - struct rd *rd = data; const char *name; uint32_t port; int ret; @@ -1074,11 +1066,12 @@ static int stat_show_parse_cb(const struct nlmsghdr *nlh, void *data) name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); port = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_PORT_INDEX]); open_json_object(NULL); - print_color_string(PRINT_ANY, COLOR_NONE, "ifname", "link %s/", name); - print_color_uint(PRINT_ANY, COLOR_NONE, "port", "%u ", port); - ret = res_get_hwcounters(rd, tb[RDMA_NLDEV_ATTR_STAT_HWCOUNTERS], true); + print_string(PRINT_ANY, "ifname", "link %s/", name); + print_uint(PRINT_ANY, "port", "%u ", port); + ret = res_get_hwcounters(tb[RDMA_NLDEV_ATTR_STAT_HWCOUNTERS], true); - newline(rd); + close_json_object(); + newline(); return ret; } diff --git a/rdma/stat.h b/rdma/stat.h index b03a10c9e..5adcf4f37 100644 --- a/rdma/stat.h +++ b/rdma/stat.h @@ -9,9 +9,7 @@ #include "rdma.h" -int res_get_hwcounters(struct rd *rd, struct nlattr *hwc_table, - bool print); - +int res_get_hwcounters(struct nlattr *hwc_table, bool print); int stat_mr_parse_cb(const struct nlmsghdr *nlh, void *data); int stat_mr_idx_parse_cb(const struct nlmsghdr *nlh, void *data); diff --git a/rdma/sys.c b/rdma/sys.c index 3e369553f..7dbe44094 100644 --- a/rdma/sys.c +++ b/rdma/sys.c @@ -36,8 +36,7 @@ static int sys_show_parse_cb(const struct nlmsghdr *nlh, void *data) else mode_str = "unknown"; - print_color_string(PRINT_ANY, COLOR_NONE, "netns", "netns %s ", - mode_str); + print_string(PRINT_ANY, "netns", "netns %s ", mode_str); } if (tb[RDMA_NLDEV_SYS_ATTR_PRIVILEGED_QKEY_MODE]) { @@ -45,17 +44,15 @@ static int sys_show_parse_cb(const struct nlmsghdr *nlh, void *data) mode = mnl_attr_get_u8(tb[RDMA_NLDEV_SYS_ATTR_PRIVILEGED_QKEY_MODE]); - print_color_on_off(PRINT_ANY, COLOR_NONE, "privileged-qkey", - "privileged-qkey %s ", mode); + print_on_off(PRINT_ANY, "privileged-qkey", "privileged-qkey %s ", mode); } if (tb[RDMA_NLDEV_SYS_ATTR_COPY_ON_FORK]) cof = mnl_attr_get_u8(tb[RDMA_NLDEV_SYS_ATTR_COPY_ON_FORK]); - print_color_on_off(PRINT_ANY, COLOR_NONE, "copy-on-fork", - "copy-on-fork %s\n", - cof); + print_on_off(PRINT_ANY, "copy-on-fork", "copy-on-fork %s", cof); + print_nl(); return MNL_CB_OK; } diff --git a/rdma/utils.c b/rdma/utils.c index 099850693..27595a387 100644 --- a/rdma/utils.c +++ b/rdma/utils.c @@ -572,7 +572,7 @@ int rd_exec_link(struct rd *rd, int (*cb)(struct rd *rd), bool strict_port) uint32_t port; int ret = 0; - new_json_obj(rd->json_output); + new_json_obj(json); if (rd_no_arg(rd)) { list_for_each_entry(dev_map, &rd->dev_map_list, list) { rd->dev_idx = dev_map->idx; @@ -621,7 +621,7 @@ int rd_exec_dev(struct rd *rd, int (*cb)(struct rd *rd)) struct dev_map *dev_map; int ret = 0; - new_json_obj(rd->json_output); + new_json_obj(json); if (rd_no_arg(rd)) { list_for_each_entry(dev_map, &rd->dev_map_list, list) { rd->dev_idx = dev_map->idx; @@ -642,6 +642,7 @@ int rd_exec_dev(struct rd *rd, int (*cb)(struct rd *rd)) } out: delete_json_obj(); + return ret; } @@ -771,30 +772,31 @@ struct dev_map *dev_map_lookup(struct rd *rd, bool allow_port_index) #define nla_type(attr) ((attr)->nla_type & NLA_TYPE_MASK) -void newline(struct rd *rd) +/* End of device object always print a newline */ +void newline(void) { - close_json_object(); - print_color_string(PRINT_FP, COLOR_NONE, NULL, "\n", NULL); + putchar('\n'); + fflush(stdout); } -void newline_indent(struct rd *rd) +/* End of partial multi-line segment of a device object */ +void newline_indent(void) { - newline(rd); - print_color_string(PRINT_FP, COLOR_NONE, NULL, " ", NULL); + if (!is_json_context()) + printf("%s ", _SL_); } -static int print_driver_string(struct rd *rd, const char *key_str, - const char *val_str) +static int print_driver_string(const char *key_str, const char *val_str) { - print_color_string(PRINT_ANY, COLOR_NONE, key_str, key_str, val_str); - print_color_string(PRINT_FP, COLOR_NONE, NULL, " %s ", val_str); + print_string(PRINT_ANY, key_str, key_str, val_str); + print_string(PRINT_FP, NULL, " %s ", val_str); return 0; } -static int print_driver_s32(struct rd *rd, const char *key_str, int32_t val, - enum rdma_nldev_print_type print_type) +static int print_driver_s32(const char *key_str, int32_t val, + enum rdma_nldev_print_type print_type) { - if (!rd->json_output) { + if (!is_json_context()) { switch (print_type) { case RDMA_NLDEV_PRINT_TYPE_UNSPEC: return pr_out("%s %d ", key_str, val); @@ -804,14 +806,14 @@ static int print_driver_s32(struct rd *rd, const char *key_str, int32_t val, return -EINVAL; } } - print_color_int(PRINT_JSON, COLOR_NONE, key_str, NULL, val); + print_int(PRINT_JSON, key_str, NULL, val); return 0; } -static int print_driver_u32(struct rd *rd, const char *key_str, uint32_t val, - enum rdma_nldev_print_type print_type) +static int print_driver_u32(const char *key_str, uint32_t val, + enum rdma_nldev_print_type print_type) { - if (!rd->json_output) { + if (!is_json_context()) { switch (print_type) { case RDMA_NLDEV_PRINT_TYPE_UNSPEC: return pr_out("%s %u ", key_str, val); @@ -821,14 +823,14 @@ static int print_driver_u32(struct rd *rd, const char *key_str, uint32_t val, return -EINVAL; } } - print_color_int(PRINT_JSON, COLOR_NONE, key_str, NULL, val); + print_int(PRINT_JSON, key_str, NULL, val); return 0; } -static int print_driver_s64(struct rd *rd, const char *key_str, int64_t val, - enum rdma_nldev_print_type print_type) +static int print_driver_s64(const char *key_str, int64_t val, + enum rdma_nldev_print_type print_type) { - if (!rd->json_output) { + if (!is_json_context()) { switch (print_type) { case RDMA_NLDEV_PRINT_TYPE_UNSPEC: return pr_out("%s %" PRId64 " ", key_str, val); @@ -838,14 +840,14 @@ static int print_driver_s64(struct rd *rd, const char *key_str, int64_t val, return -EINVAL; } } - print_color_int(PRINT_JSON, COLOR_NONE, key_str, NULL, val); + print_int(PRINT_JSON, key_str, NULL, val); return 0; } -static int print_driver_u64(struct rd *rd, const char *key_str, uint64_t val, - enum rdma_nldev_print_type print_type) +static int print_driver_u64(const char *key_str, uint64_t val, + enum rdma_nldev_print_type print_type) { - if (!rd->json_output) { + if (!is_json_context()) { switch (print_type) { case RDMA_NLDEV_PRINT_TYPE_UNSPEC: return pr_out("%s %" PRIu64 " ", key_str, val); @@ -855,13 +857,12 @@ static int print_driver_u64(struct rd *rd, const char *key_str, uint64_t val, return -EINVAL; } } - print_color_int(PRINT_JSON, COLOR_NONE, key_str, NULL, val); + print_int(PRINT_JSON, key_str, NULL, val); return 0; } -static int print_driver_entry(struct rd *rd, struct nlattr *key_attr, - struct nlattr *val_attr, - enum rdma_nldev_print_type print_type) +static int print_driver_entry(struct nlattr *key_attr, struct nlattr *val_attr, + enum rdma_nldev_print_type print_type) { int attr_type = nla_type(val_attr); int ret = -EINVAL; @@ -872,24 +873,19 @@ static int print_driver_entry(struct rd *rd, struct nlattr *key_attr, switch (attr_type) { case RDMA_NLDEV_ATTR_DRIVER_STRING: - ret = print_driver_string(rd, key_str, - mnl_attr_get_str(val_attr)); + ret = print_driver_string(key_str, mnl_attr_get_str(val_attr)); break; case RDMA_NLDEV_ATTR_DRIVER_S32: - ret = print_driver_s32(rd, key_str, mnl_attr_get_u32(val_attr), - print_type); + ret = print_driver_s32(key_str, mnl_attr_get_u32(val_attr), print_type); break; case RDMA_NLDEV_ATTR_DRIVER_U32: - ret = print_driver_u32(rd, key_str, mnl_attr_get_u32(val_attr), - print_type); + ret = print_driver_u32(key_str, mnl_attr_get_u32(val_attr), print_type); break; case RDMA_NLDEV_ATTR_DRIVER_S64: - ret = print_driver_s64(rd, key_str, mnl_attr_get_u64(val_attr), - print_type); + ret = print_driver_s64(key_str, mnl_attr_get_u64(val_attr), print_type); break; case RDMA_NLDEV_ATTR_DRIVER_U64: - ret = print_driver_u64(rd, key_str, mnl_attr_get_u64(val_attr), - print_type); + ret = print_driver_u64(key_str, mnl_attr_get_u64(val_attr), print_type); break; } free(key_str); @@ -909,7 +905,7 @@ void print_raw_data(struct rd *rd, struct nlattr **nla_line) data = mnl_attr_get_payload(nla_line[RDMA_NLDEV_ATTR_RES_RAW]); open_json_array(PRINT_JSON, "data"); while (i < len) { - print_color_uint(PRINT_ANY, COLOR_NONE, NULL, "%d", data[i]); + print_uint(PRINT_ANY, NULL, "%d", data[i]); i++; } close_json_array(PRINT_ANY, ">"); @@ -925,8 +921,7 @@ void print_driver_table(struct rd *rd, struct nlattr *tb) if (!rd->show_driver_details || !tb) return; - if (rd->pretty_output) - newline_indent(rd); + newline_indent(); /* * Driver attrs are tuples of {key, [print-type], value}. @@ -938,8 +933,7 @@ void print_driver_table(struct rd *rd, struct nlattr *tb) mnl_attr_for_each_nested(tb_entry, tb) { if (cc > MAX_LINE_LENGTH) { - if (rd->pretty_output) - newline_indent(rd); + newline_indent(); cc = 0; } if (rd_attr_check(tb_entry, &type) != MNL_CB_OK) @@ -952,7 +946,7 @@ void print_driver_table(struct rd *rd, struct nlattr *tb) print_type = mnl_attr_get_u8(tb_entry); } else { val = tb_entry; - ret = print_driver_entry(rd, key, val, print_type); + ret = print_driver_entry(key, val, print_type); if (ret < 0) return; cc += ret; |