Acked-by: Jon Maloy <[email protected]>
> -----Original Message----- > From: Hoang Le <[email protected]> > Sent: Wednesday, 06 June, 2018 10:08 > To: [email protected]; Jon Maloy > <[email protected]>; [email protected]; [email protected] > Subject: [iproute2-next v2 2/2] tipc: JSON support for tipc link printouts > > Add json output support for tipc link command > > Example output: > $tipc -j -p link list > > [ { > "broadcast-link": "up", > "1.1.1:bridge-1.1.104:eth0": "up", > "1.1.1:bridge-1.1.105:eth0": "up", > "1.1.1:bridge-1.1.106:eth0": "up" > } ] > > -------------------- > $tipc -j -p link stat show link broadcast-link > > [ { > "link": "broadcast-link", > "window": 50, > "rx packets": { > "rx packets": 0, > "fragments": 0, > "fragmented": 0, > "bundles": 0, > "bundled": 0 > }, > "tx packets": { > "tx packets": 0, > "fragments": 0, > "fragmented": 0, > "bundles": 0, > "bundled": 0 > }, > "rx naks": { > "rx naks": 0, > "defs": 0, > "dups": 0 > }, > "tx naks": { > "tx naks": 0, > "acks": 0, > "retrans": 0 > }, > "congestion link": 0, > "send queue max": 0, > "avg": 0 > } ] > > v2: > Replace variable 'json_flag' by 'json' declared in include/utils.h > > Signed-off-by: Hoang Le <[email protected]> > --- > tipc/link.c | 414 +++++++++++++++++++++++++++++++++++++++----------- > ---------- > 1 file changed, 272 insertions(+), 142 deletions(-) > > diff --git a/tipc/link.c b/tipc/link.c > index 02f14aadefa6..26d1293f121a 100644 > --- a/tipc/link.c > +++ b/tipc/link.c > @@ -23,6 +23,11 @@ > #include "msg.h" > #include "link.h" > #include "bearer.h" > +#include "utils.h" > + > +#define PRIORITY_STR "priority" > +#define TOLERANCE_STR "tolerance" > +#define WINDOW_STR "window" > > static int link_list_cb(const struct nlmsghdr *nlh, void *data) { @@ -38,13 > +43,14 @@ static int link_list_cb(const struct nlmsghdr *nlh, void *data) > if (!attrs[TIPC_NLA_LINK_NAME]) > return MNL_CB_ERROR; > > - printf("%s: ", mnl_attr_get_str(attrs[TIPC_NLA_LINK_NAME])); > - > + print_string(PRINT_FP, NULL, "%s: ", > + mnl_attr_get_str(attrs[TIPC_NLA_LINK_NAME])); > if (attrs[TIPC_NLA_LINK_UP]) > - printf("up\n"); > + print_string(PRINT_ANY, > + > mnl_attr_get_str(attrs[TIPC_NLA_LINK_NAME]),"%s\n", "up"); > else > - printf("down\n"); > - > + print_string(PRINT_ANY, > + mnl_attr_get_str(attrs[TIPC_NLA_LINK_NAME]), > "%s\n", "down"); > return MNL_CB_OK; > } > > @@ -52,6 +58,7 @@ static int cmd_link_list(struct nlmsghdr *nlh, const struct > cmd *cmd, > struct cmdl *cmdl, void *data) > { > char buf[MNL_SOCKET_BUFFER_SIZE]; > + int err = 0; > > if (help_flag) { > fprintf(stderr, "Usage: %s link list\n", cmdl->argv[0]); @@ - > 64,7 +71,12 @@ static int cmd_link_list(struct nlmsghdr *nlh, const struct > cmd *cmd, > return -1; > } > > - return msg_dumpit(nlh, link_list_cb, NULL); > + new_json_obj(json); > + open_json_object(NULL); > + err = msg_dumpit(nlh, link_list_cb, NULL); > + close_json_object(); > + delete_json_obj(); > + return err; > } > > static int link_get_cb(const struct nlmsghdr *nlh, void *data) @@ -87,8 > +99,23 @@ static int link_get_cb(const struct nlmsghdr *nlh, void *data) > if (!props[*prop]) > return MNL_CB_ERROR; > > - printf("%u\n", mnl_attr_get_u32(props[*prop])); > - > + new_json_obj(json); > + open_json_object(NULL); > + switch (*prop) { > + case TIPC_NLA_PROP_PRIO: > + print_uint(PRINT_ANY, PRIORITY_STR, "%u\n", > mnl_attr_get_u32(props[*prop])); > + break; > + case TIPC_NLA_PROP_TOL: > + print_uint(PRINT_ANY, TOLERANCE_STR, "%u\n", > mnl_attr_get_u32(props[*prop])); > + break; > + case TIPC_NLA_PROP_WIN: > + print_uint(PRINT_ANY, WINDOW_STR, "%u\n", > mnl_attr_get_u32(props[*prop])); > + break; > + default: > + break; > + } > + close_json_object(); > + delete_json_obj(); > return MNL_CB_OK; > } > > @@ -103,11 +130,11 @@ static int cmd_link_get_prop(struct nlmsghdr *nlh, > const struct cmd *cmd, > { NULL } > }; > > - if (strcmp(cmd->cmd, "priority") == 0) > + if (strcmp(cmd->cmd, PRIORITY_STR) == 0) > prop = TIPC_NLA_PROP_PRIO; > - else if ((strcmp(cmd->cmd, "tolerance") == 0)) > + else if ((strcmp(cmd->cmd, TOLERANCE_STR) == 0)) > prop = TIPC_NLA_PROP_TOL; > - else if ((strcmp(cmd->cmd, "window") == 0)) > + else if ((strcmp(cmd->cmd, WINDOW_STR) == 0)) > prop = TIPC_NLA_PROP_WIN; > else > return -EINVAL; > @@ -150,9 +177,9 @@ static int cmd_link_get(struct nlmsghdr *nlh, const > struct cmd *cmd, > struct cmdl *cmdl, void *data) > { > const struct cmd cmds[] = { > - { "priority", cmd_link_get_prop, cmd_link_get_help }, > - { "tolerance", cmd_link_get_prop, cmd_link_get_help }, > - { "window", cmd_link_get_prop, cmd_link_get_help }, > + { PRIORITY_STR, cmd_link_get_prop, > cmd_link_get_help }, > + { TOLERANCE_STR, cmd_link_get_prop, > cmd_link_get_help }, > + { WINDOW_STR, cmd_link_get_prop, > cmd_link_get_help }, > { NULL } > }; > > @@ -211,109 +238,178 @@ static uint32_t perc(uint32_t count, uint32_t > total) > return (count * 100 + (total / 2)) / total; } > > -static int _show_link_stat(struct nlattr *attrs[], struct nlattr *prop[], > - struct nlattr *stats[]) > +static int _show_link_stat(const char *name, struct nlattr *attrs[], > + struct nlattr *prop[], struct nlattr *stats[]) > { > uint32_t proft; > > + open_json_object(NULL); > + > + print_string(PRINT_ANY, "link", "\nLink <%s>\n", name); > + print_string(PRINT_JSON, "state", "", NULL); > + open_json_array(PRINT_JSON, NULL); > if (attrs[TIPC_NLA_LINK_ACTIVE]) > - printf(" ACTIVE"); > + print_string(PRINT_ANY, NULL, " %s", "ACTIVE"); > else if (attrs[TIPC_NLA_LINK_UP]) > - printf(" STANDBY"); > + print_string(PRINT_ANY, NULL, " %s", "STANDBY"); > else > - printf(" DEFUNCT"); > - > - printf(" MTU:%u Priority:%u Tolerance:%u ms Window:%u > packets\n", > - mnl_attr_get_u32(attrs[TIPC_NLA_LINK_MTU]), > - mnl_attr_get_u32(prop[TIPC_NLA_PROP_PRIO]), > - mnl_attr_get_u32(prop[TIPC_NLA_PROP_TOL]), > - mnl_attr_get_u32(prop[TIPC_NLA_PROP_WIN])); > - > - printf(" RX packets:%u fragments:%u/%u bundles:%u/%u\n", > - mnl_attr_get_u32(attrs[TIPC_NLA_LINK_RX]) - > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_RX_INFO]), > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_RX_FRAGMENTS]), > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_RX_FRAGMENTED]), > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_RX_BUNDLES]), > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_RX_BUNDLED])); > - > - printf(" TX packets:%u fragments:%u/%u bundles:%u/%u\n", > - mnl_attr_get_u32(attrs[TIPC_NLA_LINK_TX]) - > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_TX_INFO]), > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_TX_FRAGMENTS]), > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_TX_FRAGMENTED]), > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_TX_BUNDLES]), > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_TX_BUNDLED])); > + print_string(PRINT_ANY, NULL, " %s", "DEFUNCT"); > + close_json_array(PRINT_JSON, NULL); > + > + print_uint(PRINT_ANY, "mtu", " MTU:%u", > + mnl_attr_get_u32(attrs[TIPC_NLA_LINK_MTU])); > + print_uint(PRINT_ANY, PRIORITY_STR, " Priority:%u", > + mnl_attr_get_u32(prop[TIPC_NLA_PROP_PRIO])); > + print_uint(PRINT_ANY, TOLERANCE_STR, " Tolerance:%u ms", > + mnl_attr_get_u32(prop[TIPC_NLA_PROP_TOL])); > + print_uint(PRINT_ANY, WINDOW_STR, " Window:%u packets\n", > + mnl_attr_get_u32(prop[TIPC_NLA_PROP_WIN])); > + > + open_json_object("rx packets"); > + print_uint(PRINT_ANY, "rx packets", " RX packets:%u", > + mnl_attr_get_u32(attrs[TIPC_NLA_LINK_RX]) - > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_RX_INFO])); > + print_uint(PRINT_ANY, "fragments", " fragments:%u", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_RX_FRAGMENTS])); > + print_uint(PRINT_ANY, "fragmented", "/%u", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_RX_FRAGMENTED])); > + print_uint(PRINT_ANY, "bundles", " bundles:%u", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_RX_BUNDLES])); > + print_uint(PRINT_ANY, "bundled", "/%u\n", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_RX_BUNDLED])); > + close_json_object(); > + > + open_json_object("tx packets"); > + print_uint(PRINT_ANY, "tx packets", " TX packets:%u", > + mnl_attr_get_u32(attrs[TIPC_NLA_LINK_TX]) - > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_TX_INFO])); > + print_uint(PRINT_ANY, "fragments", " fragments:%u", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_TX_FRAGMENTS])); > + print_uint(PRINT_ANY, "fragmented", "/%u", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_TX_FRAGMENTED])); > + print_uint(PRINT_ANY, "bundles", " bundles:%u", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_TX_BUNDLES])); > + print_uint(PRINT_ANY, "bundled", "/%u\n", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_TX_BUNDLED])); > + close_json_object(); > > proft = > mnl_attr_get_u32(stats[TIPC_NLA_STATS_MSG_PROF_TOT]); > - printf(" TX profile sample:%u packets average:%u octets\n", > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_MSG_LEN_CNT]), > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_MSG_LEN_TOT]) / > proft); > - > - printf(" 0-64:%u%% -256:%u%% -1024:%u%% -4096:%u%% - > 16384:%u%% -32768:%u%% -66000:%u%%\n", > - perc(mnl_attr_get_u32(stats[TIPC_NLA_STATS_MSG_LEN_P0]), > proft), > - perc(mnl_attr_get_u32(stats[TIPC_NLA_STATS_MSG_LEN_P1]), > proft), > - perc(mnl_attr_get_u32(stats[TIPC_NLA_STATS_MSG_LEN_P2]), > proft), > - perc(mnl_attr_get_u32(stats[TIPC_NLA_STATS_MSG_LEN_P3]), > proft), > - perc(mnl_attr_get_u32(stats[TIPC_NLA_STATS_MSG_LEN_P4]), > proft), > - perc(mnl_attr_get_u32(stats[TIPC_NLA_STATS_MSG_LEN_P5]), > proft), > - perc(mnl_attr_get_u32(stats[TIPC_NLA_STATS_MSG_LEN_P6]), > proft)); > - > - printf(" RX states:%u probes:%u naks:%u defs:%u dups:%u\n", > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_RX_STATES]), > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_RX_PROBES]), > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_RX_NACKS]), > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_RX_DEFERRED]), > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_DUPLICATES])); > - > - printf(" TX states:%u probes:%u naks:%u acks:%u dups:%u\n", > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_TX_STATES]), > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_TX_PROBES]), > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_TX_NACKS]), > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_TX_ACKS]), > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_RETRANSMITTED])); > - > - printf(" Congestion link:%u Send queue max:%u avg:%u\n", > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_LINK_CONGS]), > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_MAX_QUEUE]), > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_AVG_QUEUE])); > - > + print_uint(PRINT_ANY, "tx profile sample", " TX profile sample:%u", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_MSG_LEN_CNT])); > + print_uint(PRINT_ANY, "packets average", " packets average:%u > octets\n", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_MSG_LEN_TOT]) / proft); > + > + print_uint(PRINT_ANY, "0-64", " 0-64:%u%%", > + > perc(mnl_attr_get_u32(stats[TIPC_NLA_STATS_MSG_LEN_P0]), proft)); > + print_uint(PRINT_ANY, "-256", " -256:%u%%", > + > perc(mnl_attr_get_u32(stats[TIPC_NLA_STATS_MSG_LEN_P1]), proft)); > + print_uint(PRINT_ANY, "-1024", " -1024:%u%%", > + > perc(mnl_attr_get_u32(stats[TIPC_NLA_STATS_MSG_LEN_P2]), proft)); > + print_uint(PRINT_ANY, "-4096", " -4096:%u%%", > + > perc(mnl_attr_get_u32(stats[TIPC_NLA_STATS_MSG_LEN_P3]), proft)); > + print_uint(PRINT_ANY, "-16384", " -16384:%u%%", > + > perc(mnl_attr_get_u32(stats[TIPC_NLA_STATS_MSG_LEN_P4]), proft)); > + print_uint(PRINT_ANY, "-32768", " -32768:%u%%", > + > perc(mnl_attr_get_u32(stats[TIPC_NLA_STATS_MSG_LEN_P5]), proft)); > + print_uint(PRINT_ANY, "-66000", " -66000:%u%%\n", > + > perc(mnl_attr_get_u32(stats[TIPC_NLA_STATS_MSG_LEN_P6]), proft)); > + > + open_json_object("rx states"); > + print_uint(PRINT_ANY, "rx states", " RX states:%u", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_RX_STATES])); > + print_uint(PRINT_ANY, "probes", " probes:%u", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_RX_PROBES])); > + print_uint(PRINT_ANY, "naks", " naks:%u", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_RX_NACKS])); > + print_uint(PRINT_ANY, "defs", " defs:%u", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_RX_DEFERRED])); > + print_uint(PRINT_ANY, "dups", " dups:%u\n", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_DUPLICATES])); > + close_json_object(); > + > + open_json_object("tx states"); > + print_uint(PRINT_ANY, "tx states", " TX states:%u", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_TX_STATES])); > + print_uint(PRINT_ANY, "probes", " probes:%u", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_TX_PROBES])); > + print_uint(PRINT_ANY, "naks", " naks:%u", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_TX_NACKS])); > + print_uint(PRINT_ANY, "acks", " acks:%u", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_TX_ACKS])); > + print_uint(PRINT_ANY, "retrans", " retrans:%u\n", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_RETRANSMITTED])); > + close_json_object(); > + > + print_uint(PRINT_ANY, "congestion link", " Congestion link:%u", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_LINK_CONGS])); > + print_uint(PRINT_ANY, "send queue max", " Send queue max:%u", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_MAX_QUEUE])); > + print_uint(PRINT_ANY, "avg", " avg:%u\n", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_AVG_QUEUE])); > + > + close_json_object(); > return MNL_CB_OK; > } > > -static int _show_bc_link_stat(struct nlattr *prop[], struct nlattr *stats[]) > +static int _show_bc_link_stat(const char *name, struct nlattr *prop[], > + struct nlattr *stats[]) > { > - printf(" Window:%u packets\n", > - mnl_attr_get_u32(prop[TIPC_NLA_PROP_WIN])); > - > - printf(" RX packets:%u fragments:%u/%u bundles:%u/%u\n", > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_RX_INFO]), > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_RX_FRAGMENTS]), > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_RX_FRAGMENTED]), > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_RX_BUNDLES]), > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_RX_BUNDLED])); > - > - printf(" TX packets:%u fragments:%u/%u bundles:%u/%u\n", > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_TX_INFO]), > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_TX_FRAGMENTS]), > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_TX_FRAGMENTED]), > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_TX_BUNDLES]), > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_TX_BUNDLED])); > - > - printf(" RX naks:%u defs:%u dups:%u\n", > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_RX_NACKS]), > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_RX_DEFERRED]), > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_DUPLICATES])); > - > - printf(" TX naks:%u acks:%u dups:%u\n", > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_TX_NACKS]), > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_TX_ACKS]), > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_RETRANSMITTED])); > - > - printf(" Congestion link:%u Send queue max:%u avg:%u\n", > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_LINK_CONGS]), > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_MAX_QUEUE]), > - mnl_attr_get_u32(stats[TIPC_NLA_STATS_AVG_QUEUE])); > + open_json_object(NULL); > + print_string(PRINT_ANY, "link", "Link <%s>\n", name); > + print_uint(PRINT_ANY, WINDOW_STR, " Window:%u packets\n", > + mnl_attr_get_u32(prop[TIPC_NLA_PROP_WIN])); > + > + open_json_object("rx packets"); > + print_uint(PRINT_ANY, "rx packets", " RX packets:%u", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_RX_INFO])); > + print_uint(PRINT_ANY, "fragments", " fragments:%u", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_RX_FRAGMENTS])); > + print_uint(PRINT_ANY, "fragmented", "/%u", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_RX_FRAGMENTED])); > + print_uint(PRINT_ANY, "bundles", " bundles:%u", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_RX_BUNDLES])); > + print_uint(PRINT_ANY, "bundled", "/%u\n", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_RX_BUNDLED])); > + close_json_object(); > + > + open_json_object("tx packets"); > + print_uint(PRINT_ANY, "tx packets", " TX packets:%u", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_TX_INFO])); > + print_uint(PRINT_ANY, "fragments", " fragments:%u", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_TX_FRAGMENTS])); > + print_uint(PRINT_ANY, "fragmented", "/%u", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_TX_FRAGMENTED])); > + print_uint(PRINT_ANY, "bundles", " bundles:%u", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_TX_BUNDLES])); > + print_uint(PRINT_ANY, "bundled", "/%u\n", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_TX_BUNDLED])); > + close_json_object(); > + > + open_json_object("rx naks"); > + print_uint(PRINT_ANY, "rx naks", " RX naks:%u", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_RX_NACKS])); > + print_uint(PRINT_ANY, "defs", " defs:%u", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_RX_DEFERRED])); > + print_uint(PRINT_ANY, "dups", " dups:%u\n", > + mnl_attr_get_u32(stats[TIPC_NLA_STATS_DUPLICATES])); > + close_json_object(); > + > + open_json_object("tx naks"); > + print_uint(PRINT_ANY, "tx naks", " TX naks:%u", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_TX_NACKS])); > + print_uint(PRINT_ANY, "acks", " acks:%u", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_TX_ACKS])); > + print_uint(PRINT_ANY, "retrans", " retrans:%u\n", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_RETRANSMITTED])); > + close_json_object(); > + > + print_uint(PRINT_ANY, "congestion link", " Congestion link:%u", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_LINK_CONGS])); > + print_uint(PRINT_ANY, "send queue max", " Send queue max:%u", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_MAX_QUEUE])); > + print_uint(PRINT_ANY, "avg", " avg:%u\n", > + > mnl_attr_get_u32(stats[TIPC_NLA_STATS_AVG_QUEUE])); > + close_json_object(); > > return MNL_CB_OK; > } > @@ -347,13 +443,10 @@ static int link_stat_show_cb(const struct nlmsghdr > *nlh, void *data) > return MNL_CB_OK; > > if (attrs[TIPC_NLA_LINK_BROADCAST]) { > - printf("Link <%s>\n", name); > - return _show_bc_link_stat(prop, stats); > + return _show_bc_link_stat(name, prop, stats); > } > > - printf("\nLink <%s>\n", name); > - > - return _show_link_stat(attrs, prop, stats); > + return _show_link_stat(name, attrs, prop, stats); > } > > static void cmd_link_stat_show_help(struct cmdl *cmdl) @@ -372,6 +465,7 > @@ static int cmd_link_stat_show(struct nlmsghdr *nlh, const struct cmd > *cmd, > { "link", OPT_KEYVAL, NULL }, > { NULL } > }; > + int err = 0; > > if (help_flag) { > (cmd->help)(cmdl); > @@ -391,7 +485,10 @@ static int cmd_link_stat_show(struct nlmsghdr *nlh, > const struct cmd *cmd, > if (opt) > link = opt->val; > > - return msg_dumpit(nlh, link_stat_show_cb, link); > + new_json_obj(json); > + err = msg_dumpit(nlh, link_stat_show_cb, link); > + delete_json_obj(); > + return err; > } > > static void cmd_link_stat_help(struct cmdl *cmdl) @@ -439,11 +536,11 @@ > static int cmd_link_set_prop(struct nlmsghdr *nlh, const struct cmd *cmd, > { NULL } > }; > > - if (strcmp(cmd->cmd, "priority") == 0) > + if (strcmp(cmd->cmd, PRIORITY_STR) == 0) > prop = TIPC_NLA_PROP_PRIO; > - else if ((strcmp(cmd->cmd, "tolerance") == 0)) > + else if ((strcmp(cmd->cmd, TOLERANCE_STR) == 0)) > prop = TIPC_NLA_PROP_TOL; > - else if ((strcmp(cmd->cmd, "window") == 0)) > + else if ((strcmp(cmd->cmd, WINDOW_STR) == 0)) > prop = TIPC_NLA_PROP_WIN; > else > return -EINVAL; > @@ -489,9 +586,9 @@ static int cmd_link_set(struct nlmsghdr *nlh, const > struct cmd *cmd, > struct cmdl *cmdl, void *data) > { > const struct cmd cmds[] = { > - { "priority", cmd_link_set_prop, cmd_link_set_help }, > - { "tolerance", cmd_link_set_prop, cmd_link_set_help }, > - { "window", cmd_link_set_prop, cmd_link_set_help }, > + { PRIORITY_STR, cmd_link_set_prop, > cmd_link_set_help }, > + { TOLERANCE_STR, cmd_link_set_prop, > cmd_link_set_help }, > + { WINDOW_STR, cmd_link_set_prop, > cmd_link_set_help }, > { NULL } > }; > > @@ -537,15 +634,17 @@ static int link_mon_summary_cb(const struct > nlmsghdr *nlh, void *data) > > mnl_attr_parse_nested(info[TIPC_NLA_MON], parse_attrs, attrs); > > - printf("\nbearer %s\n", > + open_json_object(NULL); > + print_string(PRINT_ANY, "bearer", "\nbearer %s\n", > mnl_attr_get_str(attrs[TIPC_NLA_MON_BEARER_NAME])); > > - printf(" table_generation %u\n", > + print_uint(PRINT_ANY, "table_generation", " table_generation > %u\n", > mnl_attr_get_u32(attrs[TIPC_NLA_MON_LISTGEN])); > - printf(" cluster_size %u\n", > + print_uint(PRINT_ANY, "cluster_size", " cluster_size %u\n", > mnl_attr_get_u32(attrs[TIPC_NLA_MON_PEERCNT])); > - printf(" algorithm %s\n", > + print_string(PRINT_ANY, "algorithm", " algorithm %s\n", > attrs[TIPC_NLA_MON_ACTIVE] ? "overlapping-ring" : "full- > mesh"); > + close_json_object(); > > return MNL_CB_OK; > } > @@ -554,6 +653,7 @@ static int cmd_link_mon_summary(struct nlmsghdr > *nlh, const struct cmd *cmd, > struct cmdl *cmdl, void *data) > { > char buf[MNL_SOCKET_BUFFER_SIZE]; > + int err = 0; > > if (help_flag) { > fprintf(stderr, "Usage: %s monitor summary\n", cmdl- > >argv[0]); > @@ -566,7 +666,11 @@ static int cmd_link_mon_summary(struct nlmsghdr > *nlh, const struct cmd *cmd, > return -1; > } > > - return msg_dumpit(nlh, link_mon_summary_cb, NULL); > + new_json_obj(json); > + err = msg_dumpit(nlh, link_mon_summary_cb, NULL); > + delete_json_obj(); > + > + return err; > } > > #define STATUS_WIDTH 7 > @@ -587,16 +691,19 @@ static int map_get(uint64_t up_map, int i) static > void link_mon_print_applied(uint16_t applied, uint64_t up_map) { > int i; > - char state; > > + open_json_array(PRINT_JSON, "applied_node_status"); > for (i = 0; i < applied; i++) { > + char state_str[2] = {0}; > + > /* print the delimiter for every -n- entry */ > if (i && !(i % APPL_NODE_STATUS_WIDTH)) > - printf(","); > + print_string(PRINT_FP, NULL, "%s", ","); > > - state = map_get(up_map, i) ? 'U' : 'D'; > - printf("%c", state); > + sprintf(state_str, "%c", map_get(up_map, i) ? 'U' : 'D'); > + print_string(PRINT_ANY, NULL, "%s", state_str); > } > + close_json_array(PRINT_JSON, "applied_node_status"); > } > > /* print the non applied members, since we dont know @@ -608,19 +715,23 > @@ static void link_mon_print_non_applied(uint16_t applied, uint16_t > member_cnt, > int i; > char state; > > - printf(" ["); > + open_json_array(PRINT_JSON, "[non_applied_node:status]"); > + print_string(PRINT_FP, NULL, " %s", "["); > for (i = applied; i < member_cnt; i++) { > char addr_str[16]; > + char full_state[17] = {0}; > > /* print the delimiter for every entry */ > if (i != applied) > - printf(","); > + print_string(PRINT_FP, NULL, "%s", ","); > > sprintf(addr_str, "%x:", members[i]); > state = map_get(up_map, i) ? 'U' : 'D'; > - printf("%s%c", addr_str, state); > + sprintf(full_state, "%s%c", addr_str, state); > + print_string(PRINT_ANY, NULL, "%s", full_state); > } > - printf("]"); > + print_string(PRINT_FP, NULL, "%s", "]"); > + close_json_array(PRINT_JSON, "[non_applied_node:status]"); > } > > static void link_mon_print_peer_state(const uint32_t addr, const char > *status, @@ -631,11 +742,17 @@ static void > link_mon_print_peer_state(const uint32_t addr, const char *status, > > sprintf(addr_str, "%u.%u.%u", tipc_zone(addr), tipc_cluster(addr), > tipc_node(addr)); > - > - printf("%-*s", MAX_NODE_WIDTH, addr_str); > - printf("%-*s", STATUS_WIDTH, status); > - printf("%-*s", DIRECTLY_MON_WIDTH, monitored); > - printf("%-*u", MAX_DOM_GEN_WIDTH, dom_gen); > + if (is_json_context()) { > + print_string(PRINT_JSON, "node", NULL, addr_str); > + print_string(PRINT_JSON, "status", NULL, status); > + print_string(PRINT_JSON, "monitored", NULL, monitored); > + print_uint(PRINT_JSON, "generation", NULL, dom_gen); > + } else { > + printf("%-*s", MAX_NODE_WIDTH, addr_str); > + printf("%-*s", STATUS_WIDTH, status); > + printf("%-*s", DIRECTLY_MON_WIDTH, monitored); > + printf("%-*u", MAX_DOM_GEN_WIDTH, dom_gen); > + } > } > > static int link_mon_peer_list_cb(const struct nlmsghdr *nlh, void *data) @@ > -654,6 +771,7 @@ static int link_mon_peer_list_cb(const struct nlmsghdr > *nlh, void *data) > if (!info[TIPC_NLA_MON_PEER]) > return MNL_CB_ERROR; > > + open_json_object(NULL); > mnl_attr_parse_nested(info[TIPC_NLA_MON_PEER], parse_attrs, > attrs); > > (attrs[TIPC_NLA_MON_PEER_LOCAL] || > attrs[TIPC_NLA_MON_PEER_HEAD]) ? > @@ -688,8 +806,9 @@ static int link_mon_peer_list_cb(const struct > nlmsghdr *nlh, void *data) > > mnl_attr_get_payload(attrs[TIPC_NLA_MON_PEER_MEMBERS])); > > exit: > - printf("\n"); > + print_string(PRINT_FP, NULL, "\n", ""); > > + close_json_object(); > return MNL_CB_OK; > } > > @@ -698,6 +817,7 @@ static int link_mon_peer_list(uint32_t mon_ref) > struct nlmsghdr *nlh; > char buf[MNL_SOCKET_BUFFER_SIZE]; > struct nlattr *nest; > + int err = 0; > > nlh = msg_init(buf, TIPC_NL_MON_PEER_GET); > if (!nlh) { > @@ -709,7 +829,8 @@ static int link_mon_peer_list(uint32_t mon_ref) > mnl_attr_put_u32(nlh, TIPC_NLA_MON_REF, mon_ref); > mnl_attr_nest_end(nlh, nest); > > - return msg_dumpit(nlh, link_mon_peer_list_cb, NULL); > + err = msg_dumpit(nlh, link_mon_peer_list_cb, NULL); > + return err; > } > > static int link_mon_list_cb(const struct nlmsghdr *nlh, void *data) @@ - > 733,12 +854,16 @@ static int link_mon_list_cb(const struct nlmsghdr *nlh, > void *data) > if (*req_bearer && (strcmp(req_bearer, bname) != 0)) > return MNL_CB_OK; > > - printf("\nbearer %s\n", bname); > - printf("%s\n", title); > + open_json_object(NULL); > + print_string(PRINT_ANY, "bearer", "\nbearer %s\n", bname); > + print_string(PRINT_FP, NULL, "%s\n", title); > > + open_json_array(PRINT_JSON, bname); > if (mnl_attr_get_u32(attrs[TIPC_NLA_MON_PEERCNT])) > > link_mon_peer_list(mnl_attr_get_u32(attrs[TIPC_NLA_MON_REF])) > ; > + close_json_array(PRINT_JSON, bname); > > + close_json_object(); > return MNL_CB_OK; > } > > @@ -804,7 +929,10 @@ static int cmd_link_mon_list(struct nlmsghdr *nlh, > const struct cmd *cmd, > return -1; > } > > - return msg_dumpit(nlh, link_mon_list_cb, bname); > + new_json_obj(json); > + err = msg_dumpit(nlh, link_mon_list_cb, bname); > + delete_json_obj(); > + return err; > } > > static void cmd_link_mon_set_help(struct cmdl *cmdl) @@ -848,8 +976,10 > @@ static int link_mon_get_cb(const struct nlmsghdr *nlh, void *data) > if (!attrs[TIPC_NLA_MON_ACTIVATION_THRESHOLD]) > return MNL_CB_ERROR; > > - printf("%u\n", > - > mnl_attr_get_u32(attrs[TIPC_NLA_MON_ACTIVATION_THRESHOLD])); > + new_json_obj(json); > + print_uint(PRINT_ANY, "threshold", "%u\n", > + > mnl_attr_get_u32(attrs[TIPC_NLA_MON_ACTIVATION_THRESHOLD])); > + delete_json_obj(); > > return MNL_CB_OK; > } > -- > 2.7.4 ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ tipc-discussion mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/tipc-discussion
