VirtualBox

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

Last change on this file since 18499 was 18208, checked in by vboxsync, 15 years ago

#3569: DHCP Server is now started from VBoxSVC and terminates with it.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.5 KB
Line 
1/* $Id: DHCPServerImpl.cpp 18208 2009-03-24 17:01:32Z 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 "Logging.h"
27
28#include <VBox/settings.h>
29
30// constructor / destructor
31/////////////////////////////////////////////////////////////////////////////
32
33DEFINE_EMPTY_CTOR_DTOR (DHCPServer)
34
35HRESULT DHCPServer::FinalConstruct()
36{
37 return S_OK;
38}
39
40void DHCPServer::FinalRelease()
41{
42 uninit ();
43}
44
45void DHCPServer::uninit()
46{
47 /* Enclose the state transition Ready->InUninit->NotReady */
48 AutoUninitSpan autoUninitSpan (this);
49 if (autoUninitSpan.uninitDone())
50 return;
51
52// /* we uninit children and reset mParent
53// * and VirtualBox::removeDependentChild() needs a write lock */
54// AutoMultiWriteLock2 alock (mVirtualBox->lockHandle(), this->treeLock());
55
56 mVirtualBox->removeDependentChild (this);
57
58 unconst (mVirtualBox).setNull();
59}
60
61HRESULT DHCPServer::init(VirtualBox *aVirtualBox, IN_BSTR aName)
62{
63 AssertReturn (aName != NULL, E_INVALIDARG);
64
65 AutoInitSpan autoInitSpan (this);
66 AssertReturn (autoInitSpan.isOk(), E_FAIL);
67
68 /* share VirtualBox weakly (parent remains NULL so far) */
69 unconst (mVirtualBox) = aVirtualBox;
70
71 unconst(mName) = aName;
72 m.IPAddress = "0.0.0.0";
73 m.networkMask = "0.0.0.0";
74 m.enabled = FALSE;
75 m.lowerIP = "0.0.0.0";
76 m.upperIP = "0.0.0.0";
77
78 /* register with VirtualBox early, since uninit() will
79 * unconditionally unregister on failure */
80 aVirtualBox->addDependentChild (this);
81
82 /* Confirm a successful initialization */
83 autoInitSpan.setSucceeded();
84
85 return S_OK;
86}
87
88HRESULT DHCPServer::init(VirtualBox *aVirtualBox, const settings::Key &aNode)
89{
90 using namespace settings;
91
92 /* Enclose the state transition NotReady->InInit->Ready */
93 AutoInitSpan autoInitSpan (this);
94 AssertReturn (autoInitSpan.isOk(), E_FAIL);
95
96 /* share VirtualBox weakly (parent remains NULL so far) */
97 unconst (mVirtualBox) = aVirtualBox;
98
99 aVirtualBox->addDependentChild (this);
100
101 unconst(mName) = aNode.stringValue ("networkName");
102 m.IPAddress = aNode.stringValue ("IPAddress");
103 m.networkMask = aNode.stringValue ("networkMask");
104 m.enabled = aNode.value <BOOL> ("enabled");
105 m.lowerIP = aNode.stringValue ("lowerIP");
106 m.upperIP = aNode.stringValue ("upperIP");
107
108 autoInitSpan.setSucceeded();
109
110 return S_OK;
111}
112
113HRESULT DHCPServer::saveSettings (settings::Key &aParentNode)
114{
115 using namespace settings;
116
117 AssertReturn (!aParentNode.isNull(), E_FAIL);
118
119 AutoCaller autoCaller (this);
120 CheckComRCReturnRC (autoCaller.rc());
121
122 AutoReadLock alock (this);
123
124 Key aNode = aParentNode.appendKey ("DHCPServer");
125 /* required */
126 aNode.setValue <Bstr> ("networkName", mName);
127 aNode.setValue <Bstr> ("IPAddress", m.IPAddress);
128 aNode.setValue <Bstr> ("networkMask", m.networkMask);
129 aNode.setValue <Bstr> ("lowerIP", m.lowerIP);
130 aNode.setValue <Bstr> ("upperIP", m.upperIP);
131 aNode.setValue <BOOL> ("enabled", m.enabled);
132
133 return S_OK;
134}
135
136STDMETHODIMP DHCPServer::COMGETTER(NetworkName) (BSTR *aName)
137{
138 CheckComArgOutPointerValid(aName);
139
140 AutoCaller autoCaller (this);
141 CheckComRCReturnRC (autoCaller.rc());
142
143 mName.cloneTo(aName);
144
145 return S_OK;
146}
147
148STDMETHODIMP DHCPServer::COMGETTER(Enabled) (BOOL *aEnabled)
149{
150 CheckComArgOutPointerValid(aEnabled);
151
152 AutoCaller autoCaller (this);
153 CheckComRCReturnRC (autoCaller.rc());
154
155 *aEnabled = m.enabled;
156
157 return S_OK;
158}
159
160STDMETHODIMP DHCPServer::COMSETTER(Enabled) (BOOL aEnabled)
161{
162 AutoCaller autoCaller (this);
163 CheckComRCReturnRC (autoCaller.rc());
164
165 /* VirtualBox::saveSettings() needs a write lock */
166 AutoMultiWriteLock2 alock (mVirtualBox, this);
167
168 m.enabled = aEnabled;
169
170 HRESULT rc = mVirtualBox->saveSettings();
171
172 return rc;
173}
174
175STDMETHODIMP DHCPServer::COMGETTER(IPAddress) (BSTR *aIPAddress)
176{
177 CheckComArgOutPointerValid(aIPAddress);
178
179 AutoCaller autoCaller (this);
180 CheckComRCReturnRC (autoCaller.rc());
181
182 m.IPAddress.cloneTo(aIPAddress);
183
184 return S_OK;
185}
186
187STDMETHODIMP DHCPServer::COMGETTER(NetworkMask) (BSTR *aNetworkMask)
188{
189 CheckComArgOutPointerValid(aNetworkMask);
190
191 AutoCaller autoCaller (this);
192 CheckComRCReturnRC (autoCaller.rc());
193
194 m.networkMask.cloneTo(aNetworkMask);
195
196 return S_OK;
197}
198
199STDMETHODIMP DHCPServer::COMGETTER(LowerIP) (BSTR *aIPAddress)
200{
201 CheckComArgOutPointerValid(aIPAddress);
202
203 AutoCaller autoCaller (this);
204 CheckComRCReturnRC (autoCaller.rc());
205
206 m.lowerIP.cloneTo(aIPAddress);
207
208 return S_OK;
209}
210
211STDMETHODIMP DHCPServer::COMGETTER(UpperIP) (BSTR *aIPAddress)
212{
213 CheckComArgOutPointerValid(aIPAddress);
214
215 AutoCaller autoCaller (this);
216 CheckComRCReturnRC (autoCaller.rc());
217
218 m.upperIP.cloneTo(aIPAddress);
219
220 return S_OK;
221}
222
223STDMETHODIMP DHCPServer::SetConfiguration (IN_BSTR aIPAddress, IN_BSTR aNetworkMask, IN_BSTR aLowerIP, IN_BSTR aUpperIP)
224{
225 AssertReturn (aIPAddress != NULL, E_INVALIDARG);
226 AssertReturn (aNetworkMask != NULL, E_INVALIDARG);
227 AssertReturn (aLowerIP != NULL, E_INVALIDARG);
228 AssertReturn (aUpperIP != NULL, E_INVALIDARG);
229
230 AutoCaller autoCaller (this);
231 CheckComRCReturnRC (autoCaller.rc());
232
233 /* VirtualBox::saveSettings() needs a write lock */
234 AutoMultiWriteLock2 alock (mVirtualBox, this);
235
236 m.IPAddress = aIPAddress;
237 m.networkMask = aNetworkMask;
238 m.lowerIP = aLowerIP;
239 m.upperIP = aUpperIP;
240
241 return mVirtualBox->saveSettings();
242}
243
244STDMETHODIMP DHCPServer::Start (IN_BSTR aNetworkName, IN_BSTR aTrunkName, IN_BSTR aTrunkType)
245{
246 /* Silently ignore attepmts to run disabled servers. */
247 if (!m.enabled)
248 return S_OK;
249
250 m.dhcp.setOption(DHCPCFG_NETNAME, Utf8Str(aNetworkName));
251 Bstr tmp(aTrunkName);
252 if (!tmp.isEmpty())
253 m.dhcp.setOption(DHCPCFG_TRUNKNAME, Utf8Str(tmp));
254 m.dhcp.setOption(DHCPCFG_TRUNKTYPE, Utf8Str(aTrunkType));
255 //temporary hack for testing
256 // DHCPCFG_NAME
257 char strMAC[13];
258 Guid guid;
259 guid.create();
260 RTStrPrintf (strMAC, sizeof(strMAC), "080027%02X%02X%02X",
261 guid.ptr()->au8[0], guid.ptr()->au8[1], guid.ptr()->au8[2]);
262 m.dhcp.setOption(DHCPCFG_MACADDRESS, strMAC);
263 m.dhcp.setOption(DHCPCFG_IPADDRESS, Utf8Str(m.IPAddress));
264 // DHCPCFG_LEASEDB,
265 // DHCPCFG_VERBOSE,
266 // DHCPCFG_GATEWAY,
267 m.dhcp.setOption(DHCPCFG_LOWERIP, Utf8Str(m.lowerIP));
268 m.dhcp.setOption(DHCPCFG_UPPERIP, Utf8Str(m.upperIP));
269 m.dhcp.setOption(DHCPCFG_NETMASK, Utf8Str(m.networkMask));
270
271 // DHCPCFG_HELP,
272 // DHCPCFG_VERSION,
273 // DHCPCFG_NOTOPT_MAXVAL
274 m.dhcp.setOption(DHCPCFG_BEGINCONFIG, "");
275
276 return RT_FAILURE(m.dhcp.start()) ? E_FAIL : S_OK;
277 //m.dhcp.detachFromServer(); /* need to do this to avoid server shutdown on runner destruction */
278}
279
280STDMETHODIMP DHCPServer::Stop (void)
281{
282 return RT_FAILURE(m.dhcp.stop()) ? E_FAIL : S_OK;
283}
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use