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.Ignore;
31 import org.junit.Test;
32 import org.junit.runner.RunWith;
33 import org.opendaylight.controller.mdsal.it.base.AbstractMdsalTestBase;
34 import org.opendaylight.lispflowmapping.config.ConfigIni;
35 import org.opendaylight.lispflowmapping.implementation.LispMappingService;
36 import org.opendaylight.lispflowmapping.interfaces.dao.SubKeys;
37 import org.opendaylight.lispflowmapping.interfaces.dao.SubscriberRLOC;
38 import org.opendaylight.lispflowmapping.interfaces.lisp.IFlowMapping;
39 import org.opendaylight.lispflowmapping.interfaces.mappingservice.IMappingService;
40 import org.opendaylight.lispflowmapping.lisp.serializer.MapNotifySerializer;
41 import org.opendaylight.lispflowmapping.lisp.serializer.MapRegisterSerializer;
42 import org.opendaylight.lispflowmapping.lisp.serializer.MapReplySerializer;
43 import org.opendaylight.lispflowmapping.lisp.serializer.MapRequestSerializer;
44 import org.opendaylight.lispflowmapping.lisp.type.LispMessage;
45 import org.opendaylight.lispflowmapping.lisp.util.LispAddressStringifier;
46 import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil;
47 import org.opendaylight.lispflowmapping.type.sbplugin.IConfigLispSouthboundPlugin;
48 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
49 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
50 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
51 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
52 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.AfiListLcaf;
53 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ApplicationDataLcaf;
54 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ExplicitLocatorPathLcaf;
55 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.InstanceIdType;
56 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv4PrefixAfi;
57 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.KeyValueAddressLcaf;
58 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.MacAfi;
59 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SimpleAddress;
60 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SourceDestKeyLcaf;
61 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.Address;
62 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.AfiList;
63 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ApplicationData;
64 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ExplicitLocatorPath;
65 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4Prefix;
66 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4PrefixBuilder;
67 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.KeyValueAddress;
68 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Mac;
69 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.SourceDestKey;
70 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.afi.list.AfiListBuilder;
71 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.application.data.ApplicationDataBuilder;
72 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.ExplicitLocatorPathBuilder;
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;
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.Hop.LrsBits;
75 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;
76 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.source.dest.key.SourceDestKeyBuilder;
77 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.Ipv4AddressBinary;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.Ipv4PrefixBinaryAfi;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv4BinaryBuilder;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv4PrefixBinaryBuilder;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.AddMapping;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.GotMapNotify;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.GotMapReply;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MapNotify;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MapRegister;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MapReply;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MapRequest;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MappingKeepAlive;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.OdlLispProtoListener;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.RequestMapping;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.XtrReplyMapping;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.XtrRequestMapping;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.EidBuilder;
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.list.EidItem;
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.list.EidItemBuilder;
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecord;
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecordBuilder;
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.authkey.container.MappingAuthkey;
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.authkey.container.MappingAuthkeyBuilder;
102 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecord;
103 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecord.Action;
104 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecordBuilder;
105 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.list.MappingRecordItem;
106 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.list.MappingRecordItemBuilder;
107 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapregisternotification.MapRegisterBuilder;
108 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequest.ItrRloc;
109 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequest.ItrRlocBuilder;
110 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequest.SourceEidBuilder;
111 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequestnotification.MapRequestBuilder;
112 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.Rloc;
113 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.RlocBuilder;
114 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.MappingOrigin;
115 import org.ops4j.pax.exam.Option;
116 import org.ops4j.pax.exam.junit.PaxExam;
117 import org.ops4j.pax.exam.karaf.options.LogLevelOption.LogLevel;
118 import org.ops4j.pax.exam.options.MavenUrlReference;
119 import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
120 import org.ops4j.pax.exam.spi.reactors.PerClass;
121 import org.ops4j.pax.exam.util.Filter;
122 import org.osgi.framework.Bundle;
123 import org.osgi.framework.BundleContext;
124 import org.osgi.framework.InvalidSyntaxException;
125 import org.slf4j.Logger;
126 import org.slf4j.LoggerFactory;
128 import static org.junit.Assert.assertEquals;
129 import static org.junit.Assert.assertNotNull;
130 import static org.junit.Assert.assertTrue;
131 import static org.junit.Assert.fail;
132 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_A;
133 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_A_SB;
134 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_B;
135 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_B_SB;
136 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_C;
137 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_C_RLOC_10;
138 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_C_SB;
139 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_C_WP_100_1_SB;
140 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_C_WP_50_2_SB;
141 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_D4;
142 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_D5;
143 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_D_DELETE_SB;
144 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_D_WP_100_1_SB;
145 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_D_WP_50_2_SB;
146 import static org.opendaylight.lispflowmapping.integrationtest.MultiSiteScenarioUtil.SITE_E_SB;
147 import static org.ops4j.pax.exam.CoreOptions.composite;
148 import static org.ops4j.pax.exam.CoreOptions.maven;
149 import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.editConfigurationFilePut;
151 @RunWith(PaxExam.class)
152 @ExamReactorStrategy(PerClass.class)
153 public class MappingServiceIntegrationTest extends AbstractMdsalTestBase {
154 private static final Logger LOG = LoggerFactory.getLogger(MappingServiceIntegrationTest.class);
157 * Defines how many attempt to create instance of DatagramSocket will be done before giving up.
159 private static final int NUM_OF_ATTEMPTS_TO_CREATE_SOCKET = 2;
161 private byte[] mapRequestPacket;
162 private byte[] mapRegisterPacketWithNotify;
163 private byte[] mapRegisterPacketWithoutNotify;
164 String lispBindAddress = "127.0.0.1";
165 static final String ourAddress = "127.0.0.2";
166 private Rloc locatorEid;
167 private DatagramSocket socket;
168 private byte[] mapRegisterPacketWithAuthenticationAndMapNotify;
170 public static final String ODL = "org.opendaylight.controller";
171 public static final String YANG = "org.opendaylight.yangtools";
172 private static final int MAX_NOTIFICATION_RETRYS = 20;
173 private static final MappingAuthkey NULL_AUTH_KEY = new MappingAuthkeyBuilder().setKeyType(0).build();
175 // This is temporary, since the properties in the pom file are not picked up
177 public String getKarafDistro() {
179 .groupId("org.opendaylight.lispflowmapping")
180 .artifactId("distribution-karaf")
181 .versionAsInProject()
187 public MavenUrlReference getFeatureRepo() {
189 .groupId("org.opendaylight.lispflowmapping")
190 .artifactId("features-lispflowmapping")
191 .classifier("features")
193 .versionAsInProject();
197 public String getFeatureName() {
198 return "odl-lispflowmapping-msmr";
202 public Option getLoggingOption() {
203 Option option = editConfigurationFilePut(ORG_OPS4J_PAX_LOGGING_CFG,
204 "log4j.logger.org.opendaylight.lispflowmapping",
205 LogLevel.DEBUG.name());
206 option = composite(option, super.getLoggingOption());
211 public void testLispFlowMappingFeatureLoad() {
212 Assert.assertTrue(true);
216 public void after() {
217 if (socket != null) {
220 // if (connection != null) {
221 // connection.disconnect();
226 public void before() throws Exception {
228 mapService.setLookupPolicy(IMappingService.LookupPolicy.NB_FIRST);
229 mapService.setMappingOverwrite(true);
231 locatorEid = LispAddressUtil.asIpv4Rloc("4.3.2.1");
232 socket = initSocket(socket, LispMessage.PORT_NUM);
234 // SRC: 127.0.0.1:58560 to 127.0.0.1:4342
235 // LISP(Type = 8 - Encapsulated)
236 // IP: 192.168.136.10 -> 153.16.254.1
238 // LISP(Type = 1 Map-Request
242 // Source EID 1.2.3.4
243 // Nonce: 0x3d8d2acd39c8d608
244 // ITR-RLOC AFI=1 Address=192.168.136.10
245 // Record 1: 153.16.254.1/32
246 mapRequestPacket = extractWSUdpByteArray(new String("0000 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00 " //
247 + "0010 00 58 00 00 40 00 40 11 3c 93 7f 00 00 01 7f 00 "
248 + "0020 00 01 e4 c0 10 f6 00 44 fe 57 80 00 00 00 45 00 "
249 + "0030 00 3c d4 31 00 00 ff 11 56 f3 7f 00 00 02 99 10 "
250 + "0040 fe 01 dd b4 10 f6 00 28 ef 3a 10 00 00 01 3d 8d "
251 + "0050 2a cd 39 c8 d6 08 00 01 01 02 03 04 00 01 7f 00 00 02 00 20 " //
252 + "0060 00 01 99 10 fe 01"));
254 // IP: 192.168.136.10 -> 128.223.156.35
255 // UDP: 49289 -> 4342
256 // LISP(Type = 3 Map-Register, P=1, M=1
260 // AuthDataLength: 20 Data:
261 // e8:f5:0b:c5:c5:f2:b0:21:27:a8:21:41:04:f3:46:5a:a5:68:89:ec
262 // EID prefix: 153.16.254.1/32 (EID=0x9910FE01), TTL: 10, Authoritative,
264 // Local RLOC: 192.168.136.10 (RLOC=0xC0A8880A), Reachable,
265 // Priority/Weight: 1/100, Multicast Priority/Weight:
269 mapRegisterPacketWithAuthenticationAndMapNotify = extractWSUdpByteArray(new String(
270 "0000 00 50 56 ee d1 4f 00 0c 29 7a ce 79 08 00 45 00 " //
271 + "0010 00 5c 00 00 40 00 40 11 d4 db c0 a8 88 0a 80 df "
272 + "0020 9c 23 d6 40 10 f6 00 48 59 a4 38 00 01 01 00 00 "
273 + "0030 00 00 00 00 00 00 00 01 00 14 0e a4 c6 d8 a4 06 "
274 + "0040 71 7c 33 a4 5c 4a 83 1c de 74 53 03 0c ad 00 00 "
275 + "0050 00 0a 01 20 10 00 00 00 00 01 99 10 fe 01 01 64 " //
276 + "0060 ff 00 00 05 00 01 c0 a8 88 0a"));
278 // IP: 192.168.136.10 -> 128.223.156.35
279 // UDP: 49289 -> 4342
280 // LISP(Type = 3 Map-Register, P=1, M=1
283 // Key ID: 0x0000 NO AUTHENTICATION!!
284 // AuthDataLength: 00 Data:
285 // EID prefix: 153.16.254.1/32 (EID=0x9910FE01), TTL: 10, Authoritative,
287 // Local RLOC: 192.168.136.10 (RLOC=0xC0A8880A), Reachable,
288 // Priority/Weight: 1/100, Multicast Priority/Weight:
292 mapRegisterPacketWithNotify = extractWSUdpByteArray(new String(
293 "0000 00 50 56 ee d1 4f 00 0c 29 7a ce 79 08 00 45 00 " //
294 + "0010 00 5c 00 00 40 00 40 11 d4 db c0 a8 88 0a 80 df "
295 + "0020 9c 23 d6 40 10 f6 00 48 59 a4 38 00 01 01 00 00 "
296 + "0030 00 00 00 00 00 07 00 00 00 14 0e a4 c6 d8 a4 06 "
297 + "0040 71 7c 33 a4 5c 4a 83 1c de 74 53 03 0c ad 00 00 "
298 + "0050 00 0a 01 20 10 00 00 00 00 01 99 10 fe 01 01 64 " //
299 + "0060 ff 00 00 05 00 01 c0 a8 88 0a"));
301 // IP: 192.168.136.10 -> 128.223.156.35
302 // UDP: 49289 -> 4342
303 // LISP(Type = 3 Map-Register, P=1, M=1
306 // Key ID: 0x0000 NO AUTHENTICATION!!
307 // AuthDataLength: 00 Data:
308 // EID prefix: 153.16.254.1/32 (EID=0x9910FE01), TTL: 10, Authoritative,
310 // Local RLOC: 192.168.136.10 (RLOC=0xC0A8880A), Reachable,
311 // Priority/Weight: 1/100, Multicast Priority/Weight:
315 mapRegisterPacketWithoutNotify = extractWSUdpByteArray(new String(
316 "0000 00 50 56 ee d1 4f 00 0c 29 7a ce 79 08 00 45 00 " //
317 + "0010 00 5c 00 00 40 00 40 11 d4 db c0 a8 88 0a 80 df "
318 + "0020 9c 23 d6 40 10 f6 00 48 59 a4 38 00 00 01 00 00 "
319 + "0030 00 00 00 00 00 07 00 00 00 14 0e a4 c6 d8 a4 06 "
320 + "0040 71 7c 33 a4 5c 4a 83 1c de 74 53 03 0c ad 00 00 "
321 + "0050 00 0a 01 20 10 00 00 00 00 01 99 10 fe 01 01 64 " //
322 + "0060 ff 00 00 05 00 01 c0 a8 88 0a"));
326 private BundleContext bc;
327 //private HttpURLConnection connection;
328 protected static boolean notificationCalled;
330 @Inject @Filter(timeout=60000)
331 private IFlowMapping lms;
333 @Inject @Filter(timeout=60000)
334 private IMappingService mapService;
336 @Inject @Filter(timeout=10000)
337 private IConfigLispSouthboundPlugin configLispPlugin;
340 public void testSimpleUsage() throws Exception {
342 mapRegisterWithMapNotify();
343 mapRegisterWithMapNotifyAndMapRequest();
344 registerAndQuery__MAC();
345 mapRequestMapRegisterAndMapRequest();
346 mapRegisterWithAuthenticationWithoutConfiguringAKey();
347 mapRegisterWithoutMapNotify();
351 public void testLCAFs() throws Exception {
352 registerAndQuery__SrcDestLCAF();
353 registerAndQuery__SrcDestLCAFOverlap();
354 registerAndQuery__KeyValueLCAF();
355 //registerAndQuery__ListLCAF();
356 //registerAndQuery__ApplicationData();
357 //registerAndQuery__TrafficEngineering();
358 //registerAndQuery__SegmentLCAF();
362 public void testMask() throws Exception {
363 //testPasswordExactMatch(); TODO commented because it needs NB
364 //testPasswordMaskMatch(); TODO commented because it needs NB
365 eidPrefixLookupIPv4();
366 eidPrefixLookupIPv6();
370 public void testNorthbound() throws Exception {
372 northboundAddMapping();
373 northboundDeleteMapping();
374 northboundRetrieveKey();
375 northboundRetrieveMapping();
376 northboundRetrieveSourceDestKey();
377 northboundRetrieveSourceDestMapping();
381 public void testOverWriting() throws Exception {
382 //testMapRegisterDosntOverwritesOtherSubKeys(); TODO weird failure, needs debug
384 // TODO: remove, we don't support overwrite flag any longer and RLOCs are not saved as independent RLOC groups
385 // testMapRegisterOverwritesSameSubkey();
386 // testMapRegisterOverwritesNoSubkey();
387 // testMapRegisterDoesntOverwritesNoSubkey();
391 public void testTimeOuts() throws Exception {
392 mapRequestMapRegisterAndMapRequestTestTimeout();
393 //mapRequestMapRegisterAndMapRequestTestNativelyForwardTimeoutResponse(); TODO commented because it needs NB
397 // public void testNonProxy() throws Throwable {
398 // testSimpleNonProxy();
399 // testNonProxyOtherPort();
400 // testRecievingNonProxyOnXtrPort();
404 public void testSmr() throws Exception {
405 registerQueryRegisterWithSmr();
411 public void testMultiSite() throws Exception {
412 testMultiSiteScenarioA();
413 testMultiSiteScenarioB();
417 public void testNegativePrefix() throws UnknownHostException {
419 testGapIntersection();
420 testMultipleMappings();
423 private void testRepeatedSmr() throws SocketTimeoutException, UnknownHostException {
425 long timeout = ConfigIni.getInstance().getSmrTimeout();
427 final InstanceIdType iid = new InstanceIdType(1L);
428 final Eid eid1 = LispAddressUtil.asIpv4Eid("1.1.1.1", 1L);
429 final Eid eid2 = LispAddressUtil.asIpv4Eid("2.2.2.2", 1L);
432 final Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("0.0.0.0/0", iid);
433 mapService.addAuthenticationKey(eid, NULL_AUTH_KEY);
435 /* add subscribers */
436 final String subscriberSrcRloc1 = "127.0.0.3";
437 final String subscriberSrcRloc2 = "127.0.0.4";
438 final Set<SubscriberRLOC> subscriberSet = Sets.newHashSet(
439 newSubscriber(eid1, subscriberSrcRloc1), newSubscriber(eid2, subscriberSrcRloc2));
440 mapService.addData(MappingOrigin.Southbound, eid1, SubKeys.SUBSCRIBERS, subscriberSet);
442 final int expectedSmrs1 = 2;
443 final int expectedSmrs2 = 3;
445 final SocketReader reader1 = startSocketReader(subscriberSrcRloc1, 15000);
446 final SocketReader reader2 = startSocketReader(subscriberSrcRloc2, 15000);
450 final MappingRecord mapping1 = new MappingRecordBuilder()
451 .setEid(eid1).setTimestamp(System.currentTimeMillis()).setRecordTtl(1440).build();
452 mapService.addMapping(MappingOrigin.Northbound, mapping1.getEid(), null, mapping1, false);
454 sleepForMilliseconds((timeout * expectedSmrs1) - 1500);
455 final List<MapRequest> requests1 = processBuffers(reader1, subscriberSrcRloc1, expectedSmrs1);
456 final MapReply mapReply1 = lms.handleMapRequest(
457 new MapRequestBuilder(requests1.get(0))
458 .setItrRloc(Lists.newArrayList(new ItrRlocBuilder()
459 .setRloc(LispAddressUtil.asIpv4Rloc(subscriberSrcRloc1)).build()))
461 .setSmr(false).build());
463 // sleep to get 1 extra smr request
464 sleepForMilliseconds(timeout * 1);
465 final List<MapRequest> requests2 = processBuffers(reader2, subscriberSrcRloc2, expectedSmrs2);
466 final MapReply mapReply2 = lms.handleMapRequest(
467 new MapRequestBuilder(requests2.get(0))
468 .setItrRloc(Lists.newArrayList(new ItrRlocBuilder()
469 .setRloc(LispAddressUtil.asIpv4Rloc(subscriberSrcRloc2)).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) requests1.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 {
646 final MultiSiteScenario multiSiteScenario = new MultiSiteScenario(mapService, lms);
647 multiSiteScenario.setCommonAuthentication();
650 final SocketReader socketReader = SocketReader.startReadingInStandaloneThread(socket);
653 multiSiteScenario.storeSouthboundMappings(false, SITE_A, SITE_B, SITE_C, SITE_D4, SITE_D5);
654 multiSiteScenario.storeNorthMappingSrcDst(SITE_B, SITE_C);
655 multiSiteScenario.storeNorthMappingNegative(SITE_C, Action.Drop);
657 multiSiteScenario.assertPingWorks(SITE_A, 5, SITE_B, 4);
658 multiSiteScenario.assertPingWorks(SITE_B, 5, SITE_C, 4);
659 multiSiteScenario.assertPingFails(SITE_A, 1, SITE_C, 4);
662 //following action should trigger generatting of SMR messages:
665 multiSiteScenario.storeNorthMappingSrcDst(SITE_A, SITE_C);
667 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B.getHost(5), SITE_A.getHost(1));
668 multiSiteScenario.assertPingWorks(SITE_A, 5, SITE_C, 4);
669 multiSiteScenario.assertPingWorks(SITE_B, 5, SITE_C, 4);
670 multiSiteScenario.assertPingFails(SITE_D4, 5, SITE_C, 4);
673 // following action should trigger generatting of SMR messages:
678 multiSiteScenario.deleteNorthMappingNegative(SITE_C);
680 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B.getHost(5), SITE_A.getHost(1), SITE_A
683 multiSiteScenario.assertPingWorks(SITE_D4, 5, SITE_C, 4);
686 // following action should trigger generatting of SMR messages:
688 multiSiteScenario.storeNorthMappingSrcDst(SITE_B, SITE_C_RLOC_10);
690 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_D4.getHost(5));
691 //way of testing ping - get RLOC for mapping src-dst and compare it with awaited value doesn't test
692 //that ping won't be successfull
693 multiSiteScenario.assertPingFails(SITE_B, 5, SITE_C, 4);
696 // following action should trigger generatting of SMR messages:
699 multiSiteScenario.storeNorthMappingNegative(SITE_C, Action.Drop);
701 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_D4.getHost(5), SITE_B.getHost(5));
702 multiSiteScenario.assertPingFails(SITE_D4, 5, SITE_C, 4);
705 multiSiteScenario.assertPingFails(SITE_D5, 5, SITE_C, 3);
708 multiSiteScenario.deleteNorthMapingSrcDst(SITE_A, SITE_C);
710 // following action should trigger generatting of SMR messages:
714 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_D5.getHost(5), SITE_D4.getHost(5),
717 // following action should trigger generatting of SMR messages:
721 multiSiteScenario.storeNorthMappingSrcDst(SITE_B, SITE_C);
723 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_D5.getHost(5), SITE_D4.getHost(5),
726 multiSiteScenario.assertPingWorks(SITE_A, 5, SITE_B, 4);
727 multiSiteScenario.assertPingWorks(SITE_B, 5, SITE_C, 4);
728 multiSiteScenario.assertPingFails(SITE_A, 1, SITE_C, 4);
731 // following action should trigger generatting of SMR messages:
736 multiSiteScenario.deleteNorthMapingSrcDst(SITE_B, SITE_C);
738 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_D5.getHost(5), SITE_D4.getHost(5),
741 multiSiteScenario.assertPingWorks(SITE_A, 5, SITE_B, 4);
742 multiSiteScenario.assertPingFails(SITE_B, 5, SITE_C, 4);
743 multiSiteScenario.assertPingFails(SITE_A, 1, SITE_C, 4);
746 // following action should trigger generatting of SMR messages:
751 multiSiteScenario.deleteNorthMappingNegative(SITE_C);
753 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_D5.getHost(5), SITE_D4.getHost(5),
756 multiSiteScenario.assertPingWorks(SITE_A, 5, SITE_B, 4);
757 multiSiteScenario.assertPingWorks(SITE_B, 5, SITE_C, 4);
758 multiSiteScenario.assertPingWorks(SITE_A, 5, SITE_C, 4);
760 socketReader.stopReading();
767 public void testMultiSiteScenarioB() throws IOException {
770 final MultiSiteScenario multiSiteScenario = new MultiSiteScenario(mapService, lms);
771 multiSiteScenario.setCommonAuthentication();
774 final SocketReader socketReader = SocketReader.startReadingInStandaloneThread(socket);
776 mapService.setLookupPolicy(IMappingService.LookupPolicy.NB_AND_SB);
777 mapService.setMappingOverwrite(false);
780 multiSiteScenario.storeSouthboundMappings(true, SITE_A_SB, SITE_B_SB, SITE_C_WP_100_1_SB, SITE_D_WP_100_1_SB,
782 multiSiteScenario.storeNorthMappingIpPrefix(SITE_A_SB);
783 multiSiteScenario.storeNorthMappingIpPrefix(SITE_B_SB);
784 multiSiteScenario.storeNorthMappingIpPrefix(SITE_C_WP_50_2_SB, SITE_D_WP_50_2_SB);
786 multiSiteScenario.assertPingWorks(SITE_A_SB, 5, SITE_C_WP_50_2_SB, 4, SITE_D_WP_50_2_SB);
787 multiSiteScenario.assertPingWorks(SITE_B_SB, 5, SITE_C_WP_50_2_SB, 4, SITE_D_WP_50_2_SB);
790 // following action should trigger generatting of SMR messages:
793 multiSiteScenario.storeNorthMappingSrcDst(SITE_A_SB, SITE_C_WP_50_2_SB, SITE_D_WP_50_2_SB);
795 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B_SB.getHost(5), SITE_A_SB.getHost(5));
797 // following action should trigger generatting of SMR messages:
800 multiSiteScenario.storeNorthMappingNegative(SITE_C_SB, Action.Drop);
802 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B_SB.getHost(5), SITE_A_SB.getHost(5));
804 multiSiteScenario.assertPingWorks(SITE_A_SB, 5, SITE_C_WP_50_2_SB, 4, SITE_D_WP_50_2_SB);
805 multiSiteScenario.assertPingFails(SITE_B_SB, 5, SITE_C_SB, 4);
809 // following action should trigger generatting of SMR messages:
812 multiSiteScenario.storeNorthMappingSrcDst(SITE_A_SB, SITE_C_WP_50_2_SB);
814 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B_SB.getHost(5), SITE_A_SB.getHost(5));
815 multiSiteScenario.assertPingWorks(SITE_A_SB, 5, SITE_C_WP_50_2_SB, 4);
818 multiSiteScenario.storeNorthMappingSrcDst(SITE_B_SB, SITE_C_WP_50_2_SB, SITE_D_WP_50_2_SB);
820 // following action should trigger generatting of SMR messages:
823 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B_SB.getHost(5), SITE_A_SB.getHost(5));
824 multiSiteScenario.assertPingWorks(SITE_B_SB, 5, SITE_C_WP_50_2_SB, 4, SITE_D_WP_50_2_SB);
827 multiSiteScenario.deleteSouthboundMappings(SITE_D_DELETE_SB);
829 // following action should trigger generatting of SMR messages:
832 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B_SB.getHost(5), SITE_A_SB.getHost(5));
834 multiSiteScenario.assertPingWorks(SITE_B_SB, 5, SITE_C_WP_50_2_SB, 4);
837 multiSiteScenario.deleteNorthMapingSrcDst(SITE_A_SB, SITE_C_WP_50_2_SB);
839 // following action should trigger generatting of SMR messages:
842 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B_SB.getHost(5), SITE_A_SB.getHost(5));
844 multiSiteScenario.deleteNorthMapingSrcDst(SITE_B_SB, SITE_C_WP_50_2_SB);
846 multiSiteScenario.assertPingFails(SITE_B_SB, 5, SITE_C_WP_50_2_SB, 4);
848 socketReader.stopReading();
852 // ------------------------------- Simple Tests ---------------------------
854 public void mapRequestSimple() throws SocketTimeoutException {
857 // This Map-Request is sent from a source port different from 4342
858 // We close and bind the socket on the correct port
859 if (socket != null) {
862 socket = initSocket(socket, 56756);
864 sendPacket(mapRequestPacket);
865 ByteBuffer readBuf = ByteBuffer.wrap(receivePacket().getData());
866 MapReply reply = MapReplySerializer.getInstance().deserialize(readBuf);
867 assertEquals(4435248268955932168L, reply.getNonce().longValue());
871 public void mapRegisterWithMapNotify() throws SocketTimeoutException {
873 mapService.addAuthenticationKey(LispAddressUtil.asIpv4PrefixBinaryEid("153.16.254.1/32"), NULL_AUTH_KEY);
876 sendPacket(mapRegisterPacketWithNotify);
877 MapNotify reply = receiveMapNotify();
878 assertEquals(7, reply.getNonce().longValue());
881 public void mapRegisterWithMapNotifyAndMapRequest() throws SocketTimeoutException {
883 Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32");
885 MapReply mapReply = registerAddressAndQuery(eid);
887 assertEquals(4, mapReply.getNonce().longValue());
888 assertEquals(locatorEid, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0)
893 public void registerAndQuery__MAC() throws SocketTimeoutException {
895 String macAddress = "01:02:03:04:05:06";
897 MapReply reply = registerAddressAndQuery(LispAddressUtil.asMacEid(macAddress));
900 Eid addressFromNetwork = reply.getMappingRecordItem().get(0).getMappingRecord().getEid();
901 assertEquals(MacAfi.class, addressFromNetwork.getAddressType());
902 String macAddressFromReply = ((Mac) addressFromNetwork.getAddress()).getMac().getValue();
904 assertEquals(macAddress, macAddressFromReply);
907 public void mapRequestMapRegisterAndMapRequest() throws SocketTimeoutException {
909 Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32");
910 mapService.addAuthenticationKey(eid, NULL_AUTH_KEY);
913 MapRequestBuilder mapRequestBuilder = new MapRequestBuilder();
914 mapRequestBuilder.setNonce((long) 4);
915 mapRequestBuilder.setSourceEid(new SourceEidBuilder().setEid(LispAddressUtil.getNoAddressEid()).build());
916 mapRequestBuilder.setEidItem(new ArrayList<EidItem>());
917 mapRequestBuilder.getEidItem().add(new EidItemBuilder().setEid(eid).build());
918 mapRequestBuilder.setItrRloc(new ArrayList<ItrRloc>());
919 mapRequestBuilder.getItrRloc().add(
920 new ItrRlocBuilder().setRloc(LispAddressUtil.asIpv4Rloc(ourAddress)).build());
921 sendMapRequest(mapRequestBuilder.build());
922 MapReply mapReply = receiveMapReply();
923 assertEquals(4, mapReply.getNonce().longValue());
924 assertEquals(0, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().size());
925 MapRegisterBuilder mapRegisterbuilder = new MapRegisterBuilder();
926 mapRegisterbuilder.setWantMapNotify(true);
927 mapRegisterbuilder.setNonce((long) 8);
928 MappingRecordBuilder etlrBuilder = new MappingRecordBuilder();
929 etlrBuilder.setEid(eid);
930 etlrBuilder.setRecordTtl(254);
931 LocatorRecordBuilder recordBuilder = new LocatorRecordBuilder();
932 recordBuilder.setRloc(LispAddressUtil.asIpv4Rloc("4.3.2.1"));
933 etlrBuilder.setLocatorRecord(new ArrayList<LocatorRecord>());
934 etlrBuilder.getLocatorRecord().add(recordBuilder.build());
935 mapRegisterbuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
936 mapRegisterbuilder.getMappingRecordItem().add(
937 new MappingRecordItemBuilder().setMappingRecord(etlrBuilder.build()).build());
938 sendMapRegister(mapRegisterbuilder.build());
939 MapNotify mapNotify = receiveMapNotify();
940 assertEquals(8, mapNotify.getNonce().longValue());
942 sendMapRequest(mapRequestBuilder.build());
943 mapReply = receiveMapReply();
944 assertEquals(4, mapReply.getNonce().longValue());
945 assertEquals(recordBuilder.getRloc(), mapReply.getMappingRecordItem().get(0).getMappingRecord()
946 .getLocatorRecord().get(0).getRloc());
950 public void testMapRegisterDosntOverwritesOtherSubKeys() throws SocketTimeoutException {
952 Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32");
953 SimpleAddress rloc1Value = new SimpleAddress(new IpAddress(new Ipv4Address("4.3.2.1")));
954 Rloc rloc1 = LispAddressUtil.asKeyValueAddress("subkey1", rloc1Value);
955 SimpleAddress rloc2Value = new SimpleAddress(new IpAddress(new Ipv4Address("4.3.2.2")));
956 Rloc rloc2 = LispAddressUtil.asKeyValueAddress("subkey2", rloc2Value);
957 MapReply mapReply = sendMapRegisterTwiceWithDiffrentValues(eid, rloc1, rloc2);
958 assertEquals(2, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().size());
959 assertEquals(rloc2, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0)
961 assertEquals(rloc1, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(1)
965 public void testMapRegisterOverwritesSameSubkey() throws SocketTimeoutException {
967 Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32");
968 SimpleAddress rloc1Value = new SimpleAddress(new IpAddress(new Ipv4Address("4.3.2.1")));
969 Rloc rloc1 = LispAddressUtil.asKeyValueAddress("subkey1", rloc1Value);
970 SimpleAddress rloc2Value = new SimpleAddress(new IpAddress(new Ipv4Address("4.3.2.2")));
971 Rloc rloc2 = LispAddressUtil.asKeyValueAddress("subkey2", rloc2Value);
972 MapReply mapReply = sendMapRegisterTwiceWithDiffrentValues(eid, rloc1, rloc2);
973 assertEquals(1, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().size());
974 assertEquals(rloc2, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0)
978 public void testMapRegisterOverwritesNoSubkey() throws SocketTimeoutException {
980 mapService.setMappingOverwrite(true);
981 Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32");
982 Rloc rloc1Value = LispAddressUtil.asIpv4Rloc("4.3.2.1");
983 Rloc rloc2Value = LispAddressUtil.asIpv4Rloc("4.3.2.2");
984 MapReply mapReply = sendMapRegisterTwiceWithDiffrentValues(eid, rloc1Value, rloc2Value);
985 assertEquals(1, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().size());
986 assertEquals(rloc2Value, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0)
990 public void testMapRegisterDoesntOverwritesNoSubkey() throws SocketTimeoutException {
992 mapService.setMappingOverwrite(false);
993 Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32");
994 Rloc rloc1Value = LispAddressUtil.asIpv4Rloc("4.3.2.1");
995 Rloc rloc2Value = LispAddressUtil.asIpv4Rloc("4.3.2.2");
996 MapReply mapReply = sendMapRegisterTwiceWithDiffrentValues(eid, rloc1Value, rloc2Value);
997 assertEquals(1, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().size());
998 Rloc rloc1ReturnValueContainer = mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord()
1000 Rloc rloc2ReturnValueContainer = mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord()
1002 assertTrue((rloc1Value.equals(rloc1ReturnValueContainer) && rloc2Value.equals(rloc2ReturnValueContainer))
1003 || (rloc1Value.equals(rloc2ReturnValueContainer) && rloc2Value.equals(rloc1ReturnValueContainer)));
1006 private MapReply sendMapRegisterTwiceWithDiffrentValues(Eid eid, Rloc rloc1, Rloc rloc2)
1007 throws SocketTimeoutException {
1008 mapService.addAuthenticationKey(eid, NULL_AUTH_KEY);
1010 MapRegister mb = createMapRegister(eid, rloc1);
1011 MapNotify mapNotify = lms.handleMapRegister(mb).getLeft();
1012 MapRequest mr = createMapRequest(eid);
1013 MapReply mapReply = lms.handleMapRequest(mr);
1014 assertEquals(mb.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0).getRloc(),
1015 mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0).getRloc());
1016 mb = createMapRegister(eid, rloc2);
1017 mapNotify = lms.handleMapRegister(mb).getLeft();
1018 assertEquals(8, mapNotify.getNonce().longValue());
1019 mr = createMapRequest(eid);
1021 mapReply = lms.handleMapRequest(mr);
1025 public void mapRegisterWithAuthenticationWithoutConfiguringAKey() throws SocketTimeoutException {
1027 sendPacket(mapRegisterPacketWithAuthenticationAndMapNotify);
1029 receivePacket(3000);
1030 // If didn't timeout then fail:
1032 } catch (SocketTimeoutException ste) {
1036 public void mapRegisterWithoutMapNotify() {
1038 sendPacket(mapRegisterPacketWithoutNotify);
1040 receivePacket(3000);
1041 // If didn't timeout then fail:
1043 } catch (SocketTimeoutException ste) {
1047 public void registerQueryRegisterWithSmr() throws SocketTimeoutException {
1049 lms.setShouldUseSmr(true);
1050 mapService.addAuthenticationKey(LispAddressUtil.asIpv4PrefixBinaryEid("153.16.254.1/32"), NULL_AUTH_KEY);
1053 sendPacket(mapRegisterPacketWithNotify);
1057 sendPacket(mapRequestPacket);
1060 mapRegisterPacketWithoutNotify[mapRegisterPacketWithoutNotify.length - 1] += 1;
1061 sendPacket(mapRegisterPacketWithoutNotify);
1063 ByteBuffer readBuf = ByteBuffer.wrap(receivePacket().getData());
1064 MapRequest smr = MapRequestSerializer.getInstance().deserialize(readBuf, null);
1065 assertTrue(smr.isSmr());
1066 Eid sourceEid = smr.getSourceEid().getEid();
1067 assertTrue(LispAddressUtil.asIpv4Eid("153.16.254.1").equals(sourceEid));
1068 Eid smrEid = smr.getEidItem().get(0).getEid();
1069 assertTrue(LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32").equals(smrEid));
1072 // --------------------- Northbound Tests ---------------------------
1074 private void northboundAddKey() throws Exception {
1076 LispIpv4Address address = LispAddressUtil.asIPAfiAddress("1.2.3.4");
1078 String pass = "asdf";
1080 URL url = createPutURL("key");
1081 String authKeyJSON = createAuthKeyJSON(pass, address, mask);
1082 callURL("PUT", "application/json", "text/plain", authKeyJSON, url);
1084 String retrievedKey = lms.getAuthenticationKey(LispAddressUtil.toContainer(address), mask);
1086 // Check stored password matches the one sent
1087 assertEquals(pass, retrievedKey);
1091 private void northboundRetrieveSourceDestKey() throws Exception {
1093 org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.lispsimpleaddress.primitiveaddress.Ipv4
1094 address1 = (org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispsimpleaddress
1095 .primitiveaddress.Ipv4) LispAddressUtil
1096 .toPrimitive(LispAddressUtil.asIPAfiAddress("10.0.0.1"));
1097 org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.lispsimpleaddress.primitiveaddress.Ipv4
1098 address2 = (org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispsimpleaddress
1099 .primitiveaddress.Ipv4) LispAddressUtil
1100 .toPrimitive(LispAddressUtil.asIPAfiAddress("10.0.0.2"));
1103 LcafSourceDestAddr sourceDestAddress = new LcafSourceDestAddrBuilder().setAfi(
1104 AddressFamilyNumberEnum.LCAF.getIanaCode())
1105 .setLcafType((short) LispCanonicalAddressFormatEnum.SOURCE_DEST.getLispCode())
1106 .setSrcAddress(new SrcAddressBuilder().setPrimitiveAddress(address1).build())
1107 .setSrcMaskLength((short) mask1)
1108 .setDstAddress(new DstAddressBuilder().setPrimitiveAddress(address2).build())
1109 .setDstMaskLength((short) mask2).build();
1110 String pass = "asdf";
1112 lms.addAuthenticationKey(LispAddressUtil.toContainer(sourceDestAddress), mask1, pass);
1114 // URL url = createGetKeyIPv4URL(address1, mask1);
1115 URL url = createGetKeySourceDestURL(address1.getIpv4Address().getAfi(),
1116 ((LispIpv4Address) LispAddressUtil.toAFIfromPrimitive(sourceDestAddress.getSrcAddress()
1117 .getPrimitiveAddress())).getIpv4Address().getValue(), sourceDestAddress.getSrcMaskLength(),
1118 ((LispIpv4Address) LispAddressUtil.toAFIfromPrimitive(sourceDestAddress.getDstAddress()
1119 .getPrimitiveAddress())).getIpv4Address().getValue(), sourceDestAddress.getDstMaskLength());
1120 String reply = callURL("GET", null, "application/json", null, url);
1121 JSONTokener jt = new JSONTokener(reply);
1122 JSONObject json = new JSONObject(jt);
1124 // test that the password matches what was we expected.
1125 assertEquals(pass, json.get("key"));
1129 private void northboundRetrieveKey() throws Exception {
1131 LispIpv4Address address = LispAddressUtil.asIPAfiAddress("10.0.0.1");
1133 String pass = "asdf";
1135 lms.addAuthenticationKey(LispAddressUtil.toContainer(address), mask, pass);
1137 URL url = createGetKeyIPv4URL(address, mask);
1138 String reply = callURL("GET", null, "application/json", null, url);
1139 JSONTokener jt = new JSONTokener(reply);
1140 JSONObject json = new JSONObject(jt);
1142 // test that the password matches what was we expected.
1143 assertEquals(pass, json.get("key"));
1147 private String createAuthKeyJSON(String key, LispIpv4Address address, int mask) {
1148 return "{\"key\" : \"" + key + "\",\"maskLength\" : " + mask + ",\"address\" : " + "{\"ipAddress\" : \""
1149 + address.getIpv4Address().getValue() + "\",\"afi\" : " + address.getAfi().shortValue() + "}}";
1152 private void northboundAddMapping() throws Exception {
1154 String pass = "asdf";
1155 LispIpv4Address eid = LispAddressUtil.asIPAfiAddress("10.0.0.1");
1157 LispIpv4Address rloc = LispAddressUtil.asIPAfiAddress("20.0.0.2");
1159 // NB add mapping always checks the key
1160 lms.addAuthenticationKey(LispAddressUtil.toContainer(eid), mask, pass);
1162 URL url = createPutURL("mapping");
1163 String mapRegisterJSON = createMapRegisterJSON(pass, eid, mask, rloc);
1164 callURL("PUT", "application/json", "text/plain", mapRegisterJSON, url);
1166 // Retrieve the RLOC from the database
1167 MapRequestBuilder mapRequestBuilder = new MapRequestBuilder();
1168 mapRequestBuilder.setPitr(false);
1169 mapRequestBuilder.setEidItem(new ArrayList<EidItem>());
1170 mapRequestBuilder.getEidItem().add(
1171 new EidRecordBuilder().setMask((short) mask).setLispAddressContainer(
1172 LispAddressUtil.toContainer(eid)).build());
1173 MapReply mapReply = lms.handleMapRequest(mapRequestBuilder.build());
1175 LispIpv4Address retrievedRloc = (LispIpv4Address) LispAddressUtil.toAFI(
1176 mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0)
1177 .getLispAddressContainer());
1179 assertEquals(rloc.getIpv4Address().getValue(), retrievedRloc.getIpv4Address().getValue());
1183 private String createMapRegisterJSON(String key, LispIpv4Address eid, int mask, LispIpv4Address rloc) {
1184 String jsonString = "{ " + "\"key\" : \"" + key + "\"," + "\"mapregister\" : " + "{ "
1185 + "\"proxyMapReply\" : false, "
1186 + "\"eidToLocatorRecords\" : " + "[ " + "{ " + "\"authoritative\" : true," + "\"prefixGeneric\" : "
1187 + "{ " + "\"ipAddress\" : \""
1188 + eid.getIpv4Address().getValue() + "\"," + "\"afi\" : " + eid.getAfi().shortValue() + "},"
1189 + "\"mapVersion\" : 0,"
1190 + "\"maskLength\" : " + mask + ", " + "\"action\" : \"NoAction\"," + "\"locators\" : " + "[ " + "{ "
1191 + "\"multicastPriority\" : 1,"
1192 + "\"locatorGeneric\" : " + "{ " + "\"ipAddress\" : \"" + rloc.getIpv4Address().getValue() + "\","
1194 + rloc.getAfi().shortValue() + "}, " + "\"routed\" : true," + "\"multicastWeight\" : 50,"
1195 + "\"rlocProbed\" : false, "
1196 + "\"localLocator\" : false, " + "\"priority\" : 1, " + "\"weight\" : 50 " + "} " + "], "
1197 + "\"recordTtl\" : 100" + "} " + "], "
1198 + "\"nonce\" : 3," + "\"keyId\" : 0 " + "} " + "}";
1203 private void northboundRetrieveMapping() throws Exception {
1205 LispIpv4Address eid = LispAddressUtil.asIPAfiAddress("10.0.0.1");
1207 LispIpv4Address rloc = LispAddressUtil.asIPAfiAddress("20.0.0.2");
1208 // Insert mapping in the database
1209 MapRegisterBuilder mapRegister = new MapRegisterBuilder();
1210 EidToLocatorRecordBuilder etlr = new EidToLocatorRecordBuilder();
1211 etlr.setLispAddressContainer(LispAddressUtil.toContainer(eid));
1212 etlr.setMaskLength((short) mask);
1213 etlr.setRecordTtl(254);
1214 etlr.setAuthoritative(false);
1215 etlr.setAction(Action.NoAction);
1216 LocatorRecordBuilder record = new LocatorRecordBuilder();
1217 record.setLispAddressContainer(LispAddressUtil.toContainer(rloc));
1218 record.setRouted(true);
1219 record.setRlocProbed(false);
1220 record.setLocalLocator(false);
1221 record.setPriority((short) 1);
1222 record.setWeight((short) 50);
1223 record.setMulticastPriority((short) 1);
1224 record.setMulticastWeight((short) 1);
1225 etlr.setLocatorRecord(new ArrayList<LocatorRecord>());
1226 etlr.getLocatorRecord().add(record.build());
1227 mapRegister.setMappingRecordItem(new ArrayList<MappingRecordItem>());
1228 mapRegister.getMappingRecordItem().add(new MappingRecordItemBuilder().setMappingRecord(etlr.build()).build());
1229 lms.handleMapRegister(mapRegister.build());
1231 // Get mapping using NB interface. No IID used
1232 URL url = createGetMappingIPv4URL(0, eid, mask);
1233 String reply = callURL("GET", null, "application/json", null, url);
1234 JSONTokener jt = new JSONTokener(reply);
1235 JSONObject json = new JSONObject(jt);
1237 // With just one locator, locators is not a JSONArray
1238 String rlocRetrieved = json.getJSONArray("locators").getJSONObject(0).getJSONObject("locatorGeneric")
1239 .getString("ipAddress");
1241 assertEquals(rloc.getIpv4Address().getValue(), rlocRetrieved);
1245 private void northboundDeleteMapping() throws Exception {
1247 LispIpv4Address eid = LispAddressUtil.asIPAfiAddress("10.0.0.1");
1249 LispIpv4Address rloc = LispAddressUtil.asIPAfiAddress("20.0.0.2");
1250 // Insert mapping in the database
1251 MapRegisterBuilder mapRegister = new MapRegisterBuilder();
1252 EidToLocatorRecordBuilder etlr = new EidToLocatorRecordBuilder();
1253 etlr.setLispAddressContainer(LispAddressUtil.toContainer(eid));
1254 etlr.setMaskLength((short) mask);
1255 etlr.setRecordTtl(254);
1256 etlr.setAuthoritative(false);
1257 etlr.setAction(Action.NoAction);
1258 LocatorRecordBuilder record = new LocatorRecordBuilder();
1259 record.setLispAddressContainer(LispAddressUtil.toContainer(rloc));
1260 record.setRouted(true);
1261 record.setRlocProbed(false);
1262 record.setLocalLocator(false);
1263 record.setPriority((short) 1);
1264 record.setWeight((short) 50);
1265 record.setMulticastPriority((short) 1);
1266 record.setMulticastWeight((short) 1);
1267 etlr.setLocatorRecord(new ArrayList<LocatorRecord>());
1268 etlr.getLocatorRecord().add(record.build());
1269 mapRegister.setMappingRecordItem(new ArrayList<MappingRecordItem>());
1270 mapRegister.getMappingRecordItem().add(new MappingRecordItemBuilder().setMappingRecord(etlr.build()).build());
1271 lms.handleMapRegister(mapRegister.build());
1273 // Delete mapping using NB interface. No IID used
1274 URL url = createDeleteMappingIPv4URL(0, eid, mask);
1275 String reply = callURL("DELETE", null, "application/json", null, url);
1277 // Get mapping using NB interface. No IID used
1278 url = createGetMappingIPv4URL(0, eid, mask);
1279 reply = callURL("GET", null, "application/json", null, url);
1280 JSONTokener jt = new JSONTokener(reply);
1281 JSONObject json = new JSONObject(jt);
1283 // With just one locator, locators is not a JSONArray
1284 assertEquals(json.getJSONArray("locators").length(), 0);
1287 private void northboundRetrieveSourceDestMapping() throws Exception {
1289 org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.lispsimpleaddress.primitiveaddress.Ipv4
1290 address1 = (org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispsimpleaddress
1291 .primitiveaddress.Ipv4) LispAddressUtil
1292 .toPrimitive(LispAddressUtil.asIPAfiAddress("10.0.0.1"));
1293 org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.lispsimpleaddress.primitiveaddress.Ipv4
1294 address2 = (org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispsimpleaddress
1295 .primitiveaddress.Ipv4) LispAddressUtil
1296 .toPrimitive(LispAddressUtil.asIPAfiAddress("10.0.0.2"));
1299 LcafSourceDestAddr sourceDestAddress = new LcafSourceDestAddrBuilder().setAfi(
1300 AddressFamilyNumberEnum.LCAF.getIanaCode())
1301 .setLcafType((short) LispCanonicalAddressFormatEnum.SOURCE_DEST.getLispCode())
1302 .setSrcAddress(new SrcAddressBuilder().setPrimitiveAddress(
1303 address1).build()).setSrcMaskLength((short) mask1)
1304 .setDstAddress(new DstAddressBuilder().setPrimitiveAddress(
1305 address2).build()).setDstMaskLength((short) mask2).build();
1306 LispIpv4Address rloc = LispAddressUtil.asIPAfiAddress("20.0.0.2");
1308 // Insert mapping in the database
1309 MapRegisterBuilder mapRegister = new MapRegisterBuilder();
1310 EidToLocatorRecordBuilder etlr = new EidToLocatorRecordBuilder();
1311 etlr.setLispAddressContainer(LispAddressUtil.toContainer(sourceDestAddress));
1312 etlr.setMaskLength((short) mask1);
1313 etlr.setRecordTtl(254);
1314 etlr.setAuthoritative(false);
1315 etlr.setAction(Action.NoAction);
1316 LocatorRecordBuilder record = new LocatorRecordBuilder();
1317 record.setLispAddressContainer(LispAddressUtil.toContainer(rloc));
1318 record.setRouted(true);
1319 record.setRlocProbed(false);
1320 record.setLocalLocator(false);
1321 record.setPriority((short) 1);
1322 record.setWeight((short) 50);
1323 record.setMulticastPriority((short) 1);
1324 record.setMulticastWeight((short) 1);
1325 etlr.setLocatorRecord(new ArrayList<LocatorRecord>());
1326 etlr.getLocatorRecord().add(record.build());
1327 mapRegister.setMappingRecordItem(new ArrayList<MappingRecordItem>());
1328 mapRegister.getMappingRecordItem().add(new MappingRecordItemBuilder().setMappingRecord(etlr.build()).build());
1329 lms.handleMapRegister(mapRegister.build());
1331 // Get mapping using NB interface. No IID used
1332 URL url = createGetMappingSourceDestURL(address1.getIpv4Address().getAfi(),
1333 address1.getIpv4Address().getIpv4Address().getValue(),
1335 address2.getIpv4Address().getIpv4Address().getValue(),
1337 String reply = callURL("GET", null, "application/json", null, url);
1338 JSONTokener jt = new JSONTokener(reply);
1339 JSONObject json = new JSONObject(jt);
1341 // With just one locator, locators is not a JSONArray
1342 String rlocRetrieved = json.getJSONArray("locators").getJSONObject(0).getJSONObject("locatorGeneric")
1343 .getString("ipAddress");
1345 assertEquals(rloc.getIpv4Address().getValue(), rlocRetrieved);
1349 private URL createGetKeyIPv4URL(LispIpv4Address address, int mask) throws MalformedURLException {
1350 String restUrl = String.format("http://localhost:8080/lispflowmapping/nb/v2/default/%s/0/%d/%s/%d", "key",
1351 address.getAfi().shortValue(),
1352 address.getIpv4Address().getValue(), mask);
1353 URL url = new URL(restUrl);
1357 private URL createGetKeySourceDestURL(int afi, String srcAddress, int srcMask, String dstAddress, int dstMask)
1358 throws MalformedURLException {
1359 String restUrl = String.format("http://localhost:8080/lispflowmapping/nb/v2/default/%s/0/%d/%s/%d/%s/%d",
1360 "key", afi, srcAddress, srcMask,
1361 dstAddress, dstMask);
1362 URL url = new URL(restUrl);
1366 private URL createGetMappingSourceDestURL(int afi, String srcAddress, int srcMask, String dstAddress, int dstMask)
1367 throws MalformedURLException {
1368 String restUrl = String.format("http://localhost:8080/lispflowmapping/nb/v2/default/%s/0/%d/%s/%d/%s/%d",
1369 "mapping", afi, srcAddress,
1370 srcMask, dstAddress, dstMask);
1371 URL url = new URL(restUrl);
1375 private URL createGetMappingIPv4URL(int iid, LispIpv4Address address, int mask) throws MalformedURLException {
1376 String restUrl = String.format("http://localhost:8080/lispflowmapping/nb/v2/default/%s/%d/%d/%s/%d", "mapping",
1377 iid, address.getAfi()
1378 .shortValue(), address.getIpv4Address().getValue(), mask);
1379 URL url = new URL(restUrl);
1383 private URL createDeleteMappingIPv4URL(int iid, LispIpv4Address address, int mask) throws MalformedURLException {
1384 String restUrl = String.format("http://localhost:8080/lispflowmapping/nb/v2/default/%s/%d/%d/%s/%d", "mapping",
1385 iid, address.getAfi()
1386 .shortValue(), address.getIpv4Address().getValue(), mask);
1387 URL url = new URL(restUrl);
1391 private URL createPutURL(String resource) throws MalformedURLException {
1393 String restUrl = String.format("http://localhost:8080/lispflowmapping/nb/v2/default/%s", resource);
1395 URL url = new URL(restUrl);
1399 private String createAuthenticationString() {
1400 String authString = "admin:admin";
1401 byte[] authEncBytes = Base64.encodeBase64(authString.getBytes());
1402 String authStringEnc = new String(authEncBytes);
1403 return authStringEnc;
1406 private String callURL(String method, String content, String accept, String body, URL url) throws IOException,
1408 String authStringEnc = createAuthenticationString();
1409 connection = (HttpURLConnection) url.openConnection();
1410 connection.setRequestMethod(method);
1411 connection.setRequestProperty("Authorization", "Basic " + authStringEnc);
1412 if (content != null) {
1413 connection.setRequestProperty("Content-Type", content);
1415 if (accept != null) {
1416 connection.setRequestProperty("Accept", accept);
1419 // now add the request body
1420 connection.setDoOutput(true);
1421 OutputStreamWriter wr = new OutputStreamWriter(connection.getOutputStream());
1425 connection.connect();
1427 // getting the result, first check response code
1428 Integer httpResponseCode = connection.getResponseCode();
1430 if (httpResponseCode > 299) {
1431 LOG.trace("HTTP Address: " + url);
1432 LOG.trace("HTTP Response Code: " + httpResponseCode);
1436 InputStream is = connection.getInputStream();
1437 BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
1438 StringBuilder sb = new StringBuilder();
1440 while ((cp = rd.read()) != -1) {
1441 sb.append((char) cp);
1444 connection.disconnect();
1445 return (sb.toString());
1448 // timePeriod - in ms
1449 public void assertNoPacketReceived(int timePeriod) {
1451 receivePacket(timePeriod);
1452 // If didn't timeout then fail:
1454 } catch (SocketTimeoutException ste) {
1458 // ------------------------------- Mask Tests ---------------------------
1460 public void eidPrefixLookupIPv4() throws SocketTimeoutException {
1462 runPrefixTest(LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/16"),
1463 LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.2/32"),
1464 LispAddressUtil.asIpv4PrefixBinaryEid("1.1.1.1/32"));
1467 public void eidPrefixLookupIPv6() throws SocketTimeoutException {
1469 runPrefixTest(LispAddressUtil.asIpv6PrefixBinaryEid("1:2:3:4:5:6:7:8/64"),
1470 LispAddressUtil.asIpv6PrefixBinaryEid("1:2:3:4:5:1:2:3/128"),
1471 LispAddressUtil.asIpv6PrefixBinaryEid("1:2:3:1:2:3:1:2/128"));
1474 private void runPrefixTest(Eid registerEID, Eid matchedAddress, Eid unMatchedAddress)
1475 throws SocketTimeoutException {
1476 mapService.addAuthenticationKey(registerEID, NULL_AUTH_KEY);
1479 MapRegisterBuilder mapRegister = new MapRegisterBuilder();
1480 mapRegister.setWantMapNotify(true);
1481 mapRegister.setNonce((long) 8);
1482 mapRegister.setWantMapNotify(true);
1483 mapRegister.setKeyId((short) 0);
1484 mapRegister.setAuthenticationData(new byte[0]);
1485 mapRegister.setNonce((long) 8);
1486 mapRegister.setProxyMapReply(false);
1487 MappingRecordBuilder etlr = new MappingRecordBuilder();
1488 etlr.setRecordTtl(254);
1489 etlr.setAction(Action.NoAction);
1490 etlr.setAuthoritative(false);
1491 etlr.setMapVersion((short) 0);
1492 etlr.setEid(registerEID);
1493 etlr.setRecordTtl(254);
1494 LocatorRecordBuilder record = new LocatorRecordBuilder();
1495 record.setRloc(LispAddressUtil.asIpv4Rloc("4.3.2.1"));
1496 record.setLocalLocator(false);
1497 record.setRlocProbed(false);
1498 record.setRouted(true);
1499 record.setMulticastPriority((short) 0);
1500 record.setMulticastWeight((short) 0);
1501 record.setPriority((short) 0);
1502 record.setWeight((short) 0);
1503 etlr.setLocatorRecord(new ArrayList<LocatorRecord>());
1504 etlr.getLocatorRecord().add(record.build());
1505 mapRegister.setMappingRecordItem(new ArrayList<MappingRecordItem>());
1506 mapRegister.getMappingRecordItem().add(new MappingRecordItemBuilder().setMappingRecord(etlr.build()).build());
1507 sendMapRegister(mapRegister.build());
1508 MapNotify mapNotify = receiveMapNotify();
1509 assertEquals(8, mapNotify.getNonce().longValue());
1511 MapRequestBuilder mapRequest = new MapRequestBuilder();
1512 mapRequest.setNonce((long) 4);
1513 mapRequest.setSourceEid(new SourceEidBuilder().setEid(LispAddressUtil.asIpv4Eid(ourAddress)).build());
1514 mapRequest.setEidItem(new ArrayList<EidItem>());
1515 mapRequest.setAuthoritative(false);
1516 mapRequest.setMapDataPresent(false);
1517 mapRequest.setPitr(false);
1518 mapRequest.setProbe(false);
1519 mapRequest.setSmr(false);
1520 mapRequest.setSmrInvoked(false);
1521 mapRequest.getEidItem().add(new EidItemBuilder().setEid(matchedAddress).build());
1522 mapRequest.setItrRloc(new ArrayList<ItrRloc>());
1523 mapRequest.getItrRloc().add(
1524 new ItrRlocBuilder().setRloc(LispAddressUtil.asIpv4Rloc(ourAddress)).build());
1525 sendMapRequest(mapRequest.build());
1526 MapReply mapReply = receiveMapReply();
1527 assertEquals(4, mapReply.getNonce().longValue());
1528 assertEquals(record.getRloc(), mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord()
1530 mapRequest.setEidItem(new ArrayList<EidItem>());
1531 mapRequest.getEidItem().add(new EidItemBuilder().setEid(unMatchedAddress).build());
1532 sendMapRequest(mapRequest.build());
1533 mapReply = receiveMapReply();
1534 assertEquals(0, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().size());
1537 // This registers an IP with a MapRegister, then adds a password via the
1538 // northbound REST API
1539 // and checks that the password works
1540 public void testPasswordExactMatch() throws Exception {
1542 String ipString = "10.0.0.1";
1543 LispIpv4Address address = LispAddressUtil.asIPAfiAddress(ipString);
1545 String pass = "pass";
1547 URL url = createPutURL("key");
1549 String jsonAuthData = createAuthKeyJSON(pass, address, mask);
1551 LOG.trace("Sending this JSON to LISP server: \n" + jsonAuthData);
1552 LOG.trace("Address: " + address);
1554 byte[] expectedSha = new byte[] { (byte) 146, (byte) 234, (byte) 52, (byte) 247, (byte) 186, (byte) 232,
1555 (byte) 31, (byte) 249, (byte) 87,
1556 (byte) 73, (byte) 234, (byte) 54, (byte) 225, (byte) 160, (byte) 129, (byte) 251, (byte) 73, (byte) 53,
1557 (byte) 196, (byte) 62 };
1559 byte[] zeros = new byte[20];
1561 callURL("PUT", "application/json", "text/plain", jsonAuthData, url);
1563 // build a MapRegister
1564 MapRegisterBuilder mapRegister = new MapRegisterBuilder();
1565 mapRegister.setWantMapNotify(true);
1566 mapRegister.setNonce((long) 8);
1567 EidToLocatorRecordBuilder etlr = new EidToLocatorRecordBuilder();
1568 etlr.setLispAddressContainer(LispAddressUtil.toContainer(address));
1569 etlr.setMaskLength((short) mask);
1570 etlr.setRecordTtl(254);
1571 LocatorRecordBuilder record = new LocatorRecordBuilder();
1572 record.setLispAddressContainer(LispAddressUtil.toContainer(locatorEid));
1573 etlr.setLocatorRecord(new ArrayList<LocatorRecord>());
1574 etlr.getLocatorRecord().add(record.build());
1575 mapRegister.setMappingRecordItem(new ArrayList<MappingRecordItem>());
1576 mapRegister.getMappingRecordItem().add(new MappingRecordItemBuilder().setMappingRecord(etlr.build()).build());
1578 mapRegister.setKeyId((short) 1); // LispKeyIDEnum.SHA1.getKeyID()
1579 mapRegister.setAuthenticationData(zeros);
1581 sendMapRegister(mapRegister.build());
1582 assertNoPacketReceived(3000);
1584 mapRegister.setAuthenticationData(expectedSha);
1586 sendMapRegister(mapRegister.build());
1588 assertMapNotifyReceived();
1591 public void testPasswordMaskMatch() throws Exception {
1593 LispIpv4Address addressInRange = LispAddressUtil.asIPAfiAddress("10.20.30.40");
1594 LispIpv4Address addressOutOfRange = LispAddressUtil.asIPAfiAddress("20.40.30.40");
1595 LispIpv4Address range = LispAddressUtil.asIPAfiAddress("10.20.30.0");
1598 String pass = "pass";
1600 URL url = createPutURL("key");
1601 String jsonAuthData = createAuthKeyJSON(pass, range, 8);
1603 callURL("PUT", "application/json", "text/plain", jsonAuthData, url);
1604 // build a MapRegister
1605 MapRegisterBuilder mapRegister = new MapRegisterBuilder();
1607 mapRegister.setWantMapNotify(true);
1608 mapRegister.setNonce((long) 8);
1609 EidToLocatorRecordBuilder etlr = new EidToLocatorRecordBuilder();
1610 etlr.setLispAddressContainer(LispAddressUtil.toContainer(addressInRange));
1611 etlr.setMaskLength((short) mask);
1612 etlr.setRecordTtl(254);
1613 LocatorRecordBuilder record = new LocatorRecordBuilder();
1614 record.setLispAddressContainer(LispAddressUtil.toContainer(locatorEid));
1615 record.setLispAddressContainer(LispAddressUtil.toContainer(locatorEid));
1616 etlr.setLocatorRecord(new ArrayList<LocatorRecord>());
1617 etlr.getLocatorRecord().add(record.build());
1618 mapRegister.setMappingRecordItem(new ArrayList<MappingRecordItem>());
1619 mapRegister.getMappingRecordItem().add(new MappingRecordItemBuilder().setMappingRecord(etlr.build()).build());
1621 mapRegister.setKeyId((short) 1); // LispKeyIDEnum.SHA1.getKeyID()
1623 .setAuthenticationData(new byte[] { -15, -52, 38, -94, 125, -111, -68, -79, 68, 6, 101, 45, -1, 47, -4,
1624 -67, -113, 104, -110, -71 });
1626 sendMapRegister(mapRegister.build());
1628 assertMapNotifyReceived();
1630 etlr.setLispAddressContainer(LispAddressUtil.toContainer(addressOutOfRange));
1632 .setAuthenticationData(new byte[] { -54, 68, -58, -91, -23, 22, -88, -31, 113, 39, 115, 78, -68, -123,
1633 -71, -14, -99, 67, -23, -73 });
1635 sendMapRegister(mapRegister.build());
1636 assertNoPacketReceived(3000);
1639 // takes an address, packs it in a MapRegister and sends it
1640 private void registerAddress(Eid eid) throws SocketTimeoutException {
1641 mapService.addAuthenticationKey(eid, NULL_AUTH_KEY);
1643 MapRegisterBuilder mapRegisterBuilder = new MapRegisterBuilder();
1644 mapRegisterBuilder.setWantMapNotify(true);
1645 mapRegisterBuilder.setKeyId((short) 0);
1646 mapRegisterBuilder.setAuthenticationData(new byte[0]);
1647 mapRegisterBuilder.setNonce((long) 8);
1648 mapRegisterBuilder.setProxyMapReply(false);
1649 MappingRecordBuilder etlrBuilder = new MappingRecordBuilder();
1650 etlrBuilder.setEid(eid);
1651 etlrBuilder.setRecordTtl(254);
1652 etlrBuilder.setAction(Action.NoAction);
1653 etlrBuilder.setAuthoritative(false);
1654 etlrBuilder.setMapVersion((short) 0);
1655 LocatorRecordBuilder recordBuilder = new LocatorRecordBuilder();
1656 recordBuilder.setLocalLocator(false);
1657 recordBuilder.setRlocProbed(false);
1658 recordBuilder.setRouted(true);
1659 recordBuilder.setMulticastPriority((short) 0);
1660 recordBuilder.setMulticastWeight((short) 0);
1661 recordBuilder.setPriority((short) 0);
1662 recordBuilder.setWeight((short) 0);
1663 recordBuilder.setRloc(locatorEid);
1664 etlrBuilder.setLocatorRecord(new ArrayList<LocatorRecord>());
1665 etlrBuilder.getLocatorRecord().add(recordBuilder.build());
1666 mapRegisterBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
1667 mapRegisterBuilder.getMappingRecordItem().add(
1668 new MappingRecordItemBuilder().setMappingRecord(etlrBuilder.build()).build());
1669 sendMapRegister(mapRegisterBuilder.build());
1670 MapNotify mapNotify = receiveMapNotify();
1671 assertEquals(8, mapNotify.getNonce().longValue());
1674 private MapReply queryForAddress(Eid eid, String srcEid) throws SocketTimeoutException {
1675 MapRequestBuilder mapRequestBuilder = new MapRequestBuilder();
1676 mapRequestBuilder.setNonce((long) 4);
1677 mapRequestBuilder.setEidItem(new ArrayList<EidItem>());
1678 mapRequestBuilder.getEidItem().add(new EidItemBuilder().setEid(eid).build());
1679 mapRequestBuilder.setItrRloc(new ArrayList<ItrRloc>());
1680 if (srcEid != null) {
1681 mapRequestBuilder.setSourceEid(new SourceEidBuilder().setEid(LispAddressUtil.asIpv4Eid(srcEid)).build());
1683 mapRequestBuilder.setSourceEid(new SourceEidBuilder().setEid(LispAddressUtil.asIpv4Eid(ourAddress))
1686 mapRequestBuilder.getItrRloc().add(
1687 new ItrRlocBuilder().setRloc(LispAddressUtil.asIpv4Rloc(ourAddress)).build());
1688 mapRequestBuilder.setAuthoritative(false);
1689 mapRequestBuilder.setMapDataPresent(false);
1690 mapRequestBuilder.setPitr(false);
1691 mapRequestBuilder.setProbe(false);
1692 mapRequestBuilder.setSmr(false);
1693 mapRequestBuilder.setSmrInvoked(false);
1694 sendMapRequest(mapRequestBuilder.build());
1695 return receiveMapReply();
1698 // takes an address, packs it in a MapRegister, sends it, returns the
1700 private MapReply registerAddressAndQuery(Eid eid) throws SocketTimeoutException {
1701 mapService.addAuthenticationKey(eid, NULL_AUTH_KEY);
1703 MapRegisterBuilder mapRegisterBuilder = new MapRegisterBuilder();
1704 mapRegisterBuilder.setWantMapNotify(true);
1705 mapRegisterBuilder.setKeyId((short) 0);
1706 mapRegisterBuilder.setAuthenticationData(new byte[0]);
1707 mapRegisterBuilder.setNonce((long) 8);
1708 mapRegisterBuilder.setProxyMapReply(false);
1709 MappingRecordBuilder etlrBuilder = new MappingRecordBuilder();
1710 etlrBuilder.setEid(eid);
1711 etlrBuilder.setRecordTtl(254);
1712 etlrBuilder.setAction(Action.NoAction);
1713 etlrBuilder.setAuthoritative(false);
1714 etlrBuilder.setMapVersion((short) 0);
1715 LocatorRecordBuilder recordBuilder = new LocatorRecordBuilder();
1716 recordBuilder.setLocalLocator(false);
1717 recordBuilder.setRlocProbed(false);
1718 recordBuilder.setRouted(true);
1719 recordBuilder.setMulticastPriority((short) 0);
1720 recordBuilder.setMulticastWeight((short) 0);
1721 recordBuilder.setPriority((short) 0);
1722 recordBuilder.setWeight((short) 0);
1723 recordBuilder.setRloc(locatorEid);
1724 etlrBuilder.setLocatorRecord(new ArrayList<LocatorRecord>());
1725 etlrBuilder.getLocatorRecord().add(recordBuilder.build());
1726 mapRegisterBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
1727 mapRegisterBuilder.getMappingRecordItem().add(new MappingRecordItemBuilder().setMappingRecord(
1728 etlrBuilder.build()).build());
1729 sendMapRegister(mapRegisterBuilder.build());
1730 MapNotify mapNotify = receiveMapNotify();
1731 assertEquals(8, mapNotify.getNonce().longValue());
1732 // wait for the notifications to propagate
1734 MapRequestBuilder mapRequestBuilder = new MapRequestBuilder();
1735 mapRequestBuilder.setNonce((long) 4);
1736 mapRequestBuilder.setEidItem(new ArrayList<EidItem>());
1737 mapRequestBuilder.getEidItem().add(new EidItemBuilder().setEid(eid).build());
1738 mapRequestBuilder.setItrRloc(new ArrayList<ItrRloc>());
1739 mapRequestBuilder.setSourceEid(new SourceEidBuilder().setEid(LispAddressUtil.asIpv4Eid(ourAddress)).build());
1740 mapRequestBuilder.getItrRloc().add(
1741 new ItrRlocBuilder().setRloc(LispAddressUtil.asIpv4Rloc(ourAddress)).build());
1742 mapRequestBuilder.setAuthoritative(false);
1743 mapRequestBuilder.setMapDataPresent(false);
1744 mapRequestBuilder.setPitr(false);
1745 mapRequestBuilder.setProbe(false);
1746 mapRequestBuilder.setSmr(false);
1747 mapRequestBuilder.setSmrInvoked(false);
1748 sendMapRequest(mapRequestBuilder.build());
1749 return receiveMapReply();
1752 // ------------------------------- LCAF Tests ---------------------------
1754 public void registerAndQuery__SrcDestLCAF() throws SocketTimeoutException {
1756 String ipPrefix = "10.20.30.200/32";
1757 String macString = "01:02:03:04:05:06";
1759 SourceDestKeyBuilder builder = new SourceDestKeyBuilder();
1760 builder.setSource(new SimpleAddress(new IpPrefix(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
1761 .ietf.inet.types.rev130715.Ipv4Prefix(ipPrefix))));
1762 builder.setDest(new SimpleAddress(new MacAddress(macString)));
1764 EidBuilder eb = new EidBuilder();
1765 eb.setAddressType(SourceDestKeyLcaf.class);
1766 eb.setVirtualNetworkId(null);
1767 eb.setAddress(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
1768 .lisp.address.address.SourceDestKeyBuilder().setSourceDestKey(builder.build()).build());
1770 MapReply reply = registerAddressAndQuery(eb.build());
1772 Eid fromNetwork = reply.getMappingRecordItem().get(0).getMappingRecord().getEid();
1773 assertEquals(SourceDestKeyLcaf.class, fromNetwork.getAddressType());
1774 SourceDestKey sourceDestFromNetwork = (SourceDestKey) fromNetwork.getAddress();
1776 SimpleAddress receivedAddr1 = sourceDestFromNetwork.getSourceDestKey().getSource();
1777 SimpleAddress receivedAddr2 = sourceDestFromNetwork.getSourceDestKey().getDest();
1779 assertNotNull(receivedAddr1.getIpPrefix().getIpv4Prefix());
1780 assertNotNull(receivedAddr2.getMacAddress());
1782 IpPrefix receivedIP = receivedAddr1.getIpPrefix();
1783 MacAddress receivedMAC = receivedAddr2.getMacAddress();
1785 assertEquals(ipPrefix, receivedIP.getIpv4Prefix().getValue());
1786 assertEquals(macString, receivedMAC.getValue());
1789 public void registerAndQuery__SrcDestLCAFOverlap() throws SocketTimeoutException {
1791 String ipString1 = "10.10.10.0";
1792 String ipString2 = "20.20.20.0";
1793 String ipPrefix1 = ipString1 + "/24";
1794 String ipPrefix2 = ipString2 + "/24";
1796 Eid srcDst = LispAddressUtil.asSrcDstEid(ipString1, ipString2, 24, 24, 0);
1797 registerAddress(LispAddressUtil.asIpv4PrefixBinaryEid(ipPrefix2));
1798 registerAddress(srcDst);
1801 MapReply reply = queryForAddress(srcDst, null);
1803 Eid fromNetwork = reply.getMappingRecordItem().get(0).getMappingRecord().getEid();
1804 assertEquals(SourceDestKeyLcaf.class, fromNetwork.getAddressType());
1805 SourceDestKey sourceDestFromNetwork = (SourceDestKey) fromNetwork.getAddress();
1807 IpPrefix receivedAddr1 = sourceDestFromNetwork.getSourceDestKey().getSource().getIpPrefix();
1808 IpPrefix receivedAddr2 = sourceDestFromNetwork.getSourceDestKey().getDest().getIpPrefix();
1810 assertNotNull(receivedAddr1.getIpv4Prefix());
1811 assertNotNull(receivedAddr2.getIpv4Prefix());
1813 assertEquals(ipPrefix1, receivedAddr1.getIpv4Prefix().getValue());
1814 assertEquals(ipPrefix2, receivedAddr2.getIpv4Prefix().getValue());
1816 // srcEid/dstEid match
1817 reply = queryForAddress(LispAddressUtil.asIpv4PrefixBinaryEid("20.20.20.1/32"), "10.10.10.1");
1818 fromNetwork = reply.getMappingRecordItem().get(0).getMappingRecord().getEid();
1819 assertEquals(Ipv4PrefixBinaryAfi.class, fromNetwork.getAddressType());
1821 assertEquals(LispAddressUtil.asIpv4PrefixBinaryEid(ipPrefix2), fromNetwork);
1823 // dstEid match only
1824 reply = queryForAddress(LispAddressUtil.asIpv4PrefixBinaryEid("20.20.20.1/32"), "1.2.3.4");
1825 fromNetwork = reply.getMappingRecordItem().get(0).getMappingRecord().getEid();
1826 assertEquals(Ipv4PrefixBinaryAfi.class, fromNetwork.getAddressType());
1828 assertEquals(LispAddressUtil.asIpv4PrefixBinaryEid(ipPrefix2), fromNetwork);
1831 public void registerAndQuery__KeyValueLCAF() throws SocketTimeoutException {
1833 String ipString = "10.20.30.200";
1834 String macString = "01:02:03:04:05:06";
1835 SimpleAddress addrToSend1 = new SimpleAddress(new IpAddress(new Ipv4Address(ipString)));
1836 SimpleAddress addrToSend2 = new SimpleAddress(new MacAddress(macString));
1837 Eid kv = LispAddressUtil.asKeyValueAddressEid(addrToSend1, addrToSend2);
1839 MapReply reply = registerAddressAndQuery(kv);
1841 Eid fromNetwork = reply.getMappingRecordItem().get(0).getMappingRecord().getEid();
1842 assertEquals(KeyValueAddressLcaf.class, fromNetwork.getAddressType());
1843 KeyValueAddress keyValueFromNetwork = (KeyValueAddress) fromNetwork.getAddress();
1845 SimpleAddress receivedAddr1 = keyValueFromNetwork.getKeyValueAddress().getKey();
1846 SimpleAddress receivedAddr2 = keyValueFromNetwork.getKeyValueAddress().getValue();
1848 assertNotNull(receivedAddr1.getIpAddress().getIpv4Address());
1849 assertNotNull(receivedAddr2.getMacAddress());
1851 Ipv4Address receivedIP = receivedAddr1.getIpAddress().getIpv4Address();
1852 MacAddress receivedMAC = receivedAddr2.getMacAddress();
1854 assertEquals(ipString, receivedIP.getValue());
1855 assertEquals(macString, receivedMAC.getValue());
1858 public void registerAndQuery__ListLCAF() throws SocketTimeoutException {
1860 String macString = "01:02:03:04:05:06";
1861 String ipString = "10.20.255.30";
1862 List<SimpleAddress> addresses = new ArrayList<SimpleAddress>();
1863 addresses.add(new SimpleAddress(new IpAddress(new Ipv4Address(ipString))));
1864 addresses.add(new SimpleAddress(new MacAddress(macString)));
1865 AfiListBuilder listbuilder = new AfiListBuilder();
1866 listbuilder.setAddressList(addresses);
1868 EidBuilder eb = new EidBuilder();
1869 eb.setAddressType(AfiListLcaf.class);
1870 eb.setVirtualNetworkId(null);
1871 eb.setAddress(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
1872 .lisp.address.address.AfiListBuilder().setAfiList(listbuilder.build()).build());
1874 MapReply reply = registerAddressAndQuery(eb.build());
1876 Eid receivedAddress = reply.getMappingRecordItem().get(0).getMappingRecord().getEid();
1878 assertEquals(AfiListLcaf.class, receivedAddress.getAddressType());
1880 AfiList listAddrFromNetwork = (AfiList) receivedAddress.getAddress();
1881 SimpleAddress receivedAddr1 = (SimpleAddress) listAddrFromNetwork.getAfiList().getAddressList().get(0);
1882 SimpleAddress receivedAddr2 = (SimpleAddress) listAddrFromNetwork.getAfiList().getAddressList().get(1);
1884 assertNotNull(receivedAddr1.getIpAddress().getIpv4Address());
1885 assertNotNull(receivedAddr2.getMacAddress());
1887 assertEquals(macString, receivedAddr2.getMacAddress().getValue());
1888 assertEquals(ipString, receivedAddr1.getIpAddress().getIpv4Address().getValue());
1891 public void registerAndQuery__SegmentLCAF() throws SocketTimeoutException {
1893 String ipString = "10.20.255.30";
1896 EidBuilder eb = new EidBuilder();
1897 eb.setAddressType(Ipv4PrefixAfi.class);
1898 eb.setVirtualNetworkId(new InstanceIdType((long) instanceId));
1899 eb.setAddress(new Ipv4PrefixBuilder().setIpv4Prefix(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns
1900 .yang.ietf.inet.types.rev130715.Ipv4Prefix(ipString)).build());
1902 MapReply reply = registerAddressAndQuery(eb.build());
1904 Eid receivedAddress = reply.getMappingRecordItem().get(0).getMappingRecord().getEid();
1905 assertEquals(Ipv4PrefixAfi.class, receivedAddress.getAddressType());
1907 assertEquals(ipString, ((Ipv4Prefix) receivedAddress.getAddress()).getIpv4Prefix().getValue());
1909 assertEquals(instanceId, receivedAddress.getVirtualNetworkId().getValue().intValue());
1912 public void registerAndQuery__TrafficEngineering() throws SocketTimeoutException {
1914 String macString = "01:02:03:04:05:06";
1915 String ipString = "10.20.255.30";
1916 HopBuilder hopBuilder = new HopBuilder();
1917 hopBuilder.setAddress(new SimpleAddress(new IpAddress(new Ipv4Address(ipString))));
1918 hopBuilder.setLrsBits(new LrsBits(true, false, true));
1919 Hop hop1 = hopBuilder.build();
1920 hopBuilder.setAddress(new SimpleAddress(new MacAddress(macString)));
1921 hopBuilder.setLrsBits(new LrsBits(false, true, false));
1922 Hop hop2 = hopBuilder.build();
1923 ExplicitLocatorPathBuilder elpBuilder = new ExplicitLocatorPathBuilder();
1924 elpBuilder.setHop(new ArrayList<Hop>());
1925 elpBuilder.getHop().add(hop1);
1926 elpBuilder.getHop().add(hop2);
1928 EidBuilder eb = new EidBuilder();
1929 eb.setAddressType(ExplicitLocatorPathLcaf.class);
1930 eb.setVirtualNetworkId(null);
1931 eb.setAddress(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
1932 .lisp.address.address.ExplicitLocatorPathBuilder().setExplicitLocatorPath(elpBuilder.build()).build());
1934 MapReply reply = registerAddressAndQuery(eb.build());
1936 assertEquals(ExplicitLocatorPathLcaf.class, reply.getMappingRecordItem().get(0).getMappingRecord().getEid()
1939 ExplicitLocatorPath receivedAddress = (ExplicitLocatorPath) reply.getMappingRecordItem().get(0)
1940 .getMappingRecord().getEid().getAddress();
1942 Hop receivedHop1 = (Hop) receivedAddress.getExplicitLocatorPath().getHop().get(0);
1943 Hop receivedHop2 = (Hop) receivedAddress.getExplicitLocatorPath().getHop().get(1);
1945 assertEquals(true, receivedHop1.getLrsBits().isLookup());
1946 assertEquals(false, receivedHop1.getLrsBits().isRlocProbe());
1947 assertEquals(true, receivedHop1.getLrsBits().isStrict());
1949 assertEquals(false, receivedHop2.getLrsBits().isLookup());
1950 assertEquals(true, receivedHop2.getLrsBits().isRlocProbe());
1951 assertEquals(false, receivedHop2.getLrsBits().isStrict());
1953 assertNotNull(receivedHop1.getAddress().getIpAddress().getIpv4Address());
1954 assertNotNull(receivedHop2.getAddress().getMacAddress());
1956 assertEquals(ipString, receivedHop1.getAddress().getIpAddress().getIpv4Address().getValue());
1957 assertEquals(macString, receivedHop2.getAddress().getMacAddress().getValue());
1960 public void registerAndQuery__ApplicationData() throws SocketTimeoutException {
1962 String ipString = "1.2.3.4";
1965 int localPortLow = 3;
1966 int localPortHigh = 4;
1967 int remotePortLow = 4;
1968 int remotePortHigh = 5;
1970 ApplicationDataBuilder builder = new ApplicationDataBuilder();
1971 builder.setIpTos(ipTOs);
1972 builder.setProtocol(protocol);
1973 builder.setLocalPortLow(new PortNumber(localPortLow));
1974 builder.setLocalPortHigh(new PortNumber(localPortHigh));
1975 builder.setRemotePortLow(new PortNumber(remotePortLow));
1976 builder.setRemotePortHigh(new PortNumber(remotePortHigh));
1977 builder.setAddress(new SimpleAddress(new IpAddress(new Ipv4Address(ipString))));
1979 EidBuilder eb = new EidBuilder();
1980 eb.setAddressType(ApplicationDataLcaf.class);
1981 eb.setVirtualNetworkId(null);
1982 eb.setAddress(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
1983 .lisp.address.address.ApplicationDataBuilder().setApplicationData(builder.build()).build());
1984 Eid addressToSend = eb.build();
1986 MapReply reply = registerAddressAndQuery(addressToSend);
1988 Eid receivedAddress = reply.getMappingRecordItem().get(0).getMappingRecord().getEid();
1990 assertEquals(ApplicationDataLcaf.class, receivedAddress.getAddressType());
1992 ApplicationData receivedApplicationDataAddress = (ApplicationData) receivedAddress.getAddress();
1993 assertEquals(protocol, receivedApplicationDataAddress.getApplicationData().getProtocol().intValue());
1994 assertEquals(ipTOs, receivedApplicationDataAddress.getApplicationData().getIpTos().intValue());
1995 assertEquals(localPortLow, receivedApplicationDataAddress.getApplicationData().getLocalPortLow().getValue()
1997 assertEquals(localPortHigh, receivedApplicationDataAddress.getApplicationData().getLocalPortHigh().getValue()
1999 assertEquals(remotePortLow, receivedApplicationDataAddress.getApplicationData().getRemotePortLow().getValue()
2001 assertEquals(remotePortHigh, receivedApplicationDataAddress.getApplicationData().getRemotePortHigh().getValue()
2004 SimpleAddress ipAddressReceived = receivedApplicationDataAddress.getApplicationData().getAddress();
2005 assertEquals(ipString, ipAddressReceived.getIpAddress().getIpv4Address().getValue());
2008 // ------------------- TimeOut Tests -----------
2010 public void mapRequestMapRegisterAndMapRequestTestTimeout() throws SocketTimeoutException {
2012 Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32");
2013 mapService.addAuthenticationKey(eid, NULL_AUTH_KEY);
2015 MapRequestBuilder mapRequestBuilder = new MapRequestBuilder();
2016 mapRequestBuilder.setNonce((long) 4);
2017 mapRequestBuilder.setSourceEid(new SourceEidBuilder().setEid(LispAddressUtil.getNoAddressEid()).build());
2018 mapRequestBuilder.setEidItem(new ArrayList<EidItem>());
2019 mapRequestBuilder.getEidItem().add(new EidItemBuilder().setEid(eid).build());
2020 mapRequestBuilder.setItrRloc(new ArrayList<ItrRloc>());
2021 mapRequestBuilder.getItrRloc().add(
2022 new ItrRlocBuilder().setRloc(LispAddressUtil.asIpv4Rloc(ourAddress)).build());
2024 sendMapRequest(mapRequestBuilder.build());
2025 MapReply mapReply = receiveMapReply();
2026 assertEquals(4, mapReply.getNonce().longValue());
2027 assertEquals(0, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().size());
2029 MapRegisterBuilder mapRegisterbuilder = new MapRegisterBuilder();
2030 mapRegisterbuilder.setWantMapNotify(true);
2031 mapRegisterbuilder.setNonce((long) 8);
2033 MappingRecordBuilder etlrBuilder = new MappingRecordBuilder();
2034 etlrBuilder.setEid(eid);
2035 etlrBuilder.setRecordTtl(254);
2037 LocatorRecordBuilder recordBuilder = new LocatorRecordBuilder();
2038 recordBuilder.setRloc(LispAddressUtil.asIpv4Rloc("4.3.2.1"));
2039 etlrBuilder.setLocatorRecord(new ArrayList<LocatorRecord>());
2040 etlrBuilder.getLocatorRecord().add(recordBuilder.build());
2041 mapRegisterbuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
2042 mapRegisterbuilder.getMappingRecordItem().add(
2043 new MappingRecordItemBuilder().setMappingRecord(etlrBuilder.build()).build());
2045 sendMapRegister(mapRegisterbuilder.build());
2046 MapNotify mapNotify = receiveMapNotify();
2047 assertEquals(8, mapNotify.getNonce().longValue());
2050 sendMapRequest(mapRequestBuilder.build());
2051 mapReply = receiveMapReply();
2052 assertEquals(4, mapReply.getNonce().longValue());
2053 assertEquals(recordBuilder.getRloc(), mapReply.getMappingRecordItem().get(0).getMappingRecord()
2054 .getLocatorRecord().get(0).getRloc());
2056 causeEntryToBeCleaned();
2057 sendMapRequest(mapRequestBuilder.build());
2058 mapReply = receiveMapReply();
2059 assertEquals(0, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().size());
2062 public void mapRequestMapRegisterAndMapRequestTestNativelyForwardTimeoutResponse() throws Exception {
2064 Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32");
2065 MapRequest mapRequest = createMapRequest(eid);
2067 testTTLBeforeRegister(mapRequest);
2069 registerForTTL(eid);
2071 testTTLAfterRegister(mapRequest);
2073 causeEntryToBeCleaned();
2074 testTTLAfterClean(mapRequest);
2076 //northboundAddKey();
2077 //testTTLAfterAutherize(mapRequest);
2081 private void testTTLAfterClean(MapRequest mapRequest) throws SocketTimeoutException {
2083 sendMapRequest(mapRequest);
2084 mapReply = receiveMapReply();
2085 assertCorrectMapReplyTTLAndAction(mapReply, 15, Action.NativelyForward);
2088 private void causeEntryToBeCleaned() {
2089 // TODO XXX for the time being, to keep master and stable/lithium in sync, we need to remove the forceful
2090 // expiration of DAO entries. Once we're past this, we'll have to expose methods to setTimeUnit(TimeUnit)
2091 // and cleanOld() (expired) entries in IFlowMapping (and perhaps ILispDAO) and use them here.
2092 mapService.cleanCachedMappings();
2095 private void testTTLAfterRegister(MapRequest mapRequest) throws SocketTimeoutException {
2097 sendMapRequest(mapRequest);
2098 mapReply = receiveMapReply();
2099 assertEquals(LispAddressUtil.asIpv4Rloc("4.3.2.1"), mapReply.getMappingRecordItem().get(0).getMappingRecord()
2100 .getLocatorRecord().get(0).getRloc());
2101 assertCorrectMapReplyTTLAndAction(mapReply, 254, Action.NoAction);
2104 private void registerForTTL(Eid eid) throws SocketTimeoutException {
2105 MapRegister mapRegister = createMapRegister(eid);
2106 sendMapRegister(mapRegister);
2107 assertMapNotifyReceived();
2110 private void testTTLBeforeRegister(MapRequest mapRequest) throws SocketTimeoutException {
2112 sendMapRequest(mapRequest);
2113 mapReply = receiveMapReply();
2114 assertCorrectMapReplyTTLAndAction(mapReply, 15, Action.NativelyForward);
2117 private void testTTLAfterAutherize(MapRequest mapRequest) throws SocketTimeoutException {
2119 sendMapRequest(mapRequest);
2120 mapReply = receiveMapReply();
2121 assertCorrectMapReplyTTLAndAction(mapReply, 1, Action.NativelyForward);
2124 private void assertCorrectMapReplyTTLAndAction(MapReply mapReply, int expectedTTL, Action expectedAction) {
2125 assertEquals(expectedTTL, mapReply.getMappingRecordItem().get(0).getMappingRecord().getRecordTtl().intValue());
2126 assertEquals(expectedAction, mapReply.getMappingRecordItem().get(0).getMappingRecord().getAction());
2129 private MapRegister createMapRegister(Eid eid, Rloc rloc) {
2130 MapRegisterBuilder mapRegisterbuilder = new MapRegisterBuilder();
2131 mapRegisterbuilder.setWantMapNotify(true);
2132 mapRegisterbuilder.setNonce((long) 8);
2133 mapRegisterbuilder.setKeyId((short) 0);
2134 MappingRecordBuilder etlrBuilder = new MappingRecordBuilder();
2135 etlrBuilder.setEid(eid);
2136 etlrBuilder.setRecordTtl(254);
2137 etlrBuilder.setAuthoritative(false);
2138 etlrBuilder.setAction(Action.NoAction);
2139 LocatorRecordBuilder recordBuilder = new LocatorRecordBuilder();
2140 recordBuilder.setRloc(rloc);
2141 etlrBuilder.setLocatorRecord(new ArrayList<LocatorRecord>());
2142 etlrBuilder.getLocatorRecord().add(recordBuilder.build());
2143 mapRegisterbuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
2144 mapRegisterbuilder.getMappingRecordItem().add(
2145 new MappingRecordItemBuilder().setMappingRecord(etlrBuilder.build()).build());
2146 MapRegister mapRegister = mapRegisterbuilder.build();
2150 private MapRegister createMapRegister(Eid eid) {
2151 return createMapRegister(eid, LispAddressUtil.asIpv4Rloc("4.3.2.1"));
2154 private MapRequest createMapRequest(Eid eid) {
2155 MapRequestBuilder mapRequestBuilder = new MapRequestBuilder();
2156 mapRequestBuilder.setNonce((long) 4);
2157 mapRequestBuilder.setPitr(false);
2158 mapRequestBuilder.setSourceEid(new SourceEidBuilder().setEid(LispAddressUtil.getNoAddressEid()).build());
2159 mapRequestBuilder.setEidItem(new ArrayList<EidItem>());
2160 mapRequestBuilder.getEidItem().add(new EidItemBuilder().setEid(eid).build());
2161 mapRequestBuilder.setItrRloc(new ArrayList<ItrRloc>());
2162 mapRequestBuilder.getItrRloc().add(
2163 new ItrRlocBuilder().setRloc(LispAddressUtil.asIpv4Rloc(ourAddress)).build());
2164 MapRequest mr = mapRequestBuilder.build();
2168 public void testSimpleNonProxy() throws SocketTimeoutException, SocketException {
2170 String rloc = "127.0.0.3";
2171 int port = LispMessage.PORT_NUM;
2172 Rloc ipRloc = LispAddressUtil.asIpv4Rloc(rloc);
2173 sendProxyMapRequest(rloc, port, ipRloc);
2177 public void testNonProxyOtherPort() throws SocketTimeoutException, SocketException {
2179 String rloc = "127.0.0.3";
2182 RlocBuilder rb = new RlocBuilder();
2183 rb.setAddressType(ApplicationDataLcaf.class);
2184 rb.setVirtualNetworkId(null);
2185 rb.setAddress(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
2186 .lisp.address.address.ApplicationDataBuilder()
2187 .setApplicationData(new ApplicationDataBuilder().setAddress(new SimpleAddress(new IpAddress(
2188 new Ipv4Address(rloc)))).setLocalPortLow(new PortNumber(port)).build()).build());
2189 Rloc adLcaf = rb.build();
2191 LOG.info("testNonProxyOtherPort:" + LispAddressStringifier.getString(adLcaf));
2192 sendProxyMapRequest(rloc, port, adLcaf);
2196 private class XtrRequestMappingListener implements OdlLispProtoListener {
2199 public void onGotMapReply(GotMapReply notification) {
2203 public void onAddMapping(AddMapping notification) {
2207 public void onXtrReplyMapping(XtrReplyMapping notification) {
2211 public void onRequestMapping(RequestMapping notification) {
2215 public void onGotMapNotify(GotMapNotify notification) {
2219 public void onXtrRequestMapping(XtrRequestMapping notification) {
2223 public void onMappingKeepAlive(MappingKeepAlive notification) {
2228 public void testRecievingNonProxyOnXtrPort() throws SocketTimeoutException, SocketException, Throwable {
2230 configLispPlugin.shouldListenOnXtrPort(true);
2231 notificationCalled = false;
2232 final String eid = "10.10.10.10/32";
2233 String rloc = "127.0.0.3";
2234 int port = LispMessage.XTR_PORT_NUM;
2236 RlocBuilder rb = new RlocBuilder();
2237 rb.setAddressType(ApplicationDataLcaf.class);
2238 rb.setVirtualNetworkId(null);
2239 rb.setAddress(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
2240 .lisp.address.address.ApplicationDataBuilder()
2241 .setApplicationData(new ApplicationDataBuilder().setAddress(new SimpleAddress(new IpAddress(
2242 new Ipv4Address(rloc)))).setLocalPortLow(new PortNumber(port)).build()).build());
2243 Rloc adLcaf = rb.build();
2245 final MapRequest mapRequest = createNonProxyMapRequest(eid, adLcaf);
2246 ((LispMappingService) lms).getNotificationService().registerNotificationListener(
2247 new XtrRequestMappingListener() {
2250 public void onXtrRequestMapping(XtrRequestMapping notification) {
2251 assertEquals(((Ipv4Prefix) mapRequest.getEidItem().get(0).getEid().getAddress())
2252 .getIpv4Prefix().getValue(), eid);
2253 notificationCalled = true;
2254 LOG.warn("notification arrived");
2257 sendMapRequest(mapRequest, port);
2258 for (int i = 0; i < MAX_NOTIFICATION_RETRYS; i++) {
2259 if (notificationCalled) {
2262 LOG.warn("notification hasn't arrived, sleeping...");
2267 fail("Notification hasn't arrived");
2271 private void sendProxyMapRequest(String rloc, int port, Rloc adLcaf) throws SocketTimeoutException,
2273 String eid = "10.1.0.1/32";
2274 MapRequest mapRequest = createNonProxyMapRequest(eid, adLcaf);
2275 sendMapRequest(mapRequest);
2276 DatagramSocket nonProxySocket = new DatagramSocket(new InetSocketAddress(rloc, port));
2277 MapRequest receivedMapRequest = receiveMapRequest(nonProxySocket);
2278 assertEquals(mapRequest.getNonce(), receivedMapRequest.getNonce());
2279 assertEquals(mapRequest.getSourceEid(), receivedMapRequest.getSourceEid());
2280 assertEquals(mapRequest.getItrRloc(), receivedMapRequest.getItrRloc());
2281 assertEquals(mapRequest.getEidItem(), receivedMapRequest.getEidItem());
2282 nonProxySocket.close();
2285 private MapRequest createNonProxyMapRequest(String eid, Rloc adLcaf) throws SocketTimeoutException {
2286 MapRegister mr = createMapRegister(LispAddressUtil.asIpv4PrefixBinaryEid(eid));
2287 LocatorRecord record = new LocatorRecordBuilder(mr.getMappingRecordItem().get(0).getMappingRecord()
2288 .getLocatorRecord().get(0)).setRloc(adLcaf).build();
2289 mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().set(0, record);
2290 sendMapRegister(mr);
2291 assertMapNotifyReceived();
2292 MapRequest mapRequest = createMapRequest(LispAddressUtil.asIpv4PrefixBinaryEid(eid));
2293 MapRequestBuilder builder = new MapRequestBuilder(mapRequest);
2294 builder.setPitr(true);
2295 mapRequest = builder.build();
2299 private void assertMapNotifyReceived() throws SocketTimeoutException {
2303 private MapReply receiveMapReply() throws SocketTimeoutException {
2304 return MapReplySerializer.getInstance().deserialize(ByteBuffer.wrap(receivePacket().getData()));
2307 private MapRequest receiveMapRequest(DatagramSocket datagramSocket) throws SocketTimeoutException {
2308 return MapRequestSerializer.getInstance().deserialize(ByteBuffer.wrap(receivePacket(
2309 datagramSocket, 30000).getData()), null);
2312 private MapNotify receiveMapNotify() throws SocketTimeoutException {
2313 return MapNotifySerializer.getInstance().deserialize(ByteBuffer.wrap(receivePacket().getData()));
2316 private void sendMapRequest(MapRequest mapRequest) {
2317 sendMapRequest(mapRequest, LispMessage.PORT_NUM);
2320 private void sendMapRequest(MapRequest mapRequest, int port) {
2321 sendPacket(MapRequestSerializer.getInstance().serialize(mapRequest).array(), port);
2324 private void sendMapRegister(MapRegister mapRegister) {
2325 sendPacket(MapRegisterSerializer.getInstance().serialize(mapRegister).array());
2328 private void sendPacket(byte[] bytesToSend) {
2329 sendPacket(bytesToSend, LispMessage.PORT_NUM);
2332 private void sendPacket(byte[] bytesToSend, int port) {
2334 DatagramPacket packet = new DatagramPacket(bytesToSend, bytesToSend.length);
2335 initPacketAddress(packet, port);
2336 LOG.trace("Sending packet to LispPlugin on socket, port {}", port);
2337 socket.send(packet);
2338 } catch (Throwable t) {
2343 private DatagramPacket receivePacket() throws SocketTimeoutException {
2344 return receivePacket(6000);
2347 private DatagramPacket receivePacket(int timeout) throws SocketTimeoutException {
2348 return receivePacket(socket, timeout);
2351 private DatagramPacket receivePacket(DatagramSocket receivedSocket, int timeout) throws SocketTimeoutException {
2353 byte[] buffer = new byte[4096];
2354 DatagramPacket receivePacket = new DatagramPacket(buffer, buffer.length);
2355 LOG.trace("Waiting for packet from socket...");
2356 receivedSocket.setSoTimeout(timeout);
2357 receivedSocket.receive(receivePacket);
2358 LOG.trace("Received packet from socket!");
2359 return receivePacket;
2360 } catch (SocketTimeoutException ste) {
2362 } catch (Throwable t) {
2368 private void sleepForSeconds(int seconds) {
2370 Thread.sleep(seconds*1000);
2371 } catch (InterruptedException e) {
2372 LOG.warn("Interrupted while sleeping", e);
2376 private void sleepForMilliseconds(long milliseconds) {
2378 Thread.sleep(milliseconds);
2379 } catch (InterruptedException e) {
2380 LOG.warn("Interrupted while sleeping", e);
2384 private void initPacketAddress(DatagramPacket packet, int port) throws UnknownHostException {
2385 packet.setAddress(InetAddress.getByName(lispBindAddress));
2386 packet.setPort(port);
2389 private DatagramSocket initSocket(DatagramSocket socket, int port) {
2390 for (int i=0; i < NUM_OF_ATTEMPTS_TO_CREATE_SOCKET; i++) {
2392 return new DatagramSocket(new InetSocketAddress(ourAddress, port));
2393 } catch (SocketException e) {
2394 LOG.error("Can't initialize socket for {}", ourAddress, e);
2401 private byte[] extractWSUdpByteArray(String wiresharkHex) {
2402 final int HEADER_LEN = 42;
2403 byte[] res = new byte[1000];
2404 String[] split = wiresharkHex.split(" ");
2406 for (String cur : split) {
2408 if (cur.length() == 2) {
2410 if (counter > HEADER_LEN) {
2411 res[counter - HEADER_LEN - 1] = (byte) Integer.parseInt(cur, 16);
2416 return Arrays.copyOf(res, counter - HEADER_LEN);
2419 private String stateToString(int state) {
2423 case Bundle.INSTALLED:
2425 case Bundle.RESOLVED:
2427 case Bundle.UNINSTALLED:
2428 return "UNINSTALLED";
2430 return "Not CONVERTED";
2434 private void areWeReady() throws InvalidSyntaxException {
2438 boolean debugit = false;
2439 Bundle b[] = bc.getBundles();
2440 for (Bundle element : b) {
2441 int state = element.getState();
2442 LOG.trace("Bundle[" + element.getBundleId() + "]:" + element.getSymbolicName() + ",v"
2443 + element.getVersion() + ", state:" + stateToString(state));
2444 if (state != Bundle.ACTIVE && state != Bundle.RESOLVED) {
2445 LOG.debug("Bundle:" + element.getSymbolicName() + " state:" + stateToString(state));
2448 // String host = element.getHeaders().get("FRAGMENT-HOST");
2449 // if (host != null) {
2450 // LOG.warn("Bundle " + element.getSymbolicName() +
2451 // " is a fragment which is part of: " + host);
2452 // LOG.warn("Required imports are: " +
2453 // element.getHeaders().get("IMPORT-PACKAGE"));
2457 // } catch (BundleException e) {
2458 // LOG.error("BundleException:", e);
2467 LOG.warn(("Do some debugging because some bundle is unresolved"));
2469 // assertNotNull(broker);
2471 configLispPlugin.setLispAddress(lispBindAddress);
2473 // Uncomment this code to Know which services were actually loaded to
2477 for (ServiceReference sr : bc.getAllServiceReferences(null, null)) {
2478 LOG.info(sr.getBundle().getSymbolicName());
2479 LOG.info(sr.toString());
2486 private void cleanUP() {
2488 mapService.cleanCachedMappings();
2489 configLispPlugin.shouldListenOnXtrPort(false);
2490 socket = initSocket(socket, LispMessage.PORT_NUM);
2494 private void restartSocket() {
2496 socket = initSocket(socket, LispMessage.PORT_NUM);