2 * Copyright (c) 2014 Contextream, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.lispflowmapping.serializer;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertFalse;
13 import static org.junit.Assert.assertTrue;
15 import java.nio.ByteBuffer;
16 import java.util.ArrayList;
18 import junitx.framework.ArrayAssert;
20 import org.junit.Test;
21 import org.opendaylight.lispflowmapping.lisp.serializer.MapNotifySerializer;
22 import org.opendaylight.lispflowmapping.lisp.serializer.exception.LispSerializationException;
23 import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil;
24 import org.opendaylight.lispflowmapping.tools.junit.BaseTestCase;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MapNotify;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecord;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapnotifymessage.MapNotifyBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecord;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecord.Action;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecordBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.list.MappingRecordItem;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.list.MappingRecordItemBuilder;
34 public class MapNotifySerializationTest extends BaseTestCase {
37 public void serialize__Fields() throws Exception {
38 MapNotifyBuilder mnBuilder = new MapNotifyBuilder();
39 mnBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
40 mnBuilder.getMappingRecordItem().add(
41 new MappingRecordItemBuilder().setMappingRecord(
42 new MappingRecordBuilder().setEid(LispAddressUtil.asIpv4PrefixEid("0.0.0.1/32")).build())
44 mnBuilder.getMappingRecordItem().add(
45 new MappingRecordItemBuilder().setMappingRecord(
46 new MappingRecordBuilder().setEid(LispAddressUtil.asIpv4PrefixEid("0.0.0.73/32")).build())
49 mnBuilder.setNonce(6161616161L);
50 mnBuilder.setKeyId((short) 0x0001);
51 byte[] authenticationData = new byte[] { (byte) 0x16, (byte) 0x98, (byte) 0x96, (byte) 0xeb, (byte) 0x88,
52 (byte) 0x2d, (byte) 0x4d, (byte) 0x22, (byte) 0xe5, (byte) 0x8f, (byte) 0xe6, (byte) 0x89, (byte) 0x64,
53 (byte) 0xb9, (byte) 0x17, (byte) 0xa4, (byte) 0xba, (byte) 0x4e, (byte) 0x8c, (byte) 0x41 };
54 mnBuilder.setAuthenticationData(authenticationData);
56 ByteBuffer bb = MapNotifySerializer.getInstance().serialize(mnBuilder.build());
57 assertHexEquals((byte) 0x40, bb.get()); // Type + MSByte of reserved
58 assertEquals(0, bb.getShort()); // Rest of reserved
59 assertEquals(2, bb.get()); // Record Count
60 assertEquals(6161616161L, bb.getLong()); // Nonce
61 assertHexEquals((short) 0x0001, bb.getShort()); // Key ID
62 assertEquals(authenticationData.length, bb.getShort());
64 byte[] actualAuthenticationData = new byte[20];
65 bb.get(actualAuthenticationData);
66 ArrayAssert.assertEquals(authenticationData, actualAuthenticationData);
68 bb.position(bb.position() + 12); /* EID in first record */
69 assertEquals(0x1, bb.getInt());
71 bb.position(bb.position() + 12); /* EID in second record */
72 assertEquals(73, bb.getInt());
74 assertEquals(bb.position(), bb.capacity());
78 public void serialize__deserialize() throws Exception {
79 MapNotifyBuilder mnBuilder = new MapNotifyBuilder();
80 mnBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
81 mnBuilder.getMappingRecordItem().add(
82 new MappingRecordItemBuilder().setMappingRecord(
83 new MappingRecordBuilder().setEid(LispAddressUtil.asIpv4PrefixEid("0.0.0.1/32")).build())
85 mnBuilder.getMappingRecordItem().add(
86 new MappingRecordItemBuilder().setMappingRecord(
87 new MappingRecordBuilder().setEid(LispAddressUtil.asIpv4PrefixEid("0.0.0.73/32")).build())
90 mnBuilder.setNonce(6161616161L);
91 mnBuilder.setKeyId((short) 0x0001);
92 byte[] authenticationData = new byte[] { (byte) 0x16, (byte) 0x98, (byte) 0x96, (byte) 0xeb, (byte) 0x88,
93 (byte) 0x2d, (byte) 0x4d, (byte) 0x22, (byte) 0xe5, (byte) 0x8f, (byte) 0xe6, (byte) 0x89, (byte) 0x64,
94 (byte) 0xb9, (byte) 0x17, (byte) 0xa4, (byte) 0xba, (byte) 0x4e, (byte) 0x8c, (byte) 0x41 };
95 mnBuilder.setAuthenticationData(authenticationData);
97 MapNotify mn = mnBuilder.build();
98 ArrayAssert.assertEquals(MapNotifySerializer.getInstance().serialize(mn).array(),
99 MapNotifySerializer.getInstance().serialize(MapNotifySerializer.getInstance()
100 .deserialize(MapNotifySerializer.getInstance().serialize(mn))).array());
105 public void deserialize__AllFields() throws Exception {
106 // LISP(Type = 4 Map-Notify, I=1
108 // Nonce: (something)
110 // AuthDataLength: 00 Data:
111 // EID prefix: 153.16.254.1/32 (EID=0x9910FE01), TTL: 10, Authoritative,
113 // Local RLOC: 192.168.136.10 (RLOC=0xC0A8880A), Reachable,
114 // Priority/Weight: 1/100, Multicast Priority/Weight: 255/0
117 MapNotify mn = MapNotifySerializer.getInstance().deserialize(hexToByteBuffer("48 00 00 01 FF BB "
118 + "00 00 00 00 00 00 00 00 00 00 00 00 "
119 + "00 0a 01 20 10 00 00 00 00 01 99 10 fe 01 01 64 "
120 + "ff 00 00 05 00 01 c0 a8 88 0a "
121 + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 " // xTR-ID
122 + "00 00 00 00 00 00 00 01 " // Site-ID
126 assertTrue(mn.isXtrSiteIdPresent());
128 assertEquals(1, mn.getMappingRecordItem().size());
129 assertEquals(0xFFBB000000000000L, mn.getNonce().longValue());
130 assertEquals(0x0000, mn.getKeyId().shortValue());
131 byte[] expectedAuthenticationData = {};
132 ArrayAssert.assertEquals(expectedAuthenticationData, mn.getAuthenticationData());
136 public void serialize__NoAuthenticationData() throws Exception {
137 MapNotifyBuilder mnBuilder = new MapNotifyBuilder();
138 mnBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
139 mnBuilder.getMappingRecordItem().add(
140 new MappingRecordItemBuilder().setMappingRecord(
141 new MappingRecordBuilder().setEid(LispAddressUtil.asIpv4PrefixEid("0.0.0.1/32"))
142 .setRecordTtl(55).build()).build());
144 ByteBuffer bb = MapNotifySerializer.getInstance().serialize(mnBuilder.build());
145 bb.position(bb.position() + 14); // jump to AuthenticationDataLength
146 assertEquals(0, bb.getShort());
147 assertEquals(55, bb.getInt());
149 mnBuilder.setAuthenticationData(null);
151 bb = MapNotifySerializer.getInstance().serialize(mnBuilder.build());
152 bb.position(bb.position() + 14); // jump to AuthenticationDataLength
153 assertEquals(0, bb.getShort());
154 assertEquals(55, bb.getInt());
156 mnBuilder.setAuthenticationData(new byte[0]);
158 bb = MapNotifySerializer.getInstance().serialize(mnBuilder.build());
159 bb.position(bb.position() + 14); // jump to AuthenticationDataLength
160 assertEquals(0, bb.getShort());
161 assertEquals(55, bb.getInt());
165 public void serialize__NoPrefixInEidToLocator() throws Exception {
166 MapNotifyBuilder mnBuilder = new MapNotifyBuilder();
167 mnBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
168 mnBuilder.getMappingRecordItem().add(new MappingRecordItemBuilder().setMappingRecord(
169 new MappingRecordBuilder().build()).build());
170 mnBuilder.getMappingRecordItem().add(new MappingRecordItemBuilder().setMappingRecord
171 (new MappingRecordBuilder().setEid(null).build()).build());
172 mnBuilder.getMappingRecordItem().add(new MappingRecordItemBuilder().setMappingRecord(
173 new MappingRecordBuilder().setEid(LispAddressUtil.getNoAddressEid()).build()).build());
175 ByteBuffer bb = MapNotifySerializer.getInstance().serialize(mnBuilder.build());
176 bb.position(bb.position() + 16); // jump to first record prefix AFI
177 assertEquals(0, bb.getShort());
179 bb.position(bb.position() + 10); // jump to second record prefix AFI
180 assertEquals(0, bb.getShort());
182 bb.position(bb.position() + 10); // jump to third record prefix AFI
183 assertEquals(0, bb.getShort());
187 public void deserialize__MultipleRecords() throws Exception {
188 // LISP(Type = 4 Map-Notify, I=1
190 // EID prefixes: 153.16.254.1 -- 152.16.254.1 -- 151.16.254.1 --
192 // Local RLOCs: 192.168.136.10 -- 192.168.136.11 -- 192.168.136.12 --
195 MapNotify mn = MapNotifySerializer.getInstance().deserialize(hexToByteBuffer("40 00 00 "
196 + "04 " // Record count
197 + "FF BB 00 00 00 00 00 00 00 01 00 14 87 c1 33 cd "
198 + "d1 1e bc 80 fd 3e 71 11 81 17 40 74 26 25 44 bd "
199 + "00 00 00 0a 01 20 10 00 00 00 00 01 99 10 fe 01 01 64 " // Record
201 + "ff 00 00 05 00 01 c0 a8 88 0a " // contd
202 + "00 00 00 0a 01 20 10 00 00 00 00 01 98 10 fe 01 01 64 " // Record
204 + "ff 00 00 05 00 01 c0 a8 88 0b " // contd
205 + "00 00 00 0a 01 20 10 00 00 00 00 01 97 10 fe 01 01 64 " // Record
207 + "ff 00 00 05 00 01 c0 a8 88 0c " // contd
208 + "00 00 00 0a 01 20 10 00 00 00 00 01 96 10 fe 01 01 64 " // Record
210 + "ff 00 00 05 00 01 c0 a8 88 0d " // contd
213 assertEquals(4, mn.getMappingRecordItem().size());
214 assertEquals(LispAddressUtil.asIpv4PrefixEid("153.16.254.1/32"), mn.getMappingRecordItem().get(0)
215 .getMappingRecord().getEid());
216 assertEquals(LispAddressUtil.asIpv4PrefixEid("151.16.254.1/32"), mn.getMappingRecordItem().get(2)
217 .getMappingRecord().getEid());
218 assertEquals(LispAddressUtil.asIpv4Rloc("192.168.136.11"), mn.getMappingRecordItem().get(1)
219 .getMappingRecord().getLocatorRecord().get(0).getRloc());
220 assertEquals(LispAddressUtil.asIpv4Rloc("192.168.136.13"), mn.getMappingRecordItem().get(3)
221 .getMappingRecord().getLocatorRecord().get(0).getRloc());
225 public void deserialize__Locators() throws Exception {
226 MapNotify mn = MapNotifySerializer.getInstance().deserialize(hexToByteBuffer("40 00 01 01 "
227 + "FF BB 00 00 00 00 00 00 00 01 00 14 f1 b8 ab f0 "
228 + "66 bb 2e ef 12 70 74 46 6f 6b 8e ca bf 1e 68 40 "
230 + "03 " // Locator Count
231 + "20 10 00 00 00 00 01 99 10 fe 01 "
233 + "01 64 1f 00 " // priorities + weights
235 + "00 01 c0 a8 88 0a " // Locator
237 + "67 00 30 34 " // priorities + weights
239 + "00 01 cc aa AA 11 " // Locator
241 + "60 11 34 A4 " // priorities + weights
243 + "00 01 c0 a8 88 0a " // Locator
246 assertEquals(1, mn.getMappingRecordItem().size());
247 MappingRecordItem eidToLocator = mn.getMappingRecordItem().get(0);
248 assertEquals(3, eidToLocator.getMappingRecord().getLocatorRecord().size());
249 LocatorRecord loc0 = eidToLocator.getMappingRecord().getLocatorRecord().get(0);
250 LocatorRecord loc1 = eidToLocator.getMappingRecord().getLocatorRecord().get(1);
251 LocatorRecord loc2 = eidToLocator.getMappingRecord().getLocatorRecord().get(2);
252 assertEquals((byte) 0x01, loc0.getPriority().byteValue());
253 assertEquals((byte) 0x67, loc1.getPriority().byteValue());
254 assertEquals((byte) 0x60, loc2.getPriority().byteValue());
256 assertEquals((byte) 0x64, loc0.getWeight().byteValue());
257 assertEquals((byte) 0x00, loc1.getWeight().byteValue());
258 assertEquals((byte) 0x11, loc2.getWeight().byteValue());
260 assertEquals((byte) 0x1F, loc0.getMulticastPriority().byteValue());
261 assertEquals((byte) 0x30, loc1.getMulticastPriority().byteValue());
262 assertEquals((byte) 0x34, loc2.getMulticastPriority().byteValue());
264 assertEquals((byte) 0x00, loc0.getMulticastWeight().byteValue());
265 assertEquals((byte) 0x34, loc1.getMulticastWeight().byteValue());
266 assertEquals((byte) 0xA4, loc2.getMulticastWeight().byteValue());
268 assertTrue(loc0.isLocalLocator());
269 assertFalse(loc1.isLocalLocator());
270 assertFalse(loc2.isLocalLocator());
272 assertFalse(loc0.isRlocProbed());
273 assertTrue(loc1.isRlocProbed());
274 assertTrue(loc2.isRlocProbed());
276 assertTrue(loc0.isRouted());
277 assertFalse(loc1.isRouted());
278 assertTrue(loc2.isRouted());
280 assertEquals(LispAddressUtil.asIpv4Rloc("192.168.136.10"), loc0.getRloc());
281 assertEquals(LispAddressUtil.asIpv4Rloc("204.170.170.17"), loc1.getRloc());
285 public void deserialize__SomeEidToLocatorFiels() throws Exception {
286 // LISP(Type = 4 Map-Notify, I=0
288 // EID prefixes: 153.16.254.1 -- 152.16.254.1 -- 151.16.254.1 --
290 // Local RLOCs: 192.168.136.10 -- 192.168.136.11 -- 192.168.136.12 --
293 MapNotify mn = MapNotifySerializer.getInstance().deserialize(hexToByteBuffer("40 00 00 "
295 + "04 " // Record count
296 + "FF BB 00 00 00 00 00 00 00 01 00 14 b9 cd 7b 89 " //
297 + "65 c2 56 03 be dd 81 20 47 e5 c3 4f 56 02 e1 59 " //
298 + "00 00 00 0a 01 20 10 00 00 00 00 01 99 10 fe 01 01 64 " // Record
300 + "ff 00 00 05 00 01 c0 a8 88 0a " // contd
301 + "00 00 00 0b 01 17 50 00 01 11 00 01 98 10 fe 01 01 64 " // Record
303 + "ff 00 00 05 00 01 c0 a8 88 0b " // contd
304 + "00 00 00 0c 01 20 00 00 02 22 00 01 97 10 fe 01 01 64 " // Record
306 + "ff 00 00 05 00 01 c0 a8 88 0c " // contd
307 + "00 00 00 0d 01 20 20 00 03 33 00 01 96 10 fe 01 01 64 " // Record
309 + "ff 00 00 05 00 01 c0 a8 88 0d " // contd
312 assertEquals(4, mn.getMappingRecordItem().size());
314 MappingRecord record0 = mn.getMappingRecordItem().get(0).getMappingRecord();
315 MappingRecord record1 = mn.getMappingRecordItem().get(1).getMappingRecord();
316 MappingRecord record2 = mn.getMappingRecordItem().get(2).getMappingRecord();
317 MappingRecord record3 = mn.getMappingRecordItem().get(3).getMappingRecord();
319 assertEquals(10, record0.getRecordTtl().intValue());
320 assertEquals(13, record3.getRecordTtl().intValue());
322 assertEquals(32, record0.getMaskLength().intValue());
323 assertEquals(23, record1.getMaskLength().intValue());
325 assertEquals(Action.NoAction, record0.getAction());
326 assertEquals(Action.SendMapRequest, record1.getAction());
327 assertEquals(Action.NoAction, record2.getAction());
328 assertEquals(Action.NativelyForward, record3.getAction());
330 assertTrue(record0.isAuthoritative());
331 assertTrue(record1.isAuthoritative());
332 assertFalse(record2.isAuthoritative());
333 assertFalse(record3.isAuthoritative());
335 assertEquals(0x000, record0.getMapVersion().shortValue());
336 assertEquals(0x111, record1.getMapVersion().shortValue());
337 assertEquals(0x222, record2.getMapVersion().shortValue());
338 assertEquals(0x333, record3.getMapVersion().shortValue());
342 public void deserialize__IllegalAction() throws Exception {
343 MapNotify mn = MapNotifySerializer.getInstance().deserialize(hexToByteBuffer("40 00 01 01 FF BB "
344 + "00 00 00 00 00 00 00 01 00 14 ec 47 1e 53 25 91 "
345 + "2f 68 10 75 13 dd 2c e8 6e 3c ac 94 ed e4 00 00 "
346 + "00 0a 01 20 F0 00 00 00 00 01 99 10 fe 01 01 64 "
347 + "ff 00 00 05 00 01 c0 a8 88 0a"));
349 assertEquals(1, mn.getMappingRecordItem().size());
350 assertEquals(Action.NoAction, mn.getMappingRecordItem().get(0).getMappingRecord().getAction());
353 @Test(expected = LispSerializationException.class)
354 public void deserialize_WrongAuthenticationLength() throws Exception {
355 // LISP(Type = 4 Map-Notify, I=0
357 // Nonce: (something)
359 // AuthDataLength: 20 Data:
360 // e8:f5:0b:c5:c5:f2:b0:21:27:a8:a5:68:89:ec
361 // EID prefix: 153.16.254.1/32 (EID=0x9910FE01), TTL: 10, Authoritative,
363 // Local RLOC: 192.168.136.10 (RLOC=0xC0A8880A), Reachable,
364 // Priority/Weight: 1/100, Multicast Priority/Weight: 255/0
366 MapNotifySerializer.getInstance().deserialize(hexToByteBuffer("48 00 00 01 FF BB "
367 + "00 00 00 00 00 00 00 00 00 14 e8 f5 0b c5 c5 f2 "
368 + "b0 21 27 a8 21 a5 68 89 ec 00 00 "
369 + "00 0a 01 20 10 00 00 00 00 01 99 10 fe 01 01 64 "
370 + "ff 00 00 05 00 01 c0 a8 88 0a"));
374 public void deserialize__SHA1() throws Exception {
375 // LISP(Type = 4 Map-Notify, I=0
377 // Nonce: (something)
379 // AuthDataLength: 20 Data:
380 // b2:dd:1a:25:c0:60:b1:46:e8:dc:6d:a6:ae:2e:92:92:a6:ca:b7:9d
381 // EID prefix: 153.16.254.1/32 (EID=0x9910FE01), TTL: 10, Authoritative,
383 // Local RLOC: 192.168.136.10 (RLOC=0xC0A8880A), Reachable,
384 // Priority/Weight: 1/100, Multicast Priority/Weight: 255/0
386 MapNotify mn = MapNotifySerializer.getInstance().deserialize(hexToByteBuffer("40 00 00 01 FF BB "
387 + "00 00 00 00 00 00 00 01 00 14 2c 61 b9 c9 9a 20 "
388 + "ba d8 f5 40 d3 55 6f 5f 6e 5a b2 0a bf b5 00 00 "
389 + "00 0a 01 20 10 00 00 00 00 01 99 10 fe 01 01 64 "
390 + "ff 00 00 05 00 01 c0 a8 88 0a"));
392 assertFalse(mn.isXtrSiteIdPresent());
394 assertEquals(1, mn.getMappingRecordItem().size());
395 assertEquals(0xFFBB000000000000L, mn.getNonce().longValue());
396 assertEquals(0x0001, mn.getKeyId().shortValue());
397 byte[] expectedAuthenticationData = { (byte) 0x2c, (byte) 0x61, (byte) 0xb9, (byte) 0xc9, (byte) 0x9a,
398 (byte) 0x20, (byte) 0xba, (byte) 0xd8, (byte) 0xf5, (byte) 0x40, (byte) 0xd3, (byte) 0x55, (byte) 0x6f,
399 (byte) 0x5f, (byte) 0x6e, (byte) 0x5a, (byte) 0xb2, (byte) 0x0a, (byte) 0xbf, (byte) 0xb5 };
400 ArrayAssert.assertEquals(expectedAuthenticationData, mn.getAuthenticationData());
404 public void deserialize__SHA256() throws Exception {
405 // LISP(Type = 4 Map-Notify, I=0
407 // Nonce: (something)
409 // AuthDataLength: 32 Data:
410 // 70 30 d4 c6 10 44 0d 83 be 4d bf fd a9 8c 57 6d 68 a5 bf 32 11 c9 7b
411 // 58 c4 b9 9f 06 11 23 b9 38
412 // EID prefix: 153.16.254.1/32 (EID=0x9910FE01), TTL: 10, Authoritative,
414 // Local RLOC: 192.168.136.10 (RLOC=0xC0A8880A), Reachable,
415 // Priority/Weight: 1/100, Multicast Priority/Weight: 255/0
417 MapNotify mn = MapNotifySerializer.getInstance().deserialize(hexToByteBuffer("40 00 00 01 FF BB "
418 + "00 00 00 00 00 00 00 02 00 20 70 30 d4 c6 10 44 0d 83 be 4d bf fd a9 8c 57 6d 68 a5 bf 32 "
419 + "11 c9 7b 58 c4 b9 9f 06 11 23 b9 38 00 00 "
420 + "00 0a 01 20 10 00 00 00 00 01 99 10 fe 01 01 64 "
421 + "ff 00 00 05 00 01 c0 a8 88 0a"));
423 assertFalse(mn.isXtrSiteIdPresent());
425 assertEquals(1, mn.getMappingRecordItem().size());
426 assertEquals(0xFFBB000000000000L, mn.getNonce().longValue());
427 assertEquals(0x0002, mn.getKeyId().shortValue());
428 byte[] expectedAuthenticationData = { (byte) 0x70, (byte) 0x30, (byte) 0xd4, (byte) 0xc6, (byte) 0x10,
429 (byte) 0x44, (byte) 0x0d, (byte) 0x83, (byte) 0xbe, (byte) 0x4d, (byte) 0xbf, (byte) 0xfd, (byte) 0xa9,
430 (byte) 0x8c, (byte) 0x57, (byte) 0x6d, (byte) 0x68, (byte) 0xa5, (byte) 0xbf, (byte) 0x32, (byte) 0x11,
431 (byte) 0xc9, (byte) 0x7b, (byte) 0x58, (byte) 0xc4, (byte) 0xb9, (byte) 0x9f, (byte) 0x06, (byte) 0x11,
432 (byte) 0x23, (byte) 0xb9, (byte) 0x38 };
433 ArrayAssert.assertEquals(expectedAuthenticationData, mn.getAuthenticationData());