blob: 4996ae6c161674c90ae0d1cb47ae224807f40d6c [file] [log] [blame]
Yi Tsengca34e1d2017-07-18 16:16:25 -07001/*
2 * Copyright 2017-present Open Networking Laboratory
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package org.onlab.packet.dhcp;
18
19import com.google.common.collect.ImmutableList;
20import com.google.common.collect.Lists;
21import org.apache.commons.io.IOUtils;
22import org.junit.Test;
23import org.onlab.packet.DHCP6;
24import org.onlab.packet.Deserializer;
25import org.onlab.packet.Ip6Address;
26import org.onlab.packet.MacAddress;
27import org.onlab.packet.PacketTestUtils;
28
29import java.nio.ByteBuffer;
30import java.util.Collections;
31import java.util.List;
32
33import static org.junit.Assert.*;
34import static org.junit.Assert.assertNull;
35
36public class Dhcp6Test {
37 private static final String SOLICIT = "dhcp6_solicit.bin";
38 private static final String ADVERTISE = "dhcp6_advertise.bin";
39 private static final String REQUEST = "dhcp6_request.bin";
40 private static final String REPLY = "dhcp6_reply.bin";
41
42 private static final int XID_1 = 13346301;
43 private static final int XID_2 = 9807588;
44 private static final int IA_ID = 1;
45 private static final int T1_CLIENT = 3600;
46 private static final int T2_CLIENT = 5400;
47 private static final int T1_SERVER = 0;
48 private static final int T2_SERVER = 0;
49 private static final Ip6Address IA_ADDRESS = Ip6Address.valueOf("2000::201");
50 private static final int PREFFERRED_LT_SERVER = 375;
51 private static final int VALID_LT_SERVER = 600;
52 private static final int PREFFERRED_LT_REQ = 7200;
53 private static final int VALID_LT_REQ = 7500;
54 private static final MacAddress CLIENT_MAC = MacAddress.valueOf("00:bb:00:00:00:01");
55 private static final int CLIENT_DUID_TIME = 0x210016b4;
56
57
58 private Deserializer<DHCP6> deserializer = DHCP6.deserializer();
59
60
61 @Test
62 public void testDeserializeBadInput() throws Exception {
63 PacketTestUtils.testDeserializeBadInput(deserializer);
64 }
65
66 /**
67 * Truncated a simple DHCPv6 payload.
68 */
69 @Test
70 public void testDeserializeTruncated() throws Exception {
71 ByteBuffer bb = ByteBuffer.allocate(4);
72 bb.put(DHCP6.MsgType.REQUEST.value());
73 bb.put(new byte[]{0x00, 0x00});
74 PacketTestUtils.testDeserializeTruncated(deserializer, bb.array());
75 }
76
77 /**
78 * Test DHCPv6 solicit message.
79 *
80 * @throws Exception exception while deserialize the DHCPv6 payload
81 */
82 @Test
83 public void testDeserializeSolicit() throws Exception {
84 byte[] data = IOUtils.toByteArray(Dhcp6RelayTest.class.getResource(SOLICIT));
85 DHCP6 dhcp6 = DHCP6.deserializer().deserialize(data, 0, data.length);
86 assertEquals(dhcp6.getMsgType(), DHCP6.MsgType.SOLICIT.value());
87 assertEquals(dhcp6.getTransactionId(), XID_1);
88 assertEquals(dhcp6.getOptions().size(), 4);
89
90 // Client ID
91 Dhcp6Option option = dhcp6.getOptions().get(0);
92 assertTrue(option instanceof Dhcp6ClientIdOption);
93 Dhcp6ClientIdOption clientIdOption = (Dhcp6ClientIdOption) option;
94 assertEquals(clientIdOption.getCode(), DHCP6.OptionCode.CLIENTID.value());
95 assertEquals(clientIdOption.getLength(), 14);
96 assertEquals(clientIdOption.getDuid().getDuidType(), Dhcp6Duid.DuidType.DUID_LLT);
97 assertEquals(clientIdOption.getDuid().getHardwareType(), 1);
98 assertEquals(clientIdOption.getDuid().getDuidTime(), CLIENT_DUID_TIME);
99 assertArrayEquals(clientIdOption.getDuid().getLinkLayerAddress(), CLIENT_MAC.toBytes());
100
101 // ORO
102 option = dhcp6.getOptions().get(1);
103 assertEquals(option.getCode(), DHCP6.OptionCode.ORO.value());
104 assertEquals(option.getLength(), 8);
105 assertArrayEquals(option.getData(),
106 new byte[]{0, 23, 0, 24, 0, 39, 0, 31});
107
108 // ELAPSED_TIME
109 option = dhcp6.getOptions().get(2);
110 assertEquals(option.getCode(), DHCP6.OptionCode.ELAPSED_TIME.value());
111 assertEquals(option.getLength(), 2);
112 assertArrayEquals(option.getData(),
113 new byte[]{0, 0});
114
115 // IA NA
116 option = dhcp6.getOptions().get(3);
117 assertTrue(option instanceof Dhcp6IaNaOption);
118 Dhcp6IaNaOption iaNaOption = (Dhcp6IaNaOption) option;
119 assertEquals(iaNaOption.getCode(), DHCP6.OptionCode.IA_NA.value());
120 assertEquals(iaNaOption.getLength(), 12);
121 assertEquals(iaNaOption.getIaId(), IA_ID);
122 assertEquals(iaNaOption.getT1(), T1_CLIENT);
123 assertEquals(iaNaOption.getT2(), T2_CLIENT);
124 assertEquals(iaNaOption.getOptions().size(), 0);
125
126 assertArrayEquals(data, dhcp6.serialize());
127 }
128
129 /**
130 * Test serialize solicit message.
131 *
132 * @throws Exception exception while serialize the DHCPv6 payload
133 */
134 @Test
135 public void serializeSolicit() throws Exception {
136 DHCP6 dhcp6 = new DHCP6();
137 dhcp6.setMsgType(DHCP6.MsgType.SOLICIT.value());
138 dhcp6.setTransactionId(XID_1);
139 List<Dhcp6Option> options = Lists.newArrayList();
140
141 // Client ID
142 Dhcp6Duid duid = new Dhcp6Duid();
143 duid.setDuidType(Dhcp6Duid.DuidType.DUID_LLT);
144 duid.setHardwareType((short) 1);
145 duid.setDuidTime(CLIENT_DUID_TIME);
146 duid.setLinkLayerAddress(CLIENT_MAC.toBytes());
147 Dhcp6ClientIdOption clientIdOption = new Dhcp6ClientIdOption();
148 clientIdOption.setDuid(duid);
149 options.add(clientIdOption);
150
151 // Option request
152 Dhcp6Option option = new Dhcp6Option();
153 option.setCode(DHCP6.OptionCode.ORO.value());
154 option.setLength((short) 8);
155 option.setData(new byte[]{0, 23, 0, 24, 0, 39, 0, 31});
156 options.add(option);
157
158 // Elapsed Time
159 option = new Dhcp6Option();
160 option.setCode(DHCP6.OptionCode.ELAPSED_TIME.value());
161 option.setLength((short) 2);
162 option.setData(new byte[]{0, 0});
163 options.add(option);
164
165 // IA NA
166 Dhcp6IaNaOption iaNaOption = new Dhcp6IaNaOption();
167 iaNaOption.setIaId(IA_ID);
168 iaNaOption.setT1(T1_CLIENT);
169 iaNaOption.setT2(T2_CLIENT);
170 iaNaOption.setOptions(Collections.emptyList());
171 options.add(iaNaOption);
172 dhcp6.setOptions(options);
173
174
175 Dhcp6RelayOption relayOption = new Dhcp6RelayOption();
176 relayOption.setPayload(dhcp6);
177
178 assertArrayEquals(IOUtils.toByteArray(Dhcp6RelayTest.class.getResource(SOLICIT)),
179 dhcp6.serialize());
180 }
181
182 /**
183 * Test deserialize advertise message.
184 *
185 * @throws Exception exception while deserialize the DHCPv6 payload
186 */
187 @Test
188 public void deserializeAdvertise() throws Exception {
189 byte[] data = IOUtils.toByteArray(getClass().getResource(ADVERTISE));
190
191
192 DHCP6 dhcp6 = DHCP6.deserializer().deserialize(data, 0, data.length);
193 assertEquals(dhcp6.getMsgType(), DHCP6.MsgType.ADVERTISE.value());
194 assertEquals(dhcp6.getTransactionId(), XID_1);
195 assertEquals(dhcp6.getOptions().size(), 3);
196
197 // IA NA
198 Dhcp6Option option = dhcp6.getOptions().get(0);
199 assertTrue(option instanceof Dhcp6IaNaOption);
200 Dhcp6IaNaOption iaNaOption = (Dhcp6IaNaOption) option;
201 assertEquals(iaNaOption.getCode(), DHCP6.OptionCode.IA_NA.value());
202 assertEquals(iaNaOption.getLength(), 40);
203 assertEquals(iaNaOption.getIaId(), IA_ID);
204 assertEquals(iaNaOption.getT1(), T1_SERVER);
205 assertEquals(iaNaOption.getT2(), T2_SERVER);
206 assertEquals(iaNaOption.getOptions().size(), 1);
207
208 // IA Address (in IA NA)
209 assertTrue(iaNaOption.getOptions().get(0) instanceof Dhcp6IaAddressOption);
210 Dhcp6IaAddressOption iaAddressOption =
211 (Dhcp6IaAddressOption) iaNaOption.getOptions().get(0);
212 assertEquals(iaAddressOption.getIp6Address(), IA_ADDRESS);
213 assertEquals(iaAddressOption.getPreferredLifetime(), PREFFERRED_LT_SERVER);
214 assertEquals(iaAddressOption.getValidLifetime(), VALID_LT_SERVER);
215 assertNull(iaAddressOption.getOptions());
216
217 // Client ID
218 option = dhcp6.getOptions().get(1);
219 assertTrue(option instanceof Dhcp6ClientIdOption);
220 Dhcp6ClientIdOption clientIdOption = (Dhcp6ClientIdOption) option;
221 assertEquals(clientIdOption.getCode(), DHCP6.OptionCode.CLIENTID.value());
222 assertEquals(clientIdOption.getLength(), 14);
223 assertEquals(clientIdOption.getDuid().getDuidType(), Dhcp6Duid.DuidType.DUID_LLT);
224 assertEquals(clientIdOption.getDuid().getHardwareType(), 1);
225 assertEquals(clientIdOption.getDuid().getDuidTime(), CLIENT_DUID_TIME);
226 assertArrayEquals(clientIdOption.getDuid().getLinkLayerAddress(), CLIENT_MAC.toBytes());
227
228 // Server ID
229 option = dhcp6.getOptions().get(2);
230 assertEquals(option.getCode(), DHCP6.OptionCode.SERVERID.value());
231 assertEquals(option.getLength(), 14);
232 assertArrayEquals(option.getData(),
233 new byte[]{0, 1, 0, 1, 32, -1, -8, -17, 0, -103, 102, 0, 0, 1});
234
235 assertArrayEquals(data, dhcp6.serialize());
236 }
237
238 /**
239 * Test serialize advertise message.
240 *
241 * @throws Exception exception while serialize the DHCPv6 payload
242 */
243 @Test
244 public void serializeAdvertise() throws Exception {
245 DHCP6 dhcp6 = new DHCP6();
246 dhcp6.setMsgType(DHCP6.MsgType.ADVERTISE.value());
247 dhcp6.setTransactionId(XID_1);
248 List<Dhcp6Option> options = Lists.newArrayList();
249
250 // IA address
251 Dhcp6IaAddressOption iaAddressOption = new Dhcp6IaAddressOption();
252 iaAddressOption.setIp6Address(IA_ADDRESS);
253 iaAddressOption.setPreferredLifetime(PREFFERRED_LT_SERVER);
254 iaAddressOption.setValidLifetime(VALID_LT_SERVER);
255
256 // IA NA
257 Dhcp6IaNaOption iaNaOption = new Dhcp6IaNaOption();
258 iaNaOption.setIaId(IA_ID);
259 iaNaOption.setT1(T1_SERVER);
260 iaNaOption.setT2(T2_SERVER);
261 iaNaOption.setOptions(ImmutableList.of(iaAddressOption));
262 options.add(iaNaOption);
263
264 // Client ID
265 Dhcp6Duid duid = new Dhcp6Duid();
266 duid.setDuidType(Dhcp6Duid.DuidType.DUID_LLT);
267 duid.setHardwareType((short) 1);
268 duid.setDuidTime(CLIENT_DUID_TIME);
269 duid.setLinkLayerAddress(CLIENT_MAC.toBytes());
270 Dhcp6ClientIdOption clientIdOption = new Dhcp6ClientIdOption();
271 clientIdOption.setDuid(duid);
272 options.add(clientIdOption);
273
274 // Server ID
275 Dhcp6Option option = new Dhcp6Option();
276 option.setCode(DHCP6.OptionCode.SERVERID.value());
277 option.setLength((short) 14);
278 option.setData(new byte[]{0, 1, 0, 1, 32, -1, -8, -17, 0, -103, 102, 0, 0, 1});
279 options.add(option);
280
281 dhcp6.setOptions(options);
282
283 Dhcp6RelayOption relayOption = new Dhcp6RelayOption();
284 relayOption.setPayload(dhcp6);
285
286 assertArrayEquals(IOUtils.toByteArray(Dhcp6RelayTest.class.getResource(ADVERTISE)),
287 dhcp6.serialize());
288 }
289
290 /**
291 * Test deserialize request message.
292 *
293 * @throws Exception exception while deserialize the DHCPv6 payload
294 */
295 @Test
296 public void deserializeRequest() throws Exception {
297 byte[] data = IOUtils.toByteArray(getClass().getResource(REQUEST));
298 DHCP6 dhcp6 = DHCP6.deserializer().deserialize(data, 0, data.length);
299 assertEquals(dhcp6.getMsgType(), DHCP6.MsgType.REQUEST.value());
300 assertEquals(dhcp6.getTransactionId(), XID_2);
301 assertEquals(dhcp6.getOptions().size(), 5);
302
303 // Client ID
304 Dhcp6Option option = dhcp6.getOptions().get(0);
305 assertTrue(option instanceof Dhcp6ClientIdOption);
306 Dhcp6ClientIdOption clientIdOption = (Dhcp6ClientIdOption) option;
307 assertEquals(clientIdOption.getCode(), DHCP6.OptionCode.CLIENTID.value());
308 assertEquals(clientIdOption.getLength(), 14);
309 assertEquals(clientIdOption.getDuid().getDuidType(), Dhcp6Duid.DuidType.DUID_LLT);
310 assertEquals(clientIdOption.getDuid().getHardwareType(), 1);
311 assertEquals(clientIdOption.getDuid().getDuidTime(), CLIENT_DUID_TIME);
312 assertArrayEquals(clientIdOption.getDuid().getLinkLayerAddress(), CLIENT_MAC.toBytes());
313
314 // Server ID
315 option = dhcp6.getOptions().get(1);
316 assertEquals(option.getCode(), DHCP6.OptionCode.SERVERID.value());
317 assertEquals(option.getLength(), 14);
318 assertArrayEquals(option.getData(),
319 new byte[]{0, 1, 0, 1, 32, -1, -8, -17, 0, -103, 102, 0, 0, 1});
320
321 // Option Request
322 option = dhcp6.getOptions().get(2);
323 assertEquals(option.getCode(), DHCP6.OptionCode.ORO.value());
324 assertEquals(option.getLength(), 8);
325 assertArrayEquals(option.getData(), new byte[]{0, 23, 0, 24, 0, 39, 0, 31});
326
327 // ELAPSED_TIME
328 option = dhcp6.getOptions().get(3);
329 assertEquals(option.getCode(), DHCP6.OptionCode.ELAPSED_TIME.value());
330 assertEquals(option.getLength(), 2);
331 assertArrayEquals(option.getData(),
332 new byte[]{0, 0});
333
334 // IA NA
335 option = dhcp6.getOptions().get(4);
336 assertTrue(option instanceof Dhcp6IaNaOption);
337 Dhcp6IaNaOption iaNaOption = (Dhcp6IaNaOption) option;
338 assertEquals(iaNaOption.getCode(), DHCP6.OptionCode.IA_NA.value());
339 assertEquals(iaNaOption.getLength(), 40);
340 assertEquals(iaNaOption.getIaId(), IA_ID);
341 assertEquals(iaNaOption.getT1(), T1_CLIENT);
342 assertEquals(iaNaOption.getT2(), T2_CLIENT);
343 assertEquals(iaNaOption.getOptions().size(), 1);
344
345 // IA Address (in IA NA)
346 assertTrue(iaNaOption.getOptions().get(0) instanceof Dhcp6IaAddressOption);
347 Dhcp6IaAddressOption iaAddressOption =
348 (Dhcp6IaAddressOption) iaNaOption.getOptions().get(0);
349 assertEquals(iaAddressOption.getIp6Address(), IA_ADDRESS);
350 assertEquals(iaAddressOption.getPreferredLifetime(), PREFFERRED_LT_REQ);
351 assertEquals(iaAddressOption.getValidLifetime(), VALID_LT_REQ);
352 assertNull(iaAddressOption.getOptions());
353
354 assertArrayEquals(data, dhcp6.serialize());
355 }
356
357 /**
358 * Test serialize request message.
359 *
360 * @throws Exception exception while serialize the DHCPv6 payload
361 */
362 @Test
363 public void serializeRequest() throws Exception {
364 DHCP6 dhcp6 = new DHCP6();
365 dhcp6.setMsgType(DHCP6.MsgType.REQUEST.value());
366 dhcp6.setTransactionId(XID_2);
367 List<Dhcp6Option> options = Lists.newArrayList();
368
369 // Client ID
370 Dhcp6Duid duid = new Dhcp6Duid();
371 duid.setDuidType(Dhcp6Duid.DuidType.DUID_LLT);
372 duid.setHardwareType((short) 1);
373 duid.setDuidTime(CLIENT_DUID_TIME);
374 duid.setLinkLayerAddress(CLIENT_MAC.toBytes());
375 Dhcp6ClientIdOption clientIdOption = new Dhcp6ClientIdOption();
376 clientIdOption.setDuid(duid);
377 options.add(clientIdOption);
378
379 // Server ID
380 Dhcp6Option option = new Dhcp6Option();
381 option.setCode(DHCP6.OptionCode.SERVERID.value());
382 option.setLength((short) 14);
383 option.setData(new byte[]{0, 1, 0, 1, 32, -1, -8, -17, 0, -103, 102, 0, 0, 1});
384 options.add(option);
385
386 // Option request
387 option = new Dhcp6Option();
388 option.setCode(DHCP6.OptionCode.ORO.value());
389 option.setLength((short) 8);
390 option.setData(new byte[]{0, 23, 0, 24, 0, 39, 0, 31});
391 options.add(option);
392
393 // Elapsed Time
394 option = new Dhcp6Option();
395 option.setCode(DHCP6.OptionCode.ELAPSED_TIME.value());
396 option.setLength((short) 2);
397 option.setData(new byte[]{0, 0});
398 options.add(option);
399
400 // IA address
401 Dhcp6IaAddressOption iaAddressOption = new Dhcp6IaAddressOption();
402 iaAddressOption.setIp6Address(IA_ADDRESS);
403 iaAddressOption.setPreferredLifetime(PREFFERRED_LT_REQ);
404 iaAddressOption.setValidLifetime(VALID_LT_REQ);
405
406 // IA NA
407 Dhcp6IaNaOption iaNaOption = new Dhcp6IaNaOption();
408 iaNaOption.setIaId(IA_ID);
409 iaNaOption.setT1(T1_CLIENT);
410 iaNaOption.setT2(T2_CLIENT);
411 iaNaOption.setOptions(ImmutableList.of(iaAddressOption));
412 options.add(iaNaOption);
413
414 dhcp6.setOptions(options);
415
416 Dhcp6RelayOption relayOption = new Dhcp6RelayOption();
417 relayOption.setPayload(dhcp6);
418
419 assertArrayEquals(IOUtils.toByteArray(Dhcp6RelayTest.class.getResource(REQUEST)),
420 dhcp6.serialize());
421 }
422
423 /**
424 * Test deserialize relay message with reply message.
425 *
426 * @throws Exception exception while deserialize the DHCPv6 payload
427 */
428 @Test
429 public void deserializeReply() throws Exception {
430 byte[] data = IOUtils.toByteArray(getClass().getResource(REPLY));
431
432 DHCP6 dhcp6 = DHCP6.deserializer().deserialize(data, 0, data.length);
433 assertEquals(dhcp6.getMsgType(), DHCP6.MsgType.REPLY.value());
434 assertEquals(dhcp6.getTransactionId(), XID_2);
435 assertEquals(dhcp6.getOptions().size(), 3);
436
437 // IA NA
438 Dhcp6Option option = dhcp6.getOptions().get(0);
439 assertTrue(option instanceof Dhcp6IaNaOption);
440 Dhcp6IaNaOption iaNaOption = (Dhcp6IaNaOption) option;
441 assertEquals(iaNaOption.getCode(), DHCP6.OptionCode.IA_NA.value());
442 assertEquals(iaNaOption.getLength(), 40);
443 assertEquals(iaNaOption.getIaId(), IA_ID);
444 assertEquals(iaNaOption.getT1(), T1_SERVER);
445 assertEquals(iaNaOption.getT2(), T2_SERVER);
446 assertEquals(iaNaOption.getOptions().size(), 1);
447
448 // IA Address (in IA NA)
449 assertTrue(iaNaOption.getOptions().get(0) instanceof Dhcp6IaAddressOption);
450 Dhcp6IaAddressOption iaAddressOption =
451 (Dhcp6IaAddressOption) iaNaOption.getOptions().get(0);
452 assertEquals(iaAddressOption.getIp6Address(), IA_ADDRESS);
453 assertEquals(iaAddressOption.getPreferredLifetime(), PREFFERRED_LT_SERVER);
454 assertEquals(iaAddressOption.getValidLifetime(), VALID_LT_SERVER);
455 assertNull(iaAddressOption.getOptions());
456
457 // Client ID
458 option = dhcp6.getOptions().get(1);
459 assertTrue(option instanceof Dhcp6ClientIdOption);
460 Dhcp6ClientIdOption clientIdOption = (Dhcp6ClientIdOption) option;
461 assertEquals(clientIdOption.getCode(), DHCP6.OptionCode.CLIENTID.value());
462 assertEquals(clientIdOption.getLength(), 14);
463 assertEquals(clientIdOption.getDuid().getDuidType(), Dhcp6Duid.DuidType.DUID_LLT);
464 assertEquals(clientIdOption.getDuid().getHardwareType(), 1);
465 assertEquals(clientIdOption.getDuid().getDuidTime(), CLIENT_DUID_TIME);
466 assertArrayEquals(clientIdOption.getDuid().getLinkLayerAddress(), CLIENT_MAC.toBytes());
467
468 // Server ID
469 option = dhcp6.getOptions().get(2);
470 assertEquals(option.getCode(), DHCP6.OptionCode.SERVERID.value());
471 assertEquals(option.getLength(), 14);
472 assertArrayEquals(option.getData(),
473 new byte[]{0, 1, 0, 1, 32, -1, -8, -17, 0, -103, 102, 0, 0, 1});
474
475 assertArrayEquals(data, dhcp6.serialize());
476 }
477
478 @Test
479 public void serializeReply() throws Exception {
480 DHCP6 dhcp6 = new DHCP6();
481 dhcp6.setMsgType(DHCP6.MsgType.REPLY.value());
482 dhcp6.setTransactionId(XID_2);
483 List<Dhcp6Option> options = Lists.newArrayList();
484
485 // IA address
486 Dhcp6IaAddressOption iaAddressOption = new Dhcp6IaAddressOption();
487 iaAddressOption.setIp6Address(IA_ADDRESS);
488 iaAddressOption.setPreferredLifetime(PREFFERRED_LT_SERVER);
489 iaAddressOption.setValidLifetime(VALID_LT_SERVER);
490
491 // IA NA
492 Dhcp6IaNaOption iaNaOption = new Dhcp6IaNaOption();
493 iaNaOption.setIaId(IA_ID);
494 iaNaOption.setT1(T1_SERVER);
495 iaNaOption.setT2(T2_SERVER);
496 iaNaOption.setOptions(ImmutableList.of(iaAddressOption));
497 options.add(iaNaOption);
498
499 // Client ID
500 Dhcp6Duid duid = new Dhcp6Duid();
501 duid.setDuidType(Dhcp6Duid.DuidType.DUID_LLT);
502 duid.setHardwareType((short) 1);
503 duid.setDuidTime(CLIENT_DUID_TIME);
504 duid.setLinkLayerAddress(CLIENT_MAC.toBytes());
505 Dhcp6ClientIdOption clientIdOption = new Dhcp6ClientIdOption();
506 clientIdOption.setDuid(duid);
507 options.add(clientIdOption);
508
509 // Server ID
510 Dhcp6Option option = new Dhcp6Option();
511 option.setCode(DHCP6.OptionCode.SERVERID.value());
512 option.setLength((short) 14);
513 option.setData(new byte[]{0, 1, 0, 1, 32, -1, -8, -17, 0, -103, 102, 0, 0, 1});
514 options.add(option);
515
516 dhcp6.setOptions(options);
517
518 Dhcp6RelayOption relayOption = new Dhcp6RelayOption();
519 relayOption.setPayload(dhcp6);
520
521 assertArrayEquals(IOUtils.toByteArray(Dhcp6RelayTest.class.getResource(REPLY)),
522 dhcp6.serialize());
523 }
524}