--- src/VBox/Main/include/ConsoleImpl.h.orig +++ src/VBox/Main/include/ConsoleImpl.h @@ -410,7 +410,7 @@ private: HRESULT callTapSetupApplication(bool isStatic, RTFILE tapFD, Bstr &tapDevice, Bstr &tapSetupApplication); -#if (defined(RT_OS_LINUX) || defined(RT_OS_FREEBSD)) && !defined(VBOX_WITH_NETFLT) +#if ((defined(RT_OS_LINUX) && !defined(VBOX_WITH_NETFLT)) || defined(RT_OS_FREEBSD)) HRESULT attachToTapInterface(INetworkAdapter *networkAdapter); HRESULT detachFromTapInterface(INetworkAdapter *networkAdapter); #endif @@ -582,7 +582,7 @@ private: PPDMLED mapNetworkLeds[SchemaDefs::NetworkAdapterCount]; PPDMLED mapSharedFolderLed; PPDMLED mapUSBLed[2]; -#if !defined(VBOX_WITH_NETFLT) && (defined(RT_OS_LINUX) || defined(RT_OS_FREEBSD)) +#if ((defined(RT_OS_LINUX) && !defined(VBOX_WITH_NETFLT)) || defined(RT_OS_FREEBSD)) Utf8Str maTAPDeviceName[8]; RTFILE maTapFD[8]; #endif --- src/VBox/Main/ConsoleImpl.cpp.orig +++ src/VBox/Main/ConsoleImpl.cpp @@ -6168,7 +6168,7 @@ Console::usbDetachCallback(Console *that } #endif /* VBOX_WITH_USB */ -#if (defined(RT_OS_LINUX) || defined(RT_OS_FREEBSD)) && !defined(VBOX_WITH_NETFLT) +#if ((defined(RT_OS_LINUX) && !defined(VBOX_WITH_NETFLT)) || defined(RT_OS_FREEBSD)) /** * Helper function to handle host interface device creation and attachment. --- src/VBox/Main/ConsoleImpl2.cpp.orig +++ src/VBox/Main/ConsoleImpl2.cpp @@ -2394,6 +2394,42 @@ DECLCALLBACK(int) Console::configConstru /* we're not releasing the INetCfg stuff here since we use it later to figure out whether it is wireless */ # elif defined(RT_OS_LINUX) || defined(RT_OS_FREEBSD) +# if defined(RT_OS_FREEBSD) + /* + * If we bridge to a tap interface open it the `old' direct way. + * This works and performs better than bridging a physical + * interface via the current FreeBSD vboxnetflt implementation. + */ + if (!strncmp(pszHifName, "tap", sizeof "tap" - 1)) { + hrc = pThis->attachToTapInterface(aNetworkAdapter); + if (FAILED(hrc)) + { + switch (hrc) + { + case VERR_ACCESS_DENIED: + return VMSetError(pVM, VERR_HOSTIF_INIT_FAILED, RT_SRC_POS, N_( + "Failed to open '/dev/%s' for read/write access. Please check the " + "permissions of that node, and that the net.link.tap.user_open " + "sysctl is set. Either run 'chmod 0666 /dev/%s' or " + "change the group of that node to vboxusers and make yourself " + "a member of that group. Make sure that these changes are permanent."), pszHifName, pszHifName); + default: + AssertMsgFailed(("Could not attach to tap interface! Bad!\n")); + return VMSetError(pVM, VERR_HOSTIF_INIT_FAILED, RT_SRC_POS, N_( + "Failed to initialize Host Interface Networking")); + } + } + + Assert ((int)pThis->maTapFD[uInstance] >= 0); + if ((int)pThis->maTapFD[uInstance] >= 0) + { + rc = CFGMR3InsertString(pLunL0, "Driver", "HostInterface"); RC_CHECK(); + rc = CFGMR3InsertNode(pLunL0, "Config", &pCfg); RC_CHECK(); + rc = CFGMR3InsertInteger(pCfg, "FileHandle", pThis->maTapFD[uInstance]); RC_CHECK(); + } + break; + } +# endif /** @todo Check for malformed names. */ const char *pszTrunk = pszHifName;