VirtualBox

source: vbox/trunk/src/VBox/Main/DHCPServerImpl.cpp@ 25860

Last change on this file since 25860 was 25860, checked in by vboxsync, 14 years ago

Main: cleanup: get rid of VirtualBoxBaseProto, move AutoCaller*/*Span* classes out of VirtualBoxBaseProto class scope and into separate header; move CombinedProgress into separate header (it's only used by Console any more)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.1 KB
Line 
1/* $Id: DHCPServerImpl.cpp 25860 2010-01-15 13:27:26Z vboxsync $ */
2
3/** @file
4 *
5 * VirtualBox COM class implementation
6 */
7
8/*
9 * Copyright (C) 2006-2008 Sun Microsystems, Inc.
10 *
11 * This file is part of VirtualBox Open Source Edition (OSE), as
12 * available from http://www.virtualbox.org. This file is free software;
13 * you can redistribute it and/or modify it under the terms of the GNU
14 * General Public License (GPL) as published by the Free Software
15 * Foundation, in version 2 as it comes in the "COPYING" file of the
16 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
17 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
18 *
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
20 * Clara, CA 95054 USA or visit http://www.sun.com if you need
21 * additional information or have any questions.
22 */
23
24#include "DHCPServerRunner.h"
25#include "DHCPServerImpl.h"
26#include "AutoCaller.h"
27#include "Logging.h"
28
29#include <VBox/settings.h>
30
31#include "VirtualBoxImpl.h"
32
33// constructor / destructor
34/////////////////////////////////////////////////////////////////////////////
35
36DEFINE_EMPTY_CTOR_DTOR (DHCPServer)
37
38HRESULT DHCPServer::FinalConstruct()
39{
40 return S_OK;
41}
42
43void DHCPServer::FinalRelease()
44{
45 uninit ();
46}
47
48void DHCPServer::uninit()
49{
50 /* Enclose the state transition Ready->InUninit->NotReady */
51 AutoUninitSpan autoUninitSpan(this);
52 if (autoUninitSpan.uninitDone())
53 return;
54
55 unconst(mVirtualBox).setNull();
56}
57
58HRESULT DHCPServer::init(VirtualBox *aVirtualBox, IN_BSTR aName)
59{
60 AssertReturn(aName != NULL, E_INVALIDARG);
61
62 AutoInitSpan autoInitSpan(this);
63 AssertReturn(autoInitSpan.isOk(), E_FAIL);
64
65 /* share VirtualBox weakly (parent remains NULL so far) */
66 unconst(mVirtualBox) = aVirtualBox;
67
68 unconst(mName) = aName;
69 m.IPAddress = "0.0.0.0";
70 m.networkMask = "0.0.0.0";
71 m.enabled = FALSE;
72 m.lowerIP = "0.0.0.0";
73 m.upperIP = "0.0.0.0";
74
75 /* Confirm a successful initialization */
76 autoInitSpan.setSucceeded();
77
78 return S_OK;
79}
80
81HRESULT DHCPServer::init(VirtualBox *aVirtualBox,
82 const settings::DHCPServer &data)
83{
84 /* Enclose the state transition NotReady->InInit->Ready */
85 AutoInitSpan autoInitSpan(this);
86 AssertReturn(autoInitSpan.isOk(), E_FAIL);
87
88 /* share VirtualBox weakly (parent remains NULL so far) */
89 unconst(mVirtualBox) = aVirtualBox;
90
91 unconst(mName) = data.strNetworkName;
92 m.IPAddress = data.strIPAddress;
93 m.networkMask = data.strIPNetworkMask;
94 m.enabled = data.fEnabled;
95 m.lowerIP = data.strIPLower;
96 m.upperIP = data.strIPUpper;
97
98 autoInitSpan.setSucceeded();
99
100 return S_OK;
101}
102
103HRESULT DHCPServer::saveSettings(settings::DHCPServer &data)
104{
105 AutoCaller autoCaller(this);
106 if (FAILED(autoCaller.rc())) return autoCaller.rc();
107
108 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
109
110 data.strNetworkName = mName;
111 data.strIPAddress = m.IPAddress;
112 data.strIPNetworkMask = m.networkMask;
113 data.fEnabled = !!m.enabled;
114 data.strIPLower = m.lowerIP;
115 data.strIPUpper = m.upperIP;
116
117 return S_OK;
118}
119
120STDMETHODIMP DHCPServer::COMGETTER(NetworkName) (BSTR *aName)
121{
122 CheckComArgOutPointerValid(aName);
123
124 AutoCaller autoCaller(this);
125 if (FAILED(autoCaller.rc())) return autoCaller.rc();
126
127 mName.cloneTo(aName);
128
129 return S_OK;
130}
131
132STDMETHODIMP DHCPServer::COMGETTER(Enabled) (BOOL *aEnabled)
133{
134 CheckComArgOutPointerValid(aEnabled);
135
136 AutoCaller autoCaller(this);
137 if (FAILED(autoCaller.rc())) return autoCaller.rc();
138
139 *aEnabled = m.enabled;
140
141 return S_OK;
142}
143
144STDMETHODIMP DHCPServer::COMSETTER(Enabled) (BOOL aEnabled)
145{
146 AutoCaller autoCaller(this);
147 if (FAILED(autoCaller.rc())) return autoCaller.rc();
148
149 /* VirtualBox::saveSettings() needs a write lock */
150 AutoMultiWriteLock2 alock(mVirtualBox, this COMMA_LOCKVAL_SRC_POS);
151
152 m.enabled = aEnabled;
153
154 HRESULT rc = mVirtualBox->saveSettings();
155
156 return rc;
157}
158
159STDMETHODIMP DHCPServer::COMGETTER(IPAddress) (BSTR *aIPAddress)
160{
161 CheckComArgOutPointerValid(aIPAddress);
162
163 AutoCaller autoCaller(this);
164 if (FAILED(autoCaller.rc())) return autoCaller.rc();
165
166 m.IPAddress.cloneTo(aIPAddress);
167
168 return S_OK;
169}
170
171STDMETHODIMP DHCPServer::COMGETTER(NetworkMask) (BSTR *aNetworkMask)
172{
173 CheckComArgOutPointerValid(aNetworkMask);
174
175 AutoCaller autoCaller(this);
176 if (FAILED(autoCaller.rc())) return autoCaller.rc();
177
178 m.networkMask.cloneTo(aNetworkMask);
179
180 return S_OK;
181}
182
183STDMETHODIMP DHCPServer::COMGETTER(LowerIP) (BSTR *aIPAddress)
184{
185 CheckComArgOutPointerValid(aIPAddress);
186
187 AutoCaller autoCaller(this);
188 if (FAILED(autoCaller.rc())) return autoCaller.rc();
189
190 m.lowerIP.cloneTo(aIPAddress);
191
192 return S_OK;
193}
194
195STDMETHODIMP DHCPServer::COMGETTER(UpperIP) (BSTR *aIPAddress)
196{
197 CheckComArgOutPointerValid(aIPAddress);
198
199 AutoCaller autoCaller(this);
200 if (FAILED(autoCaller.rc())) return autoCaller.rc();
201
202 m.upperIP.cloneTo(aIPAddress);
203
204 return S_OK;
205}
206
207STDMETHODIMP DHCPServer::SetConfiguration (IN_BSTR aIPAddress, IN_BSTR aNetworkMask, IN_BSTR aLowerIP, IN_BSTR aUpperIP)
208{
209 AssertReturn(aIPAddress != NULL, E_INVALIDARG);
210 AssertReturn(aNetworkMask != NULL, E_INVALIDARG);
211 AssertReturn(aLowerIP != NULL, E_INVALIDARG);
212 AssertReturn(aUpperIP != NULL, E_INVALIDARG);
213
214 AutoCaller autoCaller(this);
215 if (FAILED(autoCaller.rc())) return autoCaller.rc();
216
217 /* VirtualBox::saveSettings() needs a write lock */
218 AutoMultiWriteLock2 alock(mVirtualBox, this COMMA_LOCKVAL_SRC_POS);
219
220 m.IPAddress = aIPAddress;
221 m.networkMask = aNetworkMask;
222 m.lowerIP = aLowerIP;
223 m.upperIP = aUpperIP;
224
225 return mVirtualBox->saveSettings();
226}
227
228STDMETHODIMP DHCPServer::Start(IN_BSTR aNetworkName, IN_BSTR aTrunkName, IN_BSTR aTrunkType)
229{
230 /* Silently ignore attepmts to run disabled servers. */
231 if (!m.enabled)
232 return S_OK;
233
234 m.dhcp.setOption(DHCPCFG_NETNAME, Utf8Str(aNetworkName), true);
235 Bstr tmp(aTrunkName);
236 if (!tmp.isEmpty())
237 m.dhcp.setOption(DHCPCFG_TRUNKNAME, Utf8Str(tmp), true);
238 m.dhcp.setOption(DHCPCFG_TRUNKTYPE, Utf8Str(aTrunkType), true);
239 //temporary hack for testing
240 // DHCPCFG_NAME
241 char strMAC[13];
242 Guid guid;
243 guid.create();
244 RTStrPrintf (strMAC, sizeof(strMAC), "080027%02X%02X%02X",
245 guid.ptr()->au8[0], guid.ptr()->au8[1], guid.ptr()->au8[2]);
246 m.dhcp.setOption(DHCPCFG_MACADDRESS, strMAC, true);
247 m.dhcp.setOption(DHCPCFG_IPADDRESS, Utf8Str(m.IPAddress), true);
248 // DHCPCFG_LEASEDB,
249 // DHCPCFG_VERBOSE,
250 // DHCPCFG_GATEWAY,
251 m.dhcp.setOption(DHCPCFG_LOWERIP, Utf8Str(m.lowerIP), true);
252 m.dhcp.setOption(DHCPCFG_UPPERIP, Utf8Str(m.upperIP), true);
253 m.dhcp.setOption(DHCPCFG_NETMASK, Utf8Str(m.networkMask), true);
254
255 // DHCPCFG_HELP,
256 // DHCPCFG_VERSION,
257 // DHCPCFG_NOTOPT_MAXVAL
258 m.dhcp.setOption(DHCPCFG_BEGINCONFIG, "", true);
259
260 return RT_FAILURE(m.dhcp.start()) ? E_FAIL : S_OK;
261 //m.dhcp.detachFromServer(); /* need to do this to avoid server shutdown on runner destruction */
262}
263
264STDMETHODIMP DHCPServer::Stop (void)
265{
266 return RT_FAILURE(m.dhcp.stop()) ? E_FAIL : S_OK;
267}
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use