aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Ahern <dsahern@kernel.org>2024-01-08 19:25:43 +0000
committerDavid Ahern <dsahern@kernel.org>2024-01-08 19:25:43 +0000
commit97d3edd74383628a01d7d6a1197196dd500d5357 (patch)
tree3b93e399a62fcd92a0728484cc74f2879fb4714d
parent45dc10463dd5a51eef944b110a4f046feb1b46db (diff)
parent3dc3445bbfa9b84d4166e5837f8d5a4994faf2e7 (diff)
downloadiproute2-97d3edd74383628a01d7d6a1197196dd500d5357.tar.gz
Merge remote-tracking branch 'main/main' into next
Signed-off-by: David Ahern <dsahern@kernel.org>
-rw-r--r--bridge/bridge.c2
-rw-r--r--bridge/vlan.c38
-rw-r--r--bridge/vni.c113
-rwxr-xr-xconfigure47
-rw-r--r--include/json_print.h2
-rw-r--r--include/libnetlink.h4
-rw-r--r--include/version.h2
-rw-r--r--ip/ipaddress.c2
-rw-r--r--ip/iplink.c4
-rw-r--r--lib/json_print.c15
-rw-r--r--lib/mnl_utils.c7
-rw-r--r--man/man8/ip-address.8.in4
-rw-r--r--man/man8/ip-link.8.in9
-rw-r--r--man/man8/ip-route.8.in36
-rw-r--r--man/man8/rdma.812
-rw-r--r--misc/lnstat.c4
-rw-r--r--misc/ss.c5
-rw-r--r--rdma/dev.c56
-rw-r--r--rdma/link.c66
-rw-r--r--rdma/rdma.c21
-rw-r--r--rdma/rdma.h11
-rw-r--r--rdma/res-cmid.c46
-rw-r--r--rdma/res-cq.c37
-rw-r--r--rdma/res-ctx.c14
-rw-r--r--rdma/res-mr.c29
-rw-r--r--rdma/res-pd.c24
-rw-r--r--rdma/res-qp.c57
-rw-r--r--rdma/res-srq.c38
-rw-r--r--rdma/res.c67
-rw-r--r--rdma/res.h18
-rw-r--r--rdma/stat-mr.c10
-rw-r--r--rdma/stat.c83
-rw-r--r--rdma/stat.h4
-rw-r--r--rdma/sys.c11
-rw-r--r--rdma/utils.c88
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 ||
diff --git a/configure b/configure
index 722a6a06e..928048b3d 100755
--- a/configure
+++ b/configure
@@ -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;
diff --git a/misc/ss.c b/misc/ss.c
index c220a0758..900fefa42 100644
--- a/misc/ss.c
+++ b/misc/ss.c
@@ -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(&current_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;