[libvirt] [PATCH v3 00/14] vbox: rewrite network driver

This seriers of patches rewrite the vbox network driver. Diff from v2: *Seperate the network driver from the domain driver. *Prevent vbox code from being compiled too many times when building network driver. Taowei (14): vbox: Interfaces for register per parties vbox: Rewrite vboxNetworkOpen vbox: Rewrite vboxNetworkClose vbox: Rewrite vboxConnectNumOfNetworks vbox: Rewrite vboxConnectListNetworks vbox: Rewrite vboxConnectNumOfDefinedNetworks vbox: Rewrite vboxConnectListDefinedNetworks vbox: Rewrite vboxNetworkLookupByUUID vbox: Rewrite vboxNetworkLookupByName vbox: Rewrite vboxNetworkDefineCreateXML vbox: Rewrite vboxNetworkUndefineDestroy vbox: Rewrite vboxNetworkCreate vbox: Rewrite vboxNetworkGetXMLDesc vbox: New network driver po/POTFILES.in | 1 + src/Makefile.am | 16 +- src/vbox/vbox_common.c | 70 +- src/vbox/vbox_common.h | 16 + src/vbox/vbox_driver.c | 55 +- src/vbox/{vbox_install_api.h => vbox_get_driver.h} | 9 +- src/vbox/vbox_network.c | 1050 ++++++++++++++++ src/vbox/vbox_tmpl.c | 1261 +++++--------------- src/vbox/vbox_uniformed_api.h | 52 + 9 files changed, 1523 insertions(+), 1007 deletions(-) rename src/vbox/{vbox_install_api.h => vbox_get_driver.h} (79%) create mode 100644 src/vbox/vbox_network.c -- 1.7.9.5

The patch dbb4cbf532fa by Michal has splited the vbox driver into three parties. This modification brings a more suitable interface to the previous patch. The new function vboxGetDriver is introduced to get the corresponding vbox domain driver directly thought the vbox version. Functions like vboxGetNetworkDriver and vboxGetStorageDriver will be introduced after rewriting it's drivers. This patch, by the wayi, fixed the align problem for vbox in Makefile.am --- src/Makefile.am | 6 +- src/vbox/vbox_common.c | 69 ++++++++++---------- src/vbox/vbox_driver.c | 48 ++++++-------- src/vbox/{vbox_install_api.h => vbox_get_driver.h} | 8 +-- 4 files changed, 61 insertions(+), 70 deletions(-) rename src/vbox/{vbox_install_api.h => vbox_get_driver.h} (84%) diff --git a/src/Makefile.am b/src/Makefile.am index e65177f..dcd2ae2 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -666,7 +666,7 @@ VMWARE_DRIVER_SOURCES = \ VBOX_DRIVER_SOURCES = \ vbox/vbox_glue.c vbox/vbox_glue.h \ vbox/vbox_driver.c vbox/vbox_driver.h \ - vbox/vbox_snapshot_conf.c vbox/vbox_snapshot_conf.h \ + vbox/vbox_snapshot_conf.c vbox/vbox_snapshot_conf.h \ vbox/vbox_V2_2.c vbox/vbox_CAPI_v2_2.h \ vbox/vbox_V3_0.c vbox/vbox_CAPI_v3_0.h \ vbox/vbox_V3_1.c vbox/vbox_CAPI_v3_1.h \ @@ -674,12 +674,12 @@ VBOX_DRIVER_SOURCES = \ vbox/vbox_V4_0.c vbox/vbox_CAPI_v4_0.h \ vbox/vbox_V4_1.c vbox/vbox_CAPI_v4_1.h \ vbox/vbox_V4_2.c vbox/vbox_CAPI_v4_2.h \ - vbox/vbox_V4_2_20.c vbox/vbox_CAPI_v4_2_20.h \ + vbox/vbox_V4_2_20.c vbox/vbox_CAPI_v4_2_20.h \ vbox/vbox_V4_3.c vbox/vbox_CAPI_v4_3.h \ vbox/vbox_V4_3_4.c vbox/vbox_CAPI_v4_3_4.h \ vbox/vbox_common.c vbox/vbox_common.h \ vbox/vbox_uniformed_api.h \ - vbox/vbox_install_api.h + vbox/vbox_get_driver.h VBOX_DRIVER_EXTRA_DIST = \ vbox/vbox_tmpl.c vbox/README \ diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index 7d75478..44270ff 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -38,7 +38,7 @@ #include "vbox_common.h" #include "vbox_uniformed_api.h" -#include "vbox_install_api.h" +#include "vbox_get_driver.h" /* Common codes for vbox driver. With the definitions in vbox_common.h, * it treats vbox structs as a void*. Though vboxUniformedAPI @@ -121,41 +121,6 @@ if (!data->vboxObj) {\ /* global vbox API, used for all common codes. */ static vboxUniformedAPI gVBoxAPI; -/* update the virDriver according to the vboxUniformedAPI */ -static void updateDriver(void); - -int vboxRegisterUniformedAPI(uint32_t uVersion) -{ - /* Install gVBoxAPI according to the vbox API version. - * Return -1 for unsupported version. - */ - if (uVersion >= 2001052 && uVersion < 2002051) { - vbox22InstallUniformedAPI(&gVBoxAPI); - } else if (uVersion >= 2002051 && uVersion < 3000051) { - vbox30InstallUniformedAPI(&gVBoxAPI); - } else if (uVersion >= 3000051 && uVersion < 3001051) { - vbox31InstallUniformedAPI(&gVBoxAPI); - } else if (uVersion >= 3001051 && uVersion < 3002051) { - vbox32InstallUniformedAPI(&gVBoxAPI); - } else if (uVersion >= 3002051 && uVersion < 4000051) { - vbox40InstallUniformedAPI(&gVBoxAPI); - } else if (uVersion >= 4000051 && uVersion < 4001051) { - vbox41InstallUniformedAPI(&gVBoxAPI); - } else if (uVersion >= 4001051 && uVersion < 4002020) { - vbox42InstallUniformedAPI(&gVBoxAPI); - } else if (uVersion >= 4002020 && uVersion < 4002051) { - vbox42_20InstallUniformedAPI(&gVBoxAPI); - } else if (uVersion >= 4002051 && uVersion < 4003004) { - vbox43InstallUniformedAPI(&gVBoxAPI); - } else if (uVersion >= 4003004 && uVersion < 4003051) { - vbox43_4InstallUniformedAPI(&gVBoxAPI); - } else { - return -1; - } - updateDriver(); - return 0; -} - static int openSessionForMachine(vboxGlobalData *data, const unsigned char *dom_uuid, vboxIIDUnion *iid, IMachine **machine, bool checkflag) { @@ -7565,3 +7530,35 @@ static void updateDriver(void) else vboxCommonDriver.domainScreenshot = NULL; } + +virDriverPtr vboxGetDriver(uint32_t uVersion) +{ + /* Install gVBoxAPI according to the vbox API version. + * Return -1 for unsupported version. + */ + if (uVersion >= 2001052 && uVersion < 2002051) { + vbox22InstallUniformedAPI(&gVBoxAPI); + } else if (uVersion >= 2002051 && uVersion < 3000051) { + vbox30InstallUniformedAPI(&gVBoxAPI); + } else if (uVersion >= 3000051 && uVersion < 3001051) { + vbox31InstallUniformedAPI(&gVBoxAPI); + } else if (uVersion >= 3001051 && uVersion < 3002051) { + vbox32InstallUniformedAPI(&gVBoxAPI); + } else if (uVersion >= 3002051 && uVersion < 4000051) { + vbox40InstallUniformedAPI(&gVBoxAPI); + } else if (uVersion >= 4000051 && uVersion < 4001051) { + vbox41InstallUniformedAPI(&gVBoxAPI); + } else if (uVersion >= 4001051 && uVersion < 4002020) { + vbox42InstallUniformedAPI(&gVBoxAPI); + } else if (uVersion >= 4002020 && uVersion < 4002051) { + vbox42_20InstallUniformedAPI(&gVBoxAPI); + } else if (uVersion >= 4002051 && uVersion < 4003004) { + vbox43InstallUniformedAPI(&gVBoxAPI); + } else if (uVersion >= 4003004 && uVersion < 4003051) { + vbox43_4InstallUniformedAPI(&gVBoxAPI); + } else { + return NULL; + } + updateDriver(); + return &vboxCommonDriver; +} diff --git a/src/vbox/vbox_driver.c b/src/vbox/vbox_driver.c index d33f78f..89d49be 100644 --- a/src/vbox/vbox_driver.c +++ b/src/vbox/vbox_driver.c @@ -42,7 +42,7 @@ #include "domain_event.h" #include "domain_conf.h" -#include "vbox_install_api.h" +#include "vbox_get_driver.h" #define VIR_FROM_THIS VIR_FROM_VBOX @@ -69,18 +69,14 @@ extern virStorageDriver vbox43StorageDriver; extern virNetworkDriver vbox43_4NetworkDriver; extern virStorageDriver vbox43_4StorageDriver; -extern virDriver vboxCommonDriver; - -static virDriver vboxDriverDummy; - #define VIR_FROM_THIS VIR_FROM_VBOX +#if !defined(WITH_DRIVER_MODULES) || defined(VBOX_NETWORK_DRIVER) || defined(VBOX_STORAGE_DRIVER) static void vboxGetDrivers(virDriverPtr *driver_ret, virNetworkDriverPtr *networkDriver_ret, virStorageDriverPtr *storageDriver_ret) { - virDriverPtr driver; virNetworkDriverPtr networkDriver; virStorageDriverPtr storageDriver; uint32_t uVersion; @@ -91,7 +87,6 @@ vboxGetDrivers(virDriverPtr *driver_ret, * if the user requests a vbox:// URI which we know will * never work */ - driver = &vboxDriverDummy; networkDriver = &vbox22NetworkDriver; storageDriver = &vbox22StorageDriver; @@ -150,24 +145,18 @@ vboxGetDrivers(virDriverPtr *driver_ret, } else { VIR_DEBUG("Unsupported VirtualBox API version: %u", uVersion); } - /* Register vboxUniformedAPI. */ - if (vboxRegisterUniformedAPI(uVersion) == 0) - /* Only if successfully register the uniformed api, - * can we use the vboxCommonDriver. Or use the - * vboxDriverDummy in case of failure. */ - driver = &vboxCommonDriver; } else { VIR_DEBUG("VBoxCGlueInit failed, using dummy driver"); } if (driver_ret) - *driver_ret = driver; + *driver_ret = NULL; if (networkDriver_ret) *networkDriver_ret = networkDriver; if (storageDriver_ret) *storageDriver_ret = storageDriver; } - +#endif #if !defined(WITH_DRIVER_MODULES) || defined(VBOX_NETWORK_DRIVER) int vboxNetworkRegister(void) @@ -195,18 +184,6 @@ int vboxStorageRegister(void) #endif #if !defined(WITH_DRIVER_MODULES) || defined(VBOX_DRIVER) -int vboxRegister(void) -{ - virDriverPtr driver; - - vboxGetDrivers(&driver, NULL, NULL); - - if (virRegisterDriver(driver) < 0) - return -1; - return 0; -} -#endif - static virDrvOpenStatus dummyConnectOpen(virConnectPtr conn, virConnectAuthPtr auth ATTRIBUTE_UNUSED, unsigned int flags) @@ -252,3 +229,20 @@ static virDriver vboxDriverDummy = { "VBOX", .connectOpen = dummyConnectOpen, /* 0.6.3 */ }; + +int vboxRegister(void) +{ + virDriverPtr driver = NULL; + uint32_t uVersion; + + if (VBoxCGlueInit(&uVersion) == 0) + driver = vboxGetDriver(uVersion); + + if (!driver) + driver = &vboxDriverDummy; + + if (virRegisterDriver(driver) < 0) + return -1; + return 0; +} +#endif diff --git a/src/vbox/vbox_install_api.h b/src/vbox/vbox_get_driver.h similarity index 84% rename from src/vbox/vbox_install_api.h rename to src/vbox/vbox_get_driver.h index 45a8d8c..cfc8b93 100644 --- a/src/vbox/vbox_install_api.h +++ b/src/vbox/vbox_get_driver.h @@ -16,11 +16,11 @@ * <http://www.gnu.org/licenses/>. */ -#ifndef VBOX_INSTALL_API_H -# define VBOX_INSTALL_API_H +#ifndef VBOX_GET_DRIVER_H +# define VBOX_GET_DRIVER_H # include "internal.h" -int vboxRegisterUniformedAPI(uint32_t uVersion); +virDriverPtr vboxGetDriver(uint32_t uVersion); -#endif /* VBOX_INSTALL_API_H */ +#endif /* VBOX_GET_DRIVER_H */ -- 1.7.9.5

--- po/POTFILES.in | 1 + src/Makefile.am | 1 + src/vbox/vbox_network.c | 58 +++++++++++++++++++++++++++++++++++++++++ src/vbox/vbox_tmpl.c | 24 ----------------- src/vbox/vbox_uniformed_api.h | 3 +++ 5 files changed, 63 insertions(+), 24 deletions(-) create mode 100644 src/vbox/vbox_network.c diff --git a/po/POTFILES.in b/po/POTFILES.in index 020a9ac..9e00f73 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -220,6 +220,7 @@ src/vbox/vbox_MSCOMGlue.c src/vbox/vbox_XPCOMCGlue.c src/vbox/vbox_driver.c src/vbox/vbox_common.c +src/vbox/vbox_network.c src/vbox/vbox_snapshot_conf.c src/vbox/vbox_tmpl.c src/vmware/vmware_conf.c diff --git a/src/Makefile.am b/src/Makefile.am index dcd2ae2..34eb9f8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -678,6 +678,7 @@ VBOX_DRIVER_SOURCES = \ vbox/vbox_V4_3.c vbox/vbox_CAPI_v4_3.h \ vbox/vbox_V4_3_4.c vbox/vbox_CAPI_v4_3_4.h \ vbox/vbox_common.c vbox/vbox_common.h \ + vbox/vbox_network.c \ vbox/vbox_uniformed_api.h \ vbox/vbox_get_driver.h diff --git a/src/vbox/vbox_network.c b/src/vbox/vbox_network.c new file mode 100644 index 0000000..2e09b4b --- /dev/null +++ b/src/vbox/vbox_network.c @@ -0,0 +1,58 @@ +/* + * Copyright 2014, Taowei Luo (uaedante@gmail.com) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * <http://www.gnu.org/licenses/>. + */ + +#include <config.h> + +#include "internal.h" +#include "datatypes.h" +#include "domain_conf.h" +#include "domain_event.h" +#include "virlog.h" + +#include "vbox_common.h" +#include "vbox_uniformed_api.h" + +#define VIR_FROM_THIS VIR_FROM_VBOX + +VIR_LOG_INIT("vbox.vbox_network"); + +/** + * The Network Functions here on + */ + +virDrvOpenStatus vboxNetworkOpen(virConnectPtr conn, + virConnectAuthPtr auth ATTRIBUTE_UNUSED, + unsigned int flags) +{ + vboxGlobalData *data = conn->privateData; + + virCheckFlags(VIR_CONNECT_RO, VIR_DRV_OPEN_ERROR); + + if (STRNEQ(conn->driver->name, "VBOX")) + goto cleanup; + + if (!data->pFuncs || !data->vboxObj || !data->vboxSession) + goto cleanup; + + VIR_DEBUG("network initialized"); + /* conn->networkPrivateData = some network specific data */ + return VIR_DRV_OPEN_SUCCESS; + + cleanup: + return VIR_DRV_OPEN_DECLINED; +} diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index e5d6d66..da3841f 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -2059,30 +2059,6 @@ _registerDomainEvent(virDriverPtr driver) /** * The Network Functions here on */ -static virDrvOpenStatus vboxNetworkOpen(virConnectPtr conn, - virConnectAuthPtr auth ATTRIBUTE_UNUSED, - unsigned int flags) -{ - vboxGlobalData *data = conn->privateData; - - virCheckFlags(VIR_CONNECT_RO, VIR_DRV_OPEN_ERROR); - - if (STRNEQ(conn->driver->name, "VBOX")) - goto cleanup; - - if ((data->pFuncs == NULL) || - (data->vboxObj == NULL) || - (data->vboxSession == NULL)) - goto cleanup; - - VIR_DEBUG("network initialized"); - /* conn->networkPrivateData = some network specific data */ - return VIR_DRV_OPEN_SUCCESS; - - cleanup: - return VIR_DRV_OPEN_DECLINED; -} - static int vboxNetworkClose(virConnectPtr conn) { VIR_DEBUG("network uninitialized"); diff --git a/src/vbox/vbox_uniformed_api.h b/src/vbox/vbox_uniformed_api.h index 41ce40f..0237160 100644 --- a/src/vbox/vbox_uniformed_api.h +++ b/src/vbox/vbox_uniformed_api.h @@ -534,6 +534,9 @@ typedef struct { virDomainPtr vboxDomainLookupByUUID(virConnectPtr conn, const unsigned char *uuid); +virDrvOpenStatus vboxNetworkOpen(virConnectPtr conn, + virConnectAuthPtr auth, + unsigned int flags); /* Version specified functions for installing uniformed API */ void vbox22InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI); -- 1.7.9.5

