NATEngineImpl.cpp revision da6c95666f29b00894dfb9d110b74d9e1c4f1d46
/* $Id$ */
/** @file
* Implementation of INATEngine in VBoxSVC.
*/
/*
* Copyright (C) 2010-2013 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
#include "NATEngineImpl.h"
#include "AutoCaller.h"
#include "Logging.h"
#include "MachineImpl.h"
#include "GuestOSTypeImpl.h"
#include <VBox/settings.h>
struct NATEngineData
{
NATEngineData() : mMtu(0),
mSockRcv(0),
mSockSnd(0),
mTcpRcv(0),
mTcpSnd(0),
mAliasMode(0)
{}
/* TFTP service */
/* DNS service */
/* Alias service */
};
{
};
// constructor / destructor
////////////////////////////////////////////////////////////////////////////////
{
return BaseFinalConstruct();
}
void NATEngine::FinalRelease()
{
uninit();
}
{
AutoInitSpan autoInitSpan(this);
m_fModified = false;
return S_OK;
}
{
AutoInitSpan autoInitSpan(this);
{
}
return S_OK;
}
{
AutoInitSpan autoInitSpan(this);
{
}
return BaseFinalConstruct();
}
{
AutoUninitSpan autoUninitSpan(this);
if (autoUninitSpan.uninitDone())
return;
delete mData;
}
bool NATEngine::i_isModified()
{
bool fModified = m_fModified;
return fModified;
}
bool NATEngine::i_rollback()
{
AutoCaller autoCaller(this);
bool fChanged = m_fModified;
if (m_fModified)
{
/* we need to check all data to see whether anything will be changed
* after rollback */
}
m_fModified = false;
return fChanged;
}
{
AutoCaller autoCaller(this);
/* sanity too */
/* lock both for writing since we modify both (mPeer is "master" so locked
* first) */
if (m_fModified)
{
if (mPeer)
{
{
}
}
}
m_fModified = false;
}
HRESULT NATEngine::getNetworkSettings(ULONG *aMtu, ULONG *aSockSnd, ULONG *aSockRcv, ULONG *aTcpWndSnd, ULONG *aTcpWndRcv)
{
if (aMtu)
if (aSockSnd)
if (aSockRcv)
if (aTcpWndSnd)
if (aTcpWndRcv)
return S_OK;
}
HRESULT NATEngine::setNetworkSettings(ULONG aMtu, ULONG aSockSnd, ULONG aSockRcv, ULONG aTcpWndSnd, ULONG aTcpWndRcv)
{
|| aTcpWndSnd || aTcpWndRcv)
{
m_fModified = true;
}
if (aMtu)
if (aSockSnd)
if (aSockRcv)
if (aTcpWndSnd)
if (aTcpWndRcv)
if (m_fModified)
return S_OK;
}
{
size_t i = 0;
{
r.proto,
r.u16HostPort,
r.strGuestIP.c_str(),
r.u16GuestPort);
}
return S_OK;
}
HRESULT NATEngine::addRedirect(const com::Utf8Str &aName, NATProtocol_T aProto, const com::Utf8Str &aHostIP,
{
const char *proto;
switch (aProto)
{
case NATProtocol_TCP:
proto = "tcp";
break;
case NATProtocol_UDP:
proto = "udp";
break;
default:
return E_INVALIDARG;
}
{
return setError(E_INVALIDARG,
tr("A NAT rule of this name already exists"));
&& r.u16HostPort == aHostPort
return setError(E_INVALIDARG,
tr("A NAT rule for this host port and this host IP already exists"));
}
r.u16HostPort = aHostPort;
r.strGuestIP = aGuestIP;
r.u16GuestPort = aGuestPort;
m_fModified = true;
return S_OK;
}
{
return E_INVALIDARG;
m_fModified = true;
return S_OK;
}
{
AutoCaller autoCaller(this);
/* TFTP */
/* DNS */
/* Alias */
/* port forwarding */
{
}
m_fModified = false;
return rc;
}
{
AutoCaller autoCaller(this);
/* TFTP */
/* DNS */
/* Alias */
m_fModified = false;
return rc;
}
{
{
m_fModified = true;
}
return S_OK;
}
{
{
}
return S_OK;
}
{
{
m_fModified = true;
}
return S_OK;
}
{
return S_OK;
}
{
{
m_fModified = true;
}
return S_OK;
}
{
{
}
return S_OK;
}
{
{
m_fModified = true;
}
return S_OK;
}
{
{
}
return S_OK;
}
{
{
m_fModified = true;
}
return S_OK;
}
{
{
}
return S_OK;
}
/* DNS */
{
{
m_fModified = true;
}
return S_OK;
}
{
return S_OK;
}
{
{
m_fModified = true;
}
return S_OK;
}
{
return S_OK;
}
{
return S_OK;
}
{
{
m_fModified = true;
}
return S_OK;
}
{
{
m_fModified = true;
}
return S_OK;
}
{
return S_OK;
}