NATNetworkImpl.cpp revision 152b12e401b58b34fbdbf2a4510152b67884ee89
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * VirtualBox COM class implementation
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * Copyright (C) 2013 Oracle Corporation
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * This file is part of VirtualBox Open Source Edition (OSE), as
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * available from http://www.virtualbox.org. This file is free software;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * you can redistribute it and/or modify it under the terms of the GNU
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * General Public License (GPL) as published by the Free Software
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * Foundation, in version 2 as it comes in the "COPYING" file of the
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering// constructor / destructor
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering/////////////////////////////////////////////////////////////////////////////
c73ce96b569e2f10dff64b7dc0bd271972674c2aLennart Poettering const ComObjPtr<EventSource> pEventSource;
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering /* Enclose the state transition Ready->InUninit->NotReady */
3cb10d3a0b1b6a7c44f307f2abb5215104e16941Lennart PoetteringHRESULT NATNetwork::init(VirtualBox *aVirtualBox, IN_BSTR aName)
ad867662936a4c7ab2c7116d804c272338801231Lennart Poettering AssertReturn(aName != NULL, E_INVALIDARG);
f3abbe25403444688e1a1a23b9dbcc9aeefc0507Lennart Poettering /* share VirtualBox weakly (parent remains NULL so far) */
8b757a38611006a751c90933d1810cccaa47e1afDaniel Mack HRESULT hrc = unconst(m->pEventSource).createObject();
3cb10d3a0b1b6a7c44f307f2abb5215104e16941Lennart Poettering hrc = m->pEventSource->init(static_cast<INATNetwork *>(this));
3cb10d3a0b1b6a7c44f307f2abb5215104e16941Lennart Poettering /* Confirm a successful initialization */
f0258e473667f44f4656dde49597b2badb9f598aLennart PoetteringHRESULT NATNetwork::init(VirtualBox *aVirtualBox,
f0258e473667f44f4656dde49597b2badb9f598aLennart Poettering /* Enclose the state transition NotReady->InInit->Ready */
3cb10d3a0b1b6a7c44f307f2abb5215104e16941Lennart Poettering AssertReturn(autoInitSpan.isOk(), E_FAIL);
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering /* share VirtualBox weakly (parent remains NULL so far) */
24710c48ed16be5fa461fbb303a744a907541dafLennart Poettering m->fAdvertiseDefaultIPv6Route = data.fAdvertiseDefaultIPv6Route;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering m->fNeedDhcpServer = data.fNeedDhcpServer;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* IPv4 port-forward rules */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering for (settings::NATRuleList::const_iterator it = data.llPortForwardRules4.begin();
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering it != data.llPortForwardRules4.end(); ++it)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering m->mapName2PortForwardRule4.insert(std::make_pair(it->strName.c_str(), *it));
8af5b883227ac8dfa796742b9edcc1647a5d4d6cLennart Poettering /* IPv6 port-forward rules */
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering for (settings::NATRuleList::const_iterator it = data.llPortForwardRules6.begin();
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering it != data.llPortForwardRules6.end(); ++it)
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering m->mapName2PortForwardRule6.insert(std::make_pair(it->strName, *it));
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering HRESULT hrc = unconst(m->pEventSource).createObject();
a8812dd7f161a3e459c1730ac92ff2bbc9986ff1Lennart Poettering hrc = m->pEventSource->init(static_cast<INATNetwork *>(this));
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart PoetteringHRESULT NATNetwork::saveSettings(settings::NATNetwork &data)
2001c80560e3dae69e14fd994d3978c187af48b8Lennart Poettering if (FAILED(autoCaller.rc())) return autoCaller.rc();
d2579eec5e1b845b2cf29caddc951dc22f2abb91Lennart Poettering AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering data.fAdvertiseDefaultIPv6Route = RT_BOOL(m->fAdvertiseDefaultIPv6Route);
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poettering data.fNeedDhcpServer = RT_BOOL(m->fNeedDhcpServer);
d830ebbdf67d8cb32d33d8fdd47cf467fd6d3815Lennart Poettering /* saving ipv4 port-forward Rules*/
d830ebbdf67d8cb32d33d8fdd47cf467fd6d3815Lennart Poettering for (NATRuleMap::iterator it = m->mapName2PortForwardRule4.begin();
d830ebbdf67d8cb32d33d8fdd47cf467fd6d3815Lennart Poettering it != m->mapName2PortForwardRule4.end(); ++it)
d830ebbdf67d8cb32d33d8fdd47cf467fd6d3815Lennart Poettering data.llPortForwardRules4.push_back(it->second);
f3abbe25403444688e1a1a23b9dbcc9aeefc0507Lennart Poettering /* saving ipv6 port-forward Rules*/
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering for (NATRuleMap::iterator it = m->mapName2PortForwardRule6.begin();
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering it != m->mapName2PortForwardRule6.end(); ++it)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering data.llPortForwardRules4.push_back(it->second);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* XXX: should we do here a copy of params */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* XXX: should we unlock here? */
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering mVirtualBox->onNATNetworkSetting(mName.raw(),
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering data.fAdvertiseDefaultIPv6Route ? TRUE : FALSE,
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart PoetteringSTDMETHODIMP NATNetwork::COMGETTER(EventSource)(IEventSource ** aEventSource)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering CheckComArgOutPointerValid(aEventSource);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if (FAILED(autoCaller.rc())) return autoCaller.rc();
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering /* event source is const, no need to lock */
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering m->pEventSource.queryInterfaceTo(aEventSource);
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart PoetteringSTDMETHODIMP NATNetwork::COMGETTER(NetworkName) (BSTR *aName)
931851e8e492a4d2715e22dcde50a5e7ccef4b49Lennart Poettering if (FAILED(autoCaller.rc())) return autoCaller.rc();
106784ebb7b303ae471851100a773ad2aebf5b80Daniel MackSTDMETHODIMP NATNetwork::COMSETTER(NetworkName) (IN_BSTR aName)
51323288fc628a5cac50914df915545d685b793eLennart Poettering if (FAILED(autoCaller.rc())) return autoCaller.rc();
4e5bf5e15899de3f9d11c2ddfe9721d9f8b07a37Daniel Mack AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
106784ebb7b303ae471851100a773ad2aebf5b80Daniel Mack AutoWriteLock vboxLock(mVirtualBox COMMA_LOCKVAL_SRC_POS);
return rc;
return S_OK;
#ifdef NAT_XML_SERIALIZATION
return rc;
return S_OK;
return S_OK;
#ifdef NAT_XML_SERIALIZATION
return rc;
return S_OK;
#ifdef NAT_XML_SERIALIZATION
return rc;
return S_OK;
#ifdef NAT_XML_SERIALIZATION
return rc;
STDMETHODIMP NATNetwork::COMGETTER(AdvertiseDefaultIPv6RouteEnabled)(BOOL *aAdvertiseDefaultIPv6Route)
return S_OK;
STDMETHODIMP NATNetwork::COMSETTER(AdvertiseDefaultIPv6RouteEnabled)(BOOL aAdvertiseDefaultIPv6Route)
#ifdef NAT_XML_SERIALIZATION
return rc;
return S_OK;
#ifdef NAT_XML_SERIALIZATION
return rc;
return S_OK;
return S_OK;
switch (aProto)
case NATProtocol_TCP:
case NATProtocol_UDP:
return E_INVALIDARG;
#ifdef NAT_XML_SERIALIZATION
return rc;
return E_INVALIDARG;
#ifdef NAT_XML_SERIALIZATION
return rc;
#ifdef VBOX_WITH_NAT_SERVICE
if (m->fNeedDhcpServer)
switch (rc)
case E_INVALIDARG:
return E_FAIL;
upperip);
case S_OK:
return E_FAIL;
return E_FAIL;
return S_OK;
else return E_FAIL;
#ifdef VBOX_WITH_NAT_SERVICE
return S_OK;
else return E_FAIL;
void NATNetwork::GetPortForwardRulesFromMap(ComSafeArrayOut(BSTR, aPortForwardRules), NATRuleMap& aRules)
size_t i = 0;
r.u16HostPort,
r.u16GuestPort);
&network,
&netmask);
if (m->fNeedDhcpServer)
LogFunc(("network: %RTnaipv4, dhcpserver:%RTnaipv4, dhcplowerip:%RTnaipv4, dhcpupperip:%RTnaipv4\n",
dhcpupperip));
return VINF_SUCCESS;