On 02.10.2014 05:30, Taowei wrote:
--- po/POTFILES.in | 1 + src/Makefile.am | 1 + src/vbox/vbox_network.c | 58 +++++++++++++++++++++++++++++++++++++++++ src/vbox/vbox_tmpl.c | 24 ----------------- src/vbox/vbox_uniformed_api.h | 3 +++ 5 files changed, 63 insertions(+), 24 deletions(-) create mode 100644 src/vbox/vbox_network.c
diff --git a/po/POTFILES.in b/po/POTFILES.in index 020a9ac..9e00f73 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -220,6 +220,7 @@ src/vbox/vbox_MSCOMGlue.c src/vbox/vbox_XPCOMCGlue.c src/vbox/vbox_driver.c src/vbox/vbox_common.c +src/vbox/vbox_network.c
Not yet, there are no translations in vbox_network.c so far.
src/vbox/vbox_snapshot_conf.c src/vbox/vbox_tmpl.c src/vmware/vmware_conf.c diff --git a/src/Makefile.am b/src/Makefile.am index dcd2ae2..34eb9f8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -678,6 +678,7 @@ VBOX_DRIVER_SOURCES = \ vbox/vbox_V4_3.c vbox/vbox_CAPI_v4_3.h \ vbox/vbox_V4_3_4.c vbox/vbox_CAPI_v4_3_4.h \ vbox/vbox_common.c vbox/vbox_common.h \ + vbox/vbox_network.c \ vbox/vbox_uniformed_api.h \ vbox/vbox_get_driver.h
diff --git a/src/vbox/vbox_network.c b/src/vbox/vbox_network.c new file mode 100644 index 0000000..2e09b4b --- /dev/null +++ b/src/vbox/vbox_network.c @@ -0,0 +1,58 @@ +/* + * Copyright 2014, Taowei Luo (uaedante@gmail.com)
I guess we can't just drop the other copyright owners. I mean vboxNetworkOpen() is not something you invented, you've just copying that over to a different file. So I'll include the original copyright notices over here too. I should have noticed this in previous patches too, sorry.
+ * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * <http://www.gnu.org/licenses/>. + */
Michal

--- src/vbox/vbox_network.c | 7 +++++++ src/vbox/vbox_tmpl.c | 6 ------ src/vbox/vbox_uniformed_api.h | 1 + 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/vbox/vbox_network.c b/src/vbox/vbox_network.c index 2e09b4b..af38562 100644 --- a/src/vbox/vbox_network.c +++ b/src/vbox/vbox_network.c @@ -56,3 +56,10 @@ virDrvOpenStatus vboxNetworkOpen(virConnectPtr conn, cleanup: return VIR_DRV_OPEN_DECLINED; } + +int vboxNetworkClose(virConnectPtr conn) +{ + VIR_DEBUG("network uninitialized"); + conn->networkPrivateData = NULL; + return 0; +} diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index da3841f..06b8722 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -2059,12 +2059,6 @@ _registerDomainEvent(virDriverPtr driver) /** * The Network Functions here on */ -static int vboxNetworkClose(virConnectPtr conn) -{ - VIR_DEBUG("network uninitialized"); - conn->networkPrivateData = NULL; - return 0; -} static int vboxConnectNumOfNetworks(virConnectPtr conn) { diff --git a/src/vbox/vbox_uniformed_api.h b/src/vbox/vbox_uniformed_api.h index 0237160..8552efb 100644 --- a/src/vbox/vbox_uniformed_api.h +++ b/src/vbox/vbox_uniformed_api.h @@ -537,6 +537,7 @@ virDomainPtr vboxDomainLookupByUUID(virConnectPtr conn, virDrvOpenStatus vboxNetworkOpen(virConnectPtr conn, virConnectAuthPtr auth, unsigned int flags); +int vboxNetworkClose(virConnectPtr conn); /* Version specified functions for installing uniformed API */ void vbox22InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI); -- 1.7.9.5

--- src/vbox/vbox_common.h | 15 ++++++++++ src/vbox/vbox_network.c | 55 ++++++++++++++++++++++++++++++++++ src/vbox/vbox_tmpl.c | 65 ++++++++++++++++++++--------------------- src/vbox/vbox_uniformed_api.h | 10 +++++++ 4 files changed, 111 insertions(+), 34 deletions(-) diff --git a/src/vbox/vbox_common.h b/src/vbox/vbox_common.h index b5a0353..9f5385b 100644 --- a/src/vbox/vbox_common.h +++ b/src/vbox/vbox_common.h @@ -265,6 +265,19 @@ enum MediumVariant MediumVariant_Diff = 0x20000 }; +enum HostNetworkInterfaceStatus +{ + HostNetworkInterfaceStatus_Unknown = 0, + HostNetworkInterfaceStatus_Up = 1, + HostNetworkInterfaceStatus_Down = 2 +}; + +enum HostNetworkInterfaceType +{ + HostNetworkInterfaceType_Bridged = 1, + HostNetworkInterfaceType_HostOnly = 2 +}; + # define VBOX_E_OBJECT_NOT_FOUND 0x80BB0001 # define VBOX_E_INVALID_VM_STATE 0x80BB0002 # define VBOX_E_VM_ERROR 0x80BB0003 @@ -302,5 +315,7 @@ typedef nsISupports IStorageController; typedef nsISupports ISharedFolder; typedef nsISupports ISnapshot; typedef nsISupports IDisplay; +typedef nsISupports IHost; +typedef nsISupports IHostNetworkInterface; #endif /* VBOX_COMMON_H */ diff --git a/src/vbox/vbox_network.c b/src/vbox/vbox_network.c index af38562..b2e9060 100644 --- a/src/vbox/vbox_network.c +++ b/src/vbox/vbox_network.c @@ -31,6 +31,16 @@ VIR_LOG_INIT("vbox.vbox_network"); +#define VBOX_RELEASE(arg) \ + do { \ + if (arg) { \ + gVBoxAPI.nsUISupports.Release((void *)arg); \ + (arg) = NULL; \ + } \ + } while (0) + +static vboxUniformedAPI gVBoxAPI; + /** * The Network Functions here on */ @@ -63,3 +73,48 @@ int vboxNetworkClose(virConnectPtr conn) conn->networkPrivateData = NULL; return 0; } + +int vboxConnectNumOfNetworks(virConnectPtr conn) +{ + vboxGlobalData *data = conn->privateData; + vboxArray networkInterfaces = VBOX_ARRAY_INITIALIZER; + IHost *host = NULL; + size_t i = 0; + int ret = -1; + + if (!data->vboxObj) + return ret; + + gVBoxAPI.UIVirtualBox.GetHost(data->vboxObj, &host); + if (!host) + return ret; + + gVBoxAPI.UArray.vboxArrayGet(&networkInterfaces, host, + gVBoxAPI.UArray.handleHostGetNetworkInterfaces(host)); + + ret = 0; + for (i = 0; i < networkInterfaces.count; i++) { + IHostNetworkInterface *networkInterface = networkInterfaces.items[i]; + PRUint32 status = HostNetworkInterfaceStatus_Unknown; + PRUint32 interfaceType = 0; + + if (!networkInterface) + continue; + + gVBoxAPI.UIHNInterface.GetInterfaceType(networkInterface, &interfaceType); + if (interfaceType != HostNetworkInterfaceType_HostOnly) + continue; + + gVBoxAPI.UIHNInterface.GetStatus(networkInterface, &status); + + if (status == HostNetworkInterfaceStatus_Up) + ret++; + } + + gVBoxAPI.UArray.vboxArrayRelease(&networkInterfaces); + + VBOX_RELEASE(host); + + VIR_DEBUG("numActive: %d", ret); + return ret; +} diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index 06b8722..324e5d6 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -2060,40 +2060,6 @@ _registerDomainEvent(virDriverPtr driver) * The Network Functions here on */ -static int vboxConnectNumOfNetworks(virConnectPtr conn) -{ - VBOX_OBJECT_HOST_CHECK(conn, int, 0); - vboxArray networkInterfaces = VBOX_ARRAY_INITIALIZER; - size_t i = 0; - - vboxArrayGet(&networkInterfaces, host, host->vtbl->GetNetworkInterfaces); - - for (i = 0; i < networkInterfaces.count; i++) { - IHostNetworkInterface *networkInterface = networkInterfaces.items[i]; - - if (networkInterface) { - PRUint32 interfaceType = 0; - - networkInterface->vtbl->GetInterfaceType(networkInterface, &interfaceType); - if (interfaceType == HostNetworkInterfaceType_HostOnly) { - PRUint32 status = HostNetworkInterfaceStatus_Unknown; - - networkInterface->vtbl->GetStatus(networkInterface, &status); - - if (status == HostNetworkInterfaceStatus_Up) - ret++; - } - } - } - - vboxArrayRelease(&networkInterfaces); - - VBOX_RELEASE(host); - - VIR_DEBUG("numActive: %d", ret); - return ret; -} - static int vboxConnectListNetworks(virConnectPtr conn, char **const names, int nnames) { VBOX_OBJECT_HOST_CHECK(conn, int, 0); vboxArray networkInterfaces = VBOX_ARRAY_INITIALIZER; @@ -4501,6 +4467,11 @@ static void* _handleMediumGetSnapshotIds(IMedium *medium) return medium->vtbl->GetSnapshotIds; } +static void* _handleHostGetNetworkInterfaces(IHost *host) +{ + return host->vtbl->GetNetworkInterfaces; +} + static nsresult _nsisupportsRelease(nsISupports *nsi) { return nsi->vtbl->Release(nsi); @@ -4548,6 +4519,12 @@ _virtualboxGetSystemProperties(IVirtualBox *vboxObj, ISystemProperties **systemP } static nsresult +_virtualboxGetHost(IVirtualBox *vboxObj, IHost **host) +{ + return vboxObj->vtbl->GetHost(vboxObj, host); +} + +static nsresult _virtualboxCreateMachine(vboxGlobalData *data, virDomainDefPtr def, IMachine **machine, char *uuidstr ATTRIBUTE_UNUSED) { vboxIID iid = VBOX_IID_INITIALIZER; @@ -6043,6 +6020,18 @@ _displayTakeScreenShotPNGToArray(IDisplay *display ATTRIBUTE_UNUSED, #endif /* VBOX_API_VERSION >= 4000000 */ } +static nsresult +_hnInterfaceGetInterfaceType(IHostNetworkInterface *hni, PRUint32 *interfaceType) +{ + return hni->vtbl->GetInterfaceType(hni, interfaceType); +} + +static nsresult +_hnInterfaceGetStatus(IHostNetworkInterface *hni, PRUint32 *status) +{ + return hni->vtbl->GetStatus(hni, status); +} + static bool _machineStateOnline(PRUint32 state) { return ((state >= MachineState_FirstOnline) && @@ -6109,6 +6098,7 @@ static vboxUniformedArray _UArray = { .handleSnapshotGetChildren = _handleSnapshotGetChildren, .handleMediumGetChildren = _handleMediumGetChildren, .handleMediumGetSnapshotIds = _handleMediumGetSnapshotIds, + .handleHostGetNetworkInterfaces = _handleHostGetNetworkInterfaces, }; static vboxUniformednsISupports _nsUISupports = { @@ -6121,6 +6111,7 @@ static vboxUniformedIVirtualBox _UIVirtualBox = { .GetMachine = _virtualboxGetMachine, .OpenMachine = _virtualboxOpenMachine, .GetSystemProperties = _virtualboxGetSystemProperties, + .GetHost = _virtualboxGetHost, .CreateMachine = _virtualboxCreateMachine, .CreateHardDiskMedium = _virtualboxCreateHardDiskMedium, .RegisterMachine = _virtualboxRegisterMachine, @@ -6344,6 +6335,11 @@ static vboxUniformedIDisplay _UIDisplay = { .TakeScreenShotPNGToArray = _displayTakeScreenShotPNGToArray, }; +static vboxUniformedIHNInterface _UIHNInterface = { + .GetInterfaceType = _hnInterfaceGetInterfaceType, + .GetStatus = _hnInterfaceGetStatus, +}; + static uniformedMachineStateChecker _machineStateChecker = { .Online = _machineStateOnline, .Inactive = _machineStateInactive, @@ -6397,6 +6393,7 @@ void NAME(InstallUniformedAPI)(vboxUniformedAPI *pVBoxAPI) pVBoxAPI->UISharedFolder = _UISharedFolder; pVBoxAPI->UISnapshot = _UISnapshot; pVBoxAPI->UIDisplay = _UIDisplay; + pVBoxAPI->UIHNInterface = _UIHNInterface; pVBoxAPI->machineStateChecker = _machineStateChecker; #if VBOX_API_VERSION <= 2002000 || VBOX_API_VERSION >= 4000000 diff --git a/src/vbox/vbox_uniformed_api.h b/src/vbox/vbox_uniformed_api.h index 8552efb..9644f61 100644 --- a/src/vbox/vbox_uniformed_api.h +++ b/src/vbox/vbox_uniformed_api.h @@ -176,6 +176,7 @@ typedef struct { void* (*handleSnapshotGetChildren)(ISnapshot *snapshot); void* (*handleMediumGetChildren)(IMedium *medium); void* (*handleMediumGetSnapshotIds)(IMedium *medium); + void* (*handleHostGetNetworkInterfaces)(IHost *host); } vboxUniformedArray; /* Functions for nsISupports */ @@ -190,6 +191,7 @@ typedef struct { nsresult (*GetMachine)(IVirtualBox *vboxObj, vboxIIDUnion *iidu, IMachine **machine); nsresult (*OpenMachine)(IVirtualBox *vboxObj, PRUnichar *settingsFile, IMachine **machine); nsresult (*GetSystemProperties)(IVirtualBox *vboxObj, ISystemProperties **systemProperties); + nsresult (*GetHost)(IVirtualBox *vboxObj, IHost **host); nsresult (*CreateMachine)(vboxGlobalData *data, virDomainDefPtr def, IMachine **machine, char *uuidstr); nsresult (*CreateHardDiskMedium)(IVirtualBox *vboxObj, PRUnichar *format, PRUnichar *location, IMedium **medium); nsresult (*RegisterMachine)(IVirtualBox *vboxObj, IMachine *machine); @@ -464,6 +466,12 @@ typedef struct { PRUint8** screenData); } vboxUniformedIDisplay; +/* Functions for IHostNetworkInterface */ +typedef struct { + nsresult (*GetInterfaceType)(IHostNetworkInterface *hni, PRUint32 *interfaceType); + nsresult (*GetStatus)(IHostNetworkInterface *hni, PRUint32 *status); +} vboxUniformedIHNInterface; + typedef struct { bool (*Online)(PRUint32 state); bool (*Inactive)(PRUint32 state); @@ -518,6 +526,7 @@ typedef struct { vboxUniformedISharedFolder UISharedFolder; vboxUniformedISnapshot UISnapshot; vboxUniformedIDisplay UIDisplay; + vboxUniformedIHNInterface UIHNInterface; uniformedMachineStateChecker machineStateChecker; /* vbox API features */ bool domainEventCallbacks; @@ -538,6 +547,7 @@ virDrvOpenStatus vboxNetworkOpen(virConnectPtr conn, virConnectAuthPtr auth, unsigned int flags); int vboxNetworkClose(virConnectPtr conn); +int vboxConnectNumOfNetworks(virConnectPtr conn); /* Version specified functions for installing uniformed API */ void vbox22InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI); -- 1.7.9.5

On 02.10.2014 05:30, Taowei wrote:
--- src/vbox/vbox_common.h | 15 ++++++++++ src/vbox/vbox_network.c | 55 ++++++++++++++++++++++++++++++++++ src/vbox/vbox_tmpl.c | 65 ++++++++++++++++++++--------------------- src/vbox/vbox_uniformed_api.h | 10 +++++++ 4 files changed, 111 insertions(+), 34 deletions(-)
diff --git a/src/vbox/vbox_common.h b/src/vbox/vbox_common.h index b5a0353..9f5385b 100644 --- a/src/vbox/vbox_common.h +++ b/src/vbox/vbox_common.h @@ -265,6 +265,19 @@ enum MediumVariant MediumVariant_Diff = 0x20000 };
+enum HostNetworkInterfaceStatus +{ + HostNetworkInterfaceStatus_Unknown = 0, + HostNetworkInterfaceStatus_Up = 1, + HostNetworkInterfaceStatus_Down = 2 +}; + +enum HostNetworkInterfaceType +{ + HostNetworkInterfaceType_Bridged = 1, + HostNetworkInterfaceType_HostOnly = 2 +}; + # define VBOX_E_OBJECT_NOT_FOUND 0x80BB0001 # define VBOX_E_INVALID_VM_STATE 0x80BB0002 # define VBOX_E_VM_ERROR 0x80BB0003 @@ -302,5 +315,7 @@ typedef nsISupports IStorageController; typedef nsISupports ISharedFolder; typedef nsISupports ISnapshot; typedef nsISupports IDisplay; +typedef nsISupports IHost; +typedef nsISupports IHostNetworkInterface;
#endif /* VBOX_COMMON_H */ diff --git a/src/vbox/vbox_network.c b/src/vbox/vbox_network.c index af38562..b2e9060 100644 --- a/src/vbox/vbox_network.c +++ b/src/vbox/vbox_network.c @@ -31,6 +31,16 @@
VIR_LOG_INIT("vbox.vbox_network");
+#define VBOX_RELEASE(arg) \ + do { \ + if (arg) { \ + gVBoxAPI.nsUISupports.Release((void *)arg); \
The last character is a bit off indentation.
+ (arg) = NULL; \ + } \ + } while (0) + +static vboxUniformedAPI gVBoxAPI; +
Michal

