1
2
3
4
5
6#ifndef _RDMA_TOOL_RES_H_
7#define _RDMA_TOOL_RES_H_
8
9#include "rdma.h"
10
11int _res_send_msg(struct rd *rd, uint32_t command, mnl_cb_t callback);
12int _res_send_idx_msg(struct rd *rd, uint32_t command, mnl_cb_t callback,
13 uint32_t idx, uint32_t id);
14
15int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data);
16int res_pd_idx_parse_cb(const struct nlmsghdr *nlh, void *data);
17int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data);
18int res_mr_idx_parse_cb(const struct nlmsghdr *nlh, void *data);
19int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data);
20int res_cq_idx_parse_cb(const struct nlmsghdr *nlh, void *data);
21int res_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data);
22int res_cm_id_idx_parse_cb(const struct nlmsghdr *nlh, void *data);
23int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data);
24int res_qp_idx_parse_cb(const struct nlmsghdr *nlh, void *data);
25int res_ctx_parse_cb(const struct nlmsghdr *nlh, void *data);
26int res_ctx_idx_parse_cb(const struct nlmsghdr *nlh, void *data);
27int res_srq_parse_cb(const struct nlmsghdr *nlh, void *data);
28int res_srq_idx_parse_cb(const struct nlmsghdr *nlh, void *data);
29
30static inline uint32_t res_get_command(uint32_t command, struct rd *rd)
31{
32 if (!rd->show_raw)
33 return command;
34
35 switch (command) {
36 case RDMA_NLDEV_CMD_RES_QP_GET:
37 return RDMA_NLDEV_CMD_RES_QP_GET_RAW;
38 case RDMA_NLDEV_CMD_RES_CQ_GET:
39 return RDMA_NLDEV_CMD_RES_CQ_GET_RAW;
40 case RDMA_NLDEV_CMD_RES_MR_GET:
41 return RDMA_NLDEV_CMD_RES_MR_GET_RAW;
42 case RDMA_NLDEV_CMD_RES_SRQ_GET:
43 return RDMA_NLDEV_CMD_RES_SRQ_GET_RAW;
44 default:
45 return command;
46 }
47}
48
49#define RES_FUNC(name, command, valid_filters, strict_port, id) \
50 static inline int _##name(struct rd *rd) \
51 { \
52 uint32_t idx, _command; \
53 int ret; \
54 _command = res_get_command(command, rd); \
55 if (id) { \
56 ret = rd_doit_index(rd, &idx); \
57 if (ret) { \
58 rd->suppress_errors = true; \
59 ret = _res_send_idx_msg(rd, _command, \
60 name##_idx_parse_cb, \
61 idx, id); \
62 if (!ret || rd->show_raw) \
63 return ret; \
64
65
66 \
67 } \
68 } \
69 return _res_send_msg(rd, _command, name##_parse_cb); \
70 } \
71 static inline int name(struct rd *rd) \
72 { \
73 int ret = rd_build_filter(rd, valid_filters); \
74 if (ret) \
75 return ret; \
76 if ((uintptr_t)valid_filters != (uintptr_t)NULL) { \
77 ret = rd_set_arg_to_devname(rd); \
78 if (ret) \
79 return ret; \
80 } \
81 if (strict_port) \
82 return rd_exec_dev(rd, _##name); \
83 else \
84 return rd_exec_link(rd, _##name, strict_port); \
85 }
86
87static const
88struct filters pd_valid_filters[MAX_NUMBER_OF_FILTERS] = {
89 { .name = "dev", .is_number = false },
90 { .name = "users", .is_number = true },
91 { .name = "pid", .is_number = true },
92 { .name = "ctxn", .is_number = true },
93 { .name = "pdn", .is_number = true, .is_doit = true },
94 { .name = "ctxn", .is_number = true }
95};
96
97RES_FUNC(res_pd, RDMA_NLDEV_CMD_RES_PD_GET, pd_valid_filters, true,
98 RDMA_NLDEV_ATTR_RES_PDN);
99
100static const
101struct filters mr_valid_filters[MAX_NUMBER_OF_FILTERS] = {
102 { .name = "dev", .is_number = false },
103 { .name = "rkey", .is_number = true },
104 { .name = "lkey", .is_number = true },
105 { .name = "mrlen", .is_number = true },
106 { .name = "pid", .is_number = true },
107 { .name = "mrn", .is_number = true, .is_doit = true },
108 { .name = "pdn", .is_number = true }
109};
110
111RES_FUNC(res_mr, RDMA_NLDEV_CMD_RES_MR_GET, mr_valid_filters, true,
112 RDMA_NLDEV_ATTR_RES_MRN);
113
114static const
115struct filters cq_valid_filters[MAX_NUMBER_OF_FILTERS] = {
116 { .name = "dev", .is_number = false },
117 { .name = "users", .is_number = true },
118 { .name = "poll-ctx", .is_number = false },
119 { .name = "pid", .is_number = true },
120 { .name = "cqn", .is_number = true, .is_doit = true },
121 { .name = "ctxn", .is_number = true }
122};
123
124RES_FUNC(res_cq, RDMA_NLDEV_CMD_RES_CQ_GET, cq_valid_filters, true,
125 RDMA_NLDEV_ATTR_RES_CQN);
126
127static const
128struct filters cm_id_valid_filters[MAX_NUMBER_OF_FILTERS] = {
129 { .name = "link", .is_number = false },
130 { .name = "lqpn", .is_number = true },
131 { .name = "qp-type", .is_number = false },
132 { .name = "state", .is_number = false },
133 { .name = "ps", .is_number = false },
134 { .name = "dev-type", .is_number = false },
135 { .name = "transport-type", .is_number = false },
136 { .name = "pid", .is_number = true },
137 { .name = "src-addr", .is_number = false },
138 { .name = "src-port", .is_number = true },
139 { .name = "dst-addr", .is_number = false },
140 { .name = "dst-port", .is_number = true },
141 { .name = "cm-idn", .is_number = true, .is_doit = true }
142};
143
144RES_FUNC(res_cm_id, RDMA_NLDEV_CMD_RES_CM_ID_GET, cm_id_valid_filters, false,
145 RDMA_NLDEV_ATTR_RES_CM_IDN);
146
147static const struct
148filters qp_valid_filters[MAX_NUMBER_OF_FILTERS] = {
149 { .name = "link", .is_number = false },
150 { .name = "lqpn", .is_number = true, .is_doit = true },
151 { .name = "rqpn", .is_number = true },
152 { .name = "pid", .is_number = true },
153 { .name = "sq-psn", .is_number = true },
154 { .name = "rq-psn", .is_number = true },
155 { .name = "type", .is_number = false },
156 { .name = "path-mig-state", .is_number = false },
157 { .name = "state", .is_number = false },
158 { .name = "pdn", .is_number = true },
159};
160
161RES_FUNC(res_qp, RDMA_NLDEV_CMD_RES_QP_GET, qp_valid_filters, false,
162 RDMA_NLDEV_ATTR_RES_LQPN);
163
164static const
165struct filters ctx_valid_filters[MAX_NUMBER_OF_FILTERS] = {
166 { .name = "dev", .is_number = false },
167 { .name = "pid", .is_number = true },
168 { .name = "ctxn", .is_number = true, .is_doit = true },
169};
170
171RES_FUNC(res_ctx, RDMA_NLDEV_CMD_RES_CTX_GET, ctx_valid_filters, true,
172 RDMA_NLDEV_ATTR_RES_CTXN);
173
174static const
175struct filters srq_valid_filters[MAX_NUMBER_OF_FILTERS] = {
176 { .name = "dev", .is_number = false },
177 { .name = "pid", .is_number = true },
178 { .name = "srqn", .is_number = true, .is_doit = true },
179 { .name = "type", .is_number = false },
180 { .name = "pdn", .is_number = true },
181 { .name = "cqn", .is_number = true },
182 { .name = "lqpn", .is_number = true },
183};
184
185RES_FUNC(res_srq, RDMA_NLDEV_CMD_RES_SRQ_GET, srq_valid_filters, true,
186 RDMA_NLDEV_ATTR_RES_SRQN);
187
188void print_dev(uint32_t idx, const char *name);
189void print_link(uint32_t idx, const char *name, uint32_t port, struct nlattr **nla_line);
190void print_key(const char *name, uint64_t val, struct nlattr *nlattr);
191void res_print_u32(const char *name, uint32_t val, struct nlattr *nlattr);
192void res_print_u64(const char *name, uint64_t val, struct nlattr *nlattr);
193void print_comm(const char *str, struct nlattr **nla_line);
194const char *qp_types_to_str(uint8_t idx);
195void print_qp_type(uint32_t val);
196#endif
197