4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version
7 * 2 of the License, or (at your option) any later version.
9 * Authors: Leon Romanovsky <leonro@mellanox.com>
14 static int dev_help(struct rd
*rd
)
16 pr_out("Usage: %s dev show [DEV]\n", rd
->filename
);
20 static const char *dev_caps_to_str(uint32_t idx
)
22 #define RDMA_DEV_FLAGS(x) \
28 x(CHANGE_PHY_PORT, 5) \
29 x(UD_AV_PORT_ENFORCE_PORT_ENFORCE, 6) \
30 x(CURR_QP_STATE_MOD, 7) \
33 x(PORT_ACTIVE_EVENT, 10) \
34 x(SYS_IMAGE_GUID, 11) \
35 x(RC_RNR_NAK_GEN, 12) \
38 x(LOCAL_DMA_LKEY, 15) \
43 x(MEM_MGT_EXTENSIONS, 21) \
44 x(BLOCK_MULTICAST_LOOPBACK, 22) \
45 x(MEM_WINDOW_TYPE_2A, 23) \
46 x(MEM_WINDOW_TYPE_2B, 24) \
49 x(CROSS_CHANNEL, 27) \
50 x(MANAGED_FLOW_STEERING, 29) \
51 x(SIGNATURE_HANDOVER, 30) \
52 x(ON_DEMAND_PAGING, 31) \
54 x(VIRTUAL_FUNCTION, 33) \
55 x(RAW_SCATTER_FCS, 34) \
56 x(RDMA_NETDEV_OPA_VNIC, 35)
58 enum { RDMA_DEV_FLAGS(RDMA_BITMAP_ENUM
) };
60 static const char * const
61 rdma_dev_names
[] = { RDMA_DEV_FLAGS(RDMA_BITMAP_NAMES
) };
64 if (idx
< ARRAY_SIZE(rdma_dev_names
) && rdma_dev_names
[idx
])
65 return rdma_dev_names
[idx
];
69 static void dev_print_caps(struct rd
*rd
, struct nlattr
**tb
)
74 if (!tb
[RDMA_NLDEV_ATTR_CAP_FLAGS
])
77 caps
= mnl_attr_get_u64(tb
[RDMA_NLDEV_ATTR_CAP_FLAGS
]);
79 if (rd
->json_output
) {
80 jsonw_name(rd
->jw
, "caps");
81 jsonw_start_array(rd
->jw
);
85 for (idx
= 0; caps
; idx
++) {
87 if (rd
->json_output
) {
88 jsonw_string(rd
->jw
, dev_caps_to_str(idx
));
90 pr_out("%s", dev_caps_to_str(idx
));
99 jsonw_end_array(rd
->jw
);
104 static void dev_print_fw(struct rd
*rd
, struct nlattr
**tb
)
107 if (!tb
[RDMA_NLDEV_ATTR_FW_VERSION
])
110 str
= mnl_attr_get_str(tb
[RDMA_NLDEV_ATTR_FW_VERSION
]);
112 jsonw_string_field(rd
->jw
, "fw", str
);
114 pr_out("fw %s ", str
);
117 static void dev_print_node_guid(struct rd
*rd
, struct nlattr
**tb
)
123 if (!tb
[RDMA_NLDEV_ATTR_NODE_GUID
])
126 node_guid
= mnl_attr_get_u64(tb
[RDMA_NLDEV_ATTR_NODE_GUID
]);
127 memcpy(vp
, &node_guid
, sizeof(uint64_t));
128 snprintf(str
, 32, "%04x:%04x:%04x:%04x", vp
[3], vp
[2], vp
[1], vp
[0]);
130 jsonw_string_field(rd
->jw
, "node_guid", str
);
132 pr_out("node_guid %s ", str
);
135 static void dev_print_sys_image_guid(struct rd
*rd
, struct nlattr
**tb
)
137 uint64_t sys_image_guid
;
141 if (!tb
[RDMA_NLDEV_ATTR_SYS_IMAGE_GUID
])
144 sys_image_guid
= mnl_attr_get_u64(tb
[RDMA_NLDEV_ATTR_SYS_IMAGE_GUID
]);
145 memcpy(vp
, &sys_image_guid
, sizeof(uint64_t));
146 snprintf(str
, 32, "%04x:%04x:%04x:%04x", vp
[3], vp
[2], vp
[1], vp
[0]);
148 jsonw_string_field(rd
->jw
, "sys_image_guid", str
);
150 pr_out("sys_image_guid %s ", str
);
153 static const char *node_type_to_str(uint8_t node_type
)
155 static const char * const node_type_str
[] = { "unknown", "ca",
159 if (node_type
< ARRAY_SIZE(node_type_str
))
160 return node_type_str
[node_type
];
164 static void dev_print_node_type(struct rd
*rd
, struct nlattr
**tb
)
166 const char *node_str
;
169 if (!tb
[RDMA_NLDEV_ATTR_DEV_NODE_TYPE
])
172 node_type
= mnl_attr_get_u8(tb
[RDMA_NLDEV_ATTR_DEV_NODE_TYPE
]);
173 node_str
= node_type_to_str(node_type
);
175 jsonw_string_field(rd
->jw
, "node_type", node_str
);
177 pr_out("node_type %s ", node_str
);
180 static int dev_parse_cb(const struct nlmsghdr
*nlh
, void *data
)
182 struct nlattr
*tb
[RDMA_NLDEV_ATTR_MAX
] = {};
183 struct rd
*rd
= data
;
187 mnl_attr_parse(nlh
, 0, rd_attr_cb
, tb
);
188 if (!tb
[RDMA_NLDEV_ATTR_DEV_INDEX
] || !tb
[RDMA_NLDEV_ATTR_DEV_NAME
])
191 idx
= mnl_attr_get_u32(tb
[RDMA_NLDEV_ATTR_DEV_INDEX
]);
192 name
= mnl_attr_get_str(tb
[RDMA_NLDEV_ATTR_DEV_NAME
]);
193 if (rd
->json_output
) {
194 jsonw_uint_field(rd
->jw
, "ifindex", idx
);
195 jsonw_string_field(rd
->jw
, "ifname", name
);
197 pr_out("%u: %s: ", idx
, name
);
200 dev_print_node_type(rd
, tb
);
201 dev_print_fw(rd
, tb
);
202 dev_print_node_guid(rd
, tb
);
203 dev_print_sys_image_guid(rd
, tb
);
204 if (rd
->show_details
)
205 dev_print_caps(rd
, tb
);
207 if (!rd
->json_output
)
212 static int dev_no_args(struct rd
*rd
)
217 rd_prepare_msg(rd
, RDMA_NLDEV_CMD_GET
,
218 &seq
, (NLM_F_REQUEST
| NLM_F_ACK
));
219 mnl_attr_put_u32(rd
->nlh
, RDMA_NLDEV_ATTR_DEV_INDEX
, rd
->dev_idx
);
220 ret
= rd_send_msg(rd
);
225 jsonw_start_object(rd
->jw
);
226 ret
= rd_recv_msg(rd
, dev_parse_cb
, rd
, seq
);
228 jsonw_end_object(rd
->jw
);
232 static int dev_one_show(struct rd
*rd
)
234 const struct rd_cmd cmds
[] = {
235 { NULL
, dev_no_args
},
239 return rd_exec_cmd(rd
, cmds
, "parameter");
242 static int dev_show(struct rd
*rd
)
244 struct dev_map
*dev_map
;
248 jsonw_start_array(rd
->jw
);
250 list_for_each_entry(dev_map
, &rd
->dev_map_list
, list
) {
251 rd
->dev_idx
= dev_map
->idx
;
252 ret
= dev_one_show(rd
);
257 dev_map
= dev_map_lookup(rd
, false);
259 pr_err("Wrong device name\n");
264 rd
->dev_idx
= dev_map
->idx
;
265 ret
= dev_one_show(rd
);
269 jsonw_end_array(rd
->jw
);
273 int cmd_dev(struct rd
*rd
)
275 const struct rd_cmd cmds
[] = {
277 { "show", dev_show
},
278 { "list", dev_show
},
279 { "help", dev_help
},
283 return rd_exec_cmd(rd
, cmds
, "dev command");