Re: [libvirt] [PATCH 3/4] network: rework networkGetNetworkAddress to make it can get IPv6 address
On 02/25/2015 02:22 AM, John Ferlan wrote: On 02/13/2015 02:17 AM, Luyao Huang wrote: Export the required helpers and rework networkGetNetworkAddress to make it can get IPv6 address. Signed-off-by: Luyao Huang --- src/conf/network_conf.c | 2 +- src/conf/network_conf.h | 1 + src/libvirt_private.syms| 1 + src/network/bridge_driver.c | 50 - src/network/bridge_driver.h | 6 -- src/qemu/qemu_command.c | 4 ++-- 6 files changed, 45 insertions(+), 19 deletions(-) diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index f947d89..9eb640b 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -148,7 +148,7 @@ virNetworkDHCPHostDefClear(virNetworkDHCPHostDefPtr def) VIR_FREE(def->name); } -static void +void I believe this is unnecessary virNetworkIpDefClear(virNetworkIpDefPtr def) { VIR_FREE(def->family); diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h index 484522e..0c4b559 100644 --- a/src/conf/network_conf.h +++ b/src/conf/network_conf.h @@ -310,6 +310,7 @@ virNetworkObjPtr virNetworkFindByName(virNetworkObjListPtr nets, void virNetworkDefFree(virNetworkDefPtr def); void virNetworkObjFree(virNetworkObjPtr net); void virNetworkObjListFree(virNetworkObjListPtr vms); +void virNetworkIpDefClear(virNetworkIpDefPtr def); Same unnecessary typedef bool (*virNetworkObjListFilter)(virConnectPtr conn, diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index f60911c..ff942d8 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -559,6 +559,7 @@ virNetworkDeleteConfig; virNetworkFindByName; virNetworkFindByUUID; virNetworkForwardTypeToString; +virNetworkIpDefClear; Unnecessary Yes, thanks for pointing out these place, i forgot check the code in virNetworkDefGetIpByIndex. virNetworkIpDefNetmask; virNetworkIpDefPrefix; virNetworkLoadAllConfigs; diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index 2798010..d1afd16 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -4487,6 +4487,7 @@ networkReleaseActualDevice(virDomainDefPtr dom, * networkGetNetworkAddress: * @netname: the name of a network * @netaddr: string representation of IP address for that network. + * @family: IP family @want_ipv6: boolean to force return of IPv6 address for that network * * Attempt to return an IP (v4) address associated with the named * network. If a libvirt virtual network, that will be provided in the @@ -4503,12 +4504,13 @@ networkReleaseActualDevice(virDomainDefPtr dom, * completely unsupported. */ int -networkGetNetworkAddress(const char *netname, char **netaddr) +networkGetNetworkAddress(const char *netname, char **netaddr, int family) s/int family/bool want_ipv6/ { int ret = -1; virNetworkObjPtr network; virNetworkDefPtr netdef; -virNetworkIpDefPtr ipdef; +virNetworkIpDefPtr ipdef = NULL; +virNetworkIpDefPtr ipdef6 = NULL; The ipdef6 is unnecessary virSocketAddr addr; virSocketAddrPtr addrptr = NULL; char *dev_name = NULL; @@ -4529,15 +4531,9 @@ networkGetNetworkAddress(const char *netname, char **netaddr) case VIR_NETWORK_FORWARD_NONE: case VIR_NETWORK_FORWARD_NAT: case VIR_NETWORK_FORWARD_ROUTE: -/* if there's an ipv4def, get it's address */ +/* if there's an ipv4def or ipv6def, get it's address */ ipdef = virNetworkDefGetIpByIndex(netdef, AF_INET, 0); -if (!ipdef) { -virReportError(VIR_ERR_INTERNAL_ERROR, - _("network '%s' doesn't have an IPv4 address"), - netdef->name); -break; -} -addrptr = &ipdef->address; +ipdef6 = virNetworkDefGetIpByIndex(netdef, AF_INET6, 0); Not sure I follow why we're losing the error reporting here... I'd change this to: if (want_ipv6) ipdef = virNetworkDefGetIpByIndex(netdef, AF_INET6, 0); else ipdef = virNetworkDefGetIpByIndex(netdef, AF_INET, 0); if (!ipdef) { virReportError(VIR_ERR_INTERNAL_ERROR, _("network '%s' doesn't have an '%s' address"), netdef->name, want_ipv6 ? "IPv6" : "IPv4"); break; } addrptr = &ipdef->address; NB: virNetworkDefGetIpByIndex() doesn't return a COPY that we must FREE, it returns a pointer to something owned elsewhere Thanks for your advise and i will changed this in next version: ipdef = virNetworkDefGetIpByIndex(netdef, want_ipv6 ? AF_INET6 : AF_INET, 0); if (!ipdef) { virReportError(VIR_ERR_INTERNAL_ERROR, _("network '%s' doesn't have an '%s' address"), netdef->name, want_ipv6 ? "IPv6" : "IPv4"); break; } addrptr = &ipdef->address; break;
Re: [libvirt] [PATCH 3/4] network: rework networkGetNetworkAddress to make it can get IPv6 address
On 02/13/2015 02:17 AM, Luyao Huang wrote: > Export the required helpers and rework networkGetNetworkAddress to > make it can get IPv6 address. > > Signed-off-by: Luyao Huang > --- > src/conf/network_conf.c | 2 +- > src/conf/network_conf.h | 1 + > src/libvirt_private.syms| 1 + > src/network/bridge_driver.c | 50 > - > src/network/bridge_driver.h | 6 -- > src/qemu/qemu_command.c | 4 ++-- > 6 files changed, 45 insertions(+), 19 deletions(-) > > diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c > index f947d89..9eb640b 100644 > --- a/src/conf/network_conf.c > +++ b/src/conf/network_conf.c > @@ -148,7 +148,7 @@ virNetworkDHCPHostDefClear(virNetworkDHCPHostDefPtr def) > VIR_FREE(def->name); > } > > -static void > +void I believe this is unnecessary > virNetworkIpDefClear(virNetworkIpDefPtr def) > { > VIR_FREE(def->family); > diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h > index 484522e..0c4b559 100644 > --- a/src/conf/network_conf.h > +++ b/src/conf/network_conf.h > @@ -310,6 +310,7 @@ virNetworkObjPtr > virNetworkFindByName(virNetworkObjListPtr nets, > void virNetworkDefFree(virNetworkDefPtr def); > void virNetworkObjFree(virNetworkObjPtr net); > void virNetworkObjListFree(virNetworkObjListPtr vms); > +void virNetworkIpDefClear(virNetworkIpDefPtr def); Same unnecessary > > > typedef bool (*virNetworkObjListFilter)(virConnectPtr conn, > diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms > index f60911c..ff942d8 100644 > --- a/src/libvirt_private.syms > +++ b/src/libvirt_private.syms > @@ -559,6 +559,7 @@ virNetworkDeleteConfig; > virNetworkFindByName; > virNetworkFindByUUID; > virNetworkForwardTypeToString; > +virNetworkIpDefClear; Unnecessary > virNetworkIpDefNetmask; > virNetworkIpDefPrefix; > virNetworkLoadAllConfigs; > diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c > index 2798010..d1afd16 100644 > --- a/src/network/bridge_driver.c > +++ b/src/network/bridge_driver.c > @@ -4487,6 +4487,7 @@ networkReleaseActualDevice(virDomainDefPtr dom, > * networkGetNetworkAddress: > * @netname: the name of a network > * @netaddr: string representation of IP address for that network. > + * @family: IP family @want_ipv6: boolean to force return of IPv6 address for that network > * > * Attempt to return an IP (v4) address associated with the named > * network. If a libvirt virtual network, that will be provided in the > @@ -4503,12 +4504,13 @@ networkReleaseActualDevice(virDomainDefPtr dom, > * completely unsupported. > */ > int > -networkGetNetworkAddress(const char *netname, char **netaddr) > +networkGetNetworkAddress(const char *netname, char **netaddr, int family) s/int family/bool want_ipv6/ > { > int ret = -1; > virNetworkObjPtr network; > virNetworkDefPtr netdef; > -virNetworkIpDefPtr ipdef; > +virNetworkIpDefPtr ipdef = NULL; > +virNetworkIpDefPtr ipdef6 = NULL; The ipdef6 is unnecessary > virSocketAddr addr; > virSocketAddrPtr addrptr = NULL; > char *dev_name = NULL; > @@ -4529,15 +4531,9 @@ networkGetNetworkAddress(const char *netname, char > **netaddr) > case VIR_NETWORK_FORWARD_NONE: > case VIR_NETWORK_FORWARD_NAT: > case VIR_NETWORK_FORWARD_ROUTE: > -/* if there's an ipv4def, get it's address */ > +/* if there's an ipv4def or ipv6def, get it's address */ > ipdef = virNetworkDefGetIpByIndex(netdef, AF_INET, 0); > -if (!ipdef) { > -virReportError(VIR_ERR_INTERNAL_ERROR, > - _("network '%s' doesn't have an IPv4 address"), > - netdef->name); > -break; > -} > -addrptr = &ipdef->address; > +ipdef6 = virNetworkDefGetIpByIndex(netdef, AF_INET6, 0); Not sure I follow why we're losing the error reporting here... I'd change this to: if (want_ipv6) ipdef = virNetworkDefGetIpByIndex(netdef, AF_INET6, 0); else ipdef = virNetworkDefGetIpByIndex(netdef, AF_INET, 0); if (!ipdef) { virReportError(VIR_ERR_INTERNAL_ERROR, _("network '%s' doesn't have an '%s' address"), netdef->name, want_ipv6 ? "IPv6" : "IPv4"); break; } addrptr = &ipdef->address; NB: virNetworkDefGetIpByIndex() doesn't return a COPY that we must FREE, it returns a pointer to something owned elsewhere > break; > > case VIR_NETWORK_FORWARD_BRIDGE: > @@ -4561,10 +4557,32 @@ networkGetNetworkAddress(const char *netname, char > **netaddr) > break; > } > > -if (dev_name) { > -if (virNetDevGetIPv4Address(dev_name, &addr) < 0) > -goto error; > -addrptr = &addr; > +switch ((virDomainGraphicsListenFamily) family) { > +case VIR_DOMAIN_GRAPHICS_LISTEN_FAMILY_DEFAULT: > +case VIR_DOMAIN_GRAPHICS_LISTEN_F
[libvirt] [PATCH 3/4] network: rework networkGetNetworkAddress to make it can get IPv6 address
Export the required helpers and rework networkGetNetworkAddress to make it can get IPv6 address. Signed-off-by: Luyao Huang --- src/conf/network_conf.c | 2 +- src/conf/network_conf.h | 1 + src/libvirt_private.syms| 1 + src/network/bridge_driver.c | 50 - src/network/bridge_driver.h | 6 -- src/qemu/qemu_command.c | 4 ++-- 6 files changed, 45 insertions(+), 19 deletions(-) diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index f947d89..9eb640b 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -148,7 +148,7 @@ virNetworkDHCPHostDefClear(virNetworkDHCPHostDefPtr def) VIR_FREE(def->name); } -static void +void virNetworkIpDefClear(virNetworkIpDefPtr def) { VIR_FREE(def->family); diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h index 484522e..0c4b559 100644 --- a/src/conf/network_conf.h +++ b/src/conf/network_conf.h @@ -310,6 +310,7 @@ virNetworkObjPtr virNetworkFindByName(virNetworkObjListPtr nets, void virNetworkDefFree(virNetworkDefPtr def); void virNetworkObjFree(virNetworkObjPtr net); void virNetworkObjListFree(virNetworkObjListPtr vms); +void virNetworkIpDefClear(virNetworkIpDefPtr def); typedef bool (*virNetworkObjListFilter)(virConnectPtr conn, diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index f60911c..ff942d8 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -559,6 +559,7 @@ virNetworkDeleteConfig; virNetworkFindByName; virNetworkFindByUUID; virNetworkForwardTypeToString; +virNetworkIpDefClear; virNetworkIpDefNetmask; virNetworkIpDefPrefix; virNetworkLoadAllConfigs; diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index 2798010..d1afd16 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -4487,6 +4487,7 @@ networkReleaseActualDevice(virDomainDefPtr dom, * networkGetNetworkAddress: * @netname: the name of a network * @netaddr: string representation of IP address for that network. + * @family: IP family * * Attempt to return an IP (v4) address associated with the named * network. If a libvirt virtual network, that will be provided in the @@ -4503,12 +4504,13 @@ networkReleaseActualDevice(virDomainDefPtr dom, * completely unsupported. */ int -networkGetNetworkAddress(const char *netname, char **netaddr) +networkGetNetworkAddress(const char *netname, char **netaddr, int family) { int ret = -1; virNetworkObjPtr network; virNetworkDefPtr netdef; -virNetworkIpDefPtr ipdef; +virNetworkIpDefPtr ipdef = NULL; +virNetworkIpDefPtr ipdef6 = NULL; virSocketAddr addr; virSocketAddrPtr addrptr = NULL; char *dev_name = NULL; @@ -4529,15 +4531,9 @@ networkGetNetworkAddress(const char *netname, char **netaddr) case VIR_NETWORK_FORWARD_NONE: case VIR_NETWORK_FORWARD_NAT: case VIR_NETWORK_FORWARD_ROUTE: -/* if there's an ipv4def, get it's address */ +/* if there's an ipv4def or ipv6def, get it's address */ ipdef = virNetworkDefGetIpByIndex(netdef, AF_INET, 0); -if (!ipdef) { -virReportError(VIR_ERR_INTERNAL_ERROR, - _("network '%s' doesn't have an IPv4 address"), - netdef->name); -break; -} -addrptr = &ipdef->address; +ipdef6 = virNetworkDefGetIpByIndex(netdef, AF_INET6, 0); break; case VIR_NETWORK_FORWARD_BRIDGE: @@ -4561,10 +4557,32 @@ networkGetNetworkAddress(const char *netname, char **netaddr) break; } -if (dev_name) { -if (virNetDevGetIPv4Address(dev_name, &addr) < 0) -goto error; -addrptr = &addr; +switch ((virDomainGraphicsListenFamily) family) { +case VIR_DOMAIN_GRAPHICS_LISTEN_FAMILY_DEFAULT: +case VIR_DOMAIN_GRAPHICS_LISTEN_FAMILY_IPV4: +if (ipdef) +addrptr = &ipdef->address; +if (dev_name) { +if (virNetDevGetIPv4Address(dev_name, &addr) < 0) +goto error; +addrptr = &addr; +} +/*if the family is default and we do not get a ipv4 address + *in this place, we will try to get a ipv6 address + */ +if (addrptr || family == VIR_DOMAIN_GRAPHICS_LISTEN_FAMILY_IPV4) +break; +case VIR_DOMAIN_GRAPHICS_LISTEN_FAMILY_IPV6: +if (ipdef6) +addrptr = &ipdef6->address; +if (dev_name) { +if (virNetDevGetIPv6Address(dev_name, &addr) < 0) +goto error; +addrptr = &addr; +} +break; +case VIR_DOMAIN_GRAPHICS_LISTEN_FAMILY_LAST: +break; } if (!(addrptr && @@ -4579,6 +4597,10 @@ networkGetNetworkAddress(const char *netname, char **netaddr) return ret; error: +if (ipdef6) +virNetworkIpDefClear(ipdef6); +if (ipdef) +virNetworkIpDefClear(ipdef); goto clea