diff --git a/src/vbox/vbox_network.c b/src/vbox/vbox_network.c index 574d57570e..85fb78ba27 100644 --- a/src/vbox/vbox_network.c +++ b/src/vbox/vbox_network.c @@ -808,3 +808,194 @@ int vboxNetworkCreate(virNetworkPtr network) VIR_FREE(networkNameUtf8); return ret; } + +static int +vboxSocketParseAddrUtf16(vboxGlobalData *data, const PRUnichar *utf16, + virSocketAddrPtr addr) +{ + int result = -1; + char *utf8 = NULL; + + VBOX_UTF16_TO_UTF8(utf16, &utf8); + + if (virSocketAddrParse(addr, utf8, AF_UNSPEC) < 0) { + goto cleanup; + } + + result = 0; + + cleanup: + VBOX_UTF8_FREE(utf8); + + return result; +} + +char *vboxNetworkGetXMLDesc(virNetworkPtr network, unsigned int flags) +{ + vboxGlobalData *data = network->conn->privateData; + virNetworkDefPtr def = NULL; + virNetworkIpDefPtr ipdef = NULL; + char *networkNameUtf8 = NULL; + PRUnichar *networkInterfaceNameUtf16 = NULL; + IHostNetworkInterface *networkInterface = NULL; + PRUint32 interfaceType = 0; + PRUnichar *networkNameUtf16 = NULL; + IDHCPServer *dhcpServer = NULL; + vboxIIDUnion vboxnet0IID; + IHost *host = NULL; + char *ret = NULL; + nsresult rc; + + if (!data->vboxObj) + return ret; + + gVBoxAPI.UIVirtualBox.GetHost(data->vboxObj, &host); + if (!host) + return ret; + + VBOX_IID_INITIALIZE(&vboxnet0IID); + virCheckFlags(0, NULL); + + if (VIR_ALLOC(def) < 0) + goto cleanup; + if (VIR_ALLOC(ipdef) < 0) + goto cleanup; + def->ips = ipdef; + def->nips = 1; + + 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; + + if (VIR_STRDUP(def->name, network->name) < 0) + goto cleanup; + + rc = gVBoxAPI.UIHNInterface.GetId(networkInterface, &vboxnet0IID); + if (NS_FAILED(rc)) + goto cleanup; + vboxIIDToUUID(&vboxnet0IID, def->uuid); + + VBOX_UTF8_TO_UTF16(networkNameUtf8, &networkNameUtf16); + + def->forward.type = VIR_NETWORK_FORWARD_NONE; + + gVBoxAPI.UIVirtualBox.FindDHCPServerByNetworkName(data->vboxObj, + networkNameUtf16, + &dhcpServer); + if (dhcpServer) { + ipdef->nranges = 1; + if (VIR_ALLOC_N(ipdef->ranges, ipdef->nranges) >= 0) { + PRUnichar *ipAddressUtf16 = NULL; + PRUnichar *networkMaskUtf16 = NULL; + PRUnichar *fromIPAddressUtf16 = NULL; + PRUnichar *toIPAddressUtf16 = NULL; + bool errorOccurred = false; + + gVBoxAPI.UIDHCPServer.GetIPAddress(dhcpServer, &ipAddressUtf16); + gVBoxAPI.UIDHCPServer.GetNetworkMask(dhcpServer, &networkMaskUtf16); + gVBoxAPI.UIDHCPServer.GetLowerIP(dhcpServer, &fromIPAddressUtf16); + gVBoxAPI.UIDHCPServer.GetUpperIP(dhcpServer, &toIPAddressUtf16); + /* Currently virtualbox supports only one dhcp server per network + * with contigious address space from start to end + */ + if (vboxSocketParseAddrUtf16(data, ipAddressUtf16, + &ipdef->address) < 0 || + vboxSocketParseAddrUtf16(data, networkMaskUtf16, + &ipdef->netmask) < 0 || + vboxSocketParseAddrUtf16(data, fromIPAddressUtf16, + &ipdef->ranges[0].start) < 0 || + vboxSocketParseAddrUtf16(data, toIPAddressUtf16, + &ipdef->ranges[0].end) < 0) { + errorOccurred = true; + } + + VBOX_UTF16_FREE(ipAddressUtf16); + VBOX_UTF16_FREE(networkMaskUtf16); + VBOX_UTF16_FREE(fromIPAddressUtf16); + VBOX_UTF16_FREE(toIPAddressUtf16); + + if (errorOccurred) { + goto cleanup; + } + } else { + ipdef->nranges = 0; + } + + ipdef->nhosts = 1; + if (VIR_ALLOC_N(ipdef->hosts, ipdef->nhosts) >= 0) { + if (VIR_STRDUP(ipdef->hosts[0].name, network->name) < 0) { + VIR_FREE(ipdef->hosts); + ipdef->nhosts = 0; + } else { + PRUnichar *macAddressUtf16 = NULL; + PRUnichar *ipAddressUtf16 = NULL; + bool errorOccurred = false; + + gVBoxAPI.UIHNInterface.GetHardwareAddress(networkInterface, &macAddressUtf16); + gVBoxAPI.UIHNInterface.GetIPAddress(networkInterface, &ipAddressUtf16); + + VBOX_UTF16_TO_UTF8(macAddressUtf16, &ipdef->hosts[0].mac); + + if (vboxSocketParseAddrUtf16(data, ipAddressUtf16, + &ipdef->hosts[0].ip) < 0) { + errorOccurred = true; + } + + VBOX_UTF16_FREE(macAddressUtf16); + VBOX_UTF16_FREE(ipAddressUtf16); + + if (errorOccurred) { + goto cleanup; + } + } + } else { + ipdef->nhosts = 0; + } + } else { + PRUnichar *networkMaskUtf16 = NULL; + PRUnichar *ipAddressUtf16 = NULL; + bool errorOccurred = false; + + gVBoxAPI.UIHNInterface.GetNetworkMask(networkInterface, &networkMaskUtf16); + gVBoxAPI.UIHNInterface.GetIPAddress(networkInterface, &ipAddressUtf16); + + if (vboxSocketParseAddrUtf16(data, networkMaskUtf16, + &ipdef->netmask) < 0 || + vboxSocketParseAddrUtf16(data, ipAddressUtf16, + &ipdef->address) < 0) { + errorOccurred = true; + } + + VBOX_UTF16_FREE(networkMaskUtf16); + VBOX_UTF16_FREE(ipAddressUtf16); + + if (errorOccurred) { + goto cleanup; + } + } + + DEBUGIID("Network UUID", &vboxnet0IID); + ret = virNetworkDefFormat(def, 0); + + cleanup: + vboxIIDUnalloc(&vboxnet0IID); + VBOX_UTF16_FREE(networkNameUtf16); + VBOX_RELEASE(networkInterface); + VBOX_UTF16_FREE(networkInterfaceNameUtf16); + VBOX_RELEASE(host); + virNetworkDefFree(def); + VIR_FREE(networkNameUtf8); + VBOX_RELEASE(dhcpServer); + return ret; +} diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index 8712a3b164..9231fab8be 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -838,27 +838,6 @@ static PRUnichar *PRUnicharFromInt(int n) { #endif /* VBOX_API_VERSION >= 3001000 */ -static int -vboxSocketParseAddrUtf16(vboxGlobalData *data, const PRUnichar *utf16, - virSocketAddrPtr addr) -{ - int result = -1; - char *utf8 = NULL; - - VBOX_UTF16_TO_UTF8(utf16, &utf8); - - if (virSocketAddrParse(addr, utf8, AF_UNSPEC) < 0) { - goto cleanup; - } - - result = 0; - - cleanup: - VBOX_UTF8_FREE(utf8); - - return result; -} - static virDomainState _vboxConvertState(PRUint32 state) { switch (state) { @@ -2038,171 +2017,6 @@ _registerDomainEvent(virDriverPtr driver) #endif /* !(VBOX_API_VERSION == 2002000 || VBOX_API_VERSION >= 4000000) */ -/** - * The Network Functions here on - */ - -static char *vboxNetworkGetXMLDesc(virNetworkPtr network, - unsigned int flags) -{ - VBOX_OBJECT_HOST_CHECK(network->conn, char *, NULL); - virNetworkDefPtr def = NULL; - virNetworkIpDefPtr ipdef = NULL; - char *networkNameUtf8 = NULL; - PRUnichar *networkInterfaceNameUtf16 = NULL; - IHostNetworkInterface *networkInterface = NULL; - - virCheckFlags(0, NULL); - - if (VIR_ALLOC(def) < 0) - goto cleanup; - if (VIR_ALLOC(ipdef) < 0) - goto cleanup; - def->ips = ipdef; - def->nips = 1; - - 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) { - if (VIR_STRDUP(def->name, network->name) >= 0) { - PRUnichar *networkNameUtf16 = NULL; - IDHCPServer *dhcpServer = NULL; - vboxIID vboxnet0IID = VBOX_IID_INITIALIZER; - - networkInterface->vtbl->GetId(networkInterface, &vboxnet0IID.value); - vboxIIDToUUID(&vboxnet0IID, def->uuid); - - VBOX_UTF8_TO_UTF16(networkNameUtf8, &networkNameUtf16); - - def->forward.type = VIR_NETWORK_FORWARD_NONE; - - data->vboxObj->vtbl->FindDHCPServerByNetworkName(data->vboxObj, - networkNameUtf16, - &dhcpServer); - if (dhcpServer) { - ipdef->nranges = 1; - if (VIR_ALLOC_N(ipdef->ranges, ipdef->nranges) >= 0) { - PRUnichar *ipAddressUtf16 = NULL; - PRUnichar *networkMaskUtf16 = NULL; - PRUnichar *fromIPAddressUtf16 = NULL; - PRUnichar *toIPAddressUtf16 = NULL; - bool errorOccurred = false; - - dhcpServer->vtbl->GetIPAddress(dhcpServer, &ipAddressUtf16); - dhcpServer->vtbl->GetNetworkMask(dhcpServer, &networkMaskUtf16); - dhcpServer->vtbl->GetLowerIP(dhcpServer, &fromIPAddressUtf16); - dhcpServer->vtbl->GetUpperIP(dhcpServer, &toIPAddressUtf16); - /* Currently virtualbox supports only one dhcp server per network - * with contigious address space from start to end - */ - if (vboxSocketParseAddrUtf16(data, ipAddressUtf16, - &ipdef->address) < 0 || - vboxSocketParseAddrUtf16(data, networkMaskUtf16, - &ipdef->netmask) < 0 || - vboxSocketParseAddrUtf16(data, fromIPAddressUtf16, - &ipdef->ranges[0].start) < 0 || - vboxSocketParseAddrUtf16(data, toIPAddressUtf16, - &ipdef->ranges[0].end) < 0) { - errorOccurred = true; - } - - VBOX_UTF16_FREE(ipAddressUtf16); - VBOX_UTF16_FREE(networkMaskUtf16); - VBOX_UTF16_FREE(fromIPAddressUtf16); - VBOX_UTF16_FREE(toIPAddressUtf16); - - if (errorOccurred) { - goto cleanup; - } - } else { - ipdef->nranges = 0; - } - - ipdef->nhosts = 1; - if (VIR_ALLOC_N(ipdef->hosts, ipdef->nhosts) >= 0) { - if (VIR_STRDUP(ipdef->hosts[0].name, network->name) < 0) { - VIR_FREE(ipdef->hosts); - ipdef->nhosts = 0; - } else { - PRUnichar *macAddressUtf16 = NULL; - PRUnichar *ipAddressUtf16 = NULL; - bool errorOccurred = false; - - networkInterface->vtbl->GetHardwareAddress(networkInterface, &macAddressUtf16); - networkInterface->vtbl->GetIPAddress(networkInterface, &ipAddressUtf16); - - VBOX_UTF16_TO_UTF8(macAddressUtf16, &ipdef->hosts[0].mac); - - if (vboxSocketParseAddrUtf16(data, ipAddressUtf16, - &ipdef->hosts[0].ip) < 0) { - errorOccurred = true; - } - - VBOX_UTF16_FREE(macAddressUtf16); - VBOX_UTF16_FREE(ipAddressUtf16); - - if (errorOccurred) { - goto cleanup; - } - } - } else { - ipdef->nhosts = 0; - } - - VBOX_RELEASE(dhcpServer); - } else { - PRUnichar *networkMaskUtf16 = NULL; - PRUnichar *ipAddressUtf16 = NULL; - bool errorOccurred = false; - - networkInterface->vtbl->GetNetworkMask(networkInterface, &networkMaskUtf16); - networkInterface->vtbl->GetIPAddress(networkInterface, &ipAddressUtf16); - - if (vboxSocketParseAddrUtf16(data, networkMaskUtf16, - &ipdef->netmask) < 0 || - vboxSocketParseAddrUtf16(data, ipAddressUtf16, - &ipdef->address) < 0) { - errorOccurred = true; - } - - VBOX_UTF16_FREE(networkMaskUtf16); - VBOX_UTF16_FREE(ipAddressUtf16); - - if (errorOccurred) { - goto cleanup; - } - } - - DEBUGIID("Network UUID", vboxnet0IID.value); - vboxIIDUnalloc(&vboxnet0IID); - VBOX_UTF16_FREE(networkNameUtf16); - } - } - - VBOX_RELEASE(networkInterface); - } - - VBOX_UTF16_FREE(networkInterfaceNameUtf16); - VBOX_RELEASE(host); - - ret = virNetworkDefFormat(def, 0); - - cleanup: - virNetworkDefFree(def); - VIR_FREE(networkNameUtf8); - return ret; -} - /** * The Storage Functions here on */ @@ -5526,6 +5340,24 @@ _hnInterfaceGetId(IHostNetworkInterface *hni, vboxIIDUnion *iidu) return hni->vtbl->GetId(hni, &IID_MEMBER(value)); } +static nsresult +_hnInterfaceGetHardwareAddress(IHostNetworkInterface *hni, PRUnichar **hardwareAddress) +{ + return hni->vtbl->GetHardwareAddress(hni, hardwareAddress); +} + +static nsresult +_hnInterfaceGetIPAddress(IHostNetworkInterface *hni, PRUnichar **IPAddress) +{ + return hni->vtbl->GetIPAddress(hni, IPAddress); +} + +static nsresult +_hnInterfaceGetNetworkMask(IHostNetworkInterface *hni, PRUnichar **networkMask) +{ + return hni->vtbl->GetNetworkMask(hni, networkMask); +} + static nsresult _hnInterfaceEnableStaticIPConfig(IHostNetworkInterface *hni, PRUnichar *IPAddress, PRUnichar *networkMask) @@ -5557,6 +5389,30 @@ _hnInterfaceDHCPRediscover(IHostNetworkInterface *hni) #endif } +static nsresult +_dhcpServerGetIPAddress(IDHCPServer *dhcpServer, PRUnichar **IPAddress) +{ + return dhcpServer->vtbl->GetIPAddress(dhcpServer, IPAddress); +} + +static nsresult +_dhcpServerGetNetworkMask(IDHCPServer *dhcpServer, PRUnichar **networkMask) +{ + return dhcpServer->vtbl->GetNetworkMask(dhcpServer, networkMask); +} + +static nsresult +_dhcpServerGetLowerIP(IDHCPServer *dhcpServer, PRUnichar **lowerIP) +{ + return dhcpServer->vtbl->GetLowerIP(dhcpServer, lowerIP); +} + +static nsresult +_dhcpServerGetUpperIP(IDHCPServer *dhcpServer, PRUnichar **upperIP) +{ + return dhcpServer->vtbl->GetUpperIP(dhcpServer, upperIP); +} + static nsresult _dhcpServerSetEnabled(IDHCPServer *dhcpServer, PRBool enabled) { @@ -5905,12 +5761,19 @@ static vboxUniformedIHNInterface _UIHNInterface = { .GetStatus = _hnInterfaceGetStatus, .GetName = _hnInterfaceGetName, .GetId = _hnInterfaceGetId, + .GetHardwareAddress = _hnInterfaceGetHardwareAddress, + .GetIPAddress = _hnInterfaceGetIPAddress, + .GetNetworkMask = _hnInterfaceGetNetworkMask, .EnableStaticIPConfig = _hnInterfaceEnableStaticIPConfig, .EnableDynamicIPConfig = _hnInterfaceEnableDynamicIPConfig, .DHCPRediscover = _hnInterfaceDHCPRediscover, }; static vboxUniformedIDHCPServer _UIDHCPServer = { + .GetIPAddress = _dhcpServerGetIPAddress, + .GetNetworkMask = _dhcpServerGetNetworkMask, + .GetLowerIP = _dhcpServerGetLowerIP, + .GetUpperIP = _dhcpServerGetUpperIP, .SetEnabled = _dhcpServerSetEnabled, .SetConfiguration = _dhcpServerSetConfiguration, .Start = _dhcpServerStart, diff --git a/src/vbox/vbox_uniformed_api.h b/src/vbox/vbox_uniformed_api.h index f0b98c04f0..da754e81b6 100644 --- a/src/vbox/vbox_uniformed_api.h +++ b/src/vbox/vbox_uniformed_api.h @@ -488,6 +488,9 @@ typedef struct { nsresult (*GetStatus)(IHostNetworkInterface *hni, PRUint32 *status); nsresult (*GetName)(IHostNetworkInterface *hni, PRUnichar **name); nsresult (*GetId)(IHostNetworkInterface *hni, vboxIIDUnion *iidu); + nsresult (*GetHardwareAddress)(IHostNetworkInterface *hni, PRUnichar **hardwareAddress); + nsresult (*GetIPAddress)(IHostNetworkInterface *hni, PRUnichar **IPAddress); + nsresult (*GetNetworkMask)(IHostNetworkInterface *hni, PRUnichar **networkMask); nsresult (*EnableStaticIPConfig)(IHostNetworkInterface *hni, PRUnichar *IPAddress, PRUnichar *networkMask); nsresult (*EnableDynamicIPConfig)(IHostNetworkInterface *hni); @@ -496,6 +499,10 @@ typedef struct { /* Functions for IDHCPServer */ typedef struct { + nsresult (*GetIPAddress)(IDHCPServer *dhcpServer, PRUnichar **IPAddress); + nsresult (*GetNetworkMask)(IDHCPServer *dhcpServer, PRUnichar **networkMask); + nsresult (*GetLowerIP)(IDHCPServer *dhcpServer, PRUnichar **lowerIP); + nsresult (*GetUpperIP)(IDHCPServer *dhcpServer, PRUnichar **upperIP); nsresult (*SetEnabled)(IDHCPServer *dhcpServer, PRBool enabled); nsresult (*SetConfiguration)(IDHCPServer *dhcpServer, PRUnichar *IPAddress, PRUnichar *networkMask, PRUnichar *FromIPAddress, @@ -594,6 +601,7 @@ virNetworkPtr vboxNetworkDefineXML(virConnectPtr conn, const char *xml); int vboxNetworkUndefine(virNetworkPtr network); int vboxNetworkDestroy(virNetworkPtr network); int vboxNetworkCreate(virNetworkPtr network); +char *vboxNetworkGetXMLDesc(virNetworkPtr network, unsigned int flags); /* Version specified functions for installing uniformed API */ void vbox22InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI);