VirtualBox

Changeset 28106 in vbox for trunk


Ignore:
Timestamp:
Apr 8, 2010 4:45:59 PM (15 years ago)
Author:
vboxsync
Message:

Main: Added machinery to query, set and use NIC boot priority.

Location:
trunk
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/settings.h

    r28098 r28106  
    407407          ulLineSpeed(0),
    408408          fTraceEnabled(false),
    409           mode(NetworkAttachmentType_Null)
     409          mode(NetworkAttachmentType_Null),
     410          ulBootPriority(0)
    410411    {}
    411412
     
    427428                                                // with bridged: host interface or empty;
    428429                                                // otherwise: network name (required)
     430    uint32_t                ulBootPriority;
    429431};
    430432typedef std::list<NetworkAdapter> NetworkAdaptersList;
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp

    r27980 r28106  
    206206                 "                            [--nictracefile<1-N> <filename>]\n"
    207207                 "                            [--nicspeed<1-N> <kbps>]\n"
     208                 "                            [--nicbootprio<1-N> <priority>]\n"
    208209                 "                            [--bridgeadapter<1-N> none|<devicename>]\n"
    209210#if defined(VBOX_WITH_NETFLT)
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp

    r27822 r28106  
    856856                nic->COMGETTER(LineSpeed)(&ulLineSpeed);
    857857
     858                /* boot priority of the adapter */
     859                ULONG ulBootPriority;
     860                nic->COMGETTER(BootPriority)(&ulBootPriority);
     861
    858862                if (details == VMINFO_MACHINEREADABLE)
    859863                {
     
    863867                }
    864868                else
    865                     RTPrintf("NIC %d:           MAC: %lS, Attachment: %s, Cable connected: %s, Trace: %s (file: %lS), Type: %s, Reported speed: %d Mbps\n",
     869                    RTPrintf("NIC %d:           MAC: %lS, Attachment: %s, Cable connected: %s, Trace: %s (file: %lS), Type: %s, Reported speed: %d Mbps, Boot priority: %d\n",
    866870                             currentNIC + 1, strMACAddress.raw(), strAttachment.raw(),
    867871                             fConnected ? "on" : "off",
     
    869873                             traceFile.isEmpty() ? Bstr("none").raw() : traceFile.raw(),
    870874                             strNICType.raw(),
    871                              ulLineSpeed / 1000);
     875                             ulLineSpeed / 1000,
     876                             (int)ulBootPriority);
    872877            }
    873878        }
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp

    r28041 r28106  
    109109    MODIFYVM_NICTYPE,
    110110    MODIFYVM_NICSPEED,
     111    MODIFYVM_NICBOOTPRIO,
    111112    MODIFYVM_NIC,
    112113    MODIFYVM_CABLECONNECTED,
     
    213214    { "--nictype",                  MODIFYVM_NICTYPE,                   RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX },
    214215    { "--nicspeed",                 MODIFYVM_NICSPEED,                  RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_INDEX },
     216    { "--nicbootprio",              MODIFYVM_NICBOOTPRIO,               RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_INDEX },
    215217    { "--nic",                      MODIFYVM_NIC,                       RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX },
    216218    { "--cableconnected",           MODIFYVM_CABLECONNECTED,            RTGETOPT_REQ_BOOL_ONOFF | RTGETOPT_FLAG_INDEX },
     
    11241126            }
    11251127
     1128            case MODIFYVM_NICBOOTPRIO:
     1129            {
     1130                ComPtr<INetworkAdapter> nic;
     1131   
     1132                CHECK_ERROR_BREAK(machine, GetNetworkAdapter(GetOptState.uIndex - 1, nic.asOutParam()));
     1133                ASSERT(nic);
     1134
     1135                /* Somewhat arbitrary limitation - we can pass a list of up to 4 PCI devices
     1136                 * to the PXE ROM, hence only boot priorities 1-4 are allowed (in addition to
     1137                 * 0 for the default lowest priority).
     1138                 */
     1139                if (ValueUnion.u32 > 4)
     1140                {
     1141                    errorArgument("Invalid boot priority '%u' specfied for NIC %u", ValueUnion.u32, GetOptState.uIndex);
     1142                    rc = E_FAIL;
     1143                }
     1144                else
     1145                {
     1146                    CHECK_ERROR(nic, COMSETTER(BootPriority)(ValueUnion.u32));
     1147                }
     1148                break;
     1149            }
     1150
    11261151            case MODIFYVM_NIC:
    11271152            {
  • trunk/src/VBox/Main/ConsoleImpl2.cpp

    r27976 r28106  
    192192
    193193/*
     194 * Simple class for storing network boot information.
     195 */
     196struct BootNic {
     197    ULONG       mInstance;
     198    unsigned    mPciDev;
     199    unsigned    mPciFn;
     200    ULONG       mBootPrio;
     201    bool operator < (const BootNic &rhs) const
     202    {
     203        int lval = mBootPrio ? mBootPrio : INT_MAX;
     204        int rval = rhs.mBootPrio ? rhs.mBootPrio : INT_MAX;
     205        return lval < rval; /* Zero compares as highest number (lowest prio). */
     206    }
     207};
     208
     209/*
    194210 * VC++ 8 / amd64 has some serious trouble with this function.
    195211 * As a temporary measure, we'll drop global optimizations.
     
    14501466    rc = CFGMR3InsertNode(pDevices, "virtio-net", &pDevVirtioNet);                  RC_CHECK();
    14511467#endif /* VBOX_WITH_VIRTIO */
     1468    std::list<BootNic> llNics;
    14521469    for (ULONG ulInstance = 0; ulInstance < SchemaDefs::NetworkAdapterCount; ++ulInstance)
    14531470    {
     
    15291546        }
    15301547#endif
    1531         /*
    1532          * Transfer boot device information to the BIOS.
     1548        /* 
     1549         * Collect information needed for network booting and add it to the list.
    15331550         */
    1534         if (ulInstance == 0)
    1535         {
    1536             unsigned    uBootIdx = 0;
    1537 
    1538             if (pNetBootCfg)    /* NetBoot node doesn't exist for EFI! */
    1539             {
    1540                 PCFGMNODE   pNetBtDevCfg;
    1541                 char        achBootIdx[] = "0";
    1542 
    1543                 achBootIdx[0] = '0' + uBootIdx;     /* Boot device order. */
    1544                 rc = CFGMR3InsertNode(pNetBootCfg, achBootIdx, &pNetBtDevCfg);      RC_CHECK();
    1545                 rc = CFGMR3InsertInteger(pNetBtDevCfg, "NIC", ulInstance);          RC_CHECK();
    1546                 rc = CFGMR3InsertInteger(pNetBtDevCfg, "PCIDeviceNo", iPciDeviceNo);RC_CHECK();
    1547                 rc = CFGMR3InsertInteger(pNetBtDevCfg, "PCIFunctionNo", 0);         RC_CHECK();
    1548             }
    1549         }
     1551        BootNic     nic;
     1552
     1553        nic.mInstance = ulInstance;
     1554        nic.mPciDev   = iPciDeviceNo;
     1555        nic.mPciFn    = 0;
     1556
     1557        hrc = networkAdapter->COMGETTER(BootPriority)(&nic.mBootPrio);              H();
     1558
     1559        llNics.push_back(nic);
    15501560
    15511561        /*
     
    16221632        rc = configNetwork(pConsole, pszAdapterName, ulInstance, 0, networkAdapter,
    16231633                           pCfg, pLunL0, pInst, false /*fAttachDetach*/);           RC_CHECK();
     1634    }
     1635
     1636    /*
     1637     * Build network boot information and transfer it to the BIOS.
     1638     */
     1639    if (pNetBootCfg && !llNics.empty())  /* NetBoot node doesn't exist for EFI! */
     1640    {
     1641        llNics.sort();  /* Sort the list by boot priority. */
     1642
     1643        PCFGMNODE   pNetBtDevCfg;
     1644        char        achBootIdx[] = "0";
     1645        unsigned    uBootIdx = 0;
     1646
     1647        std::list<BootNic>::iterator it;
     1648
     1649        for (it = llNics.begin(); it != llNics.end(); ++it)
     1650        {
     1651            Assert(iter);
     1652
     1653            /* A NIC with priority 0 is only used if it's first in the list. */
     1654            if (it->mBootPrio == 0 && uBootIdx != 0)
     1655                break;
     1656
     1657            achBootIdx[0] = '0' + uBootIdx++;   /* Boot device order. */
     1658            rc = CFGMR3InsertNode(pNetBootCfg, achBootIdx, &pNetBtDevCfg);      RC_CHECK();
     1659            rc = CFGMR3InsertInteger(pNetBtDevCfg, "NIC", it->mInstance);       RC_CHECK();
     1660            rc = CFGMR3InsertInteger(pNetBtDevCfg, "PCIDeviceNo", it->mPciDev); RC_CHECK();
     1661            rc = CFGMR3InsertInteger(pNetBtDevCfg, "PCIFunctionNo", it->mPciFn);RC_CHECK();
     1662        }
    16241663    }
    16251664
  • trunk/src/VBox/Main/NetworkAdapterImpl.cpp

    r27976 r28106  
    803803}
    804804
     805STDMETHODIMP NetworkAdapter::COMGETTER(BootPriority) (ULONG *aBootPriority)
     806{
     807    CheckComArgOutPointerValid(aBootPriority);
     808
     809    AutoCaller autoCaller(this);
     810    if (FAILED(autoCaller.rc())) return autoCaller.rc();
     811
     812    AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
     813
     814    *aBootPriority = mData->mBootPriority;
     815
     816    return S_OK;
     817}
     818
     819STDMETHODIMP NetworkAdapter::COMSETTER(BootPriority) (ULONG aBootPriority)
     820{
     821    AutoCaller autoCaller(this);
     822    if (FAILED(autoCaller.rc())) return autoCaller.rc();
     823
     824    /* the machine needs to be mutable */
     825    AutoMutableStateDependency adep(mParent);
     826    if (FAILED(adep.rc())) return adep.rc();
     827
     828    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
     829
     830    if (aBootPriority != mData->mBootPriority)
     831    {
     832        mData.backup();
     833        mData->mBootPriority = aBootPriority;
     834
     835        m_fModified = true;
     836        // leave the lock before informing callbacks
     837        alock.release();
     838
     839        AutoWriteLock mlock(mParent COMMA_LOCKVAL_SRC_POS);       // mParent is const, no need to lock
     840        mParent->setModified(Machine::IsModified_NetworkAdapters);
     841        mlock.release();
     842
     843        /* No change in CFGM logic => changeAdapter=FALSE. */
     844        mParent->onNetworkAdapterChange(this, FALSE);
     845    }
     846
     847    return S_OK;
     848}
     849
    805850// INetworkAdapter methods
    806851////////////////////////////////////////////////////////////////////////////////
     
    10761121    mData->mTraceEnabled = data.fTraceEnabled;
    10771122    mData->mTraceFile = data.strTraceFile;
     1123    /* boot priority (defaults to 0, i.e. lowest) */
     1124    mData->mBootPriority = data.ulBootPriority;
    10781125
    10791126    switch (data.mode)
     
    11461193
    11471194    data.strTraceFile = mData->mTraceFile;
     1195
     1196    data.ulBootPriority = mData->mBootPriority;
    11481197
    11491198    data.type = mData->mAdapterType;
  • trunk/src/VBox/Main/idl/VirtualBox.xidl

    r28046 r28106  
    1158111581  <interface
    1158211582     name="INetworkAdapter" extends="$unknown"
    11583      uuid="65607a27-2b73-4d43-b4cc-0ba2c817fbde"
     11583     uuid="5bdb9df8-a5e1-4322-a139-b7a4a734c790"
    1158411584     wsmap="managed"
    1158511585     >
     
    1168011680        for this interface. This is active only when the interface actually uses
    1168111681        NAT (see <link to="#attachToNAT" />).
     11682      </desc>
     11683    </attribute>
     11684
     11685    <attribute name="bootPriority" type="unsigned long">
     11686      <desc>
     11687        Network boot priority of the adapter. Priority 1 is highest. If not set,
     11688        the priority is considered to be at the lowest possible setting.
    1168211689      </desc>
    1168311690    </attribute>
  • trunk/src/VBox/Main/include/NetworkAdapterImpl.h

    r27857 r28106  
    6464        Bstr mInternalNetwork;
    6565        Bstr mNATNetwork;
     66        ULONG mBootPriority;
    6667    };
    6768
     
    113114    STDMETHOD(COMSETTER(TraceFile)) (IN_BSTR aTraceFile);
    114115    STDMETHOD(COMGETTER(NatDriver)) (INATEngine **aNatDriver);
     116    STDMETHOD(COMGETTER(BootPriority)) (ULONG *aBootPriority);
     117    STDMETHOD(COMSETTER(BootPriority)) (ULONG aBootPriority);
    115118
    116119    // INetworkAdapter methods
  • trunk/src/VBox/Main/xml/Settings.cpp

    r28098 r28106  
    13731373                  && (mode              == n.mode)
    13741374                  && (strName           == n.strName)
     1375                  && (ulBootPriority    == n.ulBootPriority)
    13751376                )
    13761377           );
     
    18201821        pelmAdapter->getAttributeValue("trace", nic.fTraceEnabled);
    18211822        pelmAdapter->getAttributeValue("tracefile", nic.strTraceFile);
     1823        pelmAdapter->getAttributeValue("bootPriority", nic.ulBootPriority);
    18221824
    18231825        const xml::ElementNode *pelmAdapterChild;
     
    32883290        pelmAdapter->setAttribute("cable", nic.fCableConnected);
    32893291        pelmAdapter->setAttribute("speed", nic.ulLineSpeed);
     3292        if (nic.ulBootPriority != 0)
     3293        {
     3294            pelmAdapter->setAttribute("bootPriority", nic.ulBootPriority);
     3295        }
    32903296        if (nic.fTraceEnabled)
    32913297        {
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