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
49 public class StoreBasedDhcpService extends AbstractDhcpService
50 {
51 private final DhcpStore dhcpStore;
52
53
54 public StoreBasedDhcpService(DhcpStore dhcpStore)
55 {
56 this.dhcpStore = dhcpStore;
57 }
58
59
60
61
62
63
64
65
66
67
68
69 private Lease getExistingLease( InetSocketAddress clientAddress, DhcpMessage request ) throws DhcpException
70 {
71
72 IpAddressLeaseTime requestedLeaseTimeOption = ( IpAddressLeaseTime ) request.getOptions().get(
73 IpAddressLeaseTime.class );
74 long requestedLeaseTime = null != requestedLeaseTimeOption ? requestedLeaseTimeOption.getIntValue() * 1000
75 : -1L;
76
77
78 InetAddress requestedAddress = null;
79 AddressOption requestedAddressOption = ( AddressOption ) request.getOptions().get( RequestedIpAddress.class );
80 if ( null != requestedAddressOption )
81 requestedAddress = requestedAddressOption.getAddress();
82 if ( null == requestedAddress )
83 requestedAddress = request.getCurrentClientAddress();
84
85 InetAddress selectionBase = determineSelectionBase( clientAddress, request );
86
87 Lease lease = dhcpStore.getExistingLease( request.getHardwareAddress(), requestedAddress, selectionBase,
88 requestedLeaseTime, request.getOptions() );
89
90 if ( null == lease )
91 return null;
92
93 return lease;
94 }
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123 private Lease getLeaseOffer( InetSocketAddress clientAddress, DhcpMessage request ) throws DhcpException
124 {
125
126 IpAddressLeaseTime requestedLeaseTimeOption = ( IpAddressLeaseTime ) request.getOptions().get(
127 IpAddressLeaseTime.class );
128 long requestedLeaseTime = null != requestedLeaseTimeOption ? requestedLeaseTimeOption.getIntValue() * 1000
129 : -1L;
130
131
132 InetAddress requestedAddress = null;
133 AddressOption requestedAddressOption = ( AddressOption ) request.getOptions().get( RequestedIpAddress.class );
134 if ( null != requestedAddressOption )
135 requestedAddress = requestedAddressOption.getAddress();
136
137 InetAddress selectionBase = determineSelectionBase( clientAddress, request );
138
139 Lease lease = dhcpStore.getLeaseOffer( request.getHardwareAddress(), requestedAddress, selectionBase,
140 requestedLeaseTime, request.getOptions() );
141
142 return lease;
143 }
144
145
146
147
148
149
150
151 protected DhcpMessage handleRELEASE( InetSocketAddress localAddress, InetSocketAddress clientAddress,
152 DhcpMessage request ) throws DhcpException
153 {
154
155 AddressOption serverIdentOption = ( AddressOption ) request.getOptions().get( ServerIdentifier.class );
156 if ( null != serverIdentOption && serverIdentOption.getAddress().isAnyLocalAddress() )
157 return null;
158
159 Lease lease = getExistingLease( clientAddress, request );
160
161 DhcpMessage reply = initGeneralReply( localAddress, request );
162
163 if ( null == lease )
164 {
165
166
167 reply.setMessageType( MessageType.DHCPNAK );
168 reply.setCurrentClientAddress( null );
169 reply.setAssignedClientAddress( null );
170 reply.setNextServerAddress( null );
171 }
172 else
173 {
174 dhcpStore.releaseLease( lease );
175
176
177
178 reply.getOptions().merge( lease.getOptions() );
179
180 reply.setAssignedClientAddress( lease.getClientAddress() );
181 reply.setNextServerAddress( lease.getNextServerAddress() );
182
183
184 OptionsField options = reply.getOptions();
185
186
187 options.remove( RequestedIpAddress.class );
188 options.remove( ParameterRequestList.class );
189 options.remove( ClientIdentifier.class );
190 options.remove( MaximumDhcpMessageSize.class );
191
192
193 options.add( new IpAddressLeaseTime( ( lease.getExpires() - System.currentTimeMillis() ) / 1000L ) );
194
195 stripUnwantedOptions( request, options );
196 }
197 return reply;
198
199 }
200
201
202
203
204
205
206 protected DhcpMessage handleDISCOVER( InetSocketAddress localAddress, InetSocketAddress clientAddress,
207 DhcpMessage request ) throws DhcpException
208 {
209 Lease lease = getLeaseOffer( clientAddress, request );
210
211
212 if ( null == lease )
213 return null;
214
215 DhcpMessage reply = initGeneralReply( localAddress, request );
216
217 reply.getOptions().merge( lease.getOptions() );
218
219 reply.setMessageType( MessageType.DHCPOFFER );
220
221 reply.setAssignedClientAddress( lease.getClientAddress() );
222 reply.setNextServerAddress( lease.getNextServerAddress() );
223
224
225 OptionsField options = reply.getOptions();
226
227
228 options.remove( RequestedIpAddress.class );
229 options.remove( ParameterRequestList.class );
230 options.remove( ClientIdentifier.class );
231 options.remove( MaximumDhcpMessageSize.class );
232
233
234 options.add( new IpAddressLeaseTime( ( lease.getExpires() - System.currentTimeMillis() ) / 1000L ) );
235
236 stripUnwantedOptions( request, options );
237
238 return reply;
239 }
240
241
242
243
244
245
246 protected DhcpMessage handleREQUEST( InetSocketAddress localAddress, InetSocketAddress clientAddress,
247 DhcpMessage request ) throws DhcpException
248 {
249
250 AddressOption serverIdentOption = ( AddressOption ) request.getOptions().get( ServerIdentifier.class );
251 if ( null != serverIdentOption && serverIdentOption.getAddress().isAnyLocalAddress() )
252 return null;
253
254 Lease lease = getExistingLease( clientAddress, request );
255
256 DhcpMessage reply = initGeneralReply( localAddress, request );
257
258 if ( null == lease )
259 {
260
261 reply.setMessageType( MessageType.DHCPNAK );
262 reply.setCurrentClientAddress( null );
263 reply.setAssignedClientAddress( null );
264 reply.setNextServerAddress( null );
265 }
266 else
267 {
268
269 reply.getOptions().merge( lease.getOptions() );
270
271 reply.setAssignedClientAddress( lease.getClientAddress() );
272 reply.setNextServerAddress( lease.getNextServerAddress() );
273
274
275 OptionsField options = reply.getOptions();
276
277
278 options.remove( RequestedIpAddress.class );
279 options.remove( ParameterRequestList.class );
280 options.remove( ClientIdentifier.class );
281 options.remove( MaximumDhcpMessageSize.class );
282
283
284 options.add( new IpAddressLeaseTime( ( lease.getExpires() - System.currentTimeMillis() ) / 1000L ) );
285
286 stripUnwantedOptions( request, options );
287 }
288 return reply;
289 }
290 }