NATNetworkImpl.cpp revision f98c5a21f7e8e4c698e3a6937c2798378d4664be
5b281ba489ca18f0380d7efc7a5108b606cce449vboxsync * INATNetwork implementation.
e64031e20c39650a7bc902a3e1aba613b9415deevboxsync * Copyright (C) 2013 Oracle Corporation
38856343f90103280eb83b5e697f9f618b407d83vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
38856343f90103280eb83b5e697f9f618b407d83vboxsync * available from http://www.virtualbox.org. This file is free software;
38856343f90103280eb83b5e697f9f618b407d83vboxsync * you can redistribute it and/or modify it under the terms of the GNU
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
38856343f90103280eb83b5e697f9f618b407d83vboxsync// constructor / destructor
38856343f90103280eb83b5e697f9f618b407d83vboxsync/////////////////////////////////////////////////////////////////////////////
10f18618390096a9c968016b6ca94d77b91618fbvboxsync virtual ~Data(){}
38856343f90103280eb83b5e697f9f618b407d83vboxsync settings::NATLoopbackOffsetList llNATLoopbackOffsetList;
38856343f90103280eb83b5e697f9f618b407d83vboxsync /* Enclose the state transition Ready->InUninit->NotReady */
38856343f90103280eb83b5e697f9f618b407d83vboxsyncHRESULT NATNetwork::init(VirtualBox *aVirtualBox, IN_BSTR aName)
38856343f90103280eb83b5e697f9f618b407d83vboxsync /* share VirtualBox weakly (parent remains NULL so far) */
38856343f90103280eb83b5e697f9f618b407d83vboxsync HRESULT hrc = unconst(m->pEventSource).createObject();
38856343f90103280eb83b5e697f9f618b407d83vboxsync hrc = m->pEventSource->init(static_cast<INATNetwork *>(this));
38856343f90103280eb83b5e697f9f618b407d83vboxsync /* Confirm a successful initialization */
38856343f90103280eb83b5e697f9f618b407d83vboxsync /* Enclose the state transition NotReady->InInit->Ready */
38856343f90103280eb83b5e697f9f618b407d83vboxsync /* share VirtualBox weakly (parent remains NULL so far) */
38856343f90103280eb83b5e697f9f618b407d83vboxsync m->fAdvertiseDefaultIPv6Route = data.fAdvertiseDefaultIPv6Route;
38856343f90103280eb83b5e697f9f618b407d83vboxsync m->llNATLoopbackOffsetList.assign(data.llHostLoopbackOffsetList.begin(),
38856343f90103280eb83b5e697f9f618b407d83vboxsync /* IPv4 port-forward rules */
38856343f90103280eb83b5e697f9f618b407d83vboxsync for (settings::NATRuleList::const_iterator it = data.llPortForwardRules4.begin();
38856343f90103280eb83b5e697f9f618b407d83vboxsync m->mapName2PortForwardRule4.insert(std::make_pair(it->strName.c_str(), *it));
38856343f90103280eb83b5e697f9f618b407d83vboxsync /* IPv6 port-forward rules */
e9a584ee0777ab2612e206eeec264ccb1a8ce333vboxsync for (settings::NATRuleList::const_iterator it = data.llPortForwardRules6.begin();
418b9db49fbc652ef9c3f030fdc0f1a322403d95vboxsync m->mapName2PortForwardRule6.insert(std::make_pair(it->strName, *it));
8f2f51347c7b5fe7c697debe7c2e46b46dd16489vboxsync HRESULT hrc = unconst(m->pEventSource).createObject();
38856343f90103280eb83b5e697f9f618b407d83vboxsync hrc = m->pEventSource->init(static_cast<INATNetwork *>(this));
38856343f90103280eb83b5e697f9f618b407d83vboxsyncHRESULT NATNetwork::saveSettings(settings::NATNetwork &data)
38856343f90103280eb83b5e697f9f618b407d83vboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
38856343f90103280eb83b5e697f9f618b407d83vboxsync data.fAdvertiseDefaultIPv6Route = RT_BOOL(m->fAdvertiseDefaultIPv6Route);
38856343f90103280eb83b5e697f9f618b407d83vboxsync data.fNeedDhcpServer = RT_BOOL(m->fNeedDhcpServer);
38856343f90103280eb83b5e697f9f618b407d83vboxsync /* saving ipv4 port-forward Rules*/
38856343f90103280eb83b5e697f9f618b407d83vboxsync for (NATRuleMap::iterator it = m->mapName2PortForwardRule4.begin();
c77e7bff89c7639353778366984d51ff165ea0e3vboxsync /* saving ipv6 port-forward Rules*/
38856343f90103280eb83b5e697f9f618b407d83vboxsync for (NATRuleMap::iterator it = m->mapName2PortForwardRule6.begin();
c77e7bff89c7639353778366984d51ff165ea0e3vboxsync data.llHostLoopbackOffsetList.assign(m->llNATLoopbackOffsetList.begin(),
38856343f90103280eb83b5e697f9f618b407d83vboxsync /* Notify listerners listening on this network only */
return S_OK;
return S_OK;
return S_OK;
return S_OK;
return S_OK;
return S_OK;
return S_OK;
return S_OK;
return S_OK;
return S_OK;
return S_OK;
return S_OK;
return S_OK;
return S_OK;
return S_OK;
return S_OK;
return S_OK;
return S_OK;
return S_OK;
return S_OK;
STDMETHODIMP NATNetwork::COMGETTER(AdvertiseDefaultIPv6RouteEnabled)(BOOL *aAdvertiseDefaultIPv6Route)
return S_OK;
STDMETHODIMP NATNetwork::COMSETTER(AdvertiseDefaultIPv6RouteEnabled)(BOOL aAdvertiseDefaultIPv6Route)
return S_OK;
return S_OK;
return S_OK;
return S_OK;
return S_OK;
size_t i = 0;
return S_OK;
return E_INVALIDARG;
return E_INVALIDARG;
return E_INVALIDARG;
return E_INVALIDARG;
return S_OK;
if (aLoopbackIp6 < 0)
return E_INVALIDARG;
return S_OK;
return S_OK;
return S_OK;
switch (aProto)
case NATProtocol_TCP:
case NATProtocol_UDP:
return E_INVALIDARG;
return S_OK;
: m->mapName2PortForwardRule4;
return E_INVALIDARG;
return S_OK;
#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;
return E_FAIL;
#ifdef VBOX_WITH_NAT_SERVICE
return S_OK;
return E_FAIL;
void NATNetwork::GetPortForwardRulesFromMap(ComSafeArrayOut(BSTR, aPortForwardRules), NATRuleMap& aRules)
size_t i = 0;
r.u16HostPort,
r.u16GuestPort);
&network,
&netmask);
bool skip = false;
++it)
skip = true;
if (skip)
if (!skip)
if (poff)
return VINF_SUCCESS;
&network,
&netmask);
if (m->fNeedDhcpServer)
if (m->fNeedDhcpServer)
return VINF_SUCCESS;