summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Brauner <christian@brauner.io>2018-09-04 15:53:47 -0400
committerDavid S. Miller <davem@davemloft.net>2018-09-06 01:27:11 -0400
commitc383edc42403b0bca31cbaabafd44dd58afb202f (patch)
treee3f10f170946ec3834049ffce04402802a052ad9
parentd4cc597623c33b53346eae250475beebd17a6420 (diff)
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>
-rw-r--r--include/net/rtnetlink.h1
-rw-r--r--net/core/rtnetlink.c17
2 files changed, 14 insertions, 4 deletions
diff --git a/include/net/rtnetlink.h b/include/net/rtnetlink.h
index 0bbaa5488423..cf26e5aacac4 100644
--- a/include/net/rtnetlink.h
+++ b/include/net/rtnetlink.h
@@ -165,6 +165,7 @@ int rtnl_configure_link(struct net_device *dev, const struct ifinfomsg *ifm);
165 165
166int rtnl_nla_parse_ifla(struct nlattr **tb, const struct nlattr *head, int len, 166int rtnl_nla_parse_ifla(struct nlattr **tb, const struct nlattr *head, int len,
167 struct netlink_ext_ack *exterr); 167 struct netlink_ext_ack *exterr);
168struct net *rtnl_get_net_ns_capable(struct sock *sk, int netnsid);
168 169
169#define MODULE_ALIAS_RTNL_LINK(kind) MODULE_ALIAS("rtnl-link-" kind) 170#define MODULE_ALIAS_RTNL_LINK(kind) MODULE_ALIAS("rtnl-link-" kind)
170 171
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index 60c928894a78..c49097237c30 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -1845,7 +1845,15 @@ static bool link_dump_filtered(struct net_device *dev,
1845 return false; 1845 return false;
1846} 1846}
1847 1847
1848static struct net *get_target_net(struct sock *sk, int netnsid) 1848/**
1849 * rtnl_get_net_ns_capable - Get netns if sufficiently privileged.
1850 * @sk: netlink socket
1851 * @netnsid: network namespace identifier
1852 *
1853 * Returns the network namespace identified by netnsid on success or an error
1854 * pointer on failure.
1855 */
1856struct net *rtnl_get_net_ns_capable(struct sock *sk, int netnsid)
1849{ 1857{
1850 struct net *net; 1858 struct net *net;
1851 1859
@@ -1862,6 +1870,7 @@ static struct net *get_target_net(struct sock *sk, int netnsid)
1862 } 1870 }
1863 return net; 1871 return net;
1864} 1872}
1873EXPORT_SYMBOL_GPL(rtnl_get_net_ns_capable);
1865 1874
1866static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) 1875static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
1867{ 1876{
@@ -1897,7 +1906,7 @@ static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
1897 ifla_policy, NULL) >= 0) { 1906 ifla_policy, NULL) >= 0) {
1898 if (tb[IFLA_IF_NETNSID]) { 1907 if (tb[IFLA_IF_NETNSID]) {
1899 netnsid = nla_get_s32(tb[IFLA_IF_NETNSID]); 1908 netnsid = nla_get_s32(tb[IFLA_IF_NETNSID]);
1900 tgt_net = get_target_net(skb->sk, netnsid); 1909 tgt_net = rtnl_get_net_ns_capable(skb->sk, netnsid);
1901 if (IS_ERR(tgt_net)) { 1910 if (IS_ERR(tgt_net)) {
1902 tgt_net = net; 1911 tgt_net = net;
1903 netnsid = -1; 1912 netnsid = -1;
@@ -2765,7 +2774,7 @@ static int rtnl_dellink(struct sk_buff *skb, struct nlmsghdr *nlh,
2765 2774
2766 if (tb[IFLA_IF_NETNSID]) { 2775 if (tb[IFLA_IF_NETNSID]) {
2767 netnsid = nla_get_s32(tb[IFLA_IF_NETNSID]); 2776 netnsid = nla_get_s32(tb[IFLA_IF_NETNSID]);
2768 tgt_net = get_target_net(NETLINK_CB(skb).sk, netnsid); 2777 tgt_net = rtnl_get_net_ns_capable(NETLINK_CB(skb).sk, netnsid);
2769 if (IS_ERR(tgt_net)) 2778 if (IS_ERR(tgt_net))
2770 return PTR_ERR(tgt_net); 2779 return PTR_ERR(tgt_net);
2771 } 2780 }
@@ -3175,7 +3184,7 @@ static int rtnl_getlink(struct sk_buff *skb, struct nlmsghdr *nlh,
3175 3184
3176 if (tb[IFLA_IF_NETNSID]) { 3185 if (tb[IFLA_IF_NETNSID]) {
3177 netnsid = nla_get_s32(tb[IFLA_IF_NETNSID]); 3186 netnsid = nla_get_s32(tb[IFLA_IF_NETNSID]);
3178 tgt_net = get_target_net(NETLINK_CB(skb).sk, netnsid); 3187 tgt_net = rtnl_get_net_ns_capable(NETLINK_CB(skb).sk, netnsid);
3179 if (IS_ERR(tgt_net)) 3188 if (IS_ERR(tgt_net))
3180 return PTR_ERR(tgt_net); 3189 return PTR_ERR(tgt_net);
3181 } 3190 }