VirtualBox

Changeset 68026 in vbox


Ignore:
Timestamp:
Jul 18, 2017 2:15:32 PM (7 years ago)
Author:
vboxsync
Message:

Main/NetIf (bugref:8915) Moved wireless detection from ConsoleImpl2.cpp to NetIf and exposed wireless flag via IHostNetworkInterface.

Location:
trunk/src/VBox/Main
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/idl/VirtualBox.xidl

    r68024 r68026  
    89278927    </attribute>
    89288928
     8929    <attribute name="wireless" type="boolean" readonly="yes">
     8930      <desc>Specifies whether the interface is wireless.</desc>
     8931    </attribute>
     8932
    89298933    <method name="enableStaticIPConfig">
    89308934      <desc>sets and enables the static IP V4 configuration for the given interface.</desc>
  • trunk/src/VBox/Main/include/HostNetworkInterfaceImpl.h

    r65120 r68026  
    7070    HRESULT getInterfaceType(HostNetworkInterfaceType_T *aType);
    7171    HRESULT getNetworkName(com::Utf8Str &aNetworkName);
     72    HRESULT getWireless(BOOL *aWireless);
    7273
    7374    // Wrapped IHostNetworkInterface methods
     
    9394        Data() : IPAddress(0), networkMask(0), dhcpEnabled(FALSE),
    9495            mediumType(HostNetworkInterfaceMediumType_Unknown),
    95             status(HostNetworkInterfaceStatus_Down){}
     96            status(HostNetworkInterfaceStatus_Down), wireless(FALSE){}
    9697
    9798        ULONG IPAddress;
     
    108109        HostNetworkInterfaceStatus_T status;
    109110        ULONG speedMbits;
     111        BOOL wireless;
    110112    } m;
    111113
  • trunk/src/VBox/Main/include/netif.h

    r67566 r68026  
    6868    RTNETADDRIPV6  IPv6Address;
    6969    RTNETADDRIPV6  IPv6NetMask;
    70     BOOL           bDhcpEnabled;
    71     BOOL           bIsDefault;
     70    BOOL           fDhcpEnabled;
     71    BOOL           fIsDefault;
     72    BOOL           fWireless;
    7273    RTMAC          MACAddress;
    7374    NETIFTYPE      enmMediumType;
  • trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp

    r67918 r68026  
    104104#  include <linux/types.h>
    105105#  include <linux/if.h>
    106 #  include <linux/wireless.h>
    107106# elif defined(RT_OS_FREEBSD)
    108107#  include <unistd.h>
     
    51855184                const char *pszBridgedIfName = BridgedIfNameUtf8.c_str();
    51865185
     5186                ComPtr<IHostNetworkInterface> hostInterface;
     5187                hrc = host->FindHostNetworkInterfaceByName(BridgedIfName.raw(),
     5188                                                           hostInterface.asOutParam());
     5189                if (!SUCCEEDED(hrc))
     5190                {
     5191                    AssertLogRelMsgFailed(("NetworkAttachmentType_Bridged: FindByName failed, rc=%Rhrc (0x%x)", hrc, hrc));
     5192                    return VMSetError(VMR3GetVM(mpUVM), VERR_INTERNAL_ERROR, RT_SRC_POS,
     5193                                      N_("Nonexistent host networking interface, name '%ls'"),
     5194                                      BridgedIfName.raw());
     5195                }
     5196
    51875197# if defined(RT_OS_DARWIN)
    51885198                /* The name is on the form 'ifX: long name', chop it off at the colon. */
     
    52305240
    52315241# elif defined(RT_OS_WINDOWS)
    5232                 ComPtr<IHostNetworkInterface> hostInterface;
    5233                 hrc = host->FindHostNetworkInterfaceByName(BridgedIfName.raw(),
    5234                                                            hostInterface.asOutParam());
    5235                 if (!SUCCEEDED(hrc))
    5236                 {
    5237                     AssertLogRelMsgFailed(("NetworkAttachmentType_Bridged: FindByName failed, rc=%Rhrc (0x%x)", hrc, hrc));
    5238                     return VMSetError(VMR3GetVM(mpUVM), VERR_INTERNAL_ERROR, RT_SRC_POS,
    5239                                       N_("Nonexistent host networking interface, name '%ls'"),
    5240                                       BridgedIfName.raw());
    5241                 }
    5242 
    52435242                HostNetworkInterfaceType_T eIfType;
    52445243                hrc = hostInterface->COMGETTER(InterfaceType)(&eIfType);
     
    54235422                trunkType = Bstr(TRUNKTYPE_NETFLT);
    54245423
    5425 # if defined(RT_OS_DARWIN)
    5426                 /** @todo Come up with a better deal here. Problem is that IHostNetworkInterface is completely useless here. */
    5427                 if (    strstr(pszBridgedIfName, "Wireless")
    5428                     ||  strstr(pszBridgedIfName, "AirPort" ))
     5424                BOOL fSharedMacOnWire = false;
     5425                hrc = hostInterface->COMGETTER(Wireless)(&fSharedMacOnWire);
     5426                if (FAILED(hrc))
     5427                {
     5428                    LogRel(("NetworkAttachmentType_Bridged: COMGETTER(Wireless) failed, hrc (0x%x)\n", hrc));
     5429                    H();
     5430                }
     5431                else if (fSharedMacOnWire)
     5432                {
    54295433                    InsertConfigInteger(pCfg, "SharedMacOnWire", true);
    5430 # elif defined(RT_OS_LINUX)
    5431                 int iSock = socket(AF_INET, SOCK_DGRAM, 0);
    5432                 if (iSock >= 0)
    5433                 {
    5434                     struct iwreq WRq;
    5435 
    5436                     RT_ZERO(WRq);
    5437                     strncpy(WRq.ifr_name, pszBridgedIfName, IFNAMSIZ);
    5438                     bool fSharedMacOnWire = ioctl(iSock, SIOCGIWNAME, &WRq) >= 0;
    5439                     close(iSock);
    5440                     if (fSharedMacOnWire)
    5441                     {
    5442                         InsertConfigInteger(pCfg, "SharedMacOnWire", true);
    5443                         Log(("Set SharedMacOnWire\n"));
    5444                     }
    5445                     else
    5446                         Log(("Failed to get wireless name\n"));
    5447                 }
    5448                 else
    5449                     Log(("Failed to open wireless socket\n"));
    5450 # elif defined(RT_OS_FREEBSD)
    5451                 int iSock = socket(AF_INET, SOCK_DGRAM, 0);
    5452                 if (iSock >= 0)
    5453                 {
    5454                     struct ieee80211req WReq;
    5455                     uint8_t abData[32];
    5456 
    5457                     RT_ZERO(WReq);
    5458                     strncpy(WReq.i_name, pszBridgedIfName, sizeof(WReq.i_name));
    5459                     WReq.i_type = IEEE80211_IOC_SSID;
    5460                     WReq.i_val = -1;
    5461                     WReq.i_data = abData;
    5462                     WReq.i_len = sizeof(abData);
    5463 
    5464                     bool fSharedMacOnWire = ioctl(iSock, SIOCG80211, &WReq) >= 0;
    5465                     close(iSock);
    5466                     if (fSharedMacOnWire)
    5467                     {
    5468                         InsertConfigInteger(pCfg, "SharedMacOnWire", true);
    5469                         Log(("Set SharedMacOnWire\n"));
    5470                     }
    5471                     else
    5472                         Log(("Failed to get wireless name\n"));
    5473                 }
    5474                 else
    5475                     Log(("Failed to open wireless socket\n"));
    5476 # elif defined(RT_OS_WINDOWS)
    5477 #  define DEVNAME_PREFIX L"\\\\.\\"
    5478                 /* we are getting the medium type via IOCTL_NDIS_QUERY_GLOBAL_STATS Io Control
    5479                  * there is a pretty long way till there though since we need to obtain the symbolic link name
    5480                  * for the adapter device we are going to query given the device Guid */
    5481 
    5482 
    5483                 /* prepend the "\\\\.\\" to the bind name to obtain the link name */
    5484 
    5485                 wchar_t FileName[MAX_PATH];
    5486                 wcscpy(FileName, DEVNAME_PREFIX);
    5487                 wcscpy((wchar_t*)(((char*)FileName) + sizeof(DEVNAME_PREFIX) - sizeof(FileName[0])), pswzBindName);
    5488 
    5489                 /* open the device */
    5490                 HANDLE hDevice = CreateFile(FileName,
    5491                                             GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
    5492                                             NULL,
    5493                                             OPEN_EXISTING,
    5494                                             FILE_ATTRIBUTE_NORMAL,
    5495                                             NULL);
    5496 
    5497                 if (hDevice != INVALID_HANDLE_VALUE)
    5498                 {
    5499                     bool fSharedMacOnWire = false;
    5500 
    5501                     /* now issue the OID_GEN_PHYSICAL_MEDIUM query */
    5502                     DWORD Oid = OID_GEN_PHYSICAL_MEDIUM;
    5503                     NDIS_PHYSICAL_MEDIUM PhMedium;
    5504                     DWORD cbResult;
    5505                     if (DeviceIoControl(hDevice,
    5506                                         IOCTL_NDIS_QUERY_GLOBAL_STATS,
    5507                                         &Oid,
    5508                                         sizeof(Oid),
    5509                                         &PhMedium,
    5510                                         sizeof(PhMedium),
    5511                                         &cbResult,
    5512                                         NULL))
    5513                     {
    5514                         /* that was simple, now examine PhMedium */
    5515                         if (   PhMedium == NdisPhysicalMediumWirelessWan
    5516                             || PhMedium == NdisPhysicalMediumWirelessLan
    5517                             || PhMedium == NdisPhysicalMediumNative802_11
    5518                             || PhMedium == NdisPhysicalMediumBluetooth)
    5519                             fSharedMacOnWire = true;
    5520                     }
    5521                     else
    5522                     {
    5523                         int winEr = GetLastError();
    5524                         LogRel(("Console::configNetwork: DeviceIoControl failed, err (0x%x), ignoring\n", winEr));
    5525                         Assert(winEr == ERROR_INVALID_PARAMETER || winEr == ERROR_NOT_SUPPORTED || winEr == ERROR_BAD_COMMAND);
    5526                     }
    5527                     CloseHandle(hDevice);
    5528 
    5529                     if (fSharedMacOnWire)
    5530                     {
    5531                         Log(("this is a wireless adapter"));
    5532                         InsertConfigInteger(pCfg, "SharedMacOnWire", true);
    5533                         Log(("Set SharedMacOnWire\n"));
    5534                     }
    5535                     else
    5536                         Log(("this is NOT a wireless adapter"));
    5537                 }
    5538                 else
    5539                 {
    5540                     int winEr = GetLastError();
    5541                     AssertLogRelMsgFailed(("Console::configNetwork: CreateFile failed, err (0x%x), ignoring\n", winEr));
    5542                 }
    5543 
    5544                 CoTaskMemFree(pswzBindName);
    5545 
    5546                 pAdaptorComponent.setNull();
    5547                 /* release the pNc finally */
    5548                 VBoxNetCfgWinReleaseINetCfg(pNc, FALSE /*fHasWriteLock*/);
    5549 # else
    5550                 /** @todo PORTME: wireless detection */
    5551 # endif
     5434                    Log(("Set SharedMacOnWire\n"));
     5435                }
    55525436
    55535437# if defined(RT_OS_SOLARIS)
  • trunk/src/VBox/Main/src-server/HostNetworkInterfaceImpl.cpp

    r67636 r68026  
    167167        m.realIPAddress = m.IPAddress = info.IPAddress.u;
    168168        m.realNetworkMask = m.networkMask = info.IPNetMask.u;
    169         m.dhcpEnabled = info.bDhcpEnabled;
     169        m.dhcpEnabled = info.fDhcpEnabled;
    170170        if (info.IPv6Address.s.Lo || info.IPv6Address.s.Hi)
    171171            m.realIPV6Address = m.IPV6Address = Bstr(Utf8StrFmt("%RTnaipv6", &info.IPv6Address));
     
    183183#endif /* !RT_OS_WINDOWS */
    184184        m.speedMbits = info.uSpeedMbits;
     185        m.wireless = info.fWireless;
    185186        return S_OK;
    186187    }
     
    236237    RTNetMaskToPrefixIPv6(&pIf->IPv6NetMask, &iPrefixIPv6);
    237238    m.realIPV6PrefixLength = m.IPV6NetworkMaskPrefixLength = iPrefixIPv6;
    238     m.dhcpEnabled = pIf->bDhcpEnabled;
     239    m.dhcpEnabled = pIf->fDhcpEnabled;
    239240    m.hardwareAddress = Bstr(Utf8StrFmt("%RTmac", &pIf->MACAddress));
    240241#ifdef RT_OS_WINDOWS
     
    246247#endif /* !RT_OS_WINDOWS */
    247248    m.speedMbits = pIf->uSpeedMbits;
     249    m.wireless = pIf->fWireless;
    248250
    249251    /* Confirm a successful initialization */
     
    444446{
    445447    aNetworkName = mNetworkName;
     448
     449    return S_OK;
     450}
     451
     452HRESULT HostNetworkInterface::getWireless(BOOL *aWireless)
     453{
     454    *aWireless = m.wireless;
    446455
    447456    return S_OK;
  • trunk/src/VBox/Main/src-server/darwin/NetIf-darwin.cpp

    r65088 r68026  
    361361            memcpy(pNew->szName, pNIC->szName, cbNameLen);
    362362            pNew->Uuid = pNIC->Uuid;
     363            pNew->fWireless = pNIC->fWireless;
    363364        }
    364365        else
  • trunk/src/VBox/Main/src-server/freebsd/NetIf-freebsd.cpp

    r62485 r68026  
    176176
    177177
     178static bool isWireless(const char *pszName)
     179{
     180    bool fWireless = false;
     181    int iSock = socket(AF_INET, SOCK_DGRAM, 0);
     182    if (iSock >= 0)
     183    {
     184        struct ieee80211req WReq;
     185        uint8_t abData[32];
     186
     187        RT_ZERO(WReq);
     188        strncpy(WReq.i_name, pszName, sizeof(WReq.i_name));
     189        WReq.i_type = IEEE80211_IOC_SSID;
     190        WReq.i_val = -1;
     191        WReq.i_data = abData;
     192        WReq.i_len = sizeof(abData);
     193
     194        fWireless = ioctl(iSock, SIOCG80211, &WReq) >= 0;
     195        close(iSock);
     196    }
     197
     198    return fWireless;
     199}   
     200
    178201int NetIfList(std::list <ComObjPtr<HostNetworkInterface> > &list)
    179202{
     
    289312                enmType = HostNetworkInterfaceType_HostOnly;
    290313
     314            pNew->wireless = isWireless(pNew->szName);
     315
    291316            ComObjPtr<HostNetworkInterface> IfObj;
    292317            IfObj.createObject();
  • trunk/src/VBox/Main/src-server/linux/NetIf-linux.cpp

    r67432 r68026  
    2626#include <list>
    2727#include <sys/ioctl.h>
    28 #include <net/if.h>
     28#include <sys/socket.h>
     29#include <linux/wireless.h>
    2930#include <net/if_arp.h>
    3031#include <net/route.h>
     
    164165        if (ioctl(iSocket, SIOCGIFFLAGS, &Req) >= 0)
    165166            pInfo->enmStatus = Req.ifr_flags & IFF_UP ? NETIF_S_UP : NETIF_S_DOWN;
     167
     168        struct iwreq WRq;
     169        RT_ZERO(WRq);
     170        RTStrCopy(WRq.ifr_name, sizeof(WRq.ifr_name), pszName);
     171        pInfo->fWireless = ioctl(iSocket, SIOCGIWNAME, &WRq) >= 0;
    166172
    167173        FILE *fp = fopen("/proc/net/if_inet6", "r");
  • trunk/src/VBox/Main/src-server/win/NetIf-win.cpp

    r67725 r68026  
    4040
    4141#include <iprt/win/iphlpapi.h>
     42#include <iprt/win/ntddndis.h>
    4243
    4344#include "Logging.h"
     
    195196                    pInfo->enmMediumType = NETIF_T_ETHERNET;
    196197                    pInfo->enmStatus = pAdapter->OperStatus == IfOperStatusUp ? NETIF_S_UP : NETIF_S_DOWN;
    197                     pInfo->bIsDefault = (pAdapter->IfIndex == (DWORD)iDefault);
     198                    pInfo->fIsDefault = (pAdapter->IfIndex == (DWORD)iDefault);
    198199                    RTStrFree(pszUuid);
    199200                    break;
     
    212213                pInfo->IPNetMask.u = Settings.mask;
    213214            }
    214             pInfo->bDhcpEnabled = Settings.bDhcp;
     215            pInfo->fDhcpEnabled = Settings.bDhcp;
    215216        }
    216217        else
    217218        {
    218             pInfo->bDhcpEnabled = false;
     219            pInfo->fDhcpEnabled = false;
    219220        }
    220221    }
     
    995996            if (SUCCEEDED(rc))
    996997            {
    997                 if (Info.bIsDefault)
     998                if (Info.fIsDefault)
    998999                    pPist->push_front(iface);
    9991000                else
     
    14601461    RTUUID                guid;
    14611462    PIP_ADAPTER_ADDRESSES pAdapter;
     1463    BOOL                  fWireless;
    14621464};
    14631465
     
    15091511    netIfLog(("return\n"));
    15101512    return VINF_SUCCESS;
     1513}
     1514
     1515#define DEVNAME_PREFIX L"\\\\.\\"
     1516
     1517static BOOL netIfIsWireless(INetCfgComponent *pAdapter)
     1518{
     1519    HRESULT hr;
     1520    wchar_t * pswzBindName;
     1521    wchar_t FileName[MAX_PATH];
     1522    bool    fWireless = false;
     1523
     1524    hr = pAdapter->GetBindName(&pswzBindName);
     1525    wcscpy(FileName, DEVNAME_PREFIX);
     1526    wcscpy((wchar_t*)(((char*)FileName) + sizeof(DEVNAME_PREFIX) - sizeof(FileName[0])), pswzBindName);
     1527
     1528    /* open the device */
     1529    HANDLE hDevice = CreateFile(FileName,
     1530                                GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
     1531                                NULL,
     1532                                OPEN_EXISTING,
     1533                                FILE_ATTRIBUTE_NORMAL,
     1534                                NULL);
     1535
     1536    if (hDevice != INVALID_HANDLE_VALUE)
     1537    {
     1538
     1539        /* now issue the OID_GEN_PHYSICAL_MEDIUM query */
     1540        DWORD Oid = OID_GEN_PHYSICAL_MEDIUM;
     1541        NDIS_PHYSICAL_MEDIUM PhMedium;
     1542        DWORD cbResult;
     1543        if (DeviceIoControl(hDevice,
     1544                            IOCTL_NDIS_QUERY_GLOBAL_STATS,
     1545                            &Oid,
     1546                            sizeof(Oid),
     1547                            &PhMedium,
     1548                            sizeof(PhMedium),
     1549                            &cbResult,
     1550                            NULL))
     1551        {
     1552            /* that was simple, now examine PhMedium */
     1553            fWireless = PhMedium == NdisPhysicalMediumWirelessWan
     1554                     || PhMedium == NdisPhysicalMediumWirelessLan
     1555                     || PhMedium == NdisPhysicalMediumNative802_11
     1556                     || PhMedium == NdisPhysicalMediumBluetooth;
     1557        }
     1558        else
     1559        {
     1560            int winEr = GetLastError();
     1561            LogRel(("netIfIsWireless: DeviceIoControl failed, err (0x%x), ignoring\n", winEr));
     1562            Assert(winEr == ERROR_INVALID_PARAMETER || winEr == ERROR_NOT_SUPPORTED || winEr == ERROR_BAD_COMMAND);
     1563        }
     1564        CloseHandle(hDevice);
     1565    }
     1566    else
     1567    {
     1568        int winEr = GetLastError();
     1569        AssertLogRelMsgFailed(("netIfIsWireless: CreateFile failed, err (0x%x), ignoring\n", winEr));
     1570    }
     1571
     1572    CoTaskMemFree(pswzBindName);
     1573    return fWireless;
    15111574}
    15121575
     
    16101673                                            adapter.guid     = *(Guid(guid).raw());
    16111674                                            adapter.pAdapter = NULL;
     1675                                            adapter.fWireless = netIfIsWireless(pAdapter);
    16121676                                            netIfLog(("guid=%RTuuid, name=%ls, hwid=%ls, status=%x, chars=%x\n",
    16131677                                                      &adapter.guid, pwszName, pwszHwId, uStatus, dwChars));
     
    18731937                {
    18741938                    info.enmStatus = pAdapter->OperStatus == IfOperStatusUp ? NETIF_S_UP : NETIF_S_DOWN;
    1875                     info.bIsDefault = (pAdapter->IfIndex == (DWORD)iDefault);
    1876                     info.bDhcpEnabled = pAdapter->Flags & IP_ADAPTER_DHCP_ENABLED;
     1939                    info.fIsDefault = (pAdapter->IfIndex == (DWORD)iDefault);
     1940                    info.fDhcpEnabled = pAdapter->Flags & IP_ADAPTER_DHCP_ENABLED;
    18771941                    OSVERSIONINFOEX OSInfoEx;
    18781942                    RT_ZERO(OSInfoEx);
     
    19001964                else
    19011965                {
    1902                     if (info.bIsDefault)
     1966                    if (info.fIsDefault)
    19031967                        list.push_front(iface);
    19041968                    else
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette