Commit c9a641 (first appearred in 1.2.12) added support for setting
the guest-side IP address of veth devices in lxc domains.
Unfortunately, it hardcoded the assumption that the proper prefix for
any IP address with no explicit prefix in the config should be "24";
that is only correct for class C IPv4 addresses, but not for any other
IPv4 address, nor for any IPv6 address.
The good news is that there is already a function in libvirt that will
determine the proper default prefix for any IP address. This patch
replaces the use of the ill-fated VIR_SOCKET_ADDR_DEFAULT_PREFIX with
calls to virSocketAddrGetIPPrefix().
---
src/lxc/lxc_container.c | 17 ++++++++++++-----
src/util/virsocketaddr.h | 1 -
2 files changed, 12 insertions(+), 6 deletions(-)
diff --git a/src/lxc/lxc_container.c b/src/lxc/lxc_container.c
index 3d9e28b..304aa86 100644
--- a/src/lxc/lxc_container.c
+++ b/src/lxc/lxc_container.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008-2015 Red Hat, Inc.
+ * Copyright (C) 2008-2016 Red Hat, Inc.
* Copyright (C) 2008 IBM Corp.
* Copyright (c) 2015 SUSE LINUX Products GmbH, Nuernberg, Germany.
*
@@ -514,12 +514,19 @@ static int lxcContainerRenameAndEnableInterfaces(virDomainDefPtr
vmDef,
for (j = 0; j < netDef->nips; j++) {
virDomainNetIPDefPtr ip = netDef->ips[j];
- unsigned int prefix = (ip->prefix > 0) ? ip->prefix :
- VIR_SOCKET_ADDR_DEFAULT_PREFIX;
+ int prefix;
char *ipStr = virSocketAddrFormat(&ip->address);
- VIR_DEBUG("Adding IP address '%s/%u' to '%s'",
- ipStr, ip->prefix, newname);
+ if ((prefix = virSocketAddrGetIPPrefix(&ip->address,
+ NULL, ip->prefix)) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Failed to determine prefix for IP address
'%s'"),
+ ipStr);
+ goto error_out;
+ }
+
+ VIR_DEBUG("Adding IP address '%s/%d' to '%s'",
+ ipStr, prefix, newname);
if (virNetDevSetIPAddress(newname, &ip->address, NULL, prefix) < 0)
{
virReportError(VIR_ERR_SYSTEM_ERROR,
_("Failed to set IP address '%s' on
%s"),
diff --git a/src/util/virsocketaddr.h b/src/util/virsocketaddr.h
index 990e31c..7ee993b 100644
--- a/src/util/virsocketaddr.h
+++ b/src/util/virsocketaddr.h
@@ -54,7 +54,6 @@ typedef struct {
# define VIR_SOCKET_ADDR_FAMILY(s) \
((s)->data.sa.sa_family)
-# define VIR_SOCKET_ADDR_DEFAULT_PREFIX 24
# define VIR_SOCKET_ADDR_IPV4_ALL "0.0.0.0"
# define VIR_SOCKET_ADDR_IPV6_ALL "::"
--
2.5.5