1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.apache.directory.server.dhcp.protocol;
22
23 import java.net.InetAddress;
24 import java.net.InetSocketAddress;
25
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.service.DhcpService;
29 import org.apache.mina.common.BroadcastIoSession;
30 import org.apache.mina.common.IdleStatus;
31 import org.apache.mina.common.IoHandler;
32 import org.apache.mina.common.IoSession;
33 import org.apache.mina.filter.codec.ProtocolCodecFilter;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
36
37
38
39
40
41
42
43
44
45 public class DhcpProtocolHandler implements IoHandler {
46 private static final Logger logger = LoggerFactory
47 .getLogger(DhcpProtocolHandler.class);
48
49
50
51
52 public static final int CLIENT_PORT = 68;
53
54
55
56
57 public static final int SERVER_PORT = 67;
58
59
60
61
62
63 private final DhcpService dhcpService;
64
65
66
67
68 public DhcpProtocolHandler(DhcpService service) {
69 this.dhcpService = service;
70 }
71
72 public void sessionCreated(IoSession session) throws Exception {
73 logger.debug("{} CREATED", session.getLocalAddress());
74 session.getFilterChain().addFirst("codec",
75 new ProtocolCodecFilter(new DhcpProtocolCodecFactory()));
76 }
77
78 public void sessionOpened(IoSession session) {
79 logger.debug("{} -> {} OPENED", session.getRemoteAddress(), session
80 .getLocalAddress());
81 }
82
83 public void sessionClosed(IoSession session) {
84 logger.debug("{} -> {} CLOSED", session.getRemoteAddress(), session
85 .getLocalAddress());
86 }
87
88 public void sessionIdle(IoSession session, IdleStatus status) {
89
90 }
91
92 public void exceptionCaught(IoSession session, Throwable cause) {
93 logger.error("EXCEPTION CAUGHT ", cause);
94 cause.printStackTrace(System.out);
95
96 session.close();
97 }
98
99 public void messageReceived(IoSession session, Object message)
100 throws Exception {
101 if (logger.isDebugEnabled())
102 logger.debug("{} -> {} RCVD: {} " + message, session.getRemoteAddress(),
103 session.getLocalAddress());
104
105 final DhcpMessage request = (DhcpMessage) message;
106
107 final DhcpMessage reply = dhcpService.getReplyFor(
108 (InetSocketAddress) session.getServiceAddress(),
109 (InetSocketAddress) session.getRemoteAddress(), request);
110
111 if (null != reply) {
112 final InetSocketAddress isa = determineMessageDestination(request, reply);
113 ((BroadcastIoSession) session).write(reply, isa);
114 }
115 }
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135 private InetSocketAddress determineMessageDestination(DhcpMessage request,
136 DhcpMessage reply) {
137
138 final MessageType mt = reply.getMessageType();
139 if (!isNullAddress(request.getRelayAgentAddress()))
140
141 return new InetSocketAddress(request.getRelayAgentAddress(), SERVER_PORT);
142 else if (null != mt && mt == MessageType.DHCPNAK)
143
144 return new InetSocketAddress("255.255.255.255", 68);
145 else
146 if (!isNullAddress(request.getCurrentClientAddress()))
147
148 return new InetSocketAddress(request.getCurrentClientAddress(),
149 CLIENT_PORT);
150 else
151 return new InetSocketAddress("255.255.255.255", 68);
152 }
153
154
155
156
157
158
159
160
161 private boolean isNullAddress(InetAddress addr) {
162 final byte a[] = addr.getAddress();
163 for (int i = 0; i < a.length; i++)
164 if (a[i] != 0)
165 return false;
166 return true;
167 }
168
169 public void messageSent(IoSession session, Object message) {
170 if (logger.isDebugEnabled())
171 logger.debug("{} -> {} SENT: " + message, session.getRemoteAddress(),
172 session.getLocalAddress());
173 }
174 }