--- src/vbox/vbox_network.c | 77 +++++++++++++++++++++++++++++++++++++++++ src/vbox/vbox_tmpl.c | 52 ++++------------------------ src/vbox/vbox_uniformed_api.h | 2 ++ 3 files changed, 86 insertions(+), 45 deletions(-) diff --git a/src/vbox/vbox_network.c b/src/vbox/vbox_network.c index b2e9060..c6cb0e9 100644 --- a/src/vbox/vbox_network.c +++ b/src/vbox/vbox_network.c @@ -23,6 +23,7 @@ #include "domain_conf.h" #include "domain_event.h" #include "virlog.h" +#include "virstring.h" #include "vbox_common.h" #include "vbox_uniformed_api.h" @@ -31,6 +32,25 @@ VIR_LOG_INIT("vbox.vbox_network"); +#define VBOX_UTF16_FREE(arg) \ + do { \ + if (arg) { \ + gVBoxAPI.UPFN.Utf16Free(data->pFuncs, arg); \ + (arg) = NULL; \ + } \ + } while (0) + +#define VBOX_UTF8_FREE(arg) \ + do { \ + if (arg) { \ + gVBoxAPI.UPFN.Utf8Free(data->pFuncs, arg); \ + (arg) = NULL; \ + } \ + } while (0) + +#define VBOX_UTF16_TO_UTF8(arg1, arg2) gVBoxAPI.UPFN.Utf16ToUtf8(data->pFuncs, arg1, arg2) +#define VBOX_UTF8_TO_UTF16(arg1, arg2) gVBoxAPI.UPFN.Utf8ToUtf16(data->pFuncs, arg1, arg2) + #define VBOX_RELEASE(arg) \ do { \ if (arg) { \ @@ -118,3 +138,60 @@ int vboxConnectNumOfNetworks(virConnectPtr conn) VIR_DEBUG("numActive: %d", ret); return ret; } + +int vboxConnectListNetworks(virConnectPtr conn, char **const names, int nnames) +{ + vboxGlobalData *data = conn->privateData; + vboxArray networkInterfaces = VBOX_ARRAY_INITIALIZER; + IHost *host = NULL; + size_t i = 0; + int ret = -1; + + if (!data->vboxObj) + return ret; + + gVBoxAPI.UIVirtualBox.GetHost(data->vboxObj, &host); + if (!host) + return ret; + + gVBoxAPI.UArray.vboxArrayGet(&networkInterfaces, host, + gVBoxAPI.UArray.handleHostGetNetworkInterfaces(host)); + + ret = 0; + for (i = 0; (ret < nnames) && (i < networkInterfaces.count); i++) { + IHostNetworkInterface *networkInterface = networkInterfaces.items[i]; + char *nameUtf8 = NULL; + PRUnichar *nameUtf16 = NULL; + PRUint32 interfaceType = 0; + PRUint32 status = HostNetworkInterfaceStatus_Unknown; + + if (!networkInterface) + continue; + + gVBoxAPI.UIHNInterface.GetInterfaceType(networkInterface, &interfaceType); + + if (interfaceType != HostNetworkInterfaceType_HostOnly) + continue; + + gVBoxAPI.UIHNInterface.GetStatus(networkInterface, &status); + + if (status != HostNetworkInterfaceStatus_Up) + continue; + + gVBoxAPI.UIHNInterface.GetName(networkInterface, &nameUtf16); + VBOX_UTF16_TO_UTF8(nameUtf16, &nameUtf8); + + VIR_DEBUG("nnames[%d]: %s", ret, nameUtf8); + if (VIR_STRDUP(names[ret], nameUtf8) >= 0) + ret++; + + VBOX_UTF8_FREE(nameUtf8); + VBOX_UTF16_FREE(nameUtf16); + } + + gVBoxAPI.UArray.vboxArrayRelease(&networkInterfaces); + + VBOX_RELEASE(host); + + return ret; +} diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index 324e5d6..c7aae25 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -2060,51 +2060,6 @@ _registerDomainEvent(virDriverPtr driver) * The Network Functions here on */ -static int vboxConnectListNetworks(virConnectPtr conn, char **const names, int nnames) { - VBOX_OBJECT_HOST_CHECK(conn, int, 0); - vboxArray networkInterfaces = VBOX_ARRAY_INITIALIZER; - size_t i = 0; - - vboxArrayGet(&networkInterfaces, host, host->vtbl->GetNetworkInterfaces); - - for (i = 0; (ret < nnames) && (i < networkInterfaces.count); i++) { - IHostNetworkInterface *networkInterface = networkInterfaces.items[i]; - - if (networkInterface) { - PRUint32 interfaceType = 0; - - networkInterface->vtbl->GetInterfaceType(networkInterface, &interfaceType); - - if (interfaceType == HostNetworkInterfaceType_HostOnly) { - PRUint32 status = HostNetworkInterfaceStatus_Unknown; - - networkInterface->vtbl->GetStatus(networkInterface, &status); - - if (status == HostNetworkInterfaceStatus_Up) { - char *nameUtf8 = NULL; - PRUnichar *nameUtf16 = NULL; - - networkInterface->vtbl->GetName(networkInterface, &nameUtf16); - VBOX_UTF16_TO_UTF8(nameUtf16, &nameUtf8); - - VIR_DEBUG("nnames[%d]: %s", ret, nameUtf8); - if (VIR_STRDUP(names[ret], nameUtf8) >= 0) - ret++; - - VBOX_UTF8_FREE(nameUtf8); - VBOX_UTF16_FREE(nameUtf16); - } - } - } - } - - vboxArrayRelease(&networkInterfaces); - - VBOX_RELEASE(host); - - return ret; -} - static int vboxConnectNumOfDefinedNetworks(virConnectPtr conn) { VBOX_OBJECT_HOST_CHECK(conn, int, 0); @@ -6032,6 +5987,12 @@ _hnInterfaceGetStatus(IHostNetworkInterface *hni, PRUint32 *status) return hni->vtbl->GetStatus(hni, status); } +static nsresult +_hnInterfaceGetName(IHostNetworkInterface *hni, PRUnichar **name) +{ + return hni->vtbl->GetName(hni, name); +} + static bool _machineStateOnline(PRUint32 state) { return ((state >= MachineState_FirstOnline) && @@ -6338,6 +6299,7 @@ static vboxUniformedIDisplay _UIDisplay = { static vboxUniformedIHNInterface _UIHNInterface = { .GetInterfaceType = _hnInterfaceGetInterfaceType, .GetStatus = _hnInterfaceGetStatus, + .GetName = _hnInterfaceGetName, }; static uniformedMachineStateChecker _machineStateChecker = { diff --git a/src/vbox/vbox_uniformed_api.h b/src/vbox/vbox_uniformed_api.h index 9644f61..ec8e334 100644 --- a/src/vbox/vbox_uniformed_api.h +++ b/src/vbox/vbox_uniformed_api.h @@ -470,6 +470,7 @@ typedef struct { typedef struct { nsresult (*GetInterfaceType)(IHostNetworkInterface *hni, PRUint32 *interfaceType); nsresult (*GetStatus)(IHostNetworkInterface *hni, PRUint32 *status); + nsresult (*GetName)(IHostNetworkInterface *hni, PRUnichar **name); } vboxUniformedIHNInterface; typedef struct { @@ -548,6 +549,7 @@ virDrvOpenStatus vboxNetworkOpen(virConnectPtr conn, unsigned int flags); int vboxNetworkClose(virConnectPtr conn); int vboxConnectNumOfNetworks(virConnectPtr conn); +int vboxConnectListNetworks(virConnectPtr conn, char **const names, int nnames); /* Version specified functions for installing uniformed API */ void vbox22InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI); -- 1.7.9.5

--- src/vbox/vbox_network.c | 45 +++++++++++++++++++++++++++++++++++++++++ src/vbox/vbox_tmpl.c | 34 ------------------------------- src/vbox/vbox_uniformed_api.h | 1 + 3 files changed, 46 insertions(+), 34 deletions(-) diff --git a/src/vbox/vbox_network.c b/src/vbox/vbox_network.c index c6cb0e9..af451b4 100644 --- a/src/vbox/vbox_network.c +++ b/src/vbox/vbox_network.c @@ -195,3 +195,48 @@ int vboxConnectListNetworks(virConnectPtr conn, char **const names, int nnames) return ret; } + +int vboxConnectNumOfDefinedNetworks(virConnectPtr conn) +{ + vboxGlobalData *data = conn->privateData; + vboxArray networkInterfaces = VBOX_ARRAY_INITIALIZER; + IHost *host = NULL; + size_t i = 0; + int ret = -1; + + if (!data->vboxObj) + return ret; + + gVBoxAPI.UIVirtualBox.GetHost(data->vboxObj, &host); + if (!host) + return ret; + + gVBoxAPI.UArray.vboxArrayGet(&networkInterfaces, host, + gVBoxAPI.UArray.handleHostGetNetworkInterfaces(host)); + + ret = 0; + for (i = 0; i < networkInterfaces.count; i++) { + IHostNetworkInterface *networkInterface = networkInterfaces.items[i]; + PRUint32 status = HostNetworkInterfaceStatus_Unknown; + PRUint32 interfaceType = 0; + + if (!networkInterface) + continue; + + gVBoxAPI.UIHNInterface.GetInterfaceType(networkInterface, &interfaceType); + if (interfaceType != HostNetworkInterfaceType_HostOnly) + continue; + + gVBoxAPI.UIHNInterface.GetStatus(networkInterface, &status); + + if (status == HostNetworkInterfaceStatus_Down) + ret++; + } + + gVBoxAPI.UArray.vboxArrayRelease(&networkInterfaces); + + VBOX_RELEASE(host); + + VIR_DEBUG("numActive: %d", ret); + return ret; +} diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index c7aae25..fec9ce1 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -2060,40 +2060,6 @@ _registerDomainEvent(virDriverPtr driver) * The Network Functions here on */ -static int vboxConnectNumOfDefinedNetworks(virConnectPtr conn) -{ - VBOX_OBJECT_HOST_CHECK(conn, int, 0); - vboxArray networkInterfaces = VBOX_ARRAY_INITIALIZER; - size_t i = 0; - - vboxArrayGet(&networkInterfaces, host, host->vtbl->GetNetworkInterfaces); - - for (i = 0; i < networkInterfaces.count; i++) { - IHostNetworkInterface *networkInterface = networkInterfaces.items[i]; - - if (networkInterface) { - PRUint32 interfaceType = 0; - - networkInterface->vtbl->GetInterfaceType(networkInterface, &interfaceType); - if (interfaceType == HostNetworkInterfaceType_HostOnly) { - PRUint32 status = HostNetworkInterfaceStatus_Unknown; - - networkInterface->vtbl->GetStatus(networkInterface, &status); - - if (status == HostNetworkInterfaceStatus_Down) - ret++; - } - } - } - - vboxArrayRelease(&networkInterfaces); - - VBOX_RELEASE(host); - - VIR_DEBUG("numActive: %d", ret); - return ret; -} - static int vboxConnectListDefinedNetworks(virConnectPtr conn, char **const names, int nnames) { VBOX_OBJECT_HOST_CHECK(conn, int, 0); vboxArray networkInterfaces = VBOX_ARRAY_INITIALIZER; diff --git a/src/vbox/vbox_uniformed_api.h b/src/vbox/vbox_uniformed_api.h index ec8e334..2ca90ff 100644 --- a/src/vbox/vbox_uniformed_api.h +++ b/src/vbox/vbox_uniformed_api.h @@ -550,6 +550,7 @@ virDrvOpenStatus vboxNetworkOpen(virConnectPtr conn, int vboxNetworkClose(virConnectPtr conn); int vboxConnectNumOfNetworks(virConnectPtr conn); int vboxConnectListNetworks(virConnectPtr conn, char **const names, int nnames); +int vboxConnectNumOfDefinedNetworks(virConnectPtr conn); /* Version specified functions for installing uniformed API */ void vbox22InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI); -- 1.7.9.5

--- src/vbox/vbox_network.c | 57 +++++++++++++++++++++++++++++++++++++++++ src/vbox/vbox_tmpl.c | 45 -------------------------------- src/vbox/vbox_uniformed_api.h | 1 + 3 files changed, 58 insertions(+), 45 deletions(-) diff --git a/src/vbox/vbox_network.c b/src/vbox/vbox_network.c index af451b4..6d2ecdc 100644 --- a/src/vbox/vbox_network.c +++ b/src/vbox/vbox_network.c @@ -240,3 +240,60 @@ int vboxConnectNumOfDefinedNetworks(virConnectPtr conn) VIR_DEBUG("numActive: %d", ret); return ret; } + +int vboxConnectListDefinedNetworks(virConnectPtr conn, char **const names, int nnames) +{ + vboxGlobalData *data = conn->privateData; + vboxArray networkInterfaces = VBOX_ARRAY_INITIALIZER; + IHost *host = NULL; + size_t i = 0; + int ret = -1; + + if (!data->vboxObj) + return ret; + + gVBoxAPI.UIVirtualBox.GetHost(data->vboxObj, &host); + if (!host) + return ret; + + gVBoxAPI.UArray.vboxArrayGet(&networkInterfaces, host, + gVBoxAPI.UArray.handleHostGetNetworkInterfaces(host)); + + ret = 0; + for (i = 0; (ret < nnames) && (i < networkInterfaces.count); i++) { + IHostNetworkInterface *networkInterface = networkInterfaces.items[i]; + PRUint32 interfaceType = 0; + char *nameUtf8 = NULL; + PRUnichar *nameUtf16 = NULL; + PRUint32 status = HostNetworkInterfaceStatus_Unknown; + + if (!networkInterface) + continue; + + gVBoxAPI.UIHNInterface.GetInterfaceType(networkInterface, &interfaceType); + + if (interfaceType != HostNetworkInterfaceType_HostOnly) + continue; + + gVBoxAPI.UIHNInterface.GetStatus(networkInterface, &status); + + if (status != HostNetworkInterfaceStatus_Down) + continue; + + gVBoxAPI.UIHNInterface.GetName(networkInterface, &nameUtf16); + VBOX_UTF16_TO_UTF8(nameUtf16, &nameUtf8); + + VIR_DEBUG("nnames[%d]: %s", ret, nameUtf8); + if (VIR_STRDUP(names[ret], nameUtf8) >= 0) + ret++; + + VBOX_UTF8_FREE(nameUtf8); + VBOX_UTF16_FREE(nameUtf16); + } + + gVBoxAPI.UArray.vboxArrayRelease(&networkInterfaces); + + VBOX_RELEASE(host); + + return ret; +} diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index fec9ce1..ed75656 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -2060,51 +2060,6 @@ _registerDomainEvent(virDriverPtr driver) * The Network Functions here on */ -static int vboxConnectListDefinedNetworks(virConnectPtr conn, char **const names, int nnames) { - VBOX_OBJECT_HOST_CHECK(conn, int, 0); - vboxArray networkInterfaces = VBOX_ARRAY_INITIALIZER; - size_t i = 0; - - vboxArrayGet(&networkInterfaces, host, host->vtbl->GetNetworkInterfaces); - - for (i = 0; (ret < nnames) && (i < networkInterfaces.count); i++) { - IHostNetworkInterface *networkInterface = networkInterfaces.items[i]; - - if (networkInterface) { - PRUint32 interfaceType = 0; - - networkInterface->vtbl->GetInterfaceType(networkInterface, &interfaceType); - - if (interfaceType == HostNetworkInterfaceType_HostOnly) { - PRUint32 status = HostNetworkInterfaceStatus_Unknown; - - networkInterface->vtbl->GetStatus(networkInterface, &status); - - if (status == HostNetworkInterfaceStatus_Down) { - char *nameUtf8 = NULL; - PRUnichar *nameUtf16 = NULL; - - networkInterface->vtbl->GetName(networkInterface, &nameUtf16); - VBOX_UTF16_TO_UTF8(nameUtf16, &nameUtf8); - - VIR_DEBUG("nnames[%d]: %s", ret, nameUtf8); - if (VIR_STRDUP(names[ret], nameUtf8) >= 0) - ret++; - - VBOX_UTF8_FREE(nameUtf8); - VBOX_UTF16_FREE(nameUtf16); - } - } - } - } - - vboxArrayRelease(&networkInterfaces); - - VBOX_RELEASE(host); - - return ret; -} - static virNetworkPtr vboxNetworkLookupByUUID(virConnectPtr conn, const unsigned char *uuid) { diff --git a/src/vbox/vbox_uniformed_api.h b/src/vbox/vbox_uniformed_api.h index 2ca90ff..e6729f2 100644 --- a/src/vbox/vbox_uniformed_api.h +++ b/src/vbox/vbox_uniformed_api.h @@ -551,6 +551,7 @@ int vboxNetworkClose(virConnectPtr conn); int vboxConnectNumOfNetworks(virConnectPtr conn); int vboxConnectListNetworks(virConnectPtr conn, char **const names, int nnames); int vboxConnectNumOfDefinedNetworks(virConnectPtr conn); +int vboxConnectListDefinedNetworks(virConnectPtr conn, char **const names, int nnames); /* Version specified functions for installing uniformed API */ void vbox22InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI); -- 1.7.9.5

