diff options
author | Christian Brauner <christian@brauner.io> | 2018-09-04 15:53:47 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-09-06 01:27:11 -0400 |
commit | c383edc42403b0bca31cbaabafd44dd58afb202f (patch) | |
tree | e3f10f170946ec3834049ffce04402802a052ad9 | |
parent | d4cc597623c33b53346eae250475beebd17a6420 (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.h | 1 | ||||
-rw-r--r-- | net/core/rtnetlink.c | 17 |
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 | ||
166 | int rtnl_nla_parse_ifla(struct nlattr **tb, const struct nlattr *head, int len, | 166 | int 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); |
168 | struct 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 | ||
1848 | static 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 | */ | ||
1856 | struct 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 | } |
1873 | EXPORT_SYMBOL_GPL(rtnl_get_net_ns_capable); | ||
1865 | 1874 | ||
1866 | static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) | 1875 | static 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 | } |