From: Glauber Costa <glom...@parallels.com> The chosen architecture to deal with --ipadd with upstream containers is to create a veth pair and add the host side information to a bridge called venet0. This way, all the code that expects venet0 to exist can still work without modifications, (or with just a few).
Our intention to do that was actually already stated in the comments, but the code was removed before merging because --ipadd would not work without full unshare support anyway. This patch implements that. Signed-off-by: Glauber Costa <glom...@parallels.com> --- scripts/vps-functions.in | 7 +++++++ src/lib/hooks_ct.c | 37 +++++++++++++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/scripts/vps-functions.in b/scripts/vps-functions.in index 826c0a1..37b2de5 100755 --- a/scripts/vps-functions.in +++ b/scripts/vps-functions.in @@ -170,6 +170,13 @@ vzadjustmacs() # other setups, the bridge is expected to already exist and be valid. vzconfbridge() { + if [ "x$BRIDGE" == "xvenet0" ]; then + if [ $(brctl show venet0 2>/dev/null | tail -n+2 | wc -l) == 0 ]; then + brctl addbr venet0 + ${IP_CMD} link set venet0 up + fi + fi + if [ "x$BRIDGE" != "x" ]; then brctl addif $BRIDGE $HNAME >/dev/null 2>&1 fi diff --git a/src/lib/hooks_ct.c b/src/lib/hooks_ct.c index a791934..2d195a5 100644 --- a/src/lib/hooks_ct.c +++ b/src/lib/hooks_ct.c @@ -17,6 +17,7 @@ #include "logger.h" #include "script.h" #include "cgroup.h" +#include "linux/vzctl_venet.h" #define NETNS_RUN_DIR "/var/run/netns" @@ -695,8 +696,40 @@ static int ct_netdev_ctl(vps_handler *h, envid_t veid, int op, char *name) static int ct_ip_ctl(vps_handler *h, envid_t veid, int op, const char *ipstr) { - logger(-1, 0, "%s not yet supported upstream", __func__); - return 0; + int ret = -1; + char *envp[5]; + char buf[STR_SIZE]; + int i = 0; + + if (!h->can_join_pidns) { + logger(-1, 0, "Cannot join pid namespace: " + "--ipadd is not supported in kernels without full pidns support"); + return VZ_BAD_KERNEL; + } + envp[i++] = strdup("VNAME=venet0"); + envp[i++] = strdup("BRIDGE=venet0"); + + snprintf(buf, sizeof(buf), "HNAME=venet0.%d", veid); + envp[i++] = strdup(buf); + + snprintf(buf, sizeof(buf), "VEID=%d", veid); + envp[i++] = strdup(buf); + + envp[i] = NULL; + + if (op == VE_IP_ADD) { + char *argv[] = { VPS_NETNS_DEV_ADD, NULL }; + + ret = run_script(VPS_NETNS_DEV_ADD, argv, envp, 0); + } else { + char *argv[] = { VPS_NETNS_DEV_DEL, NULL }; + + ret = run_script(VPS_NETNS_DEV_DEL, argv, envp, 0); + } + free_arg(envp); + + return ret; + } /* -- 1.7.11.7 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel