mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-08 14:23:19 +00:00
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: Leon Romanovsky <leonro@mellanox.com> Reviewed-by: Steve Wise <swise@opengridcomputing.com>
This commit is contained in:
parent
5d7ee40907
commit
e3a2b93ddd
@ -134,8 +134,7 @@ int ib_nl_handle_ip_res_resp(struct sk_buff *skb,
|
||||
const struct nlmsghdr *nlh = (struct nlmsghdr *)cb->nlh;
|
||||
|
||||
if ((nlh->nlmsg_flags & NLM_F_REQUEST) ||
|
||||
!(NETLINK_CB(skb).sk) ||
|
||||
!netlink_capable(skb, CAP_NET_ADMIN))
|
||||
!(NETLINK_CB(skb).sk))
|
||||
return -EPERM;
|
||||
|
||||
if (ib_nl_is_good_ip_resp(nlh))
|
||||
|
@ -1088,11 +1088,17 @@ EXPORT_SYMBOL(ib_get_net_dev_by_params);
|
||||
|
||||
static const struct ibnl_client_cbs ibnl_ls_cb_table[] = {
|
||||
[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] = {
|
||||
.dump = ib_nl_handle_set_timeout},
|
||||
.dump = ib_nl_handle_set_timeout,
|
||||
.flags = RDMA_NL_ADMIN_PERM,
|
||||
},
|
||||
[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)
|
||||
|
@ -171,6 +171,10 @@ static int rdma_nl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh,
|
||||
if (!is_nl_valid(index, op))
|
||||
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,
|
||||
* there is no need to use netlink_dump_start.
|
||||
|
@ -1033,8 +1033,7 @@ int ib_nl_handle_set_timeout(struct sk_buff *skb,
|
||||
int ret;
|
||||
|
||||
if (!(nlh->nlmsg_flags & NLM_F_REQUEST) ||
|
||||
!(NETLINK_CB(skb).sk) ||
|
||||
!netlink_capable(skb, CAP_NET_ADMIN))
|
||||
!(NETLINK_CB(skb).sk))
|
||||
return -EPERM;
|
||||
|
||||
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,
|
||||
int ret;
|
||||
|
||||
if ((nlh->nlmsg_flags & NLM_F_REQUEST) ||
|
||||
!(NETLINK_CB(skb).sk) ||
|
||||
!netlink_capable(skb, CAP_NET_ADMIN))
|
||||
!(NETLINK_CB(skb).sk))
|
||||
return -EPERM;
|
||||
|
||||
spin_lock_irqsave(&ib_nl_request_lock, flags);
|
||||
|
@ -7,6 +7,12 @@
|
||||
|
||||
struct ibnl_client_cbs {
|
||||
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,
|
||||
};
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user