[libvirt] [PATCH 1/2]: VirtualBox: Updated vboxNetworkCreateXML() and vboxNetworkDefineXML()
Daniel P. Berrange
berrange at redhat.com
Thu Aug 13 18:37:39 UTC 2009
On Thu, Aug 13, 2009 at 03:32:36PM +0200, Pritesh Kothari wrote:
> Hi All,
>
> I have made some changes to the functions vboxNetworkCreateXML(),
> vboxNetworkDefineXML(), vboxNetworkUndefine() and vboxNetworkDestroy() to handle
> multiple host only interfaces as multiple host only interfaces are supported
> by VirtualBox 3.0 and greater.
ACK, good idea merging those two functions.
> commit 027210861c8434ca8c0e58b90094a9ccdeb7c275
> Author: Pritesh Kothari <Pritesh.Kothari at Sun.com>
> Date: Thu Aug 13 14:59:07 2009 +0200
>
> libvirt: Merged vboxNetworkCreateXML() and vboxNetworkDefineXML() and added code to handle multiple hostonly interfaces.
>
> diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
> index 32bfb4d..6de277f 100644
> --- a/src/vbox/vbox_tmpl.c
> +++ b/src/vbox/vbox_tmpl.c
> @@ -35,6 +35,7 @@
>
> #include <dlfcn.h>
> #include <sys/utsname.h>
> +#include <stdbool.h>
>
> #include "internal.h"
>
> @@ -5008,253 +5009,188 @@ static virNetworkPtr vboxNetworkLookupByName(virConnectPtr conn, const char *nam
> return ret;
> }
>
> -static virNetworkPtr vboxNetworkCreateXML(virConnectPtr conn, const char *xml) {
> +static virNetworkPtr vboxNetworkDefineCreateXML(virConnectPtr conn, const char *xml, bool start) {
> vboxGlobalData *data = conn->privateData;
> virNetworkDefPtr def = NULL;
> virNetworkPtr ret = NULL;
> - char *networkNameUtf8 = NULL;
>
> if ((def = virNetworkDefParseString(conn, xml)) == NULL)
> goto cleanup;
>
> - if (virAsprintf(&networkNameUtf8, "HostInterfaceNetworking-%s", def->name) < 0) {
> - virReportOOMError(conn);
> - goto cleanup;
> - }
> -
> if ((data->vboxObj) && (def->forwardType == VIR_NETWORK_FORWARD_NONE)) {
> - /* VirtualBox version 2.2.* has only one "hostonly"
> - * network called "vboxnet0" for linux
> + IHost *host = NULL;
> +
> + /* the current limitation of hostonly network is that you can't
> + * assign a name to it and it defaults to vboxnet*, for e.g:
> + * vboxnet0, vboxnet1, etc. Also the UUID is assigned to it
> + * automatically depending on the mac address and thus both
> + * these paramters are ignore here for now.
> */
> - if (STREQ(def->name, "vboxnet0")) {
> - IHost *host = NULL;
>
> - data->vboxObj->vtbl->GetHost(data->vboxObj, &host);
> - if (host) {
> - PRUnichar *networkInterfaceNameUtf16 = NULL;
> - IHostNetworkInterface *networkInterface = NULL;
> + data->vboxObj->vtbl->GetHost(data->vboxObj, &host);
> + if (host) {
> + PRUnichar *networkInterfaceNameUtf16 = NULL;
> + char *networkInterfaceNameUtf8 = NULL;
> + IHostNetworkInterface *networkInterface = NULL;
> +
> +#if VBOX_API_VERSION == 2002
> + if STREQ(def->name, "vboxnet0") {
> + PRUint32 interfaceType = 0;
>
> data->pFuncs->pfnUtf8ToUtf16(def->name, &networkInterfaceNameUtf16);
> -
> host->vtbl->FindHostNetworkInterfaceByName(host, networkInterfaceNameUtf16, &networkInterface);
>
> - if (networkInterface) {
> - PRUint32 interfaceType = 0;
> -
> - networkInterface->vtbl->GetInterfaceType(networkInterface, &interfaceType);
> -
> - if (interfaceType == HostNetworkInterfaceType_HostOnly) {
> - unsigned char uuid[VIR_UUID_BUFLEN];
> - PRUnichar *networkNameUtf16 = NULL;
> - vboxIID *vboxnet0IID = NULL;
> -
> - networkInterface->vtbl->GetId(networkInterface, &vboxnet0IID);
> - vboxIIDToUUID(uuid, vboxnet0IID);
> - data->pFuncs->pfnUtf8ToUtf16(networkNameUtf8 , &networkNameUtf16);
> -
> -
> - /* Currently support only one dhcp server per network
> - * with contigious address space from start to end
> - */
> - if ((def->nranges >= 1) &&
> - (def->ranges[0].start) &&
> - (def->ranges[0].end)) {
> - IDHCPServer *dhcpServer = NULL;
> -
> - data->vboxObj->vtbl->FindDHCPServerByNetworkName(data->vboxObj,
> - networkNameUtf16,
> - &dhcpServer);
> - if (!dhcpServer) {
> - /* create a dhcp server */
> - data->vboxObj->vtbl->CreateDHCPServer(data->vboxObj,
> - networkNameUtf16,
> - &dhcpServer);
> - DEBUG0("couldn't find dhcp server so creating one");
> - }
> - if (dhcpServer) {
> - PRUnichar *ipAddressUtf16 = NULL;
> - PRUnichar *networkMaskUtf16 = NULL;
> - PRUnichar *fromIPAddressUtf16 = NULL;
> - PRUnichar *toIPAddressUtf16 = NULL;
> - PRUnichar *trunkTypeUtf16 = NULL;
> -
> -
> - data->pFuncs->pfnUtf8ToUtf16(def->ipAddress, &ipAddressUtf16);
> - data->pFuncs->pfnUtf8ToUtf16(def->netmask, &networkMaskUtf16);
> - data->pFuncs->pfnUtf8ToUtf16(def->ranges[0].start, &fromIPAddressUtf16);
> - data->pFuncs->pfnUtf8ToUtf16(def->ranges[0].end, &toIPAddressUtf16);
> - data->pFuncs->pfnUtf8ToUtf16("netflt", &trunkTypeUtf16);
> -
> - dhcpServer->vtbl->SetEnabled(dhcpServer, PR_TRUE);
> -
> - dhcpServer->vtbl->SetConfiguration(dhcpServer,
> - ipAddressUtf16,
> - networkMaskUtf16,
> - fromIPAddressUtf16,
> - toIPAddressUtf16);
> -
> - dhcpServer->vtbl->Start(dhcpServer,
> - networkNameUtf16,
> - networkInterfaceNameUtf16,
> - trunkTypeUtf16);
> -
> - data->pFuncs->pfnUtf16Free(ipAddressUtf16);
> - data->pFuncs->pfnUtf16Free(networkMaskUtf16);
> - data->pFuncs->pfnUtf16Free(fromIPAddressUtf16);
> - data->pFuncs->pfnUtf16Free(toIPAddressUtf16);
> - data->pFuncs->pfnUtf16Free(trunkTypeUtf16);
> - dhcpServer->vtbl->nsisupports.Release((nsISupports *) dhcpServer);
> - }
> - }
> -
> - ret = virGetNetwork(conn, def->name, uuid);
> -
> -#if VBOX_API_VERSION == 2002
> - DEBUGUUID("Real Network UUID", vboxnet0IID);
> - vboxIIDUnalloc(vboxnet0IID);
> -#else
> - DEBUGPRUnichar("Real Network UUID", vboxnet0IID);
> - vboxIIDFree(vboxnet0IID);
> -#endif
> - data->pFuncs->pfnUtf16Free(networkNameUtf16);
> - }
> -
> + networkInterface->vtbl->GetInterfaceType(networkInterface, &interfaceType);
> + if (interfaceType != HostNetworkInterfaceType_HostOnly) {
> networkInterface->vtbl->nsisupports.Release((nsISupports *) networkInterface);
> + networkInterface = NULL;
> }
> -
> - data->pFuncs->pfnUtf16Free(networkInterfaceNameUtf16);
> - host->vtbl->nsisupports.Release((nsISupports *) host);
> }
> - }
> - }
> -
> -cleanup:
> - VIR_FREE(networkNameUtf8);
> - virNetworkDefFree(def);
> - return ret;
> -}
> -
> -static virNetworkPtr vboxNetworkDefineXML(virConnectPtr conn, const char *xml) {
> - vboxGlobalData *data = conn->privateData;
> - virNetworkDefPtr def = NULL;
> - virNetworkPtr ret = NULL;
> - char *networkNameUtf8 = NULL;
> +#else /* VBOX_API_VERSION != 2002 */
> + IProgress *progress = NULL;
> + host->vtbl->CreateHostOnlyNetworkInterface(host, &networkInterface, &progress);
>
> - /* vboxNetworkDefineXML() is not exactly "network definition"
> - * as the network is up and running, only the DHCP server is off,
> - * so you can always assign static IP and get the network running.
> - */
> - if ((def = virNetworkDefParseString(conn, xml)) == NULL)
> - goto cleanup;
> -
> - if (virAsprintf(&networkNameUtf8, "HostInterfaceNetworking-%s", def->name) < 0) {
> - virReportOOMError(conn);
> - goto cleanup;
> - }
> -
> - if ((data->vboxObj) && (def->forwardType == VIR_NETWORK_FORWARD_NONE)) {
> - /* VirtualBox version 2.2.* has only one "hostonly"
> - * network called "vboxnet0" for linux
> - */
> - if (STREQ(def->name, "vboxnet0")) {
> - IHost *host = NULL;
> -
> - data->vboxObj->vtbl->GetHost(data->vboxObj, &host);
> - if (host) {
> - PRUnichar *networkInterfaceNameUtf16 = NULL;
> - IHostNetworkInterface *networkInterface = NULL;
> + if (progress) {
> + progress->vtbl->WaitForCompletion(progress, -1);
> + progress->vtbl->nsisupports.Release((nsISupports *)progress);
> + }
> +#endif /* VBOX_API_VERSION != 2002 */
>
> - data->pFuncs->pfnUtf8ToUtf16(def->name, &networkInterfaceNameUtf16);
> + if (networkInterface) {
> + unsigned char uuid[VIR_UUID_BUFLEN];
> + char *networkNameUtf8 = NULL;
> + PRUnichar *networkNameUtf16 = NULL;
> + vboxIID *vboxnetiid = NULL;
> +
> + networkInterface->vtbl->GetName(networkInterface, &networkInterfaceNameUtf16);
> + if (networkInterfaceNameUtf16) {
> + data->pFuncs->pfnUtf16ToUtf8(networkInterfaceNameUtf16, &networkInterfaceNameUtf8);
> +
> + if (virAsprintf(&networkNameUtf8, "HostInterfaceNetworking-%s", networkInterfaceNameUtf8) < 0) {
> + host->vtbl->nsisupports.Release((nsISupports *)host);
> + networkInterface->vtbl->nsisupports.Release((nsISupports *)networkInterface);
> + virReportOOMError(conn);
> + goto cleanup;
> + }
> + }
>
> - host->vtbl->FindHostNetworkInterfaceByName(host, networkInterfaceNameUtf16, &networkInterface);
> + data->pFuncs->pfnUtf8ToUtf16(networkNameUtf8 , &networkNameUtf16);
>
> - if (networkInterface) {
> - PRUint32 interfaceType = 0;
> -
> - networkInterface->vtbl->GetInterfaceType(networkInterface, &interfaceType);
> + /* Currently support only one dhcp server per network
> + * with contigious address space from start to end
> + */
> + if ((def->nranges >= 1) &&
> + (def->ranges[0].start) &&
> + (def->ranges[0].end)) {
> + IDHCPServer *dhcpServer = NULL;
>
> - if (interfaceType == HostNetworkInterfaceType_HostOnly) {
> - unsigned char uuid[VIR_UUID_BUFLEN];
> - PRUnichar *networkNameUtf16 = NULL;
> - vboxIID *vboxnet0IID = NULL;
> + data->vboxObj->vtbl->FindDHCPServerByNetworkName(data->vboxObj,
> + networkNameUtf16,
> + &dhcpServer);
> + if (!dhcpServer) {
> + /* create a dhcp server */
> + data->vboxObj->vtbl->CreateDHCPServer(data->vboxObj,
> + networkNameUtf16,
> + &dhcpServer);
> + DEBUG0("couldn't find dhcp server so creating one");
> + }
> + if (dhcpServer) {
> + PRUnichar *ipAddressUtf16 = NULL;
> + PRUnichar *networkMaskUtf16 = NULL;
> + PRUnichar *fromIPAddressUtf16 = NULL;
> + PRUnichar *toIPAddressUtf16 = NULL;
> + PRUnichar *trunkTypeUtf16 = NULL;
>
> - networkInterface->vtbl->GetId(networkInterface, &vboxnet0IID);
> - vboxIIDToUUID(uuid, vboxnet0IID);
> - data->pFuncs->pfnUtf8ToUtf16(networkNameUtf8 , &networkNameUtf16);
>
> - /* Currently support only one dhcp server per network
> - * with contigious address space from start to end
> - */
> - if ((def->nranges >= 1) &&
> - (def->ranges[0].start) &&
> - (def->ranges[0].end)) {
> - IDHCPServer *dhcpServer = NULL;
> -
> - data->vboxObj->vtbl->FindDHCPServerByNetworkName(data->vboxObj,
> - networkNameUtf16,
> - &dhcpServer);
> - if (!dhcpServer) {
> - /* create a dhcp server */
> - data->vboxObj->vtbl->CreateDHCPServer(data->vboxObj,
> - networkNameUtf16,
> - &dhcpServer);
> - DEBUG0("couldn't find dhcp server so creating one");
> - }
> - if (dhcpServer) {
> - PRUnichar *ipAddressUtf16 = NULL;
> - PRUnichar *networkMaskUtf16 = NULL;
> - PRUnichar *fromIPAddressUtf16 = NULL;
> - PRUnichar *toIPAddressUtf16 = NULL;
> + data->pFuncs->pfnUtf8ToUtf16(def->ipAddress, &ipAddressUtf16);
> + data->pFuncs->pfnUtf8ToUtf16(def->netmask, &networkMaskUtf16);
> + data->pFuncs->pfnUtf8ToUtf16(def->ranges[0].start, &fromIPAddressUtf16);
> + data->pFuncs->pfnUtf8ToUtf16(def->ranges[0].end, &toIPAddressUtf16);
> + data->pFuncs->pfnUtf8ToUtf16("netflt", &trunkTypeUtf16);
>
> + dhcpServer->vtbl->SetEnabled(dhcpServer, PR_TRUE);
>
> - data->pFuncs->pfnUtf8ToUtf16(def->ipAddress, &ipAddressUtf16);
> - data->pFuncs->pfnUtf8ToUtf16(def->netmask, &networkMaskUtf16);
> - data->pFuncs->pfnUtf8ToUtf16(def->ranges[0].start, &fromIPAddressUtf16);
> - data->pFuncs->pfnUtf8ToUtf16(def->ranges[0].end, &toIPAddressUtf16);
> + dhcpServer->vtbl->SetConfiguration(dhcpServer,
> + ipAddressUtf16,
> + networkMaskUtf16,
> + fromIPAddressUtf16,
> + toIPAddressUtf16);
> +
> + if (start)
> + dhcpServer->vtbl->Start(dhcpServer,
> + networkNameUtf16,
> + networkInterfaceNameUtf16,
> + trunkTypeUtf16);
> +
> + data->pFuncs->pfnUtf16Free(ipAddressUtf16);
> + data->pFuncs->pfnUtf16Free(networkMaskUtf16);
> + data->pFuncs->pfnUtf16Free(fromIPAddressUtf16);
> + data->pFuncs->pfnUtf16Free(toIPAddressUtf16);
> + data->pFuncs->pfnUtf16Free(trunkTypeUtf16);
> + dhcpServer->vtbl->nsisupports.Release((nsISupports *) dhcpServer);
> + }
> + }
>
> - dhcpServer->vtbl->SetEnabled(dhcpServer, PR_FALSE);
> + if ((def->nhosts >= 1) &&
> + (def->hosts[0].ip)) {
> + PRUnichar *ipAddressUtf16 = NULL;
> + PRUnichar *networkMaskUtf16 = NULL;
>
> - dhcpServer->vtbl->SetConfiguration(dhcpServer,
> - ipAddressUtf16,
> - networkMaskUtf16,
> - fromIPAddressUtf16,
> - toIPAddressUtf16);
> + data->pFuncs->pfnUtf8ToUtf16(def->netmask, &networkMaskUtf16);
> + data->pFuncs->pfnUtf8ToUtf16(def->hosts[0].ip, &ipAddressUtf16);
>
> - data->pFuncs->pfnUtf16Free(ipAddressUtf16);
> - data->pFuncs->pfnUtf16Free(networkMaskUtf16);
> - data->pFuncs->pfnUtf16Free(fromIPAddressUtf16);
> - data->pFuncs->pfnUtf16Free(toIPAddressUtf16);
> - dhcpServer->vtbl->nsisupports.Release((nsISupports *) dhcpServer);
> - }
> - }
> + /* Current drawback is that since EnableStaticIpConfig() sets
> + * IP and enables the interface so even if the dhcpserver is not
> + * started the interface is still up and running
> + */
> + networkInterface->vtbl->EnableStaticIpConfig(networkInterface,
> + ipAddressUtf16,
> + networkMaskUtf16);
>
> - ret = virGetNetwork(conn, def->name, uuid);
> + data->pFuncs->pfnUtf16Free(ipAddressUtf16);
> + data->pFuncs->pfnUtf16Free(networkMaskUtf16);
> + } else {
> + networkInterface->vtbl->EnableDynamicIpConfig(networkInterface);
> + networkInterface->vtbl->DhcpRediscover(networkInterface);
> + }
>
> + networkInterface->vtbl->GetId(networkInterface, &vboxnetiid);
> + if (vboxnetiid) {
> + vboxIIDToUUID(uuid, vboxnetiid);
> #if VBOX_API_VERSION == 2002
> - DEBUGUUID("Real Network UUID", vboxnet0IID);
> - vboxIIDUnalloc(vboxnet0IID);
> -#else
> - DEBUGPRUnichar("Real Network UUID", vboxnet0IID);
> - vboxIIDFree(vboxnet0IID);
> -#endif
> - data->pFuncs->pfnUtf16Free(networkNameUtf16);
> - }
> -
> - networkInterface->vtbl->nsisupports.Release((nsISupports *) networkInterface);
> + DEBUGUUID("Real Network UUID", vboxnetiid);
> + vboxIIDUnalloc(vboxnetiid);
> +#else /* VBOX_API_VERSION != 2002 */
> + DEBUGPRUnichar("Real Network UUID", vboxnetiid);
> + vboxIIDFree(vboxnetiid);
> +#endif /* VBOX_API_VERSION != 2002 */
> + ret = virGetNetwork(conn, networkInterfaceNameUtf8, uuid);
> }
>
> - data->pFuncs->pfnUtf16Free(networkInterfaceNameUtf16);
> - host->vtbl->nsisupports.Release((nsISupports *) host);
> + VIR_FREE(networkNameUtf8);
> + data->pFuncs->pfnUtf16Free(networkNameUtf16);
> + networkInterface->vtbl->nsisupports.Release((nsISupports *) networkInterface);
> }
> +
> + data->pFuncs->pfnUtf8Free(networkInterfaceNameUtf8);
> + data->pFuncs->pfnUtf16Free(networkInterfaceNameUtf16);
> + host->vtbl->nsisupports.Release((nsISupports *) host);
> }
> }
>
> cleanup:
> - VIR_FREE(networkNameUtf8);
> virNetworkDefFree(def);
> return ret;
> }
>
> +static virNetworkPtr vboxNetworkCreateXML(virConnectPtr conn, const char *xml) {
> + return vboxNetworkDefineCreateXML(conn, xml, true);
> +}
> +
> +static virNetworkPtr vboxNetworkDefineXML(virConnectPtr conn, const char *xml) {
> + return vboxNetworkDefineCreateXML(conn, xml, false);
> +}
> +
> static int vboxNetworkUndefine(virNetworkPtr network) {
> vboxGlobalData *data = network->conn->privateData;
> char *networkNameUtf8 = NULL;
Daniel
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
More information about the libvir-list
mailing list