--- src/vbox/vbox_network.c | 65 +++++++++++++++++++++++++++++++++++++++++ src/vbox/vbox_tmpl.c | 57 +++++++++--------------------------- src/vbox/vbox_uniformed_api.h | 8 +++++ 3 files changed, 86 insertions(+), 44 deletions(-) diff --git a/src/vbox/vbox_network.c b/src/vbox/vbox_network.c index 6d2ecdc..0405265 100644 --- a/src/vbox/vbox_network.c +++ b/src/vbox/vbox_network.c @@ -59,6 +59,19 @@ VIR_LOG_INIT("vbox.vbox_network"); } \ } while (0) +#define vboxIIDUnalloc(iid) gVBoxAPI.UIID.vboxIIDUnalloc(data, iid) +#define vboxIIDToUUID(iid, uuid) gVBoxAPI.UIID.vboxIIDToUUID(data, iid, uuid) +#define vboxIIDFromUUID(iid, uuid) gVBoxAPI.UIID.vboxIIDFromUUID(data, iid, uuid) +#define vboxIIDIsEqual(iid1, iid2) gVBoxAPI.UIID.vboxIIDIsEqual(data, iid1, iid2) +#define DEBUGIID(msg, iid) gVBoxAPI.UIID.DEBUGIID(msg, iid) +#define vboxIIDFromArrayItem(iid, array, idx) \ + gVBoxAPI.UIID.vboxIIDFromArrayItem(data, iid, array, idx) + +#define VBOX_IID_INITIALIZE(iid) gVBoxAPI.UIID.vboxIIDInitialize(iid) + +#define ARRAY_GET_MACHINES \ + (gVBoxAPI.UArray.handleGetMachines(data->vboxObj)) + static vboxUniformedAPI gVBoxAPI; /** @@ -297,3 +310,55 @@ int vboxConnectListDefinedNetworks(virConnectPtr conn, char **const names, int n return ret; } + +virNetworkPtr vboxNetworkLookupByUUID(virConnectPtr conn, const unsigned char *uuid) +{ + vboxGlobalData *data = conn->privateData; + PRUint32 interfaceType = 0; + char *nameUtf8 = NULL; + PRUnichar *nameUtf16 = NULL; + IHostNetworkInterface *networkInterface = NULL; + vboxIIDUnion iid; + IHost *host = NULL; + virNetworkPtr ret = NULL; + + if (!data->vboxObj) + return ret; + + gVBoxAPI.UIVirtualBox.GetHost(data->vboxObj, &host); + if (!host) + return ret; + + VBOX_IID_INITIALIZE(&iid); + vboxIIDFromUUID(&iid, uuid); + + /* TODO: "internal" networks are just strings and + * thus can't do much with them + */ + + gVBoxAPI.UIHost.FindHostNetworkInterfaceById(host, &iid, + &networkInterface); + if (!networkInterface) + goto cleanup; + + gVBoxAPI.UIHNInterface.GetInterfaceType(networkInterface, &interfaceType); + + if (interfaceType != HostNetworkInterfaceType_HostOnly) + goto cleanup; + + gVBoxAPI.UIHNInterface.GetName(networkInterface, &nameUtf16); + VBOX_UTF16_TO_UTF8(nameUtf16, &nameUtf8); + + ret = virGetNetwork(conn, nameUtf8, uuid); + + VIR_DEBUG("Network Name: %s", nameUtf8); + DEBUGIID("Network UUID", &iid); + VBOX_UTF8_FREE(nameUtf8); + VBOX_UTF16_FREE(nameUtf16); + + cleanup: + VBOX_RELEASE(networkInterface); + VBOX_RELEASE(host); + vboxIIDUnalloc(&iid); + return ret; +} diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index ed75656..8675182 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -2061,50 +2061,6 @@ _registerDomainEvent(virDriverPtr driver) */ static virNetworkPtr -vboxNetworkLookupByUUID(virConnectPtr conn, const unsigned char *uuid) -{ - VBOX_OBJECT_HOST_CHECK(conn, virNetworkPtr, NULL); - vboxIID iid = VBOX_IID_INITIALIZER; - - vboxIIDFromUUID(&iid, uuid); - - /* TODO: "internal" networks are just strings and - * thus can't do much with them - */ - IHostNetworkInterface *networkInterface = NULL; - - host->vtbl->FindHostNetworkInterfaceById(host, iid.value, &networkInterface); - if (networkInterface) { - PRUint32 interfaceType = 0; - - networkInterface->vtbl->GetInterfaceType(networkInterface, &interfaceType); - - if (interfaceType == HostNetworkInterfaceType_HostOnly) { - char *nameUtf8 = NULL; - PRUnichar *nameUtf16 = NULL; - - networkInterface->vtbl->GetName(networkInterface, &nameUtf16); - VBOX_UTF16_TO_UTF8(nameUtf16, &nameUtf8); - - ret = virGetNetwork(conn, nameUtf8, uuid); - - VIR_DEBUG("Network Name: %s", nameUtf8); - DEBUGIID("Network UUID", iid.value); - - VBOX_UTF8_FREE(nameUtf8); - VBOX_UTF16_FREE(nameUtf16); - } - - VBOX_RELEASE(networkInterface); - } - - VBOX_RELEASE(host); - - vboxIIDUnalloc(&iid); - return ret; -} - -static virNetworkPtr vboxNetworkLookupByName(virConnectPtr conn, const char *name) { VBOX_OBJECT_HOST_CHECK(conn, virNetworkPtr, NULL); @@ -5897,6 +5853,14 @@ _displayTakeScreenShotPNGToArray(IDisplay *display ATTRIBUTE_UNUSED, } static nsresult +_hostFindHostNetworkInterfaceById(IHost *host, vboxIIDUnion *iidu, + IHostNetworkInterface **networkInterface) +{ + return host->vtbl->FindHostNetworkInterfaceById(host, IID_MEMBER(value), + networkInterface); +} + +static nsresult _hnInterfaceGetInterfaceType(IHostNetworkInterface *hni, PRUint32 *interfaceType) { return hni->vtbl->GetInterfaceType(hni, interfaceType); @@ -6217,6 +6181,10 @@ static vboxUniformedIDisplay _UIDisplay = { .TakeScreenShotPNGToArray = _displayTakeScreenShotPNGToArray, }; +static vboxUniformedIHost _UIHost = { + .FindHostNetworkInterfaceById = _hostFindHostNetworkInterfaceById, +}; + static vboxUniformedIHNInterface _UIHNInterface = { .GetInterfaceType = _hnInterfaceGetInterfaceType, .GetStatus = _hnInterfaceGetStatus, @@ -6276,6 +6244,7 @@ void NAME(InstallUniformedAPI)(vboxUniformedAPI *pVBoxAPI) pVBoxAPI->UISharedFolder = _UISharedFolder; pVBoxAPI->UISnapshot = _UISnapshot; pVBoxAPI->UIDisplay = _UIDisplay; + pVBoxAPI->UIHost = _UIHost; pVBoxAPI->UIHNInterface = _UIHNInterface; pVBoxAPI->machineStateChecker = _machineStateChecker; diff --git a/src/vbox/vbox_uniformed_api.h b/src/vbox/vbox_uniformed_api.h index e6729f2..2e0eb10 100644 --- a/src/vbox/vbox_uniformed_api.h +++ b/src/vbox/vbox_uniformed_api.h @@ -466,6 +466,12 @@ typedef struct { PRUint8** screenData); } vboxUniformedIDisplay; +/* Functions for IHost */ +typedef struct { + nsresult (*FindHostNetworkInterfaceById)(IHost *host, vboxIIDUnion *iidu, + IHostNetworkInterface **networkInterface); +} vboxUniformedIHost; + /* Functions for IHostNetworkInterface */ typedef struct { nsresult (*GetInterfaceType)(IHostNetworkInterface *hni, PRUint32 *interfaceType); @@ -527,6 +533,7 @@ typedef struct { vboxUniformedISharedFolder UISharedFolder; vboxUniformedISnapshot UISnapshot; vboxUniformedIDisplay UIDisplay; + vboxUniformedIHost UIHost; vboxUniformedIHNInterface UIHNInterface; uniformedMachineStateChecker machineStateChecker; /* vbox API features */ @@ -552,6 +559,7 @@ int vboxConnectNumOfNetworks(virConnectPtr conn); int vboxConnectListNetworks(virConnectPtr conn, char **const names, int nnames); int vboxConnectNumOfDefinedNetworks(virConnectPtr conn); int vboxConnectListDefinedNetworks(virConnectPtr conn, char **const names, int nnames); +virNetworkPtr vboxNetworkLookupByUUID(virConnectPtr conn, const unsigned char *uuid); /* Version specified functions for installing uniformed API */ void vbox22InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI); -- 1.7.9.5

