From: Nikolay Shirokovskiy Date: Wed, 20 Apr 2016 14:05:38 +0000 (+0300) Subject: vz: fix updating to no gateways X-Git-Tag: v2.0.0-rc1~10 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=62b0066de49a2fd3afb442c7e7aadf9997c4ec37;p=thirdparty%2Flibvirt.git vz: fix updating to no gateways Current code that pass gateways to vz sdk is not suitable for updates. If update has no gateways while we had them before we need to pass "" for vz sdk gateways to reset old value. The code definitely deserves its own function. Drop checks that skip setting gateways if network address is not set. Such a configuration is possible in vz sdk. Signed-off-by: Nikolay Shirokovskiy --- diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index 7e41f49ebe..71c14315f7 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -2936,6 +2936,87 @@ static const char * prlsdkFormatMac(virMacAddrPtr mac, char *macstr) return macstr; } +static int prlsdkConfigureGateways(PRL_HANDLE sdknet, virDomainNetDefPtr net) +{ + int ret = -1; + size_t i; + virNetworkRouteDefPtr route4 = NULL, route6 = NULL; + char *gw4 = NULL, *gw6 = NULL; + PRL_RESULT pret; + + for (i = 0; i < net->nroutes; i++) { + virSocketAddrPtr addrdst, gateway; + virSocketAddr zero; + + addrdst = virNetworkRouteDefGetAddress(net->routes[i]); + gateway = virNetworkRouteDefGetGateway(net->routes[i]); + + ignore_value(virSocketAddrParse(&zero, + (VIR_SOCKET_ADDR_IS_FAMILY(addrdst, AF_INET) + ? VIR_SOCKET_ADDR_IPV4_ALL + : VIR_SOCKET_ADDR_IPV6_ALL), + VIR_SOCKET_ADDR_FAMILY(addrdst))); + + if (!virSocketAddrEqual(addrdst, &zero)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Support only default gateway")); + return -1; + } + + switch (VIR_SOCKET_ADDR_FAMILY(gateway)) { + case AF_INET: + if (route4) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Support only one IPv4 default gateway")); + return -1; + } + + route4 = net->routes[i]; + + break; + case AF_INET6: + if (route6) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Support only one IPv6 default gateway")); + return -1; + } + + route6 = net->routes[i]; + + break; + default: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unsupported address family %d " + "Only IPv4 or IPv6 default gateway"), + VIR_SOCKET_ADDR_FAMILY(gateway)); + + return -1; + } + } + + if (route4 && + !(gw4 = virSocketAddrFormat(virNetworkRouteDefGetGateway(route4)))) + goto cleanup; + + pret = PrlVmDevNet_SetDefaultGateway(sdknet, gw4 ? : ""); + prlsdkCheckRetGoto(pret, cleanup); + + if (route6 && + !(gw6 = virSocketAddrFormat(virNetworkRouteDefGetGateway(route6)))) + goto cleanup; + + pret = PrlVmDevNet_SetDefaultGatewayIPv6(sdknet, gw6 ? : ""); + prlsdkCheckRetGoto(pret, cleanup); + + ret = 0; + + cleanup: + VIR_FREE(gw4); + VIR_FREE(gw6); + + return ret; +} + static int prlsdkConfigureNet(vzDriverPtr driver, PRL_HANDLE sdkdom, virDomainNetDefPtr net, @@ -3024,82 +3105,8 @@ static int prlsdkConfigureNet(vzDriverPtr driver, pret = PrlVmDevNet_SetAutoApply(sdknet, true); prlsdkCheckRetGoto(pret, cleanup); - if (net->nroutes) { - bool alreadySetIPv4Gateway = false; - bool alreadySetIPv6Gateway = false; - - for (i = 0; i < net->nroutes; i++) { - virSocketAddrPtr addrdst, gateway; - virSocketAddr zero; - - addrdst = virNetworkRouteDefGetAddress(net->routes[i]); - gateway = virNetworkRouteDefGetGateway(net->routes[i]); - - ignore_value(virSocketAddrParse(&zero, - (VIR_SOCKET_ADDR_IS_FAMILY(addrdst, AF_INET) - ? VIR_SOCKET_ADDR_IPV4_ALL - : VIR_SOCKET_ADDR_IPV6_ALL), - VIR_SOCKET_ADDR_FAMILY(addrdst))); - - if (!virSocketAddrEqual(addrdst, &zero)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Support only default gateway")); - goto cleanup; - } - - switch (VIR_SOCKET_ADDR_FAMILY(gateway)) { - case AF_INET: - - if (!ipv4present) - continue; - - if (alreadySetIPv4Gateway) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Support only one IPv4 default gateway")); - goto cleanup; - } - - if (!(addrstr = virSocketAddrFormat(gateway))) - goto cleanup; - - pret = PrlVmDevNet_SetDefaultGateway(sdknet, addrstr); - prlsdkCheckRetGoto(pret, cleanup); - - alreadySetIPv4Gateway = true; - break; - - case AF_INET6: - - if (!ipv6present) - continue; - - if (alreadySetIPv6Gateway) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Support only one IPv6 default gateway")); - goto cleanup; - } - - if (!(addrstr = virSocketAddrFormat(gateway))) - goto cleanup; - - pret = PrlVmDevNet_SetDefaultGatewayIPv6(sdknet, addrstr); - prlsdkCheckRetGoto(pret, cleanup); - - alreadySetIPv6Gateway = true; - break; - - default: - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Unsupported address family %d " - "Only IPv4 or IPv6 default gateway"), - VIR_SOCKET_ADDR_FAMILY(gateway)); - - goto cleanup; - } - - VIR_FREE(addrstr); - } - } + if (prlsdkConfigureGateways(sdknet, net)) + goto cleanup; if (isCt) { if (net->model)