[lxc-devel] [PATCH 4/9] network: allow lxc_network_move_by_index() rename netdev in moving.

Dongsheng Yang yangds.fnst at cn.fujitsu.com
Fri Oct 10 03:16:55 UTC 2014


In netlink, we can set the dest_name of netdev when move netdev
between namespaces in one netlink request. And moving a netdev of
a src_name to a netdev with a dest_name is a common usecase.

So this patch add a parametaer to lxc_network_move_by_index() to
indicate the dest_name for the movement. NULL means same with
the src_name.

Signed-off-by: Dongsheng Yang <yangds.fnst at cn.fujitsu.com>
Acked-by: Serge E. Hallyn <serge.hallyn at ubuntu.com>
---
 src/lxc/conf.c         |  4 ++--
 src/lxc/lxc_unshare.c  |  2 +-
 src/lxc/lxc_user_nic.c |  2 +-
 src/lxc/network.c      | 11 ++++++++---
 src/lxc/network.h      |  4 ++--
 5 files changed, 14 insertions(+), 9 deletions(-)

diff --git a/src/lxc/conf.c b/src/lxc/conf.c
index 3662503..9afdee6 100644
--- a/src/lxc/conf.c
+++ b/src/lxc/conf.c
@@ -2699,7 +2699,7 @@ void restore_phys_nics_to_netns(int netnsfd, struct lxc_conf *conf)
 	}
 	for (i=0; i<conf->num_savednics; i++) {
 		struct saved_nic *s = &conf->saved_nics[i];
-		if (lxc_netdev_move_by_index(s->ifindex, 1))
+		if (lxc_netdev_move_by_index(s->ifindex, 1, NULL))
 			WARN("Error moving nic index:%d back to host netns",
 					s->ifindex);
 	}
@@ -3281,7 +3281,7 @@ int lxc_assign_network(struct lxc_list *network, pid_t pid)
 		if (!netdev->ifindex)
 			continue;
 
-		err = lxc_netdev_move_by_index(netdev->ifindex, pid);
+		err = lxc_netdev_move_by_index(netdev->ifindex, pid, NULL);
 		if (err) {
 			ERROR("failed to move '%s' to the container : %s",
 			      netdev->link, strerror(-err));
diff --git a/src/lxc/lxc_unshare.c b/src/lxc/lxc_unshare.c
index fc6f9db..59a231e 100644
--- a/src/lxc/lxc_unshare.c
+++ b/src/lxc/lxc_unshare.c
@@ -240,7 +240,7 @@ int main(int argc, char *argv[])
 
 	if (my_iflist) {
 		for (tmpif = my_iflist; tmpif; tmpif = tmpif->mi_next) {
-			if (lxc_netdev_move_by_name(tmpif->mi_ifname, pid) < 0)
+			if (lxc_netdev_move_by_name(tmpif->mi_ifname, pid, NULL) < 0)
 				fprintf(stderr,"Could not move interface %s into container %d: %s\n", tmpif->mi_ifname, pid, strerror(errno));
 		}
 	}
diff --git a/src/lxc/lxc_user_nic.c b/src/lxc/lxc_user_nic.c
index 02f2a2c..a990994 100644
--- a/src/lxc/lxc_user_nic.c
+++ b/src/lxc/lxc_user_nic.c
@@ -268,7 +268,7 @@ static bool create_nic(char *nic, char *br, int pid, char **cnic)
 	}
 
 	/* pass veth2 to target netns */
-	ret = lxc_netdev_move_by_name(veth2buf, pid);
+	ret = lxc_netdev_move_by_name(veth2buf, pid, NULL);
 	if (ret < 0) {
 		fprintf(stderr, "Error moving %s to netns %d\n", veth2buf, pid);
 		goto out_del;
diff --git a/src/lxc/network.c b/src/lxc/network.c
index 909f3fe..4c577b1 100644
--- a/src/lxc/network.c
+++ b/src/lxc/network.c
@@ -103,7 +103,7 @@ struct rt_req {
 	struct rtmsg rt;
 };
 
-int lxc_netdev_move_by_index(int ifindex, pid_t pid)
+int lxc_netdev_move_by_index(int ifindex, pid_t pid, const char* ifname)
 {
 	struct nl_handler nlh;
 	struct nlmsg *nlmsg = NULL;
@@ -129,6 +129,11 @@ int lxc_netdev_move_by_index(int ifindex, pid_t pid)
 	if (nla_put_u32(nlmsg, IFLA_NET_NS_PID, pid))
 		goto out;
 
+	if (ifname != NULL) {
+		if (nla_put_string(nlmsg, IFLA_IFNAME, ifname))
+			goto out;
+	}
+
 	err = netlink_transaction(&nlh, nlmsg, nlmsg);
 out:
 	netlink_close(&nlh);
@@ -136,7 +141,7 @@ out:
 	return err;
 }
 
-int lxc_netdev_move_by_name(const char *ifname, pid_t pid)
+int lxc_netdev_move_by_name(const char *ifname, pid_t pid, const char* newname)
 {
 	int index;
 
@@ -147,7 +152,7 @@ int lxc_netdev_move_by_name(const char *ifname, pid_t pid)
 	if (!index)
 		return -EINVAL;
 
-	return lxc_netdev_move_by_index(index, pid);
+	return lxc_netdev_move_by_index(index, pid, newname);
 }
 
 int lxc_netdev_delete_by_index(int ifindex)
diff --git a/src/lxc/network.h b/src/lxc/network.h
index a8e0612..768489d 100644
--- a/src/lxc/network.h
+++ b/src/lxc/network.h
@@ -31,8 +31,8 @@ extern int lxc_convert_mac(char *macaddr, struct sockaddr *sockaddr);
 /*
  * Move a device between namespaces
  */
-extern int lxc_netdev_move_by_index(int ifindex, pid_t pid);
-extern int lxc_netdev_move_by_name(const char *ifname, pid_t pid);
+extern int lxc_netdev_move_by_index(int ifindex, pid_t pid, const char* ifname);
+extern int lxc_netdev_move_by_name(const char *ifname, pid_t pid, const char* newname);
 
 /*
  * Delete a network device
-- 
1.8.4.2



More information about the lxc-devel mailing list