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 import java.net.InetAddress;
22 import java.net.InetSocketAddress;
23 import java.util.Iterator;
24
25 import org.apache.directory.server.dhcp.DhcpException;
26 import org.apache.directory.server.dhcp.messages.DhcpMessage;
27 import org.apache.directory.server.dhcp.messages.MessageType;
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 private static final Logger logger = LoggerFactory
48 .getLogger(AbstractDhcpService.class);
49
50
51
52
53 public final DhcpMessage getReplyFor(InetSocketAddress localAddress,
54 InetSocketAddress clientAddress, DhcpMessage request)
55 throws DhcpException {
56
57 if (request.getOp() != DhcpMessage.OP_BOOTREQUEST
58 && request.getOp() != DhcpMessage.OP_BOOTREPLY)
59 return null;
60
61
62 if (null == request.getMessageType()) {
63 logger.warn("Missing message type option - plain BOOTP not supported.");
64 return null;
65 }
66
67
68 switch (request.getMessageType().getCode()){
69
70 case MessageType.CODE_DHCPDISCOVER :
71 return handleDISCOVER(localAddress, clientAddress, request);
72 case MessageType.CODE_DHCPREQUEST :
73 return handleREQUEST(localAddress, clientAddress, request);
74 case MessageType.CODE_DHCPRELEASE :
75 return handleRELEASE(localAddress, clientAddress, request);
76 case MessageType.CODE_DHCPINFORM :
77 return handleINFORM(localAddress, clientAddress, request);
78
79 case MessageType.CODE_DHCPOFFER :
80 return handleOFFER(localAddress, clientAddress, request);
81
82
83 case MessageType.CODE_DHCPDECLINE :
84 case MessageType.CODE_DHCPACK :
85 case MessageType.CODE_DHCPNAK :
86 return null;
87
88 default :
89 return handleUnknownMessage(clientAddress, request);
90 }
91 }
92
93
94
95
96
97
98
99
100
101
102 protected DhcpMessage handleUnknownMessage(InetSocketAddress clientAddress,
103 DhcpMessage request) {
104 if (logger.isWarnEnabled())
105 logger.warn("Got unknkown DHCP message: " + request + " from: "
106 + clientAddress);
107 return null;
108 }
109
110
111
112
113
114
115
116
117
118
119 protected DhcpMessage handleINFORM(InetSocketAddress localAddress,
120 InetSocketAddress clientAddress, DhcpMessage request)
121 throws DhcpException {
122 if (logger.isDebugEnabled())
123 logger.debug("Got INFORM message: " + request + " from: "
124 + clientAddress);
125 return null;
126 }
127
128
129
130
131
132
133
134
135
136
137 protected DhcpMessage handleRELEASE(InetSocketAddress localAddress,
138 InetSocketAddress clientAddress, DhcpMessage request)
139 throws DhcpException {
140 if (logger.isDebugEnabled())
141 logger.debug("Got RELEASE message: " + request + " from: "
142 + clientAddress);
143 return null;
144 }
145
146
147
148
149
150
151
152
153
154
155 protected DhcpMessage handleREQUEST(InetSocketAddress localAddress,
156 InetSocketAddress clientAddress, DhcpMessage request)
157 throws DhcpException {
158 if (logger.isDebugEnabled())
159 logger.debug("Got REQUEST message: " + request + " from: "
160 + clientAddress);
161 return null;
162 }
163
164
165
166
167
168
169
170
171
172
173
174 protected DhcpMessage handleDISCOVER(InetSocketAddress localAddress,
175 InetSocketAddress clientAddress, DhcpMessage request)
176 throws DhcpException {
177 if (logger.isDebugEnabled())
178 logger.debug("Got DISCOVER message: " + request + " from: "
179 + clientAddress);
180 return null;
181 }
182
183
184
185
186
187
188
189
190
191
192
193 protected DhcpMessage handleOFFER(InetSocketAddress localAddress,
194 InetSocketAddress clientAddress, DhcpMessage request)
195 throws DhcpException {
196 if (logger.isDebugEnabled())
197 logger
198 .debug("Got OFFER message: " + request + " from: " + clientAddress);
199 return null;
200 }
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218 protected final DhcpMessage initGeneralReply(InetSocketAddress localAddress,
219 DhcpMessage request) {
220 final DhcpMessage reply = new DhcpMessage();
221
222 reply.setOp(DhcpMessage.OP_BOOTREPLY);
223
224 reply.setHardwareAddress(request.getHardwareAddress());
225 reply.setTransactionId(request.getTransactionId());
226 reply.setFlags(request.getFlags());
227 reply.setRelayAgentAddress(request.getRelayAgentAddress());
228
229
230 reply.setServerHostname(localAddress.getHostName());
231
232
233 reply.getOptions().add(new ServerIdentifier(localAddress.getAddress()));
234
235 return reply;
236 }
237
238
239
240
241
242
243
244 private boolean isZeroAddress(byte[] addr) {
245 for (int i = 0; i < addr.length; i++)
246 if (addr[i] != 0)
247 return false;
248 return true;
249 }
250
251
252
253
254
255
256
257
258
259
260 protected final InetAddress determineSelectionBase(
261 InetSocketAddress clientAddress, DhcpMessage request) {
262
263
264
265
266
267
268 if (!isZeroAddress(request.getRelayAgentAddress().getAddress()))
269 return request.getRelayAgentAddress();
270
271 return clientAddress.getAddress();
272 }
273
274
275
276
277
278
279
280
281 protected final void stripUnwantedOptions(DhcpMessage request,
282 OptionsField options) {
283 final ParameterRequestList prl = (ParameterRequestList) request
284 .getOptions().get(ParameterRequestList.class);
285 if (null != prl) {
286 final byte[] list = prl.getData();
287 for (final Iterator i = options.iterator(); i.hasNext();) {
288 final DhcpOption o = (DhcpOption) i.next();
289 for (int j = 0; j < list.length; j++)
290 if (list[j] == o.getTag())
291 continue;
292 i.remove();
293 }
294 }
295 }
296 }