NATEngineImpl.cpp revision 474365bb5a844c1cf7183e37b637dfbfaf6eb7d1
/* $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, USHORT aHostPort, const com::Utf8Str &aGuestIP, USHORT aGuestPort)
{
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;
mParent->onNATRedirectRuleChange(ulSlot, FALSE, Bstr(name).raw(), aProto, Bstr(r.strHostIP).raw(), r.u16HostPort, Bstr(r.strGuestIP).raw(), r.u16GuestPort);
return S_OK;
}
{
return E_INVALIDARG;
m_fModified = true;
mParent->onNATRedirectRuleChange(ulSlot, TRUE, Bstr(aName).raw(), proto, Bstr(strHostIP).raw(), u16HostPort, Bstr(strGuestIP).raw(), u16GuestPort);
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;
}