VirtualBox

Changeset 35356 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Dec 27, 2010 9:00:23 PM (14 years ago)
Author:
vboxsync
Message:

Main/NetIf: Default (primary) NIC detection on Windows hosts (#3773)

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/include/netif.h

    r31539 r35356  
    6868    RTNETADDRIPV6  IPv6NetMask;
    6969    BOOL           bDhcpEnabled;
     70    BOOL           bIsDefault;
    7071    RTMAC          MACAddress;
    7172    NETIFTYPE      enmMediumType;
  • trunk/src/VBox/Main/win/NetIf-win.cpp

    r34546 r35356  
    6262#define VBOX_APP_NAME L"VirtualBox"
    6363
    64 static int collectNetIfInfo(Bstr &strName, Guid &guid, PNETIFINFO pInfo)
     64static int getDefaultInterfaceIndex()
     65{
     66    PMIB_IPFORWARDTABLE pIpTable;
     67    DWORD dwSize = sizeof(MIB_IPFORWARDTABLE) * 20;
     68    DWORD dwRC = NO_ERROR;
     69    int iIndex = -1;
     70
     71    pIpTable = (MIB_IPFORWARDTABLE *)RTMemAlloc(dwSize);
     72    if (GetIpForwardTable(pIpTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER)
     73    {
     74        RTMemFree(pIpTable);
     75        pIpTable = (MIB_IPFORWARDTABLE *)RTMemAlloc(dwSize);
     76        if (!pIpTable)
     77            return -1;
     78    }
     79    dwRC = GetIpForwardTable(pIpTable, &dwSize, 0);
     80    if (dwRC == NO_ERROR)
     81    {
     82        for (unsigned int i = 0; i < pIpTable->dwNumEntries; i++)
     83            if (pIpTable->table[i].dwForwardDest == 0)
     84            {
     85                iIndex = pIpTable->table[i].dwForwardIfIndex;
     86                break;
     87            }
     88    }
     89    RTMemFree(pIpTable);
     90    return iIndex;
     91}
     92
     93static int collectNetIfInfo(Bstr &strName, Guid &guid, PNETIFINFO pInfo, int iDefault)
    6594{
    6695    DWORD dwRc;
     
    163192                    pInfo->enmMediumType = NETIF_T_ETHERNET;
    164193                    pInfo->enmStatus = pAdapter->OperStatus == IfOperStatusUp ? NETIF_S_UP : NETIF_S_DOWN;
     194                    pInfo->bIsDefault = (pAdapter->IfIndex == iDefault);
    165195                    RTStrFree(pszUuid);
    166196                    break;
     
    906936
    907937static int vboxNetWinAddComponent(std::list<ComObjPtr<HostNetworkInterface> > * pPist,
    908                                   INetCfgComponent * pncc, HostNetworkInterfaceType enmType)
     938                                  INetCfgComponent * pncc, HostNetworkInterfaceType enmType,
     939                                  int iDefaultInterface)
    909940{
    910941    LPWSTR              lpszName;
     
    926957            memset(&Info, 0, sizeof(Info));
    927958            Info.Uuid = *(Guid(IfGuid).raw());
    928             rc = collectNetIfInfo(name, Guid(IfGuid), &Info);
     959            rc = collectNetIfInfo(name, Guid(IfGuid), &Info, iDefaultInterface);
    929960            if (RT_FAILURE(rc))
    930961            {
     
    937968            if (SUCCEEDED(iface->init(name, enmType, &Info)))
    938969            {
    939                 pPist->push_back(iface);
     970                if (Info.bIsDefault)
     971                    pPist->push_front(iface);
     972                else
     973                    pPist->push_back(iface);
    940974                rc = VINF_SUCCESS;
    941975            }
     
    9921026                            if (!_wcsnicmp(pId, L"sun_VBoxNetAdp", sizeof(L"sun_VBoxNetAdp")/2))
    9931027                            {
    994                                 vboxNetWinAddComponent(&list, pMpNcc, HostNetworkInterfaceType_HostOnly);
     1028                                vboxNetWinAddComponent(&list, pMpNcc, HostNetworkInterfaceType_HostOnly, -1);
    9951029                            }
    9961030                            CoTaskMemFree(pId);
     
    10371071            pInfo->Uuid = *(guid.raw());
    10381072
    1039             return collectNetIfInfo(name, guid, pInfo);
     1073            return collectNetIfInfo(name, guid, pInfo, getDefaultInterfaceIndex());
    10401074        }
    10411075    }
     
    14041438    IEnumNetCfgBindingInterface *pEnumBi;
    14051439    INetCfgBindingInterface *pBi;
     1440    int                  iDefault = getDefaultInterfaceIndex();
    14061441
    14071442    /* we are using the INetCfg API for getting the list of miniports */
     
    14591494                                        if (uComponentStatus == 0)
    14601495                                        {
    1461                                             vboxNetWinAddComponent(&list, pMpNcc, HostNetworkInterfaceType_Bridged);
     1496                                            vboxNetWinAddComponent(&list, pMpNcc, HostNetworkInterfaceType_Bridged, iDefault);
    14621497                                        }
    14631498                                    }
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