@@ -83,6 +83,11 @@ rdma res show qp link mlx5_4/1 lqpn 0-6
Limit to specific Local QPNs.
.RE
.PP
+rdma res show qp link mlx5_4/1 lqpn 6 -r
+.RS 4
+Driver specific details in raw format.
+.RE
+.PP
rdma resource show cm_id dst-port 7174
.RS 4
Show CM_IDs with destination ip port of 7174.
@@ -51,6 +51,10 @@ If there were any errors during execution of the commands, the application retur
.BR "\-d" , " --details"
Output detailed information. Adding a second \-d includes driver-specific details.
+.TP
+.BR "\-r" , " --raw"
+Output includes driver-specific details in raw format.
+
.TP
.BR "\-p" , " --pretty"
When combined with -j generate a pretty JSON output.
@@ -112,6 +112,7 @@ int main(int argc, char **argv)
{ "json", no_argument, NULL, 'j' },
{ "pretty", no_argument, NULL, 'p' },
{ "details", no_argument, NULL, 'd' },
+ { "raw", no_argument, NULL, 'r' },
{ "force", no_argument, NULL, 'f' },
{ "batch", required_argument, NULL, 'b' },
{ NULL, 0, NULL, 0 }
@@ -120,6 +121,7 @@ int main(int argc, char **argv)
const char *batch_file = NULL;
bool show_details = false;
bool json_output = false;
+ bool show_raw = false;
bool force = false;
struct rd rd = {};
char *filename;
@@ -127,7 +129,7 @@ int main(int argc, char **argv)
int err;
filename = basename(argv[0]);
- while ((opt = getopt_long(argc, argv, ":Vhdpjfb:",
+ while ((opt = getopt_long(argc, argv, ":Vhdrpjfb:",
long_options, NULL)) >= 0) {
switch (opt) {
case 'V':
@@ -143,6 +145,9 @@ int main(int argc, char **argv)
else
show_details = true;
break;
+ case 'r':
+ show_raw = true;
+ break;
case 'j':
json_output = 1;
break;
@@ -172,6 +177,7 @@ int main(int argc, char **argv)
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);
if (err)
@@ -57,8 +57,9 @@ struct rd {
int argc;
char **argv;
char *filename;
- bool show_details;
- bool show_driver_details;
+ uint8_t show_details:1;
+ uint8_t show_driver_details:1;
+ uint8_t show_raw:1;
struct list_head dev_map_list;
uint32_t dev_idx;
uint32_t port_idx;
@@ -134,9 +135,11 @@ int rd_attr_check(const struct nlattr *attr, int *typep);
* Print helpers
*/
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_on_off(struct rd *rd, const char *key_str, bool on);
+void print_raw_data(struct rd *rd, struct nlattr **nla_line);
#define MAX_LINE_LENGTH 80
#endif /* _RDMA_TOOL_H_ */
@@ -71,16 +71,38 @@ struct res_qp_info {
char *comm;
};
-static bool resp_is_valid(struct nlattr **nla_line)
+static bool resp_is_valid(struct nlattr **nla_line, bool raw)
{
- if (!nla_line[RDMA_NLDEV_ATTR_RES_LQPN] ||
- !nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN] ||
+ if (!nla_line[RDMA_NLDEV_ATTR_RES_LQPN])
+ return false;
+
+ if (raw)
+ return nla_line[RDMA_NLDEV_ATTR_RES_RAW] ? true : false;
+
+ if (!nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN] ||
!nla_line[RDMA_NLDEV_ATTR_RES_TYPE] ||
!nla_line[RDMA_NLDEV_ATTR_RES_STATE])
return false;
+
return true;
}
+static void res_qp_line_raw(struct rd *rd, const char *name, int idx,
+ struct nlattr **nla_line,
+ struct res_qp_info *info)
+{
+ open_json_object(NULL);
+ print_link(rd, idx, name, info->port, nla_line);
+ res_print_uint(rd, "lqpn", info->lqpn,
+ nla_line[RDMA_NLDEV_ATTR_RES_LQPN]);
+
+ res_print_uint(rd, "pid", info->pid, nla_line[RDMA_NLDEV_ATTR_RES_PID]);
+ print_comm(rd, info->comm, nla_line);
+
+ print_raw_data(rd, nla_line);
+ newline(rd);
+}
+
static void res_qp_line_query(struct rd *rd, const char *name, int idx,
struct nlattr **nla_line,
struct res_qp_info *info)
@@ -156,8 +178,9 @@ static int res_qp_line(struct rd *rd, const char *name, int idx,
struct nlattr **nla_line)
{
struct res_qp_info info = {};
+ bool raw = rd->show_raw;
- if (!resp_is_valid(nla_line))
+ if (!resp_is_valid(nla_line, raw))
return MNL_CB_ERROR;
if (nla_line[RDMA_NLDEV_ATTR_PORT_INDEX])
@@ -187,7 +210,11 @@ static int res_qp_line(struct rd *rd, const char *name, int idx,
info.comm = (char *)mnl_attr_get_str(line);
}
- res_qp_line_query(rd, name, idx, nla_line, &info);
+ if (raw)
+ res_qp_line_raw(rd, name, idx, nla_line, &info);
+ else
+ res_qp_line_query(rd, name, idx, nla_line, &info);
+
out:
if (nla_line[RDMA_NLDEV_ATTR_RES_PID])
free(info.comm);
@@ -97,6 +97,7 @@ int _res_send_idx_msg(struct rd *rd, uint32_t command, mnl_cb_t callback,
mnl_attr_put_u32(rd->nlh, id, idx);
+ mnl_attr_put_u8(rd->nlh, RDMA_NLDEV_ATTR_RES_RAW, rd->show_raw);
if (command == RDMA_NLDEV_CMD_STAT_GET)
mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_STAT_RES,
RDMA_NLDEV_ATTR_RES_MR);
@@ -450,6 +450,7 @@ static const enum mnl_attr_data_type nldev_policy[RDMA_NLDEV_ATTR_MAX] = {
[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)
@@ -890,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;