]> git.proxmox.com Git - mirror_iproute2.git/blobdiff - rdma/utils.c
rdma: Fix owner name for the kernel resources
[mirror_iproute2.git] / rdma / utils.c
index aed1a3d011570e1af9dca7b77952dde6eda88a81..4d3de4fadba2e5deb5a496988bae6486a5f0ef0d 100644 (file)
@@ -56,7 +56,7 @@ bool rd_no_arg(struct rd *rd)
  * mlx5_1/1    | 1          | false
  * mlx5_1/-    | 0          | false
  *
- * In strict mode, /- will return error.
+ * In strict port mode, a non-0 port must be provided
  */
 static int get_port_from_argv(struct rd *rd, uint32_t *port,
                              bool *is_dump_all, bool strict_port)
@@ -64,7 +64,7 @@ static int get_port_from_argv(struct rd *rd, uint32_t *port,
        char *slash;
 
        *port = 0;
-       *is_dump_all = true;
+       *is_dump_all = strict_port ? false : true;
 
        slash = strchr(rd_argv(rd), '/');
        /* if no port found, return 0 */
@@ -83,6 +83,9 @@ static int get_port_from_argv(struct rd *rd, uint32_t *port,
                if (!*port && strlen(slash))
                        return -EINVAL;
        }
+       if (strict_port && (*port == 0))
+               return -EINVAL;
+
        return 0;
 }
 
@@ -446,6 +449,8 @@ static const enum mnl_attr_data_type nldev_policy[RDMA_NLDEV_ATTR_MAX] = {
        [RDMA_NLDEV_ATTR_STAT_MODE] = MNL_TYPE_U32,
        [RDMA_NLDEV_ATTR_STAT_RES] = MNL_TYPE_U32,
        [RDMA_NLDEV_ATTR_STAT_AUTO_MODE_MASK] = MNL_TYPE_U32,
+       [RDMA_NLDEV_ATTR_DEV_DIM] = MNL_TYPE_U8,
+       [RDMA_NLDEV_ATTR_RES_RAW] = MNL_TYPE_BINARY,
 };
 
 int rd_attr_check(const struct nlattr *attr, int *typep)
@@ -544,8 +549,7 @@ int rd_exec_link(struct rd *rd, int (*cb)(struct rd *rd), bool strict_port)
        uint32_t port;
        int ret = 0;
 
-       if (rd->json_output)
-               jsonw_start_array(rd->jw);
+       new_json_obj(rd->json_output);
        if (rd_no_arg(rd)) {
                list_for_each_entry(dev_map, &rd->dev_map_list, list) {
                        rd->dev_idx = dev_map->idx;
@@ -585,8 +589,7 @@ int rd_exec_link(struct rd *rd, int (*cb)(struct rd *rd), bool strict_port)
        }
 
 out:
-       if (rd->json_output)
-               jsonw_end_array(rd->jw);
+       delete_json_obj();
        return ret;
 }
 
@@ -595,8 +598,7 @@ int rd_exec_dev(struct rd *rd, int (*cb)(struct rd *rd))
        struct dev_map *dev_map;
        int ret = 0;
 
-       if (rd->json_output)
-               jsonw_start_array(rd->jw);
+       new_json_obj(rd->json_output);
        if (rd_no_arg(rd)) {
                list_for_each_entry(dev_map, &rd->dev_map_list, list) {
                        rd->dev_idx = dev_map->idx;
@@ -616,8 +618,7 @@ int rd_exec_dev(struct rd *rd, int (*cb)(struct rd *rd))
                ret = cb(rd);
        }
 out:
-       if (rd->json_output)
-               jsonw_end_array(rd->jw);
+       delete_json_obj();
        return ret;
 }
 
