Commit e3a2b93d authored by Leon Romanovsky's avatar Leon Romanovsky Committed by Leon Romanovsky

RDMA/netlink: Add flag to consolidate common handling

Add ability to provide flags to control RDMA netlink callbacks
and convert addr.c and sa_query.c to be first users of such
infrastructure. It allows to move their CAP_NET_ADMIN checks
into netlink core.
Signed-off-by: default avatarLeon Romanovsky <leonro@mellanox.com>
Reviewed-by: default avatarSteve Wise <swise@opengridcomputing.com>
parent 5d7ee409
...@@ -134,8 +134,7 @@ int ib_nl_handle_ip_res_resp(struct sk_buff *skb, ...@@ -134,8 +134,7 @@ int ib_nl_handle_ip_res_resp(struct sk_buff *skb,
const struct nlmsghdr *nlh = (struct nlmsghdr *)cb->nlh; const struct nlmsghdr *nlh = (struct nlmsghdr *)cb->nlh;
if ((nlh->nlmsg_flags & NLM_F_REQUEST) || if ((nlh->nlmsg_flags & NLM_F_REQUEST) ||
!(NETLINK_CB(skb).sk) || !(NETLINK_CB(skb).sk))
!netlink_capable(skb, CAP_NET_ADMIN))
return -EPERM; return -EPERM;
if (ib_nl_is_good_ip_resp(nlh)) if (ib_nl_is_good_ip_resp(nlh))
......
...@@ -1088,11 +1088,17 @@ EXPORT_SYMBOL(ib_get_net_dev_by_params); ...@@ -1088,11 +1088,17 @@ EXPORT_SYMBOL(ib_get_net_dev_by_params);
static const struct ibnl_client_cbs ibnl_ls_cb_table[] = { static const struct ibnl_client_cbs ibnl_ls_cb_table[] = {
[RDMA_NL_LS_OP_RESOLVE] = { [RDMA_NL_LS_OP_RESOLVE] = {
.dump = ib_nl_handle_resolve_resp}, .dump = ib_nl_handle_resolve_resp,
.flags = RDMA_NL_ADMIN_PERM,
},
[RDMA_NL_LS_OP_SET_TIMEOUT] = { [RDMA_NL_LS_OP_SET_TIMEOUT] = {
.dump = ib_nl_handle_set_timeout}, .dump = ib_nl_handle_set_timeout,
.flags = RDMA_NL_ADMIN_PERM,
},
[RDMA_NL_LS_OP_IP_RESOLVE] = { [RDMA_NL_LS_OP_IP_RESOLVE] = {
.dump = ib_nl_handle_ip_res_resp}, .dump = ib_nl_handle_ip_res_resp,
.flags = RDMA_NL_ADMIN_PERM,
},
}; };
static int __init ib_core_init(void) static int __init ib_core_init(void)
......
...@@ -171,6 +171,10 @@ static int rdma_nl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, ...@@ -171,6 +171,10 @@ static int rdma_nl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh,
if (!is_nl_valid(index, op)) if (!is_nl_valid(index, op))
return -EINVAL; return -EINVAL;
if ((rdma_nl_types[index].cb_table[op].flags & RDMA_NL_ADMIN_PERM) &&
!netlink_capable(skb, CAP_NET_ADMIN))
return -EPERM;
/* /*
* For response or local service set_timeout request, * For response or local service set_timeout request,
* there is no need to use netlink_dump_start. * there is no need to use netlink_dump_start.
......
...@@ -1033,8 +1033,7 @@ int ib_nl_handle_set_timeout(struct sk_buff *skb, ...@@ -1033,8 +1033,7 @@ int ib_nl_handle_set_timeout(struct sk_buff *skb,
int ret; int ret;
if (!(nlh->nlmsg_flags & NLM_F_REQUEST) || if (!(nlh->nlmsg_flags & NLM_F_REQUEST) ||
!(NETLINK_CB(skb).sk) || !(NETLINK_CB(skb).sk))
!netlink_capable(skb, CAP_NET_ADMIN))
return -EPERM; return -EPERM;
ret = nla_parse(tb, LS_NLA_TYPE_MAX - 1, nlmsg_data(nlh), ret = nla_parse(tb, LS_NLA_TYPE_MAX - 1, nlmsg_data(nlh),
...@@ -1109,8 +1108,7 @@ int ib_nl_handle_resolve_resp(struct sk_buff *skb, ...@@ -1109,8 +1108,7 @@ int ib_nl_handle_resolve_resp(struct sk_buff *skb,
int ret; int ret;
if ((nlh->nlmsg_flags & NLM_F_REQUEST) || if ((nlh->nlmsg_flags & NLM_F_REQUEST) ||
!(NETLINK_CB(skb).sk) || !(NETLINK_CB(skb).sk))
!netlink_capable(skb, CAP_NET_ADMIN))
return -EPERM; return -EPERM;
spin_lock_irqsave(&ib_nl_request_lock, flags); spin_lock_irqsave(&ib_nl_request_lock, flags);
......
...@@ -7,6 +7,12 @@ ...@@ -7,6 +7,12 @@
struct ibnl_client_cbs { struct ibnl_client_cbs {
int (*dump)(struct sk_buff *skb, struct netlink_callback *nlcb); int (*dump)(struct sk_buff *skb, struct netlink_callback *nlcb);
u8 flags;
};
enum rdma_nl_flags {
/* Require CAP_NET_ADMIN */
RDMA_NL_ADMIN_PERM = 1 << 0,
}; };
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment