From 62b0066de49a2fd3afb442c7e7aadf9997c4ec37 Mon Sep 17 00:00:00 2001 From: Nikolay Shirokovskiy Date: Wed, 20 Apr 2016 17:05:38 +0300 Subject: [PATCH] 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 --- src/vz/vz_sdk.c | 159 +++++++++++++++++++++++++----------------------- 1 file changed, 83 insertions(+), 76 deletions(-) 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)