1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.directory.server.dhcp.service;
20
21
22 import java.net.InetAddress;
23 import java.net.InetSocketAddress;
24 import java.util.Iterator;
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.options.DhcpOption;
29 import org.apache.directory.server.dhcp.options.OptionsField;
30 import org.apache.directory.server.dhcp.options.dhcp.ParameterRequestList;
31 import org.apache.directory.server.dhcp.options.dhcp.ServerIdentifier;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
34
35
36
37
38
39
40
41
42
43
44
45
46 public abstract class AbstractDhcpService implements DhcpService
47 {
48 private static final Logger LOGGER = LoggerFactory.getLogger( AbstractDhcpService.class );
49
50
51
52
53
54 public final DhcpMessage getReplyFor( InetSocketAddress localAddress,
55 InetSocketAddress clientAddress, DhcpMessage request )
56 throws DhcpException
57 {
58
59 if ( ( request.getOp() != DhcpMessage.OP_BOOTREQUEST )
60 && ( request.getOp() != DhcpMessage.OP_BOOTREPLY ) )
61 {
62 return null;
63 }
64
65
66 if ( null == request.getMessageType() )
67 {
68 LOGGER.warn( "Missing message type option - plain BOOTP not supported." );
69
70 return null;
71 }
72
73
74 switch ( request.getMessageType() )
75 {
76
77 case DHCPDISCOVER:
78 return handleDISCOVER( localAddress, clientAddress, request );
79
80 case DHCPREQUEST:
81 return handleREQUEST( localAddress, clientAddress, request );
82
83 case DHCPRELEASE:
84 return handleRELEASE( localAddress, clientAddress, request );
85
86 case DHCPINFORM:
87 return handleINFORM( localAddress, clientAddress, request );
88
89 case DHCPOFFER:
90 return handleOFFER( localAddress, clientAddress, request );
91
92
93 case DHCPDECLINE:
94 case DHCPACK:
95 case DHCPNAK:
96 return null;
97
98 default:
99 return handleUnknownMessage( clientAddress, request );
100 }
101 }
102
103
104
105
106
107
108
109
110
111
112
113 protected DhcpMessage handleUnknownMessage( InetSocketAddress clientAddress,
114 DhcpMessage request )
115 {
116 if ( LOGGER.isWarnEnabled() )
117 {
118 LOGGER.warn( "Got unknkown DHCP message: {} from: {}", request, clientAddress );
119 }
120
121 return null;
122 }
123
124
125
126
127
128
129
130
131
132
133
134 protected DhcpMessage handleINFORM( InetSocketAddress localAddress,
135 InetSocketAddress clientAddress, DhcpMessage request )
136 {
137 if ( LOGGER.isDebugEnabled() )
138 {
139 LOGGER.debug( "Got INFORM message: {} from: {}", request, clientAddress );
140 }
141
142 return null;
143 }
144
145
146
147
148
149
150
151
152
153
154
155 protected DhcpMessage handleRELEASE( InetSocketAddress localAddress,
156 InetSocketAddress clientAddress, DhcpMessage request ) throws DhcpException
157 {
158 if ( LOGGER.isDebugEnabled() )
159 {
160 LOGGER.debug( "Got RELEASE message: {} from: {}", request, clientAddress );
161 }
162 return null;
163 }
164
165
166
167
168
169
170
171
172
173
174
175 protected DhcpMessage handleREQUEST( InetSocketAddress localAddress,
176 InetSocketAddress clientAddress, DhcpMessage request ) throws DhcpException
177 {
178 if ( LOGGER.isDebugEnabled() )
179 {
180 LOGGER.debug( "Got REQUEST message: {} from: {}", request, clientAddress );
181 }
182
183 return null;
184 }
185
186
187
188
189
190
191
192
193
194
195
196
197 protected DhcpMessage handleDISCOVER( InetSocketAddress localAddress,
198 InetSocketAddress clientAddress, DhcpMessage request ) throws DhcpException
199 {
200 if ( LOGGER.isDebugEnabled() )
201 {
202 LOGGER.debug( "Got DISCOVER message: {} from: {}", request, clientAddress );
203 }
204
205 return null;
206 }
207
208
209
210
211
212
213
214
215
216
217
218
219 protected DhcpMessage handleOFFER( InetSocketAddress localAddress,
220 InetSocketAddress clientAddress, DhcpMessage request )
221 {
222 if ( LOGGER.isDebugEnabled() )
223 {
224 LOGGER.debug( "Got OFFER message: {} from: {}", request, clientAddress );
225 }
226
227 return null;
228 }
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247 protected final DhcpMessage initGeneralReply( InetSocketAddress localAddress,
248 DhcpMessage request )
249 {
250 DhcpMessager/dhcp/messages/DhcpMessage.html#DhcpMessage">DhcpMessage reply = new DhcpMessage();
251
252 reply.setOp( DhcpMessage.OP_BOOTREPLY );
253
254 reply.setHardwareAddress( request.getHardwareAddress() );
255 reply.setTransactionId( request.getTransactionId() );
256 reply.setFlags( request.getFlags() );
257 reply.setRelayAgentAddress( request.getRelayAgentAddress() );
258
259
260 reply.setServerHostname( localAddress.getHostName() );
261
262
263 reply.getOptions().add( new ServerIdentifier( localAddress.getAddress() ) );
264
265 return reply;
266 }
267
268
269
270
271
272
273
274
275 private boolean isZeroAddress( byte[] addr )
276 {
277 for ( int i = 0; i < addr.length; i++ )
278 {
279 if ( addr[i] != 0 )
280 {
281 return false;
282 }
283 }
284
285 return true;
286 }
287
288
289
290
291
292
293
294
295
296
297
298 protected final InetAddress determineSelectionBase(
299 InetSocketAddress clientAddress, DhcpMessage request )
300 {
301
302
303
304
305
306
307 if ( !isZeroAddress( request.getRelayAgentAddress().getAddress() ) )
308 {
309 return request.getRelayAgentAddress();
310 }
311
312 return clientAddress.getAddress();
313 }
314
315
316
317
318
319
320
321
322
323 protected final void stripUnwantedOptions( DhcpMessage request,
324 OptionsField options )
325 {
326 ParameterRequestList../../org/apache/directory/server/dhcp/options/dhcp/ParameterRequestList.html#ParameterRequestList">ParameterRequestList prl = ( ParameterRequestList ) request
327 .getOptions().get( ParameterRequestList.class );
328
329 if ( null != prl )
330 {
331 byte[] list = prl.getData();
332
333 for ( Iterator i = options.iterator(); i.hasNext(); )
334 {
335 DhcpOption../../../../../../org/apache/directory/server/dhcp/options/DhcpOption.html#DhcpOption">DhcpOption o = ( DhcpOption ) i.next();
336
337 boolean found = false;
338
339 for ( int j = 0; j < list.length; j++ )
340 {
341 if ( list[j] == o.getTag() )
342 {
343 found = true;
344 break;
345 }
346 }
347
348 if ( !found )
349 {
350 i.remove();
351 }
352 }
353 }
354 }
355 }