diff --git a/src/vbox/vbox_network.c b/src/vbox/vbox_network.c index 773197bc768dcf3c4072bd90d34755207427720a..574d57570e92d2fdb93b0769437d548267df28fa 100644 --- a/src/vbox/vbox_network.c +++ b/src/vbox/vbox_network.c @@ -736,3 +736,75 @@ int vboxNetworkDestroy(virNetworkPtr network) { return vboxNetworkUndefineDestroy(network, false); } + +int vboxNetworkCreate(virNetworkPtr network) +{ + vboxGlobalData *data = network->conn->privateData; + char *networkNameUtf8 = NULL; + PRUnichar *networkInterfaceNameUtf16 = NULL; + IHostNetworkInterface *networkInterface = NULL; + PRUnichar *networkNameUtf16 = NULL; + IDHCPServer *dhcpServer = NULL; + PRUnichar *trunkTypeUtf16 = NULL; + PRUint32 interfaceType = 0; + IHost *host = NULL; + int ret = -1; + + if (!data->vboxObj) + return ret; + + gVBoxAPI.UIVirtualBox.GetHost(data->vboxObj, &host); + if (!host) + return ret; + + /* Current limitation of the function for VirtualBox 2.2.* is + * that the default hostonly network "vboxnet0" is always active + * and thus all this functions does is start the dhcp server, + * but the network can still be used without starting the dhcp + * server by giving the machine static IP + */ + + if (virAsprintf(&networkNameUtf8, "HostInterfaceNetworking-%s", network->name) < 0) + goto cleanup; + + VBOX_UTF8_TO_UTF16(network->name, &networkInterfaceNameUtf16); + + gVBoxAPI.UIHost.FindHostNetworkInterfaceByName(host, networkInterfaceNameUtf16, &networkInterface); + + if (!networkInterface) + goto cleanup; + + gVBoxAPI.UIHNInterface.GetInterfaceType(networkInterface, &interfaceType); + + if (interfaceType != HostNetworkInterfaceType_HostOnly) + goto cleanup; + + VBOX_UTF8_TO_UTF16(networkNameUtf8, &networkNameUtf16); + + gVBoxAPI.UIVirtualBox.FindDHCPServerByNetworkName(data->vboxObj, + networkNameUtf16, + &dhcpServer); + if (!dhcpServer) + goto cleanup; + + gVBoxAPI.UIDHCPServer.SetEnabled(dhcpServer, PR_TRUE); + + VBOX_UTF8_TO_UTF16("netflt", &trunkTypeUtf16); + + gVBoxAPI.UIDHCPServer.Start(dhcpServer, + networkNameUtf16, + networkInterfaceNameUtf16, + trunkTypeUtf16); + + VBOX_UTF16_FREE(trunkTypeUtf16); + ret = 0; + + cleanup: + VBOX_RELEASE(dhcpServer); + VBOX_UTF16_FREE(networkNameUtf16); + VBOX_RELEASE(networkInterface); + VBOX_UTF16_FREE(networkInterfaceNameUtf16); + VBOX_RELEASE(host); + VIR_FREE(networkNameUtf8); + return ret; +} diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index c0722463a0738a73a5db70937026ea4cbd0c4d5a..8712a3b1647a1ca37aee5b08540e1395b1cecbdf 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -2042,74 +2042,6 @@ _registerDomainEvent(virDriverPtr driver) * The Network Functions here on */ -static int vboxNetworkCreate(virNetworkPtr network) -{ - VBOX_OBJECT_HOST_CHECK(network->conn, int, -1); - char *networkNameUtf8 = NULL; - PRUnichar *networkInterfaceNameUtf16 = NULL; - IHostNetworkInterface *networkInterface = NULL; - - /* Current limitation of the function for VirtualBox 2.2.* is - * that the default hostonly network "vboxnet0" is always active - * and thus all this functions does is start the dhcp server, - * but the network can still be used without starting the dhcp - * server by giving the machine static IP - */ - - if (virAsprintf(&networkNameUtf8, "HostInterfaceNetworking-%s", network->name) < 0) - goto cleanup; - - VBOX_UTF8_TO_UTF16(network->name, &networkInterfaceNameUtf16); - - host->vtbl->FindHostNetworkInterfaceByName(host, networkInterfaceNameUtf16, &networkInterface); - - if (networkInterface) { - PRUint32 interfaceType = 0; - - networkInterface->vtbl->GetInterfaceType(networkInterface, &interfaceType); - - if (interfaceType == HostNetworkInterfaceType_HostOnly) { - PRUnichar *networkNameUtf16 = NULL; - IDHCPServer *dhcpServer = NULL; - - - VBOX_UTF8_TO_UTF16(networkNameUtf8, &networkNameUtf16); - - data->vboxObj->vtbl->FindDHCPServerByNetworkName(data->vboxObj, - networkNameUtf16, - &dhcpServer); - if (dhcpServer) { - PRUnichar *trunkTypeUtf16 = NULL; - - dhcpServer->vtbl->SetEnabled(dhcpServer, PR_TRUE); - - VBOX_UTF8_TO_UTF16("netflt", &trunkTypeUtf16); - - dhcpServer->vtbl->Start(dhcpServer, - networkNameUtf16, - networkInterfaceNameUtf16, - trunkTypeUtf16); - - VBOX_UTF16_FREE(trunkTypeUtf16); - VBOX_RELEASE(dhcpServer); - } - - VBOX_UTF16_FREE(networkNameUtf16); - } - - VBOX_RELEASE(networkInterface); - } - - VBOX_UTF16_FREE(networkInterfaceNameUtf16); - VBOX_RELEASE(host); - - ret = 0; - - cleanup: - VIR_FREE(networkNameUtf8); - return ret; -} - static char *vboxNetworkGetXMLDesc(virNetworkPtr network, unsigned int flags) { diff --git a/src/vbox/vbox_uniformed_api.h b/src/vbox/vbox_uniformed_api.h index 8f713af8f04e5ca622dbfc7d9c3053d4d8340f33..f0b98c04f047e608398df95f27247be3dfdbd692 100644 --- a/src/vbox/vbox_uniformed_api.h +++ b/src/vbox/vbox_uniformed_api.h @@ -593,6 +593,7 @@ virNetworkPtr vboxNetworkCreateXML(virConnectPtr conn, const char *xml); virNetworkPtr vboxNetworkDefineXML(virConnectPtr conn, const char *xml); int vboxNetworkUndefine(virNetworkPtr network); int vboxNetworkDestroy(virNetworkPtr network); +int vboxNetworkCreate(virNetworkPtr network); /* Version specified functions for installing uniformed API */ void vbox22InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI);