summaryrefslogtreecommitdiff
path: root/emulators/virtualbox-ose-legacy/files/patch-src-VBox-Main-ConsoleImpl2.cpp
blob: 4373abea348720c49f87a28f5cd63fe2d944154e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
--- src/VBox/Main/ConsoleImpl2.cpp.orig	2009-12-15 14:48:58.000000000 +0900
+++ src/VBox/Main/ConsoleImpl2.cpp	2009-12-15 14:48:42.000000000 +0900
@@ -86,6 +86,7 @@
 # include <sys/ioctl.h>
 # include <sys/socket.h>
 # include <net/if.h>
+# include <net80211/ieee80211_ioctl.h>
 #endif
 
 #if defined(RT_OS_WINDOWS) && defined(VBOX_WITH_NETFLT)
@@ -1605,6 +1605,15 @@
                 break;
             }
 #endif
+#ifdef RT_OS_FREEBSD
+# ifdef VBOX_WITH_PULSE
+            case AudioDriverType_Pulse:
+            {
+                rc = CFGMR3InsertString(pCfg, "AudioDriver", "pulse");              RC_CHECK();
+                break;
+            }
+# endif
+#endif
 #ifdef RT_OS_DARWIN
             case AudioDriverType_CoreAudio:
             {
@@ -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;
 
@@ -2495,6 +2496,33 @@ DECLCALLBACK(int) Console::configConstru
             }
             else
                 Log(("Failed to open wireless socket\n"));
+# elif defined(RT_OS_FREEBSD)
+            int iSock = socket(AF_INET, SOCK_DGRAM, 0);
+            if (iSock >= 0)
+            {
+                struct ieee80211req ireq;
+                uint8_t data[32];
+
+                (void) memset(&ireq, 0, sizeof(ireq));
+                (void) strncpy(ireq.i_name, pszHifName, sizeof(ireq.i_name));
+                ireq.i_type = IEEE80211_IOC_SSID;
+                ireq.i_val = -1;
+                ireq.i_data = data;
+                ireq.i_len = sizeof(data);
+
+                bool fSharedMacOnWire = ioctl(iSock, SIOCG80211, &ireq) >= 0;
+                close(iSock);
+                if (fSharedMacOnWire)
+                {
+                    rc = CFGMR3InsertInteger(pCfg, "SharedMacOnWire", true);
+                    RC_CHECK();
+                    Log(("Set SharedMacOnWire\n"));
+                }
+                else
+                    Log(("Failed to get wireless name\n"));
+            }
+            else
+                Log(("Failed to open wireless socket\n"));
 # elif defined(RT_OS_WINDOWS)
 #  define DEVNAME_PREFIX L"\\\\.\\"
             /* we are getting the medium type via IOCTL_NDIS_QUERY_GLOBAL_STATS Io Control