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
8 package org.opendaylight.lispflowmapping.integrationtest;
10 import com.google.common.collect.Lists;
11 import com.google.common.collect.Sets;
12 import com.google.common.net.InetAddresses;
13 import java.io.IOException;
14 import java.net.DatagramPacket;
15 import java.net.DatagramSocket;
16 import java.net.InetAddress;
17 import java.net.InetSocketAddress;
18 import java.net.SocketException;
19 import java.net.SocketTimeoutException;
20 import java.net.UnknownHostException;
21 import java.nio.ByteBuffer;
22 import java.util.ArrayList;
23 import java.util.Arrays;
24 import java.util.List;
26 import javax.inject.Inject;
27 import org.junit.After;
28 import org.junit.Assert;
29 import org.junit.Before;
30 import org.junit.Test;
31 import org.junit.runner.RunWith;
32 import org.opendaylight.controller.mdsal.it.base.AbstractMdsalTestBase;
33 import org.opendaylight.lispflowmapping.config.ConfigIni;
34 import org.opendaylight.lispflowmapping.implementation.LispMappingService;
35 import org.opendaylight.lispflowmapping.interfaces.dao.SubKeys;
36 import org.opendaylight.lispflowmapping.interfaces.dao.SubscriberRLOC;
37 import org.opendaylight.lispflowmapping.interfaces.lisp.IFlowMapping;
38 import org.opendaylight.lispflowmapping.interfaces.mappingservice.IMappingService;
39 import org.opendaylight.lispflowmapping.lisp.serializer.MapNotifySerializer;
40 import org.opendaylight.lispflowmapping.lisp.serializer.MapRegisterSerializer;
41 import org.opendaylight.lispflowmapping.lisp.serializer.MapReplySerializer;
42 import org.opendaylight.lispflowmapping.lisp.serializer.MapRequestSerializer;
43 import org.opendaylight.lispflowmapping.lisp.type.LispMessage;
44 import org.opendaylight.lispflowmapping.lisp.util.LispAddressStringifier;
45 import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil;
46 import org.opendaylight.lispflowmapping.type.sbplugin.IConfigLispSouthboundPlugin;
47 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
48 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
49 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
50 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
51 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.AfiListLcaf;
52 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ApplicationDataLcaf;
53 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ExplicitLocatorPathLcaf;
54 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.InstanceIdType;
55 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv4PrefixAfi;
56 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.KeyValueAddressLcaf;
57 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.MacAfi;
58 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SimpleAddress;
59 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SourceDestKeyLcaf;
60 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.Address;
61 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.AfiList;
62 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ApplicationData;
63 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ExplicitLocatorPath;
64 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4Prefix;
65 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4PrefixBuilder;
66 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.KeyValueAddress;
67 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Mac;
68 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.SourceDestKey;
69 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.afi.list.AfiListBuilder;
70 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.application.data.ApplicationDataBuilder;
71 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.ExplicitLocatorPathBuilder;
72 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.explicit.locator.path.Hop;
73 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.explicit.locator.path.Hop.LrsBits;
74 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.explicit.locator.path.HopBuilder;
75 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.source.dest.key.SourceDestKeyBuilder;
76 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.Ipv4AddressBinary;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.Ipv4PrefixBinaryAfi;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv4BinaryBuilder;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv4PrefixBinaryBuilder;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.AddMapping;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.GotMapNotify;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.GotMapReply;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MapNotify;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MapRegister;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MapReply;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MapRequest;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MappingKeepAlive;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.OdlLispProtoListener;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.RequestMapping;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.XtrReplyMapping;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.XtrRequestMapping;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.EidBuilder;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.list.EidItem;
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.list.EidItemBuilder;
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecord;
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecordBuilder;
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.authkey.container.MappingAuthkey;
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.authkey.container.MappingAuthkeyBuilder;
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecord;
102 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecord.Action;
103 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecordBuilder;
104 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.list.MappingRecordItem;
105 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.list.MappingRecordItemBuilder;
106 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapregisternotification.MapRegisterBuilder;
107 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequest.ItrRloc;
108 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequest.ItrRlocBuilder;
109 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequest.SourceEidBuilder;
110 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequestnotification.MapRequestBuilder;
111 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.Rloc;
112 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.RlocBuilder;
113 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.MappingOrigin;
114 import org.ops4j.pax.exam.Option;
115 import org.ops4j.pax.exam.junit.PaxExam;
116 import org.ops4j.pax.exam.karaf.options.LogLevelOption.LogLevel;
117 import org.ops4j.pax.exam.options.MavenUrlReference;
118 import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
119 import org.ops4j.pax.exam.spi.reactors.PerClass;
120 import org.ops4j.pax.exam.util.Filter;
121 import org.osgi.framework.Bundle;
122 import org.osgi.framework.BundleContext;
123 import org.osgi.framework.InvalidSyntaxException;
124 import org.slf4j.Logger;
125 import org.slf4j.LoggerFactory;
127 import static org.junit.Assert.assertEquals;
128 import static org.junit.Assert.assertNotNull;
129 import static org.junit.Assert.assertTrue;
130 import static org.junit.Assert.fail;
131 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_A;
132 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_A_SB;
133 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_B;
134 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_B_SB;
135 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_C;
136 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_C_RLOC_10;
137 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_C_SB;
138 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_C_WP_100_1_SB;
139 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_C_WP_50_2_SB;
140 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_D4;
141 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_D5;
142 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_D_DELETE_SB;
143 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_D_WP_100_1_SB;
144 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_D_WP_50_2_SB;
145 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_E_SB;
146 import static org.ops4j.pax.exam.CoreOptions.composite;
147 import static org.ops4j.pax.exam.CoreOptions.maven;
148 import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.editConfigurationFilePut;
150 @RunWith(PaxExam.class)
151 @ExamReactorStrategy(PerClass.class)
152 public class MappingServiceIntegrationTest extends AbstractMdsalTestBase {
153 private static final Logger LOG = LoggerFactory.getLogger(MappingServiceIntegrationTest.class);
156 * Defines how many attempt to create instance of DatagramSocket will be done before giving up.
158 private static final int NUM_OF_ATTEMPTS_TO_CREATE_SOCKET = 2;
160 private byte[] mapRequestPacket;
161 private byte[] mapRegisterPacketWithNotify;
162 private byte[] mapRegisterPacketWithoutNotify;
163 String lispBindAddress = "127.0.0.1";
164 static final String ourAddress = "127.0.0.2";
165 private Rloc locatorEid;
166 private DatagramSocket socket;
167 private byte[] mapRegisterPacketWithAuthenticationAndMapNotify;
169 public static final String ODL = "org.opendaylight.controller";
170 public static final String YANG = "org.opendaylight.yangtools";
171 private static final int MAX_NOTIFICATION_RETRYS = 20;
172 private static final MappingAuthkey NULL_AUTH_KEY = new MappingAuthkeyBuilder().setKeyType(0).build();
174 // This is temporary, since the properties in the pom file are not picked up
176 public String getKarafDistro() {
178 .groupId("org.opendaylight.lispflowmapping")
179 .artifactId("distribution-karaf")
180 .versionAsInProject()
186 public MavenUrlReference getFeatureRepo() {
188 .groupId("org.opendaylight.lispflowmapping")
189 .artifactId("features-lispflowmapping")
190 .classifier("features")
192 .versionAsInProject();
196 public String getFeatureName() {
197 return "odl-lispflowmapping-msmr";
201 public Option getLoggingOption() {
202 Option option = editConfigurationFilePut(ORG_OPS4J_PAX_LOGGING_CFG,
203 "log4j.logger.org.opendaylight.lispflowmapping",
204 LogLevel.DEBUG.name());
205 option = composite(option, super.getLoggingOption());
210 public void testLispFlowMappingFeatureLoad() {
211 Assert.assertTrue(true);
215 public void after() {
216 if (socket != null) {
219 // if (connection != null) {
220 // connection.disconnect();
225 public void before() throws Exception {
227 mapService.setLookupPolicy(IMappingService.LookupPolicy.NB_FIRST);
228 mapService.setMappingOverwrite(true);
230 locatorEid = LispAddressUtil.asIpv4Rloc("4.3.2.1");
231 socket = initSocket(socket, LispMessage.PORT_NUM);
233 // SRC: 127.0.0.1:58560 to 127.0.0.1:4342
234 // LISP(Type = 8 - Encapsulated)
235 // IP: 192.168.136.10 -> 153.16.254.1
237 // LISP(Type = 1 Map-Request
241 // Source EID 1.2.3.4
242 // Nonce: 0x3d8d2acd39c8d608
243 // ITR-RLOC AFI=1 Address=192.168.136.10
244 // Record 1: 153.16.254.1/32
245 mapRequestPacket = extractWSUdpByteArray(new String("0000 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00 " //
246 + "0010 00 58 00 00 40 00 40 11 3c 93 7f 00 00 01 7f 00 "
247 + "0020 00 01 e4 c0 10 f6 00 44 fe 57 80 00 00 00 45 00 "
248 + "0030 00 3c d4 31 00 00 ff 11 56 f3 7f 00 00 02 99 10 "
249 + "0040 fe 01 dd b4 10 f6 00 28 ef 3a 10 00 00 01 3d 8d "
250 + "0050 2a cd 39 c8 d6 08 00 01 01 02 03 04 00 01 7f 00 00 02 00 20 " //
251 + "0060 00 01 99 10 fe 01"));
253 // IP: 192.168.136.10 -> 128.223.156.35
254 // UDP: 49289 -> 4342
255 // LISP(Type = 3 Map-Register, P=1, M=1
259 // AuthDataLength: 20 Data:
260 // e8:f5:0b:c5:c5:f2:b0:21:27:a8:21:41:04:f3:46:5a:a5:68:89:ec
261 // EID prefix: 153.16.254.1/32 (EID=0x9910FE01), TTL: 10, Authoritative,
263 // Local RLOC: 192.168.136.10 (RLOC=0xC0A8880A), Reachable,
264 // Priority/Weight: 1/100, Multicast Priority/Weight:
268 mapRegisterPacketWithAuthenticationAndMapNotify = extractWSUdpByteArray(new String(
269 "0000 00 50 56 ee d1 4f 00 0c 29 7a ce 79 08 00 45 00 " //
270 + "0010 00 5c 00 00 40 00 40 11 d4 db c0 a8 88 0a 80 df "
271 + "0020 9c 23 d6 40 10 f6 00 48 59 a4 38 00 01 01 00 00 "
272 + "0030 00 00 00 00 00 00 00 01 00 14 0e a4 c6 d8 a4 06 "
273 + "0040 71 7c 33 a4 5c 4a 83 1c de 74 53 03 0c ad 00 00 "
274 + "0050 00 0a 01 20 10 00 00 00 00 01 99 10 fe 01 01 64 " //
275 + "0060 ff 00 00 05 00 01 c0 a8 88 0a"));
277 // IP: 192.168.136.10 -> 128.223.156.35
278 // UDP: 49289 -> 4342
279 // LISP(Type = 3 Map-Register, P=1, M=1
282 // Key ID: 0x0000 NO AUTHENTICATION!!
283 // AuthDataLength: 00 Data:
284 // EID prefix: 153.16.254.1/32 (EID=0x9910FE01), TTL: 10, Authoritative,
286 // Local RLOC: 192.168.136.10 (RLOC=0xC0A8880A), Reachable,
287 // Priority/Weight: 1/100, Multicast Priority/Weight:
291 mapRegisterPacketWithNotify = extractWSUdpByteArray(new String(
292 "0000 00 50 56 ee d1 4f 00 0c 29 7a ce 79 08 00 45 00 " //
293 + "0010 00 5c 00 00 40 00 40 11 d4 db c0 a8 88 0a 80 df "
294 + "0020 9c 23 d6 40 10 f6 00 48 59 a4 38 00 01 01 00 00 "
295 + "0030 00 00 00 00 00 07 00 00 00 14 0e a4 c6 d8 a4 06 "
296 + "0040 71 7c 33 a4 5c 4a 83 1c de 74 53 03 0c ad 00 00 "
297 + "0050 00 0a 01 20 10 00 00 00 00 01 99 10 fe 01 01 64 " //
298 + "0060 ff 00 00 05 00 01 c0 a8 88 0a"));
300 // IP: 192.168.136.10 -> 128.223.156.35
301 // UDP: 49289 -> 4342
302 // LISP(Type = 3 Map-Register, P=1, M=1
305 // Key ID: 0x0000 NO AUTHENTICATION!!
306 // AuthDataLength: 00 Data:
307 // EID prefix: 153.16.254.1/32 (EID=0x9910FE01), TTL: 10, Authoritative,
309 // Local RLOC: 192.168.136.10 (RLOC=0xC0A8880A), Reachable,
310 // Priority/Weight: 1/100, Multicast Priority/Weight:
314 mapRegisterPacketWithoutNotify = extractWSUdpByteArray(new String(
315 "0000 00 50 56 ee d1 4f 00 0c 29 7a ce 79 08 00 45 00 " //
316 + "0010 00 5c 00 00 40 00 40 11 d4 db c0 a8 88 0a 80 df "
317 + "0020 9c 23 d6 40 10 f6 00 48 59 a4 38 00 00 01 00 00 "
318 + "0030 00 00 00 00 00 07 00 00 00 14 0e a4 c6 d8 a4 06 "
319 + "0040 71 7c 33 a4 5c 4a 83 1c de 74 53 03 0c ad 00 00 "
320 + "0050 00 0a 01 20 10 00 00 00 00 01 99 10 fe 01 01 64 " //
321 + "0060 ff 00 00 05 00 01 c0 a8 88 0a"));
325 private BundleContext bc;
326 //private HttpURLConnection connection;
327 protected static boolean notificationCalled;
329 @Inject @Filter(timeout=60000)
330 private IFlowMapping lms;
332 @Inject @Filter(timeout=60000)
333 private IMappingService mapService;
335 @Inject @Filter(timeout=10000)
336 private IConfigLispSouthboundPlugin configLispPlugin;
339 public void testSimpleUsage() throws Exception {
341 mapRegisterWithMapNotify();
342 mapRegisterWithMapNotifyAndMapRequest();
343 registerAndQuery__MAC();
344 mapRequestMapRegisterAndMapRequest();
345 mapRegisterWithAuthenticationWithoutConfiguringAKey();
346 mapRegisterWithoutMapNotify();
350 public void testLCAFs() throws Exception {
351 registerAndQuery__SrcDestLCAF();
352 registerAndQuery__SrcDestLCAFOverlap();
353 registerAndQuery__KeyValueLCAF();
354 //registerAndQuery__ListLCAF();
355 //registerAndQuery__ApplicationData();
356 //registerAndQuery__TrafficEngineering();
357 //registerAndQuery__SegmentLCAF();
361 public void testMask() throws Exception {
362 //testPasswordExactMatch(); TODO commented because it needs NB
363 //testPasswordMaskMatch(); TODO commented because it needs NB
364 eidPrefixLookupIPv4();
365 eidPrefixLookupIPv6();
369 public void testNorthbound() throws Exception {
371 northboundAddMapping();
372 northboundDeleteMapping();
373 northboundRetrieveKey();
374 northboundRetrieveMapping();
375 northboundRetrieveSourceDestKey();
376 northboundRetrieveSourceDestMapping();
380 public void testOverWriting() throws Exception {
381 //testMapRegisterDosntOverwritesOtherSubKeys(); TODO weird failure, needs debug
383 // TODO: remove, we don't support overwrite flag any longer and RLOCs are not saved as independent RLOC groups
384 // testMapRegisterOverwritesSameSubkey();
385 // testMapRegisterOverwritesNoSubkey();
386 // testMapRegisterDoesntOverwritesNoSubkey();
390 public void testTimeOuts() throws Exception {
391 mapRequestMapRegisterAndMapRequestTestTimeout();
392 //mapRequestMapRegisterAndMapRequestTestNativelyForwardTimeoutResponse(); TODO commented because it needs NB
396 // public void testNonProxy() throws Throwable {
397 // testSimpleNonProxy();
398 // testNonProxyOtherPort();
399 // testRecievingNonProxyOnXtrPort();
403 public void testSmr() throws Exception {
404 registerQueryRegisterWithSmr();
409 public void testMultiSite() throws Exception {
410 testMultiSiteScenarioA();
411 testMultiSiteScenarioB();
415 public void testNegativePrefix() throws UnknownHostException {
417 testGapIntersection();
418 testMultipleMappings();
421 private void testRepeatedSmr() throws SocketTimeoutException, UnknownHostException {
423 long timeout = ConfigIni.getInstance().getSmrTimeout();
425 final InstanceIdType iid = new InstanceIdType(1L);
426 final Eid eid1 = LispAddressUtil.asIpv4Eid("1.1.1.1", 1L);
427 final Eid eid2 = LispAddressUtil.asIpv4Eid("2.2.2.2", 1L);
430 final Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("0.0.0.0/0", iid);
431 mapService.addAuthenticationKey(eid, NULL_AUTH_KEY);
433 /* add subscribers */
434 final String subscriberSrcRloc1 = "127.0.0.3";
435 final String subscriberSrcRloc2 = "127.0.0.4";
436 final Set<SubscriberRLOC> subscriberSet = Sets.newHashSet(
437 newSubscriber(eid1, subscriberSrcRloc1), newSubscriber(eid2, subscriberSrcRloc2));
438 mapService.addData(MappingOrigin.Southbound, eid1, SubKeys.SUBSCRIBERS, subscriberSet);
440 final int expectedSmrs1 = 2;
441 final int expectedSmrs2 = 3;
443 final SocketReader reader1 = startSocketReader(subscriberSrcRloc1, 15000);
444 final SocketReader reader2 = startSocketReader(subscriberSrcRloc2, 15000);
448 final MappingRecord mapping1 = new MappingRecordBuilder()
449 .setEid(eid1).setTimestamp(System.currentTimeMillis()).setRecordTtl(1440).build();
450 mapService.addMapping(MappingOrigin.Northbound, mapping1.getEid(), null, mapping1, false);
452 sleepForMilliseconds((timeout * expectedSmrs1) - 1500);
453 final List<MapRequest> requests1 = processBuffers(reader1, subscriberSrcRloc1, expectedSmrs1);
454 final MapReply mapReply1 = lms.handleMapRequest(
455 new MapRequestBuilder(requests1.get(0))
456 .setItrRloc(Lists.newArrayList(new ItrRlocBuilder()
457 .setRloc(LispAddressUtil.asIpv4Rloc(subscriberSrcRloc1)).build()))
458 .setEidItem(Lists.newArrayList(new EidItemBuilder().setEid(eid1).build()))
460 .setSmr(false).build());
462 // sleep to get 1 extra smr request
463 sleepForMilliseconds(timeout * 1);
464 final List<MapRequest> requests2 = processBuffers(reader2, subscriberSrcRloc2, expectedSmrs2);
465 final MapReply mapReply2 = lms.handleMapRequest(
466 new MapRequestBuilder(requests2.get(0))
467 .setItrRloc(Lists.newArrayList(new ItrRlocBuilder()
468 .setRloc(LispAddressUtil.asIpv4Rloc(subscriberSrcRloc2)).build()))
469 .setEidItem(Lists.newArrayList(new EidItemBuilder().setEid(eid2).build()))
471 .setSmr(false).build());
474 assertEquals(expectedSmrs1, requests1.size());
475 assertEquals(expectedSmrs2, requests2.size());
476 assertEquals((long) mapReply1.getNonce(), (long) requests1.get(0).getNonce());
477 assertEquals((long) mapReply2.getNonce(), (long) requests2.get(0).getNonce());
478 assertNextBufferEmpty(reader1);
479 assertNextBufferEmpty(reader2);
481 reader1.stopReading();
482 reader2.stopReading();
485 private SocketReader startSocketReader(String address, int timeout) {
486 DatagramSocket receivingSocket = null;
489 receivingSocket = new DatagramSocket(new InetSocketAddress(address, LispMessage.PORT_NUM));
490 } catch (SocketException e) {
491 LOG.error("Can't initialize socket for {}", address, e);
493 return SocketReader.startReadingInStandaloneThread(receivingSocket, timeout);
496 private List<MapRequest> processBuffers(SocketReader reader, String address, int expectedSmrs) {
497 InetAddress inetAddress = null;
499 inetAddress = InetAddress.getByName(address);
500 } catch (UnknownHostException e) {
501 LOG.error("Unknown address {}.", address, e);
504 final List<MapRequest> requests = Lists.newArrayList();
505 byte[][] buffers = reader.getBuffers(expectedSmrs);
506 for (byte[] buf : buffers) {
507 MapRequest request = MapRequestSerializer.getInstance().deserialize(ByteBuffer.wrap(buf), inetAddress);
508 requests.add(request);
513 private void assertNextBufferEmpty(SocketReader socketReader) {
514 assertTrue(isArrayEmpty(socketReader.getBuffers(1)[0]));
517 private boolean isArrayEmpty(byte[] byteArray) {
518 for (byte b : byteArray) {
526 private static SubscriberRLOC newSubscriber(Eid srcEid, String srcRlocIp) {
527 final byte[] addressBinary = InetAddresses.forString(srcRlocIp).getAddress();
528 final int timeout = 5;
529 final Rloc srcRloc = new RlocBuilder().setAddress(new Ipv4BinaryBuilder()
530 .setIpv4Binary(new Ipv4AddressBinary(addressBinary)).build()).build();
532 return new SubscriberRLOC(srcRloc, srcEid, timeout);
535 private void testMultipleMappings() throws UnknownHostException {
536 final InstanceIdType iid = new InstanceIdType(1L);
537 final String prefix1 = "1.1.127.10/32"; // prefix from the intersection of NB and SB gaps
538 final String prefix2 = "1.1.200.255/32"; // prefix with existing mapping in NB
539 final String prefix3 = "1.3.255.255/32";
541 final MapRequest mapRequest = new MapRequestBuilder().setSmrInvoked(false).setEidItem(Lists.newArrayList(
542 new EidItemBuilder().setEid(LispAddressUtil.asIpv4PrefixBinaryEid(prefix1, iid))
544 new EidItemBuilder().setEid(LispAddressUtil.asIpv4PrefixBinaryEid(prefix2, iid))
546 new EidItemBuilder().setEid(LispAddressUtil.asIpv4PrefixBinaryEid(prefix3, iid))
549 final MapReply mapReply = lms.handleMapRequest(mapRequest);
552 final String resultPrefix1 = "1.1.64.0";
553 final Address resultNegMapping1 = new Ipv4PrefixBinaryBuilder()
554 .setIpv4AddressBinary(new Ipv4AddressBinary(InetAddress.getByName(resultPrefix1).getAddress()))
555 .setIpv4MaskLength((short) 18).build();
557 final String resultPrefix2 = "1.1.192.0";
558 final Address resultMapping2 = new Ipv4PrefixBinaryBuilder()
559 .setIpv4AddressBinary(new Ipv4AddressBinary(InetAddress.getByName(resultPrefix2).getAddress()))
560 .setIpv4MaskLength((short) 18).build();
562 final String resultPrefix3 = "1.3.0.0";
563 final Address resultNegMapping3 = new Ipv4PrefixBinaryBuilder()
564 .setIpv4AddressBinary(new Ipv4AddressBinary(InetAddress.getByName(resultPrefix3).getAddress()))
565 .setIpv4MaskLength((short) 16).build();
567 assertEquals(resultNegMapping1, mapReply.getMappingRecordItem().get(0).getMappingRecord().getEid()
569 assertEquals(resultMapping2, mapReply.getMappingRecordItem().get(1).getMappingRecord().getEid()
571 assertEquals(resultNegMapping3, mapReply.getMappingRecordItem().get(2).getMappingRecord().getEid()
576 * Tests a negative mapping from an intersection of gaps in northbound and southbound.
578 private void testGapIntersection() throws UnknownHostException {
579 final InstanceIdType iid = new InstanceIdType(1L);
581 // request an Eid from a gap between mappings
582 final MapRequest mapRequest = new MapRequestBuilder().setSmrInvoked(false).setEidItem(Lists.newArrayList(
583 new EidItemBuilder().setEid(LispAddressUtil.asIpv4PrefixBinaryEid("1.1.127.10/32", iid))
586 final MapReply mapReply = lms.handleMapRequest(mapRequest);
588 // expected negative mapping
589 final Address resultNegMapping = new Ipv4PrefixBinaryBuilder()
590 .setIpv4AddressBinary(new Ipv4AddressBinary(InetAddress.getByName("1.1.64.0").getAddress()))
591 .setIpv4MaskLength((short) 18).build();
592 assertEquals(resultNegMapping, mapReply.getMappingRecordItem().get(0).getMappingRecord().getEid()
596 private void insertMappings() {
598 mapService.setLookupPolicy(IMappingService.LookupPolicy.NB_AND_SB);
600 final InstanceIdType iid = new InstanceIdType(1L);
601 final String prefixNbLeft = "1.2.0.0/16";
602 final String prefixNbRight = "1.1.128.0/17";
603 final String prefixSbLeft = "1.1.32.0/19";
604 final String prefixSbRight = "1.0.0.0/8";
606 final MappingRecord mapRecordNbLeft = newMappingRecord(prefixNbLeft, iid);
607 final MappingRecord mapRecordNbRight = newMappingRecord(prefixNbRight, iid);
608 final MappingRecord mapRecordSbLeft = newMappingRecord(prefixSbLeft, iid);
609 final MappingRecord mapRecordSbRight = newMappingRecord(prefixSbRight, iid);
612 final Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("0.0.0.0/0", iid);
613 mapService.addAuthenticationKey(eid, NULL_AUTH_KEY);
615 mapService.addMapping(MappingOrigin.Northbound, mapRecordNbLeft.getEid(), null, mapRecordNbLeft, false);
616 mapService.addMapping(MappingOrigin.Northbound, mapRecordNbRight.getEid(), null, mapRecordNbRight, false);
617 mapService.addMapping(MappingOrigin.Southbound, mapRecordSbLeft.getEid(), null, mapRecordSbLeft, false);
618 mapService.addMapping(MappingOrigin.Southbound, mapRecordSbRight.getEid(), null, mapRecordSbRight, false);
625 * Creates a new MappingRecord object.
627 * @param prefix The Eid prefix
629 * @return new MappingRecord object
631 private MappingRecord newMappingRecord(String prefix, InstanceIdType iid) {
632 final Eid prefixBinary = LispAddressUtil.asIpv4PrefixBinaryEid(prefix, iid);
633 return new MappingRecordBuilder()
634 .setEid(prefixBinary)
635 .setLocatorRecord(Lists.newArrayList(new LocatorRecordBuilder()
636 .setRloc(LispAddressUtil.asIpv4Rloc("2.2.2.2")).setLocatorId("loc_id").build()))
637 .setTimestamp(System.currentTimeMillis()).setRecordTtl(1440).build();
643 public void testMultiSiteScenarioA() throws IOException {
645 ConfigIni.getInstance().setSmrRetryCount(1);
647 final MultiSiteScenario multiSiteScenario = new MultiSiteScenario(mapService, lms);
648 multiSiteScenario.setCommonAuthentication();
651 final SocketReader socketReader = SocketReader.startReadingInStandaloneThread(socket);
654 multiSiteScenario.storeSouthboundMappings(false, SITE_A, SITE_B, SITE_C, SITE_D4, SITE_D5);
655 multiSiteScenario.storeNorthMappingSrcDst(SITE_B, SITE_C);
656 multiSiteScenario.storeNorthMappingNegative(SITE_C, Action.Drop);
658 multiSiteScenario.assertPingWorks(SITE_A, 5, SITE_B, 4);
659 multiSiteScenario.assertPingWorks(SITE_B, 5, SITE_C, 4);
660 multiSiteScenario.assertPingFails(SITE_A, 1, SITE_C, 4);
663 //following action should trigger generatting of SMR messages:
666 multiSiteScenario.storeNorthMappingSrcDst(SITE_A, SITE_C);
668 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B.getHost(5), SITE_A.getHost(1));
669 multiSiteScenario.assertPingWorks(SITE_A, 5, SITE_C, 4);
670 multiSiteScenario.assertPingWorks(SITE_B, 5, SITE_C, 4);
671 multiSiteScenario.assertPingFails(SITE_D4, 5, SITE_C, 4);
674 // following action should trigger generatting of SMR messages:
679 multiSiteScenario.deleteNorthMappingNegative(SITE_C);
681 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B.getHost(5), SITE_A.getHost(1), SITE_A
684 multiSiteScenario.assertPingWorks(SITE_D4, 5, SITE_C, 4);
687 // following action should trigger generatting of SMR messages:
689 multiSiteScenario.storeNorthMappingSrcDst(SITE_B, SITE_C_RLOC_10);
691 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_D4.getHost(5));
692 //way of testing ping - get RLOC for mapping src-dst and compare it with awaited value doesn't test
693 //that ping won't be successfull
694 multiSiteScenario.assertPingFails(SITE_B, 5, SITE_C, 4);
697 // following action should trigger generatting of SMR messages:
700 multiSiteScenario.storeNorthMappingNegative(SITE_C, Action.Drop);
702 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_D4.getHost(5), SITE_B.getHost(5));
703 multiSiteScenario.assertPingFails(SITE_D4, 5, SITE_C, 4);
706 multiSiteScenario.assertPingFails(SITE_D5, 5, SITE_C, 3);
709 multiSiteScenario.deleteNorthMapingSrcDst(SITE_A, SITE_C);
711 // following action should trigger generatting of SMR messages:
715 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_D5.getHost(5), SITE_D4.getHost(5),
718 // following action should trigger generatting of SMR messages:
722 multiSiteScenario.storeNorthMappingSrcDst(SITE_B, SITE_C);
724 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_D5.getHost(5), SITE_D4.getHost(5),
727 multiSiteScenario.assertPingWorks(SITE_A, 5, SITE_B, 4);
728 multiSiteScenario.assertPingWorks(SITE_B, 5, SITE_C, 4);
729 multiSiteScenario.assertPingFails(SITE_A, 1, SITE_C, 4);
732 // following action should trigger generatting of SMR messages:
737 multiSiteScenario.deleteNorthMapingSrcDst(SITE_B, SITE_C);
739 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_D5.getHost(5), SITE_D4.getHost(5),
742 multiSiteScenario.assertPingWorks(SITE_A, 5, SITE_B, 4);
743 multiSiteScenario.assertPingFails(SITE_B, 5, SITE_C, 4);
744 multiSiteScenario.assertPingFails(SITE_A, 1, SITE_C, 4);
747 // following action should trigger generatting of SMR messages:
752 multiSiteScenario.deleteNorthMappingNegative(SITE_C);
754 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_D5.getHost(5), SITE_D4.getHost(5),
757 multiSiteScenario.assertPingWorks(SITE_A, 5, SITE_B, 4);
758 multiSiteScenario.assertPingWorks(SITE_B, 5, SITE_C, 4);
759 multiSiteScenario.assertPingWorks(SITE_A, 5, SITE_C, 4);
761 socketReader.stopReading();
768 public void testMultiSiteScenarioB() throws IOException {
771 final MultiSiteScenario multiSiteScenario = new MultiSiteScenario(mapService, lms);
772 multiSiteScenario.setCommonAuthentication();
775 final SocketReader socketReader = SocketReader.startReadingInStandaloneThread(socket);
777 mapService.setLookupPolicy(IMappingService.LookupPolicy.NB_AND_SB);
778 mapService.setMappingOverwrite(false);
781 multiSiteScenario.storeSouthboundMappings(true, SITE_A_SB, SITE_B_SB, SITE_C_WP_100_1_SB, SITE_D_WP_100_1_SB,
783 multiSiteScenario.storeNorthMappingIpPrefix(SITE_A_SB);
784 multiSiteScenario.storeNorthMappingIpPrefix(SITE_B_SB);
785 multiSiteScenario.storeNorthMappingIpPrefix(SITE_C_WP_50_2_SB, SITE_D_WP_50_2_SB);
787 multiSiteScenario.assertPingWorks(SITE_A_SB, 5, SITE_C_WP_50_2_SB, 4, SITE_D_WP_50_2_SB);
788 multiSiteScenario.assertPingWorks(SITE_B_SB, 5, SITE_C_WP_50_2_SB, 4, SITE_D_WP_50_2_SB);
791 // following action should trigger generatting of SMR messages:
794 multiSiteScenario.storeNorthMappingSrcDst(SITE_A_SB, SITE_C_WP_50_2_SB, SITE_D_WP_50_2_SB);
796 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B_SB.getHost(5), SITE_A_SB.getHost(5));
798 // following action should trigger generatting of SMR messages:
801 multiSiteScenario.storeNorthMappingNegative(SITE_C_SB, Action.Drop);
803 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B_SB.getHost(5), SITE_A_SB.getHost(5));
805 multiSiteScenario.assertPingWorks(SITE_A_SB, 5, SITE_C_WP_50_2_SB, 4, SITE_D_WP_50_2_SB);
806 multiSiteScenario.assertPingFails(SITE_B_SB, 5, SITE_C_SB, 4);
810 // following action should trigger generatting of SMR messages:
813 multiSiteScenario.storeNorthMappingSrcDst(SITE_A_SB, SITE_C_WP_50_2_SB);
815 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B_SB.getHost(5), SITE_A_SB.getHost(5));
816 multiSiteScenario.assertPingWorks(SITE_A_SB, 5, SITE_C_WP_50_2_SB, 4);
819 multiSiteScenario.storeNorthMappingSrcDst(SITE_B_SB, SITE_C_WP_50_2_SB, SITE_D_WP_50_2_SB);
821 // following action should trigger generatting of SMR messages:
824 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B_SB.getHost(5), SITE_A_SB.getHost(5));
825 multiSiteScenario.assertPingWorks(SITE_B_SB, 5, SITE_C_WP_50_2_SB, 4, SITE_D_WP_50_2_SB);
828 multiSiteScenario.deleteSouthboundMappings(SITE_D_DELETE_SB);
830 // following action should trigger generatting of SMR messages:
833 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B_SB.getHost(5), SITE_A_SB.getHost(5));
835 multiSiteScenario.assertPingWorks(SITE_B_SB, 5, SITE_C_WP_50_2_SB, 4);
838 multiSiteScenario.deleteNorthMapingSrcDst(SITE_A_SB, SITE_C_WP_50_2_SB);
840 // following action should trigger generatting of SMR messages:
843 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B_SB.getHost(5), SITE_A_SB.getHost(5));
845 multiSiteScenario.deleteNorthMapingSrcDst(SITE_B_SB, SITE_C_WP_50_2_SB);
847 multiSiteScenario.assertPingFails(SITE_B_SB, 5, SITE_C_WP_50_2_SB, 4);
849 socketReader.stopReading();
853 // ------------------------------- Simple Tests ---------------------------
855 public void mapRequestSimple() throws SocketTimeoutException {
858 // This Map-Request is sent from a source port different from 4342
859 // We close and bind the socket on the correct port
860 if (socket != null) {
863 socket = initSocket(socket, 56756);
865 sendPacket(mapRequestPacket);
866 ByteBuffer readBuf = ByteBuffer.wrap(receivePacket().getData());
867 MapReply reply = MapReplySerializer.getInstance().deserialize(readBuf);
868 assertEquals(4435248268955932168L, reply.getNonce().longValue());
872 public void mapRegisterWithMapNotify() throws SocketTimeoutException {
874 mapService.addAuthenticationKey(LispAddressUtil.asIpv4PrefixBinaryEid("153.16.254.1/32"), NULL_AUTH_KEY);
877 sendPacket(mapRegisterPacketWithNotify);
878 MapNotify reply = receiveMapNotify();
879 assertEquals(7, reply.getNonce().longValue());
882 public void mapRegisterWithMapNotifyAndMapRequest() throws SocketTimeoutException {
884 Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32");
886 MapReply mapReply = registerAddressAndQuery(eid);
888 assertEquals(4, mapReply.getNonce().longValue());
889 assertEquals(locatorEid, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0)
894 public void registerAndQuery__MAC() throws SocketTimeoutException {
896 String macAddress = "01:02:03:04:05:06";
898 MapReply reply = registerAddressAndQuery(LispAddressUtil.asMacEid(macAddress));
901 Eid addressFromNetwork = reply.getMappingRecordItem().get(0).getMappingRecord().getEid();
902 assertEquals(MacAfi.class, addressFromNetwork.getAddressType());
903 String macAddressFromReply = ((Mac) addressFromNetwork.getAddress()).getMac().getValue();
905 assertEquals(macAddress, macAddressFromReply);
908 public void mapRequestMapRegisterAndMapRequest() throws SocketTimeoutException {
910 Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32");
911 mapService.addAuthenticationKey(eid, NULL_AUTH_KEY);
914 MapRequestBuilder mapRequestBuilder = new MapRequestBuilder();
915 mapRequestBuilder.setNonce((long) 4);
916 mapRequestBuilder.setSourceEid(new SourceEidBuilder().setEid(LispAddressUtil.getNoAddressEid()).build());
917 mapRequestBuilder.setEidItem(new ArrayList<EidItem>());
918 mapRequestBuilder.getEidItem().add(new EidItemBuilder().setEid(eid).build());
919 mapRequestBuilder.setItrRloc(new ArrayList<ItrRloc>());
920 mapRequestBuilder.getItrRloc().add(
921 new ItrRlocBuilder().setRloc(LispAddressUtil.asIpv4Rloc(ourAddress)).build());
922 sendMapRequest(mapRequestBuilder.build());
923 MapReply mapReply = receiveMapReply();
924 assertEquals(4, mapReply.getNonce().longValue());
925 assertEquals(0, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().size());
926 MapRegisterBuilder mapRegisterbuilder = new MapRegisterBuilder();
927 mapRegisterbuilder.setWantMapNotify(true);
928 mapRegisterbuilder.setNonce((long) 8);
929 MappingRecordBuilder etlrBuilder = new MappingRecordBuilder();
930 etlrBuilder.setEid(eid);
931 etlrBuilder.setRecordTtl(254);
932 LocatorRecordBuilder recordBuilder = new LocatorRecordBuilder();
933 recordBuilder.setRloc(LispAddressUtil.asIpv4Rloc("4.3.2.1"));
934 etlrBuilder.setLocatorRecord(new ArrayList<LocatorRecord>());
935 etlrBuilder.getLocatorRecord().add(recordBuilder.build());
936 mapRegisterbuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
937 mapRegisterbuilder.getMappingRecordItem().add(
938 new MappingRecordItemBuilder().setMappingRecord(etlrBuilder.build()).build());
939 sendMapRegister(mapRegisterbuilder.build());
940 MapNotify mapNotify = receiveMapNotify();
941 assertEquals(8, mapNotify.getNonce().longValue());
943 sendMapRequest(mapRequestBuilder.build());
944 mapReply = receiveMapReply();
945 assertEquals(4, mapReply.getNonce().longValue());
946 assertEquals(recordBuilder.getRloc(), mapReply.getMappingRecordItem().get(0).getMappingRecord()
947 .getLocatorRecord().get(0).getRloc());
951 public void testMapRegisterDosntOverwritesOtherSubKeys() throws SocketTimeoutException {
953 Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32");
954 SimpleAddress rloc1Value = new SimpleAddress(new IpAddress(new Ipv4Address("4.3.2.1")));
955 Rloc rloc1 = LispAddressUtil.asKeyValueAddress("subkey1", rloc1Value);
956 SimpleAddress rloc2Value = new SimpleAddress(new IpAddress(new Ipv4Address("4.3.2.2")));
957 Rloc rloc2 = LispAddressUtil.asKeyValueAddress("subkey2", rloc2Value);
958 MapReply mapReply = sendMapRegisterTwiceWithDiffrentValues(eid, rloc1, rloc2);
959 assertEquals(2, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().size());
960 assertEquals(rloc2, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0)
962 assertEquals(rloc1, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(1)
966 public void testMapRegisterOverwritesSameSubkey() throws SocketTimeoutException {
968 Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32");
969 SimpleAddress rloc1Value = new SimpleAddress(new IpAddress(new Ipv4Address("4.3.2.1")));
970 Rloc rloc1 = LispAddressUtil.asKeyValueAddress("subkey1", rloc1Value);
971 SimpleAddress rloc2Value = new SimpleAddress(new IpAddress(new Ipv4Address("4.3.2.2")));
972 Rloc rloc2 = LispAddressUtil.asKeyValueAddress("subkey2", rloc2Value);
973 MapReply mapReply = sendMapRegisterTwiceWithDiffrentValues(eid, rloc1, rloc2);
974 assertEquals(1, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().size());
975 assertEquals(rloc2, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0)
979 public void testMapRegisterOverwritesNoSubkey() throws SocketTimeoutException {
981 mapService.setMappingOverwrite(true);
982 Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32");
983 Rloc rloc1Value = LispAddressUtil.asIpv4Rloc("4.3.2.1");
984 Rloc rloc2Value = LispAddressUtil.asIpv4Rloc("4.3.2.2");
985 MapReply mapReply = sendMapRegisterTwiceWithDiffrentValues(eid, rloc1Value, rloc2Value);
986 assertEquals(1, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().size());
987 assertEquals(rloc2Value, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0)
991 public void testMapRegisterDoesntOverwritesNoSubkey() throws SocketTimeoutException {
993 mapService.setMappingOverwrite(false);
994 Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32");
995 Rloc rloc1Value = LispAddressUtil.asIpv4Rloc("4.3.2.1");
996 Rloc rloc2Value = LispAddressUtil.asIpv4Rloc("4.3.2.2");
997 MapReply mapReply = sendMapRegisterTwiceWithDiffrentValues(eid, rloc1Value, rloc2Value);
998 assertEquals(1, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().size());
999 Rloc rloc1ReturnValueContainer = mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord()
1001 Rloc rloc2ReturnValueContainer = mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord()
1003 assertTrue((rloc1Value.equals(rloc1ReturnValueContainer) && rloc2Value.equals(rloc2ReturnValueContainer))
1004 || (rloc1Value.equals(rloc2ReturnValueContainer) && rloc2Value.equals(rloc1ReturnValueContainer)));
1007 private MapReply sendMapRegisterTwiceWithDiffrentValues(Eid eid, Rloc rloc1, Rloc rloc2)
1008 throws SocketTimeoutException {
1009 mapService.addAuthenticationKey(eid, NULL_AUTH_KEY);
1011 MapRegister mb = createMapRegister(eid, rloc1);
1012 MapNotify mapNotify = lms.handleMapRegister(mb).getLeft();
1013 MapRequest mr = createMapRequest(eid);
1014 MapReply mapReply = lms.handleMapRequest(mr);
1015 assertEquals(mb.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0).getRloc(),
1016 mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0).getRloc());
1017 mb = createMapRegister(eid, rloc2);
1018 mapNotify = lms.handleMapRegister(mb).getLeft();
1019 assertEquals(8, mapNotify.getNonce().longValue());
1020 mr = createMapRequest(eid);
1022 mapReply = lms.handleMapRequest(mr);
1026 public void mapRegisterWithAuthenticationWithoutConfiguringAKey() throws SocketTimeoutException {
1028 sendPacket(mapRegisterPacketWithAuthenticationAndMapNotify);
1030 receivePacket(3000);
1031 // If didn't timeout then fail:
1033 } catch (SocketTimeoutException ste) {
1037 public void mapRegisterWithoutMapNotify() {
1039 sendPacket(mapRegisterPacketWithoutNotify);
1041 receivePacket(3000);
1042 // If didn't timeout then fail:
1044 } catch (SocketTimeoutException ste) {
1048 public void registerQueryRegisterWithSmr() throws SocketTimeoutException {
1050 lms.setShouldUseSmr(true);
1051 mapService.addAuthenticationKey(LispAddressUtil.asIpv4PrefixBinaryEid("153.16.254.1/32"), NULL_AUTH_KEY);
1054 sendPacket(mapRegisterPacketWithNotify);
1058 sendPacket(mapRequestPacket);
1061 mapRegisterPacketWithoutNotify[mapRegisterPacketWithoutNotify.length - 1] += 1;
1062 sendPacket(mapRegisterPacketWithoutNotify);
1064 ByteBuffer readBuf = ByteBuffer.wrap(receivePacket().getData());
1065 MapRequest smr = MapRequestSerializer.getInstance().deserialize(readBuf, null);
1066 assertTrue(smr.isSmr());
1067 Eid sourceEid = smr.getSourceEid().getEid();
1068 assertTrue(LispAddressUtil.asIpv4Eid("153.16.254.1").equals(sourceEid));
1069 Eid smrEid = smr.getEidItem().get(0).getEid();
1070 assertTrue(LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32").equals(smrEid));
1073 // --------------------- Northbound Tests ---------------------------
1075 private void northboundAddKey() throws Exception {
1077 LispIpv4Address address = LispAddressUtil.asIPAfiAddress("1.2.3.4");
1079 String pass = "asdf";
1081 URL url = createPutURL("key");
1082 String authKeyJSON = createAuthKeyJSON(pass, address, mask);
1083 callURL("PUT", "application/json", "text/plain", authKeyJSON, url);
1085 String retrievedKey = lms.getAuthenticationKey(LispAddressUtil.toContainer(address), mask);
1087 // Check stored password matches the one sent
1088 assertEquals(pass, retrievedKey);
1092 private void northboundRetrieveSourceDestKey() throws Exception {
1094 org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.lispsimpleaddress.primitiveaddress.Ipv4
1095 address1 = (org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispsimpleaddress
1096 .primitiveaddress.Ipv4) LispAddressUtil
1097 .toPrimitive(LispAddressUtil.asIPAfiAddress("10.0.0.1"));
1098 org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.lispsimpleaddress.primitiveaddress.Ipv4
1099 address2 = (org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispsimpleaddress
1100 .primitiveaddress.Ipv4) LispAddressUtil
1101 .toPrimitive(LispAddressUtil.asIPAfiAddress("10.0.0.2"));
1104 LcafSourceDestAddr sourceDestAddress = new LcafSourceDestAddrBuilder().setAfi(
1105 AddressFamilyNumberEnum.LCAF.getIanaCode())
1106 .setLcafType((short) LispCanonicalAddressFormatEnum.SOURCE_DEST.getLispCode())
1107 .setSrcAddress(new SrcAddressBuilder().setPrimitiveAddress(address1).build())
1108 .setSrcMaskLength((short) mask1)
1109 .setDstAddress(new DstAddressBuilder().setPrimitiveAddress(address2).build())
1110 .setDstMaskLength((short) mask2).build();
1111 String pass = "asdf";
1113 lms.addAuthenticationKey(LispAddressUtil.toContainer(sourceDestAddress), mask1, pass);
1115 // URL url = createGetKeyIPv4URL(address1, mask1);
1116 URL url = createGetKeySourceDestURL(address1.getIpv4Address().getAfi(),
1117 ((LispIpv4Address) LispAddressUtil.toAFIfromPrimitive(sourceDestAddress.getSrcAddress()
1118 .getPrimitiveAddress())).getIpv4Address().getValue(), sourceDestAddress.getSrcMaskLength(),
1119 ((LispIpv4Address) LispAddressUtil.toAFIfromPrimitive(sourceDestAddress.getDstAddress()
1120 .getPrimitiveAddress())).getIpv4Address().getValue(), sourceDestAddress.getDstMaskLength());
1121 String reply = callURL("GET", null, "application/json", null, url);
1122 JSONTokener jt = new JSONTokener(reply);
1123 JSONObject json = new JSONObject(jt);
1125 // test that the password matches what was we expected.
1126 assertEquals(pass, json.get("key"));
1130 private void northboundRetrieveKey() throws Exception {
1132 LispIpv4Address address = LispAddressUtil.asIPAfiAddress("10.0.0.1");
1134 String pass = "asdf";
1136 lms.addAuthenticationKey(LispAddressUtil.toContainer(address), mask, pass);
1138 URL url = createGetKeyIPv4URL(address, mask);
1139 String reply = callURL("GET", null, "application/json", null, url);
1140 JSONTokener jt = new JSONTokener(reply);
1141 JSONObject json = new JSONObject(jt);
1143 // test that the password matches what was we expected.
1144 assertEquals(pass, json.get("key"));
1148 private String createAuthKeyJSON(String key, LispIpv4Address address, int mask) {
1149 return "{\"key\" : \"" + key + "\",\"maskLength\" : " + mask + ",\"address\" : " + "{\"ipAddress\" : \""
1150 + address.getIpv4Address().getValue() + "\",\"afi\" : " + address.getAfi().shortValue() + "}}";
1153 private void northboundAddMapping() throws Exception {
1155 String pass = "asdf";
1156 LispIpv4Address eid = LispAddressUtil.asIPAfiAddress("10.0.0.1");
1158 LispIpv4Address rloc = LispAddressUtil.asIPAfiAddress("20.0.0.2");
1160 // NB add mapping always checks the key
1161 lms.addAuthenticationKey(LispAddressUtil.toContainer(eid), mask, pass);
1163 URL url = createPutURL("mapping");
1164 String mapRegisterJSON = createMapRegisterJSON(pass, eid, mask, rloc);
1165 callURL("PUT", "application/json", "text/plain", mapRegisterJSON, url);
1167 // Retrieve the RLOC from the database
1168 MapRequestBuilder mapRequestBuilder = new MapRequestBuilder();
1169 mapRequestBuilder.setPitr(false);
1170 mapRequestBuilder.setEidItem(new ArrayList<EidItem>());
1171 mapRequestBuilder.getEidItem().add(
1172 new EidRecordBuilder().setMask((short) mask).setLispAddressContainer(
1173 LispAddressUtil.toContainer(eid)).build());
1174 MapReply mapReply = lms.handleMapRequest(mapRequestBuilder.build());
1176 LispIpv4Address retrievedRloc = (LispIpv4Address) LispAddressUtil.toAFI(
1177 mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0)
1178 .getLispAddressContainer());
1180 assertEquals(rloc.getIpv4Address().getValue(), retrievedRloc.getIpv4Address().getValue());
1184 private String createMapRegisterJSON(String key, LispIpv4Address eid, int mask, LispIpv4Address rloc) {
1185 String jsonString = "{ " + "\"key\" : \"" + key + "\"," + "\"mapregister\" : " + "{ "
1186 + "\"proxyMapReply\" : false, "
1187 + "\"eidToLocatorRecords\" : " + "[ " + "{ " + "\"authoritative\" : true," + "\"prefixGeneric\" : "
1188 + "{ " + "\"ipAddress\" : \""
1189 + eid.getIpv4Address().getValue() + "\"," + "\"afi\" : " + eid.getAfi().shortValue() + "},"
1190 + "\"mapVersion\" : 0,"
1191 + "\"maskLength\" : " + mask + ", " + "\"action\" : \"NoAction\"," + "\"locators\" : " + "[ " + "{ "
1192 + "\"multicastPriority\" : 1,"
1193 + "\"locatorGeneric\" : " + "{ " + "\"ipAddress\" : \"" + rloc.getIpv4Address().getValue() + "\","
1195 + rloc.getAfi().shortValue() + "}, " + "\"routed\" : true," + "\"multicastWeight\" : 50,"
1196 + "\"rlocProbed\" : false, "
1197 + "\"localLocator\" : false, " + "\"priority\" : 1, " + "\"weight\" : 50 " + "} " + "], "
1198 + "\"recordTtl\" : 100" + "} " + "], "
1199 + "\"nonce\" : 3," + "\"keyId\" : 0 " + "} " + "}";
1204 private void northboundRetrieveMapping() throws Exception {
1206 LispIpv4Address eid = LispAddressUtil.asIPAfiAddress("10.0.0.1");
1208 LispIpv4Address rloc = LispAddressUtil.asIPAfiAddress("20.0.0.2");
1209 // Insert mapping in the database
1210 MapRegisterBuilder mapRegister = new MapRegisterBuilder();
1211 EidToLocatorRecordBuilder etlr = new EidToLocatorRecordBuilder();
1212 etlr.setLispAddressContainer(LispAddressUtil.toContainer(eid));
1213 etlr.setMaskLength((short) mask);
1214 etlr.setRecordTtl(254);
1215 etlr.setAuthoritative(false);
1216 etlr.setAction(Action.NoAction);
1217 LocatorRecordBuilder record = new LocatorRecordBuilder();
1218 record.setLispAddressContainer(LispAddressUtil.toContainer(rloc));
1219 record.setRouted(true);
1220 record.setRlocProbed(false);
1221 record.setLocalLocator(false);
1222 record.setPriority((short) 1);
1223 record.setWeight((short) 50);
1224 record.setMulticastPriority((short) 1);
1225 record.setMulticastWeight((short) 1);
1226 etlr.setLocatorRecord(new ArrayList<LocatorRecord>());
1227 etlr.getLocatorRecord().add(record.build());
1228 mapRegister.setMappingRecordItem(new ArrayList<MappingRecordItem>());
1229 mapRegister.getMappingRecordItem().add(new MappingRecordItemBuilder().setMappingRecord(etlr.build()).build());
1230 lms.handleMapRegister(mapRegister.build());
1232 // Get mapping using NB interface. No IID used
1233 URL url = createGetMappingIPv4URL(0, eid, mask);
1234 String reply = callURL("GET", null, "application/json", null, url);
1235 JSONTokener jt = new JSONTokener(reply);
1236 JSONObject json = new JSONObject(jt);
1238 // With just one locator, locators is not a JSONArray
1239 String rlocRetrieved = json.getJSONArray("locators").getJSONObject(0).getJSONObject("locatorGeneric")
1240 .getString("ipAddress");
1242 assertEquals(rloc.getIpv4Address().getValue(), rlocRetrieved);
1246 private void northboundDeleteMapping() throws Exception {
1248 LispIpv4Address eid = LispAddressUtil.asIPAfiAddress("10.0.0.1");
1250 LispIpv4Address rloc = LispAddressUtil.asIPAfiAddress("20.0.0.2");
1251 // Insert mapping in the database
1252 MapRegisterBuilder mapRegister = new MapRegisterBuilder();
1253 EidToLocatorRecordBuilder etlr = new EidToLocatorRecordBuilder();
1254 etlr.setLispAddressContainer(LispAddressUtil.toContainer(eid));
1255 etlr.setMaskLength((short) mask);
1256 etlr.setRecordTtl(254);
1257 etlr.setAuthoritative(false);
1258 etlr.setAction(Action.NoAction);
1259 LocatorRecordBuilder record = new LocatorRecordBuilder();
1260 record.setLispAddressContainer(LispAddressUtil.toContainer(rloc));
1261 record.setRouted(true);
1262 record.setRlocProbed(false);
1263 record.setLocalLocator(false);
1264 record.setPriority((short) 1);
1265 record.setWeight((short) 50);
1266 record.setMulticastPriority((short) 1);
1267 record.setMulticastWeight((short) 1);
1268 etlr.setLocatorRecord(new ArrayList<LocatorRecord>());
1269 etlr.getLocatorRecord().add(record.build());
1270 mapRegister.setMappingRecordItem(new ArrayList<MappingRecordItem>());
1271 mapRegister.getMappingRecordItem().add(new MappingRecordItemBuilder().setMappingRecord(etlr.build()).build());
1272 lms.handleMapRegister(mapRegister.build());
1274 // Delete mapping using NB interface. No IID used
1275 URL url = createDeleteMappingIPv4URL(0, eid, mask);
1276 String reply = callURL("DELETE", null, "application/json", null, url);
1278 // Get mapping using NB interface. No IID used
1279 url = createGetMappingIPv4URL(0, eid, mask);
1280 reply = callURL("GET", null, "application/json", null, url);
1281 JSONTokener jt = new JSONTokener(reply);
1282 JSONObject json = new JSONObject(jt);
1284 // With just one locator, locators is not a JSONArray
1285 assertEquals(json.getJSONArray("locators").length(), 0);
1288 private void northboundRetrieveSourceDestMapping() throws Exception {
1290 org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.lispsimpleaddress.primitiveaddress.Ipv4
1291 address1 = (org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispsimpleaddress
1292 .primitiveaddress.Ipv4) LispAddressUtil
1293 .toPrimitive(LispAddressUtil.asIPAfiAddress("10.0.0.1"));
1294 org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.lispsimpleaddress.primitiveaddress.Ipv4
1295 address2 = (org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispsimpleaddress
1296 .primitiveaddress.Ipv4) LispAddressUtil
1297 .toPrimitive(LispAddressUtil.asIPAfiAddress("10.0.0.2"));
1300 LcafSourceDestAddr sourceDestAddress = new LcafSourceDestAddrBuilder().setAfi(
1301 AddressFamilyNumberEnum.LCAF.getIanaCode())
1302 .setLcafType((short) LispCanonicalAddressFormatEnum.SOURCE_DEST.getLispCode())
1303 .setSrcAddress(new SrcAddressBuilder().setPrimitiveAddress(
1304 address1).build()).setSrcMaskLength((short) mask1)
1305 .setDstAddress(new DstAddressBuilder().setPrimitiveAddress(
1306 address2).build()).setDstMaskLength((short) mask2).build();
1307 LispIpv4Address rloc = LispAddressUtil.asIPAfiAddress("20.0.0.2");
1309 // Insert mapping in the database
1310 MapRegisterBuilder mapRegister = new MapRegisterBuilder();
1311 EidToLocatorRecordBuilder etlr = new EidToLocatorRecordBuilder();
1312 etlr.setLispAddressContainer(LispAddressUtil.toContainer(sourceDestAddress));
1313 etlr.setMaskLength((short) mask1);
1314 etlr.setRecordTtl(254);
1315 etlr.setAuthoritative(false);
1316 etlr.setAction(Action.NoAction);
1317 LocatorRecordBuilder record = new LocatorRecordBuilder();
1318 record.setLispAddressContainer(LispAddressUtil.toContainer(rloc));
1319 record.setRouted(true);
1320 record.setRlocProbed(false);
1321 record.setLocalLocator(false);
1322 record.setPriority((short) 1);
1323 record.setWeight((short) 50);
1324 record.setMulticastPriority((short) 1);
1325 record.setMulticastWeight((short) 1);
1326 etlr.setLocatorRecord(new ArrayList<LocatorRecord>());
1327 etlr.getLocatorRecord().add(record.build());
1328 mapRegister.setMappingRecordItem(new ArrayList<MappingRecordItem>());
1329 mapRegister.getMappingRecordItem().add(new MappingRecordItemBuilder().setMappingRecord(etlr.build()).build());
1330 lms.handleMapRegister(mapRegister.build());
1332 // Get mapping using NB interface. No IID used
1333 URL url = createGetMappingSourceDestURL(address1.getIpv4Address().getAfi(),
1334 address1.getIpv4Address().getIpv4Address().getValue(),
1336 address2.getIpv4Address().getIpv4Address().getValue(),
1338 String reply = callURL("GET", null, "application/json", null, url);
1339 JSONTokener jt = new JSONTokener(reply);
1340 JSONObject json = new JSONObject(jt);
1342 // With just one locator, locators is not a JSONArray
1343 String rlocRetrieved = json.getJSONArray("locators").getJSONObject(0).getJSONObject("locatorGeneric")
1344 .getString("ipAddress");
1346 assertEquals(rloc.getIpv4Address().getValue(), rlocRetrieved);
1350 private URL createGetKeyIPv4URL(LispIpv4Address address, int mask) throws MalformedURLException {
1351 String restUrl = String.format("http://localhost:8080/lispflowmapping/nb/v2/default/%s/0/%d/%s/%d", "key",
1352 address.getAfi().shortValue(),
1353 address.getIpv4Address().getValue(), mask);
1354 URL url = new URL(restUrl);
1358 private URL createGetKeySourceDestURL(int afi, String srcAddress, int srcMask, String dstAddress, int dstMask)
1359 throws MalformedURLException {
1360 String restUrl = String.format("http://localhost:8080/lispflowmapping/nb/v2/default/%s/0/%d/%s/%d/%s/%d",
1361 "key", afi, srcAddress, srcMask,
1362 dstAddress, dstMask);
1363 URL url = new URL(restUrl);
1367 private URL createGetMappingSourceDestURL(int afi, String srcAddress, int srcMask, String dstAddress, int dstMask)
1368 throws MalformedURLException {
1369 String restUrl = String.format("http://localhost:8080/lispflowmapping/nb/v2/default/%s/0/%d/%s/%d/%s/%d",
1370 "mapping", afi, srcAddress,
1371 srcMask, dstAddress, dstMask);
1372 URL url = new URL(restUrl);
1376 private URL createGetMappingIPv4URL(int iid, LispIpv4Address address, int mask) throws MalformedURLException {
1377 String restUrl = String.format("http://localhost:8080/lispflowmapping/nb/v2/default/%s/%d/%d/%s/%d", "mapping",
1378 iid, address.getAfi()
1379 .shortValue(), address.getIpv4Address().getValue(), mask);
1380 URL url = new URL(restUrl);
1384 private URL createDeleteMappingIPv4URL(int iid, LispIpv4Address address, int mask) throws MalformedURLException {
1385 String restUrl = String.format("http://localhost:8080/lispflowmapping/nb/v2/default/%s/%d/%d/%s/%d", "mapping",
1386 iid, address.getAfi()
1387 .shortValue(), address.getIpv4Address().getValue(), mask);
1388 URL url = new URL(restUrl);
1392 private URL createPutURL(String resource) throws MalformedURLException {
1394 String restUrl = String.format("http://localhost:8080/lispflowmapping/nb/v2/default/%s", resource);
1396 URL url = new URL(restUrl);
1400 private String createAuthenticationString() {
1401 String authString = "admin:admin";
1402 byte[] authEncBytes = Base64.encodeBase64(authString.getBytes());
1403 String authStringEnc = new String(authEncBytes);
1404 return authStringEnc;
1407 private String callURL(String method, String content, String accept, String body, URL url) throws IOException,
1409 String authStringEnc = createAuthenticationString();
1410 connection = (HttpURLConnection) url.openConnection();
1411 connection.setRequestMethod(method);
1412 connection.setRequestProperty("Authorization", "Basic " + authStringEnc);
1413 if (content != null) {
1414 connection.setRequestProperty("Content-Type", content);
1416 if (accept != null) {
1417 connection.setRequestProperty("Accept", accept);
1420 // now add the request body
1421 connection.setDoOutput(true);
1422 OutputStreamWriter wr = new OutputStreamWriter(connection.getOutputStream());
1426 connection.connect();
1428 // getting the result, first check response code
1429 Integer httpResponseCode = connection.getResponseCode();
1431 if (httpResponseCode > 299) {
1432 LOG.trace("HTTP Address: " + url);
1433 LOG.trace("HTTP Response Code: " + httpResponseCode);
1437 InputStream is = connection.getInputStream();
1438 BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
1439 StringBuilder sb = new StringBuilder();
1441 while ((cp = rd.read()) != -1) {
1442 sb.append((char) cp);
1445 connection.disconnect();
1446 return (sb.toString());
1449 // timePeriod - in ms
1450 public void assertNoPacketReceived(int timePeriod) {
1452 receivePacket(timePeriod);
1453 // If didn't timeout then fail:
1455 } catch (SocketTimeoutException ste) {
1459 // ------------------------------- Mask Tests ---------------------------
1461 public void eidPrefixLookupIPv4() throws SocketTimeoutException {
1463 runPrefixTest(LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/16"),
1464 LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.2/32"),
1465 LispAddressUtil.asIpv4PrefixBinaryEid("1.1.1.1/32"));
1468 public void eidPrefixLookupIPv6() throws SocketTimeoutException {
1470 runPrefixTest(LispAddressUtil.asIpv6PrefixBinaryEid("1:2:3:4:5:6:7:8/64"),
1471 LispAddressUtil.asIpv6PrefixBinaryEid("1:2:3:4:5:1:2:3/128"),
1472 LispAddressUtil.asIpv6PrefixBinaryEid("1:2:3:1:2:3:1:2/128"));
1475 private void runPrefixTest(Eid registerEID, Eid matchedAddress, Eid unMatchedAddress)
1476 throws SocketTimeoutException {
1477 mapService.addAuthenticationKey(registerEID, NULL_AUTH_KEY);
1480 MapRegisterBuilder mapRegister = new MapRegisterBuilder();
1481 mapRegister.setWantMapNotify(true);
1482 mapRegister.setNonce((long) 8);
1483 mapRegister.setWantMapNotify(true);
1484 mapRegister.setKeyId((short) 0);
1485 mapRegister.setAuthenticationData(new byte[0]);
1486 mapRegister.setNonce((long) 8);
1487 mapRegister.setProxyMapReply(false);
1488 MappingRecordBuilder etlr = new MappingRecordBuilder();
1489 etlr.setRecordTtl(254);
1490 etlr.setAction(Action.NoAction);
1491 etlr.setAuthoritative(false);
1492 etlr.setMapVersion((short) 0);
1493 etlr.setEid(registerEID);
1494 etlr.setRecordTtl(254);
1495 LocatorRecordBuilder record = new LocatorRecordBuilder();
1496 record.setRloc(LispAddressUtil.asIpv4Rloc("4.3.2.1"));
1497 record.setLocalLocator(false);
1498 record.setRlocProbed(false);
1499 record.setRouted(true);
1500 record.setMulticastPriority((short) 0);
1501 record.setMulticastWeight((short) 0);
1502 record.setPriority((short) 0);
1503 record.setWeight((short) 0);
1504 etlr.setLocatorRecord(new ArrayList<LocatorRecord>());
1505 etlr.getLocatorRecord().add(record.build());
1506 mapRegister.setMappingRecordItem(new ArrayList<MappingRecordItem>());
1507 mapRegister.getMappingRecordItem().add(new MappingRecordItemBuilder().setMappingRecord(etlr.build()).build());
1508 sendMapRegister(mapRegister.build());
1509 MapNotify mapNotify = receiveMapNotify();
1510 assertEquals(8, mapNotify.getNonce().longValue());
1512 MapRequestBuilder mapRequest = new MapRequestBuilder();
1513 mapRequest.setNonce((long) 4);
1514 mapRequest.setSourceEid(new SourceEidBuilder().setEid(LispAddressUtil.asIpv4Eid(ourAddress)).build());
1515 mapRequest.setEidItem(new ArrayList<EidItem>());
1516 mapRequest.setAuthoritative(false);
1517 mapRequest.setMapDataPresent(false);
1518 mapRequest.setPitr(false);
1519 mapRequest.setProbe(false);
1520 mapRequest.setSmr(false);
1521 mapRequest.setSmrInvoked(false);
1522 mapRequest.getEidItem().add(new EidItemBuilder().setEid(matchedAddress).build());
1523 mapRequest.setItrRloc(new ArrayList<ItrRloc>());
1524 mapRequest.getItrRloc().add(
1525 new ItrRlocBuilder().setRloc(LispAddressUtil.asIpv4Rloc(ourAddress)).build());
1526 sendMapRequest(mapRequest.build());
1527 MapReply mapReply = receiveMapReply();
1528 assertEquals(4, mapReply.getNonce().longValue());
1529 assertEquals(record.getRloc(), mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord()
1531 mapRequest.setEidItem(new ArrayList<EidItem>());
1532 mapRequest.getEidItem().add(new EidItemBuilder().setEid(unMatchedAddress).build());
1533 sendMapRequest(mapRequest.build());
1534 mapReply = receiveMapReply();
1535 assertEquals(0, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().size());
1538 // This registers an IP with a MapRegister, then adds a password via the
1539 // northbound REST API
1540 // and checks that the password works
1541 public void testPasswordExactMatch() throws Exception {
1543 String ipString = "10.0.0.1";
1544 LispIpv4Address address = LispAddressUtil.asIPAfiAddress(ipString);
1546 String pass = "pass";
1548 URL url = createPutURL("key");
1550 String jsonAuthData = createAuthKeyJSON(pass, address, mask);
1552 LOG.trace("Sending this JSON to LISP server: \n" + jsonAuthData);
1553 LOG.trace("Address: " + address);
1555 byte[] expectedSha = new byte[] { (byte) 146, (byte) 234, (byte) 52, (byte) 247, (byte) 186, (byte) 232,
1556 (byte) 31, (byte) 249, (byte) 87,
1557 (byte) 73, (byte) 234, (byte) 54, (byte) 225, (byte) 160, (byte) 129, (byte) 251, (byte) 73, (byte) 53,
1558 (byte) 196, (byte) 62 };
1560 byte[] zeros = new byte[20];
1562 callURL("PUT", "application/json", "text/plain", jsonAuthData, url);
1564 // build a MapRegister
1565 MapRegisterBuilder mapRegister = new MapRegisterBuilder();
1566 mapRegister.setWantMapNotify(true);
1567 mapRegister.setNonce((long) 8);
1568 EidToLocatorRecordBuilder etlr = new EidToLocatorRecordBuilder();
1569 etlr.setLispAddressContainer(LispAddressUtil.toContainer(address));
1570 etlr.setMaskLength((short) mask);
1571 etlr.setRecordTtl(254);
1572 LocatorRecordBuilder record = new LocatorRecordBuilder();
1573 record.setLispAddressContainer(LispAddressUtil.toContainer(locatorEid));
1574 etlr.setLocatorRecord(new ArrayList<LocatorRecord>());
1575 etlr.getLocatorRecord().add(record.build());
1576 mapRegister.setMappingRecordItem(new ArrayList<MappingRecordItem>());
1577 mapRegister.getMappingRecordItem().add(new MappingRecordItemBuilder().setMappingRecord(etlr.build()).build());
1579 mapRegister.setKeyId((short) 1); // LispKeyIDEnum.SHA1.getKeyID()
1580 mapRegister.setAuthenticationData(zeros);
1582 sendMapRegister(mapRegister.build());
1583 assertNoPacketReceived(3000);
1585 mapRegister.setAuthenticationData(expectedSha);
1587 sendMapRegister(mapRegister.build());
1589 assertMapNotifyReceived();
1592 public void testPasswordMaskMatch() throws Exception {
1594 LispIpv4Address addressInRange = LispAddressUtil.asIPAfiAddress("10.20.30.40");
1595 LispIpv4Address addressOutOfRange = LispAddressUtil.asIPAfiAddress("20.40.30.40");
1596 LispIpv4Address range = LispAddressUtil.asIPAfiAddress("10.20.30.0");
1599 String pass = "pass";
1601 URL url = createPutURL("key");
1602 String jsonAuthData = createAuthKeyJSON(pass, range, 8);
1604 callURL("PUT", "application/json", "text/plain", jsonAuthData, url);
1605 // build a MapRegister
1606 MapRegisterBuilder mapRegister = new MapRegisterBuilder();
1608 mapRegister.setWantMapNotify(true);
1609 mapRegister.setNonce((long) 8);
1610 EidToLocatorRecordBuilder etlr = new EidToLocatorRecordBuilder();
1611 etlr.setLispAddressContainer(LispAddressUtil.toContainer(addressInRange));
1612 etlr.setMaskLength((short) mask);
1613 etlr.setRecordTtl(254);
1614 LocatorRecordBuilder record = new LocatorRecordBuilder();
1615 record.setLispAddressContainer(LispAddressUtil.toContainer(locatorEid));
1616 record.setLispAddressContainer(LispAddressUtil.toContainer(locatorEid));
1617 etlr.setLocatorRecord(new ArrayList<LocatorRecord>());
1618 etlr.getLocatorRecord().add(record.build());
1619 mapRegister.setMappingRecordItem(new ArrayList<MappingRecordItem>());
1620 mapRegister.getMappingRecordItem().add(new MappingRecordItemBuilder().setMappingRecord(etlr.build()).build());
1622 mapRegister.setKeyId((short) 1); // LispKeyIDEnum.SHA1.getKeyID()
1624 .setAuthenticationData(new byte[] { -15, -52, 38, -94, 125, -111, -68, -79, 68, 6, 101, 45, -1, 47, -4,
1625 -67, -113, 104, -110, -71 });
1627 sendMapRegister(mapRegister.build());
1629 assertMapNotifyReceived();
1631 etlr.setLispAddressContainer(LispAddressUtil.toContainer(addressOutOfRange));
1633 .setAuthenticationData(new byte[] { -54, 68, -58, -91, -23, 22, -88, -31, 113, 39, 115, 78, -68, -123,
1634 -71, -14, -99, 67, -23, -73 });
1636 sendMapRegister(mapRegister.build());
1637 assertNoPacketReceived(3000);
1640 // takes an address, packs it in a MapRegister and sends it
1641 private void registerAddress(Eid eid) throws SocketTimeoutException {
1642 mapService.addAuthenticationKey(eid, NULL_AUTH_KEY);
1644 MapRegisterBuilder mapRegisterBuilder = new MapRegisterBuilder();
1645 mapRegisterBuilder.setWantMapNotify(true);
1646 mapRegisterBuilder.setKeyId((short) 0);
1647 mapRegisterBuilder.setAuthenticationData(new byte[0]);
1648 mapRegisterBuilder.setNonce((long) 8);
1649 mapRegisterBuilder.setProxyMapReply(false);
1650 MappingRecordBuilder etlrBuilder = new MappingRecordBuilder();
1651 etlrBuilder.setEid(eid);
1652 etlrBuilder.setRecordTtl(254);
1653 etlrBuilder.setAction(Action.NoAction);
1654 etlrBuilder.setAuthoritative(false);
1655 etlrBuilder.setMapVersion((short) 0);
1656 LocatorRecordBuilder recordBuilder = new LocatorRecordBuilder();
1657 recordBuilder.setLocalLocator(false);
1658 recordBuilder.setRlocProbed(false);
1659 recordBuilder.setRouted(true);
1660 recordBuilder.setMulticastPriority((short) 0);
1661 recordBuilder.setMulticastWeight((short) 0);
1662 recordBuilder.setPriority((short) 0);
1663 recordBuilder.setWeight((short) 0);
1664 recordBuilder.setRloc(locatorEid);
1665 etlrBuilder.setLocatorRecord(new ArrayList<LocatorRecord>());
1666 etlrBuilder.getLocatorRecord().add(recordBuilder.build());
1667 mapRegisterBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
1668 mapRegisterBuilder.getMappingRecordItem().add(
1669 new MappingRecordItemBuilder().setMappingRecord(etlrBuilder.build()).build());
1670 sendMapRegister(mapRegisterBuilder.build());
1671 MapNotify mapNotify = receiveMapNotify();
1672 assertEquals(8, mapNotify.getNonce().longValue());
1675 private MapReply queryForAddress(Eid eid, String srcEid) throws SocketTimeoutException {
1676 MapRequestBuilder mapRequestBuilder = new MapRequestBuilder();
1677 mapRequestBuilder.setNonce((long) 4);
1678 mapRequestBuilder.setEidItem(new ArrayList<EidItem>());
1679 mapRequestBuilder.getEidItem().add(new EidItemBuilder().setEid(eid).build());
1680 mapRequestBuilder.setItrRloc(new ArrayList<ItrRloc>());
1681 if (srcEid != null) {
1682 mapRequestBuilder.setSourceEid(new SourceEidBuilder().setEid(LispAddressUtil.asIpv4Eid(srcEid)).build());
1684 mapRequestBuilder.setSourceEid(new SourceEidBuilder().setEid(LispAddressUtil.asIpv4Eid(ourAddress))
1687 mapRequestBuilder.getItrRloc().add(
1688 new ItrRlocBuilder().setRloc(LispAddressUtil.asIpv4Rloc(ourAddress)).build());
1689 mapRequestBuilder.setAuthoritative(false);
1690 mapRequestBuilder.setMapDataPresent(false);
1691 mapRequestBuilder.setPitr(false);
1692 mapRequestBuilder.setProbe(false);
1693 mapRequestBuilder.setSmr(false);
1694 mapRequestBuilder.setSmrInvoked(false);
1695 sendMapRequest(mapRequestBuilder.build());
1696 return receiveMapReply();
1699 // takes an address, packs it in a MapRegister, sends it, returns the
1701 private MapReply registerAddressAndQuery(Eid eid) throws SocketTimeoutException {
1702 mapService.addAuthenticationKey(eid, NULL_AUTH_KEY);
1704 MapRegisterBuilder mapRegisterBuilder = new MapRegisterBuilder();
1705 mapRegisterBuilder.setWantMapNotify(true);
1706 mapRegisterBuilder.setKeyId((short) 0);
1707 mapRegisterBuilder.setAuthenticationData(new byte[0]);
1708 mapRegisterBuilder.setNonce((long) 8);
1709 mapRegisterBuilder.setProxyMapReply(false);
1710 MappingRecordBuilder etlrBuilder = new MappingRecordBuilder();
1711 etlrBuilder.setEid(eid);
1712 etlrBuilder.setRecordTtl(254);
1713 etlrBuilder.setAction(Action.NoAction);
1714 etlrBuilder.setAuthoritative(false);
1715 etlrBuilder.setMapVersion((short) 0);
1716 LocatorRecordBuilder recordBuilder = new LocatorRecordBuilder();
1717 recordBuilder.setLocalLocator(false);
1718 recordBuilder.setRlocProbed(false);
1719 recordBuilder.setRouted(true);
1720 recordBuilder.setMulticastPriority((short) 0);
1721 recordBuilder.setMulticastWeight((short) 0);
1722 recordBuilder.setPriority((short) 0);
1723 recordBuilder.setWeight((short) 0);
1724 recordBuilder.setRloc(locatorEid);
1725 etlrBuilder.setLocatorRecord(new ArrayList<LocatorRecord>());
1726 etlrBuilder.getLocatorRecord().add(recordBuilder.build());
1727 mapRegisterBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
1728 mapRegisterBuilder.getMappingRecordItem().add(new MappingRecordItemBuilder().setMappingRecord(
1729 etlrBuilder.build()).build());
1730 sendMapRegister(mapRegisterBuilder.build());
1731 MapNotify mapNotify = receiveMapNotify();
1732 assertEquals(8, mapNotify.getNonce().longValue());
1733 // wait for the notifications to propagate
1735 MapRequestBuilder mapRequestBuilder = new MapRequestBuilder();
1736 mapRequestBuilder.setNonce((long) 4);
1737 mapRequestBuilder.setEidItem(new ArrayList<EidItem>());
1738 mapRequestBuilder.getEidItem().add(new EidItemBuilder().setEid(eid).build());
1739 mapRequestBuilder.setItrRloc(new ArrayList<ItrRloc>());
1740 mapRequestBuilder.setSourceEid(new SourceEidBuilder().setEid(LispAddressUtil.asIpv4Eid(ourAddress)).build());
1741 mapRequestBuilder.getItrRloc().add(
1742 new ItrRlocBuilder().setRloc(LispAddressUtil.asIpv4Rloc(ourAddress)).build());
1743 mapRequestBuilder.setAuthoritative(false);
1744 mapRequestBuilder.setMapDataPresent(false);
1745 mapRequestBuilder.setPitr(false);
1746 mapRequestBuilder.setProbe(false);
1747 mapRequestBuilder.setSmr(false);
1748 mapRequestBuilder.setSmrInvoked(false);
1749 sendMapRequest(mapRequestBuilder.build());
1750 return receiveMapReply();
1753 // ------------------------------- LCAF Tests ---------------------------
1755 public void registerAndQuery__SrcDestLCAF() throws SocketTimeoutException {
1757 String ipPrefix = "10.20.30.200/32";
1758 String macString = "01:02:03:04:05:06";
1760 SourceDestKeyBuilder builder = new SourceDestKeyBuilder();
1761 builder.setSource(new SimpleAddress(new IpPrefix(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
1762 .ietf.inet.types.rev130715.Ipv4Prefix(ipPrefix))));
1763 builder.setDest(new SimpleAddress(new MacAddress(macString)));
1765 EidBuilder eb = new EidBuilder();
1766 eb.setAddressType(SourceDestKeyLcaf.class);
1767 eb.setVirtualNetworkId(null);
1768 eb.setAddress(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
1769 .lisp.address.address.SourceDestKeyBuilder().setSourceDestKey(builder.build()).build());
1771 MapReply reply = registerAddressAndQuery(eb.build());
1773 Eid fromNetwork = reply.getMappingRecordItem().get(0).getMappingRecord().getEid();
1774 assertEquals(SourceDestKeyLcaf.class, fromNetwork.getAddressType());
1775 SourceDestKey sourceDestFromNetwork = (SourceDestKey) fromNetwork.getAddress();
1777 SimpleAddress receivedAddr1 = sourceDestFromNetwork.getSourceDestKey().getSource();
1778 SimpleAddress receivedAddr2 = sourceDestFromNetwork.getSourceDestKey().getDest();
1780 assertNotNull(receivedAddr1.getIpPrefix().getIpv4Prefix());
1781 assertNotNull(receivedAddr2.getMacAddress());
1783 IpPrefix receivedIP = receivedAddr1.getIpPrefix();
1784 MacAddress receivedMAC = receivedAddr2.getMacAddress();
1786 assertEquals(ipPrefix, receivedIP.getIpv4Prefix().getValue());
1787 assertEquals(macString, receivedMAC.getValue());
1790 public void registerAndQuery__SrcDestLCAFOverlap() throws SocketTimeoutException {
1792 String ipString1 = "10.10.10.0";
1793 String ipString2 = "20.20.20.0";
1794 String ipPrefix1 = ipString1 + "/24";
1795 String ipPrefix2 = ipString2 + "/24";
1797 Eid srcDst = LispAddressUtil.asSrcDstEid(ipString1, ipString2, 24, 24, 0);
1798 registerAddress(LispAddressUtil.asIpv4PrefixBinaryEid(ipPrefix2));
1799 registerAddress(srcDst);
1802 MapReply reply = queryForAddress(srcDst, null);
1804 Eid fromNetwork = reply.getMappingRecordItem().get(0).getMappingRecord().getEid();
1805 assertEquals(SourceDestKeyLcaf.class, fromNetwork.getAddressType());
1806 SourceDestKey sourceDestFromNetwork = (SourceDestKey) fromNetwork.getAddress();
1808 IpPrefix receivedAddr1 = sourceDestFromNetwork.getSourceDestKey().getSource().getIpPrefix();
1809 IpPrefix receivedAddr2 = sourceDestFromNetwork.getSourceDestKey().getDest().getIpPrefix();
1811 assertNotNull(receivedAddr1.getIpv4Prefix());
1812 assertNotNull(receivedAddr2.getIpv4Prefix());
1814 assertEquals(ipPrefix1, receivedAddr1.getIpv4Prefix().getValue());
1815 assertEquals(ipPrefix2, receivedAddr2.getIpv4Prefix().getValue());
1817 // srcEid/dstEid match
1818 reply = queryForAddress(LispAddressUtil.asIpv4PrefixBinaryEid("20.20.20.1/32"), "10.10.10.1");
1819 fromNetwork = reply.getMappingRecordItem().get(0).getMappingRecord().getEid();
1820 assertEquals(Ipv4PrefixBinaryAfi.class, fromNetwork.getAddressType());
1822 assertEquals(LispAddressUtil.asIpv4PrefixBinaryEid(ipPrefix2), fromNetwork);
1824 // dstEid match only
1825 reply = queryForAddress(LispAddressUtil.asIpv4PrefixBinaryEid("20.20.20.1/32"), "1.2.3.4");
1826 fromNetwork = reply.getMappingRecordItem().get(0).getMappingRecord().getEid();
1827 assertEquals(Ipv4PrefixBinaryAfi.class, fromNetwork.getAddressType());
1829 assertEquals(LispAddressUtil.asIpv4PrefixBinaryEid(ipPrefix2), fromNetwork);
1832 public void registerAndQuery__KeyValueLCAF() throws SocketTimeoutException {
1834 String ipString = "10.20.30.200";
1835 String macString = "01:02:03:04:05:06";
1836 SimpleAddress addrToSend1 = new SimpleAddress(new IpAddress(new Ipv4Address(ipString)));
1837 SimpleAddress addrToSend2 = new SimpleAddress(new MacAddress(macString));
1838 Eid kv = LispAddressUtil.asKeyValueAddressEid(addrToSend1, addrToSend2);
1840 MapReply reply = registerAddressAndQuery(kv);
1842 Eid fromNetwork = reply.getMappingRecordItem().get(0).getMappingRecord().getEid();
1843 assertEquals(KeyValueAddressLcaf.class, fromNetwork.getAddressType());
1844 KeyValueAddress keyValueFromNetwork = (KeyValueAddress) fromNetwork.getAddress();
1846 SimpleAddress receivedAddr1 = keyValueFromNetwork.getKeyValueAddress().getKey();
1847 SimpleAddress receivedAddr2 = keyValueFromNetwork.getKeyValueAddress().getValue();
1849 assertNotNull(receivedAddr1.getIpAddress().getIpv4Address());
1850 assertNotNull(receivedAddr2.getMacAddress());
1852 Ipv4Address receivedIP = receivedAddr1.getIpAddress().getIpv4Address();
1853 MacAddress receivedMAC = receivedAddr2.getMacAddress();
1855 assertEquals(ipString, receivedIP.getValue());
1856 assertEquals(macString, receivedMAC.getValue());
1859 public void registerAndQuery__ListLCAF() throws SocketTimeoutException {
1861 String macString = "01:02:03:04:05:06";
1862 String ipString = "10.20.255.30";
1863 List<SimpleAddress> addresses = new ArrayList<SimpleAddress>();
1864 addresses.add(new SimpleAddress(new IpAddress(new Ipv4Address(ipString))));
1865 addresses.add(new SimpleAddress(new MacAddress(macString)));
1866 AfiListBuilder listbuilder = new AfiListBuilder();
1867 listbuilder.setAddressList(addresses);
1869 EidBuilder eb = new EidBuilder();
1870 eb.setAddressType(AfiListLcaf.class);
1871 eb.setVirtualNetworkId(null);
1872 eb.setAddress(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
1873 .lisp.address.address.AfiListBuilder().setAfiList(listbuilder.build()).build());
1875 MapReply reply = registerAddressAndQuery(eb.build());
1877 Eid receivedAddress = reply.getMappingRecordItem().get(0).getMappingRecord().getEid();
1879 assertEquals(AfiListLcaf.class, receivedAddress.getAddressType());
1881 AfiList listAddrFromNetwork = (AfiList) receivedAddress.getAddress();
1882 SimpleAddress receivedAddr1 = (SimpleAddress) listAddrFromNetwork.getAfiList().getAddressList().get(0);
1883 SimpleAddress receivedAddr2 = (SimpleAddress) listAddrFromNetwork.getAfiList().getAddressList().get(1);
1885 assertNotNull(receivedAddr1.getIpAddress().getIpv4Address());
1886 assertNotNull(receivedAddr2.getMacAddress());
1888 assertEquals(macString, receivedAddr2.getMacAddress().getValue());
1889 assertEquals(ipString, receivedAddr1.getIpAddress().getIpv4Address().getValue());
1892 public void registerAndQuery__SegmentLCAF() throws SocketTimeoutException {
1894 String ipString = "10.20.255.30";
1897 EidBuilder eb = new EidBuilder();
1898 eb.setAddressType(Ipv4PrefixAfi.class);
1899 eb.setVirtualNetworkId(new InstanceIdType((long) instanceId));
1900 eb.setAddress(new Ipv4PrefixBuilder().setIpv4Prefix(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns
1901 .yang.ietf.inet.types.rev130715.Ipv4Prefix(ipString)).build());
1903 MapReply reply = registerAddressAndQuery(eb.build());
1905 Eid receivedAddress = reply.getMappingRecordItem().get(0).getMappingRecord().getEid();
1906 assertEquals(Ipv4PrefixAfi.class, receivedAddress.getAddressType());
1908 assertEquals(ipString, ((Ipv4Prefix) receivedAddress.getAddress()).getIpv4Prefix().getValue());
1910 assertEquals(instanceId, receivedAddress.getVirtualNetworkId().getValue().intValue());
1913 public void registerAndQuery__TrafficEngineering() throws SocketTimeoutException {
1915 String macString = "01:02:03:04:05:06";
1916 String ipString = "10.20.255.30";
1917 HopBuilder hopBuilder = new HopBuilder();
1918 hopBuilder.setAddress(new SimpleAddress(new IpAddress(new Ipv4Address(ipString))));
1919 hopBuilder.setLrsBits(new LrsBits(true, false, true));
1920 Hop hop1 = hopBuilder.build();
1921 hopBuilder.setAddress(new SimpleAddress(new MacAddress(macString)));
1922 hopBuilder.setLrsBits(new LrsBits(false, true, false));
1923 Hop hop2 = hopBuilder.build();
1924 ExplicitLocatorPathBuilder elpBuilder = new ExplicitLocatorPathBuilder();
1925 elpBuilder.setHop(new ArrayList<Hop>());
1926 elpBuilder.getHop().add(hop1);
1927 elpBuilder.getHop().add(hop2);
1929 EidBuilder eb = new EidBuilder();
1930 eb.setAddressType(ExplicitLocatorPathLcaf.class);
1931 eb.setVirtualNetworkId(null);
1932 eb.setAddress(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
1933 .lisp.address.address.ExplicitLocatorPathBuilder().setExplicitLocatorPath(elpBuilder.build()).build());
1935 MapReply reply = registerAddressAndQuery(eb.build());
1937 assertEquals(ExplicitLocatorPathLcaf.class, reply.getMappingRecordItem().get(0).getMappingRecord().getEid()
1940 ExplicitLocatorPath receivedAddress = (ExplicitLocatorPath) reply.getMappingRecordItem().get(0)
1941 .getMappingRecord().getEid().getAddress();
1943 Hop receivedHop1 = (Hop) receivedAddress.getExplicitLocatorPath().getHop().get(0);
1944 Hop receivedHop2 = (Hop) receivedAddress.getExplicitLocatorPath().getHop().get(1);
1946 assertEquals(true, receivedHop1.getLrsBits().isLookup());
1947 assertEquals(false, receivedHop1.getLrsBits().isRlocProbe());
1948 assertEquals(true, receivedHop1.getLrsBits().isStrict());
1950 assertEquals(false, receivedHop2.getLrsBits().isLookup());
1951 assertEquals(true, receivedHop2.getLrsBits().isRlocProbe());
1952 assertEquals(false, receivedHop2.getLrsBits().isStrict());
1954 assertNotNull(receivedHop1.getAddress().getIpAddress().getIpv4Address());
1955 assertNotNull(receivedHop2.getAddress().getMacAddress());
1957 assertEquals(ipString, receivedHop1.getAddress().getIpAddress().getIpv4Address().getValue());
1958 assertEquals(macString, receivedHop2.getAddress().getMacAddress().getValue());
1961 public void registerAndQuery__ApplicationData() throws SocketTimeoutException {
1963 String ipString = "1.2.3.4";
1966 int localPortLow = 3;
1967 int localPortHigh = 4;
1968 int remotePortLow = 4;
1969 int remotePortHigh = 5;
1971 ApplicationDataBuilder builder = new ApplicationDataBuilder();
1972 builder.setIpTos(ipTOs);
1973 builder.setProtocol(protocol);
1974 builder.setLocalPortLow(new PortNumber(localPortLow));
1975 builder.setLocalPortHigh(new PortNumber(localPortHigh));
1976 builder.setRemotePortLow(new PortNumber(remotePortLow));
1977 builder.setRemotePortHigh(new PortNumber(remotePortHigh));
1978 builder.setAddress(new SimpleAddress(new IpAddress(new Ipv4Address(ipString))));
1980 EidBuilder eb = new EidBuilder();
1981 eb.setAddressType(ApplicationDataLcaf.class);
1982 eb.setVirtualNetworkId(null);
1983 eb.setAddress(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
1984 .lisp.address.address.ApplicationDataBuilder().setApplicationData(builder.build()).build());
1985 Eid addressToSend = eb.build();
1987 MapReply reply = registerAddressAndQuery(addressToSend);
1989 Eid receivedAddress = reply.getMappingRecordItem().get(0).getMappingRecord().getEid();
1991 assertEquals(ApplicationDataLcaf.class, receivedAddress.getAddressType());
1993 ApplicationData receivedApplicationDataAddress = (ApplicationData) receivedAddress.getAddress();
1994 assertEquals(protocol, receivedApplicationDataAddress.getApplicationData().getProtocol().intValue());
1995 assertEquals(ipTOs, receivedApplicationDataAddress.getApplicationData().getIpTos().intValue());
1996 assertEquals(localPortLow, receivedApplicationDataAddress.getApplicationData().getLocalPortLow().getValue()
1998 assertEquals(localPortHigh, receivedApplicationDataAddress.getApplicationData().getLocalPortHigh().getValue()
2000 assertEquals(remotePortLow, receivedApplicationDataAddress.getApplicationData().getRemotePortLow().getValue()
2002 assertEquals(remotePortHigh, receivedApplicationDataAddress.getApplicationData().getRemotePortHigh().getValue()
2005 SimpleAddress ipAddressReceived = receivedApplicationDataAddress.getApplicationData().getAddress();
2006 assertEquals(ipString, ipAddressReceived.getIpAddress().getIpv4Address().getValue());
2009 // ------------------- TimeOut Tests -----------
2011 public void mapRequestMapRegisterAndMapRequestTestTimeout() throws SocketTimeoutException {
2013 Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32");
2014 mapService.addAuthenticationKey(eid, NULL_AUTH_KEY);
2016 MapRequestBuilder mapRequestBuilder = new MapRequestBuilder();
2017 mapRequestBuilder.setNonce((long) 4);
2018 mapRequestBuilder.setSourceEid(new SourceEidBuilder().setEid(LispAddressUtil.getNoAddressEid()).build());
2019 mapRequestBuilder.setEidItem(new ArrayList<EidItem>());
2020 mapRequestBuilder.getEidItem().add(new EidItemBuilder().setEid(eid).build());
2021 mapRequestBuilder.setItrRloc(new ArrayList<ItrRloc>());
2022 mapRequestBuilder.getItrRloc().add(
2023 new ItrRlocBuilder().setRloc(LispAddressUtil.asIpv4Rloc(ourAddress)).build());
2025 sendMapRequest(mapRequestBuilder.build());
2026 MapReply mapReply = receiveMapReply();
2027 assertEquals(4, mapReply.getNonce().longValue());
2028 assertEquals(0, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().size());
2030 MapRegisterBuilder mapRegisterbuilder = new MapRegisterBuilder();
2031 mapRegisterbuilder.setWantMapNotify(true);
2032 mapRegisterbuilder.setNonce((long) 8);
2034 MappingRecordBuilder etlrBuilder = new MappingRecordBuilder();
2035 etlrBuilder.setEid(eid);
2036 etlrBuilder.setRecordTtl(254);
2038 LocatorRecordBuilder recordBuilder = new LocatorRecordBuilder();
2039 recordBuilder.setRloc(LispAddressUtil.asIpv4Rloc("4.3.2.1"));
2040 etlrBuilder.setLocatorRecord(new ArrayList<LocatorRecord>());
2041 etlrBuilder.getLocatorRecord().add(recordBuilder.build());
2042 mapRegisterbuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
2043 mapRegisterbuilder.getMappingRecordItem().add(
2044 new MappingRecordItemBuilder().setMappingRecord(etlrBuilder.build()).build());
2046 sendMapRegister(mapRegisterbuilder.build());
2047 MapNotify mapNotify = receiveMapNotify();
2048 assertEquals(8, mapNotify.getNonce().longValue());
2051 sendMapRequest(mapRequestBuilder.build());
2052 mapReply = receiveMapReply();
2053 assertEquals(4, mapReply.getNonce().longValue());
2054 assertEquals(recordBuilder.getRloc(), mapReply.getMappingRecordItem().get(0).getMappingRecord()
2055 .getLocatorRecord().get(0).getRloc());
2057 causeEntryToBeCleaned();
2058 sendMapRequest(mapRequestBuilder.build());
2059 mapReply = receiveMapReply();
2060 assertEquals(0, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().size());
2063 public void mapRequestMapRegisterAndMapRequestTestNativelyForwardTimeoutResponse() throws Exception {
2065 Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32");
2066 MapRequest mapRequest = createMapRequest(eid);
2068 testTTLBeforeRegister(mapRequest);
2070 registerForTTL(eid);
2072 testTTLAfterRegister(mapRequest);
2074 causeEntryToBeCleaned();
2075 testTTLAfterClean(mapRequest);
2077 //northboundAddKey();
2078 //testTTLAfterAutherize(mapRequest);
2082 private void testTTLAfterClean(MapRequest mapRequest) throws SocketTimeoutException {
2084 sendMapRequest(mapRequest);
2085 mapReply = receiveMapReply();
2086 assertCorrectMapReplyTTLAndAction(mapReply, 15, Action.NativelyForward);
2089 private void causeEntryToBeCleaned() {
2090 // TODO XXX for the time being, to keep master and stable/lithium in sync, we need to remove the forceful
2091 // expiration of DAO entries. Once we're past this, we'll have to expose methods to setTimeUnit(TimeUnit)
2092 // and cleanOld() (expired) entries in IFlowMapping (and perhaps ILispDAO) and use them here.
2093 mapService.cleanCachedMappings();
2096 private void testTTLAfterRegister(MapRequest mapRequest) throws SocketTimeoutException {
2098 sendMapRequest(mapRequest);
2099 mapReply = receiveMapReply();
2100 assertEquals(LispAddressUtil.asIpv4Rloc("4.3.2.1"), mapReply.getMappingRecordItem().get(0).getMappingRecord()
2101 .getLocatorRecord().get(0).getRloc());
2102 assertCorrectMapReplyTTLAndAction(mapReply, 254, Action.NoAction);
2105 private void registerForTTL(Eid eid) throws SocketTimeoutException {
2106 MapRegister mapRegister = createMapRegister(eid);
2107 sendMapRegister(mapRegister);
2108 assertMapNotifyReceived();
2111 private void testTTLBeforeRegister(MapRequest mapRequest) throws SocketTimeoutException {
2113 sendMapRequest(mapRequest);
2114 mapReply = receiveMapReply();
2115 assertCorrectMapReplyTTLAndAction(mapReply, 15, Action.NativelyForward);
2118 private void testTTLAfterAutherize(MapRequest mapRequest) throws SocketTimeoutException {
2120 sendMapRequest(mapRequest);
2121 mapReply = receiveMapReply();
2122 assertCorrectMapReplyTTLAndAction(mapReply, 1, Action.NativelyForward);
2125 private void assertCorrectMapReplyTTLAndAction(MapReply mapReply, int expectedTTL, Action expectedAction) {
2126 assertEquals(expectedTTL, mapReply.getMappingRecordItem().get(0).getMappingRecord().getRecordTtl().intValue());
2127 assertEquals(expectedAction, mapReply.getMappingRecordItem().get(0).getMappingRecord().getAction());
2130 private MapRegister createMapRegister(Eid eid, Rloc rloc) {
2131 MapRegisterBuilder mapRegisterbuilder = new MapRegisterBuilder();
2132 mapRegisterbuilder.setWantMapNotify(true);
2133 mapRegisterbuilder.setNonce((long) 8);
2134 mapRegisterbuilder.setKeyId((short) 0);
2135 MappingRecordBuilder etlrBuilder = new MappingRecordBuilder();
2136 etlrBuilder.setEid(eid);
2137 etlrBuilder.setRecordTtl(254);
2138 etlrBuilder.setAuthoritative(false);
2139 etlrBuilder.setAction(Action.NoAction);
2140 LocatorRecordBuilder recordBuilder = new LocatorRecordBuilder();
2141 recordBuilder.setRloc(rloc);
2142 etlrBuilder.setLocatorRecord(new ArrayList<LocatorRecord>());
2143 etlrBuilder.getLocatorRecord().add(recordBuilder.build());
2144 mapRegisterbuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
2145 mapRegisterbuilder.getMappingRecordItem().add(
2146 new MappingRecordItemBuilder().setMappingRecord(etlrBuilder.build()).build());
2147 MapRegister mapRegister = mapRegisterbuilder.build();
2151 private MapRegister createMapRegister(Eid eid) {
2152 return createMapRegister(eid, LispAddressUtil.asIpv4Rloc("4.3.2.1"));
2155 private MapRequest createMapRequest(Eid eid) {
2156 MapRequestBuilder mapRequestBuilder = new MapRequestBuilder();
2157 mapRequestBuilder.setNonce((long) 4);
2158 mapRequestBuilder.setPitr(false);
2159 mapRequestBuilder.setSourceEid(new SourceEidBuilder().setEid(LispAddressUtil.getNoAddressEid()).build());
2160 mapRequestBuilder.setEidItem(new ArrayList<EidItem>());
2161 mapRequestBuilder.getEidItem().add(new EidItemBuilder().setEid(eid).build());
2162 mapRequestBuilder.setItrRloc(new ArrayList<ItrRloc>());
2163 mapRequestBuilder.getItrRloc().add(
2164 new ItrRlocBuilder().setRloc(LispAddressUtil.asIpv4Rloc(ourAddress)).build());
2165 MapRequest mr = mapRequestBuilder.build();
2169 public void testSimpleNonProxy() throws SocketTimeoutException, SocketException {
2171 String rloc = "127.0.0.3";
2172 int port = LispMessage.PORT_NUM;
2173 Rloc ipRloc = LispAddressUtil.asIpv4Rloc(rloc);
2174 sendProxyMapRequest(rloc, port, ipRloc);
2178 public void testNonProxyOtherPort() throws SocketTimeoutException, SocketException {
2180 String rloc = "127.0.0.3";
2183 RlocBuilder rb = new RlocBuilder();
2184 rb.setAddressType(ApplicationDataLcaf.class);
2185 rb.setVirtualNetworkId(null);
2186 rb.setAddress(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
2187 .lisp.address.address.ApplicationDataBuilder()
2188 .setApplicationData(new ApplicationDataBuilder().setAddress(new SimpleAddress(new IpAddress(
2189 new Ipv4Address(rloc)))).setLocalPortLow(new PortNumber(port)).build()).build());
2190 Rloc adLcaf = rb.build();
2192 LOG.info("testNonProxyOtherPort:" + LispAddressStringifier.getString(adLcaf));
2193 sendProxyMapRequest(rloc, port, adLcaf);
2197 private class XtrRequestMappingListener implements OdlLispProtoListener {
2200 public void onGotMapReply(GotMapReply notification) {
2204 public void onAddMapping(AddMapping notification) {
2208 public void onXtrReplyMapping(XtrReplyMapping notification) {
2212 public void onRequestMapping(RequestMapping notification) {
2216 public void onGotMapNotify(GotMapNotify notification) {
2220 public void onXtrRequestMapping(XtrRequestMapping notification) {
2224 public void onMappingKeepAlive(MappingKeepAlive notification) {
2229 public void testRecievingNonProxyOnXtrPort() throws SocketTimeoutException, SocketException, Throwable {
2231 configLispPlugin.shouldListenOnXtrPort(true);
2232 notificationCalled = false;
2233 final String eid = "10.10.10.10/32";
2234 String rloc = "127.0.0.3";
2235 int port = LispMessage.XTR_PORT_NUM;
2237 RlocBuilder rb = new RlocBuilder();
2238 rb.setAddressType(ApplicationDataLcaf.class);
2239 rb.setVirtualNetworkId(null);
2240 rb.setAddress(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
2241 .lisp.address.address.ApplicationDataBuilder()
2242 .setApplicationData(new ApplicationDataBuilder().setAddress(new SimpleAddress(new IpAddress(
2243 new Ipv4Address(rloc)))).setLocalPortLow(new PortNumber(port)).build()).build());
2244 Rloc adLcaf = rb.build();
2246 final MapRequest mapRequest = createNonProxyMapRequest(eid, adLcaf);
2247 ((LispMappingService) lms).getNotificationService().registerNotificationListener(
2248 new XtrRequestMappingListener() {
2251 public void onXtrRequestMapping(XtrRequestMapping notification) {
2252 assertEquals(((Ipv4Prefix) mapRequest.getEidItem().get(0).getEid().getAddress())
2253 .getIpv4Prefix().getValue(), eid);
2254 notificationCalled = true;
2255 LOG.warn("notification arrived");
2258 sendMapRequest(mapRequest, port);
2259 for (int i = 0; i < MAX_NOTIFICATION_RETRYS; i++) {
2260 if (notificationCalled) {
2263 LOG.warn("notification hasn't arrived, sleeping...");
2268 fail("Notification hasn't arrived");
2272 private void sendProxyMapRequest(String rloc, int port, Rloc adLcaf) throws SocketTimeoutException,
2274 String eid = "10.1.0.1/32";
2275 MapRequest mapRequest = createNonProxyMapRequest(eid, adLcaf);
2276 sendMapRequest(mapRequest);
2277 DatagramSocket nonProxySocket = new DatagramSocket(new InetSocketAddress(rloc, port));
2278 MapRequest receivedMapRequest = receiveMapRequest(nonProxySocket);
2279 assertEquals(mapRequest.getNonce(), receivedMapRequest.getNonce());
2280 assertEquals(mapRequest.getSourceEid(), receivedMapRequest.getSourceEid());
2281 assertEquals(mapRequest.getItrRloc(), receivedMapRequest.getItrRloc());
2282 assertEquals(mapRequest.getEidItem(), receivedMapRequest.getEidItem());
2283 nonProxySocket.close();
2286 private MapRequest createNonProxyMapRequest(String eid, Rloc adLcaf) throws SocketTimeoutException {
2287 MapRegister mr = createMapRegister(LispAddressUtil.asIpv4PrefixBinaryEid(eid));
2288 LocatorRecord record = new LocatorRecordBuilder(mr.getMappingRecordItem().get(0).getMappingRecord()
2289 .getLocatorRecord().get(0)).setRloc(adLcaf).build();
2290 mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().set(0, record);
2291 sendMapRegister(mr);
2292 assertMapNotifyReceived();
2293 MapRequest mapRequest = createMapRequest(LispAddressUtil.asIpv4PrefixBinaryEid(eid));
2294 MapRequestBuilder builder = new MapRequestBuilder(mapRequest);
2295 builder.setPitr(true);
2296 mapRequest = builder.build();
2300 private void assertMapNotifyReceived() throws SocketTimeoutException {
2304 private MapReply receiveMapReply() throws SocketTimeoutException {
2305 return MapReplySerializer.getInstance().deserialize(ByteBuffer.wrap(receivePacket().getData()));
2308 private MapRequest receiveMapRequest(DatagramSocket datagramSocket) throws SocketTimeoutException {
2309 return MapRequestSerializer.getInstance().deserialize(ByteBuffer.wrap(receivePacket(
2310 datagramSocket, 30000).getData()), null);
2313 private MapNotify receiveMapNotify() throws SocketTimeoutException {
2314 return MapNotifySerializer.getInstance().deserialize(ByteBuffer.wrap(receivePacket().getData()));
2317 private void sendMapRequest(MapRequest mapRequest) {
2318 sendMapRequest(mapRequest, LispMessage.PORT_NUM);
2321 private void sendMapRequest(MapRequest mapRequest, int port) {
2322 sendPacket(MapRequestSerializer.getInstance().serialize(mapRequest).array(), port);
2325 private void sendMapRegister(MapRegister mapRegister) {
2326 sendPacket(MapRegisterSerializer.getInstance().serialize(mapRegister).array());
2329 private void sendPacket(byte[] bytesToSend) {
2330 sendPacket(bytesToSend, LispMessage.PORT_NUM);
2333 private void sendPacket(byte[] bytesToSend, int port) {
2335 DatagramPacket packet = new DatagramPacket(bytesToSend, bytesToSend.length);
2336 initPacketAddress(packet, port);
2337 LOG.trace("Sending packet to LispPlugin on socket, port {}", port);
2338 socket.send(packet);
2339 } catch (Throwable t) {
2344 private DatagramPacket receivePacket() throws SocketTimeoutException {
2345 return receivePacket(6000);
2348 private DatagramPacket receivePacket(int timeout) throws SocketTimeoutException {
2349 return receivePacket(socket, timeout);
2352 private DatagramPacket receivePacket(DatagramSocket receivedSocket, int timeout) throws SocketTimeoutException {
2354 byte[] buffer = new byte[4096];
2355 DatagramPacket receivePacket = new DatagramPacket(buffer, buffer.length);
2356 LOG.trace("Waiting for packet from socket...");
2357 receivedSocket.setSoTimeout(timeout);
2358 receivedSocket.receive(receivePacket);
2359 LOG.trace("Received packet from socket!");
2360 return receivePacket;
2361 } catch (SocketTimeoutException ste) {
2363 } catch (Throwable t) {
2369 private void sleepForSeconds(int seconds) {
2371 Thread.sleep(seconds*1000);
2372 } catch (InterruptedException e) {
2373 LOG.warn("Interrupted while sleeping", e);
2377 private void sleepForMilliseconds(long milliseconds) {
2379 Thread.sleep(milliseconds);
2380 } catch (InterruptedException e) {
2381 LOG.warn("Interrupted while sleeping", e);
2385 private void initPacketAddress(DatagramPacket packet, int port) throws UnknownHostException {
2386 packet.setAddress(InetAddress.getByName(lispBindAddress));
2387 packet.setPort(port);
2390 private DatagramSocket initSocket(DatagramSocket socket, int port) {
2391 for (int i=0; i < NUM_OF_ATTEMPTS_TO_CREATE_SOCKET; i++) {
2393 return new DatagramSocket(new InetSocketAddress(ourAddress, port));
2394 } catch (SocketException e) {
2395 LOG.error("Can't initialize socket for {}", ourAddress, e);
2402 private byte[] extractWSUdpByteArray(String wiresharkHex) {
2403 final int HEADER_LEN = 42;
2404 byte[] res = new byte[1000];
2405 String[] split = wiresharkHex.split(" ");
2407 for (String cur : split) {
2409 if (cur.length() == 2) {
2411 if (counter > HEADER_LEN) {
2412 res[counter - HEADER_LEN - 1] = (byte) Integer.parseInt(cur, 16);
2417 return Arrays.copyOf(res, counter - HEADER_LEN);
2420 private String stateToString(int state) {
2424 case Bundle.INSTALLED:
2426 case Bundle.RESOLVED:
2428 case Bundle.UNINSTALLED:
2429 return "UNINSTALLED";
2431 return "Not CONVERTED";
2435 private void areWeReady() throws InvalidSyntaxException {
2439 boolean debugit = false;
2440 Bundle b[] = bc.getBundles();
2441 for (Bundle element : b) {
2442 int state = element.getState();
2443 LOG.trace("Bundle[" + element.getBundleId() + "]:" + element.getSymbolicName() + ",v"
2444 + element.getVersion() + ", state:" + stateToString(state));
2445 if (state != Bundle.ACTIVE && state != Bundle.RESOLVED) {
2446 LOG.debug("Bundle:" + element.getSymbolicName() + " state:" + stateToString(state));
2449 // String host = element.getHeaders().get("FRAGMENT-HOST");
2450 // if (host != null) {
2451 // LOG.warn("Bundle " + element.getSymbolicName() +
2452 // " is a fragment which is part of: " + host);
2453 // LOG.warn("Required imports are: " +
2454 // element.getHeaders().get("IMPORT-PACKAGE"));
2458 // } catch (BundleException e) {
2459 // LOG.error("BundleException:", e);
2468 LOG.warn(("Do some debugging because some bundle is unresolved"));
2470 // assertNotNull(broker);
2472 configLispPlugin.setLispAddress(lispBindAddress);
2474 // Uncomment this code to Know which services were actually loaded to
2478 for (ServiceReference sr : bc.getAllServiceReferences(null, null)) {
2479 LOG.info(sr.getBundle().getSymbolicName());
2480 LOG.info(sr.toString());
2487 private void cleanUP() {
2489 mapService.cleanCachedMappings();
2490 configLispPlugin.shouldListenOnXtrPort(false);
2491 socket = initSocket(socket, LispMessage.PORT_NUM);
2495 private void restartSocket() {
2497 socket = initSocket(socket, LispMessage.PORT_NUM);