pr_out(" ");
}
+static void check_indent_newline(struct dl *dl)
+{
+ __pr_out_indent_newline(dl);
+
+ if (g_indent_newline && !is_json_context()) {
+ printf("%s", g_indent_str);
+ g_indent_newline = false;
+ }
+ g_new_line_count = 0;
+}
+
static const enum mnl_attr_data_type devlink_policy[DEVLINK_ATTR_MAX + 1] = {
[DEVLINK_ATTR_BUS_NAME] = MNL_TYPE_NUL_STRING,
[DEVLINK_ATTR_DEV_NAME] = MNL_TYPE_NUL_STRING,
if (dl->json_output) {
if (array) {
if (should_arr_last_handle_end(dl, bus_name, dev_name))
- jsonw_end_array(dl->jw);
+ close_json_array(PRINT_JSON, NULL);
if (should_arr_last_handle_start(dl, bus_name,
dev_name)) {
- jsonw_name(dl->jw, buf);
- jsonw_start_array(dl->jw);
- jsonw_start_object(dl->jw);
+ open_json_array(PRINT_JSON, buf);
+ open_json_object(NULL);
arr_last_handle_set(dl, bus_name, dev_name);
} else {
- jsonw_start_object(dl->jw);
+ open_json_object(NULL);
}
} else {
- jsonw_name(dl->jw, buf);
- jsonw_start_object(dl->jw);
+ open_json_object(buf);
}
} else {
if (array) {
static void pr_out_handle_end(struct dl *dl)
{
if (dl->json_output)
- jsonw_end_object(dl->jw);
+ close_json_object();
else
__pr_out_newline();
}
if (should_arr_last_port_handle_end(dl, bus_name,
dev_name,
port_index))
- jsonw_end_array(dl->jw);
+ close_json_array(PRINT_JSON, NULL);
if (should_arr_last_port_handle_start(dl, bus_name,
dev_name,
port_index)) {
- jsonw_name(dl->jw, buf);
- jsonw_start_array(dl->jw);
- jsonw_start_object(dl->jw);
+ open_json_array(PRINT_JSON, buf);
+ open_json_object(NULL);
arr_last_port_handle_set(dl, bus_name, dev_name,
port_index);
} else {
- jsonw_start_object(dl->jw);
+ open_json_object(NULL);
}
} else {
- jsonw_name(dl->jw, buf);
- jsonw_start_object(dl->jw);
+ open_json_object(buf);
}
} else {
pr_out("%s:", buf);
static void pr_out_port_handle_end(struct dl *dl)
{
if (dl->json_output)
- jsonw_end_object(dl->jw);
+ close_json_object();
else
pr_out("\n");
}
-
-static void pr_out_str(struct dl *dl, const char *name, const char *val)
-{
- __pr_out_indent_newline(dl);
- if (dl->json_output)
- jsonw_string_field(dl->jw, name, val);
- else
- pr_out("%s %s", name, val);
-}
-
-static void pr_out_bool(struct dl *dl, const char *name, bool val)
-{
- if (dl->json_output)
- jsonw_bool_field(dl->jw, name, val);
- else
- pr_out_str(dl, name, val ? "true" : "false");
-}
-
-static void pr_out_uint(struct dl *dl, const char *name, unsigned int val)
-{
- __pr_out_indent_newline(dl);
- if (dl->json_output)
- jsonw_uint_field(dl->jw, name, val);
- else
- pr_out("%s %u", name, val);
-}
-
static void pr_out_u64(struct dl *dl, const char *name, uint64_t val)
{
__pr_out_indent_newline(dl);
if (val == (uint64_t) -1)
- return pr_out_str(dl, name, "unlimited");
+ return print_string_name_value(name, "unlimited");
if (dl->json_output)
- jsonw_u64_field(dl->jw, name, val);
+ print_u64(PRINT_JSON, name, NULL, val);
else
pr_out("%s %"PRIu64, name, val);
}
-static void pr_out_bool_value(struct dl *dl, bool value)
-{
- __pr_out_indent_newline(dl);
- if (dl->json_output)
- jsonw_bool(dl->jw, value);
- else
- pr_out("%s", value ? "true" : "false");
-}
-
-static void pr_out_uint_value(struct dl *dl, unsigned int value)
-{
- __pr_out_indent_newline(dl);
- if (dl->json_output)
- jsonw_uint(dl->jw, value);
- else
- pr_out("%u", value);
-}
-
-static void pr_out_uint64_value(struct dl *dl, uint64_t value)
-{
- __pr_out_indent_newline(dl);
- if (dl->json_output)
- jsonw_u64(dl->jw, value);
- else
- pr_out("%"PRIu64, value);
-}
-
static bool is_binary_eol(int i)
{
return !(i%16);
while (i < len) {
if (dl->json_output)
- jsonw_printf(dl->jw, "%d", data[i]);
+ print_int(PRINT_JSON, NULL, NULL, data[i]);
else
pr_out("%02x ", data[i]);
i++;
__pr_out_newline();
}
-static void pr_out_str_value(struct dl *dl, const char *value)
-{
- __pr_out_indent_newline(dl);
- if (dl->json_output)
- jsonw_string(dl->jw, value);
- else
- pr_out("%s", value);
-}
-
static void pr_out_name(struct dl *dl, const char *name)
{
__pr_out_indent_newline(dl);
if (dl->json_output)
- jsonw_name(dl->jw, name);
+ print_string(PRINT_JSON, name, NULL, NULL);
else
pr_out("%s:", name);
}
static void pr_out_region_chunk_start(struct dl *dl, uint64_t addr)
{
if (dl->json_output) {
- jsonw_name(dl->jw, "address");
- jsonw_uint(dl->jw, addr);
- jsonw_name(dl->jw, "data");
- jsonw_start_array(dl->jw);
+ print_uint(PRINT_JSON, "address", NULL, addr);
+ open_json_array(PRINT_JSON, "data");
}
}
static void pr_out_region_chunk_end(struct dl *dl)
{
if (dl->json_output)
- jsonw_end_array(dl->jw);
+ close_json_array(PRINT_JSON, NULL);
}
static void pr_out_region_chunk(struct dl *dl, uint8_t *data, uint32_t len,
align_val++;
if (dl->json_output)
- jsonw_printf(dl->jw, "%d", data[i]);
+ print_int(PRINT_JSON, NULL, NULL, data[i]);
else
pr_out("%02x ", data[i]);
static void pr_out_section_start(struct dl *dl, const char *name)
{
if (dl->json_output) {
- jsonw_start_object(dl->jw);
- jsonw_name(dl->jw, name);
- jsonw_start_object(dl->jw);
+ open_json_object(NULL);
+ open_json_object(name);
}
}
{
if (dl->json_output) {
if (dl->arr_last.present)
- jsonw_end_array(dl->jw);
- jsonw_end_object(dl->jw);
- jsonw_end_object(dl->jw);
+ close_json_array(PRINT_JSON, NULL);
+ close_json_object();
+ close_json_object();
}
}
static void pr_out_array_start(struct dl *dl, const char *name)
{
if (dl->json_output) {
- jsonw_name(dl->jw, name);
- jsonw_start_array(dl->jw);
+ open_json_array(PRINT_JSON, name);
} else {
__pr_out_indent_inc();
__pr_out_newline();
static void pr_out_array_end(struct dl *dl)
{
if (dl->json_output) {
- jsonw_end_array(dl->jw);
+ close_json_array(PRINT_JSON, NULL);
} else {
__pr_out_indent_dec();
__pr_out_indent_dec();
static void pr_out_object_start(struct dl *dl, const char *name)
{
if (dl->json_output) {
- jsonw_name(dl->jw, name);
- jsonw_start_object(dl->jw);
+ open_json_object(name);
} else {
__pr_out_indent_inc();
__pr_out_newline();
static void pr_out_object_end(struct dl *dl)
{
if (dl->json_output) {
- jsonw_end_object(dl->jw);
+ close_json_object();
} else {
__pr_out_indent_dec();
__pr_out_indent_dec();
static void pr_out_entry_start(struct dl *dl)
{
if (dl->json_output)
- jsonw_start_object(dl->jw);
+ open_json_object(NULL);
}
static void pr_out_entry_end(struct dl *dl)
{
if (dl->json_output)
- jsonw_end_object(dl->jw);
+ close_json_object();
else
__pr_out_newline();
}
{
__pr_out_handle_start(dl, tb, true, false);
- if (tb[DEVLINK_ATTR_ESWITCH_MODE])
- pr_out_str(dl, "mode",
- eswitch_mode_name(mnl_attr_get_u16(tb[DEVLINK_ATTR_ESWITCH_MODE])));
-
- if (tb[DEVLINK_ATTR_ESWITCH_INLINE_MODE])
- pr_out_str(dl, "inline-mode",
- eswitch_inline_mode_name(mnl_attr_get_u8(
- tb[DEVLINK_ATTR_ESWITCH_INLINE_MODE])));
-
+ if (tb[DEVLINK_ATTR_ESWITCH_MODE]) {
+ check_indent_newline(dl);
+ print_string(PRINT_ANY, "mode", "mode %s",
+ eswitch_mode_name(mnl_attr_get_u16(
+ tb[DEVLINK_ATTR_ESWITCH_MODE])));
+ }
+ if (tb[DEVLINK_ATTR_ESWITCH_INLINE_MODE]) {
+ check_indent_newline(dl);
+ print_string(PRINT_ANY, "inline-mode", "inline-mode %s",
+ eswitch_inline_mode_name(mnl_attr_get_u8(
+ tb[DEVLINK_ATTR_ESWITCH_INLINE_MODE])));
+ }
if (tb[DEVLINK_ATTR_ESWITCH_ENCAP_MODE]) {
bool encap_mode = !!mnl_attr_get_u8(tb[DEVLINK_ATTR_ESWITCH_ENCAP_MODE]);
- pr_out_str(dl, "encap", encap_mode ? "enable" : "disable");
+ check_indent_newline(dl);
+ print_string(PRINT_ANY, "encap", "encap %s",
+ encap_mode ? "enable" : "disable");
}
pr_out_handle_end(dl);
!nla_value[DEVLINK_ATTR_PARAM_VALUE_DATA]))
return;
- pr_out_str(dl, "cmode",
- param_cmode_name(mnl_attr_get_u8(nla_value[DEVLINK_ATTR_PARAM_VALUE_CMODE])));
+ check_indent_newline(dl);
+ print_string(PRINT_ANY, "cmode", "cmode %s",
+ param_cmode_name(mnl_attr_get_u8(nla_value[DEVLINK_ATTR_PARAM_VALUE_CMODE])));
+
val_attr = nla_value[DEVLINK_ATTR_PARAM_VALUE_DATA];
conv_exists = param_val_conv_exists(param_val_conv, PARAM_VAL_CONV_LEN,
&vstr);
if (err)
return;
- pr_out_str(dl, "value", vstr);
+ print_string(PRINT_ANY, "value", " value %s", vstr);
} else {
- pr_out_uint(dl, "value", mnl_attr_get_u8(val_attr));
+ print_uint(PRINT_ANY, "value", " value %u",
+ mnl_attr_get_u8(val_attr));
}
break;
case MNL_TYPE_U16:
&vstr);
if (err)
return;
- pr_out_str(dl, "value", vstr);
+ print_string(PRINT_ANY, "value", " value %s", vstr);
} else {
- pr_out_uint(dl, "value", mnl_attr_get_u16(val_attr));
+ print_uint(PRINT_ANY, "value", " value %u",
+ mnl_attr_get_u16(val_attr));
}
break;
case MNL_TYPE_U32:
&vstr);
if (err)
return;
- pr_out_str(dl, "value", vstr);
+ print_string(PRINT_ANY, "value", " value %s", vstr);
} else {
- pr_out_uint(dl, "value", mnl_attr_get_u32(val_attr));
+ print_uint(PRINT_ANY, "value", " value %u",
+ mnl_attr_get_u32(val_attr));
}
break;
case MNL_TYPE_STRING:
- pr_out_str(dl, "value", mnl_attr_get_str(val_attr));
+ print_string(PRINT_ANY, "value", " value %s",
+ mnl_attr_get_str(val_attr));
break;
case MNL_TYPE_FLAG:
- pr_out_bool(dl, "value", val_attr ? true : false);
+ print_bool(PRINT_ANY, "value", " value %s", val_attr);
break;
}
}
nla_type = mnl_attr_get_u8(nla_param[DEVLINK_ATTR_PARAM_TYPE]);
nla_name = mnl_attr_get_str(nla_param[DEVLINK_ATTR_PARAM_NAME]);
- pr_out_str(dl, "name", nla_name);
-
+ check_indent_newline(dl);
+ print_string(PRINT_ANY, "name", "name %s ", nla_name);
if (!nla_param[DEVLINK_ATTR_PARAM_GENERIC])
- pr_out_str(dl, "type", "driver-specific");
+ print_string(PRINT_ANY, "type", "type %s", "driver-specific");
else
- pr_out_str(dl, "type", "generic");
+ print_string(PRINT_ANY, "type", "type %s", "generic");
pr_out_array_start(dl, "values");
mnl_attr_for_each_nested(param_value_attr,
if (reload_failed) {
__pr_out_handle_start(dl, tb, true, false);
- pr_out_bool(dl, "reload_failed", true);
+ check_indent_newline(dl);
+ print_bool(PRINT_ANY, "reload_failed", "reload_failed %s", true);
pr_out_handle_end(dl);
} else {
pr_out_handle(dl, tb);
ver_name = mnl_attr_get_str(tb[DEVLINK_ATTR_INFO_VERSION_NAME]);
ver_value = mnl_attr_get_str(tb[DEVLINK_ATTR_INFO_VERSION_VALUE]);
- pr_out_str(dl, ver_name, ver_value);
+ check_indent_newline(dl);
+ print_string_name_value(ver_name, ver_value);
if (!dl->json_output)
__pr_out_newline();
}
if (!dl->json_output)
__pr_out_newline();
- pr_out_str(dl, "driver", mnl_attr_get_str(nla_drv));
+ check_indent_newline(dl);
+ print_string(PRINT_ANY, "driver", "driver %s",
+ mnl_attr_get_str(nla_drv));
}
if (tb[DEVLINK_ATTR_INFO_SERIAL_NUMBER]) {
if (!dl->json_output)
__pr_out_newline();
- pr_out_str(dl, "serial_number", mnl_attr_get_str(nla_sn));
+ check_indent_newline(dl);
+ print_string(PRINT_ANY, "serial_number", "serial_number %s",
+ mnl_attr_get_str(nla_sn));
}
__pr_out_indent_dec();
/* In child, just execute the flash and pass returned
* value through pipe once it is done.
*/
+ int cc;
+
close(pipe_r);
err = _mnlg_socket_send(dl->nlg, nlh);
- write(pipe_w, &err, sizeof(err));
+ cc = write(pipe_w, &err, sizeof(err));
close(pipe_w);
- exit(0);
+ exit(cc != sizeof(err));
}
close(pipe_w);
return "pcipf";
case DEVLINK_PORT_FLAVOUR_PCI_VF:
return "pcivf";
+ case DEVLINK_PORT_FLAVOUR_VIRTUAL:
+ return "virtual";
default:
return "<unknown flavour>";
}
if (tb[DEVLINK_ATTR_PORT_PCI_PF_NUMBER]) {
fn_num = mnl_attr_get_u16(tb[DEVLINK_ATTR_PORT_PCI_PF_NUMBER]);
- pr_out_uint(dl, "pfnum", fn_num);
+ print_uint(PRINT_ANY, "pfnum", " pfnum %u", fn_num);
}
if (tb[DEVLINK_ATTR_PORT_PCI_VF_NUMBER]) {
fn_num = mnl_attr_get_u16(tb[DEVLINK_ATTR_PORT_PCI_VF_NUMBER]);
- pr_out_uint(dl, "vfnum", fn_num);
+ print_uint(PRINT_ANY, "vfnum", " vfnum %u", fn_num);
}
}
struct nlattr *dpt_attr = tb[DEVLINK_ATTR_PORT_DESIRED_TYPE];
pr_out_port_handle_start(dl, tb, false);
+ check_indent_newline(dl);
if (pt_attr) {
uint16_t port_type = mnl_attr_get_u16(pt_attr);
- pr_out_str(dl, "type", port_type_name(port_type));
+ print_string(PRINT_ANY, "type", "type %s",
+ port_type_name(port_type));
if (dpt_attr) {
uint16_t des_port_type = mnl_attr_get_u16(dpt_attr);
if (port_type != des_port_type)
- pr_out_str(dl, "des_type",
- port_type_name(des_port_type));
+ print_string(PRINT_ANY, "des_type", " des_type %s",
+ port_type_name(des_port_type));
}
}
- if (tb[DEVLINK_ATTR_PORT_NETDEV_NAME])
- pr_out_str(dl, "netdev",
- mnl_attr_get_str(tb[DEVLINK_ATTR_PORT_NETDEV_NAME]));
- if (tb[DEVLINK_ATTR_PORT_IBDEV_NAME])
- pr_out_str(dl, "ibdev",
- mnl_attr_get_str(tb[DEVLINK_ATTR_PORT_IBDEV_NAME]));
+ if (tb[DEVLINK_ATTR_PORT_NETDEV_NAME]) {
+ print_string(PRINT_ANY, "netdev", " netdev %s",
+ mnl_attr_get_str(tb[DEVLINK_ATTR_PORT_NETDEV_NAME]));
+ }
+ if (tb[DEVLINK_ATTR_PORT_IBDEV_NAME]) {
+ print_string(PRINT_ANY, "ibdev", " ibdev %s",
+ mnl_attr_get_str(tb[DEVLINK_ATTR_PORT_IBDEV_NAME]));
+ }
if (tb[DEVLINK_ATTR_PORT_FLAVOUR]) {
uint16_t port_flavour =
mnl_attr_get_u16(tb[DEVLINK_ATTR_PORT_FLAVOUR]);
- pr_out_str(dl, "flavour", port_flavour_name(port_flavour));
+ print_string(PRINT_ANY, "flavour", " flavour %s",
+ port_flavour_name(port_flavour));
switch (port_flavour) {
case DEVLINK_PORT_FLAVOUR_PCI_PF:
uint32_t port_number;
port_number = mnl_attr_get_u32(tb[DEVLINK_ATTR_PORT_NUMBER]);
- pr_out_uint(dl, "port", port_number);
+ print_uint(PRINT_ANY, "port", " port %u", port_number);
}
if (tb[DEVLINK_ATTR_PORT_SPLIT_GROUP])
- pr_out_uint(dl, "split_group",
- mnl_attr_get_u32(tb[DEVLINK_ATTR_PORT_SPLIT_GROUP]));
+ print_uint(PRINT_ANY, "split_group", " split_group %u",
+ mnl_attr_get_u32(tb[DEVLINK_ATTR_PORT_SPLIT_GROUP]));
pr_out_port_handle_end(dl);
}
static void pr_out_sb(struct dl *dl, struct nlattr **tb)
{
pr_out_handle_start_arr(dl, tb);
- pr_out_uint(dl, "sb",
- mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_INDEX]));
- pr_out_uint(dl, "size",
- mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_SIZE]));
- pr_out_uint(dl, "ing_pools",
- mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_INGRESS_POOL_COUNT]));
- pr_out_uint(dl, "eg_pools",
- mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_EGRESS_POOL_COUNT]));
- pr_out_uint(dl, "ing_tcs",
- mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_INGRESS_TC_COUNT]));
- pr_out_uint(dl, "eg_tcs",
- mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_EGRESS_TC_COUNT]));
+ check_indent_newline(dl);
+ print_uint(PRINT_ANY, "sb", "sb %u",
+ mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_INDEX]));
+ print_uint(PRINT_ANY, "size", " size %u",
+ mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_SIZE]));
+ print_uint(PRINT_ANY, "ing_pools", " ing_pools %u",
+ mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_INGRESS_POOL_COUNT]));
+ print_uint(PRINT_ANY, "eg_pools", " eg_pools %u",
+ mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_EGRESS_POOL_COUNT]));
+ print_uint(PRINT_ANY, "ing_tcs", " ing_tcs %u",
+ mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_INGRESS_TC_COUNT]));
+ print_uint(PRINT_ANY, "eg_tcs", " eg_tcs %u",
+ mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_EGRESS_TC_COUNT]));
pr_out_handle_end(dl);
}
static void pr_out_sb_pool(struct dl *dl, struct nlattr **tb)
{
pr_out_handle_start_arr(dl, tb);
- pr_out_uint(dl, "sb",
- mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_INDEX]));
- pr_out_uint(dl, "pool",
- mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_POOL_INDEX]));
- pr_out_str(dl, "type",
- pool_type_name(mnl_attr_get_u8(tb[DEVLINK_ATTR_SB_POOL_TYPE])));
- pr_out_uint(dl, "size",
- mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_POOL_SIZE]));
- pr_out_str(dl, "thtype",
- threshold_type_name(mnl_attr_get_u8(tb[DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE])));
+ check_indent_newline(dl);
+ print_uint(PRINT_ANY, "sb", "sb %u",
+ mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_INDEX]));
+ print_uint(PRINT_ANY, "pool", " pool %u",
+ mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_POOL_INDEX]));
+ print_string(PRINT_ANY, "type", " type %s",
+ pool_type_name(mnl_attr_get_u8(tb[DEVLINK_ATTR_SB_POOL_TYPE])));
+ print_uint(PRINT_ANY, "size", " size %u",
+ mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_POOL_SIZE]));
+ print_string(PRINT_ANY, "thtype", " thtype %s",
+ threshold_type_name(mnl_attr_get_u8(tb[DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE])));
if (tb[DEVLINK_ATTR_SB_POOL_CELL_SIZE])
- pr_out_uint(dl, "cell_size",
- mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_POOL_CELL_SIZE]));
+ print_uint(PRINT_ANY, "cell_size", " cell size %u",
+ mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_POOL_CELL_SIZE]));
pr_out_handle_end(dl);
}
static void pr_out_sb_port_pool(struct dl *dl, struct nlattr **tb)
{
pr_out_port_handle_start_arr(dl, tb, true);
- pr_out_uint(dl, "sb",
- mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_INDEX]));
- pr_out_uint(dl, "pool",
- mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_POOL_INDEX]));
- pr_out_uint(dl, "threshold",
- mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_THRESHOLD]));
+ check_indent_newline(dl);
+ print_uint(PRINT_ANY, "sb", "sb %u",
+ mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_INDEX]));
+ print_uint(PRINT_ANY, "pool", " pool %u",
+ mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_POOL_INDEX]));
+ print_uint(PRINT_ANY, "threshold", " threshold %u",
+ mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_THRESHOLD]));
pr_out_port_handle_end(dl);
}
static void pr_out_sb_tc_bind(struct dl *dl, struct nlattr **tb)
{
pr_out_port_handle_start_arr(dl, tb, true);
- pr_out_uint(dl, "sb",
- mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_INDEX]));
- pr_out_uint(dl, "tc",
- mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_TC_INDEX]));
- pr_out_str(dl, "type",
- pool_type_name(mnl_attr_get_u8(tb[DEVLINK_ATTR_SB_POOL_TYPE])));
- pr_out_uint(dl, "pool",
- mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_POOL_INDEX]));
- pr_out_uint(dl, "threshold",
- mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_THRESHOLD]));
+ check_indent_newline(dl);
+ print_uint(PRINT_ANY, "sb", "sb %u",
+ mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_INDEX]));
+ print_uint(PRINT_ANY, "tc", " tc %u",
+ mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_TC_INDEX]));
+ print_string(PRINT_ANY, "type", " type %s",
+ pool_type_name(mnl_attr_get_u8(tb[DEVLINK_ATTR_SB_POOL_TYPE])));
+ print_uint(PRINT_ANY, "pool", " pool %u",
+ mnl_attr_get_u16(tb[DEVLINK_ATTR_SB_POOL_INDEX]));
+ print_uint(PRINT_ANY, "threshold", " threshold %u",
+ mnl_attr_get_u32(tb[DEVLINK_ATTR_SB_THRESHOLD]));
pr_out_port_handle_end(dl);
}
struct occ_item *occ_item;
char buf[32];
- jsonw_name(dl->jw, label);
- jsonw_start_object(dl->jw);
+ open_json_object(label);
list_for_each_entry(occ_item, list, list) {
sprintf(buf, "%u", occ_item->index);
- jsonw_name(dl->jw, buf);
- jsonw_start_object(dl->jw);
+ open_json_object(buf);
if (bound_pool)
- jsonw_uint_field(dl->jw, "bound_pool",
- occ_item->bound_pool_index);
- jsonw_uint_field(dl->jw, "current", occ_item->cur);
- jsonw_uint_field(dl->jw, "max", occ_item->max);
- jsonw_end_object(dl->jw);
+ print_uint(PRINT_JSON, "bound_pool", NULL,
+ occ_item->bound_pool_index);
+ print_uint(PRINT_JSON, "current", NULL, occ_item->cur);
+ print_uint(PRINT_JSON, "max", NULL, occ_item->max);
+ close_json_object();
}
- jsonw_end_object(dl->jw);
+ close_json_object();
}
static void pr_out_occ_show_port(struct dl *dl, struct occ_port *occ_port)
case DEVLINK_CMD_FLASH_UPDATE: return "begin";
case DEVLINK_CMD_FLASH_UPDATE_END: return "end";
case DEVLINK_CMD_FLASH_UPDATE_STATUS: return "status";
+ case DEVLINK_CMD_HEALTH_REPORTER_RECOVER: return "status";
case DEVLINK_CMD_TRAP_GET: return "get";
case DEVLINK_CMD_TRAP_SET: return "set";
case DEVLINK_CMD_TRAP_NEW: return "new";
case DEVLINK_CMD_FLASH_UPDATE_END:
case DEVLINK_CMD_FLASH_UPDATE_STATUS:
return "flash";
+ case DEVLINK_CMD_HEALTH_REPORTER_RECOVER:
+ return "health";
case DEVLINK_CMD_TRAP_GET:
case DEVLINK_CMD_TRAP_SET:
case DEVLINK_CMD_TRAP_NEW:
{
__pr_out_handle_start(dl, tb, true, false);
- if (tb[DEVLINK_ATTR_FLASH_UPDATE_STATUS_MSG])
- pr_out_str(dl, "msg",
- mnl_attr_get_str(tb[DEVLINK_ATTR_FLASH_UPDATE_STATUS_MSG]));
-
- if (tb[DEVLINK_ATTR_FLASH_UPDATE_COMPONENT])
- pr_out_str(dl, "component",
- mnl_attr_get_str(tb[DEVLINK_ATTR_FLASH_UPDATE_COMPONENT]));
+ if (tb[DEVLINK_ATTR_FLASH_UPDATE_STATUS_MSG]) {
+ check_indent_newline(dl);
+ print_string(PRINT_ANY, "msg", "msg %s",
+ mnl_attr_get_str(tb[DEVLINK_ATTR_FLASH_UPDATE_STATUS_MSG]));
+ }
+ if (tb[DEVLINK_ATTR_FLASH_UPDATE_COMPONENT]) {
+ check_indent_newline(dl);
+ print_string(PRINT_ANY, "component", "component %s",
+ mnl_attr_get_str(tb[DEVLINK_ATTR_FLASH_UPDATE_COMPONENT]));
+ }
if (tb[DEVLINK_ATTR_FLASH_UPDATE_STATUS_DONE])
pr_out_u64(dl, "done",
}
static void pr_out_region(struct dl *dl, struct nlattr **tb);
+static void pr_out_health(struct dl *dl, struct nlattr **tb_health);
static void pr_out_trap(struct dl *dl, struct nlattr **tb, bool array);
static void pr_out_trap_group(struct dl *dl, struct nlattr **tb, bool array);
pr_out_mon_header(genl->cmd);
pr_out_flash_update(dl, tb);
break;
+ case DEVLINK_CMD_HEALTH_REPORTER_RECOVER:
+ mnl_attr_parse(nlh, sizeof(*genl), attr_cb, tb);
+ if (!tb[DEVLINK_ATTR_BUS_NAME] || !tb[DEVLINK_ATTR_DEV_NAME] ||
+ !tb[DEVLINK_ATTR_HEALTH_REPORTER])
+ return MNL_CB_ERROR;
+ pr_out_mon_header(genl->cmd);
+ pr_out_health(dl, tb);
+ break;
case DEVLINK_CMD_TRAP_GET: /* fall through */
case DEVLINK_CMD_TRAP_SET: /* fall through */
case DEVLINK_CMD_TRAP_NEW: /* fall through */
if (strcmp(cur_obj, "all") != 0 &&
strcmp(cur_obj, "dev") != 0 &&
strcmp(cur_obj, "port") != 0 &&
+ strcmp(cur_obj, "health") != 0 &&
strcmp(cur_obj, "trap") != 0 &&
strcmp(cur_obj, "trap-group") != 0) {
pr_err("Unknown object \"%s\"\n", cur_obj);
static void cmd_mon_help(void)
{
pr_err("Usage: devlink monitor [ all | OBJECT-LIST ]\n"
- "where OBJECT-LIST := { dev | port | trap | trap-group }\n");
+ "where OBJECT-LIST := { dev | port | health | trap | trap-group }\n");
}
static int cmd_mon(struct dl *dl)
for (i = 0; i < field_count; i++) {
field = &fields[i];
pr_out_entry_start(ctx->dl);
- pr_out_str(ctx->dl, "name", field->name);
+ check_indent_newline(ctx->dl);
+ print_string(PRINT_ANY, "name", "name %s", field->name);
if (ctx->dl->verbose)
- pr_out_uint(ctx->dl, "id", field->id);
- pr_out_uint(ctx->dl, "bitwidth", field->bitwidth);
- if (field->mapping_type)
- pr_out_str(ctx->dl, "mapping_type",
- dpipe_field_mapping_e2s(field->mapping_type));
+ print_uint(PRINT_ANY, "id", " id %u", field->id);
+ print_uint(PRINT_ANY, "bitwidth", " bitwidth %u", field->bitwidth);
+ if (field->mapping_type) {
+ print_string(PRINT_ANY, "mapping_type", " mapping_type %s",
+ dpipe_field_mapping_e2s(field->mapping_type));
+ }
pr_out_entry_end(ctx->dl);
}
}
struct dpipe_header *header, bool global)
{
pr_out_handle_start_arr(ctx->dl, tb);
- pr_out_str(ctx->dl, "name", header->name);
+ check_indent_newline(ctx->dl);
+ print_string(PRINT_ANY, "name", "name %s", header->name);
if (ctx->dl->verbose) {
- pr_out_uint(ctx->dl, "id", header->id);
- pr_out_str(ctx->dl, "global",
- global ? "true" : "false");
+ print_uint(PRINT_ANY, "id", " id %u", header->id);
+ print_bool(PRINT_ANY, "global", " global %s", global);
}
pr_out_array_start(ctx->dl, "field");
pr_out_dpipe_fields(ctx, header->fields,
struct dpipe_op_info *op_info = &action->info;
const char *mapping;
- pr_out_str(ctx->dl, "type",
- dpipe_action_type_e2s(action->type));
- pr_out_str(ctx->dl, "header",
- dpipe_header_id2s(ctx, op_info->header_id,
- op_info->header_global));
- pr_out_str(ctx->dl, "field",
- dpipe_field_id2s(ctx, op_info->header_id,
- op_info->field_id,
- op_info->header_global));
+ check_indent_newline(ctx->dl);
+ print_string(PRINT_ANY, "type", "type %s",
+ dpipe_action_type_e2s(action->type));
+ print_string(PRINT_ANY, "header", " header %s",
+ dpipe_header_id2s(ctx, op_info->header_id,
+ op_info->header_global));
+ print_string(PRINT_ANY, "field", " field %s",
+ dpipe_field_id2s(ctx, op_info->header_id,
+ op_info->field_id,
+ op_info->header_global));
mapping = dpipe_mapping_get(ctx, op_info->header_id,
op_info->field_id,
op_info->header_global);
if (mapping)
- pr_out_str(ctx->dl, "mapping", mapping);
+ print_string(PRINT_ANY, "mapping", " mapping %s", mapping);
}
static int dpipe_action_parse(struct dpipe_action *action, struct nlattr *nl)
struct dpipe_op_info *op_info = &match->info;
const char *mapping;
- pr_out_str(ctx->dl, "type",
- dpipe_match_type_e2s(match->type));
- pr_out_str(ctx->dl, "header",
- dpipe_header_id2s(ctx, op_info->header_id,
- op_info->header_global));
- pr_out_str(ctx->dl, "field",
- dpipe_field_id2s(ctx, op_info->header_id,
- op_info->field_id,
- op_info->header_global));
+ check_indent_newline(ctx->dl);
+ print_string(PRINT_ANY, "type", "type %s",
+ dpipe_match_type_e2s(match->type));
+ print_string(PRINT_ANY, "header", " header %s",
+ dpipe_header_id2s(ctx, op_info->header_id,
+ op_info->header_global));
+ print_string(PRINT_ANY, "field", " field %s",
+ dpipe_field_id2s(ctx, op_info->header_id,
+ op_info->field_id,
+ op_info->header_global));
mapping = dpipe_mapping_get(ctx, op_info->header_id,
op_info->field_id,
op_info->header_global);
if (mapping)
- pr_out_str(ctx->dl, "mapping", mapping);
+ print_string(PRINT_ANY, "mapping", " mapping %s", mapping);
}
static int dpipe_match_parse(struct dpipe_match *match,
path -= strlen(del);
memcpy(path, del, strlen(del));
}
- pr_out_str(dl, "resource_path", path);
+ check_indent_newline(dl);
+ print_string(PRINT_ANY, "resource_path", "resource_path %s", path);
free(path);
}
if (!ctx->print_tables)
return 0;
- pr_out_str(ctx->dl, "name", table->name);
- pr_out_uint(ctx->dl, "size", size);
- pr_out_str(ctx->dl, "counters_enabled",
- counters_enabled ? "true" : "false");
+ check_indent_newline(ctx->dl);
+ print_string(PRINT_ANY, "name", "name %s", table->name);
+ print_uint(PRINT_ANY, "size", " size %u", size);
+ print_bool(PRINT_ANY, "counters_enabled", " counters_enabled %s", counters_enabled);
if (resource_valid) {
resource_units = mnl_attr_get_u32(nla_table[DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_UNITS]);
resource_path_print(ctx->dl, ctx->resources,
table->resource_id);
- pr_out_uint(ctx->dl, "resource_units", resource_units);
+ print_uint(PRINT_ANY, "resource_units", " resource_units %u",
+ resource_units);
}
pr_out_array_start(ctx->dl, "match");
struct in_addr ip_addr;
ip_addr.s_addr = htonl(*(uint32_t *)value);
- pr_out_str(ctx->dl, dpipe_value_type_e2s(type), inet_ntoa(ip_addr));
+ check_indent_newline(ctx->dl);
+ print_string_name_value(dpipe_value_type_e2s(type), inet_ntoa(ip_addr));
}
static void
enum dpipe_value_type type,
void *value)
{
- pr_out_str(ctx->dl, dpipe_value_type_e2s(type),
- ether_ntoa((struct ether_addr *)value));
+ check_indent_newline(ctx->dl);
+ print_string_name_value(dpipe_value_type_e2s(type),
+ ether_ntoa((struct ether_addr *)value));
}
static void dpipe_field_printer_ipv6_addr(struct dpipe_ctx *ctx,
char str[INET6_ADDRSTRLEN];
inet_ntop(AF_INET6, value, str, INET6_ADDRSTRLEN);
- pr_out_str(ctx->dl, dpipe_value_type_e2s(type), str);
+ check_indent_newline(ctx->dl);
+ print_string_name_value(dpipe_value_type_e2s(type), str);
}
static struct dpipe_field_printer dpipe_field_printers_ipv4[] = {
if (value_len == sizeof(uint32_t)) {
uint32_t *value_32 = value;
- pr_out_uint(ctx->dl, dpipe_value_type_e2s(type), *value_32);
+ check_indent_newline(ctx->dl);
+ print_uint_name_value(dpipe_value_type_e2s(type), *value_32);
}
}
if (mapping) {
value_mapping = mnl_attr_get_u32(nla_match_value[DEVLINK_ATTR_DPIPE_VALUE_MAPPING]);
- pr_out_uint(ctx->dl, "mapping_value", value_mapping);
+ check_indent_newline(ctx->dl);
+ print_uint(PRINT_ANY, "mapping_value", "mapping_value %u", value_mapping);
}
if (mask) {
return -EINVAL;
}
+ check_indent_newline(ctx->dl);
entry_index = mnl_attr_get_u32(nla_entry[DEVLINK_ATTR_DPIPE_ENTRY_INDEX]);
- pr_out_uint(ctx->dl, "index", entry_index);
+ print_uint(PRINT_ANY, "index", "index %u", entry_index);
if (nla_entry[DEVLINK_ATTR_DPIPE_ENTRY_COUNTER]) {
counter = mnl_attr_get_u64(nla_entry[DEVLINK_ATTR_DPIPE_ENTRY_COUNTER]);
- pr_out_uint(ctx->dl, "counter", counter);
+ print_uint(PRINT_ANY, "counter", " counter %u", counter);
}
pr_out_array_start(ctx->dl, "match_value");
struct dl *dl = ctx->dl;
bool array = false;
- pr_out_str(dl, "name", resource->name);
+ check_indent_newline(dl);
+ print_string(PRINT_ANY, "name", "name %s", resource->name);
if (dl->verbose)
resource_path_print(dl, ctx->resources, resource->id);
pr_out_u64(dl, "size", resource->size);
if (resource->size != resource->size_new)
pr_out_u64(dl, "size_new", resource->size_new);
if (resource->occ_valid)
- pr_out_uint(dl, "occ", resource->size_occ);
- pr_out_str(dl, "unit", resource_unit_str_get(resource->unit));
+ print_uint(PRINT_ANY, "occ", " occ %u", resource->size_occ);
+ print_string(PRINT_ANY, "unit", " unit %s",
+ resource_unit_str_get(resource->unit));
if (resource->size_min != resource->size_max) {
- pr_out_uint(dl, "size_min", resource->size_min);
+ print_uint(PRINT_ANY, "size_min", " size_min %u",
+ resource->size_min);
pr_out_u64(dl, "size_max", resource->size_max);
- pr_out_uint(dl, "size_gran", resource->size_gran);
+ print_uint(PRINT_ANY, "size_gran", " size_gran %u",
+ resource->size_gran);
}
list_for_each_entry(table, &ctx->tables->table_list, list)
if (array)
pr_out_array_start(dl, "dpipe_tables");
else
- pr_out_str(dl, "dpipe_tables", "none");
+ print_string(PRINT_ANY, "dpipe_tables", " dpipe_tables none",
+ "none");
list_for_each_entry(table, &ctx->tables->table_list, list) {
if (table->resource_id != resource->id ||
!table->resource_valid)
continue;
pr_out_entry_start(dl);
- pr_out_str(dl, "table_name", table->name);
+ check_indent_newline(dl);
+ print_string(PRINT_ANY, "table_name", "table_name %s",
+ table->name);
pr_out_entry_end(dl);
}
if (array)
if (list_empty(&resource->resource_list))
return;
- if (ctx->pending_change)
- pr_out_str(dl, "size_valid", resource->size_valid ?
- "true" : "false");
+ if (ctx->pending_change) {
+ check_indent_newline(dl);
+ print_string(PRINT_ANY, "size_valid", "size_valid %s",
+ resource->size_valid ? "true" : "false");
+ }
pr_out_array_start(dl, "resources");
list_for_each_entry(child_resource, &resource->resource_list, list) {
pr_out_entry_start(dl);
char buf[256];
sprintf(buf, "%s/%s/%s", bus_name, dev_name, region_name);
- if (dl->json_output) {
- jsonw_name(dl->jw, buf);
- jsonw_start_object(dl->jw);
- } else {
+ if (dl->json_output)
+ open_json_object(buf);
+ else
pr_out("%s:", buf);
- }
}
static void pr_out_region_handle_end(struct dl *dl)
{
if (dl->json_output)
- jsonw_end_object(dl->jw);
+ close_json_object();
else
pr_out("\n");
}
static void pr_out_region_snapshots_start(struct dl *dl, bool array)
{
__pr_out_indent_newline(dl);
- if (dl->json_output) {
- jsonw_name(dl->jw, "snapshot");
- jsonw_start_array(dl->jw);
- } else {
+ if (dl->json_output)
+ open_json_array(PRINT_JSON, "snapshot");
+ else
pr_out("snapshot %s", array ? "[" : "");
- }
}
static void pr_out_region_snapshots_end(struct dl *dl, bool array)
{
if (dl->json_output)
- jsonw_end_array(dl->jw);
+ close_json_array(PRINT_JSON, NULL);
else if (array)
pr_out("]");
}
snapshot_id = mnl_attr_get_u32(tb[DEVLINK_ATTR_REGION_SNAPSHOT_ID]);
if (dl->json_output)
- jsonw_uint(dl->jw, snapshot_id);
+ print_uint(PRINT_JSON, NULL, NULL, snapshot_id);
else
pr_out("%s%u", index ? " " : "", snapshot_id);
}
uint8_t *data;
uint32_t len;
+ check_indent_newline(dl);
switch (type) {
case MNL_TYPE_FLAG:
- pr_out_bool_value(dl, mnl_attr_get_u8(nl_data));
+ print_bool(PRINT_ANY, NULL, "%s", mnl_attr_get_u8(nl_data));
break;
case MNL_TYPE_U8:
- pr_out_uint_value(dl, mnl_attr_get_u8(nl_data));
+ print_uint(PRINT_ANY, NULL, "%u", mnl_attr_get_u8(nl_data));
break;
case MNL_TYPE_U16:
- pr_out_uint_value(dl, mnl_attr_get_u16(nl_data));
+ print_uint(PRINT_ANY, NULL, "%u", mnl_attr_get_u16(nl_data));
break;
case MNL_TYPE_U32:
- pr_out_uint_value(dl, mnl_attr_get_u32(nl_data));
+ print_uint(PRINT_ANY, NULL, "%u", mnl_attr_get_u32(nl_data));
break;
case MNL_TYPE_U64:
- pr_out_uint64_value(dl, mnl_attr_get_u64(nl_data));
+ print_u64(PRINT_ANY, NULL, "%"PRIu64, mnl_attr_get_u64(nl_data));
break;
case MNL_TYPE_NUL_STRING:
- pr_out_str_value(dl, mnl_attr_get_str(nl_data));
+ print_string(PRINT_ANY, NULL, "%s", mnl_attr_get_str(nl_data));
break;
case MNL_TYPE_BINARY:
len = mnl_attr_get_payload_len(nl_data);
return MNL_CB_OK;
}
+static void pr_out_fmsg_name(struct dl *dl, char **name)
+{
+ if (!*name)
+ return;
+
+ pr_out_name(dl, *name);
+ free(*name);
+ *name = NULL;
+}
+
struct nest_entry {
int attr_type;
struct list_head list;
};
struct fmsg_cb_data {
+ char *name;
struct dl *dl;
uint8_t value_type;
struct list_head entry_list;
return MNL_CB_OK;
}
+static void pr_out_fmsg_group_start(struct dl *dl, char **name)
+{
+ __pr_out_newline();
+ pr_out_fmsg_name(dl, name);
+ __pr_out_newline();
+ __pr_out_indent_inc();
+}
+
+static void pr_out_fmsg_group_end(struct dl *dl)
+{
+ __pr_out_newline();
+ __pr_out_indent_dec();
+}
+
+static void pr_out_fmsg_start_object(struct dl *dl, char **name)
+{
+ if (dl->json_output) {
+ pr_out_fmsg_name(dl, name);
+ open_json_object(NULL);
+ } else {
+ pr_out_fmsg_group_start(dl, name);
+ }
+}
+
+static void pr_out_fmsg_end_object(struct dl *dl)
+{
+ if (dl->json_output)
+ close_json_object();
+ else
+ pr_out_fmsg_group_end(dl);
+}
+
+static void pr_out_fmsg_start_array(struct dl *dl, char **name)
+{
+ if (dl->json_output) {
+ pr_out_fmsg_name(dl, name);
+ open_json_array(PRINT_JSON, NULL);
+ } else {
+ pr_out_fmsg_group_start(dl, name);
+ }
+}
+
+static void pr_out_fmsg_end_array(struct dl *dl)
+{
+ if (dl->json_output)
+ close_json_array(PRINT_JSON, NULL);
+ else
+ pr_out_fmsg_group_end(dl);
+}
+
static int cmd_fmsg_nest(struct fmsg_cb_data *fmsg_data, uint8_t nest_value,
bool start)
{
switch (value) {
case DEVLINK_ATTR_FMSG_OBJ_NEST_START:
if (start)
- pr_out_entry_start(dl);
+ pr_out_fmsg_start_object(dl, &fmsg_data->name);
else
- pr_out_entry_end(dl);
+ pr_out_fmsg_end_object(dl);
break;
case DEVLINK_ATTR_FMSG_PAIR_NEST_START:
break;
case DEVLINK_ATTR_FMSG_ARR_NEST_START:
- if (dl->json_output) {
- if (start)
- jsonw_start_array(dl->jw);
- else
- jsonw_end_array(dl->jw);
- } else {
- if (start) {
- __pr_out_newline();
- __pr_out_indent_inc();
- } else {
- __pr_out_indent_dec();
- }
- }
+ if (start)
+ pr_out_fmsg_start_array(dl, &fmsg_data->name);
+ else
+ pr_out_fmsg_end_array(dl);
break;
default:
return -EINVAL;
return err;
break;
case DEVLINK_ATTR_FMSG_OBJ_NAME:
- pr_out_name(dl, mnl_attr_get_str(nla_object));
+ free(fmsg_data->name);
+ fmsg_data->name = strdup(mnl_attr_get_str(nla_object));
+ if (!fmsg_data->name)
+ return -ENOMEM;
break;
case DEVLINK_ATTR_FMSG_OBJ_VALUE_TYPE:
fmsg_data->value_type = mnl_attr_get_u8(nla_object);
break;
case DEVLINK_ATTR_FMSG_OBJ_VALUE_DATA:
+ pr_out_fmsg_name(dl, &fmsg_data->name);
err = fmsg_value_show(dl, fmsg_data->value_type,
nla_object);
if (err != MNL_CB_OK)
return MNL_CB_OK;
}
+static void cmd_fmsg_init(struct dl *dl, struct fmsg_cb_data *data)
+{
+ /* FMSG is dynamic: opening of an object or array causes a
+ * newline. JSON starts with an { or [, but plain text should
+ * not start with a new line. Ensure this by setting
+ * g_new_line_count to 1: avoiding newline before the first
+ * print.
+ */
+ g_new_line_count = 1;
+ data->name = NULL;
+ data->dl = dl;
+ INIT_LIST_HEAD(&data->entry_list);
+}
+
static int cmd_health_object_common(struct dl *dl, uint8_t cmd, uint16_t flags)
{
struct fmsg_cb_data data;
if (err)
return err;
- data.dl = dl;
- INIT_LIST_HEAD(&data.entry_list);
+ cmd_fmsg_init(dl, &data);
err = _mnlg_socket_sndrcv(dl->nlg, nlh, cmd_fmsg_object_cb, &data);
+ free(data.name);
return err;
}
out:
strftime(dump_date, HEALTH_REPORTER_TIMESTAMP_FMT_LEN, "%Y-%m-%d", info);
strftime(dump_time, HEALTH_REPORTER_TIMESTAMP_FMT_LEN, "%H:%M:%S", info);
- pr_out_str(dl, "last_dump_date", dump_date);
- pr_out_str(dl, "last_dump_time", dump_time);
+ check_indent_newline(dl);
+ print_string(PRINT_ANY, "last_dump_date", "last_dump_date %s", dump_date);
+ print_string(PRINT_ANY, "last_dump_time", " last_dump_time %s", dump_time);
}
static void pr_out_dump_report_timestamp(struct dl *dl, const struct nlattr *attr)
strftime(dump_date, HEALTH_REPORTER_TIMESTAMP_FMT_LEN, "%Y-%m-%d", tm);
strftime(dump_time, HEALTH_REPORTER_TIMESTAMP_FMT_LEN, "%H:%M:%S", tm);
- pr_out_str(dl, "last_dump_date", dump_date);
- pr_out_str(dl, "last_dump_time", dump_time);
+ check_indent_newline(dl);
+ print_string(PRINT_ANY, "last_dump_date", "last_dump_date %s", dump_date);
+ print_string(PRINT_ANY, "last_dump_time", " last_dump_time %s", dump_time);
}
static void pr_out_health(struct dl *dl, struct nlattr **tb_health)
pr_out_handle_start_arr(dl, tb_health);
- pr_out_str(dl, "reporter",
- mnl_attr_get_str(tb[DEVLINK_ATTR_HEALTH_REPORTER_NAME]));
+ check_indent_newline(dl);
+ print_string(PRINT_ANY, "reporter", "reporter %s",
+ mnl_attr_get_str(tb[DEVLINK_ATTR_HEALTH_REPORTER_NAME]));
if (!dl->json_output) {
__pr_out_newline();
__pr_out_indent_inc();
}
state = mnl_attr_get_u8(tb[DEVLINK_ATTR_HEALTH_REPORTER_STATE]);
- pr_out_str(dl, "state", health_state_name(state));
+ check_indent_newline(dl);
+ print_string(PRINT_ANY, "state", "state %s", health_state_name(state));
pr_out_u64(dl, "error",
mnl_attr_get_u64(tb[DEVLINK_ATTR_HEALTH_REPORTER_ERR_COUNT]));
pr_out_u64(dl, "recover",
pr_out_u64(dl, "grace_period",
mnl_attr_get_u64(tb[DEVLINK_ATTR_HEALTH_REPORTER_GRACEFUL_PERIOD]));
if (tb[DEVLINK_ATTR_HEALTH_REPORTER_AUTO_RECOVER])
- pr_out_bool(dl, "auto_recover",
- mnl_attr_get_u8(tb[DEVLINK_ATTR_HEALTH_REPORTER_AUTO_RECOVER]));
+ print_bool(PRINT_ANY, "auto_recover", " auto_recover %s",
+ mnl_attr_get_u8(tb[DEVLINK_ATTR_HEALTH_REPORTER_AUTO_RECOVER]));
__pr_out_indent_dec();
pr_out_handle_end(dl);
switch (attr->nla_type) {
case DEVLINK_ATTR_TRAP_METADATA_TYPE_IN_PORT:
return "input_port";
+ case DEVLINK_ATTR_TRAP_METADATA_TYPE_FA_COOKIE:
+ return "flow_action_cookie";
default:
return "<unknown metadata type>";
}
struct nlattr *attr_metadata;
pr_out_array_start(dl, "metadata");
- mnl_attr_for_each_nested(attr_metadata, attr)
- pr_out_str_value(dl, trap_metadata_name(attr_metadata));
+ mnl_attr_for_each_nested(attr_metadata, attr) {
+ check_indent_newline(dl);
+ print_string(PRINT_ANY, NULL, "%s",
+ trap_metadata_name(attr_metadata));
+ }
pr_out_array_end(dl);
}
else
__pr_out_handle_start(dl, tb, true, false);
- pr_out_str(dl, "name", mnl_attr_get_str(tb[DEVLINK_ATTR_TRAP_NAME]));
- pr_out_str(dl, "type", trap_type_name(type));
- pr_out_bool(dl, "generic", !!tb[DEVLINK_ATTR_TRAP_GENERIC]);
- pr_out_str(dl, "action", trap_action_name(action));
- pr_out_str(dl, "group",
- mnl_attr_get_str(tb[DEVLINK_ATTR_TRAP_GROUP_NAME]));
+ check_indent_newline(dl);
+ print_string(PRINT_ANY, "name", "name %s",
+ mnl_attr_get_str(tb[DEVLINK_ATTR_TRAP_NAME]));
+ print_string(PRINT_ANY, "type", " type %s", trap_type_name(type));
+ print_bool(PRINT_ANY, "generic", " generic %s", !!tb[DEVLINK_ATTR_TRAP_GENERIC]);
+ print_string(PRINT_ANY, "action", " action %s", trap_action_name(action));
+ print_string(PRINT_ANY, "group", " group %s",
+ mnl_attr_get_str(tb[DEVLINK_ATTR_TRAP_GROUP_NAME]));
if (dl->verbose)
pr_out_trap_metadata(dl, tb[DEVLINK_ATTR_TRAP_METADATA]);
pr_out_stats(dl, tb[DEVLINK_ATTR_STATS]);
else
__pr_out_handle_start(dl, tb, true, false);
- pr_out_str(dl, "name",
- mnl_attr_get_str(tb[DEVLINK_ATTR_TRAP_GROUP_NAME]));
- pr_out_bool(dl, "generic", !!tb[DEVLINK_ATTR_TRAP_GENERIC]);
+ check_indent_newline(dl);
+ print_string(PRINT_ANY, "name", "name %s",
+ mnl_attr_get_str(tb[DEVLINK_ATTR_TRAP_GROUP_NAME]));
+ print_bool(PRINT_ANY, "generic", " generic %s", !!tb[DEVLINK_ATTR_TRAP_GENERIC]);
pr_out_stats(dl, tb[DEVLINK_ATTR_STATS]);
pr_out_handle_end(dl);
}
pr_err("Failed to create index map\n");
goto err_ifname_map_create;
}
- if (dl->json_output) {
- dl->jw = jsonw_new(stdout);
- if (!dl->jw) {
- pr_err("Failed to create JSON writer\n");
- goto err_json_new;
- }
- jsonw_pretty(dl->jw, dl->pretty_output);
- }
+ new_json_obj_plain(dl->json_output);
return 0;
-err_json_new:
- ifname_map_fini(dl);
err_ifname_map_create:
mnlg_socket_close(dl->nlg);
return err;
static void dl_fini(struct dl *dl)
{
- if (dl->json_output)
- jsonw_destroy(&dl->jw);
+ delete_json_obj_plain();
ifname_map_fini(dl);
mnlg_socket_close(dl->nlg);
}
dl->json_output = true;
break;
case 'p':
- dl->pretty_output = true;
+ pretty = true;
break;
case 'v':
dl->verbose = true;