VirtualBox

Ignore:
Timestamp:
Apr 4, 2016 8:45:21 PM (9 years ago)
Author:
vboxsync
Message:

hostdrivers/VBoxNetFlt/cfg: fix for bugref:6379: setting default metric value for new created net interface.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/win/cfg/VBoxNetCfg.cpp

    r59077 r60318  
    1919#define _WIN32_DCOM
    2020
    21 #include <iphlpapi.h>
    2221
    2322#include <devguid.h>
     
    3534#include <Wbemidl.h>
    3635#include <comdef.h>
     36
     37#include <winsock2.h>
    3738#include <Ws2tcpip.h>
     39#include <ws2ipdef.h>
     40#include <netioapi.h>
     41#include <iphlpapi.h>
    3842
    3943
     
    5761#define VBOX_NETCFG_LOCK_TIME_OUT     5000  /** @todo r=bird: What does this do? */
    5862
     63/*
     64* Forward declaration for using vboxNetCfgWinSetupMetric()
     65*/
     66HRESULT vboxNetCfgWinSetupMetric(IN HKEY hKey);
     67HRESULT vboxNetCfgWinGetInterfaceLUID(IN HKEY hKey, OUT NET_LUID* pLUID);
    5968
    6069/*
     
    276285    ZeroMemory(&Token, sizeof (Token));
    277286    Token.Type = OBO_USER;
     287    INetCfgComponent* pTempComponent = NULL;
    278288
    279289    hr = pSetup->Install(pszwComponentId, &Token,
     
    282292                         NULL, /* IN LPCWSTR pszwAnswerFile */
    283293                         NULL, /* IN LPCWSTR pszwAnswerSections */
    284                          ppComponent);
     294                         &pTempComponent);
    285295    if (SUCCEEDED(hr))
    286296    {
     297        if (pTempComponent != NULL)
     298        {
     299            HKEY hkey;
     300            NET_LUID luid;
     301            HRESULT res;
     302
     303            /*
     304            *   Set default metric value of interface to fix multicast issue
     305            *   See @bugref{6379} for details.
     306            */
     307            res = pTempComponent->OpenParamKey(&hkey);
     308            if(SUCCEEDED(res) && hkey != NULL)
     309                res = vboxNetCfgWinSetupMetric(hkey);
     310            if (FAILED(res))
     311            {
     312                /* 
     313                 *   The setting of Metric is not very important functionality,
     314                 *   So we will not break installation process due to this error.
     315                 */
     316                NonStandardLogFlow(("VBoxNetCfgWinInstallComponent Warning! "
     317                                    "vboxNetCfgWinSetupMetric failed, default metric "
     318                                    "for new interface will not be set, hr (0x%x)\n", res));
     319            }
     320            if (ppComponent != NULL)
     321                *ppComponent = pTempComponent;
     322            else
     323                pTempComponent->Release();
     324        }
     325
    287326        /* ignore the apply failure */
    288327        HRESULT tmpHr = pNetCfg->Apply();
     
    31003139            SetErrBreak(("Querying NetCfgInstanceId failed (0x%08X)", ret));
    31013140
     3141        /*
     3142        *   Set default metric value of interface to fix multicast issue
     3143        *   See @bugref{6379} for details.
     3144        */
     3145        HRESULT hSMRes = vboxNetCfgWinSetupMetric(hkey);
     3146        if (FAILED(hSMRes))
     3147        {
     3148            /*
     3149            *   The setting of Metric is not very important functionality,
     3150            *   So we will not break installation process due to this error.
     3151            */
     3152            NonStandardLogFlow(("vboxNetCfgWinCreateHostOnlyNetworkInterface Warning! "
     3153                "vboxNetCfgWinSetupMetric failed, default metric "
     3154                "for new interface will not be set, hr (0x%x)\n", hSMRes));
     3155        }
     3156
    31023157#ifndef VBOXNETCFG_DELAYEDRENAME
    31033158        /*
     
    33003355    return hrc;
    33013356}
     3357
     3358
     3359HRESULT vboxNetCfgWinGetLoopbackMetric(OUT int* Metric)
     3360{
     3361    HRESULT status = S_OK;
     3362    MIB_IPINTERFACE_ROW row;
     3363
     3364    InitializeIpInterfaceEntry(&row);
     3365    row.Family = AF_INET;
     3366    row.InterfaceLuid.Info.IfType = IF_TYPE_SOFTWARE_LOOPBACK;
     3367
     3368    status = GetIpInterfaceEntry(&row);
     3369    if (status != 0)
     3370        return E_FAIL;
     3371
     3372    *Metric = row.Metric;
     3373
     3374    return status;
     3375}
     3376
     3377
     3378HRESULT vboxNetCfgWinSetInterfaceMetric(
     3379    IN NET_LUID* pInterfaceLuid,
     3380    IN DWORD metric)
     3381{
     3382    MIB_IPINTERFACE_ROW newRow;
     3383    InitializeIpInterfaceEntry(&newRow);
     3384    // identificate the interface to change
     3385    newRow.InterfaceLuid = *pInterfaceLuid;
     3386    newRow.Family = AF_INET;
     3387    // changed settings
     3388    newRow.UseAutomaticMetric = false;
     3389    newRow.Metric = metric;
     3390
     3391    // change settings
     3392    return SetIpInterfaceEntry(&newRow);
     3393}
     3394
     3395
     3396HRESULT vboxNetCfgWinGetInterfaceLUID(IN HKEY hKey, OUT NET_LUID* pLUID)
     3397{
     3398    HRESULT res = S_OK;
     3399    DWORD luidIndex = 0;
     3400    DWORD ifType = 0;
     3401    DWORD cbSize = sizeof(luidIndex);
     3402    DWORD dwValueType = REG_DWORD;
     3403
     3404    if (pLUID == NULL)
     3405        return E_INVALIDARG;
     3406   
     3407    res = RegQueryValueExW(hKey, L"NetLuidIndex", NULL,
     3408        &dwValueType, (LPBYTE)&luidIndex, &cbSize);
     3409    if (FAILED(res))
     3410        return res;
     3411
     3412    cbSize = sizeof(ifType);
     3413    dwValueType = REG_DWORD;
     3414    res = RegQueryValueExW(hKey, L"*IfType", NULL,
     3415        &dwValueType, (LPBYTE)&ifType, &cbSize);
     3416    if (FAILED(res))
     3417        return res;
     3418
     3419    ZeroMemory(pLUID, sizeof(NET_LUID));
     3420    pLUID->Info.IfType = ifType;
     3421    pLUID->Info.NetLuidIndex = luidIndex;
     3422
     3423    return res;
     3424}
     3425
     3426
     3427HRESULT vboxNetCfgWinSetupMetric(IN HKEY hKey)
     3428{
     3429    HRESULT status = S_OK;
     3430    NET_LUID luid;
     3431    int loopbackMetric;
     3432
     3433    status = vboxNetCfgWinGetInterfaceLUID(hKey, &luid);
     3434    if (FAILED(status))
     3435        return status;
     3436
     3437    status = vboxNetCfgWinGetLoopbackMetric(&loopbackMetric);
     3438    if (FAILED(status))
     3439        return status;
     3440
     3441    status = vboxNetCfgWinSetInterfaceMetric(&luid, loopbackMetric - 1);
     3442
     3443    return status;
     3444}
     3445
    33023446
    33033447#ifdef VBOXNETCFG_DELAYEDRENAME
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