Re: [libvirt] [PATCH] vz: assign static IPs and default gateways for network adapter

2015-07-07 Thread Mikhail Feoktistov

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

2015-07-06 Thread 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;
+}
+
+

[libvirt] [PATCH] vz: assign static IPs and default gateways for network adapter

2015-07-01 Thread Mikhail Feoktistov
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;
+