Re: [libvirt] [PATCH] vz: assign static IPs and default gateways for network adapter
send v2 06.07.2015 21:28, Dmitry Guryanov пишет: On 07/01/2015 01:15 PM, Mikhail Feoktistov wrote: We support only one IPv4 and one IPv6 default gateway. If static IPs are not present in instance config, then we switch on DHCP for this adapter. PrlVmDevNet_SetAutoApply to makes necessary settings within guest OS In linux case it creates network startup scripts /etc/sysconfig/network-scripts/ifcfg-ethN and fills it with necessary parameters. --- src/vz/vz_sdk.c | 120 +++ 1 files changed, 120 insertions(+), 0 deletions(-) diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index f27098c..7d318f8 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -2788,8 +2788,13 @@ static int prlsdkAddNet(PRL_HANDLE sdkdom, PRL_HANDLE sdknet = PRL_INVALID_HANDLE; PRL_HANDLE vnet = PRL_INVALID_HANDLE; PRL_HANDLE job = PRL_INVALID_HANDLE; +PRL_HANDLE addrlist = PRL_INVALID_HANDLE; +size_t i; int ret = -1; char macstr[PRL_MAC_STRING_BUFNAME]; +char *addrstr = NULL; +bool ipv6present = false; +bool ipv4present = false; if (prlsdkCheckNetUnsupportedParams(net) < 0) return -1; @@ -2814,6 +2819,118 @@ static int prlsdkAddNet(PRL_HANDLE sdkdom, pret = PrlVmDevNet_SetMacAddress(sdknet, macstr); prlsdkCheckRetGoto(pret, cleanup); +pret = PrlApi_CreateStringsList(&addrlist); +prlsdkCheckRetGoto(pret, cleanup); + +for (i = 0; i < net->nips; i++) { +virBuffer buf = VIR_BUFFER_INITIALIZER; +char *tmpstr; + +if (AF_INET == VIR_SOCKET_ADDR_FAMILY(&net->ips[i]->address)) +ipv4present = true; +else if (AF_INET6 == VIR_SOCKET_ADDR_FAMILY(&net->ips[i]->address)) +ipv6present = true; +else +continue; + +if (!(tmpstr = virSocketAddrFormat(&net->ips[i]->address))) +goto cleanup; + +virBufferAsprintf(&buf, "%s/%d", tmpstr, net->ips[i]->prefix); +VIR_FREE(tmpstr); +if (!(addrstr = virBufferContentAndReset(&buf))) +goto cleanup; It's better to use virAsprintf here, since you do string formatting only once. + +pret = PrlStrList_AddItem(addrlist, addrstr); +prlsdkCheckRetGoto(pret, cleanup); + +VIR_FREE(addrstr); +addrstr = NULL; VIR_FREE sets the pointer to NULL, you don't need to do it by yourself. Also it's being caught by "make syntax-check" Could you, please, run it before sending patches? +} + +if (ipv4present || ipv6present) { +pret = PrlVmDevNet_SetNetAddresses(sdknet, addrlist); +prlsdkCheckRetGoto(pret, cleanup); +} + +pret = PrlVmDevNet_SetConfigureWithDhcp(sdknet, !ipv4present); +prlsdkCheckRetGoto(pret, cleanup); + +pret = PrlVmDevNet_SetConfigureWithDhcpIPv6(sdknet, !ipv6present); +prlsdkCheckRetGoto(pret, cleanup); + +pret = PrlVmDevNet_SetAutoApply(sdknet, true); +prlsdkCheckRetGoto(pret, cleanup); + +if (net->nroutes) { As I can remember, it's not possible to set gateway together with DHCP. So I think you should set up gateways before dhcp and only if ipv4present/ipv6present is true. +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, + _("Support only default gateway")); +goto cleanup; +} + +switch (VIR_SOCKET_ADDR_FAMILY(gateway)) { +case AF_INET: +if (alreadySetIPv4Gateway) { +virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("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 (alreadySetIPv6Gateway) { +virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Support only one IPv6 default gateway")); +goto cleanup; +} + +if (!(ad
Re: [libvirt] [PATCH] vz: assign static IPs and default gateways for network adapter
On 07/01/2015 01:15 PM, Mikhail Feoktistov wrote: We support only one IPv4 and one IPv6 default gateway. If static IPs are not present in instance config, then we switch on DHCP for this adapter. PrlVmDevNet_SetAutoApply to makes necessary settings within guest OS In linux case it creates network startup scripts /etc/sysconfig/network-scripts/ifcfg-ethN and fills it with necessary parameters. --- src/vz/vz_sdk.c | 120 +++ 1 files changed, 120 insertions(+), 0 deletions(-) diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index f27098c..7d318f8 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -2788,8 +2788,13 @@ static int prlsdkAddNet(PRL_HANDLE sdkdom, PRL_HANDLE sdknet = PRL_INVALID_HANDLE; PRL_HANDLE vnet = PRL_INVALID_HANDLE; PRL_HANDLE job = PRL_INVALID_HANDLE; +PRL_HANDLE addrlist = PRL_INVALID_HANDLE; +size_t i; int ret = -1; char macstr[PRL_MAC_STRING_BUFNAME]; +char *addrstr = NULL; +bool ipv6present = false; +bool ipv4present = false; if (prlsdkCheckNetUnsupportedParams(net) < 0) return -1; @@ -2814,6 +2819,118 @@ static int prlsdkAddNet(PRL_HANDLE sdkdom, pret = PrlVmDevNet_SetMacAddress(sdknet, macstr); prlsdkCheckRetGoto(pret, cleanup); +pret = PrlApi_CreateStringsList(&addrlist); +prlsdkCheckRetGoto(pret, cleanup); + +for (i = 0; i < net->nips; i++) { +virBuffer buf = VIR_BUFFER_INITIALIZER; +char *tmpstr; + +if (AF_INET == VIR_SOCKET_ADDR_FAMILY(&net->ips[i]->address)) +ipv4present = true; +else if (AF_INET6 == VIR_SOCKET_ADDR_FAMILY(&net->ips[i]->address)) +ipv6present = true; +else +continue; + +if (!(tmpstr = virSocketAddrFormat(&net->ips[i]->address))) +goto cleanup; + +virBufferAsprintf(&buf, "%s/%d", tmpstr, net->ips[i]->prefix); +VIR_FREE(tmpstr); +if (!(addrstr = virBufferContentAndReset(&buf))) +goto cleanup; It's better to use virAsprintf here, since you do string formatting only once. + +pret = PrlStrList_AddItem(addrlist, addrstr); +prlsdkCheckRetGoto(pret, cleanup); + +VIR_FREE(addrstr); +addrstr = NULL; VIR_FREE sets the pointer to NULL, you don't need to do it by yourself. Also it's being caught by "make syntax-check" Could you, please, run it before sending patches? +} + +if (ipv4present || ipv6present) { +pret = PrlVmDevNet_SetNetAddresses(sdknet, addrlist); +prlsdkCheckRetGoto(pret, cleanup); +} + +pret = PrlVmDevNet_SetConfigureWithDhcp(sdknet, !ipv4present); +prlsdkCheckRetGoto(pret, cleanup); + +pret = PrlVmDevNet_SetConfigureWithDhcpIPv6(sdknet, !ipv6present); +prlsdkCheckRetGoto(pret, cleanup); + +pret = PrlVmDevNet_SetAutoApply(sdknet, true); +prlsdkCheckRetGoto(pret, cleanup); + +if (net->nroutes) { As I can remember, it's not possible to set gateway together with DHCP. So I think you should set up gateways before dhcp and only if ipv4present/ipv6present is true. +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, + _("Support only default gateway")); +goto cleanup; +} + +switch (VIR_SOCKET_ADDR_FAMILY(gateway)) { +case AF_INET: +if (alreadySetIPv4Gateway) { +virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("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 (alreadySetIPv6Gateway) { +virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Support only one IPv6 default gateway")); +goto cleanup; +} + +
[libvirt] [PATCH] vz: assign static IPs and default gateways for network adapter
We support only one IPv4 and one IPv6 default gateway. If static IPs are not present in instance config, then we switch on DHCP for this adapter. PrlVmDevNet_SetAutoApply to makes necessary settings within guest OS In linux case it creates network startup scripts /etc/sysconfig/network-scripts/ifcfg-ethN and fills it with necessary parameters. --- src/vz/vz_sdk.c | 120 +++ 1 files changed, 120 insertions(+), 0 deletions(-) diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index f27098c..7d318f8 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -2788,8 +2788,13 @@ static int prlsdkAddNet(PRL_HANDLE sdkdom, PRL_HANDLE sdknet = PRL_INVALID_HANDLE; PRL_HANDLE vnet = PRL_INVALID_HANDLE; PRL_HANDLE job = PRL_INVALID_HANDLE; +PRL_HANDLE addrlist = PRL_INVALID_HANDLE; +size_t i; int ret = -1; char macstr[PRL_MAC_STRING_BUFNAME]; +char *addrstr = NULL; +bool ipv6present = false; +bool ipv4present = false; if (prlsdkCheckNetUnsupportedParams(net) < 0) return -1; @@ -2814,6 +2819,118 @@ static int prlsdkAddNet(PRL_HANDLE sdkdom, pret = PrlVmDevNet_SetMacAddress(sdknet, macstr); prlsdkCheckRetGoto(pret, cleanup); +pret = PrlApi_CreateStringsList(&addrlist); +prlsdkCheckRetGoto(pret, cleanup); + +for (i = 0; i < net->nips; i++) { +virBuffer buf = VIR_BUFFER_INITIALIZER; +char *tmpstr; + +if (AF_INET == VIR_SOCKET_ADDR_FAMILY(&net->ips[i]->address)) +ipv4present = true; +else if (AF_INET6 == VIR_SOCKET_ADDR_FAMILY(&net->ips[i]->address)) +ipv6present = true; +else +continue; + +if (!(tmpstr = virSocketAddrFormat(&net->ips[i]->address))) +goto cleanup; + +virBufferAsprintf(&buf, "%s/%d", tmpstr, net->ips[i]->prefix); +VIR_FREE(tmpstr); +if (!(addrstr = virBufferContentAndReset(&buf))) +goto cleanup; + +pret = PrlStrList_AddItem(addrlist, addrstr); +prlsdkCheckRetGoto(pret, cleanup); + +VIR_FREE(addrstr); +addrstr = NULL; +} + +if (ipv4present || ipv6present) { +pret = PrlVmDevNet_SetNetAddresses(sdknet, addrlist); +prlsdkCheckRetGoto(pret, cleanup); +} + +pret = PrlVmDevNet_SetConfigureWithDhcp(sdknet, !ipv4present); +prlsdkCheckRetGoto(pret, cleanup); + +pret = PrlVmDevNet_SetConfigureWithDhcpIPv6(sdknet, !ipv6present); +prlsdkCheckRetGoto(pret, cleanup); + +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, + _("Support only default gateway")); +goto cleanup; +} + +switch (VIR_SOCKET_ADDR_FAMILY(gateway)) { +case AF_INET: +if (alreadySetIPv4Gateway) { +virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("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 (alreadySetIPv6Gateway) { +virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("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, + _("Support only IPv4 and IPv6 default gateways")); +goto cleanup; +