[Devel] [PATCH v2 7/8] automatically add bridge venet0 when needed

Kir Kolyshkin kir at openvz.org
Mon Apr 15 18:34:51 PDT 2013


On 03/22/2013 03:48 AM, Glauber Costa wrote:
> 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 <glommer at 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..ab05aa0 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

please use $() instead of `` since it's more readable

> +			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 6bd27c1..d5b15dc 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"
>   
> @@ -665,8 +666,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;
> +
>   }
>   
>   /*




More information about the Devel mailing list