--- src/vbox/vbox_network.c | 49 +++++++++++++++++++++++++++++++++++++ src/vbox/vbox_tmpl.c | 54 ++++++++++++----------------------------- src/vbox/vbox_uniformed_api.h | 4 +++ 3 files changed, 69 insertions(+), 38 deletions(-) diff --git a/src/vbox/vbox_network.c b/src/vbox/vbox_network.c index 0405265..f0fa4f4 100644 --- a/src/vbox/vbox_network.c +++ b/src/vbox/vbox_network.c @@ -362,3 +362,52 @@ virNetworkPtr vboxNetworkLookupByUUID(virConnectPtr conn, const unsigned char *u vboxIIDUnalloc(&iid); return ret; } + +virNetworkPtr vboxNetworkLookupByName(virConnectPtr conn, const char *name) +{ + vboxGlobalData *data = conn->privateData; + PRUnichar *nameUtf16 = NULL; + IHostNetworkInterface *networkInterface = NULL; + PRUint32 interfaceType = 0; + unsigned char uuid[VIR_UUID_BUFLEN]; + vboxIIDUnion iid; + IHost *host = NULL; + virNetworkPtr ret = NULL; + nsresult rc; + + if (!data->vboxObj) + return ret; + + gVBoxAPI.UIVirtualBox.GetHost(data->vboxObj, &host); + if (!host) + return ret; + + VBOX_IID_INITIALIZE(&iid); + VBOX_UTF8_TO_UTF16(name, &nameUtf16); + + gVBoxAPI.UIHost.FindHostNetworkInterfaceByName(host, nameUtf16, &networkInterface); + + if (!networkInterface) + goto cleanup; + + gVBoxAPI.UIHNInterface.GetInterfaceType(networkInterface, &interfaceType); + + if (interfaceType != HostNetworkInterfaceType_HostOnly) + goto cleanup; + + rc = gVBoxAPI.UIHNInterface.GetId(networkInterface, &iid); + if (NS_FAILED(rc)) + goto cleanup; + vboxIIDToUUID(&iid, uuid); + ret = virGetNetwork(conn, name, uuid); + + VIR_DEBUG("Network Name: %s", name); + DEBUGIID("Network UUID", &iid); + vboxIIDUnalloc(&iid); + + cleanup: + VBOX_RELEASE(networkInterface); + VBOX_UTF16_FREE(nameUtf16); + VBOX_RELEASE(host); + return ret; +} diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index 8675182..fa55325 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -2061,44 +2061,6 @@ _registerDomainEvent(virDriverPtr driver) */ static virNetworkPtr -vboxNetworkLookupByName(virConnectPtr conn, const char *name) -{ - VBOX_OBJECT_HOST_CHECK(conn, virNetworkPtr, NULL); - PRUnichar *nameUtf16 = NULL; - IHostNetworkInterface *networkInterface = NULL; - - VBOX_UTF8_TO_UTF16(name, &nameUtf16); - - host->vtbl->FindHostNetworkInterfaceByName(host, nameUtf16, &networkInterface); - - if (networkInterface) { - PRUint32 interfaceType = 0; - - networkInterface->vtbl->GetInterfaceType(networkInterface, &interfaceType); - - if (interfaceType == HostNetworkInterfaceType_HostOnly) { - unsigned char uuid[VIR_UUID_BUFLEN]; - vboxIID iid = VBOX_IID_INITIALIZER; - - networkInterface->vtbl->GetId(networkInterface, &iid.value); - vboxIIDToUUID(&iid, uuid); - ret = virGetNetwork(conn, name, uuid); - VIR_DEBUG("Network Name: %s", name); - - DEBUGIID("Network UUID", iid.value); - vboxIIDUnalloc(&iid); - } - - VBOX_RELEASE(networkInterface); - } - - VBOX_UTF16_FREE(nameUtf16); - VBOX_RELEASE(host); - - return ret; -} - -static virNetworkPtr vboxNetworkDefineCreateXML(virConnectPtr conn, const char *xml, bool start) { VBOX_OBJECT_HOST_CHECK(conn, virNetworkPtr, NULL); @@ -5861,6 +5823,14 @@ _hostFindHostNetworkInterfaceById(IHost *host, vboxIIDUnion *iidu, } static nsresult +_hostFindHostNetworkInterfaceByName(IHost *host, PRUnichar *name, + IHostNetworkInterface **networkInterface) +{ + return host->vtbl->FindHostNetworkInterfaceByName(host, name, + networkInterface); +} + +static nsresult _hnInterfaceGetInterfaceType(IHostNetworkInterface *hni, PRUint32 *interfaceType) { return hni->vtbl->GetInterfaceType(hni, interfaceType); @@ -5878,6 +5848,12 @@ _hnInterfaceGetName(IHostNetworkInterface *hni, PRUnichar **name) return hni->vtbl->GetName(hni, name); } +static nsresult +_hnInterfaceGetId(IHostNetworkInterface *hni, vboxIIDUnion *iidu) +{ + return hni->vtbl->GetId(hni, &IID_MEMBER(value)); +} + static bool _machineStateOnline(PRUint32 state) { return ((state >= MachineState_FirstOnline) && @@ -6183,12 +6159,14 @@ static vboxUniformedIDisplay _UIDisplay = { static vboxUniformedIHost _UIHost = { .FindHostNetworkInterfaceById = _hostFindHostNetworkInterfaceById, + .FindHostNetworkInterfaceByName = _hostFindHostNetworkInterfaceByName, }; static vboxUniformedIHNInterface _UIHNInterface = { .GetInterfaceType = _hnInterfaceGetInterfaceType, .GetStatus = _hnInterfaceGetStatus, .GetName = _hnInterfaceGetName, + .GetId = _hnInterfaceGetId, }; static uniformedMachineStateChecker _machineStateChecker = { diff --git a/src/vbox/vbox_uniformed_api.h b/src/vbox/vbox_uniformed_api.h index 2e0eb10..a14ee1c 100644 --- a/src/vbox/vbox_uniformed_api.h +++ b/src/vbox/vbox_uniformed_api.h @@ -470,6 +470,8 @@ typedef struct { typedef struct { nsresult (*FindHostNetworkInterfaceById)(IHost *host, vboxIIDUnion *iidu, IHostNetworkInterface **networkInterface); + nsresult (*FindHostNetworkInterfaceByName)(IHost *host, PRUnichar *name, + IHostNetworkInterface **networkInterface); } vboxUniformedIHost; /* Functions for IHostNetworkInterface */ @@ -477,6 +479,7 @@ typedef struct { nsresult (*GetInterfaceType)(IHostNetworkInterface *hni, PRUint32 *interfaceType); nsresult (*GetStatus)(IHostNetworkInterface *hni, PRUint32 *status); nsresult (*GetName)(IHostNetworkInterface *hni, PRUnichar **name); + nsresult (*GetId)(IHostNetworkInterface *hni, vboxIIDUnion *iidu); } vboxUniformedIHNInterface; typedef struct { @@ -560,6 +563,7 @@ int vboxConnectListNetworks(virConnectPtr conn, char **const names, int nnames); int vboxConnectNumOfDefinedNetworks(virConnectPtr conn); int vboxConnectListDefinedNetworks(virConnectPtr conn, char **const names, int nnames); virNetworkPtr vboxNetworkLookupByUUID(virConnectPtr conn, const unsigned char *uuid); +virNetworkPtr vboxNetworkLookupByName(virConnectPtr conn, const char *name); /* Version specified functions for installing uniformed API */ void vbox22InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI); -- 1.7.9.5

This patch actually contains two public API, virNetworkDefineXML and virNetworkCreateXML. They use the same core function vboxNetworkDefineCreateXML. So I merged it together. --- src/vbox/vbox_common.h | 1 + src/vbox/vbox_network.c | 214 +++++++++++++++++++++++++ src/vbox/vbox_tmpl.c | 351 ++++++++++++++--------------------------- src/vbox/vbox_uniformed_api.h | 22 +++ 4 files changed, 352 insertions(+), 236 deletions(-) diff --git a/src/vbox/vbox_common.h b/src/vbox/vbox_common.h index 9f5385b..76288d4 100644 --- a/src/vbox/vbox_common.h +++ b/src/vbox/vbox_common.h @@ -317,5 +317,6 @@ typedef nsISupports ISnapshot; typedef nsISupports IDisplay; typedef nsISupports IHost; typedef nsISupports IHostNetworkInterface; +typedef nsISupports IDHCPServer; #endif /* VBOX_COMMON_H */ diff --git a/src/vbox/vbox_network.c b/src/vbox/vbox_network.c index f0fa4f4..feecf0c 100644 --- a/src/vbox/vbox_network.c +++ b/src/vbox/vbox_network.c @@ -24,6 +24,8 @@ #include "domain_event.h" #include "virlog.h" #include "virstring.h" +#include "viralloc.h" +#include "network_conf.h" #include "vbox_common.h" #include "vbox_uniformed_api.h" @@ -411,3 +413,215 @@ virNetworkPtr vboxNetworkLookupByName(virConnectPtr conn, const char *name) VBOX_RELEASE(host); return ret; } + +static PRUnichar * +vboxSocketFormatAddrUtf16(vboxGlobalData *data, virSocketAddrPtr addr) +{ + char *utf8 = NULL; + PRUnichar *utf16 = NULL; + + utf8 = virSocketAddrFormat(addr); + + if (utf8 == NULL) { + return NULL; + } + + VBOX_UTF8_TO_UTF16(utf8, &utf16); + VIR_FREE(utf8); + + return utf16; +} + +static virNetworkPtr +vboxNetworkDefineCreateXML(virConnectPtr conn, const char *xml, bool start) +{ + vboxGlobalData *data = conn->privateData; + PRUnichar *networkInterfaceNameUtf16 = NULL; + char *networkInterfaceNameUtf8 = NULL; + PRUnichar *networkNameUtf16 = NULL; + char *networkNameUtf8 = NULL; + IHostNetworkInterface *networkInterface = NULL; + virNetworkDefPtr def = virNetworkDefParseString(xml); + virNetworkIpDefPtr ipdef = NULL; + unsigned char uuid[VIR_UUID_BUFLEN]; + vboxIIDUnion vboxnetiid; + virSocketAddr netmask; + IHost *host = NULL; + virNetworkPtr ret = NULL; + nsresult rc; + + if (!data->vboxObj) + return ret; + + gVBoxAPI.UIVirtualBox.GetHost(data->vboxObj, &host); + if (!host) + return ret; + + VBOX_IID_INITIALIZE(&vboxnetiid); + + if ((!def) || + (def->forward.type != VIR_NETWORK_FORWARD_NONE) || + (def->nips == 0 || !def->ips)) + goto cleanup; + + /* Look for the first IPv4 IP address definition and use that. + * If there weren't any IPv4 addresses, ignore the network (since it's + * required below to have an IPv4 address) + */ + ipdef = virNetworkDefGetIpByIndex(def, AF_INET, 0); + if (!ipdef) + goto cleanup; + + if (virNetworkIpDefNetmask(ipdef, &netmask) < 0) + goto cleanup; + + /* 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 ignored here for now. + * + * If the vbox is in 2.x and the def->name not equal to vboxnet0, + * the function call will fail and the networkInterface set to + * NULL. (We can't assign a new name to hostonly network, only + * take the given name, say vboxnet0) + */ + gVBoxAPI.UIHost.CreateHostOnlyNetworkInterface(data, host, def->name, + &networkInterface); + + if (!networkInterface) + goto cleanup; + + gVBoxAPI.UIHNInterface.GetName(networkInterface, &networkInterfaceNameUtf16); + if (!networkInterfaceNameUtf16) + goto cleanup; + + VBOX_UTF16_TO_UTF8(networkInterfaceNameUtf16, &networkInterfaceNameUtf8); + + if (virAsprintf(&networkNameUtf8, "HostInterfaceNetworking-%s", networkInterfaceNameUtf8) < 0) + goto cleanup; + + VBOX_UTF8_TO_UTF16(networkNameUtf8, &networkNameUtf16); + + /* Currently support only one dhcp server per network + * with contigious address space from start to end + */ + if ((ipdef->nranges >= 1) && + VIR_SOCKET_ADDR_VALID(&ipdef->ranges[0].start) && + VIR_SOCKET_ADDR_VALID(&ipdef->ranges[0].end)) { + IDHCPServer *dhcpServer = NULL; + + gVBoxAPI.UIVirtualBox.FindDHCPServerByNetworkName(data->vboxObj, + networkNameUtf16, + &dhcpServer); + if (!dhcpServer) { + /* create a dhcp server */ + gVBoxAPI.UIVirtualBox.CreateDHCPServer(data->vboxObj, + networkNameUtf16, + &dhcpServer); + VIR_DEBUG("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; + + ipAddressUtf16 = vboxSocketFormatAddrUtf16(data, &ipdef->address); + networkMaskUtf16 = vboxSocketFormatAddrUtf16(data, &netmask); + fromIPAddressUtf16 = vboxSocketFormatAddrUtf16(data, &ipdef->ranges[0].start); + toIPAddressUtf16 = vboxSocketFormatAddrUtf16(data, &ipdef->ranges[0].end); + + if (ipAddressUtf16 == NULL || networkMaskUtf16 == NULL || + fromIPAddressUtf16 == NULL || toIPAddressUtf16 == NULL) { + VBOX_UTF16_FREE(ipAddressUtf16); + VBOX_UTF16_FREE(networkMaskUtf16); + VBOX_UTF16_FREE(fromIPAddressUtf16); + VBOX_UTF16_FREE(toIPAddressUtf16); + VBOX_RELEASE(dhcpServer); + goto cleanup; + } + + VBOX_UTF8_TO_UTF16("netflt", &trunkTypeUtf16); + + gVBoxAPI.UIDHCPServer.SetEnabled(dhcpServer, PR_TRUE); + + gVBoxAPI.UIDHCPServer.SetConfiguration(dhcpServer, + ipAddressUtf16, + networkMaskUtf16, + fromIPAddressUtf16, + toIPAddressUtf16); + + if (start) + gVBoxAPI.UIDHCPServer.Start(dhcpServer, + networkNameUtf16, + networkInterfaceNameUtf16, + trunkTypeUtf16); + + VBOX_UTF16_FREE(ipAddressUtf16); + VBOX_UTF16_FREE(networkMaskUtf16); + VBOX_UTF16_FREE(fromIPAddressUtf16); + VBOX_UTF16_FREE(toIPAddressUtf16); + VBOX_UTF16_FREE(trunkTypeUtf16); + VBOX_RELEASE(dhcpServer); + } + } + + if ((ipdef->nhosts >= 1) && + VIR_SOCKET_ADDR_VALID(&ipdef->hosts[0].ip)) { + PRUnichar *ipAddressUtf16 = NULL; + PRUnichar *networkMaskUtf16 = NULL; + + ipAddressUtf16 = vboxSocketFormatAddrUtf16(data, &ipdef->hosts[0].ip); + networkMaskUtf16 = vboxSocketFormatAddrUtf16(data, &netmask); + + if (ipAddressUtf16 == NULL || networkMaskUtf16 == NULL) { + VBOX_UTF16_FREE(ipAddressUtf16); + VBOX_UTF16_FREE(networkMaskUtf16); + goto cleanup; + } + + /* 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 + */ + gVBoxAPI.UIHNInterface.EnableStaticIPConfig(networkInterface, + ipAddressUtf16, + networkMaskUtf16); + + VBOX_UTF16_FREE(ipAddressUtf16); + VBOX_UTF16_FREE(networkMaskUtf16); + } else { + gVBoxAPI.UIHNInterface.EnableDynamicIPConfig(networkInterface); + gVBoxAPI.UIHNInterface.DHCPRediscover(networkInterface); + } + + rc = gVBoxAPI.UIHNInterface.GetId(networkInterface, &vboxnetiid); + if (NS_FAILED(rc)) + goto cleanup; + vboxIIDToUUID(&vboxnetiid, uuid); + DEBUGIID("Real Network UUID", &vboxnetiid); + vboxIIDUnalloc(&vboxnetiid); + ret = virGetNetwork(conn, networkInterfaceNameUtf8, uuid); + + cleanup: + VIR_FREE(networkNameUtf8); + VBOX_UTF16_FREE(networkNameUtf16); + VBOX_RELEASE(networkInterface); + VBOX_UTF8_FREE(networkInterfaceNameUtf8); + VBOX_UTF16_FREE(networkInterfaceNameUtf16); + VBOX_RELEASE(host); + virNetworkDefFree(def); + return ret; +} + +virNetworkPtr vboxNetworkCreateXML(virConnectPtr conn, const char *xml) +{ + return vboxNetworkDefineCreateXML(conn, xml, true); +} + +virNetworkPtr vboxNetworkDefineXML(virConnectPtr conn, const char *xml) +{ + return vboxNetworkDefineCreateXML(conn, xml, false); +} diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index fa55325..6733021 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -838,24 +838,6 @@ static PRUnichar *PRUnicharFromInt(int n) { #endif /* VBOX_API_VERSION >= 3001000 */ -static PRUnichar * -vboxSocketFormatAddrUtf16(vboxGlobalData *data, virSocketAddrPtr addr) -{ - char *utf8 = NULL; - PRUnichar *utf16 = NULL; - - utf8 = virSocketAddrFormat(addr); - - if (utf8 == NULL) { - return NULL; - } - - VBOX_UTF8_TO_UTF16(utf8, &utf16); - VIR_FREE(utf8); - - return utf16; -} - static int vboxSocketParseAddrUtf16(vboxGlobalData *data, const PRUnichar *utf16, virSocketAddrPtr addr) @@ -2060,224 +2042,6 @@ _registerDomainEvent(virDriverPtr driver) * The Network Functions here on */ -static virNetworkPtr -vboxNetworkDefineCreateXML(virConnectPtr conn, const char *xml, bool start) -{ - VBOX_OBJECT_HOST_CHECK(conn, virNetworkPtr, NULL); - PRUnichar *networkInterfaceNameUtf16 = NULL; - char *networkInterfaceNameUtf8 = NULL; - IHostNetworkInterface *networkInterface = NULL; - nsresult rc; - - virNetworkDefPtr def = virNetworkDefParseString(xml); - virNetworkIpDefPtr ipdef; - virSocketAddr netmask; - - if ((!def) || - (def->forward.type != VIR_NETWORK_FORWARD_NONE) || - (def->nips == 0 || !def->ips)) - goto cleanup; - - /* Look for the first IPv4 IP address definition and use that. - * If there weren't any IPv4 addresses, ignore the network (since it's - * required below to have an IPv4 address) - */ - ipdef = virNetworkDefGetIpByIndex(def, AF_INET, 0); - if (!ipdef) - goto cleanup; - - if (virNetworkIpDefNetmask(ipdef, &netmask) < 0) - goto cleanup; - - /* 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 ignored here for now. - */ - -#if VBOX_API_VERSION == 2002000 - if (STREQ(def->name, "vboxnet0")) { - PRUint32 interfaceType = 0; - - VBOX_UTF8_TO_UTF16(def->name, &networkInterfaceNameUtf16); - host->vtbl->FindHostNetworkInterfaceByName(host, networkInterfaceNameUtf16, &networkInterface); - - networkInterface->vtbl->GetInterfaceType(networkInterface, &interfaceType); - if (interfaceType != HostNetworkInterfaceType_HostOnly) { - VBOX_RELEASE(networkInterface); - networkInterface = NULL; - } - } -#else /* VBOX_API_VERSION != 2002000 */ - { - IProgress *progress = NULL; - host->vtbl->CreateHostOnlyNetworkInterface(host, &networkInterface, - &progress); - - if (progress) { - progress->vtbl->WaitForCompletion(progress, -1); - VBOX_RELEASE(progress); - } - } -#endif /* VBOX_API_VERSION != 2002000 */ - - if (networkInterface) { - unsigned char uuid[VIR_UUID_BUFLEN]; - char *networkNameUtf8 = NULL; - PRUnichar *networkNameUtf16 = NULL; - vboxIID vboxnetiid = VBOX_IID_INITIALIZER; - - networkInterface->vtbl->GetName(networkInterface, &networkInterfaceNameUtf16); - if (networkInterfaceNameUtf16) { - VBOX_UTF16_TO_UTF8(networkInterfaceNameUtf16, &networkInterfaceNameUtf8); - - if (virAsprintf(&networkNameUtf8, "HostInterfaceNetworking-%s", networkInterfaceNameUtf8) < 0) { - VBOX_RELEASE(host); - VBOX_RELEASE(networkInterface); - goto cleanup; - } - } - - VBOX_UTF8_TO_UTF16(networkNameUtf8, &networkNameUtf16); - - /* Currently support only one dhcp server per network - * with contigious address space from start to end - */ - if ((ipdef->nranges >= 1) && - VIR_SOCKET_ADDR_VALID(&ipdef->ranges[0].start) && - VIR_SOCKET_ADDR_VALID(&ipdef->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); - VIR_DEBUG("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; - - ipAddressUtf16 = vboxSocketFormatAddrUtf16(data, &ipdef->address); - networkMaskUtf16 = vboxSocketFormatAddrUtf16(data, &netmask); - fromIPAddressUtf16 = vboxSocketFormatAddrUtf16(data, &ipdef->ranges[0].start); - toIPAddressUtf16 = vboxSocketFormatAddrUtf16(data, &ipdef->ranges[0].end); - - if (ipAddressUtf16 == NULL || networkMaskUtf16 == NULL || - fromIPAddressUtf16 == NULL || toIPAddressUtf16 == NULL) { - VBOX_UTF16_FREE(ipAddressUtf16); - VBOX_UTF16_FREE(networkMaskUtf16); - VBOX_UTF16_FREE(fromIPAddressUtf16); - VBOX_UTF16_FREE(toIPAddressUtf16); - VBOX_RELEASE(dhcpServer); - goto cleanup; - } - - VBOX_UTF8_TO_UTF16("netflt", &trunkTypeUtf16); - - dhcpServer->vtbl->SetEnabled(dhcpServer, PR_TRUE); - - dhcpServer->vtbl->SetConfiguration(dhcpServer, - ipAddressUtf16, - networkMaskUtf16, - fromIPAddressUtf16, - toIPAddressUtf16); - - if (start) - dhcpServer->vtbl->Start(dhcpServer, - networkNameUtf16, - networkInterfaceNameUtf16, - trunkTypeUtf16); - - VBOX_UTF16_FREE(ipAddressUtf16); - VBOX_UTF16_FREE(networkMaskUtf16); - VBOX_UTF16_FREE(fromIPAddressUtf16); - VBOX_UTF16_FREE(toIPAddressUtf16); - VBOX_UTF16_FREE(trunkTypeUtf16); - VBOX_RELEASE(dhcpServer); - } - } - - if ((ipdef->nhosts >= 1) && - VIR_SOCKET_ADDR_VALID(&ipdef->hosts[0].ip)) { - PRUnichar *ipAddressUtf16 = NULL; - PRUnichar *networkMaskUtf16 = NULL; - - ipAddressUtf16 = vboxSocketFormatAddrUtf16(data, &ipdef->hosts[0].ip); - networkMaskUtf16 = vboxSocketFormatAddrUtf16(data, &netmask); - - if (ipAddressUtf16 == NULL || networkMaskUtf16 == NULL) { - VBOX_UTF16_FREE(ipAddressUtf16); - VBOX_UTF16_FREE(networkMaskUtf16); - goto cleanup; - } - - /* 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 - */ -#if VBOX_API_VERSION < 4002000 - networkInterface->vtbl->EnableStaticIpConfig(networkInterface, - ipAddressUtf16, - networkMaskUtf16); -#else - networkInterface->vtbl->EnableStaticIPConfig(networkInterface, - ipAddressUtf16, - networkMaskUtf16); -#endif - - VBOX_UTF16_FREE(ipAddressUtf16); - VBOX_UTF16_FREE(networkMaskUtf16); - } else { -#if VBOX_API_VERSION < 4002000 - networkInterface->vtbl->EnableDynamicIpConfig(networkInterface); - networkInterface->vtbl->DhcpRediscover(networkInterface); -#else - networkInterface->vtbl->EnableDynamicIPConfig(networkInterface); - networkInterface->vtbl->DHCPRediscover(networkInterface); -#endif - } - - rc = networkInterface->vtbl->GetId(networkInterface, &vboxnetiid.value); - if (NS_SUCCEEDED(rc)) { - vboxIIDToUUID(&vboxnetiid, uuid); - DEBUGIID("Real Network UUID", vboxnetiid.value); - vboxIIDUnalloc(&vboxnetiid); - ret = virGetNetwork(conn, networkInterfaceNameUtf8, uuid); - } - - VIR_FREE(networkNameUtf8); - VBOX_UTF16_FREE(networkNameUtf16); - VBOX_RELEASE(networkInterface); - } - - VBOX_UTF8_FREE(networkInterfaceNameUtf8); - VBOX_UTF16_FREE(networkInterfaceNameUtf16); - VBOX_RELEASE(host); - - cleanup: - 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 vboxNetworkUndefineDestroy(virNetworkPtr network, bool removeinterface) { @@ -4446,6 +4210,18 @@ _virtualboxOpenMedium(IVirtualBox *vboxObj ATTRIBUTE_UNUSED, } static nsresult +_virtualboxFindDHCPServerByNetworkName(IVirtualBox *vboxObj, PRUnichar *name, IDHCPServer **server) +{ + return vboxObj->vtbl->FindDHCPServerByNetworkName(vboxObj, name, server); +} + +static nsresult +_virtualboxCreateDHCPServer(IVirtualBox *vboxObj, PRUnichar *name, IDHCPServer **server) +{ + return vboxObj->vtbl->CreateDHCPServer(vboxObj, name, server); +} + +static nsresult _machineAddStorageController(IMachine *machine, PRUnichar *name, PRUint32 connectionType, IStorageController **controller) @@ -5831,6 +5607,41 @@ _hostFindHostNetworkInterfaceByName(IHost *host, PRUnichar *name, } static nsresult +_hostCreateHostOnlyNetworkInterface(vboxGlobalData *data ATTRIBUTE_UNUSED, + IHost *host, char *name ATTRIBUTE_UNUSED, + IHostNetworkInterface **networkInterface) +{ + nsresult rc = -1; +#if VBOX_API_VERSION == 2002000 + if (STREQ(name, "vboxnet0")) { + PRUint32 interfaceType = 0; + PRUnichar *networkInterfaceNameUtf16 = NULL; + + VBOX_UTF8_TO_UTF16(name, &networkInterfaceNameUtf16); + host->vtbl->FindHostNetworkInterfaceByName(host, networkInterfaceNameUtf16, networkInterface); + + (*networkInterface)->vtbl->GetInterfaceType(*networkInterface, &interfaceType); + if (interfaceType != HostNetworkInterfaceType_HostOnly) { + VBOX_RELEASE(*networkInterface); + *networkInterface = NULL; + } else { + rc = 0; + } + } +#else /* VBOX_API_VERSION != 2002000 */ + IProgress *progress = NULL; + host->vtbl->CreateHostOnlyNetworkInterface(host, networkInterface, + &progress); + + if (progress) { + rc = progress->vtbl->WaitForCompletion(progress, -1); + VBOX_RELEASE(progress); + } +#endif /* VBOX_API_VERSION != 2002000 */ + return rc; +} + +static nsresult _hnInterfaceGetInterfaceType(IHostNetworkInterface *hni, PRUint32 *interfaceType) { return hni->vtbl->GetInterfaceType(hni, interfaceType); @@ -5854,6 +5665,61 @@ _hnInterfaceGetId(IHostNetworkInterface *hni, vboxIIDUnion *iidu) return hni->vtbl->GetId(hni, &IID_MEMBER(value)); } +static nsresult +_hnInterfaceEnableStaticIPConfig(IHostNetworkInterface *hni, PRUnichar *IPAddress, + PRUnichar *networkMask) +{ +#if VBOX_API_VERSION < 4002000 + return hni->vtbl->EnableStaticIpConfig(hni, IPAddress, networkMask); +#else + return hni->vtbl->EnableStaticIPConfig(hni, IPAddress, networkMask); +#endif +} + +static nsresult +_hnInterfaceEnableDynamicIPConfig(IHostNetworkInterface *hni) +{ +#if VBOX_API_VERSION < 4002000 + return hni->vtbl->EnableDynamicIpConfig(hni); +#else + return hni->vtbl->EnableDynamicIPConfig(hni); +#endif +} + +static nsresult +_hnInterfaceDHCPRediscover(IHostNetworkInterface *hni) +{ +#if VBOX_API_VERSION < 4002000 + return hni->vtbl->DhcpRediscover(hni); +#else + return hni->vtbl->DHCPRediscover(hni); +#endif +} + +static nsresult +_dhcpServerSetEnabled(IDHCPServer *dhcpServer, PRBool enabled) +{ + return dhcpServer->vtbl->SetEnabled(dhcpServer, enabled); +} + +static nsresult +_dhcpServerSetConfiguration(IDHCPServer *dhcpServer, PRUnichar *IPAddress, + PRUnichar *networkMask, PRUnichar *FromIPAddress, + PRUnichar *ToIPAddress) +{ + return dhcpServer->vtbl->SetConfiguration(dhcpServer, IPAddress, + networkMask, FromIPAddress, + ToIPAddress); +} + +static nsresult +_dhcpServerStart(IDHCPServer *dhcpServer, PRUnichar *networkName, + PRUnichar *trunkName, PRUnichar *trunkType) +{ + return dhcpServer->vtbl->Start(dhcpServer, networkName, + trunkName, trunkType); +} + static bool _machineStateOnline(PRUint32 state) { return ((state >= MachineState_FirstOnline) && @@ -5939,6 +5805,8 @@ static vboxUniformedIVirtualBox _UIVirtualBox = { .RegisterMachine = _virtualboxRegisterMachine, .FindMedium = _virtualboxFindMedium, .OpenMedium = _virtualboxOpenMedium, + .FindDHCPServerByNetworkName = _virtualboxFindDHCPServerByNetworkName, + .CreateDHCPServer = _virtualboxCreateDHCPServer, }; static vboxUniformedIMachine _UIMachine = { @@ -6160,6 +6028,7 @@ static vboxUniformedIDisplay _UIDisplay = { static vboxUniformedIHost _UIHost = { .FindHostNetworkInterfaceById = _hostFindHostNetworkInterfaceById, .FindHostNetworkInterfaceByName = _hostFindHostNetworkInterfaceByName, + .CreateHostOnlyNetworkInterface = _hostCreateHostOnlyNetworkInterface, }; static vboxUniformedIHNInterface _UIHNInterface = { @@ -6167,6 +6036,15 @@ static vboxUniformedIHNInterface _UIHNInterface = { .GetStatus = _hnInterfaceGetStatus, .GetName = _hnInterfaceGetName, .GetId = _hnInterfaceGetId, + .EnableStaticIPConfig = _hnInterfaceEnableStaticIPConfig, + .EnableDynamicIPConfig = _hnInterfaceEnableDynamicIPConfig, + .DHCPRediscover = _hnInterfaceDHCPRediscover, +}; + +static vboxUniformedIDHCPServer _UIDHCPServer = { + .SetEnabled = _dhcpServerSetEnabled, + .SetConfiguration = _dhcpServerSetConfiguration, + .Start = _dhcpServerStart, }; static uniformedMachineStateChecker _machineStateChecker = { @@ -6224,6 +6102,7 @@ void NAME(InstallUniformedAPI)(vboxUniformedAPI *pVBoxAPI) pVBoxAPI->UIDisplay = _UIDisplay; pVBoxAPI->UIHost = _UIHost; pVBoxAPI->UIHNInterface = _UIHNInterface; + pVBoxAPI->UIDHCPServer = _UIDHCPServer; pVBoxAPI->machineStateChecker = _machineStateChecker; #if VBOX_API_VERSION <= 2002000 || VBOX_API_VERSION >= 4000000 diff --git a/src/vbox/vbox_uniformed_api.h b/src/vbox/vbox_uniformed_api.h index a14ee1c..83c3834 100644 --- a/src/vbox/vbox_uniformed_api.h +++ b/src/vbox/vbox_uniformed_api.h @@ -197,6 +197,8 @@ typedef struct { nsresult (*RegisterMachine)(IVirtualBox *vboxObj, IMachine *machine); nsresult (*FindMedium)(IVirtualBox *vboxObj, PRUnichar *location, PRUint32 deviceType, PRUint32 accessMode, IMedium **medium); nsresult (*OpenMedium)(IVirtualBox *vboxObj, PRUnichar *location, PRUint32 deviceType, PRUint32 accessMode, IMedium **medium); + nsresult (*FindDHCPServerByNetworkName)(IVirtualBox *vboxObj, PRUnichar *name, IDHCPServer **server); + nsresult (*CreateDHCPServer)(IVirtualBox *vboxObj, PRUnichar *name, IDHCPServer **server); } vboxUniformedIVirtualBox; /* Functions for IMachine */ @@ -472,6 +474,9 @@ typedef struct { IHostNetworkInterface **networkInterface); nsresult (*FindHostNetworkInterfaceByName)(IHost *host, PRUnichar *name, IHostNetworkInterface **networkInterface); + nsresult (*CreateHostOnlyNetworkInterface)(vboxGlobalData *data, + IHost *host, char *name, + IHostNetworkInterface **networkInterface); } vboxUniformedIHost; /* Functions for IHostNetworkInterface */ @@ -480,8 +485,22 @@ typedef struct { nsresult (*GetStatus)(IHostNetworkInterface *hni, PRUint32 *status); nsresult (*GetName)(IHostNetworkInterface *hni, PRUnichar **name); nsresult (*GetId)(IHostNetworkInterface *hni, vboxIIDUnion *iidu); + nsresult (*EnableStaticIPConfig)(IHostNetworkInterface *hni, PRUnichar *IPAddress, + PRUnichar *networkMask); + nsresult (*EnableDynamicIPConfig)(IHostNetworkInterface *hni); + nsresult (*DHCPRediscover)(IHostNetworkInterface *hni); } vboxUniformedIHNInterface; +/* Functions for IDHCPServer */ +typedef struct { + nsresult (*SetEnabled)(IDHCPServer *dhcpServer, PRBool enabled); + nsresult (*SetConfiguration)(IDHCPServer *dhcpServer, PRUnichar *IPAddress, + PRUnichar *networkMask, PRUnichar *FromIPAddress, + PRUnichar *ToIPAddress); + nsresult (*Start)(IDHCPServer *dhcpServer, PRUnichar *networkName, + PRUnichar *trunkName, PRUnichar *trunkType); +} vboxUniformedIDHCPServer; + typedef struct { bool (*Online)(PRUint32 state); bool (*Inactive)(PRUint32 state); @@ -538,6 +557,7 @@ typedef struct { vboxUniformedIDisplay UIDisplay; vboxUniformedIHost UIHost; vboxUniformedIHNInterface UIHNInterface; + vboxUniformedIDHCPServer UIDHCPServer; uniformedMachineStateChecker machineStateChecker; /* vbox API features */ bool domainEventCallbacks; @@ -564,6 +584,8 @@ int vboxConnectNumOfDefinedNetworks(virConnectPtr conn); int vboxConnectListDefinedNetworks(virConnectPtr conn, char **const names, int nnames); virNetworkPtr vboxNetworkLookupByUUID(virConnectPtr conn, const unsigned char *uuid); virNetworkPtr vboxNetworkLookupByName(virConnectPtr conn, const char *name); +virNetworkPtr vboxNetworkCreateXML(virConnectPtr conn, const char *xml); +virNetworkPtr vboxNetworkDefineXML(virConnectPtr conn, const char *xml); /* Version specified functions for installing uniformed API */ void vbox22InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI); -- 1.7.9.5

This patch rewrites two public APIs. They are vboxNetworkUndefine and vboxNetworkDestroy. They use the same core function vboxNetworkUndefineDestroy. I merged it in one patch. --- src/vbox/vbox_network.c | 109 +++++++++++++++++++++++++++++++++ src/vbox/vbox_tmpl.c | 136 ++++++++++++----------------------------- src/vbox/vbox_uniformed_api.h | 7 +++ 3 files changed, 156 insertions(+), 96 deletions(-) diff --git a/src/vbox/vbox_network.c b/src/vbox/vbox_network.c index feecf0c..60fbe5e 100644 --- a/src/vbox/vbox_network.c +++ b/src/vbox/vbox_network.c @@ -34,6 +34,9 @@ VIR_LOG_INIT("vbox.vbox_network"); +#define RC_SUCCEEDED(rc) NS_SUCCEEDED(rc.resultCode) +#define RC_FAILED(rc) NS_FAILED(rc.resultCode) + #define VBOX_UTF16_FREE(arg) \ do { \ if (arg) { \ @@ -625,3 +628,109 @@ virNetworkPtr vboxNetworkDefineXML(virConnectPtr conn, const char *xml) { return vboxNetworkDefineCreateXML(conn, xml, false); } + +static int +vboxNetworkUndefineDestroy(virNetworkPtr network, bool removeinterface) +{ + vboxGlobalData *data = network->conn->privateData; + char *networkNameUtf8 = NULL; + PRUnichar *networkInterfaceNameUtf16 = NULL; + IHostNetworkInterface *networkInterface = NULL; + PRUnichar *networkNameUtf16 = NULL; + IDHCPServer *dhcpServer = 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 you can't delete the default hostonly adaptor namely: + * vboxnet0 and thus all this functions does is remove the + * dhcp server configuration, but the network can still be used + * by giving the machine static IP and also it will still + * show up in the net-list in virsh + */ + + 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 (gVBoxAPI.networkRemoveInterface && removeinterface) { + vboxIIDUnion iid; + IProgress *progress = NULL; + nsresult rc; + resultCodeUnion resultCode; + + VBOX_IID_INITIALIZE(&iid); + rc = gVBoxAPI.UIHNInterface.GetId(networkInterface, &iid); + + if (NS_FAILED(rc)) + goto cleanup; + + gVBoxAPI.UIHost.RemoveHostOnlyNetworkInterface(host, &iid, &progress); + vboxIIDUnalloc(&iid); + + if (!progress) + goto cleanup; + + gVBoxAPI.UIProgress.WaitForCompletion(progress, -1); + gVBoxAPI.UIProgress.GetResultCode(progress, &resultCode); + if (RC_FAILED(resultCode)) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Error while removing hostonly network interface, rc=%08x"), + resultCode.uResultCode); + goto cleanup; + } + VBOX_RELEASE(progress); + } + + VBOX_UTF8_TO_UTF16(networkNameUtf8, &networkNameUtf16); + + gVBoxAPI.UIVirtualBox.FindDHCPServerByNetworkName(data->vboxObj, + networkNameUtf16, + &dhcpServer); + if (!dhcpServer) + goto cleanup; + + gVBoxAPI.UIDHCPServer.SetEnabled(dhcpServer, PR_FALSE); + gVBoxAPI.UIDHCPServer.Stop(dhcpServer); + if (removeinterface) + gVBoxAPI.UIVirtualBox.RemoveDHCPServer(data->vboxObj, dhcpServer); + ret = 0; + VBOX_RELEASE(dhcpServer); + + cleanup: + VBOX_UTF16_FREE(networkNameUtf16); + VBOX_RELEASE(networkInterface); + VBOX_UTF16_FREE(networkInterfaceNameUtf16); + VBOX_RELEASE(host); + VIR_FREE(networkNameUtf8); + return ret; +} + +int vboxNetworkUndefine(virNetworkPtr network) +{ + return vboxNetworkUndefineDestroy(network, true); +} + +int vboxNetworkDestroy(virNetworkPtr network) +{ + return vboxNetworkUndefineDestroy(network, false); +} diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index 6733021..c072246 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -2042,97 +2042,6 @@ _registerDomainEvent(virDriverPtr driver) * The Network Functions here on */ -static int -vboxNetworkUndefineDestroy(virNetworkPtr network, bool removeinterface) -{ - 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 you can't delete the default hostonly adaptor namely: - * vboxnet0 and thus all this functions does is remove the - * dhcp server configuration, but the network can still be used - * by giving the machine static IP and also it will still - * show up in the net-list in virsh - */ - - 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; - -#if VBOX_API_VERSION != 2002000 - if (removeinterface) { - PRUnichar *iidUtf16 = NULL; - IProgress *progress = NULL; - - networkInterface->vtbl->GetId(networkInterface, &iidUtf16); - - if (iidUtf16) { -# if VBOX_API_VERSION == 3000000 - IHostNetworkInterface *netInt = NULL; - host->vtbl->RemoveHostOnlyNetworkInterface(host, iidUtf16, &netInt, &progress); - VBOX_RELEASE(netInt); -# else /* VBOX_API_VERSION > 3000000 */ - host->vtbl->RemoveHostOnlyNetworkInterface(host, iidUtf16, &progress); -# endif /* VBOX_API_VERSION > 3000000 */ - VBOX_UTF16_FREE(iidUtf16); - } - - if (progress) { - progress->vtbl->WaitForCompletion(progress, -1); - VBOX_RELEASE(progress); - } - } -#endif /* VBOX_API_VERSION != 2002000 */ - - VBOX_UTF8_TO_UTF16(networkNameUtf8, &networkNameUtf16); - - data->vboxObj->vtbl->FindDHCPServerByNetworkName(data->vboxObj, - networkNameUtf16, - &dhcpServer); - if (dhcpServer) { - dhcpServer->vtbl->SetEnabled(dhcpServer, PR_FALSE); - dhcpServer->vtbl->Stop(dhcpServer); - if (removeinterface) - data->vboxObj->vtbl->RemoveDHCPServer(data->vboxObj, dhcpServer); - 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 int vboxNetworkUndefine(virNetworkPtr network) -{ - return vboxNetworkUndefineDestroy(network, true); -} - static int vboxNetworkCreate(virNetworkPtr network) { VBOX_OBJECT_HOST_CHECK(network->conn, int, -1); @@ -2201,11 +2110,6 @@ static int vboxNetworkCreate(virNetworkPtr network) return ret; } -static int vboxNetworkDestroy(virNetworkPtr network) -{ - return vboxNetworkUndefineDestroy(network, false); -} - static char *vboxNetworkGetXMLDesc(virNetworkPtr network, unsigned int flags) { @@ -4222,6 +4126,12 @@ _virtualboxCreateDHCPServer(IVirtualBox *vboxObj, PRUnichar *name, IDHCPServer * } static nsresult +_virtualboxRemoveDHCPServer(IVirtualBox *vboxObj, IDHCPServer *server) +{ + return vboxObj->vtbl->RemoveDHCPServer(vboxObj, server); +} + +static nsresult _machineAddStorageController(IMachine *machine, PRUnichar *name, PRUint32 connectionType, IStorageController **controller) @@ -5642,6 +5552,25 @@ _hostCreateHostOnlyNetworkInterface(vboxGlobalData *data ATTRIBUTE_UNUSED, } static nsresult +_hostRemoveHostOnlyNetworkInterface(IHost *host ATTRIBUTE_UNUSED, + vboxIIDUnion *iidu ATTRIBUTE_UNUSED, + IProgress **progress ATTRIBUTE_UNUSED) +{ +#if VBOX_API_VERSION == 2002000 + vboxUnsupported(); + return 0; +#elif VBOX_API_VERSION == 3000000 + nsresult rc; + IHostNetworkInterface *netInt = NULL; + rc = host->vtbl->RemoveHostOnlyNetworkInterface(host, IID_MEMBER(value), &netInt, progress); + VBOX_RELEASE(netInt); + return rc; +#else /* VBOX_API_VERSION > 3000000 */ + return host->vtbl->RemoveHostOnlyNetworkInterface(host, IID_MEMBER(value), progress); +#endif /* VBOX_API_VERSION > 3000000 */ +} + +static nsresult _hnInterfaceGetInterfaceType(IHostNetworkInterface *hni, PRUint32 *interfaceType) { return hni->vtbl->GetInterfaceType(hni, interfaceType); @@ -5720,6 +5649,12 @@ _dhcpServerStart(IDHCPServer *dhcpServer, PRUnichar *networkName, trunkName, trunkType); } +static nsresult +_dhcpServerStop(IDHCPServer *dhcpServer) +{ + return dhcpServer->vtbl->Stop(dhcpServer); +} + static bool _machineStateOnline(PRUint32 state) { return ((state >= MachineState_FirstOnline) && @@ -5807,6 +5742,7 @@ static vboxUniformedIVirtualBox _UIVirtualBox = { .OpenMedium = _virtualboxOpenMedium, .FindDHCPServerByNetworkName = _virtualboxFindDHCPServerByNetworkName, .CreateDHCPServer = _virtualboxCreateDHCPServer, + .RemoveDHCPServer = _virtualboxRemoveDHCPServer, }; static vboxUniformedIMachine _UIMachine = { @@ -6029,6 +5965,7 @@ static vboxUniformedIHost _UIHost = { .FindHostNetworkInterfaceById = _hostFindHostNetworkInterfaceById, .FindHostNetworkInterfaceByName = _hostFindHostNetworkInterfaceByName, .CreateHostOnlyNetworkInterface = _hostCreateHostOnlyNetworkInterface, + .RemoveHostOnlyNetworkInterface = _hostRemoveHostOnlyNetworkInterface, }; static vboxUniformedIHNInterface _UIHNInterface = { @@ -6045,6 +5982,7 @@ static vboxUniformedIDHCPServer _UIDHCPServer = { .SetEnabled = _dhcpServerSetEnabled, .SetConfiguration = _dhcpServerSetConfiguration, .Start = _dhcpServerStart, + .Stop = _dhcpServerStop, }; static uniformedMachineStateChecker _machineStateChecker = { @@ -6149,6 +6087,12 @@ void NAME(InstallUniformedAPI)(vboxUniformedAPI *pVBoxAPI) #else /* VBOX_API_VERSION < 4002000 */ pVBoxAPI->vboxSnapshotRedefine = 0; #endif /* VBOX_API_VERSION < 4002000 */ + +#if VBOX_API_VERSION == 2002000 + pVBoxAPI->networkRemoveInterface = 0; +#else /* VBOX_API_VERSION > 2002000 */ + pVBoxAPI->networkRemoveInterface = 1; +#endif /* VBOX_API_VERSION > 2002000 */ } /** diff --git a/src/vbox/vbox_uniformed_api.h b/src/vbox/vbox_uniformed_api.h index 83c3834..8f713af 100644 --- a/src/vbox/vbox_uniformed_api.h +++ b/src/vbox/vbox_uniformed_api.h @@ -199,6 +199,7 @@ typedef struct { nsresult (*OpenMedium)(IVirtualBox *vboxObj, PRUnichar *location, PRUint32 deviceType, PRUint32 accessMode, IMedium **medium); nsresult (*FindDHCPServerByNetworkName)(IVirtualBox *vboxObj, PRUnichar *name, IDHCPServer **server); nsresult (*CreateDHCPServer)(IVirtualBox *vboxObj, PRUnichar *name, IDHCPServer **server); + nsresult (*RemoveDHCPServer)(IVirtualBox *vboxObj, IDHCPServer *server); } vboxUniformedIVirtualBox; /* Functions for IMachine */ @@ -477,6 +478,8 @@ typedef struct { nsresult (*CreateHostOnlyNetworkInterface)(vboxGlobalData *data, IHost *host, char *name, IHostNetworkInterface **networkInterface); + nsresult (*RemoveHostOnlyNetworkInterface)(IHost *host, vboxIIDUnion *iidu, + IProgress **progress); } vboxUniformedIHost; /* Functions for IHostNetworkInterface */ @@ -499,6 +502,7 @@ typedef struct { PRUnichar *ToIPAddress); nsresult (*Start)(IDHCPServer *dhcpServer, PRUnichar *networkName, PRUnichar *trunkName, PRUnichar *trunkType); + nsresult (*Stop)(IDHCPServer *dhcpServer); } vboxUniformedIDHCPServer; typedef struct { @@ -570,6 +574,7 @@ typedef struct { bool oldMediumInterface; bool vboxSnapshotRedefine; bool supportScreenshot; + bool networkRemoveInterface; } vboxUniformedAPI; virDomainPtr vboxDomainLookupByUUID(virConnectPtr conn, @@ -586,6 +591,8 @@ virNetworkPtr vboxNetworkLookupByUUID(virConnectPtr conn, const unsigned char *u virNetworkPtr vboxNetworkLookupByName(virConnectPtr conn, const char *name); virNetworkPtr vboxNetworkCreateXML(virConnectPtr conn, const char *xml); virNetworkPtr vboxNetworkDefineXML(virConnectPtr conn, const char *xml); +int vboxNetworkUndefine(virNetworkPtr network); +int vboxNetworkDestroy(virNetworkPtr network); /* Version specified functions for installing uniformed API */ void vbox22InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI); -- 1.7.9.5

On 02.10.2014 05:30, Taowei wrote:
This patch rewrites two public APIs. They are vboxNetworkUndefine and vboxNetworkDestroy. They use the same core function vboxNetworkUndefineDestroy. I merged it in one patch.
Cool!
--- src/vbox/vbox_network.c | 109 +++++++++++++++++++++++++++++++++ src/vbox/vbox_tmpl.c | 136 ++++++++++++----------------------------- src/vbox/vbox_uniformed_api.h | 7 +++ 3 files changed, 156 insertions(+), 96 deletions(-)
diff --git a/src/vbox/vbox_network.c b/src/vbox/vbox_network.c index feecf0c..60fbe5e 100644 --- a/src/vbox/vbox_network.c +++ b/src/vbox/vbox_network.c @@ -34,6 +34,9 @@
VIR_LOG_INIT("vbox.vbox_network");
+#define RC_SUCCEEDED(rc) NS_SUCCEEDED(rc.resultCode) +#define RC_FAILED(rc) NS_FAILED(rc.resultCode) + #define VBOX_UTF16_FREE(arg) \ do { \ if (arg) { \ @@ -625,3 +628,109 @@ virNetworkPtr vboxNetworkDefineXML(virConnectPtr conn, const char *xml) { return vboxNetworkDefineCreateXML(conn, xml, false); } + +static int +vboxNetworkUndefineDestroy(virNetworkPtr network, bool removeinterface) +{ + vboxGlobalData *data = network->conn->privateData; + char *networkNameUtf8 = NULL; + PRUnichar *networkInterfaceNameUtf16 = NULL; + IHostNetworkInterface *networkInterface = NULL; + PRUnichar *networkNameUtf16 = NULL; + IDHCPServer *dhcpServer = 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 you can't delete the default hostonly adaptor namely: + * vboxnet0 and thus all this functions does is remove the + * dhcp server configuration, but the network can still be used + * by giving the machine static IP and also it will still + * show up in the net-list in virsh + */ + + 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 (gVBoxAPI.networkRemoveInterface && removeinterface) { + vboxIIDUnion iid; + IProgress *progress = NULL; + nsresult rc; + resultCodeUnion resultCode; + + VBOX_IID_INITIALIZE(&iid); + rc = gVBoxAPI.UIHNInterface.GetId(networkInterface, &iid); + + if (NS_FAILED(rc)) + goto cleanup; + + gVBoxAPI.UIHost.RemoveHostOnlyNetworkInterface(host, &iid, &progress); + vboxIIDUnalloc(&iid); + + if (!progress) + goto cleanup; + + gVBoxAPI.UIProgress.WaitForCompletion(progress, -1); + gVBoxAPI.UIProgress.GetResultCode(progress, &resultCode); + if (RC_FAILED(resultCode)) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Error while removing hostonly network interface, rc=%08x"),
And this is actually the reason why po/POTFILES.in change needs to be moved into this patch.
+ resultCode.uResultCode); + goto cleanup; + } + VBOX_RELEASE(progress); + } + + VBOX_UTF8_TO_UTF16(networkNameUtf8, &networkNameUtf16); + + gVBoxAPI.UIVirtualBox.FindDHCPServerByNetworkName(data->vboxObj, + networkNameUtf16, + &dhcpServer); + if (!dhcpServer) + goto cleanup; + + gVBoxAPI.UIDHCPServer.SetEnabled(dhcpServer, PR_FALSE); + gVBoxAPI.UIDHCPServer.Stop(dhcpServer); + if (removeinterface) + gVBoxAPI.UIVirtualBox.RemoveDHCPServer(data->vboxObj, dhcpServer); + ret = 0; + VBOX_RELEASE(dhcpServer); + + cleanup: + VBOX_UTF16_FREE(networkNameUtf16); + VBOX_RELEASE(networkInterface); + VBOX_UTF16_FREE(networkInterfaceNameUtf16); + VBOX_RELEASE(host); + VIR_FREE(networkNameUtf8); + return ret; +} + +int vboxNetworkUndefine(virNetworkPtr network) +{ + return vboxNetworkUndefineDestroy(network, true); +} + +int vboxNetworkDestroy(virNetworkPtr network) +{ + return vboxNetworkUndefineDestroy(network, false); +}
Michal

--- src/vbox/vbox_network.c | 72 +++++++++++++++++++++++++++++++++++++++++ src/vbox/vbox_tmpl.c | 68 -------------------------------------- src/vbox/vbox_uniformed_api.h | 1 + 3 files changed, 73 insertions(+), 68 deletions(-) diff --git a/src/vbox/vbox_network.c b/src/vbox/vbox_network.c index 60fbe5e..2fc8230 100644 --- a/src/vbox/vbox_network.c +++ b/src/vbox/vbox_network.c @@ -734,3 +734,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 c072246..8712a3b 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 8f713af..f0b98c0 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); -- 1.7.9.5

--- src/vbox/vbox_network.c | 191 +++++++++++++++++++++++++++++++++ src/vbox/vbox_tmpl.c | 235 +++++++++-------------------------------- src/vbox/vbox_uniformed_api.h | 8 ++ 3 files changed, 248 insertions(+), 186 deletions(-) diff --git a/src/vbox/vbox_network.c b/src/vbox/vbox_network.c index 2fc8230..b4453a6 100644 --- a/src/vbox/vbox_network.c +++ b/src/vbox/vbox_network.c @@ -806,3 +806,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 8712a3b..9231fab 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) { @@ -2039,171 +2018,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 */ @@ -5527,6 +5341,24 @@ _hnInterfaceGetId(IHostNetworkInterface *hni, vboxIIDUnion *iidu) } 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) { @@ -5558,6 +5390,30 @@ _hnInterfaceDHCPRediscover(IHostNetworkInterface *hni) } 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) { return dhcpServer->vtbl->SetEnabled(dhcpServer, 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 f0b98c0..da754e8 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); -- 1.7.9.5

This patch seperate the domain driver and the network driver. libvirt_driver_vbox_impl.la has been linked in the network driver. So that the version specified codes in vbox_V*.c would only be compiled once. The vboxGetNetworkDriver provides a simple interface to get vbox network driver. --- src/Makefile.am | 11 ++++-- src/vbox/vbox_driver.c | 9 +++-- src/vbox/vbox_get_driver.h | 1 + src/vbox/vbox_network.c | 83 +++++++++++++++++++++++++++++++++-------- src/vbox/vbox_tmpl.c | 18 --------- src/vbox/vbox_uniformed_api.h | 16 -------- 6 files changed, 82 insertions(+), 56 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index 34eb9f8..5e8cd4a 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -519,6 +519,7 @@ DRIVER_SOURCE_FILES = \ $(TEST_DRIVER_SOURCES) \ $(UML_DRIVER_SOURCES) \ $(VBOX_DRIVER_SOURCES) \ + $(VBOX_NETWORK_DRIVER_SOURCES) \ vbox/vbox_tmpl.c \ $(VMWARE_DRIVER_SOURCES) \ $(XEN_DRIVER_SOURCES) \ @@ -678,10 +679,13 @@ VBOX_DRIVER_SOURCES = \ vbox/vbox_V4_3.c vbox/vbox_CAPI_v4_3.h \ vbox/vbox_V4_3_4.c vbox/vbox_CAPI_v4_3_4.h \ vbox/vbox_common.c vbox/vbox_common.h \ - vbox/vbox_network.c \ vbox/vbox_uniformed_api.h \ vbox/vbox_get_driver.h +VBOX_NETWORK_DRIVER_SOURCES = \ + vbox/vbox_driver.c vbox/vbox_driver.h \ + vbox/vbox_network.c vbox/vbox_get_driver.h + VBOX_DRIVER_EXTRA_DIST = \ vbox/vbox_tmpl.c vbox/README \ vbox/vbox_MSCOMGlue.c vbox/vbox_MSCOMGlue.h \ @@ -1186,8 +1190,9 @@ libvirt_driver_vbox_network_impl_la_CFLAGS = \ libvirt_driver_vbox_network_impl_la_LDFLAGS = $(AM_LDFLAGS) libvirt_driver_vbox_network_impl_la_LIBADD = $(DLOPEN_LIBS) \ $(MSCOM_LIBS) \ - $(LIBXML_LIBS) -libvirt_driver_vbox_network_impl_la_SOURCES = $(VBOX_DRIVER_SOURCES) + $(LIBXML_LIBS) \ + libvirt_driver_vbox_impl.la +libvirt_driver_vbox_network_impl_la_SOURCES = $(VBOX_NETWORK_DRIVER_SOURCES) libvirt_driver_vbox_storage_impl_la_CFLAGS = \ -I$(top_srcdir)/src/conf \ diff --git a/src/vbox/vbox_driver.c b/src/vbox/vbox_driver.c index 89d49be..7d7214a 100644 --- a/src/vbox/vbox_driver.c +++ b/src/vbox/vbox_driver.c @@ -71,7 +71,7 @@ extern virStorageDriver vbox43_4StorageDriver; #define VIR_FROM_THIS VIR_FROM_VBOX -#if !defined(WITH_DRIVER_MODULES) || defined(VBOX_NETWORK_DRIVER) || defined(VBOX_STORAGE_DRIVER) +#if !defined(WITH_DRIVER_MODULES) || defined(VBOX_STORAGE_DRIVER) static void vboxGetDrivers(virDriverPtr *driver_ret, virNetworkDriverPtr *networkDriver_ret, @@ -161,9 +161,12 @@ vboxGetDrivers(virDriverPtr *driver_ret, #if !defined(WITH_DRIVER_MODULES) || defined(VBOX_NETWORK_DRIVER) int vboxNetworkRegister(void) { - virNetworkDriverPtr networkDriver; + virNetworkDriverPtr networkDriver = NULL; + uint32_t uVersion; + + if (VBoxCGlueInit(&uVersion) == 0) + networkDriver = vboxGetNetworkDriver(uVersion); - vboxGetDrivers(NULL, &networkDriver, NULL); if (virRegisterNetworkDriver(networkDriver) < 0) return -1; return 0; diff --git a/src/vbox/vbox_get_driver.h b/src/vbox/vbox_get_driver.h index cfc8b93..a31f10c 100644 --- a/src/vbox/vbox_get_driver.h +++ b/src/vbox/vbox_get_driver.h @@ -22,5 +22,6 @@ # include "internal.h" virDriverPtr vboxGetDriver(uint32_t uVersion); +virNetworkDriverPtr vboxGetNetworkDriver(uint32_t uVersion); #endif /* VBOX_GET_DRIVER_H */ diff --git a/src/vbox/vbox_network.c b/src/vbox/vbox_network.c index b4453a6..35bf833 100644 --- a/src/vbox/vbox_network.c +++ b/src/vbox/vbox_network.c @@ -29,6 +29,7 @@ #include "vbox_common.h" #include "vbox_uniformed_api.h" +#include "vbox_get_driver.h" #define VIR_FROM_THIS VIR_FROM_VBOX @@ -83,9 +84,10 @@ static vboxUniformedAPI gVBoxAPI; * The Network Functions here on */ -virDrvOpenStatus vboxNetworkOpen(virConnectPtr conn, - virConnectAuthPtr auth ATTRIBUTE_UNUSED, - unsigned int flags) +static virDrvOpenStatus +vboxNetworkOpen(virConnectPtr conn, + virConnectAuthPtr auth ATTRIBUTE_UNUSED, + unsigned int flags) { vboxGlobalData *data = conn->privateData; @@ -105,14 +107,14 @@ virDrvOpenStatus vboxNetworkOpen(virConnectPtr conn, return VIR_DRV_OPEN_DECLINED; } -int vboxNetworkClose(virConnectPtr conn) +static int vboxNetworkClose(virConnectPtr conn) { VIR_DEBUG("network uninitialized"); conn->networkPrivateData = NULL; return 0; } -int vboxConnectNumOfNetworks(virConnectPtr conn) +static int vboxConnectNumOfNetworks(virConnectPtr conn) { vboxGlobalData *data = conn->privateData; vboxArray networkInterfaces = VBOX_ARRAY_INITIALIZER; @@ -157,7 +159,7 @@ int vboxConnectNumOfNetworks(virConnectPtr conn) return ret; } -int vboxConnectListNetworks(virConnectPtr conn, char **const names, int nnames) +static int vboxConnectListNetworks(virConnectPtr conn, char **const names, int nnames) { vboxGlobalData *data = conn->privateData; vboxArray networkInterfaces = VBOX_ARRAY_INITIALIZER; @@ -214,7 +216,7 @@ int vboxConnectListNetworks(virConnectPtr conn, char **const names, int nnames) return ret; } -int vboxConnectNumOfDefinedNetworks(virConnectPtr conn) +static int vboxConnectNumOfDefinedNetworks(virConnectPtr conn) { vboxGlobalData *data = conn->privateData; vboxArray networkInterfaces = VBOX_ARRAY_INITIALIZER; @@ -259,7 +261,7 @@ int vboxConnectNumOfDefinedNetworks(virConnectPtr conn) return ret; } -int vboxConnectListDefinedNetworks(virConnectPtr conn, char **const names, int nnames) +static int vboxConnectListDefinedNetworks(virConnectPtr conn, char **const names, int nnames) { vboxGlobalData *data = conn->privateData; vboxArray networkInterfaces = VBOX_ARRAY_INITIALIZER; @@ -316,7 +318,7 @@ int vboxConnectListDefinedNetworks(virConnectPtr conn, char **const names, int n return ret; } -virNetworkPtr vboxNetworkLookupByUUID(virConnectPtr conn, const unsigned char *uuid) +static virNetworkPtr vboxNetworkLookupByUUID(virConnectPtr conn, const unsigned char *uuid) { vboxGlobalData *data = conn->privateData; PRUint32 interfaceType = 0; @@ -368,7 +370,7 @@ virNetworkPtr vboxNetworkLookupByUUID(virConnectPtr conn, const unsigned char *u return ret; } -virNetworkPtr vboxNetworkLookupByName(virConnectPtr conn, const char *name) +static virNetworkPtr vboxNetworkLookupByName(virConnectPtr conn, const char *name) { vboxGlobalData *data = conn->privateData; PRUnichar *nameUtf16 = NULL; @@ -619,12 +621,12 @@ vboxNetworkDefineCreateXML(virConnectPtr conn, const char *xml, bool start) return ret; } -virNetworkPtr vboxNetworkCreateXML(virConnectPtr conn, const char *xml) +static virNetworkPtr vboxNetworkCreateXML(virConnectPtr conn, const char *xml) { return vboxNetworkDefineCreateXML(conn, xml, true); } -virNetworkPtr vboxNetworkDefineXML(virConnectPtr conn, const char *xml) +static virNetworkPtr vboxNetworkDefineXML(virConnectPtr conn, const char *xml) { return vboxNetworkDefineCreateXML(conn, xml, false); } @@ -725,17 +727,17 @@ vboxNetworkUndefineDestroy(virNetworkPtr network, bool removeinterface) return ret; } -int vboxNetworkUndefine(virNetworkPtr network) +static int vboxNetworkUndefine(virNetworkPtr network) { return vboxNetworkUndefineDestroy(network, true); } -int vboxNetworkDestroy(virNetworkPtr network) +static int vboxNetworkDestroy(virNetworkPtr network) { return vboxNetworkUndefineDestroy(network, false); } -int vboxNetworkCreate(virNetworkPtr network) +static int vboxNetworkCreate(virNetworkPtr network) { vboxGlobalData *data = network->conn->privateData; char *networkNameUtf8 = NULL; @@ -828,7 +830,7 @@ vboxSocketParseAddrUtf16(vboxGlobalData *data, const PRUnichar *utf16, return result; } -char *vboxNetworkGetXMLDesc(virNetworkPtr network, unsigned int flags) +static char *vboxNetworkGetXMLDesc(virNetworkPtr network, unsigned int flags) { vboxGlobalData *data = network->conn->privateData; virNetworkDefPtr def = NULL; @@ -997,3 +999,52 @@ char *vboxNetworkGetXMLDesc(virNetworkPtr network, unsigned int flags) VBOX_RELEASE(dhcpServer); return ret; } + +virNetworkDriver vboxNetworkDriver = { + "VBOX", + .networkOpen = vboxNetworkOpen, /* 0.6.4 */ + .networkClose = vboxNetworkClose, /* 0.6.4 */ + .connectNumOfNetworks = vboxConnectNumOfNetworks, /* 0.6.4 */ + .connectListNetworks = vboxConnectListNetworks, /* 0.6.4 */ + .connectNumOfDefinedNetworks = vboxConnectNumOfDefinedNetworks, /* 0.6.4 */ + .connectListDefinedNetworks = vboxConnectListDefinedNetworks, /* 0.6.4 */ + .networkLookupByUUID = vboxNetworkLookupByUUID, /* 0.6.4 */ + .networkLookupByName = vboxNetworkLookupByName, /* 0.6.4 */ + .networkCreateXML = vboxNetworkCreateXML, /* 0.6.4 */ + .networkDefineXML = vboxNetworkDefineXML, /* 0.6.4 */ + .networkUndefine = vboxNetworkUndefine, /* 0.6.4 */ + .networkCreate = vboxNetworkCreate, /* 0.6.4 */ + .networkDestroy = vboxNetworkDestroy, /* 0.6.4 */ + .networkGetXMLDesc = vboxNetworkGetXMLDesc, /* 0.6.4 */ +}; + +virNetworkDriverPtr vboxGetNetworkDriver(uint32_t uVersion) +{ + /* Install gVBoxAPI according to the vbox API version. + * Return -1 for unsupported version. + */ + if (uVersion >= 2001052 && uVersion < 2002051) { + vbox22InstallUniformedAPI(&gVBoxAPI); + } else if (uVersion >= 2002051 && uVersion < 3000051) { + vbox30InstallUniformedAPI(&gVBoxAPI); + } else if (uVersion >= 3000051 && uVersion < 3001051) { + vbox31InstallUniformedAPI(&gVBoxAPI); + } else if (uVersion >= 3001051 && uVersion < 3002051) { + vbox32InstallUniformedAPI(&gVBoxAPI); + } else if (uVersion >= 3002051 && uVersion < 4000051) { + vbox40InstallUniformedAPI(&gVBoxAPI); + } else if (uVersion >= 4000051 && uVersion < 4001051) { + vbox41InstallUniformedAPI(&gVBoxAPI); + } else if (uVersion >= 4001051 && uVersion < 4002020) { + vbox42InstallUniformedAPI(&gVBoxAPI); + } else if (uVersion >= 4002020 && uVersion < 4002051) { + vbox42_20InstallUniformedAPI(&gVBoxAPI); + } else if (uVersion >= 4002051 && uVersion < 4003004) { + vbox43InstallUniformedAPI(&gVBoxAPI); + } else if (uVersion >= 4003004 && uVersion < 4003051) { + vbox43_4InstallUniformedAPI(&gVBoxAPI); + } else { + return NULL; + } + return &vboxNetworkDriver; +} diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index 9231fab..a062428 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -5894,24 +5894,6 @@ void NAME(InstallUniformedAPI)(vboxUniformedAPI *pVBoxAPI) * Function Tables */ -virNetworkDriver NAME(NetworkDriver) = { - "VBOX", - .networkOpen = vboxNetworkOpen, /* 0.6.4 */ - .networkClose = vboxNetworkClose, /* 0.6.4 */ - .connectNumOfNetworks = vboxConnectNumOfNetworks, /* 0.6.4 */ - .connectListNetworks = vboxConnectListNetworks, /* 0.6.4 */ - .connectNumOfDefinedNetworks = vboxConnectNumOfDefinedNetworks, /* 0.6.4 */ - .connectListDefinedNetworks = vboxConnectListDefinedNetworks, /* 0.6.4 */ - .networkLookupByUUID = vboxNetworkLookupByUUID, /* 0.6.4 */ - .networkLookupByName = vboxNetworkLookupByName, /* 0.6.4 */ - .networkCreateXML = vboxNetworkCreateXML, /* 0.6.4 */ - .networkDefineXML = vboxNetworkDefineXML, /* 0.6.4 */ - .networkUndefine = vboxNetworkUndefine, /* 0.6.4 */ - .networkCreate = vboxNetworkCreate, /* 0.6.4 */ - .networkDestroy = vboxNetworkDestroy, /* 0.6.4 */ - .networkGetXMLDesc = vboxNetworkGetXMLDesc, /* 0.6.4 */ -}; - virStorageDriver NAME(StorageDriver) = { .name = "VBOX", .storageOpen = vboxStorageOpen, /* 0.7.1 */ diff --git a/src/vbox/vbox_uniformed_api.h b/src/vbox/vbox_uniformed_api.h index da754e8..b92c932 100644 --- a/src/vbox/vbox_uniformed_api.h +++ b/src/vbox/vbox_uniformed_api.h @@ -586,22 +586,6 @@ typedef struct { virDomainPtr vboxDomainLookupByUUID(virConnectPtr conn, const unsigned char *uuid); -virDrvOpenStatus vboxNetworkOpen(virConnectPtr conn, - virConnectAuthPtr auth, - unsigned int flags); -int vboxNetworkClose(virConnectPtr conn); -int vboxConnectNumOfNetworks(virConnectPtr conn); -int vboxConnectListNetworks(virConnectPtr conn, char **const names, int nnames); -int vboxConnectNumOfDefinedNetworks(virConnectPtr conn); -int vboxConnectListDefinedNetworks(virConnectPtr conn, char **const names, int nnames); -virNetworkPtr vboxNetworkLookupByUUID(virConnectPtr conn, const unsigned char *uuid); -virNetworkPtr vboxNetworkLookupByName(virConnectPtr conn, const char *name); -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); -char *vboxNetworkGetXMLDesc(virNetworkPtr network, unsigned int flags); /* Version specified functions for installing uniformed API */ void vbox22InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI); -- 1.7.9.5

On 10/02/2014 05:30 AM, Taowei wrote:
This patch seperate the domain driver and the network driver.
libvirt_driver_vbox_impl.la has been linked in the network driver. So that the version specified codes in vbox_V*.c would only be compiled once.
The vboxGetNetworkDriver provides a simple interface to get vbox network driver. --- src/Makefile.am | 11 ++++-- src/vbox/vbox_driver.c | 9 +++-- src/vbox/vbox_get_driver.h | 1 + src/vbox/vbox_network.c | 83 +++++++++++++++++++++++++++++++++-------- src/vbox/vbox_tmpl.c | 18 --------- src/vbox/vbox_uniformed_api.h | 16 -------- 6 files changed, 82 insertions(+), 56 deletions(-)
This patch broke the build without driver modules: ./autogen.sh --system --without-driver-modules && make CCLD libvirtd ../src/.libs/libvirt_driver_vbox.a(libvirt_driver_vbox_impl_la-vbox_driver.o): In function `vboxNetworkRegister': /home/jtomko/work/libvirt/libvirt.git/src/vbox/vbox_driver.c:168: undefined reference to `vboxGetNetworkDriver' collect2: error: ld returned 1 exit status make[3]: *** [libvirtd] Error 1 Jan

On 03.10.2014 13:51, Ján Tomko wrote:
On 10/02/2014 05:30 AM, Taowei wrote:
This patch seperate the domain driver and the network driver.
libvirt_driver_vbox_impl.la has been linked in the network driver. So that the version specified codes in vbox_V*.c would only be compiled once.
The vboxGetNetworkDriver provides a simple interface to get vbox network driver. --- src/Makefile.am | 11 ++++-- src/vbox/vbox_driver.c | 9 +++-- src/vbox/vbox_get_driver.h | 1 + src/vbox/vbox_network.c | 83 +++++++++++++++++++++++++++++++++-------- src/vbox/vbox_tmpl.c | 18 --------- src/vbox/vbox_uniformed_api.h | 16 -------- 6 files changed, 82 insertions(+), 56 deletions(-)
This patch broke the build without driver modules: ./autogen.sh --system --without-driver-modules && make
CCLD libvirtd ../src/.libs/libvirt_driver_vbox.a(libvirt_driver_vbox_impl_la-vbox_driver.o): In function `vboxNetworkRegister': /home/jtomko/work/libvirt/libvirt.git/src/vbox/vbox_driver.c:168: undefined reference to `vboxGetNetworkDriver' collect2: error: ld returned 1 exit status make[3]: *** [libvirtd] Error 1
Oh right. Will push fix shortly. Michal

After 87dea4fcf one can observe a build failure: ./autogen.sh --system --without-driver-modules && make CCLD libvirtd ../src/.libs/libvirt_driver_vbox.a(libvirt_driver_vbox_impl_la-vbox_driver.o): In function `vboxNetworkRegister': /home/jtomko/work/libvirt/libvirt.git/src/vbox/vbox_driver.c:168: undefined reference to `vboxGetNetworkDriver' collect2: error: ld returned 1 exit status make[3]: *** [libvirtd] Error 1 The problem is that when building without driver modules the VBOX network driver is not linked into the the VBOX driver. Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- Pushed under the build breaker rule. src/Makefile.am | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Makefile.am b/src/Makefile.am index 5e8cd4a..188cd29 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1171,6 +1171,7 @@ noinst_LTLIBRARIES += libvirt_driver_vbox.la # GPLv2-only license requries that it be linked into # libvirtd and *not* libvirt.so #libvirt_la_BUILT_LIBADD += libvirt_driver_vbox.la +libvirt_driver_vbox_la_LIBADD += libvirt_driver_vbox_network_impl.la endif ! WITH_DRIVER_MODULES libvirt_driver_vbox_impl_la_CFLAGS = \ -- 2.0.4

On 10/03/2014 02:05 PM, Michal Privoznik wrote:
After 87dea4fcf one can observe a build failure:
./autogen.sh --system --without-driver-modules && make
CCLD libvirtd ../src/.libs/libvirt_driver_vbox.a(libvirt_driver_vbox_impl_la-vbox_driver.o): In function `vboxNetworkRegister': /home/jtomko/work/libvirt/libvirt.git/src/vbox/vbox_driver.c:168: undefined reference to `vboxGetNetworkDriver' collect2: error: ld returned 1 exit status make[3]: *** [libvirtd] Error 1
The problem is that when building without driver modules the VBOX network driver is not linked into the the VBOX driver.
Signed-off-by: Michal Privoznik <mprivozn@redhat.com> ---
Pushed under the build breaker rule.
Thank you! Jan

On 02.10.2014 05:30, Taowei wrote:
This seriers of patches rewrite the vbox network driver.
Diff from v2: *Seperate the network driver from the domain driver. *Prevent vbox code from being compiled too many times when building network driver.
Taowei (14): vbox: Interfaces for register per parties vbox: Rewrite vboxNetworkOpen vbox: Rewrite vboxNetworkClose vbox: Rewrite vboxConnectNumOfNetworks vbox: Rewrite vboxConnectListNetworks vbox: Rewrite vboxConnectNumOfDefinedNetworks vbox: Rewrite vboxConnectListDefinedNetworks vbox: Rewrite vboxNetworkLookupByUUID vbox: Rewrite vboxNetworkLookupByName vbox: Rewrite vboxNetworkDefineCreateXML vbox: Rewrite vboxNetworkUndefineDestroy vbox: Rewrite vboxNetworkCreate vbox: Rewrite vboxNetworkGetXMLDesc vbox: New network driver
po/POTFILES.in | 1 + src/Makefile.am | 16 +- src/vbox/vbox_common.c | 70 +- src/vbox/vbox_common.h | 16 + src/vbox/vbox_driver.c | 55 +- src/vbox/{vbox_install_api.h => vbox_get_driver.h} | 9 +- src/vbox/vbox_network.c | 1050 ++++++++++++++++ src/vbox/vbox_tmpl.c | 1261 +++++--------------- src/vbox/vbox_uniformed_api.h | 52 + 9 files changed, 1523 insertions(+), 1007 deletions(-) rename src/vbox/{vbox_install_api.h => vbox_get_driver.h} (79%) create mode 100644 src/vbox/vbox_network.c
I'm fixing all the small nits I've found, ACKing and pushing. Awesome job - the compilation is somewhat faster again. Thanks! Michal

Thank you, Michal. I will read your comments carefully. It is great examples for me to learn more about the project. 2014-10-03 16:48 GMT+08:00 Michal Privoznik <mprivozn@redhat.com>:
On 02.10.2014 05:30, Taowei wrote:
This seriers of patches rewrite the vbox network driver.
Diff from v2: *Seperate the network driver from the domain driver. *Prevent vbox code from being compiled too many times when building network driver.
Taowei (14): vbox: Interfaces for register per parties vbox: Rewrite vboxNetworkOpen vbox: Rewrite vboxNetworkClose vbox: Rewrite vboxConnectNumOfNetworks vbox: Rewrite vboxConnectListNetworks vbox: Rewrite vboxConnectNumOfDefinedNetworks vbox: Rewrite vboxConnectListDefinedNetworks vbox: Rewrite vboxNetworkLookupByUUID vbox: Rewrite vboxNetworkLookupByName vbox: Rewrite vboxNetworkDefineCreateXML vbox: Rewrite vboxNetworkUndefineDestroy vbox: Rewrite vboxNetworkCreate vbox: Rewrite vboxNetworkGetXMLDesc vbox: New network driver
po/POTFILES.in | 1 + src/Makefile.am | 16 +- src/vbox/vbox_common.c | 70 +- src/vbox/vbox_common.h | 16 + src/vbox/vbox_driver.c | 55 +- src/vbox/{vbox_install_api.h => vbox_get_driver.h} | 9 +- src/vbox/vbox_network.c | 1050 ++++++++++++++++ src/vbox/vbox_tmpl.c | 1261 +++++--------------- src/vbox/vbox_uniformed_api.h | 52 + 9 files changed, 1523 insertions(+), 1007 deletions(-) rename src/vbox/{vbox_install_api.h => vbox_get_driver.h} (79%) create mode 100644 src/vbox/vbox_network.c
I'm fixing all the small nits I've found, ACKing and pushing. Awesome job - the compilation is somewhat faster again. Thanks!
Michal

On 10/01/2014 09:30 PM, Taowei wrote:
This seriers of patches rewrite the vbox network driver.
Diff from v2: *Seperate the network driver from the domain driver. *Prevent vbox code from being compiled too many times when building network driver.
Taowei (14):
Usually, it's a good idea to put a full name in the git authorship. We can add a .mailmap entry that will update your existing commits to list a full name; it is also acceptable to use UTF-8 to represent the name in native characters if that is preferable to you. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org
participants (5)
-
Eric Blake
-
Ján Tomko
-
Michal Privoznik
-
Taowei
-
Taowei Luo