NetworkAdapterImpl.cpp revision 9abd802d84a98ae8602297346ec3b3290423bbab
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync/** @file
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync *
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * VirtualBox COM class implementation
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync/*
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Copyright (C) 2006-2007 innotek GmbH
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync *
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * available from http://www.virtualbox.org. This file is free software;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * you can redistribute it and/or modify it under the terms of the GNU
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * General Public License (GPL) as published by the Free Software
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#include "NetworkAdapterImpl.h"
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync#include "Logging.h"
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync#include "MachineImpl.h"
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync#include <iprt/string.h>
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync#include <iprt/cpputils.h>
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync#include <VBox/err.h>
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync
930b5f872e89407f445d4000d4e4aaecaa6a0998vboxsync// constructor / destructor
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync////////////////////////////////////////////////////////////////////////////////
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncDEFINE_EMPTY_CTOR_DTOR (NetworkAdapter)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncHRESULT NetworkAdapter::FinalConstruct()
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return S_OK;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncvoid NetworkAdapter::FinalRelease()
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync uninit ();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync// public initializer/uninitializer for internal purposes only
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync////////////////////////////////////////////////////////////////////////////////
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync/**
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Initializes the network adapter object.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync *
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * @param aParent Handle of the parent object.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncHRESULT NetworkAdapter::init (Machine *aParent, ULONG aSlot)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync LogFlowThisFunc (("aParent=%p, aSlot=%d\n", aParent, aSlot));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync ComAssertRet (aParent, E_INVALIDARG);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync ComAssertRet (aSlot < SchemaDefs::NetworkAdapterCount, E_INVALIDARG);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Enclose the state transition NotReady->InInit->Ready */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoInitSpan autoInitSpan (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AssertReturn (autoInitSpan.isOk(), E_UNEXPECTED);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync unconst (mParent) = aParent;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* mPeer is left null */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData.allocate();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* initialize data */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData->mSlot = aSlot;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* default to Am79C973 */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData->mAdapterType = NetworkAdapterType_Am79C973;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* generate the MAC address early to guarantee it is the same both after
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * changing some other property (i.e. after mData.backup()) and after the
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * subsequent mData.rollback(). */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync generateMACAddress();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Confirm a successful initialization */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync autoInitSpan.setSucceeded();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return S_OK;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync/**
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Initializes the network adapter object given another network adapter object
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * (a kind of copy constructor). This object shares data with
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * the object passed as an argument.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync *
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * @note This object must be destroyed before the original object
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * it shares data with is destroyed.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync *
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * @note Locks @a aThat object for reading.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncHRESULT NetworkAdapter::init (Machine *aParent, NetworkAdapter *aThat)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync LogFlowThisFunc (("aParent=%p, aThat=%p\n", aParent, aThat));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync ComAssertRet (aParent && aThat, E_INVALIDARG);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Enclose the state transition NotReady->InInit->Ready */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoInitSpan autoInitSpan (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AssertReturn (autoInitSpan.isOk(), E_UNEXPECTED);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync unconst (mParent) = aParent;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync unconst (mPeer) = aThat;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoCaller thatCaller (aThat);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AssertComRCReturnRC (thatCaller.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoReadLock thatLock (aThat);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData.share (aThat->mData);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Confirm a successful initialization */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync autoInitSpan.setSucceeded();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return S_OK;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync/**
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Initializes the guest object given another guest object
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * (a kind of copy constructor). This object makes a private copy of data
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * of the original object passed as an argument.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync *
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * @note Locks @a aThat object for reading.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncHRESULT NetworkAdapter::initCopy (Machine *aParent, NetworkAdapter *aThat)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync LogFlowThisFunc (("aParent=%p, aThat=%p\n", aParent, aThat));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync ComAssertRet (aParent && aThat, E_INVALIDARG);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Enclose the state transition NotReady->InInit->Ready */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoInitSpan autoInitSpan (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AssertReturn (autoInitSpan.isOk(), E_UNEXPECTED);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync unconst (mParent) = aParent;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* mPeer is left null */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoCaller thatCaller (aThat);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AssertComRCReturnRC (thatCaller.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoReadLock thatLock (aThat);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData.attachCopy (aThat->mData);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Confirm a successful initialization */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync autoInitSpan.setSucceeded();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return S_OK;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync/**
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Uninitializes the instance and sets the ready flag to FALSE.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Called either from FinalRelease() or by the parent when it gets destroyed.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncvoid NetworkAdapter::uninit()
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync LogFlowThisFunc (("\n"));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Enclose the state transition Ready->InUninit->NotReady */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoUninitSpan autoUninitSpan (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (autoUninitSpan.uninitDone())
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData.free();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync unconst (mPeer).setNull();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync unconst (mParent).setNull();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync// INetworkAdapter properties
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync////////////////////////////////////////////////////////////////////////////////
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP NetworkAdapter::COMGETTER(AdapterType) (NetworkAdapterType_T *aAdapterType)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!aAdapterType)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return E_POINTER;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoCaller autoCaller (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComRCReturnRC (autoCaller.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoReadLock alock (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync *aAdapterType = mData->mAdapterType;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return S_OK;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP NetworkAdapter::COMSETTER(AdapterType) (NetworkAdapterType_T aAdapterType)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoCaller autoCaller (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComRCReturnRC (autoCaller.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* the machine needs to be mutable */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Machine::AutoMutableStateDependency adep (mParent);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComRCReturnRC (adep.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoWriteLock alock (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* make sure the value is allowed */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync switch (aAdapterType)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case NetworkAdapterType_Am79C970A:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case NetworkAdapterType_Am79C973:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#ifdef VBOX_WITH_E1000
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case NetworkAdapterType_I82540EM:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#endif
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync break;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync default:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return setError (E_FAIL,
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync tr("Invalid network adapter type '%d'"),
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync aAdapterType);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (mData->mAdapterType != aAdapterType)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData.backup();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData->mAdapterType = aAdapterType;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* leave the lock before informing callbacks */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync alock.unlock();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mParent->onNetworkAdapterChange (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return S_OK;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP NetworkAdapter::COMGETTER(Slot) (ULONG *aSlot)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!aSlot)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return E_POINTER;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoCaller autoCaller (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComRCReturnRC (autoCaller.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoReadLock alock (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync *aSlot = mData->mSlot;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return S_OK;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP NetworkAdapter::COMGETTER(Enabled) (BOOL *aEnabled)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!aEnabled)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return E_POINTER;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoCaller autoCaller (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComRCReturnRC (autoCaller.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoReadLock alock (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync *aEnabled = mData->mEnabled;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return S_OK;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP NetworkAdapter::COMSETTER(Enabled) (BOOL aEnabled)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoCaller autoCaller (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComRCReturnRC (autoCaller.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* the machine needs to be mutable */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Machine::AutoMutableStateDependency adep (mParent);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComRCReturnRC (adep.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoWriteLock alock (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (mData->mEnabled != aEnabled)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData.backup();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData->mEnabled = aEnabled;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* leave the lock before informing callbacks */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync alock.unlock();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mParent->onNetworkAdapterChange (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return S_OK;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP NetworkAdapter::COMGETTER(MACAddress)(BSTR *aMACAddress)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!aMACAddress)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return E_POINTER;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoCaller autoCaller (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComRCReturnRC (autoCaller.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoReadLock alock (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync ComAssertRet (!!mData->mMACAddress, E_FAIL);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData->mMACAddress.cloneTo (aMACAddress);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return S_OK;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP NetworkAdapter::COMSETTER(MACAddress)(INPTR BSTR aMACAddress)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoCaller autoCaller (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComRCReturnRC (autoCaller.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* the machine needs to be mutable */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Machine::AutoMutableStateDependency adep (mParent);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComRCReturnRC (adep.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoWriteLock alock (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc = S_OK;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync bool emitChangeEvent = false;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /*
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Are we supposed to generate a MAC?
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!aMACAddress)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData.backup();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync generateMACAddress();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync emitChangeEvent = true;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (mData->mMACAddress != aMACAddress)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /*
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Verify given MAC address
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Utf8Str macAddressUtf = aMACAddress;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync char *macAddressStr = macAddressUtf.mutableRaw();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync int i = 0;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync while ((i < 13) && macAddressStr && *macAddressStr && (rc == S_OK))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync char c = *macAddressStr;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* canonicalize hex digits to capital letters */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (c >= 'a' && c <= 'f')
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /** @todo the runtime lacks an ascii lower/upper conv */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync c &= 0xdf;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync *macAddressStr = c;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* we only accept capital letters */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (((c < '0') || (c > '9')) &&
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync ((c < 'A') || (c > 'F')))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync rc = setError(E_INVALIDARG, tr("Invalid MAC address format"));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* the second digit must have even value for unicast addresses */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if ((i == 1) && (!!(c & 1) == (c >= '0' && c <= '9')))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync rc = setError(E_INVALIDARG, tr("Invalid MAC address format"));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync macAddressStr++;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync i++;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* we must have parsed exactly 12 characters */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (i != 12)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync rc = setError(E_INVALIDARG, tr("Invalid MAC address format"));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (SUCCEEDED (rc))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData.backup();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData->mMACAddress = macAddressUtf;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync emitChangeEvent = true;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (emitChangeEvent)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* leave the lock before informing callbacks */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync alock.unlock();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mParent->onNetworkAdapterChange (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return rc;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP NetworkAdapter::COMGETTER(AttachmentType)(
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync NetworkAttachmentType_T *aAttachmentType)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!aAttachmentType)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return E_POINTER;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoCaller autoCaller (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComRCReturnRC (autoCaller.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoReadLock alock (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync *aAttachmentType = mData->mAttachmentType;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return S_OK;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP NetworkAdapter::COMGETTER(HostInterface)(BSTR *aHostInterface)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!aHostInterface)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return E_POINTER;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoCaller autoCaller (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComRCReturnRC (autoCaller.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoReadLock alock (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData->mHostInterface.cloneTo (aHostInterface);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return S_OK;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP NetworkAdapter::COMSETTER(HostInterface)(INPTR BSTR aHostInterface)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /** @todo Validate input string length. r=dmik: do it in XML schema?*/
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#ifdef RT_OS_WINDOWS
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // we don't allow null strings for the host interface on Win32
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // (because the @name attribute of <HostInerface> must be always present,
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // but can be empty).
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!aHostInterface)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return E_INVALIDARG;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#endif
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#ifdef VBOX_WITH_UNIXY_TAP_NETWORKING
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // empty strings are not allowed as path names
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (aHostInterface && !(*aHostInterface))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return E_INVALIDARG;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#endif
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoCaller autoCaller (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComRCReturnRC (autoCaller.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* the machine needs to be mutable */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Machine::AutoMutableStateDependency adep (mParent);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComRCReturnRC (adep.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoWriteLock alock (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (mData->mHostInterface != aHostInterface)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData.backup();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData->mHostInterface = aHostInterface;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* leave the lock before informing callbacks */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync alock.unlock();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mParent->onNetworkAdapterChange (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return S_OK;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#ifdef VBOX_WITH_UNIXY_TAP_NETWORKING
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP NetworkAdapter::COMGETTER(TAPFileDescriptor)(LONG *aTAPFileDescriptor)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!aTAPFileDescriptor)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return E_POINTER;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoCaller autoCaller (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComRCReturnRC (autoCaller.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoReadLock alock (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync *aTAPFileDescriptor = mData->mTAPFD;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return S_OK;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP NetworkAdapter::COMSETTER(TAPFileDescriptor)(LONG aTAPFileDescriptor)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /*
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Validate input.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync RTFILE tapFD = aTAPFileDescriptor;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (tapFD != NIL_RTFILE && (LONG)tapFD != aTAPFileDescriptor)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AssertMsgFailed(("Invalid file descriptor: %ld.\n", aTAPFileDescriptor));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return setError (E_INVALIDARG,
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync tr ("Invalid file descriptor: %ld"), aTAPFileDescriptor);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoCaller autoCaller (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComRCReturnRC (autoCaller.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* the machine needs to be mutable */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Machine::AutoMutableStateDependency adep (mParent);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComRCReturnRC (adep.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoWriteLock alock (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (mData->mTAPFD != (RTFILE) aTAPFileDescriptor)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData.backup();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData->mTAPFD = aTAPFileDescriptor;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* leave the lock before informing callbacks */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync alock.unlock();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mParent->onNetworkAdapterChange (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return S_OK;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP NetworkAdapter::COMGETTER(TAPSetupApplication) (
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync BSTR *aTAPSetupApplication)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!aTAPSetupApplication)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return E_POINTER;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoCaller autoCaller (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComRCReturnRC (autoCaller.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoReadLock alock (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* we don't have to be in TAP mode to support this call */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData->mTAPSetupApplication.cloneTo (aTAPSetupApplication);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return S_OK;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP NetworkAdapter::COMSETTER(TAPSetupApplication) (
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync INPTR BSTR aTAPSetupApplication)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* empty strings are not allowed as path names */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (aTAPSetupApplication && !(*aTAPSetupApplication))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return E_INVALIDARG;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoCaller autoCaller (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComRCReturnRC (autoCaller.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* the machine needs to be mutable */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Machine::AutoMutableStateDependency adep (mParent);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComRCReturnRC (adep.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoWriteLock alock (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (mData->mTAPSetupApplication != aTAPSetupApplication)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData.backup();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData->mTAPSetupApplication = aTAPSetupApplication;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* leave the lock before informing callbacks */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync alock.unlock();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mParent->onNetworkAdapterChange (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return S_OK;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP NetworkAdapter::COMGETTER(TAPTerminateApplication) (
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync BSTR *aTAPTerminateApplication)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!aTAPTerminateApplication)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return E_POINTER;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoCaller autoCaller (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComRCReturnRC (autoCaller.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoReadLock alock (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* we don't have to be in TAP mode to support this call */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData->mTAPTerminateApplication.cloneTo(aTAPTerminateApplication);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return S_OK;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP NetworkAdapter::COMSETTER(TAPTerminateApplication) (
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync INPTR BSTR aTAPTerminateApplication)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* empty strings are not allowed as path names */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (aTAPTerminateApplication && !(*aTAPTerminateApplication))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return E_INVALIDARG;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoCaller autoCaller (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComRCReturnRC (autoCaller.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* the machine needs to be mutable */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Machine::AutoMutableStateDependency adep (mParent);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComRCReturnRC (adep.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoWriteLock alock (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (mData->mTAPTerminateApplication != aTAPTerminateApplication)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData.backup();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData->mTAPTerminateApplication = aTAPTerminateApplication;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* leave the lock before informing callbacks */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync alock.unlock();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mParent->onNetworkAdapterChange(this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return S_OK;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#endif /* VBOX_WITH_UNIXY_TAP_NETWORKING */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP NetworkAdapter::COMGETTER(InternalNetwork) (BSTR *aInternalNetwork)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* we don't allow null strings */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!aInternalNetwork)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return E_POINTER;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoCaller autoCaller (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComRCReturnRC (autoCaller.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoReadLock alock (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData->mInternalNetwork.cloneTo (aInternalNetwork);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return S_OK;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP NetworkAdapter::COMSETTER(InternalNetwork) (INPTR BSTR aInternalNetwork)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!aInternalNetwork)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return E_INVALIDARG;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoCaller autoCaller (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComRCReturnRC (autoCaller.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* the machine needs to be mutable */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Machine::AutoMutableStateDependency adep (mParent);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComRCReturnRC (adep.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoWriteLock alock (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (mData->mInternalNetwork != aInternalNetwork)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* if an empty string is to be set, internal networking must be turned off */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if ( (aInternalNetwork == Bstr(""))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync && (mData->mAttachmentType = NetworkAttachmentType_Internal))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return setError (E_FAIL, tr ("Empty internal network name is not valid"));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData.backup();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData->mInternalNetwork = aInternalNetwork;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* leave the lock before informing callbacks */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync alock.unlock();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mParent->onNetworkAdapterChange (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return S_OK;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP NetworkAdapter::COMGETTER(CableConnected) (BOOL *aConnected)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!aConnected)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return E_POINTER;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoCaller autoCaller (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComRCReturnRC (autoCaller.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoReadLock alock (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync *aConnected = mData->mCableConnected;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return S_OK;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP NetworkAdapter::COMSETTER(CableConnected) (BOOL aConnected)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoCaller autoCaller (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComRCReturnRC (autoCaller.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* the machine needs to be mutable */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Machine::AutoMutableStateDependency adep (mParent);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComRCReturnRC (adep.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoWriteLock alock (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (aConnected != mData->mCableConnected)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData.backup();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData->mCableConnected = aConnected;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* leave the lock before informing callbacks */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync alock.unlock();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mParent->onNetworkAdapterChange (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return S_OK;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP NetworkAdapter::COMGETTER(LineSpeed) (ULONG *aSpeed)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!aSpeed)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return E_POINTER;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoCaller autoCaller (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComRCReturnRC (autoCaller.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoReadLock alock (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync *aSpeed = mData->mLineSpeed;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return S_OK;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP NetworkAdapter::COMSETTER(LineSpeed) (ULONG aSpeed)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoCaller autoCaller (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComRCReturnRC (autoCaller.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* the machine needs to be mutable */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Machine::AutoMutableStateDependency adep (mParent);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComRCReturnRC (adep.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoWriteLock alock (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (aSpeed != mData->mLineSpeed)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync {
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData.backup();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData->mLineSpeed = aSpeed;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* leave the lock before informing callbacks */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync alock.unlock();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mParent->onNetworkAdapterChange (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync }
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return S_OK;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP NetworkAdapter::COMGETTER(TraceEnabled) (BOOL *aEnabled)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!aEnabled)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return E_POINTER;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoCaller autoCaller (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComRCReturnRC (autoCaller.rc());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AutoReadLock alock (this);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync *aEnabled = mData->mTraceEnabled;
return S_OK;
}
STDMETHODIMP NetworkAdapter::COMSETTER(TraceEnabled) (BOOL aEnabled)
{
AutoCaller autoCaller (this);
CheckComRCReturnRC (autoCaller.rc());
/* the machine needs to be mutable */
Machine::AutoMutableStateDependency adep (mParent);
CheckComRCReturnRC (adep.rc());
AutoWriteLock alock (this);
if (aEnabled != mData->mTraceEnabled)
{
mData.backup();
mData->mTraceEnabled = aEnabled;
/* leave the lock before informing callbacks */
alock.unlock();
mParent->onNetworkAdapterChange (this);
}
return S_OK;
}
STDMETHODIMP NetworkAdapter::COMGETTER(TraceFile) (BSTR *aTraceFile)
{
if (!aTraceFile)
return E_POINTER;
AutoCaller autoCaller (this);
CheckComRCReturnRC (autoCaller.rc());
AutoReadLock alock (this);
mData->mTraceFile.cloneTo (aTraceFile);
return S_OK;
}
STDMETHODIMP NetworkAdapter::COMSETTER(TraceFile) (INPTR BSTR aTraceFile)
{
AutoCaller autoCaller (this);
CheckComRCReturnRC (autoCaller.rc());
/* the machine needs to be mutable */
Machine::AutoMutableStateDependency adep (mParent);
CheckComRCReturnRC (adep.rc());
AutoWriteLock alock (this);
if (mData->mTraceFile != aTraceFile)
{
mData.backup();
mData->mTraceFile = aTraceFile;
/* leave the lock before informing callbacks */
alock.unlock();
mParent->onNetworkAdapterChange (this);
}
return S_OK;
}
// INetworkAdapter methods
////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP NetworkAdapter::AttachToNAT()
{
AutoCaller autoCaller (this);
CheckComRCReturnRC (autoCaller.rc());
/* the machine needs to be mutable */
Machine::AutoMutableStateDependency adep (mParent);
CheckComRCReturnRC (adep.rc());
AutoWriteLock alock (this);
if (mData->mAttachmentType != NetworkAttachmentType_NAT)
{
mData.backup();
detach();
mData->mAttachmentType = NetworkAttachmentType_NAT;
/* leave the lock before informing callbacks */
alock.unlock();
mParent->onNetworkAdapterChange (this);
}
return S_OK;
}
STDMETHODIMP NetworkAdapter::AttachToHostInterface()
{
AutoCaller autoCaller (this);
CheckComRCReturnRC (autoCaller.rc());
/* the machine needs to be mutable */
Machine::AutoMutableStateDependency adep (mParent);
CheckComRCReturnRC (adep.rc());
AutoWriteLock alock (this);
/* don't do anything if we're already host interface attached */
if (mData->mAttachmentType != NetworkAttachmentType_HostInterface)
{
mData.backup();
/* first detach the current attachment */
detach();
mData->mAttachmentType = NetworkAttachmentType_HostInterface;
/* leave the lock before informing callbacks */
alock.unlock();
mParent->onNetworkAdapterChange (this);
}
return S_OK;
}
STDMETHODIMP NetworkAdapter::AttachToInternalNetwork()
{
AutoCaller autoCaller (this);
CheckComRCReturnRC (autoCaller.rc());
/* the machine needs to be mutable */
Machine::AutoMutableStateDependency adep (mParent);
CheckComRCReturnRC (adep.rc());
AutoWriteLock alock (this);
/* don't do anything if we're already internal network attached */
if (mData->mAttachmentType != NetworkAttachmentType_Internal)
{
mData.backup();
/* first detach the current attachment */
detach();
/* there must an internal network name */
if ( !mData->mInternalNetwork
|| (mData->mInternalNetwork == Bstr ("")))
{
LogRel (("Internal network name not defined, "
"setting to default \"intnet\"\n"));
mData->mInternalNetwork = Bstr ("intnet");
}
mData->mAttachmentType = NetworkAttachmentType_Internal;
/* leave the lock before informing callbacks */
alock.unlock();
mParent->onNetworkAdapterChange (this);
}
return S_OK;
}
STDMETHODIMP NetworkAdapter::Detach()
{
AutoCaller autoCaller (this);
CheckComRCReturnRC (autoCaller.rc());
/* the machine needs to be mutable */
Machine::AutoMutableStateDependency adep (mParent);
CheckComRCReturnRC (adep.rc());
AutoWriteLock alock (this);
if (mData->mAttachmentType != NetworkAttachmentType_Null)
{
mData.backup();
detach();
/* leave the lock before informing callbacks */
alock.unlock();
mParent->onNetworkAdapterChange (this);
}
return S_OK;
}
// public methods only for internal purposes
////////////////////////////////////////////////////////////////////////////////
/**
* Loads settings from the given adapter node.
* May be called once right after this object creation.
*
* @param aAdapterNode <Adapter> node.
*
* @note Locks this object for writing.
*/
HRESULT NetworkAdapter::loadSettings (const settings::Key &aAdapterNode)
{
using namespace settings;
AssertReturn (!aAdapterNode.isNull(), E_FAIL);
AutoCaller autoCaller (this);
AssertComRCReturnRC (autoCaller.rc());
AutoWriteLock alock (this);
/* Note: we assume that the default values for attributes of optional
* nodes are assigned in the Data::Data() constructor and don't do it
* here. It implies that this method may only be called after constructing
* a new BIOSSettings object while all its data fields are in the default
* values. Exceptions are fields whose creation time defaults don't match
* values that should be applied when these fields are not explicitly set
* in the settings file (for backwards compatibility reasons). This takes
* place when a setting of a newly created object must default to A while
* the same setting of an object loaded from the old settings file must
* default to B. */
HRESULT rc = S_OK;
/* type (optional, defaults to Am79C970A) */
const char *adapterType = aAdapterNode.stringValue ("type");
if (strcmp (adapterType, "Am79C970A") == 0)
mData->mAdapterType = NetworkAdapterType_Am79C970A;
else if (strcmp (adapterType, "Am79C973") == 0)
mData->mAdapterType = NetworkAdapterType_Am79C973;
else if (strcmp (adapterType, "82540EM") == 0)
mData->mAdapterType = NetworkAdapterType_I82540EM;
else
ComAssertMsgFailedRet (("Invalid adapter type '%s'", adapterType),
E_FAIL);
/* enabled (required) */
mData->mEnabled = aAdapterNode.value <bool> ("enabled");
/* MAC address (can be null) */
rc = COMSETTER(MACAddress) (Bstr (aAdapterNode.stringValue ("MACAddress")));
CheckComRCReturnRC (rc);
/* cable (required) */
mData->mCableConnected = aAdapterNode.value <bool> ("cable");
/* line speed (defaults to 100 Mbps) */
mData->mLineSpeed = aAdapterNode.value <ULONG> ("speed");
/* tracing (defaults to false) */
mData->mTraceEnabled = aAdapterNode.value <bool> ("trace");
mData->mTraceFile = aAdapterNode.stringValue ("tracefile");
/* One of NAT, HostInerface, Internal or nothing */
Key attachmentNode;
if (!(attachmentNode = aAdapterNode.findKey ("NAT")).isNull())
{
/* NAT */
rc = AttachToNAT();
CheckComRCReturnRC (rc);
}
else
if (!(attachmentNode = aAdapterNode.findKey ("HostInterface")).isNull())
{
/* Host Interface Networking */
Bstr name = attachmentNode.stringValue ("name");
#ifdef RT_OS_WINDOWS
/* name can be empty on Win32, but not null */
ComAssertRet (!name.isNull(), E_FAIL);
#endif
rc = COMSETTER(HostInterface) (name);
CheckComRCReturnRC (rc);
#ifdef VBOX_WITH_UNIXY_TAP_NETWORKING
/* optopnal */
mData->mTAPSetupApplication = attachmentNode.stringValue ("TAPSetup");
mData->mTAPTerminateApplication = attachmentNode.stringValue ("TAPTerminate");
#endif /* VBOX_WITH_UNIXY_TAP_NETWORKING */
rc = AttachToHostInterface();
CheckComRCReturnRC (rc);
}
else
if (!(attachmentNode = aAdapterNode.findKey ("InternalNetwork")).isNull())
{
/* Internal Networking */
/* required */
mData->mInternalNetwork = attachmentNode.stringValue ("name");
rc = AttachToInternalNetwork();
CheckComRCReturnRC (rc);
}
else
{
/* Adapter has no children */
rc = Detach();
CheckComRCReturnRC (rc);
}
return S_OK;
}
/**
* Saves settings to the given adapter node.
*
* Note that the given Adapter node is comletely empty on input.
*
* @param aAdapterNode <Adapter> node.
*
* @note Locks this object for reading.
*/
HRESULT NetworkAdapter::saveSettings (settings::Key &aAdapterNode)
{
using namespace settings;
AssertReturn (!aAdapterNode.isNull(), E_FAIL);
AutoCaller autoCaller (this);
AssertComRCReturnRC (autoCaller.rc());
AutoReadLock alock (this);
aAdapterNode.setValue <bool> ("enabled", !!mData->mEnabled);
aAdapterNode.setValue <Bstr> ("MACAddress", mData->mMACAddress);
aAdapterNode.setValue <bool> ("cable", !!mData->mCableConnected);
aAdapterNode.setValue <ULONG> ("speed", mData->mLineSpeed);
if (mData->mTraceEnabled)
aAdapterNode.setValue <bool> ("trace", true);
aAdapterNode.setValueOr <Bstr> ("tracefile", mData->mTraceFile, Bstr::Null);
const char *typeStr = NULL;
switch (mData->mAdapterType)
{
case NetworkAdapterType_Am79C970A:
typeStr = "Am79C970A";
break;
case NetworkAdapterType_Am79C973:
typeStr = "Am79C973";
break;
case NetworkAdapterType_I82540EM:
typeStr = "82540EM";
break;
default:
ComAssertMsgFailedRet (("Invalid network adapter type: %d\n",
mData->mAdapterType),
E_FAIL);
}
aAdapterNode.setStringValue ("type", typeStr);
switch (mData->mAttachmentType)
{
case NetworkAttachmentType_Null:
{
/* do nothing -- empty content */
break;
}
case NetworkAttachmentType_NAT:
{
Key attachmentNode = aAdapterNode.createKey ("NAT");
break;
}
case NetworkAttachmentType_HostInterface:
{
Key attachmentNode = aAdapterNode.createKey ("HostInterface");
#ifdef RT_OS_WINDOWS
Assert (!mData->mHostInterface.isNull());
#endif
#ifdef VBOX_WITH_UNIXY_TAP_NETWORKING
if (!mData->mHostInterface.isEmpty())
#endif
attachmentNode.setValue <Bstr> ("name", mData->mHostInterface);
#ifdef VBOX_WITH_UNIXY_TAP_NETWORKING
if (!mData->mTAPSetupApplication.isEmpty())
attachmentNode.setValue <Bstr> ("TAPSetup",
mData->mTAPSetupApplication);
if (!mData->mTAPTerminateApplication.isEmpty())
attachmentNode.setValue <Bstr> ("TAPTerminate",
mData->mTAPTerminateApplication);
#endif /* VBOX_WITH_UNIXY_TAP_NETWORKING */
break;
}
case NetworkAttachmentType_Internal:
{
Key attachmentNode = aAdapterNode.createKey ("InternalNetwork");
Assert (!mData->mInternalNetwork.isNull());
attachmentNode.setValue <Bstr> ("name", mData->mInternalNetwork);
break;
}
default:
{
ComAssertFailedRet (E_FAIL);
}
}
return S_OK;
}
/**
* @note Locks this object for writing.
*/
bool NetworkAdapter::rollback()
{
/* sanity */
AutoCaller autoCaller (this);
AssertComRCReturn (autoCaller.rc(), false);
AutoWriteLock alock (this);
bool changed = false;
if (mData.isBackedUp())
{
/* we need to check all data to see whether anything will be changed
* after rollback */
changed = mData.hasActualChanges();
mData.rollback();
}
return changed;
}
/**
* @note Locks this object for writing, together with the peer object (also
* for writing) if there is one.
*/
void NetworkAdapter::commit()
{
/* sanity */
AutoCaller autoCaller (this);
AssertComRCReturnVoid (autoCaller.rc());
/* sanity too */
AutoCaller peerCaller (mPeer);
AssertComRCReturnVoid (peerCaller.rc());
/* lock both for writing since we modify both (mPeer is "master" so locked
* first) */
AutoMultiWriteLock2 alock (mPeer, this);
if (mData.isBackedUp())
{
mData.commit();
if (mPeer)
{
/* attach new data to the peer and reshare it */
mPeer->mData.attach (mData);
}
}
}
/**
* @note Locks this object for writing, together with the peer object
* represented by @a aThat (locked for reading).
*/
void NetworkAdapter::copyFrom (NetworkAdapter *aThat)
{
AssertReturnVoid (aThat != NULL);
/* sanity */
AutoCaller autoCaller (this);
AssertComRCReturnVoid (autoCaller.rc());
/* sanity too */
AutoCaller thatCaller (aThat);
AssertComRCReturnVoid (thatCaller.rc());
/* peer is not modified, lock it for reading (aThat is "master" so locked
* first) */
AutoMultiLock2 alock (aThat->rlock(), this->wlock());
/* this will back up current data */
mData.assignCopy (aThat->mData);
}
// private methods
////////////////////////////////////////////////////////////////////////////////
/**
* Worker routine for detach handling. No locking, no notifications.
* @note Must be called from under the object's write lock.
*/
void NetworkAdapter::detach()
{
AssertReturnVoid (isWriteLockOnCurrentThread());
switch (mData->mAttachmentType)
{
case NetworkAttachmentType_Null:
{
/* nothing to do here */
break;
}
case NetworkAttachmentType_NAT:
{
break;
}
case NetworkAttachmentType_HostInterface:
{
/* reset handle and device name */
#ifdef RT_OS_WINDOWS
mData->mHostInterface = "";
#endif
#ifdef VBOX_WITH_UNIXY_TAP_NETWORKING
mData->mHostInterface.setNull();
mData->mTAPFD = NIL_RTFILE;
#endif
break;
}
case NetworkAttachmentType_Internal:
{
mData->mInternalNetwork.setNull();
break;
}
}
mData->mAttachmentType = NetworkAttachmentType_Null;
}
/**
* Generates a new unique MAC address based on our vendor ID and
* parts of a GUID.
*
* @note Must be called from under the object's write lock or within the init
* span.
*/
void NetworkAdapter::generateMACAddress()
{
/*
* Our strategy is as follows: the first three bytes are our fixed
* vendor ID (080027). The remaining 3 bytes will be taken from the
* start of a GUID. This is a fairly safe algorithm.
*/
char strMAC[13];
Guid guid;
guid.create();
RTStrPrintf (strMAC, sizeof(strMAC), "080027%02X%02X%02X",
guid.ptr()->au8[0], guid.ptr()->au8[1], guid.ptr()->au8[2]);
LogFlowThisFunc (("generated MAC: '%s'\n", strMAC));
mData->mMACAddress = strMAC;
}