@@ -762,96 +763,95 @@ struct dev_map *dev_map_lookup(struct rd *rd, bool allow_port_index)
 
 void newline(struct rd *rd)
 {
-       if (rd->json_output)
-               jsonw_end_array(rd->jw);
-       else
-               pr_out("\n");
+       close_json_object();
+       print_color_string(PRINT_FP, COLOR_NONE, NULL, "\n", NULL);
 }
 
 void newline_indent(struct rd *rd)
 {
        newline(rd);
-       if (!rd->json_output)
-               pr_out("    ");
+       print_color_string(PRINT_FP, COLOR_NONE, NULL, "    ", NULL);
 }
 
 static int print_driver_string(struct rd *rd, const char *key_str,
                                 const char *val_str)
 {
-       if (rd->json_output) {
-               jsonw_string_field(rd->jw, key_str, val_str);
-               return 0;
-       } else {
-               return pr_out("%s %s ", key_str, 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);
+       return 0;
+}
+
+void print_on_off(struct rd *rd, const char *key_str, bool on)
+{
+       print_driver_string(rd, key_str, (on) ? "on":"off");
 }
 
 static int print_driver_s32(struct rd *rd, const char *key_str, int32_t val,
                              enum rdma_nldev_print_type print_type)
 {
-       if (rd->json_output) {
-               jsonw_int_field(rd->jw, key_str, val);
-               return 0;
-       }
-       switch (print_type) {
-       case RDMA_NLDEV_PRINT_TYPE_UNSPEC:
-               return pr_out("%s %d ", key_str, val);
-       case RDMA_NLDEV_PRINT_TYPE_HEX:
-               return pr_out("%s 0x%x ", key_str, val);
-       default:
-               return -EINVAL;
+       if (!rd->json_output) {
+               switch (print_type) {
+               case RDMA_NLDEV_PRINT_TYPE_UNSPEC:
+                       return pr_out("%s %d ", key_str, val);
+               case RDMA_NLDEV_PRINT_TYPE_HEX:
+                       return pr_out("%s 0x%x ", key_str, val);
+               default:
+                       return -EINVAL;
+               }
        }
+       print_color_int(PRINT_JSON, COLOR_NONE, 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)
 {
-       if (rd->json_output) {
-               jsonw_int_field(rd->jw, key_str, val);
-               return 0;
-       }
-       switch (print_type) {
-       case RDMA_NLDEV_PRINT_TYPE_UNSPEC:
-               return pr_out("%s %u ", key_str, val);
-       case RDMA_NLDEV_PRINT_TYPE_HEX:
-               return pr_out("%s 0x%x ", key_str, val);
-       default:
-               return -EINVAL;
+       if (!rd->json_output) {
+               switch (print_type) {
+               case RDMA_NLDEV_PRINT_TYPE_UNSPEC:
+                       return pr_out("%s %u ", key_str, val);
+               case RDMA_NLDEV_PRINT_TYPE_HEX:
+                       return pr_out("%s 0x%x ", key_str, val);
+               default:
+                       return -EINVAL;
+               }
        }
+       print_color_int(PRINT_JSON, COLOR_NONE, 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)
 {
-       if (rd->json_output) {
-               jsonw_int_field(rd->jw, key_str, val);
-               return 0;
-       }
-       switch (print_type) {
-       case RDMA_NLDEV_PRINT_TYPE_UNSPEC:
-               return pr_out("%s %" PRId64 " ", key_str, val);
-       case RDMA_NLDEV_PRINT_TYPE_HEX:
-               return pr_out("%s 0x%" PRIx64 " ", key_str, val);
-       default:
-               return -EINVAL;
+       if (!rd->json_output) {
+               switch (print_type) {
+               case RDMA_NLDEV_PRINT_TYPE_UNSPEC:
+                       return pr_out("%s %" PRId64 " ", key_str, val);
+               case RDMA_NLDEV_PRINT_TYPE_HEX:
+                       return pr_out("%s 0x%" PRIx64 " ", key_str, val);
+               default:
+                       return -EINVAL;
+               }
        }
+       print_color_int(PRINT_JSON, COLOR_NONE, 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)
 {
-       if (rd->json_output) {
-               jsonw_int_field(rd->jw, key_str, val);
-               return 0;
-       }
-       switch (print_type) {
-       case RDMA_NLDEV_PRINT_TYPE_UNSPEC:
-               return pr_out("%s %" PRIu64 " ", key_str, val);
-       case RDMA_NLDEV_PRINT_TYPE_HEX:
-               return pr_out("%s 0x%" PRIx64 " ", key_str, val);
-       default:
-               return -EINVAL;
+       if (!rd->json_output) {
+               switch (print_type) {
+               case RDMA_NLDEV_PRINT_TYPE_UNSPEC:
+                       return pr_out("%s %" PRIu64 " ", key_str, val);
+               case RDMA_NLDEV_PRINT_TYPE_HEX:
+                       return pr_out("%s 0x%" PRIx64 " ", key_str, val);
+               default:
+                       return -EINVAL;
+               }
        }
+       print_color_int(PRINT_JSON, COLOR_NONE, key_str, NULL, val);
+       return 0;
 }
 
 static int print_driver_entry(struct rd *rd, struct nlattr *key_attr,
@@ -891,6 +891,25 @@ static int print_driver_entry(struct rd *rd, struct nlattr *key_attr,
        return ret;
 }
 
+void print_raw_data(struct rd *rd, struct nlattr **nla_line)
+{
+       uint8_t *data;
+       uint32_t len;
+       int i = 0;
+
+       if (!rd->show_raw)
+               return;
+
+       len = mnl_attr_get_payload_len(nla_line[RDMA_NLDEV_ATTR_RES_RAW]);
+       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]);
+               i++;
+       }
+       close_json_array(PRINT_ANY, ">");
+}
+
 void print_driver_table(struct rd *rd, struct nlattr *tb)
 {
        int print_type = RDMA_NLDEV_PRINT_TYPE_UNSPEC;