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()))
460 .setEidItem(Lists.newArrayList(new EidItemBuilder().setEid(eid1).build()))
462 .setSmr(false).build());
464 // sleep to get 1 extra smr request
465 sleepForMilliseconds(timeout * 1);
466 final List<MapRequest> requests2 = processBuffers(reader2, subscriberSrcRloc2, expectedSmrs2);
467 final MapReply mapReply2 = lms.handleMapRequest(
468 new MapRequestBuilder(requests2.get(0))
469 .setItrRloc(Lists.newArrayList(new ItrRlocBuilder()
470 .setRloc(LispAddressUtil.asIpv4Rloc(subscriberSrcRloc2)).build()))
471 .setEidItem(Lists.newArrayList(new EidItemBuilder().setEid(eid2).build()))
473 .setSmr(false).build());
476 assertEquals(expectedSmrs1, requests1.size());
477 assertEquals(expectedSmrs2, requests2.size());
478 assertEquals((long) mapReply1.getNonce(), (long) requests1.get(0).getNonce());
479 assertEquals((long) mapReply2.getNonce(), (long) requests2.get(0).getNonce());
480 assertNextBufferEmpty(reader1);
481 assertNextBufferEmpty(reader2);
483 reader1.stopReading();
484 reader2.stopReading();
487 private SocketReader startSocketReader(String address, int timeout) {
488 DatagramSocket receivingSocket = null;
491 receivingSocket = new DatagramSocket(new InetSocketAddress(address, LispMessage.PORT_NUM));
492 } catch (SocketException e) {
493 LOG.error("Can't initialize socket for {}", address, e);
495 return SocketReader.startReadingInStandaloneThread(receivingSocket, timeout);
498 private List<MapRequest> processBuffers(SocketReader reader, String address, int expectedSmrs) {
499 InetAddress inetAddress = null;
501 inetAddress = InetAddress.getByName(address);
502 } catch (UnknownHostException e) {
503 LOG.error("Unknown address {}.", address, e);
506 final List<MapRequest> requests = Lists.newArrayList();
507 byte[][] buffers = reader.getBuffers(expectedSmrs);
508 for (byte[] buf : buffers) {
509 MapRequest request = MapRequestSerializer.getInstance().deserialize(ByteBuffer.wrap(buf), inetAddress);
510 requests.add(request);
515 private void assertNextBufferEmpty(SocketReader socketReader) {
516 assertTrue(isArrayEmpty(socketReader.getBuffers(1)[0]));
519 private boolean isArrayEmpty(byte[] byteArray) {
520 for (byte b : byteArray) {
528 private static SubscriberRLOC newSubscriber(Eid srcEid, String srcRlocIp) {
529 final byte[] addressBinary = InetAddresses.forString(srcRlocIp).getAddress();
530 final int timeout = 5;
531 final Rloc srcRloc = new RlocBuilder().setAddress(new Ipv4BinaryBuilder()
532 .setIpv4Binary(new Ipv4AddressBinary(addressBinary)).build()).build();
534 return new SubscriberRLOC(srcRloc, srcEid, timeout);
537 private void testMultipleMappings() throws UnknownHostException {
538 final InstanceIdType iid = new InstanceIdType(1L);
539 final String prefix1 = "1.1.127.10/32"; // prefix from the intersection of NB and SB gaps
540 final String prefix2 = "1.1.200.255/32"; // prefix with existing mapping in NB
541 final String prefix3 = "1.3.255.255/32";
543 final MapRequest mapRequest = new MapRequestBuilder().setSmrInvoked(false).setEidItem(Lists.newArrayList(
544 new EidItemBuilder().setEid(LispAddressUtil.asIpv4PrefixBinaryEid(prefix1, iid))
546 new EidItemBuilder().setEid(LispAddressUtil.asIpv4PrefixBinaryEid(prefix2, iid))
548 new EidItemBuilder().setEid(LispAddressUtil.asIpv4PrefixBinaryEid(prefix3, iid))
551 final MapReply mapReply = lms.handleMapRequest(mapRequest);
554 final String resultPrefix1 = "1.1.64.0";
555 final Address resultNegMapping1 = new Ipv4PrefixBinaryBuilder()
556 .setIpv4AddressBinary(new Ipv4AddressBinary(InetAddress.getByName(resultPrefix1).getAddress()))
557 .setIpv4MaskLength((short) 18).build();
559 final String resultPrefix2 = "1.1.192.0";
560 final Address resultMapping2 = new Ipv4PrefixBinaryBuilder()
561 .setIpv4AddressBinary(new Ipv4AddressBinary(InetAddress.getByName(resultPrefix2).getAddress()))
562 .setIpv4MaskLength((short) 18).build();
564 final String resultPrefix3 = "1.3.0.0";
565 final Address resultNegMapping3 = new Ipv4PrefixBinaryBuilder()
566 .setIpv4AddressBinary(new Ipv4AddressBinary(InetAddress.getByName(resultPrefix3).getAddress()))
567 .setIpv4MaskLength((short) 16).build();
569 assertEquals(resultNegMapping1, mapReply.getMappingRecordItem().get(0).getMappingRecord().getEid()
571 assertEquals(resultMapping2, mapReply.getMappingRecordItem().get(1).getMappingRecord().getEid()
573 assertEquals(resultNegMapping3, mapReply.getMappingRecordItem().get(2).getMappingRecord().getEid()
578 * Tests a negative mapping from an intersection of gaps in northbound and southbound.
580 private void testGapIntersection() throws UnknownHostException {
581 final InstanceIdType iid = new InstanceIdType(1L);
583 // request an Eid from a gap between mappings
584 final MapRequest mapRequest = new MapRequestBuilder().setSmrInvoked(false).setEidItem(Lists.newArrayList(
585 new EidItemBuilder().setEid(LispAddressUtil.asIpv4PrefixBinaryEid("1.1.127.10/32", iid))
588 final MapReply mapReply = lms.handleMapRequest(mapRequest);
590 // expected negative mapping
591 final Address resultNegMapping = new Ipv4PrefixBinaryBuilder()
592 .setIpv4AddressBinary(new Ipv4AddressBinary(InetAddress.getByName("1.1.64.0").getAddress()))
593 .setIpv4MaskLength((short) 18).build();
594 assertEquals(resultNegMapping, mapReply.getMappingRecordItem().get(0).getMappingRecord().getEid()
598 private void insertMappings() {
600 mapService.setLookupPolicy(IMappingService.LookupPolicy.NB_AND_SB);
602 final InstanceIdType iid = new InstanceIdType(1L);
603 final String prefixNbLeft = "1.2.0.0/16";
604 final String prefixNbRight = "1.1.128.0/17";
605 final String prefixSbLeft = "1.1.32.0/19";
606 final String prefixSbRight = "1.0.0.0/8";
608 final MappingRecord mapRecordNbLeft = newMappingRecord(prefixNbLeft, iid);
609 final MappingRecord mapRecordNbRight = newMappingRecord(prefixNbRight, iid);
610 final MappingRecord mapRecordSbLeft = newMappingRecord(prefixSbLeft, iid);
611 final MappingRecord mapRecordSbRight = newMappingRecord(prefixSbRight, iid);
614 final Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("0.0.0.0/0", iid);
615 mapService.addAuthenticationKey(eid, NULL_AUTH_KEY);
617 mapService.addMapping(MappingOrigin.Northbound, mapRecordNbLeft.getEid(), null, mapRecordNbLeft, false);
618 mapService.addMapping(MappingOrigin.Northbound, mapRecordNbRight.getEid(), null, mapRecordNbRight, false);
619 mapService.addMapping(MappingOrigin.Southbound, mapRecordSbLeft.getEid(), null, mapRecordSbLeft, false);
620 mapService.addMapping(MappingOrigin.Southbound, mapRecordSbRight.getEid(), null, mapRecordSbRight, false);
627 * Creates a new MappingRecord object.
629 * @param prefix The Eid prefix
631 * @return new MappingRecord object
633 private MappingRecord newMappingRecord(String prefix, InstanceIdType iid) {
634 final Eid prefixBinary = LispAddressUtil.asIpv4PrefixBinaryEid(prefix, iid);
635 return new MappingRecordBuilder()
636 .setEid(prefixBinary)
637 .setLocatorRecord(Lists.newArrayList(new LocatorRecordBuilder()
638 .setRloc(LispAddressUtil.asIpv4Rloc("2.2.2.2")).setLocatorId("loc_id").build()))
639 .setTimestamp(System.currentTimeMillis()).setRecordTtl(1440).build();
645 public void testMultiSiteScenarioA() throws IOException {
648 final MultiSiteScenario multiSiteScenario = new MultiSiteScenario(mapService, lms);
649 multiSiteScenario.setCommonAuthentication();
652 final SocketReader socketReader = SocketReader.startReadingInStandaloneThread(socket);
655 multiSiteScenario.storeSouthboundMappings(false, SITE_A, SITE_B, SITE_C, SITE_D4, SITE_D5);
656 multiSiteScenario.storeNorthMappingSrcDst(SITE_B, SITE_C);
657 multiSiteScenario.storeNorthMappingNegative(SITE_C, Action.Drop);
659 multiSiteScenario.assertPingWorks(SITE_A, 5, SITE_B, 4);
660 multiSiteScenario.assertPingWorks(SITE_B, 5, SITE_C, 4);
661 multiSiteScenario.assertPingFails(SITE_A, 1, SITE_C, 4);
664 //following action should trigger generatting of SMR messages:
667 multiSiteScenario.storeNorthMappingSrcDst(SITE_A, SITE_C);
669 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B.getHost(5), SITE_A.getHost(1));
670 multiSiteScenario.assertPingWorks(SITE_A, 5, SITE_C, 4);
671 multiSiteScenario.assertPingWorks(SITE_B, 5, SITE_C, 4);
672 multiSiteScenario.assertPingFails(SITE_D4, 5, SITE_C, 4);
675 // following action should trigger generatting of SMR messages:
680 multiSiteScenario.deleteNorthMappingNegative(SITE_C);
682 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B.getHost(5), SITE_A.getHost(1), SITE_A
685 multiSiteScenario.assertPingWorks(SITE_D4, 5, SITE_C, 4);
688 // following action should trigger generatting of SMR messages:
690 multiSiteScenario.storeNorthMappingSrcDst(SITE_B, SITE_C_RLOC_10);
692 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_D4.getHost(5));
693 //way of testing ping - get RLOC for mapping src-dst and compare it with awaited value doesn't test
694 //that ping won't be successfull
695 multiSiteScenario.assertPingFails(SITE_B, 5, SITE_C, 4);
698 // following action should trigger generatting of SMR messages:
701 multiSiteScenario.storeNorthMappingNegative(SITE_C, Action.Drop);
703 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_D4.getHost(5), SITE_B.getHost(5));
704 multiSiteScenario.assertPingFails(SITE_D4, 5, SITE_C, 4);
707 multiSiteScenario.assertPingFails(SITE_D5, 5, SITE_C, 3);
710 multiSiteScenario.deleteNorthMapingSrcDst(SITE_A, SITE_C);
712 // following action should trigger generatting of SMR messages:
716 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_D5.getHost(5), SITE_D4.getHost(5),
719 // following action should trigger generatting of SMR messages:
723 multiSiteScenario.storeNorthMappingSrcDst(SITE_B, SITE_C);
725 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_D5.getHost(5), SITE_D4.getHost(5),
728 multiSiteScenario.assertPingWorks(SITE_A, 5, SITE_B, 4);
729 multiSiteScenario.assertPingWorks(SITE_B, 5, SITE_C, 4);
730 multiSiteScenario.assertPingFails(SITE_A, 1, SITE_C, 4);
733 // following action should trigger generatting of SMR messages:
738 multiSiteScenario.deleteNorthMapingSrcDst(SITE_B, SITE_C);
740 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_D5.getHost(5), SITE_D4.getHost(5),
743 multiSiteScenario.assertPingWorks(SITE_A, 5, SITE_B, 4);
744 multiSiteScenario.assertPingFails(SITE_B, 5, SITE_C, 4);
745 multiSiteScenario.assertPingFails(SITE_A, 1, SITE_C, 4);
748 // following action should trigger generatting of SMR messages:
753 multiSiteScenario.deleteNorthMappingNegative(SITE_C);
755 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_D5.getHost(5), SITE_D4.getHost(5),
758 multiSiteScenario.assertPingWorks(SITE_A, 5, SITE_B, 4);
759 multiSiteScenario.assertPingWorks(SITE_B, 5, SITE_C, 4);
760 multiSiteScenario.assertPingWorks(SITE_A, 5, SITE_C, 4);
762 socketReader.stopReading();
769 public void testMultiSiteScenarioB() throws IOException {
772 final MultiSiteScenario multiSiteScenario = new MultiSiteScenario(mapService, lms);
773 multiSiteScenario.setCommonAuthentication();
776 final SocketReader socketReader = SocketReader.startReadingInStandaloneThread(socket);
778 mapService.setLookupPolicy(IMappingService.LookupPolicy.NB_AND_SB);
779 mapService.setMappingOverwrite(false);
782 multiSiteScenario.storeSouthboundMappings(true, SITE_A_SB, SITE_B_SB, SITE_C_WP_100_1_SB, SITE_D_WP_100_1_SB,
784 multiSiteScenario.storeNorthMappingIpPrefix(SITE_A_SB);
785 multiSiteScenario.storeNorthMappingIpPrefix(SITE_B_SB);
786 multiSiteScenario.storeNorthMappingIpPrefix(SITE_C_WP_50_2_SB, SITE_D_WP_50_2_SB);
788 multiSiteScenario.assertPingWorks(SITE_A_SB, 5, SITE_C_WP_50_2_SB, 4, SITE_D_WP_50_2_SB);
789 multiSiteScenario.assertPingWorks(SITE_B_SB, 5, SITE_C_WP_50_2_SB, 4, SITE_D_WP_50_2_SB);
792 // following action should trigger generatting of SMR messages:
795 multiSiteScenario.storeNorthMappingSrcDst(SITE_A_SB, SITE_C_WP_50_2_SB, SITE_D_WP_50_2_SB);
797 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B_SB.getHost(5), SITE_A_SB.getHost(5));
799 // following action should trigger generatting of SMR messages:
802 multiSiteScenario.storeNorthMappingNegative(SITE_C_SB, Action.Drop);
804 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B_SB.getHost(5), SITE_A_SB.getHost(5));
806 multiSiteScenario.assertPingWorks(SITE_A_SB, 5, SITE_C_WP_50_2_SB, 4, SITE_D_WP_50_2_SB);
807 multiSiteScenario.assertPingFails(SITE_B_SB, 5, SITE_C_SB, 4);
811 // following action should trigger generatting of SMR messages:
814 multiSiteScenario.storeNorthMappingSrcDst(SITE_A_SB, SITE_C_WP_50_2_SB);
816 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B_SB.getHost(5), SITE_A_SB.getHost(5));
817 multiSiteScenario.assertPingWorks(SITE_A_SB, 5, SITE_C_WP_50_2_SB, 4);
820 multiSiteScenario.storeNorthMappingSrcDst(SITE_B_SB, SITE_C_WP_50_2_SB, SITE_D_WP_50_2_SB);
822 // following action should trigger generatting of SMR messages:
825 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B_SB.getHost(5), SITE_A_SB.getHost(5));
826 multiSiteScenario.assertPingWorks(SITE_B_SB, 5, SITE_C_WP_50_2_SB, 4, SITE_D_WP_50_2_SB);
829 multiSiteScenario.deleteSouthboundMappings(SITE_D_DELETE_SB);
831 // following action should trigger generatting of SMR messages:
834 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B_SB.getHost(5), SITE_A_SB.getHost(5));
836 multiSiteScenario.assertPingWorks(SITE_B_SB, 5, SITE_C_WP_50_2_SB, 4);
839 multiSiteScenario.deleteNorthMapingSrcDst(SITE_A_SB, SITE_C_WP_50_2_SB);
841 // following action should trigger generatting of SMR messages:
844 multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B_SB.getHost(5), SITE_A_SB.getHost(5));
846 multiSiteScenario.deleteNorthMapingSrcDst(SITE_B_SB, SITE_C_WP_50_2_SB);
848 multiSiteScenario.assertPingFails(SITE_B_SB, 5, SITE_C_WP_50_2_SB, 4);
850 socketReader.stopReading();
854 // ------------------------------- Simple Tests ---------------------------
856 public void mapRequestSimple() throws SocketTimeoutException {
859 // This Map-Request is sent from a source port different from 4342
860 // We close and bind the socket on the correct port
861 if (socket != null) {
864 socket = initSocket(socket, 56756);
866 sendPacket(mapRequestPacket);
867 ByteBuffer readBuf = ByteBuffer.wrap(receivePacket().getData());
868 MapReply reply = MapReplySerializer.getInstance().deserialize(readBuf);
869 assertEquals(4435248268955932168L, reply.getNonce().longValue());
873 public void mapRegisterWithMapNotify() throws SocketTimeoutException {
875 mapService.addAuthenticationKey(LispAddressUtil.asIpv4PrefixBinaryEid("153.16.254.1/32"), NULL_AUTH_KEY);
878 sendPacket(mapRegisterPacketWithNotify);
879 MapNotify reply = receiveMapNotify();
880 assertEquals(7, reply.getNonce().longValue());
883 public void mapRegisterWithMapNotifyAndMapRequest() throws SocketTimeoutException {
885 Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32");
887 MapReply mapReply = registerAddressAndQuery(eid);
889 assertEquals(4, mapReply.getNonce().longValue());
890 assertEquals(locatorEid, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0)
895 public void registerAndQuery__MAC() throws SocketTimeoutException {
897 String macAddress = "01:02:03:04:05:06";
899 MapReply reply = registerAddressAndQuery(LispAddressUtil.asMacEid(macAddress));
902 Eid addressFromNetwork = reply.getMappingRecordItem().get(0).getMappingRecord().getEid();
903 assertEquals(MacAfi.class, addressFromNetwork.getAddressType());
904 String macAddressFromReply = ((Mac) addressFromNetwork.getAddress()).getMac().getValue();
906 assertEquals(macAddress, macAddressFromReply);
909 public void mapRequestMapRegisterAndMapRequest() throws SocketTimeoutException {
911 Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32");
912 mapService.addAuthenticationKey(eid, NULL_AUTH_KEY);
915 MapRequestBuilder mapRequestBuilder = new MapRequestBuilder();
916 mapRequestBuilder.setNonce((long) 4);
917 mapRequestBuilder.setSourceEid(new SourceEidBuilder().setEid(LispAddressUtil.getNoAddressEid()).build());
918 mapRequestBuilder.setEidItem(new ArrayList<EidItem>());
919 mapRequestBuilder.getEidItem().add(new EidItemBuilder().setEid(eid).build());
920 mapRequestBuilder.setItrRloc(new ArrayList<ItrRloc>());
921 mapRequestBuilder.getItrRloc().add(
922 new ItrRlocBuilder().setRloc(LispAddressUtil.asIpv4Rloc(ourAddress)).build());
923 sendMapRequest(mapRequestBuilder.build());
924 MapReply mapReply = receiveMapReply();
925 assertEquals(4, mapReply.getNonce().longValue());
926 assertEquals(0, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().size());
927 MapRegisterBuilder mapRegisterbuilder = new MapRegisterBuilder();
928 mapRegisterbuilder.setWantMapNotify(true);
929 mapRegisterbuilder.setNonce((long) 8);
930 MappingRecordBuilder etlrBuilder = new MappingRecordBuilder();
931 etlrBuilder.setEid(eid);
932 etlrBuilder.setRecordTtl(254);
933 LocatorRecordBuilder recordBuilder = new LocatorRecordBuilder();
934 recordBuilder.setRloc(LispAddressUtil.asIpv4Rloc("4.3.2.1"));
935 etlrBuilder.setLocatorRecord(new ArrayList<LocatorRecord>());
936 etlrBuilder.getLocatorRecord().add(recordBuilder.build());
937 mapRegisterbuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
938 mapRegisterbuilder.getMappingRecordItem().add(
939 new MappingRecordItemBuilder().setMappingRecord(etlrBuilder.build()).build());
940 sendMapRegister(mapRegisterbuilder.build());
941 MapNotify mapNotify = receiveMapNotify();
942 assertEquals(8, mapNotify.getNonce().longValue());
944 sendMapRequest(mapRequestBuilder.build());
945 mapReply = receiveMapReply();
946 assertEquals(4, mapReply.getNonce().longValue());
947 assertEquals(recordBuilder.getRloc(), mapReply.getMappingRecordItem().get(0).getMappingRecord()
948 .getLocatorRecord().get(0).getRloc());
952 public void testMapRegisterDosntOverwritesOtherSubKeys() throws SocketTimeoutException {
954 Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32");
955 SimpleAddress rloc1Value = new SimpleAddress(new IpAddress(new Ipv4Address("4.3.2.1")));
956 Rloc rloc1 = LispAddressUtil.asKeyValueAddress("subkey1", rloc1Value);
957 SimpleAddress rloc2Value = new SimpleAddress(new IpAddress(new Ipv4Address("4.3.2.2")));
958 Rloc rloc2 = LispAddressUtil.asKeyValueAddress("subkey2", rloc2Value);
959 MapReply mapReply = sendMapRegisterTwiceWithDiffrentValues(eid, rloc1, rloc2);
960 assertEquals(2, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().size());
961 assertEquals(rloc2, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0)
963 assertEquals(rloc1, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(1)
967 public void testMapRegisterOverwritesSameSubkey() throws SocketTimeoutException {
969 Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32");
970 SimpleAddress rloc1Value = new SimpleAddress(new IpAddress(new Ipv4Address("4.3.2.1")));
971 Rloc rloc1 = LispAddressUtil.asKeyValueAddress("subkey1", rloc1Value);
972 SimpleAddress rloc2Value = new SimpleAddress(new IpAddress(new Ipv4Address("4.3.2.2")));
973 Rloc rloc2 = LispAddressUtil.asKeyValueAddress("subkey2", rloc2Value);
974 MapReply mapReply = sendMapRegisterTwiceWithDiffrentValues(eid, rloc1, rloc2);
975 assertEquals(1, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().size());
976 assertEquals(rloc2, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0)
980 public void testMapRegisterOverwritesNoSubkey() throws SocketTimeoutException {
982 mapService.setMappingOverwrite(true);
983 Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32");
984 Rloc rloc1Value = LispAddressUtil.asIpv4Rloc("4.3.2.1");
985 Rloc rloc2Value = LispAddressUtil.asIpv4Rloc("4.3.2.2");
986 MapReply mapReply = sendMapRegisterTwiceWithDiffrentValues(eid, rloc1Value, rloc2Value);
987 assertEquals(1, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().size());
988 assertEquals(rloc2Value, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0)
992 public void testMapRegisterDoesntOverwritesNoSubkey() throws SocketTimeoutException {
994 mapService.setMappingOverwrite(false);
995 Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32");
996 Rloc rloc1Value = LispAddressUtil.asIpv4Rloc("4.3.2.1");
997 Rloc rloc2Value = LispAddressUtil.asIpv4Rloc("4.3.2.2");
998 MapReply mapReply = sendMapRegisterTwiceWithDiffrentValues(eid, rloc1Value, rloc2Value);
999 assertEquals(1, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().size());
1000 Rloc rloc1ReturnValueContainer = mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord()
1002 Rloc rloc2ReturnValueContainer = mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord()
1004 assertTrue((rloc1Value.equals(rloc1ReturnValueContainer) && rloc2Value.equals(rloc2ReturnValueContainer))
1005 || (rloc1Value.equals(rloc2ReturnValueContainer) && rloc2Value.equals(rloc1ReturnValueContainer)));
1008 private MapReply sendMapRegisterTwiceWithDiffrentValues(Eid eid, Rloc rloc1, Rloc rloc2)
1009 throws SocketTimeoutException {
1010 mapService.addAuthenticationKey(eid, NULL_AUTH_KEY);
1012 MapRegister mb = createMapRegister(eid, rloc1);
1013 MapNotify mapNotify = lms.handleMapRegister(mb).getLeft();
1014 MapRequest mr = createMapRequest(eid);
1015 MapReply mapReply = lms.handleMapRequest(mr);
1016 assertEquals(mb.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0).getRloc(),
1017 mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0).getRloc());
1018 mb = createMapRegister(eid, rloc2);
1019 mapNotify = lms.handleMapRegister(mb).getLeft();
1020 assertEquals(8, mapNotify.getNonce().longValue());
1021 mr = createMapRequest(eid);
1023 mapReply = lms.handleMapRequest(mr);
1027 public void mapRegisterWithAuthenticationWithoutConfiguringAKey() throws SocketTimeoutException {
1029 sendPacket(mapRegisterPacketWithAuthenticationAndMapNotify);
1031 receivePacket(3000);
1032 // If didn't timeout then fail:
1034 } catch (SocketTimeoutException ste) {
1038 public void mapRegisterWithoutMapNotify() {
1040 sendPacket(mapRegisterPacketWithoutNotify);
1042 receivePacket(3000);
1043 // If didn't timeout then fail:
1045 } catch (SocketTimeoutException ste) {
1049 public void registerQueryRegisterWithSmr() throws SocketTimeoutException {
1051 lms.setShouldUseSmr(true);
1052 mapService.addAuthenticationKey(LispAddressUtil.asIpv4PrefixBinaryEid("153.16.254.1/32"), NULL_AUTH_KEY);
1055 sendPacket(mapRegisterPacketWithNotify);
1059 sendPacket(mapRequestPacket);
1062 mapRegisterPacketWithoutNotify[mapRegisterPacketWithoutNotify.length - 1] += 1;
1063 sendPacket(mapRegisterPacketWithoutNotify);
1065 ByteBuffer readBuf = ByteBuffer.wrap(receivePacket().getData());
1066 MapRequest smr = MapRequestSerializer.getInstance().deserialize(readBuf, null);
1067 assertTrue(smr.isSmr());
1068 Eid sourceEid = smr.getSourceEid().getEid();
1069 assertTrue(LispAddressUtil.asIpv4Eid("153.16.254.1").equals(sourceEid));
1070 Eid smrEid = smr.getEidItem().get(0).getEid();
1071 assertTrue(LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32").equals(smrEid));
1074 // --------------------- Northbound Tests ---------------------------
1076 private void northboundAddKey() throws Exception {
1078 LispIpv4Address address = LispAddressUtil.asIPAfiAddress("1.2.3.4");
1080 String pass = "asdf";
1082 URL url = createPutURL("key");
1083 String authKeyJSON = createAuthKeyJSON(pass, address, mask);
1084 callURL("PUT", "application/json", "text/plain", authKeyJSON, url);
1086 String retrievedKey = lms.getAuthenticationKey(LispAddressUtil.toContainer(address), mask);
1088 // Check stored password matches the one sent
1089 assertEquals(pass, retrievedKey);
1093 private void northboundRetrieveSourceDestKey() throws Exception {
1095 org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.lispsimpleaddress.primitiveaddress.Ipv4
1096 address1 = (org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispsimpleaddress
1097 .primitiveaddress.Ipv4) LispAddressUtil
1098 .toPrimitive(LispAddressUtil.asIPAfiAddress("10.0.0.1"));
1099 org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.lispsimpleaddress.primitiveaddress.Ipv4
1100 address2 = (org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispsimpleaddress
1101 .primitiveaddress.Ipv4) LispAddressUtil
1102 .toPrimitive(LispAddressUtil.asIPAfiAddress("10.0.0.2"));
1105 LcafSourceDestAddr sourceDestAddress = new LcafSourceDestAddrBuilder().setAfi(
1106 AddressFamilyNumberEnum.LCAF.getIanaCode())
1107 .setLcafType((short) LispCanonicalAddressFormatEnum.SOURCE_DEST.getLispCode())
1108 .setSrcAddress(new SrcAddressBuilder().setPrimitiveAddress(address1).build())
1109 .setSrcMaskLength((short) mask1)
1110 .setDstAddress(new DstAddressBuilder().setPrimitiveAddress(address2).build())
1111 .setDstMaskLength((short) mask2).build();
1112 String pass = "asdf";
1114 lms.addAuthenticationKey(LispAddressUtil.toContainer(sourceDestAddress), mask1, pass);
1116 // URL url = createGetKeyIPv4URL(address1, mask1);
1117 URL url = createGetKeySourceDestURL(address1.getIpv4Address().getAfi(),
1118 ((LispIpv4Address) LispAddressUtil.toAFIfromPrimitive(sourceDestAddress.getSrcAddress()
1119 .getPrimitiveAddress())).getIpv4Address().getValue(), sourceDestAddress.getSrcMaskLength(),
1120 ((LispIpv4Address) LispAddressUtil.toAFIfromPrimitive(sourceDestAddress.getDstAddress()
1121 .getPrimitiveAddress())).getIpv4Address().getValue(), sourceDestAddress.getDstMaskLength());
1122 String reply = callURL("GET", null, "application/json", null, url);
1123 JSONTokener jt = new JSONTokener(reply);
1124 JSONObject json = new JSONObject(jt);
1126 // test that the password matches what was we expected.
1127 assertEquals(pass, json.get("key"));
1131 private void northboundRetrieveKey() throws Exception {
1133 LispIpv4Address address = LispAddressUtil.asIPAfiAddress("10.0.0.1");
1135 String pass = "asdf";
1137 lms.addAuthenticationKey(LispAddressUtil.toContainer(address), mask, pass);
1139 URL url = createGetKeyIPv4URL(address, mask);
1140 String reply = callURL("GET", null, "application/json", null, url);
1141 JSONTokener jt = new JSONTokener(reply);
1142 JSONObject json = new JSONObject(jt);
1144 // test that the password matches what was we expected.
1145 assertEquals(pass, json.get("key"));
1149 private String createAuthKeyJSON(String key, LispIpv4Address address, int mask) {
1150 return "{\"key\" : \"" + key + "\",\"maskLength\" : " + mask + ",\"address\" : " + "{\"ipAddress\" : \""
1151 + address.getIpv4Address().getValue() + "\",\"afi\" : " + address.getAfi().shortValue() + "}}";
1154 private void northboundAddMapping() throws Exception {
1156 String pass = "asdf";
1157 LispIpv4Address eid = LispAddressUtil.asIPAfiAddress("10.0.0.1");
1159 LispIpv4Address rloc = LispAddressUtil.asIPAfiAddress("20.0.0.2");
1161 // NB add mapping always checks the key
1162 lms.addAuthenticationKey(LispAddressUtil.toContainer(eid), mask, pass);
1164 URL url = createPutURL("mapping");
1165 String mapRegisterJSON = createMapRegisterJSON(pass, eid, mask, rloc);
1166 callURL("PUT", "application/json", "text/plain", mapRegisterJSON, url);
1168 // Retrieve the RLOC from the database
1169 MapRequestBuilder mapRequestBuilder = new MapRequestBuilder();
1170 mapRequestBuilder.setPitr(false);
1171 mapRequestBuilder.setEidItem(new ArrayList<EidItem>());
1172 mapRequestBuilder.getEidItem().add(
1173 new EidRecordBuilder().setMask((short) mask).setLispAddressContainer(
1174 LispAddressUtil.toContainer(eid)).build());
1175 MapReply mapReply = lms.handleMapRequest(mapRequestBuilder.build());
1177 LispIpv4Address retrievedRloc = (LispIpv4Address) LispAddressUtil.toAFI(
1178 mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0)
1179 .getLispAddressContainer());
1181 assertEquals(rloc.getIpv4Address().getValue(), retrievedRloc.getIpv4Address().getValue());
1185 private String createMapRegisterJSON(String key, LispIpv4Address eid, int mask, LispIpv4Address rloc) {
1186 String jsonString = "{ " + "\"key\" : \"" + key + "\"," + "\"mapregister\" : " + "{ "
1187 + "\"proxyMapReply\" : false, "
1188 + "\"eidToLocatorRecords\" : " + "[ " + "{ " + "\"authoritative\" : true," + "\"prefixGeneric\" : "
1189 + "{ " + "\"ipAddress\" : \""
1190 + eid.getIpv4Address().getValue() + "\"," + "\"afi\" : " + eid.getAfi().shortValue() + "},"
1191 + "\"mapVersion\" : 0,"
1192 + "\"maskLength\" : " + mask + ", " + "\"action\" : \"NoAction\"," + "\"locators\" : " + "[ " + "{ "
1193 + "\"multicastPriority\" : 1,"
1194 + "\"locatorGeneric\" : " + "{ " + "\"ipAddress\" : \"" + rloc.getIpv4Address().getValue() + "\","
1196 + rloc.getAfi().shortValue() + "}, " + "\"routed\" : true," + "\"multicastWeight\" : 50,"
1197 + "\"rlocProbed\" : false, "
1198 + "\"localLocator\" : false, " + "\"priority\" : 1, " + "\"weight\" : 50 " + "} " + "], "
1199 + "\"recordTtl\" : 100" + "} " + "], "
1200 + "\"nonce\" : 3," + "\"keyId\" : 0 " + "} " + "}";
1205 private void northboundRetrieveMapping() throws Exception {
1207 LispIpv4Address eid = LispAddressUtil.asIPAfiAddress("10.0.0.1");
1209 LispIpv4Address rloc = LispAddressUtil.asIPAfiAddress("20.0.0.2");
1210 // Insert mapping in the database
1211 MapRegisterBuilder mapRegister = new MapRegisterBuilder();
1212 EidToLocatorRecordBuilder etlr = new EidToLocatorRecordBuilder();
1213 etlr.setLispAddressContainer(LispAddressUtil.toContainer(eid));
1214 etlr.setMaskLength((short) mask);
1215 etlr.setRecordTtl(254);
1216 etlr.setAuthoritative(false);
1217 etlr.setAction(Action.NoAction);
1218 LocatorRecordBuilder record = new LocatorRecordBuilder();
1219 record.setLispAddressContainer(LispAddressUtil.toContainer(rloc));
1220 record.setRouted(true);
1221 record.setRlocProbed(false);
1222 record.setLocalLocator(false);
1223 record.setPriority((short) 1);
1224 record.setWeight((short) 50);
1225 record.setMulticastPriority((short) 1);
1226 record.setMulticastWeight((short) 1);
1227 etlr.setLocatorRecord(new ArrayList<LocatorRecord>());
1228 etlr.getLocatorRecord().add(record.build());
1229 mapRegister.setMappingRecordItem(new ArrayList<MappingRecordItem>());
1230 mapRegister.getMappingRecordItem().add(new MappingRecordItemBuilder().setMappingRecord(etlr.build()).build());
1231 lms.handleMapRegister(mapRegister.build());
1233 // Get mapping using NB interface. No IID used
1234 URL url = createGetMappingIPv4URL(0, eid, mask);
1235 String reply = callURL("GET", null, "application/json", null, url);
1236 JSONTokener jt = new JSONTokener(reply);
1237 JSONObject json = new JSONObject(jt);
1239 // With just one locator, locators is not a JSONArray
1240 String rlocRetrieved = json.getJSONArray("locators").getJSONObject(0).getJSONObject("locatorGeneric")
1241 .getString("ipAddress");
1243 assertEquals(rloc.getIpv4Address().getValue(), rlocRetrieved);
1247 private void northboundDeleteMapping() throws Exception {
1249 LispIpv4Address eid = LispAddressUtil.asIPAfiAddress("10.0.0.1");
1251 LispIpv4Address rloc = LispAddressUtil.asIPAfiAddress("20.0.0.2");
1252 // Insert mapping in the database
1253 MapRegisterBuilder mapRegister = new MapRegisterBuilder();
1254 EidToLocatorRecordBuilder etlr = new EidToLocatorRecordBuilder();
1255 etlr.setLispAddressContainer(LispAddressUtil.toContainer(eid));
1256 etlr.setMaskLength((short) mask);
1257 etlr.setRecordTtl(254);
1258 etlr.setAuthoritative(false);
1259 etlr.setAction(Action.NoAction);
1260 LocatorRecordBuilder record = new LocatorRecordBuilder();
1261 record.setLispAddressContainer(LispAddressUtil.toContainer(rloc));
1262 record.setRouted(true);
1263 record.setRlocProbed(false);
1264 record.setLocalLocator(false);
1265 record.setPriority((short) 1);
1266 record.setWeight((short) 50);
1267 record.setMulticastPriority((short) 1);
1268 record.setMulticastWeight((short) 1);
1269 etlr.setLocatorRecord(new ArrayList<LocatorRecord>());
1270 etlr.getLocatorRecord().add(record.build());
1271 mapRegister.setMappingRecordItem(new ArrayList<MappingRecordItem>());
1272 mapRegister.getMappingRecordItem().add(new MappingRecordItemBuilder().setMappingRecord(etlr.build()).build());
1273 lms.handleMapRegister(mapRegister.build());
1275 // Delete mapping using NB interface. No IID used
1276 URL url = createDeleteMappingIPv4URL(0, eid, mask);
1277 String reply = callURL("DELETE", null, "application/json", null, url);
1279 // Get mapping using NB interface. No IID used
1280 url = createGetMappingIPv4URL(0, eid, mask);
1281 reply = callURL("GET", null, "application/json", null, url);
1282 JSONTokener jt = new JSONTokener(reply);
1283 JSONObject json = new JSONObject(jt);
1285 // With just one locator, locators is not a JSONArray
1286 assertEquals(json.getJSONArray("locators").length(), 0);
1289 private void northboundRetrieveSourceDestMapping() throws Exception {
1291 org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.lispsimpleaddress.primitiveaddress.Ipv4
1292 address1 = (org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispsimpleaddress
1293 .primitiveaddress.Ipv4) LispAddressUtil
1294 .toPrimitive(LispAddressUtil.asIPAfiAddress("10.0.0.1"));
1295 org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.lispsimpleaddress.primitiveaddress.Ipv4
1296 address2 = (org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.lispsimpleaddress
1297 .primitiveaddress.Ipv4) LispAddressUtil
1298 .toPrimitive(LispAddressUtil.asIPAfiAddress("10.0.0.2"));
1301 LcafSourceDestAddr sourceDestAddress = new LcafSourceDestAddrBuilder().setAfi(
1302 AddressFamilyNumberEnum.LCAF.getIanaCode())
1303 .setLcafType((short) LispCanonicalAddressFormatEnum.SOURCE_DEST.getLispCode())
1304 .setSrcAddress(new SrcAddressBuilder().setPrimitiveAddress(
1305 address1).build()).setSrcMaskLength((short) mask1)
1306 .setDstAddress(new DstAddressBuilder().setPrimitiveAddress(
1307 address2).build()).setDstMaskLength((short) mask2).build();
1308 LispIpv4Address rloc = LispAddressUtil.asIPAfiAddress("20.0.0.2");
1310 // Insert mapping in the database
1311 MapRegisterBuilder mapRegister = new MapRegisterBuilder();
1312 EidToLocatorRecordBuilder etlr = new EidToLocatorRecordBuilder();
1313 etlr.setLispAddressContainer(LispAddressUtil.toContainer(sourceDestAddress));
1314 etlr.setMaskLength((short) mask1);
1315 etlr.setRecordTtl(254);
1316 etlr.setAuthoritative(false);
1317 etlr.setAction(Action.NoAction);
1318 LocatorRecordBuilder record = new LocatorRecordBuilder();
1319 record.setLispAddressContainer(LispAddressUtil.toContainer(rloc));
1320 record.setRouted(true);
1321 record.setRlocProbed(false);
1322 record.setLocalLocator(false);
1323 record.setPriority((short) 1);
1324 record.setWeight((short) 50);
1325 record.setMulticastPriority((short) 1);
1326 record.setMulticastWeight((short) 1);
1327 etlr.setLocatorRecord(new ArrayList<LocatorRecord>());
1328 etlr.getLocatorRecord().add(record.build());
1329 mapRegister.setMappingRecordItem(new ArrayList<MappingRecordItem>());
1330 mapRegister.getMappingRecordItem().add(new MappingRecordItemBuilder().setMappingRecord(etlr.build()).build());
1331 lms.handleMapRegister(mapRegister.build());
1333 // Get mapping using NB interface. No IID used
1334 URL url = createGetMappingSourceDestURL(address1.getIpv4Address().getAfi(),
1335 address1.getIpv4Address().getIpv4Address().getValue(),
1337 address2.getIpv4Address().getIpv4Address().getValue(),
1339 String reply = callURL("GET", null, "application/json", null, url);
1340 JSONTokener jt = new JSONTokener(reply);
1341 JSONObject json = new JSONObject(jt);
1343 // With just one locator, locators is not a JSONArray
1344 String rlocRetrieved = json.getJSONArray("locators").getJSONObject(0).getJSONObject("locatorGeneric")
1345 .getString("ipAddress");
1347 assertEquals(rloc.getIpv4Address().getValue(), rlocRetrieved);
1351 private URL createGetKeyIPv4URL(LispIpv4Address address, int mask) throws MalformedURLException {
1352 String restUrl = String.format("http://localhost:8080/lispflowmapping/nb/v2/default/%s/0/%d/%s/%d", "key",
1353 address.getAfi().shortValue(),
1354 address.getIpv4Address().getValue(), mask);
1355 URL url = new URL(restUrl);
1359 private URL createGetKeySourceDestURL(int afi, String srcAddress, int srcMask, String dstAddress, int dstMask)
1360 throws MalformedURLException {
1361 String restUrl = String.format("http://localhost:8080/lispflowmapping/nb/v2/default/%s/0/%d/%s/%d/%s/%d",
1362 "key", afi, srcAddress, srcMask,
1363 dstAddress, dstMask);
1364 URL url = new URL(restUrl);
1368 private URL createGetMappingSourceDestURL(int afi, String srcAddress, int srcMask, String dstAddress, int dstMask)
1369 throws MalformedURLException {
1370 String restUrl = String.format("http://localhost:8080/lispflowmapping/nb/v2/default/%s/0/%d/%s/%d/%s/%d",
1371 "mapping", afi, srcAddress,
1372 srcMask, dstAddress, dstMask);
1373 URL url = new URL(restUrl);
1377 private URL createGetMappingIPv4URL(int iid, LispIpv4Address address, int mask) throws MalformedURLException {
1378 String restUrl = String.format("http://localhost:8080/lispflowmapping/nb/v2/default/%s/%d/%d/%s/%d", "mapping",
1379 iid, address.getAfi()
1380 .shortValue(), address.getIpv4Address().getValue(), mask);
1381 URL url = new URL(restUrl);
1385 private URL createDeleteMappingIPv4URL(int iid, LispIpv4Address address, int mask) throws MalformedURLException {
1386 String restUrl = String.format("http://localhost:8080/lispflowmapping/nb/v2/default/%s/%d/%d/%s/%d", "mapping",
1387 iid, address.getAfi()
1388 .shortValue(), address.getIpv4Address().getValue(), mask);
1389 URL url = new URL(restUrl);
1393 private URL createPutURL(String resource) throws MalformedURLException {
1395 String restUrl = String.format("http://localhost:8080/lispflowmapping/nb/v2/default/%s", resource);
1397 URL url = new URL(restUrl);
1401 private String createAuthenticationString() {
1402 String authString = "admin:admin";
1403 byte[] authEncBytes = Base64.encodeBase64(authString.getBytes());
1404 String authStringEnc = new String(authEncBytes);
1405 return authStringEnc;
1408 private String callURL(String method, String content, String accept, String body, URL url) throws IOException,
1410 String authStringEnc = createAuthenticationString();
1411 connection = (HttpURLConnection) url.openConnection();
1412 connection.setRequestMethod(method);
1413 connection.setRequestProperty("Authorization", "Basic " + authStringEnc);
1414 if (content != null) {
1415 connection.setRequestProperty("Content-Type", content);
1417 if (accept != null) {
1418 connection.setRequestProperty("Accept", accept);
1421 // now add the request body
1422 connection.setDoOutput(true);
1423 OutputStreamWriter wr = new OutputStreamWriter(connection.getOutputStream());
1427 connection.connect();
1429 // getting the result, first check response code
1430 Integer httpResponseCode = connection.getResponseCode();
1432 if (httpResponseCode > 299) {
1433 LOG.trace("HTTP Address: " + url);
1434 LOG.trace("HTTP Response Code: " + httpResponseCode);
1438 InputStream is = connection.getInputStream();
1439 BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
1440 StringBuilder sb = new StringBuilder();
1442 while ((cp = rd.read()) != -1) {
1443 sb.append((char) cp);
1446 connection.disconnect();
1447 return (sb.toString());
1450 // timePeriod - in ms
1451 public void assertNoPacketReceived(int timePeriod) {
1453 receivePacket(timePeriod);
1454 // If didn't timeout then fail:
1456 } catch (SocketTimeoutException ste) {
1460 // ------------------------------- Mask Tests ---------------------------
1462 public void eidPrefixLookupIPv4() throws SocketTimeoutException {
1464 runPrefixTest(LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/16"),
1465 LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.2/32"),
1466 LispAddressUtil.asIpv4PrefixBinaryEid("1.1.1.1/32"));
1469 public void eidPrefixLookupIPv6() throws SocketTimeoutException {
1471 runPrefixTest(LispAddressUtil.asIpv6PrefixBinaryEid("1:2:3:4:5:6:7:8/64"),
1472 LispAddressUtil.asIpv6PrefixBinaryEid("1:2:3:4:5:1:2:3/128"),
1473 LispAddressUtil.asIpv6PrefixBinaryEid("1:2:3:1:2:3:1:2/128"));
1476 private void runPrefixTest(Eid registerEID, Eid matchedAddress, Eid unMatchedAddress)
1477 throws SocketTimeoutException {
1478 mapService.addAuthenticationKey(registerEID, NULL_AUTH_KEY);
1481 MapRegisterBuilder mapRegister = new MapRegisterBuilder();
1482 mapRegister.setWantMapNotify(true);
1483 mapRegister.setNonce((long) 8);
1484 mapRegister.setWantMapNotify(true);
1485 mapRegister.setKeyId((short) 0);
1486 mapRegister.setAuthenticationData(new byte[0]);
1487 mapRegister.setNonce((long) 8);
1488 mapRegister.setProxyMapReply(false);
1489 MappingRecordBuilder etlr = new MappingRecordBuilder();
1490 etlr.setRecordTtl(254);
1491 etlr.setAction(Action.NoAction);
1492 etlr.setAuthoritative(false);
1493 etlr.setMapVersion((short) 0);
1494 etlr.setEid(registerEID);
1495 etlr.setRecordTtl(254);
1496 LocatorRecordBuilder record = new LocatorRecordBuilder();
1497 record.setRloc(LispAddressUtil.asIpv4Rloc("4.3.2.1"));
1498 record.setLocalLocator(false);
1499 record.setRlocProbed(false);
1500 record.setRouted(true);
1501 record.setMulticastPriority((short) 0);
1502 record.setMulticastWeight((short) 0);
1503 record.setPriority((short) 0);
1504 record.setWeight((short) 0);
1505 etlr.setLocatorRecord(new ArrayList<LocatorRecord>());
1506 etlr.getLocatorRecord().add(record.build());
1507 mapRegister.setMappingRecordItem(new ArrayList<MappingRecordItem>());
1508 mapRegister.getMappingRecordItem().add(new MappingRecordItemBuilder().setMappingRecord(etlr.build()).build());
1509 sendMapRegister(mapRegister.build());
1510 MapNotify mapNotify = receiveMapNotify();
1511 assertEquals(8, mapNotify.getNonce().longValue());
1513 MapRequestBuilder mapRequest = new MapRequestBuilder();
1514 mapRequest.setNonce((long) 4);
1515 mapRequest.setSourceEid(new SourceEidBuilder().setEid(LispAddressUtil.asIpv4Eid(ourAddress)).build());
1516 mapRequest.setEidItem(new ArrayList<EidItem>());
1517 mapRequest.setAuthoritative(false);
1518 mapRequest.setMapDataPresent(false);
1519 mapRequest.setPitr(false);
1520 mapRequest.setProbe(false);
1521 mapRequest.setSmr(false);
1522 mapRequest.setSmrInvoked(false);
1523 mapRequest.getEidItem().add(new EidItemBuilder().setEid(matchedAddress).build());
1524 mapRequest.setItrRloc(new ArrayList<ItrRloc>());
1525 mapRequest.getItrRloc().add(
1526 new ItrRlocBuilder().setRloc(LispAddressUtil.asIpv4Rloc(ourAddress)).build());
1527 sendMapRequest(mapRequest.build());
1528 MapReply mapReply = receiveMapReply();
1529 assertEquals(4, mapReply.getNonce().longValue());
1530 assertEquals(record.getRloc(), mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord()
1532 mapRequest.setEidItem(new ArrayList<EidItem>());
1533 mapRequest.getEidItem().add(new EidItemBuilder().setEid(unMatchedAddress).build());
1534 sendMapRequest(mapRequest.build());
1535 mapReply = receiveMapReply();
1536 assertEquals(0, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().size());
1539 // This registers an IP with a MapRegister, then adds a password via the
1540 // northbound REST API
1541 // and checks that the password works
1542 public void testPasswordExactMatch() throws Exception {
1544 String ipString = "10.0.0.1";
1545 LispIpv4Address address = LispAddressUtil.asIPAfiAddress(ipString);
1547 String pass = "pass";
1549 URL url = createPutURL("key");
1551 String jsonAuthData = createAuthKeyJSON(pass, address, mask);
1553 LOG.trace("Sending this JSON to LISP server: \n" + jsonAuthData);
1554 LOG.trace("Address: " + address);
1556 byte[] expectedSha = new byte[] { (byte) 146, (byte) 234, (byte) 52, (byte) 247, (byte) 186, (byte) 232,
1557 (byte) 31, (byte) 249, (byte) 87,
1558 (byte) 73, (byte) 234, (byte) 54, (byte) 225, (byte) 160, (byte) 129, (byte) 251, (byte) 73, (byte) 53,
1559 (byte) 196, (byte) 62 };
1561 byte[] zeros = new byte[20];
1563 callURL("PUT", "application/json", "text/plain", jsonAuthData, url);
1565 // build a MapRegister
1566 MapRegisterBuilder mapRegister = new MapRegisterBuilder();
1567 mapRegister.setWantMapNotify(true);
1568 mapRegister.setNonce((long) 8);
1569 EidToLocatorRecordBuilder etlr = new EidToLocatorRecordBuilder();
1570 etlr.setLispAddressContainer(LispAddressUtil.toContainer(address));
1571 etlr.setMaskLength((short) mask);
1572 etlr.setRecordTtl(254);
1573 LocatorRecordBuilder record = new LocatorRecordBuilder();
1574 record.setLispAddressContainer(LispAddressUtil.toContainer(locatorEid));
1575 etlr.setLocatorRecord(new ArrayList<LocatorRecord>());
1576 etlr.getLocatorRecord().add(record.build());
1577 mapRegister.setMappingRecordItem(new ArrayList<MappingRecordItem>());
1578 mapRegister.getMappingRecordItem().add(new MappingRecordItemBuilder().setMappingRecord(etlr.build()).build());
1580 mapRegister.setKeyId((short) 1); // LispKeyIDEnum.SHA1.getKeyID()
1581 mapRegister.setAuthenticationData(zeros);
1583 sendMapRegister(mapRegister.build());
1584 assertNoPacketReceived(3000);
1586 mapRegister.setAuthenticationData(expectedSha);
1588 sendMapRegister(mapRegister.build());
1590 assertMapNotifyReceived();
1593 public void testPasswordMaskMatch() throws Exception {
1595 LispIpv4Address addressInRange = LispAddressUtil.asIPAfiAddress("10.20.30.40");
1596 LispIpv4Address addressOutOfRange = LispAddressUtil.asIPAfiAddress("20.40.30.40");
1597 LispIpv4Address range = LispAddressUtil.asIPAfiAddress("10.20.30.0");
1600 String pass = "pass";
1602 URL url = createPutURL("key");
1603 String jsonAuthData = createAuthKeyJSON(pass, range, 8);
1605 callURL("PUT", "application/json", "text/plain", jsonAuthData, url);
1606 // build a MapRegister
1607 MapRegisterBuilder mapRegister = new MapRegisterBuilder();
1609 mapRegister.setWantMapNotify(true);
1610 mapRegister.setNonce((long) 8);
1611 EidToLocatorRecordBuilder etlr = new EidToLocatorRecordBuilder();
1612 etlr.setLispAddressContainer(LispAddressUtil.toContainer(addressInRange));
1613 etlr.setMaskLength((short) mask);
1614 etlr.setRecordTtl(254);
1615 LocatorRecordBuilder record = new LocatorRecordBuilder();
1616 record.setLispAddressContainer(LispAddressUtil.toContainer(locatorEid));
1617 record.setLispAddressContainer(LispAddressUtil.toContainer(locatorEid));
1618 etlr.setLocatorRecord(new ArrayList<LocatorRecord>());
1619 etlr.getLocatorRecord().add(record.build());
1620 mapRegister.setMappingRecordItem(new ArrayList<MappingRecordItem>());
1621 mapRegister.getMappingRecordItem().add(new MappingRecordItemBuilder().setMappingRecord(etlr.build()).build());
1623 mapRegister.setKeyId((short) 1); // LispKeyIDEnum.SHA1.getKeyID()
1625 .setAuthenticationData(new byte[] { -15, -52, 38, -94, 125, -111, -68, -79, 68, 6, 101, 45, -1, 47, -4,
1626 -67, -113, 104, -110, -71 });
1628 sendMapRegister(mapRegister.build());
1630 assertMapNotifyReceived();
1632 etlr.setLispAddressContainer(LispAddressUtil.toContainer(addressOutOfRange));
1634 .setAuthenticationData(new byte[] { -54, 68, -58, -91, -23, 22, -88, -31, 113, 39, 115, 78, -68, -123,
1635 -71, -14, -99, 67, -23, -73 });
1637 sendMapRegister(mapRegister.build());
1638 assertNoPacketReceived(3000);
1641 // takes an address, packs it in a MapRegister and sends it
1642 private void registerAddress(Eid eid) throws SocketTimeoutException {
1643 mapService.addAuthenticationKey(eid, NULL_AUTH_KEY);
1645 MapRegisterBuilder mapRegisterBuilder = new MapRegisterBuilder();
1646 mapRegisterBuilder.setWantMapNotify(true);
1647 mapRegisterBuilder.setKeyId((short) 0);
1648 mapRegisterBuilder.setAuthenticationData(new byte[0]);
1649 mapRegisterBuilder.setNonce((long) 8);
1650 mapRegisterBuilder.setProxyMapReply(false);
1651 MappingRecordBuilder etlrBuilder = new MappingRecordBuilder();
1652 etlrBuilder.setEid(eid);
1653 etlrBuilder.setRecordTtl(254);
1654 etlrBuilder.setAction(Action.NoAction);
1655 etlrBuilder.setAuthoritative(false);
1656 etlrBuilder.setMapVersion((short) 0);
1657 LocatorRecordBuilder recordBuilder = new LocatorRecordBuilder();
1658 recordBuilder.setLocalLocator(false);
1659 recordBuilder.setRlocProbed(false);
1660 recordBuilder.setRouted(true);
1661 recordBuilder.setMulticastPriority((short) 0);
1662 recordBuilder.setMulticastWeight((short) 0);
1663 recordBuilder.setPriority((short) 0);
1664 recordBuilder.setWeight((short) 0);
1665 recordBuilder.setRloc(locatorEid);
1666 etlrBuilder.setLocatorRecord(new ArrayList<LocatorRecord>());
1667 etlrBuilder.getLocatorRecord().add(recordBuilder.build());
1668 mapRegisterBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
1669 mapRegisterBuilder.getMappingRecordItem().add(
1670 new MappingRecordItemBuilder().setMappingRecord(etlrBuilder.build()).build());
1671 sendMapRegister(mapRegisterBuilder.build());
1672 MapNotify mapNotify = receiveMapNotify();
1673 assertEquals(8, mapNotify.getNonce().longValue());
1676 private MapReply queryForAddress(Eid eid, String srcEid) throws SocketTimeoutException {
1677 MapRequestBuilder mapRequestBuilder = new MapRequestBuilder();
1678 mapRequestBuilder.setNonce((long) 4);
1679 mapRequestBuilder.setEidItem(new ArrayList<EidItem>());
1680 mapRequestBuilder.getEidItem().add(new EidItemBuilder().setEid(eid).build());
1681 mapRequestBuilder.setItrRloc(new ArrayList<ItrRloc>());
1682 if (srcEid != null) {
1683 mapRequestBuilder.setSourceEid(new SourceEidBuilder().setEid(LispAddressUtil.asIpv4Eid(srcEid)).build());
1685 mapRequestBuilder.setSourceEid(new SourceEidBuilder().setEid(LispAddressUtil.asIpv4Eid(ourAddress))
1688 mapRequestBuilder.getItrRloc().add(
1689 new ItrRlocBuilder().setRloc(LispAddressUtil.asIpv4Rloc(ourAddress)).build());
1690 mapRequestBuilder.setAuthoritative(false);
1691 mapRequestBuilder.setMapDataPresent(false);
1692 mapRequestBuilder.setPitr(false);
1693 mapRequestBuilder.setProbe(false);
1694 mapRequestBuilder.setSmr(false);
1695 mapRequestBuilder.setSmrInvoked(false);
1696 sendMapRequest(mapRequestBuilder.build());
1697 return receiveMapReply();
1700 // takes an address, packs it in a MapRegister, sends it, returns the
1702 private MapReply registerAddressAndQuery(Eid eid) throws SocketTimeoutException {
1703 mapService.addAuthenticationKey(eid, NULL_AUTH_KEY);
1705 MapRegisterBuilder mapRegisterBuilder = new MapRegisterBuilder();
1706 mapRegisterBuilder.setWantMapNotify(true);
1707 mapRegisterBuilder.setKeyId((short) 0);
1708 mapRegisterBuilder.setAuthenticationData(new byte[0]);
1709 mapRegisterBuilder.setNonce((long) 8);
1710 mapRegisterBuilder.setProxyMapReply(false);
1711 MappingRecordBuilder etlrBuilder = new MappingRecordBuilder();
1712 etlrBuilder.setEid(eid);
1713 etlrBuilder.setRecordTtl(254);
1714 etlrBuilder.setAction(Action.NoAction);
1715 etlrBuilder.setAuthoritative(false);
1716 etlrBuilder.setMapVersion((short) 0);
1717 LocatorRecordBuilder recordBuilder = new LocatorRecordBuilder();
1718 recordBuilder.setLocalLocator(false);
1719 recordBuilder.setRlocProbed(false);
1720 recordBuilder.setRouted(true);
1721 recordBuilder.setMulticastPriority((short) 0);
1722 recordBuilder.setMulticastWeight((short) 0);
1723 recordBuilder.setPriority((short) 0);
1724 recordBuilder.setWeight((short) 0);
1725 recordBuilder.setRloc(locatorEid);
1726 etlrBuilder.setLocatorRecord(new ArrayList<LocatorRecord>());
1727 etlrBuilder.getLocatorRecord().add(recordBuilder.build());
1728 mapRegisterBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
1729 mapRegisterBuilder.getMappingRecordItem().add(new MappingRecordItemBuilder().setMappingRecord(
1730 etlrBuilder.build()).build());
1731 sendMapRegister(mapRegisterBuilder.build());
1732 MapNotify mapNotify = receiveMapNotify();
1733 assertEquals(8, mapNotify.getNonce().longValue());
1734 // wait for the notifications to propagate
1736 MapRequestBuilder mapRequestBuilder = new MapRequestBuilder();
1737 mapRequestBuilder.setNonce((long) 4);
1738 mapRequestBuilder.setEidItem(new ArrayList<EidItem>());
1739 mapRequestBuilder.getEidItem().add(new EidItemBuilder().setEid(eid).build());
1740 mapRequestBuilder.setItrRloc(new ArrayList<ItrRloc>());
1741 mapRequestBuilder.setSourceEid(new SourceEidBuilder().setEid(LispAddressUtil.asIpv4Eid(ourAddress)).build());
1742 mapRequestBuilder.getItrRloc().add(
1743 new ItrRlocBuilder().setRloc(LispAddressUtil.asIpv4Rloc(ourAddress)).build());
1744 mapRequestBuilder.setAuthoritative(false);
1745 mapRequestBuilder.setMapDataPresent(false);
1746 mapRequestBuilder.setPitr(false);
1747 mapRequestBuilder.setProbe(false);
1748 mapRequestBuilder.setSmr(false);
1749 mapRequestBuilder.setSmrInvoked(false);
1750 sendMapRequest(mapRequestBuilder.build());
1751 return receiveMapReply();
1754 // ------------------------------- LCAF Tests ---------------------------
1756 public void registerAndQuery__SrcDestLCAF() throws SocketTimeoutException {
1758 String ipPrefix = "10.20.30.200/32";
1759 String macString = "01:02:03:04:05:06";
1761 SourceDestKeyBuilder builder = new SourceDestKeyBuilder();
1762 builder.setSource(new SimpleAddress(new IpPrefix(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
1763 .ietf.inet.types.rev130715.Ipv4Prefix(ipPrefix))));
1764 builder.setDest(new SimpleAddress(new MacAddress(macString)));
1766 EidBuilder eb = new EidBuilder();
1767 eb.setAddressType(SourceDestKeyLcaf.class);
1768 eb.setVirtualNetworkId(null);
1769 eb.setAddress(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
1770 .lisp.address.address.SourceDestKeyBuilder().setSourceDestKey(builder.build()).build());
1772 MapReply reply = registerAddressAndQuery(eb.build());
1774 Eid fromNetwork = reply.getMappingRecordItem().get(0).getMappingRecord().getEid();
1775 assertEquals(SourceDestKeyLcaf.class, fromNetwork.getAddressType());
1776 SourceDestKey sourceDestFromNetwork = (SourceDestKey) fromNetwork.getAddress();
1778 SimpleAddress receivedAddr1 = sourceDestFromNetwork.getSourceDestKey().getSource();
1779 SimpleAddress receivedAddr2 = sourceDestFromNetwork.getSourceDestKey().getDest();
1781 assertNotNull(receivedAddr1.getIpPrefix().getIpv4Prefix());
1782 assertNotNull(receivedAddr2.getMacAddress());
1784 IpPrefix receivedIP = receivedAddr1.getIpPrefix();
1785 MacAddress receivedMAC = receivedAddr2.getMacAddress();
1787 assertEquals(ipPrefix, receivedIP.getIpv4Prefix().getValue());
1788 assertEquals(macString, receivedMAC.getValue());
1791 public void registerAndQuery__SrcDestLCAFOverlap() throws SocketTimeoutException {
1793 String ipString1 = "10.10.10.0";
1794 String ipString2 = "20.20.20.0";
1795 String ipPrefix1 = ipString1 + "/24";
1796 String ipPrefix2 = ipString2 + "/24";
1798 Eid srcDst = LispAddressUtil.asSrcDstEid(ipString1, ipString2, 24, 24, 0);
1799 registerAddress(LispAddressUtil.asIpv4PrefixBinaryEid(ipPrefix2));
1800 registerAddress(srcDst);
1803 MapReply reply = queryForAddress(srcDst, null);
1805 Eid fromNetwork = reply.getMappingRecordItem().get(0).getMappingRecord().getEid();
1806 assertEquals(SourceDestKeyLcaf.class, fromNetwork.getAddressType());
1807 SourceDestKey sourceDestFromNetwork = (SourceDestKey) fromNetwork.getAddress();
1809 IpPrefix receivedAddr1 = sourceDestFromNetwork.getSourceDestKey().getSource().getIpPrefix();
1810 IpPrefix receivedAddr2 = sourceDestFromNetwork.getSourceDestKey().getDest().getIpPrefix();
1812 assertNotNull(receivedAddr1.getIpv4Prefix());
1813 assertNotNull(receivedAddr2.getIpv4Prefix());
1815 assertEquals(ipPrefix1, receivedAddr1.getIpv4Prefix().getValue());
1816 assertEquals(ipPrefix2, receivedAddr2.getIpv4Prefix().getValue());
1818 // srcEid/dstEid match
1819 reply = queryForAddress(LispAddressUtil.asIpv4PrefixBinaryEid("20.20.20.1/32"), "10.10.10.1");
1820 fromNetwork = reply.getMappingRecordItem().get(0).getMappingRecord().getEid();
1821 assertEquals(Ipv4PrefixBinaryAfi.class, fromNetwork.getAddressType());
1823 assertEquals(LispAddressUtil.asIpv4PrefixBinaryEid(ipPrefix2), fromNetwork);
1825 // dstEid match only
1826 reply = queryForAddress(LispAddressUtil.asIpv4PrefixBinaryEid("20.20.20.1/32"), "1.2.3.4");
1827 fromNetwork = reply.getMappingRecordItem().get(0).getMappingRecord().getEid();
1828 assertEquals(Ipv4PrefixBinaryAfi.class, fromNetwork.getAddressType());
1830 assertEquals(LispAddressUtil.asIpv4PrefixBinaryEid(ipPrefix2), fromNetwork);
1833 public void registerAndQuery__KeyValueLCAF() throws SocketTimeoutException {
1835 String ipString = "10.20.30.200";
1836 String macString = "01:02:03:04:05:06";
1837 SimpleAddress addrToSend1 = new SimpleAddress(new IpAddress(new Ipv4Address(ipString)));
1838 SimpleAddress addrToSend2 = new SimpleAddress(new MacAddress(macString));
1839 Eid kv = LispAddressUtil.asKeyValueAddressEid(addrToSend1, addrToSend2);
1841 MapReply reply = registerAddressAndQuery(kv);
1843 Eid fromNetwork = reply.getMappingRecordItem().get(0).getMappingRecord().getEid();
1844 assertEquals(KeyValueAddressLcaf.class, fromNetwork.getAddressType());
1845 KeyValueAddress keyValueFromNetwork = (KeyValueAddress) fromNetwork.getAddress();
1847 SimpleAddress receivedAddr1 = keyValueFromNetwork.getKeyValueAddress().getKey();
1848 SimpleAddress receivedAddr2 = keyValueFromNetwork.getKeyValueAddress().getValue();
1850 assertNotNull(receivedAddr1.getIpAddress().getIpv4Address());
1851 assertNotNull(receivedAddr2.getMacAddress());
1853 Ipv4Address receivedIP = receivedAddr1.getIpAddress().getIpv4Address();
1854 MacAddress receivedMAC = receivedAddr2.getMacAddress();
1856 assertEquals(ipString, receivedIP.getValue());
1857 assertEquals(macString, receivedMAC.getValue());
1860 public void registerAndQuery__ListLCAF() throws SocketTimeoutException {
1862 String macString = "01:02:03:04:05:06";
1863 String ipString = "10.20.255.30";
1864 List<SimpleAddress> addresses = new ArrayList<SimpleAddress>();
1865 addresses.add(new SimpleAddress(new IpAddress(new Ipv4Address(ipString))));
1866 addresses.add(new SimpleAddress(new MacAddress(macString)));
1867 AfiListBuilder listbuilder = new AfiListBuilder();
1868 listbuilder.setAddressList(addresses);
1870 EidBuilder eb = new EidBuilder();
1871 eb.setAddressType(AfiListLcaf.class);
1872 eb.setVirtualNetworkId(null);
1873 eb.setAddress(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
1874 .lisp.address.address.AfiListBuilder().setAfiList(listbuilder.build()).build());
1876 MapReply reply = registerAddressAndQuery(eb.build());
1878 Eid receivedAddress = reply.getMappingRecordItem().get(0).getMappingRecord().getEid();
1880 assertEquals(AfiListLcaf.class, receivedAddress.getAddressType());
1882 AfiList listAddrFromNetwork = (AfiList) receivedAddress.getAddress();
1883 SimpleAddress receivedAddr1 = (SimpleAddress) listAddrFromNetwork.getAfiList().getAddressList().get(0);
1884 SimpleAddress receivedAddr2 = (SimpleAddress) listAddrFromNetwork.getAfiList().getAddressList().get(1);
1886 assertNotNull(receivedAddr1.getIpAddress().getIpv4Address());
1887 assertNotNull(receivedAddr2.getMacAddress());
1889 assertEquals(macString, receivedAddr2.getMacAddress().getValue());
1890 assertEquals(ipString, receivedAddr1.getIpAddress().getIpv4Address().getValue());
1893 public void registerAndQuery__SegmentLCAF() throws SocketTimeoutException {
1895 String ipString = "10.20.255.30";
1898 EidBuilder eb = new EidBuilder();
1899 eb.setAddressType(Ipv4PrefixAfi.class);
1900 eb.setVirtualNetworkId(new InstanceIdType((long) instanceId));
1901 eb.setAddress(new Ipv4PrefixBuilder().setIpv4Prefix(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns
1902 .yang.ietf.inet.types.rev130715.Ipv4Prefix(ipString)).build());
1904 MapReply reply = registerAddressAndQuery(eb.build());
1906 Eid receivedAddress = reply.getMappingRecordItem().get(0).getMappingRecord().getEid();
1907 assertEquals(Ipv4PrefixAfi.class, receivedAddress.getAddressType());
1909 assertEquals(ipString, ((Ipv4Prefix) receivedAddress.getAddress()).getIpv4Prefix().getValue());
1911 assertEquals(instanceId, receivedAddress.getVirtualNetworkId().getValue().intValue());
1914 public void registerAndQuery__TrafficEngineering() throws SocketTimeoutException {
1916 String macString = "01:02:03:04:05:06";
1917 String ipString = "10.20.255.30";
1918 HopBuilder hopBuilder = new HopBuilder();
1919 hopBuilder.setAddress(new SimpleAddress(new IpAddress(new Ipv4Address(ipString))));
1920 hopBuilder.setLrsBits(new LrsBits(true, false, true));
1921 Hop hop1 = hopBuilder.build();
1922 hopBuilder.setAddress(new SimpleAddress(new MacAddress(macString)));
1923 hopBuilder.setLrsBits(new LrsBits(false, true, false));
1924 Hop hop2 = hopBuilder.build();
1925 ExplicitLocatorPathBuilder elpBuilder = new ExplicitLocatorPathBuilder();
1926 elpBuilder.setHop(new ArrayList<Hop>());
1927 elpBuilder.getHop().add(hop1);
1928 elpBuilder.getHop().add(hop2);
1930 EidBuilder eb = new EidBuilder();
1931 eb.setAddressType(ExplicitLocatorPathLcaf.class);
1932 eb.setVirtualNetworkId(null);
1933 eb.setAddress(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
1934 .lisp.address.address.ExplicitLocatorPathBuilder().setExplicitLocatorPath(elpBuilder.build()).build());
1936 MapReply reply = registerAddressAndQuery(eb.build());
1938 assertEquals(ExplicitLocatorPathLcaf.class, reply.getMappingRecordItem().get(0).getMappingRecord().getEid()
1941 ExplicitLocatorPath receivedAddress = (ExplicitLocatorPath) reply.getMappingRecordItem().get(0)
1942 .getMappingRecord().getEid().getAddress();
1944 Hop receivedHop1 = (Hop) receivedAddress.getExplicitLocatorPath().getHop().get(0);
1945 Hop receivedHop2 = (Hop) receivedAddress.getExplicitLocatorPath().getHop().get(1);
1947 assertEquals(true, receivedHop1.getLrsBits().isLookup());
1948 assertEquals(false, receivedHop1.getLrsBits().isRlocProbe());
1949 assertEquals(true, receivedHop1.getLrsBits().isStrict());
1951 assertEquals(false, receivedHop2.getLrsBits().isLookup());
1952 assertEquals(true, receivedHop2.getLrsBits().isRlocProbe());
1953 assertEquals(false, receivedHop2.getLrsBits().isStrict());
1955 assertNotNull(receivedHop1.getAddress().getIpAddress().getIpv4Address());
1956 assertNotNull(receivedHop2.getAddress().getMacAddress());
1958 assertEquals(ipString, receivedHop1.getAddress().getIpAddress().getIpv4Address().getValue());
1959 assertEquals(macString, receivedHop2.getAddress().getMacAddress().getValue());
1962 public void registerAndQuery__ApplicationData() throws SocketTimeoutException {
1964 String ipString = "1.2.3.4";
1967 int localPortLow = 3;
1968 int localPortHigh = 4;
1969 int remotePortLow = 4;
1970 int remotePortHigh = 5;
1972 ApplicationDataBuilder builder = new ApplicationDataBuilder();
1973 builder.setIpTos(ipTOs);
1974 builder.setProtocol(protocol);
1975 builder.setLocalPortLow(new PortNumber(localPortLow));
1976 builder.setLocalPortHigh(new PortNumber(localPortHigh));
1977 builder.setRemotePortLow(new PortNumber(remotePortLow));
1978 builder.setRemotePortHigh(new PortNumber(remotePortHigh));
1979 builder.setAddress(new SimpleAddress(new IpAddress(new Ipv4Address(ipString))));
1981 EidBuilder eb = new EidBuilder();
1982 eb.setAddressType(ApplicationDataLcaf.class);
1983 eb.setVirtualNetworkId(null);
1984 eb.setAddress(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
1985 .lisp.address.address.ApplicationDataBuilder().setApplicationData(builder.build()).build());
1986 Eid addressToSend = eb.build();
1988 MapReply reply = registerAddressAndQuery(addressToSend);
1990 Eid receivedAddress = reply.getMappingRecordItem().get(0).getMappingRecord().getEid();
1992 assertEquals(ApplicationDataLcaf.class, receivedAddress.getAddressType());
1994 ApplicationData receivedApplicationDataAddress = (ApplicationData) receivedAddress.getAddress();
1995 assertEquals(protocol, receivedApplicationDataAddress.getApplicationData().getProtocol().intValue());
1996 assertEquals(ipTOs, receivedApplicationDataAddress.getApplicationData().getIpTos().intValue());
1997 assertEquals(localPortLow, receivedApplicationDataAddress.getApplicationData().getLocalPortLow().getValue()
1999 assertEquals(localPortHigh, receivedApplicationDataAddress.getApplicationData().getLocalPortHigh().getValue()
2001 assertEquals(remotePortLow, receivedApplicationDataAddress.getApplicationData().getRemotePortLow().getValue()
2003 assertEquals(remotePortHigh, receivedApplicationDataAddress.getApplicationData().getRemotePortHigh().getValue()
2006 SimpleAddress ipAddressReceived = receivedApplicationDataAddress.getApplicationData().getAddress();
2007 assertEquals(ipString, ipAddressReceived.getIpAddress().getIpv4Address().getValue());
2010 // ------------------- TimeOut Tests -----------
2012 public void mapRequestMapRegisterAndMapRequestTestTimeout() throws SocketTimeoutException {
2014 Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32");
2015 mapService.addAuthenticationKey(eid, NULL_AUTH_KEY);
2017 MapRequestBuilder mapRequestBuilder = new MapRequestBuilder();
2018 mapRequestBuilder.setNonce((long) 4);
2019 mapRequestBuilder.setSourceEid(new SourceEidBuilder().setEid(LispAddressUtil.getNoAddressEid()).build());
2020 mapRequestBuilder.setEidItem(new ArrayList<EidItem>());
2021 mapRequestBuilder.getEidItem().add(new EidItemBuilder().setEid(eid).build());
2022 mapRequestBuilder.setItrRloc(new ArrayList<ItrRloc>());
2023 mapRequestBuilder.getItrRloc().add(
2024 new ItrRlocBuilder().setRloc(LispAddressUtil.asIpv4Rloc(ourAddress)).build());
2026 sendMapRequest(mapRequestBuilder.build());
2027 MapReply mapReply = receiveMapReply();
2028 assertEquals(4, mapReply.getNonce().longValue());
2029 assertEquals(0, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().size());
2031 MapRegisterBuilder mapRegisterbuilder = new MapRegisterBuilder();
2032 mapRegisterbuilder.setWantMapNotify(true);
2033 mapRegisterbuilder.setNonce((long) 8);
2035 MappingRecordBuilder etlrBuilder = new MappingRecordBuilder();
2036 etlrBuilder.setEid(eid);
2037 etlrBuilder.setRecordTtl(254);
2039 LocatorRecordBuilder recordBuilder = new LocatorRecordBuilder();
2040 recordBuilder.setRloc(LispAddressUtil.asIpv4Rloc("4.3.2.1"));
2041 etlrBuilder.setLocatorRecord(new ArrayList<LocatorRecord>());
2042 etlrBuilder.getLocatorRecord().add(recordBuilder.build());
2043 mapRegisterbuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
2044 mapRegisterbuilder.getMappingRecordItem().add(
2045 new MappingRecordItemBuilder().setMappingRecord(etlrBuilder.build()).build());
2047 sendMapRegister(mapRegisterbuilder.build());
2048 MapNotify mapNotify = receiveMapNotify();
2049 assertEquals(8, mapNotify.getNonce().longValue());
2052 sendMapRequest(mapRequestBuilder.build());
2053 mapReply = receiveMapReply();
2054 assertEquals(4, mapReply.getNonce().longValue());
2055 assertEquals(recordBuilder.getRloc(), mapReply.getMappingRecordItem().get(0).getMappingRecord()
2056 .getLocatorRecord().get(0).getRloc());
2058 causeEntryToBeCleaned();
2059 sendMapRequest(mapRequestBuilder.build());
2060 mapReply = receiveMapReply();
2061 assertEquals(0, mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().size());
2064 public void mapRequestMapRegisterAndMapRequestTestNativelyForwardTimeoutResponse() throws Exception {
2066 Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32");
2067 MapRequest mapRequest = createMapRequest(eid);
2069 testTTLBeforeRegister(mapRequest);
2071 registerForTTL(eid);
2073 testTTLAfterRegister(mapRequest);
2075 causeEntryToBeCleaned();
2076 testTTLAfterClean(mapRequest);
2078 //northboundAddKey();
2079 //testTTLAfterAutherize(mapRequest);
2083 private void testTTLAfterClean(MapRequest mapRequest) throws SocketTimeoutException {
2085 sendMapRequest(mapRequest);
2086 mapReply = receiveMapReply();
2087 assertCorrectMapReplyTTLAndAction(mapReply, 15, Action.NativelyForward);
2090 private void causeEntryToBeCleaned() {
2091 // TODO XXX for the time being, to keep master and stable/lithium in sync, we need to remove the forceful
2092 // expiration of DAO entries. Once we're past this, we'll have to expose methods to setTimeUnit(TimeUnit)
2093 // and cleanOld() (expired) entries in IFlowMapping (and perhaps ILispDAO) and use them here.
2094 mapService.cleanCachedMappings();
2097 private void testTTLAfterRegister(MapRequest mapRequest) throws SocketTimeoutException {
2099 sendMapRequest(mapRequest);
2100 mapReply = receiveMapReply();
2101 assertEquals(LispAddressUtil.asIpv4Rloc("4.3.2.1"), mapReply.getMappingRecordItem().get(0).getMappingRecord()
2102 .getLocatorRecord().get(0).getRloc());
2103 assertCorrectMapReplyTTLAndAction(mapReply, 254, Action.NoAction);
2106 private void registerForTTL(Eid eid) throws SocketTimeoutException {
2107 MapRegister mapRegister = createMapRegister(eid);
2108 sendMapRegister(mapRegister);
2109 assertMapNotifyReceived();
2112 private void testTTLBeforeRegister(MapRequest mapRequest) throws SocketTimeoutException {
2114 sendMapRequest(mapRequest);
2115 mapReply = receiveMapReply();
2116 assertCorrectMapReplyTTLAndAction(mapReply, 15, Action.NativelyForward);
2119 private void testTTLAfterAutherize(MapRequest mapRequest) throws SocketTimeoutException {
2121 sendMapRequest(mapRequest);
2122 mapReply = receiveMapReply();
2123 assertCorrectMapReplyTTLAndAction(mapReply, 1, Action.NativelyForward);
2126 private void assertCorrectMapReplyTTLAndAction(MapReply mapReply, int expectedTTL, Action expectedAction) {
2127 assertEquals(expectedTTL, mapReply.getMappingRecordItem().get(0).getMappingRecord().getRecordTtl().intValue());
2128 assertEquals(expectedAction, mapReply.getMappingRecordItem().get(0).getMappingRecord().getAction());
2131 private MapRegister createMapRegister(Eid eid, Rloc rloc) {
2132 MapRegisterBuilder mapRegisterbuilder = new MapRegisterBuilder();
2133 mapRegisterbuilder.setWantMapNotify(true);
2134 mapRegisterbuilder.setNonce((long) 8);
2135 mapRegisterbuilder.setKeyId((short) 0);
2136 MappingRecordBuilder etlrBuilder = new MappingRecordBuilder();
2137 etlrBuilder.setEid(eid);
2138 etlrBuilder.setRecordTtl(254);
2139 etlrBuilder.setAuthoritative(false);
2140 etlrBuilder.setAction(Action.NoAction);
2141 LocatorRecordBuilder recordBuilder = new LocatorRecordBuilder();
2142 recordBuilder.setRloc(rloc);
2143 etlrBuilder.setLocatorRecord(new ArrayList<LocatorRecord>());
2144 etlrBuilder.getLocatorRecord().add(recordBuilder.build());
2145 mapRegisterbuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
2146 mapRegisterbuilder.getMappingRecordItem().add(
2147 new MappingRecordItemBuilder().setMappingRecord(etlrBuilder.build()).build());
2148 MapRegister mapRegister = mapRegisterbuilder.build();
2152 private MapRegister createMapRegister(Eid eid) {
2153 return createMapRegister(eid, LispAddressUtil.asIpv4Rloc("4.3.2.1"));
2156 private MapRequest createMapRequest(Eid eid) {
2157 MapRequestBuilder mapRequestBuilder = new MapRequestBuilder();
2158 mapRequestBuilder.setNonce((long) 4);
2159 mapRequestBuilder.setPitr(false);
2160 mapRequestBuilder.setSourceEid(new SourceEidBuilder().setEid(LispAddressUtil.getNoAddressEid()).build());
2161 mapRequestBuilder.setEidItem(new ArrayList<EidItem>());
2162 mapRequestBuilder.getEidItem().add(new EidItemBuilder().setEid(eid).build());
2163 mapRequestBuilder.setItrRloc(new ArrayList<ItrRloc>());
2164 mapRequestBuilder.getItrRloc().add(
2165 new ItrRlocBuilder().setRloc(LispAddressUtil.asIpv4Rloc(ourAddress)).build());
2166 MapRequest mr = mapRequestBuilder.build();
2170 public void testSimpleNonProxy() throws SocketTimeoutException, SocketException {
2172 String rloc = "127.0.0.3";
2173 int port = LispMessage.PORT_NUM;
2174 Rloc ipRloc = LispAddressUtil.asIpv4Rloc(rloc);
2175 sendProxyMapRequest(rloc, port, ipRloc);
2179 public void testNonProxyOtherPort() throws SocketTimeoutException, SocketException {
2181 String rloc = "127.0.0.3";
2184 RlocBuilder rb = new RlocBuilder();
2185 rb.setAddressType(ApplicationDataLcaf.class);
2186 rb.setVirtualNetworkId(null);
2187 rb.setAddress(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
2188 .lisp.address.address.ApplicationDataBuilder()
2189 .setApplicationData(new ApplicationDataBuilder().setAddress(new SimpleAddress(new IpAddress(
2190 new Ipv4Address(rloc)))).setLocalPortLow(new PortNumber(port)).build()).build());
2191 Rloc adLcaf = rb.build();
2193 LOG.info("testNonProxyOtherPort:" + LispAddressStringifier.getString(adLcaf));
2194 sendProxyMapRequest(rloc, port, adLcaf);
2198 private class XtrRequestMappingListener implements OdlLispProtoListener {
2201 public void onGotMapReply(GotMapReply notification) {
2205 public void onAddMapping(AddMapping notification) {
2209 public void onXtrReplyMapping(XtrReplyMapping notification) {
2213 public void onRequestMapping(RequestMapping notification) {
2217 public void onGotMapNotify(GotMapNotify notification) {
2221 public void onXtrRequestMapping(XtrRequestMapping notification) {
2225 public void onMappingKeepAlive(MappingKeepAlive notification) {
2230 public void testRecievingNonProxyOnXtrPort() throws SocketTimeoutException, SocketException, Throwable {
2232 configLispPlugin.shouldListenOnXtrPort(true);
2233 notificationCalled = false;
2234 final String eid = "10.10.10.10/32";
2235 String rloc = "127.0.0.3";
2236 int port = LispMessage.XTR_PORT_NUM;
2238 RlocBuilder rb = new RlocBuilder();
2239 rb.setAddressType(ApplicationDataLcaf.class);
2240 rb.setVirtualNetworkId(null);
2241 rb.setAddress(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
2242 .lisp.address.address.ApplicationDataBuilder()
2243 .setApplicationData(new ApplicationDataBuilder().setAddress(new SimpleAddress(new IpAddress(
2244 new Ipv4Address(rloc)))).setLocalPortLow(new PortNumber(port)).build()).build());
2245 Rloc adLcaf = rb.build();
2247 final MapRequest mapRequest = createNonProxyMapRequest(eid, adLcaf);
2248 ((LispMappingService) lms).getNotificationService().registerNotificationListener(
2249 new XtrRequestMappingListener() {
2252 public void onXtrRequestMapping(XtrRequestMapping notification) {
2253 assertEquals(((Ipv4Prefix) mapRequest.getEidItem().get(0).getEid().getAddress())
2254 .getIpv4Prefix().getValue(), eid);
2255 notificationCalled = true;
2256 LOG.warn("notification arrived");
2259 sendMapRequest(mapRequest, port);
2260 for (int i = 0; i < MAX_NOTIFICATION_RETRYS; i++) {
2261 if (notificationCalled) {
2264 LOG.warn("notification hasn't arrived, sleeping...");
2269 fail("Notification hasn't arrived");
2273 private void sendProxyMapRequest(String rloc, int port, Rloc adLcaf) throws SocketTimeoutException,
2275 String eid = "10.1.0.1/32";
2276 MapRequest mapRequest = createNonProxyMapRequest(eid, adLcaf);
2277 sendMapRequest(mapRequest);
2278 DatagramSocket nonProxySocket = new DatagramSocket(new InetSocketAddress(rloc, port));
2279 MapRequest receivedMapRequest = receiveMapRequest(nonProxySocket);
2280 assertEquals(mapRequest.getNonce(), receivedMapRequest.getNonce());
2281 assertEquals(mapRequest.getSourceEid(), receivedMapRequest.getSourceEid());
2282 assertEquals(mapRequest.getItrRloc(), receivedMapRequest.getItrRloc());
2283 assertEquals(mapRequest.getEidItem(), receivedMapRequest.getEidItem());
2284 nonProxySocket.close();
2287 private MapRequest createNonProxyMapRequest(String eid, Rloc adLcaf) throws SocketTimeoutException {
2288 MapRegister mr = createMapRegister(LispAddressUtil.asIpv4PrefixBinaryEid(eid));
2289 LocatorRecord record = new LocatorRecordBuilder(mr.getMappingRecordItem().get(0).getMappingRecord()
2290 .getLocatorRecord().get(0)).setRloc(adLcaf).build();
2291 mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().set(0, record);
2292 sendMapRegister(mr);
2293 assertMapNotifyReceived();
2294 MapRequest mapRequest = createMapRequest(LispAddressUtil.asIpv4PrefixBinaryEid(eid));
2295 MapRequestBuilder builder = new MapRequestBuilder(mapRequest);
2296 builder.setPitr(true);
2297 mapRequest = builder.build();
2301 private void assertMapNotifyReceived() throws SocketTimeoutException {
2305 private MapReply receiveMapReply() throws SocketTimeoutException {
2306 return MapReplySerializer.getInstance().deserialize(ByteBuffer.wrap(receivePacket().getData()));
2309 private MapRequest receiveMapRequest(DatagramSocket datagramSocket) throws SocketTimeoutException {
2310 return MapRequestSerializer.getInstance().deserialize(ByteBuffer.wrap(receivePacket(
2311 datagramSocket, 30000).getData()), null);
2314 private MapNotify receiveMapNotify() throws SocketTimeoutException {
2315 return MapNotifySerializer.getInstance().deserialize(ByteBuffer.wrap(receivePacket().getData()));
2318 private void sendMapRequest(MapRequest mapRequest) {
2319 sendMapRequest(mapRequest, LispMessage.PORT_NUM);
2322 private void sendMapRequest(MapRequest mapRequest, int port) {
2323 sendPacket(MapRequestSerializer.getInstance().serialize(mapRequest).array(), port);
2326 private void sendMapRegister(MapRegister mapRegister) {
2327 sendPacket(MapRegisterSerializer.getInstance().serialize(mapRegister).array());
2330 private void sendPacket(byte[] bytesToSend) {
2331 sendPacket(bytesToSend, LispMessage.PORT_NUM);
2334 private void sendPacket(byte[] bytesToSend, int port) {
2336 DatagramPacket packet = new DatagramPacket(bytesToSend, bytesToSend.length);
2337 initPacketAddress(packet, port);
2338 LOG.trace("Sending packet to LispPlugin on socket, port {}", port);
2339 socket.send(packet);
2340 } catch (Throwable t) {
2345 private DatagramPacket receivePacket() throws SocketTimeoutException {
2346 return receivePacket(6000);
2349 private DatagramPacket receivePacket(int timeout) throws SocketTimeoutException {
2350 return receivePacket(socket, timeout);
2353 private DatagramPacket receivePacket(DatagramSocket receivedSocket, int timeout) throws SocketTimeoutException {
2355 byte[] buffer = new byte[4096];
2356 DatagramPacket receivePacket = new DatagramPacket(buffer, buffer.length);
2357 LOG.trace("Waiting for packet from socket...");
2358 receivedSocket.setSoTimeout(timeout);
2359 receivedSocket.receive(receivePacket);
2360 LOG.trace("Received packet from socket!");
2361 return receivePacket;
2362 } catch (SocketTimeoutException ste) {
2364 } catch (Throwable t) {
2370 private void sleepForSeconds(int seconds) {
2372 Thread.sleep(seconds*1000);
2373 } catch (InterruptedException e) {
2374 LOG.warn("Interrupted while sleeping", e);
2378 private void sleepForMilliseconds(long milliseconds) {
2380 Thread.sleep(milliseconds);
2381 } catch (InterruptedException e) {
2382 LOG.warn("Interrupted while sleeping", e);
2386 private void initPacketAddress(DatagramPacket packet, int port) throws UnknownHostException {
2387 packet.setAddress(InetAddress.getByName(lispBindAddress));
2388 packet.setPort(port);
2391 private DatagramSocket initSocket(DatagramSocket socket, int port) {
2392 for (int i=0; i < NUM_OF_ATTEMPTS_TO_CREATE_SOCKET; i++) {
2394 return new DatagramSocket(new InetSocketAddress(ourAddress, port));
2395 } catch (SocketException e) {
2396 LOG.error("Can't initialize socket for {}", ourAddress, e);
2403 private byte[] extractWSUdpByteArray(String wiresharkHex) {
2404 final int HEADER_LEN = 42;
2405 byte[] res = new byte[1000];
2406 String[] split = wiresharkHex.split(" ");
2408 for (String cur : split) {
2410 if (cur.length() == 2) {
2412 if (counter > HEADER_LEN) {
2413 res[counter - HEADER_LEN - 1] = (byte) Integer.parseInt(cur, 16);
2418 return Arrays.copyOf(res, counter - HEADER_LEN);
2421 private String stateToString(int state) {
2425 case Bundle.INSTALLED:
2427 case Bundle.RESOLVED:
2429 case Bundle.UNINSTALLED:
2430 return "UNINSTALLED";
2432 return "Not CONVERTED";
2436 private void areWeReady() throws InvalidSyntaxException {
2440 boolean debugit = false;
2441 Bundle b[] = bc.getBundles();
2442 for (Bundle element : b) {
2443 int state = element.getState();
2444 LOG.trace("Bundle[" + element.getBundleId() + "]:" + element.getSymbolicName() + ",v"
2445 + element.getVersion() + ", state:" + stateToString(state));
2446 if (state != Bundle.ACTIVE && state != Bundle.RESOLVED) {
2447 LOG.debug("Bundle:" + element.getSymbolicName() + " state:" + stateToString(state));
2450 // String host = element.getHeaders().get("FRAGMENT-HOST");
2451 // if (host != null) {
2452 // LOG.warn("Bundle " + element.getSymbolicName() +
2453 // " is a fragment which is part of: " + host);
2454 // LOG.warn("Required imports are: " +
2455 // element.getHeaders().get("IMPORT-PACKAGE"));
2459 // } catch (BundleException e) {
2460 // LOG.error("BundleException:", e);
2469 LOG.warn(("Do some debugging because some bundle is unresolved"));
2471 // assertNotNull(broker);
2473 configLispPlugin.setLispAddress(lispBindAddress);
2475 // Uncomment this code to Know which services were actually loaded to
2479 for (ServiceReference sr : bc.getAllServiceReferences(null, null)) {
2480 LOG.info(sr.getBundle().getSymbolicName());
2481 LOG.info(sr.toString());
2488 private void cleanUP() {
2490 mapService.cleanCachedMappings();
2491 configLispPlugin.shouldListenOnXtrPort(false);
2492 socket = initSocket(socket, LispMessage.PORT_NUM);
2496 private void restartSocket() {
2498 socket = initSocket(socket, LispMessage.PORT_NUM);