@@ -60,6 +60,8 @@ struct netns_func {
};
int netns_id_from_name(struct rtnl_handle *rtnl, const char *name);
+int set_netns_id_from_name(struct rtnl_handle *rtnl, const char *name,
+ int nsid);
char *netns_name_from_id(int32_t id);
#endif /* __NAMESPACE_H__ */
@@ -63,8 +63,6 @@ void netns_nsid_socket_init(void);
int print_nsid(struct nlmsghdr *n, void *arg);
int ipstats_print(struct nlmsghdr *n, void *arg);
char *get_name_from_nsid(int nsid);
-int get_netnsid_from_name(const char *name);
-int set_netnsid_from_name(const char *name, int nsid);
int do_ipaddr(int argc, char **argv);
int do_ipaddrlabel(int argc, char **argv);
int do_iproute(int argc, char **argv);
@@ -817,11 +817,11 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req, char **type)
NEXT_ARG();
if (link_netnsid != -1)
duparg("link-netns/link-netnsid", *argv);
- link_netnsid = get_netnsid_from_name(*argv);
+ link_netnsid = netns_id_from_name(&rth, *argv);
/* No nsid? Try to assign one. */
if (link_netnsid < 0)
- set_netnsid_from_name(*argv, -1);
- link_netnsid = get_netnsid_from_name(*argv);
+ set_netns_id_from_name(&rth, *argv, -1);
+ link_netnsid = netns_id_from_name(&rth, *argv);
if (link_netnsid < 0)
invarg("Invalid \"link-netns\" value\n",
*argv);
@@ -104,7 +104,7 @@ static int ipnetns_have_nsid(void)
return have_rtnl_getnsid;
}
-int get_netnsid_from_name(const char *name)
+static int get_netnsid_from_name(const char *name)
{
netns_nsid_socket_init();
@@ -896,33 +896,11 @@ out_delete:
return -1;
}
-int set_netnsid_from_name(const char *name, int nsid)
+static int set_netnsid_from_name(const char *name, int nsid)
{
- struct {
- struct nlmsghdr n;
- struct rtgenmsg g;
- char buf[1024];
- } req = {
- .n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtgenmsg)),
- .n.nlmsg_flags = NLM_F_REQUEST,
- .n.nlmsg_type = RTM_NEWNSID,
- .g.rtgen_family = AF_UNSPEC,
- };
- int fd, err = 0;
-
netns_nsid_socket_init();
- fd = netns_get_fd(name);
- if (fd < 0)
- return fd;
-
- addattr32(&req.n, 1024, NETNSA_FD, fd);
- addattr32(&req.n, 1024, NETNSA_NSID, nsid);
- if (rtnl_talk(&rth, &req.n, NULL) < 0)
- err = -2;
-
- close(fd);
- return err;
+ return set_netns_id_from_name(&rth, name, nsid);
}
static int netns_set(int argc, char **argv)
@@ -189,6 +189,33 @@ out:
return ret;
}
+int set_netns_id_from_name(struct rtnl_handle *rtnl, const char *name, int nsid)
+{
+ struct {
+ struct nlmsghdr n;
+ struct rtgenmsg g;
+ char buf[1024];
+ } req = {
+ .n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtgenmsg)),
+ .n.nlmsg_flags = NLM_F_REQUEST,
+ .n.nlmsg_type = RTM_NEWNSID,
+ .g.rtgen_family = AF_UNSPEC,
+ };
+ int fd, err = 0;
+
+ fd = netns_get_fd(name);
+ if (fd < 0)
+ return fd;
+
+ addattr32(&req.n, 1024, NETNSA_FD, fd);
+ addattr32(&req.n, 1024, NETNSA_NSID, nsid);
+ if (rtnl_talk(rtnl, &req.n, NULL) < 0)
+ err = -2;
+
+ close(fd);
+ return err;
+}
+
struct netns_name_from_id_ctx {
int32_t id;
char *name;
Move set_netnsid_from_name() outside for reuse, like what's done for netns_id_from_name(). Signed-off-by: Xiao Liang <shaw.leon@gmail.com> --- include/namespace.h | 2 ++ ip/ip_common.h | 2 -- ip/iplink.c | 6 +++--- ip/ipnetns.c | 28 +++------------------------- lib/namespace.c | 27 +++++++++++++++++++++++++++ 5 files changed, 35 insertions(+), 30 deletions(-)