rdma: add helper rd_sendrecv_msg()

This function sends the constructed netlink message and then
receives the response.

Change rd_recv_msg() to display any error messages.

Change 'rdma dev set' to use rd_sendrecv_msg().

Signed-off-by: Steve Wise <larrystevenwise@gmail.com>
Reviewed-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: David Ahern <dsahern@gmail.com>
This commit is contained in:
Steve Wise 2019-04-03 12:10:30 -05:00 committed by David Ahern
parent 65147bbe8f
commit 8f5cfd23cd
4 changed files with 22 additions and 1 deletions

View File

@ -268,7 +268,7 @@ static int dev_set_name(struct rd *rd)
mnl_attr_put_u32(rd->nlh, RDMA_NLDEV_ATTR_DEV_INDEX, rd->dev_idx);
mnl_attr_put_strz(rd->nlh, RDMA_NLDEV_ATTR_DEV_NAME, rd_argv(rd));
return rd_send_msg(rd);
return rd_sendrecv_msg(rd, seq);
}
static int dev_one_set(struct rd *rd)

View File

@ -68,6 +68,7 @@ struct rd {
json_writer_t *jw;
bool json_output;
bool pretty_output;
bool suppress_errors;
struct list_head filter_list;
};
@ -119,6 +120,7 @@ bool rd_is_string_filtered_attr(struct rd *rd, const char *key, const char *val,
*/
int rd_send_msg(struct rd *rd);
int rd_recv_msg(struct rd *rd, mnl_cb_t callback, void *data, uint32_t seq);
int rd_sendrecv_msg(struct rd *rd, unsigned int seq);
void rd_prepare_msg(struct rd *rd, uint32_t cmd, uint32_t *seq, uint16_t flags);
int rd_dev_init_cb(const struct nlmsghdr *nlh, void *data);
int rd_attr_cb(const struct nlattr *attr, void *data);

View File

@ -31,6 +31,7 @@ int res_qp_idx_parse_cb(const struct nlmsghdr *nlh, void *data);
if (id) { \
ret = rd_doit_index(rd, &idx); \
if (ret) { \
rd->suppress_errors = true; \
ret = _res_send_idx_msg(rd, command, \
name##_idx_parse_cb, \
idx, id); \

View File

@ -693,10 +693,28 @@ int rd_recv_msg(struct rd *rd, mnl_cb_t callback, void *data, unsigned int seq)
ret = mnl_cb_run(buf, ret, seq, portid, callback, data);
} while (ret > 0);
if (ret < 0 && !rd->suppress_errors)
perror("error");
mnl_socket_close(rd->nl);
return ret;
}
static int null_cb(const struct nlmsghdr *nlh, void *data)
{
return MNL_CB_OK;
}
int rd_sendrecv_msg(struct rd *rd, unsigned int seq)
{
int ret;
ret = rd_send_msg(rd);
if (!ret)
ret = rd_recv_msg(rd, null_cb, rd, seq);
return ret;
}
static struct dev_map *_dev_map_lookup(struct rd *rd, const char *dev_name)
{
struct dev_map *dev_map;