rtnetlink: add rtnl_get_net_ns_capable()
get_target_net() will be used in follow-up patches in ipv{4,6} codepaths to retrieve network namespaces based on network namespace identifiers. So remove the static declaration and export in the rtnetlink header. Also, rename it to rtnl_get_net_ns_capable() to make it obvious what this function is doing. Export rtnl_get_net_ns_capable() so it can be used when ipv6 is built as a module. Signed-off-by: Christian Brauner <christian@brauner.io> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
d4cc597623
commit
c383edc424
|
@ -165,6 +165,7 @@ int rtnl_configure_link(struct net_device *dev, const struct ifinfomsg *ifm);
|
|||
|
||||
int rtnl_nla_parse_ifla(struct nlattr **tb, const struct nlattr *head, int len,
|
||||
struct netlink_ext_ack *exterr);
|
||||
struct net *rtnl_get_net_ns_capable(struct sock *sk, int netnsid);
|
||||
|
||||
#define MODULE_ALIAS_RTNL_LINK(kind) MODULE_ALIAS("rtnl-link-" kind)
|
||||
|
||||
|
|
|
@ -1845,7 +1845,15 @@ static bool link_dump_filtered(struct net_device *dev,
|
|||
return false;
|
||||
}
|
||||
|
||||
static struct net *get_target_net(struct sock *sk, int netnsid)
|
||||
/**
|
||||
* rtnl_get_net_ns_capable - Get netns if sufficiently privileged.
|
||||
* @sk: netlink socket
|
||||
* @netnsid: network namespace identifier
|
||||
*
|
||||
* Returns the network namespace identified by netnsid on success or an error
|
||||
* pointer on failure.
|
||||
*/
|
||||
struct net *rtnl_get_net_ns_capable(struct sock *sk, int netnsid)
|
||||
{
|
||||
struct net *net;
|
||||
|
||||
|
@ -1862,6 +1870,7 @@ static struct net *get_target_net(struct sock *sk, int netnsid)
|
|||
}
|
||||
return net;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rtnl_get_net_ns_capable);
|
||||
|
||||
static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
|
||||
{
|
||||
|
@ -1897,7 +1906,7 @@ static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
|
|||
ifla_policy, NULL) >= 0) {
|
||||
if (tb[IFLA_IF_NETNSID]) {
|
||||
netnsid = nla_get_s32(tb[IFLA_IF_NETNSID]);
|
||||
tgt_net = get_target_net(skb->sk, netnsid);
|
||||
tgt_net = rtnl_get_net_ns_capable(skb->sk, netnsid);
|
||||
if (IS_ERR(tgt_net)) {
|
||||
tgt_net = net;
|
||||
netnsid = -1;
|
||||
|
@ -2765,7 +2774,7 @@ static int rtnl_dellink(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|||
|
||||
if (tb[IFLA_IF_NETNSID]) {
|
||||
netnsid = nla_get_s32(tb[IFLA_IF_NETNSID]);
|
||||
tgt_net = get_target_net(NETLINK_CB(skb).sk, netnsid);
|
||||
tgt_net = rtnl_get_net_ns_capable(NETLINK_CB(skb).sk, netnsid);
|
||||
if (IS_ERR(tgt_net))
|
||||
return PTR_ERR(tgt_net);
|
||||
}
|
||||
|
@ -3175,7 +3184,7 @@ static int rtnl_getlink(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|||
|
||||
if (tb[IFLA_IF_NETNSID]) {
|
||||
netnsid = nla_get_s32(tb[IFLA_IF_NETNSID]);
|
||||
tgt_net = get_target_net(NETLINK_CB(skb).sk, netnsid);
|
||||
tgt_net = rtnl_get_net_ns_capable(NETLINK_CB(skb).sk, netnsid);
|
||||
if (IS_ERR(tgt_net))
|
||||
return PTR_ERR(tgt_net);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue