1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.directory.server.dhcp.service;
21
22
23 import java.net.InetAddress;
24 import java.net.InetSocketAddress;
25
26 import org.apache.directory.server.dhcp.DhcpException;
27 import org.apache.directory.server.dhcp.messages.DhcpMessage;
28 import org.apache.directory.server.dhcp.messages.MessageType;
29 import org.apache.directory.server.dhcp.options.AddressOption;
30 import org.apache.directory.server.dhcp.options.OptionsField;
31 import org.apache.directory.server.dhcp.options.dhcp.ClientIdentifier;
32 import org.apache.directory.server.dhcp.options.dhcp.IpAddressLeaseTime;
33 import org.apache.directory.server.dhcp.options.dhcp.MaximumDhcpMessageSize;
34 import org.apache.directory.server.dhcp.options.dhcp.ParameterRequestList;
35 import org.apache.directory.server.dhcp.options.dhcp.RequestedIpAddress;
36 import org.apache.directory.server.dhcp.options.dhcp.ServerIdentifier;
37 import org.apache.directory.server.dhcp.store.DhcpStore;
38
39
40
41
42
43
44
45
46
47
48 public class StoreBasedDhcpService extends AbstractDhcpService
49 {
50 private final DhcpStore dhcpStore;
51
52
53 public StoreBasedDhcpService( DhcpStore dhcpStore )
54 {
55 this.dhcpStore = dhcpStore;
56 }
57
58
59
60
61
62
63
64
65
66
67
68 private Lease getExistingLease( InetSocketAddress clientAddress, DhcpMessage request ) throws DhcpException
69 {
70
71 IpAddressLeaseTimerectory/server/dhcp/options/dhcp/IpAddressLeaseTime.html#IpAddressLeaseTime">IpAddressLeaseTime requestedLeaseTimeOption = ( IpAddressLeaseTime ) request.getOptions().get(
72 IpAddressLeaseTime.class );
73 long requestedLeaseTime = null != requestedLeaseTimeOption ? requestedLeaseTimeOption.getIntValue() * 1000
74 : -1L;
75
76
77 InetAddress requestedAddress = null;
78 AddressOptionache/directory/server/dhcp/options/AddressOption.html#AddressOption">AddressOption requestedAddressOption = ( AddressOption ) request.getOptions().get( RequestedIpAddress.class );
79
80 if ( null != requestedAddressOption )
81 {
82 requestedAddress = requestedAddressOption.getAddress();
83 }
84
85 if ( null == requestedAddress )
86 {
87 requestedAddress = request.getCurrentClientAddress();
88 }
89
90 InetAddress selectionBase = determineSelectionBase( clientAddress, request );
91
92 Lease lease = dhcpStore.getExistingLease( request.getHardwareAddress(), requestedAddress, selectionBase,
93 requestedLeaseTime, request.getOptions() );
94
95 if ( null == lease )
96 {
97 return null;
98 }
99
100 return lease;
101 }
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130 private Lease getLeaseOffer( InetSocketAddress clientAddress, DhcpMessage request ) throws DhcpException
131 {
132
133 IpAddressLeaseTimerectory/server/dhcp/options/dhcp/IpAddressLeaseTime.html#IpAddressLeaseTime">IpAddressLeaseTime requestedLeaseTimeOption = ( IpAddressLeaseTime ) request.getOptions().get(
134 IpAddressLeaseTime.class );
135 long requestedLeaseTime = null != requestedLeaseTimeOption ? requestedLeaseTimeOption.getIntValue() * 1000
136 : -1L;
137
138
139 InetAddress requestedAddress = null;
140 AddressOptionache/directory/server/dhcp/options/AddressOption.html#AddressOption">AddressOption requestedAddressOption = ( AddressOption ) request.getOptions().get( RequestedIpAddress.class );
141
142 if ( null != requestedAddressOption )
143 {
144 requestedAddress = requestedAddressOption.getAddress();
145 }
146
147 InetAddress selectionBase = determineSelectionBase( clientAddress, request );
148
149 return dhcpStore.getLeaseOffer( request.getHardwareAddress(), requestedAddress, selectionBase,
150 requestedLeaseTime, request.getOptions() );
151 }
152
153
154
155
156
157
158
159 @Override
160 protected DhcpMessage handleRELEASE( InetSocketAddress localAddress, InetSocketAddress clientAddress,
161 DhcpMessage request ) throws DhcpException
162 {
163
164 AddressOptionrg/apache/directory/server/dhcp/options/AddressOption.html#AddressOption">AddressOption serverIdentOption = ( AddressOption ) request.getOptions().get( ServerIdentifier.class );
165
166 if ( null != serverIdentOption && serverIdentOption.getAddress().isAnyLocalAddress() )
167 {
168 return null;
169 }
170
171 Lease lease = getExistingLease( clientAddress, request );
172
173 DhcpMessage reply = initGeneralReply( localAddress, request );
174
175 if ( null == lease )
176 {
177
178
179 reply.setMessageType( MessageType.DHCPNAK );
180 reply.setCurrentClientAddress( null );
181 reply.setAssignedClientAddress( null );
182 reply.setNextServerAddress( null );
183 }
184 else
185 {
186 dhcpStore.releaseLease( lease );
187
188
189
190 reply.getOptions().merge( lease.getOptions() );
191
192 reply.setAssignedClientAddress( lease.getClientAddress() );
193 reply.setNextServerAddress( lease.getNextServerAddress() );
194
195
196 OptionsField options = reply.getOptions();
197
198
199 options.remove( RequestedIpAddress.class );
200 options.remove( ParameterRequestList.class );
201 options.remove( ClientIdentifier.class );
202 options.remove( MaximumDhcpMessageSize.class );
203
204
205 options.add( new IpAddressLeaseTime( ( lease.getExpires() - System.currentTimeMillis() ) / 1000L ) );
206
207 stripUnwantedOptions( request, options );
208 }
209
210 return reply;
211
212 }
213
214
215
216
217
218
219 @Override
220 protected DhcpMessage handleDISCOVER( InetSocketAddress localAddress, InetSocketAddress clientAddress,
221 DhcpMessage request ) throws DhcpException
222 {
223 Lease lease = getLeaseOffer( clientAddress, request );
224
225
226 if ( null == lease )
227 {
228 return null;
229 }
230
231 DhcpMessage reply = initGeneralReply( localAddress, request );
232
233 reply.getOptions().merge( lease.getOptions() );
234
235 reply.setMessageType( MessageType.DHCPOFFER );
236
237 reply.setAssignedClientAddress( lease.getClientAddress() );
238 reply.setNextServerAddress( lease.getNextServerAddress() );
239
240
241 OptionsField options = reply.getOptions();
242
243
244 options.remove( RequestedIpAddress.class );
245 options.remove( ParameterRequestList.class );
246 options.remove( ClientIdentifier.class );
247 options.remove( MaximumDhcpMessageSize.class );
248
249
250 options.add( new IpAddressLeaseTime( ( lease.getExpires() - System.currentTimeMillis() ) / 1000L ) );
251
252 stripUnwantedOptions( request, options );
253
254 return reply;
255 }
256
257
258
259
260
261
262 @Override
263 protected DhcpMessage handleREQUEST( InetSocketAddress localAddress, InetSocketAddress clientAddress,
264 DhcpMessage request ) throws DhcpException
265 {
266
267 AddressOptionrg/apache/directory/server/dhcp/options/AddressOption.html#AddressOption">AddressOption serverIdentOption = ( AddressOption ) request.getOptions().get( ServerIdentifier.class );
268
269 if ( null != serverIdentOption && serverIdentOption.getAddress().isAnyLocalAddress() )
270 {
271 return null;
272 }
273
274 Lease lease = getExistingLease( clientAddress, request );
275
276 DhcpMessage reply = initGeneralReply( localAddress, request );
277
278 if ( null == lease )
279 {
280
281 reply.setMessageType( MessageType.DHCPNAK );
282 reply.setCurrentClientAddress( null );
283 reply.setAssignedClientAddress( null );
284 reply.setNextServerAddress( null );
285 }
286 else
287 {
288
289 reply.getOptions().merge( lease.getOptions() );
290
291 reply.setAssignedClientAddress( lease.getClientAddress() );
292 reply.setNextServerAddress( lease.getNextServerAddress() );
293
294
295 OptionsField options = reply.getOptions();
296
297
298 options.remove( RequestedIpAddress.class );
299 options.remove( ParameterRequestList.class );
300 options.remove( ClientIdentifier.class );
301 options.remove( MaximumDhcpMessageSize.class );
302
303
304 options.add( new IpAddressLeaseTime( ( lease.getExpires() - System.currentTimeMillis() ) / 1000L ) );
305
306 stripUnwantedOptions( request, options );
307 }
308 return reply;
309 }
310 }