From: Dongsheng Yang Date: Tue, 16 Sep 2014 04:58:55 +0000 (+0800) Subject: network: allow lxc_network_move_by_index() rename netdev in moving. X-Git-Tag: lxc-1.1.0.alpha3~74 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8d357196c4bebe2e77bfa545336dc24bd7b9039d;p=thirdparty%2Flxc.git network: allow lxc_network_move_by_index() rename netdev in moving. 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 Acked-by: Serge E. Hallyn --- diff --git a/src/lxc/conf.c b/src/lxc/conf.c index e493899cd..9ba18fe88 100644 --- a/src/lxc/conf.c +++ b/src/lxc/conf.c @@ -2703,7 +2703,7 @@ void restore_phys_nics_to_netns(int netnsfd, struct lxc_conf *conf) } for (i=0; inum_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); } @@ -3285,7 +3285,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 fc6f9db13..59a231e57 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 02f2a2cbb..a990994f2 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 909f3fe35..4c577b17d 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 a8e0612c1..768489df0 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