/*
- * Copyright (c) 2014 Contextream, Inc. and others. All rights reserved.
+ * Copyright (c) 2014, 2017 Contextream, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
import org.opendaylight.lispflowmapping.config.ConfigIni;
import org.opendaylight.lispflowmapping.implementation.LispMappingService;
import org.opendaylight.lispflowmapping.interfaces.dao.SubKeys;
-import org.opendaylight.lispflowmapping.interfaces.dao.SubscriberRLOC;
+import org.opendaylight.lispflowmapping.interfaces.dao.Subscriber;
import org.opendaylight.lispflowmapping.interfaces.lisp.IFlowMapping;
import org.opendaylight.lispflowmapping.interfaces.mappingservice.IMappingService;
import org.opendaylight.lispflowmapping.lisp.serializer.MapNotifySerializer;
import org.opendaylight.lispflowmapping.lisp.serializer.MapReplySerializer;
import org.opendaylight.lispflowmapping.lisp.serializer.MapRequestSerializer;
import org.opendaylight.lispflowmapping.lisp.type.LispMessage;
+import org.opendaylight.lispflowmapping.lisp.type.MappingData;
+import org.opendaylight.lispflowmapping.lisp.util.ByteUtil;
import org.opendaylight.lispflowmapping.lisp.util.LispAddressStringifier;
import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil;
import org.opendaylight.lispflowmapping.type.sbplugin.IConfigLispSouthboundPlugin;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MapReply;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MapRequest;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MappingKeepAlive;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MessageType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.OdlLispProtoListener;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.RequestMapping;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.SiteId;
public static final String ODL = "org.opendaylight.controller";
public static final String YANG = "org.opendaylight.yangtools";
+ private static final int MULTI_SITE_SLEEP_TIME = 1;
private static final int MAX_NOTIFICATION_RETRYS = 20;
private static final MappingAuthkey NULL_AUTH_KEY = new MappingAuthkeyBuilder().setKeyType(0).build();
public String getKarafDistro() {
return maven()
.groupId("org.opendaylight.lispflowmapping")
- .artifactId("distribution-karaf")
+ .artifactId("lispflowmapping-karaf")
.versionAsInProject()
.type("zip")
.getURL();
public MavenUrlReference getFeatureRepo() {
return maven()
.groupId("org.opendaylight.lispflowmapping")
- .artifactId("features-lispflowmapping")
+ .artifactId("features4-lispflowmapping")
.classifier("features")
.type("xml")
.versionAsInProject();
public void before() throws Exception {
areWeReady();
mapService.setLookupPolicy(IMappingService.LookupPolicy.NB_FIRST);
- mapService.setMappingOverwrite(true);
+ mapService.setMappingMerge(false);
+ ConfigIni.getInstance().setSmrRetryCount(1);
locatorEid = LispAddressUtil.asIpv4Rloc("4.3.2.1");
socket = initSocket(socket, LispMessage.PORT_NUM);
}
@Test
- public void testNegativePrefix() throws UnknownHostException {
+ public void testNegativePrefix_gapIntersection() throws UnknownHostException {
insertMappings();
testGapIntersection();
+
+ insertMappings();
testMultipleMappings();
}
private void testRepeatedSmr() throws SocketTimeoutException, UnknownHostException {
cleanUP();
long timeout = ConfigIni.getInstance().getSmrTimeout();
+ ConfigIni.getInstance().setSmrRetryCount(5);
final InstanceIdType iid = new InstanceIdType(1L);
final Eid eid1 = LispAddressUtil.asIpv4Eid("1.1.1.1", 1L);
/* add subscribers */
final String subscriberSrcRloc1 = "127.0.0.3";
final String subscriberSrcRloc2 = "127.0.0.4";
- final Set<SubscriberRLOC> subscriberSet1 = Sets.newHashSet(newSubscriber(eid1, subscriberSrcRloc1),
+ final Set<Subscriber> subscriberSet1 = Sets.newHashSet(newSubscriber(eid1, subscriberSrcRloc1),
newSubscriber(eid1, subscriberSrcRloc2));
mapService.addData(MappingOrigin.Southbound, eid1, SubKeys.SUBSCRIBERS, subscriberSet1);
/* add mapping */
final MappingRecord mapping1 = new MappingRecordBuilder()
.setEid(eid1).setTimestamp(System.currentTimeMillis()).setRecordTtl(1440).build();
- mapService.addMapping(MappingOrigin.Northbound, eid1, null, mapping1, false);
+ mapService.addMapping(MappingOrigin.Northbound, eid1, null, new MappingData(mapping1));
- sleepForMilliseconds((timeout * expectedSmrs1) - 1500);
+ sleepForMilliseconds((timeout * expectedSmrs1) - (timeout / 2));
final List<MapRequest> requests1 = processSmrPackets(reader1, subscriberSrcRloc1, expectedSmrs1);
final MapReply mapReply1 = lms.handleMapRequest(
new MapRequestBuilder(requests1.get(0))
return true;
}
- private static SubscriberRLOC newSubscriber(Eid srcEid, String srcRlocIp) {
+ private static Subscriber newSubscriber(Eid srcEid, String srcRlocIp) {
final byte[] addressBinary = InetAddresses.forString(srcRlocIp).getAddress();
final int timeout = 5;
final Rloc srcRloc = new RlocBuilder().setAddress(new Ipv4BinaryBuilder()
.setIpv4Binary(new Ipv4AddressBinary(addressBinary)).build()).build();
- return new SubscriberRLOC(srcRloc, srcEid, timeout);
+ return new Subscriber(srcRloc, srcEid, timeout);
}
private void testMultipleMappings() throws UnknownHostException {
.setIpv4AddressBinary(new Ipv4AddressBinary(InetAddress.getByName(resultPrefix1).getAddress()))
.setIpv4MaskLength((short) 18).build();
- final String resultPrefix2 = "1.1.192.0";
+ final String resultPrefix2 = "1.1.128.0";
final Address resultMapping2 = new Ipv4PrefixBinaryBuilder()
.setIpv4AddressBinary(new Ipv4AddressBinary(InetAddress.getByName(resultPrefix2).getAddress()))
- .setIpv4MaskLength((short) 18).build();
+ .setIpv4MaskLength((short) 17).build();
final String resultPrefix3 = "1.3.0.0";
final Address resultNegMapping3 = new Ipv4PrefixBinaryBuilder()
final Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("0.0.0.0/0", iid);
mapService.addAuthenticationKey(eid, NULL_AUTH_KEY);
- mapService.addMapping(MappingOrigin.Northbound, mapRecordNbLeft.getEid(), null, mapRecordNbLeft, false);
- mapService.addMapping(MappingOrigin.Northbound, mapRecordNbRight.getEid(), null, mapRecordNbRight, false);
- mapService.addMapping(MappingOrigin.Southbound, mapRecordSbLeft.getEid(), null, mapRecordSbLeft, false);
- mapService.addMapping(MappingOrigin.Southbound, mapRecordSbRight.getEid(), null, mapRecordSbRight, false);
+ mapService.addMapping(MappingOrigin.Northbound, mapRecordNbLeft.getEid(), null,
+ new MappingData(mapRecordNbLeft));
+ mapService.addMapping(MappingOrigin.Northbound, mapRecordNbRight.getEid(), null,
+ new MappingData(mapRecordNbRight));
+ mapService.addMapping(MappingOrigin.Southbound, mapRecordSbLeft.getEid(), null,
+ new MappingData(mapRecordSbLeft, System.currentTimeMillis()));
+ mapService.addMapping(MappingOrigin.Southbound, mapRecordSbRight.getEid(), null,
+ new MappingData(mapRecordSbRight, System.currentTimeMillis()));
restartSocket();
sleepForSeconds(2);
return new MappingRecordBuilder()
.setEid(prefixBinary)
.setLocatorRecord(Lists.newArrayList(new LocatorRecordBuilder()
- .setRloc(LispAddressUtil.asIpv4Rloc("2.2.2.2")).setLocatorId("loc_id").build()))
- .setTimestamp(System.currentTimeMillis()).setRecordTtl(1440).build();
+ .setRloc(LispAddressUtil.asIpv4Rloc("2.2.2.2"))
+ .setLocatorId("loc_id")
+ .setPriority((short) 1).build()))
+ .setTimestamp(System.currentTimeMillis())
+ .setRecordTtl(1440).build();
}
/**
multiSiteScenario.storeSouthboundMappings(false, SITE_A, SITE_B, SITE_C, SITE_D4, SITE_D5);
multiSiteScenario.storeNorthMappingSrcDst(SITE_B, SITE_C);
multiSiteScenario.storeNorthMappingNegative(SITE_C, Action.Drop);
- sleepForSeconds(2);
+ sleepForSeconds(MULTI_SITE_SLEEP_TIME);
multiSiteScenario.assertPingWorks(SITE_A, 5, SITE_B, 4);
multiSiteScenario.assertPingWorks(SITE_B, 5, SITE_C, 4);
multiSiteScenario.assertPingFails(SITE_A, 1, SITE_C, 4);
// 1) 192.0.2.5/32
// 2) 192.0.1.1/32
multiSiteScenario.storeNorthMappingSrcDst(SITE_A, SITE_C);
- sleepForSeconds(2);
+ sleepForSeconds(MULTI_SITE_SLEEP_TIME);
multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B.getHost(5), SITE_A.getHost(1));
multiSiteScenario.assertPingWorks(SITE_A, 5, SITE_C, 4);
multiSiteScenario.assertPingWorks(SITE_B, 5, SITE_C, 4);
// 3) 192.0.1.5/32
// 4) 192.0.4.5/32
multiSiteScenario.deleteNorthMappingNegative(SITE_C);
- sleepForSeconds(2);
+ sleepForSeconds(MULTI_SITE_SLEEP_TIME);
multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B.getHost(5), SITE_A.getHost(1), SITE_A
.getHost(5),
SITE_D4.getHost(5));
// following action should trigger generatting of SMR messages:
// 1) 192.0.4.5/32
multiSiteScenario.storeNorthMappingSrcDst(SITE_B, SITE_C_RLOC_10);
- sleepForSeconds(2);
+ sleepForSeconds(MULTI_SITE_SLEEP_TIME);
multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_D4.getHost(5));
//way of testing ping - get RLOC for mapping src-dst and compare it with awaited value doesn't test
//that ping won't be successfull
// 1) 192.0.4.5/32
// 2) 192.0.2.5/32
multiSiteScenario.storeNorthMappingNegative(SITE_C, Action.Drop);
- sleepForSeconds(2);
+ sleepForSeconds(MULTI_SITE_SLEEP_TIME);
multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_D4.getHost(5), SITE_B.getHost(5));
multiSiteScenario.assertPingFails(SITE_D4, 5, SITE_C, 4);
//TEST CASE 7
multiSiteScenario.deleteNorthMapingSrcDst(SITE_A, SITE_C);
- sleepForSeconds(2);
+ sleepForSeconds(MULTI_SITE_SLEEP_TIME);
// following action should trigger generatting of SMR messages:
// 1) 192.0.4.5/32
// 2) 192.0.2.5/32
// 2) 192.0.2.5/32
// 3) 192.0.5.5/32
multiSiteScenario.storeNorthMappingSrcDst(SITE_B, SITE_C);
- sleepForSeconds(2);
+ sleepForSeconds(MULTI_SITE_SLEEP_TIME);
multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_D5.getHost(5), SITE_D4.getHost(5),
SITE_B.getHost(5));
// 3) 192.0.5.5/32
// 4) 192.0.1.1/32
multiSiteScenario.deleteNorthMapingSrcDst(SITE_B, SITE_C);
- sleepForSeconds(2);
+ sleepForSeconds(MULTI_SITE_SLEEP_TIME);
multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_D5.getHost(5), SITE_D4.getHost(5),
SITE_B.getHost(5),
SITE_A.getHost(1));
// 3) 192.0.5.5/32
// 4) 192.0.1.1/32
multiSiteScenario.deleteNorthMappingNegative(SITE_C);
- sleepForSeconds(2);
+ sleepForSeconds(MULTI_SITE_SLEEP_TIME);
multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_D5.getHost(5), SITE_D4.getHost(5),
SITE_B.getHost(5),
SITE_A.getHost(1));
final SocketReader socketReader = SocketReader.startReadingInStandaloneThread(socket);
mapService.setLookupPolicy(IMappingService.LookupPolicy.NB_AND_SB);
- mapService.setMappingOverwrite(false);
+ mapService.setMappingMerge(true);
//TEST CASE 1
multiSiteScenario.storeSouthboundMappings(true, SITE_A_SB, SITE_B_SB, SITE_C_WP_100_1_SB, SITE_D_WP_100_1_SB,
multiSiteScenario.storeNorthMappingIpPrefix(SITE_A_SB);
multiSiteScenario.storeNorthMappingIpPrefix(SITE_B_SB);
multiSiteScenario.storeNorthMappingIpPrefix(SITE_C_WP_50_2_SB, SITE_D_WP_50_2_SB);
- sleepForSeconds(2);
+ sleepForSeconds(MULTI_SITE_SLEEP_TIME);
multiSiteScenario.assertPingWorks(SITE_A_SB, 5, SITE_C_WP_50_2_SB, 4, SITE_D_WP_50_2_SB);
multiSiteScenario.assertPingWorks(SITE_B_SB, 5, SITE_C_WP_50_2_SB, 4, SITE_D_WP_50_2_SB);
// 1) 192.0.2.5/32
// 2) 192.0.1.5/32
multiSiteScenario.storeNorthMappingSrcDst(SITE_A_SB, SITE_C_WP_50_2_SB, SITE_D_WP_50_2_SB);
- sleepForSeconds(2);
+ sleepForSeconds(MULTI_SITE_SLEEP_TIME);
multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B_SB.getHost(5), SITE_A_SB.getHost(5));
// following action should trigger generatting of SMR messages:
// 1) 192.0.2.5/32
// 2) 192.0.1.5/32
multiSiteScenario.storeNorthMappingNegative(SITE_C_SB, Action.Drop);
- sleepForSeconds(2);
+ sleepForSeconds(MULTI_SITE_SLEEP_TIME);
multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B_SB.getHost(5), SITE_A_SB.getHost(5));
multiSiteScenario.assertPingWorks(SITE_A_SB, 5, SITE_C_WP_50_2_SB, 4, SITE_D_WP_50_2_SB);
// 1) 192.0.2.5/32
// 2) 192.0.1.5/32
multiSiteScenario.storeNorthMappingSrcDst(SITE_A_SB, SITE_C_WP_50_2_SB);
- sleepForSeconds(2);
+ sleepForSeconds(MULTI_SITE_SLEEP_TIME);
multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B_SB.getHost(5), SITE_A_SB.getHost(5));
multiSiteScenario.assertPingWorks(SITE_A_SB, 5, SITE_C_WP_50_2_SB, 4);
//TEST CASE 4
multiSiteScenario.storeNorthMappingSrcDst(SITE_B_SB, SITE_C_WP_50_2_SB, SITE_D_WP_50_2_SB);
- sleepForSeconds(2);
+ sleepForSeconds(MULTI_SITE_SLEEP_TIME);
// following action should trigger generatting of SMR messages:
// 1) 192.0.2.5/32
// 2) 192.0.1.5/32
//TEST CASE 5
multiSiteScenario.deleteSouthboundMappings(SITE_D_DELETE_SB);
- sleepForSeconds(2);
+ sleepForSeconds(MULTI_SITE_SLEEP_TIME);
// following action should trigger generatting of SMR messages:
// 1) 192.0.2.5/32
// 2) 192.0.1.5/32
//TEST CASE 6
multiSiteScenario.deleteNorthMapingSrcDst(SITE_A_SB, SITE_C_WP_50_2_SB);
- sleepForSeconds(2);
+ sleepForSeconds(MULTI_SITE_SLEEP_TIME);
// following action should trigger generatting of SMR messages:
// 1) 192.0.2.5/32
// 2) 192.0.1.5/32
multiSiteScenario.checkSMR(socketReader, SITE_C.getEidPrefix(), SITE_B_SB.getHost(5), SITE_A_SB.getHost(5));
multiSiteScenario.deleteNorthMapingSrcDst(SITE_B_SB, SITE_C_WP_50_2_SB);
- sleepForSeconds(2);
+ sleepForSeconds(MULTI_SITE_SLEEP_TIME);
multiSiteScenario.assertPingFails(SITE_B_SB, 5, SITE_C_WP_50_2_SB, 4);
socketReader.stopReading();
public void testMapRegisterOverwritesNoSubkey() throws SocketTimeoutException {
cleanUP();
- mapService.setMappingOverwrite(true);
+ mapService.setMappingMerge(false);
Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32");
Rloc rloc1Value = LispAddressUtil.asIpv4Rloc("4.3.2.1");
Rloc rloc2Value = LispAddressUtil.asIpv4Rloc("4.3.2.2");
public void testMapRegisterDoesntOverwritesNoSubkey() throws SocketTimeoutException {
cleanUP();
- mapService.setMappingOverwrite(false);
+ mapService.setMappingMerge(true);
Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32");
Rloc rloc1Value = LispAddressUtil.asIpv4Rloc("4.3.2.1");
Rloc rloc2Value = LispAddressUtil.asIpv4Rloc("4.3.2.2");
public void mapRequestMapRegisterAndMapRequestTestTimeout() throws SocketTimeoutException {
cleanUP();
+ ConfigIni.getInstance().setSmrRetryCount(0);
Eid eid = LispAddressUtil.asIpv4PrefixBinaryEid("1.2.3.4/32");
mapService.addAuthenticationKey(eid, NULL_AUTH_KEY);
sleepForSeconds(1);
private void timedOutMappingRecord() {
cleanUP();
- mapService.setMappingOverwrite(false);
+ mapService.setMappingMerge(true);
// mapping expires after 1 second
ConfigIni.getInstance().setRegistrationValiditySb(1000L);
.setRloc(LispAddressUtil.asIpv4Rloc("1.1.1.1")).setLocatorId("locator-id").build();
final MappingRecord mappingRecord = new MappingRecordBuilder()
.setEid(eid)
- .setTimestamp(System.currentTimeMillis())
.setSiteId(siteId)
.setRecordTtl(1000)
.setXtrId(xtrId)
mappingRecord.getLocatorRecord().add(locatorRecord);
mapService.addAuthenticationKey(eid, NULL_AUTH_KEY);
- mapService.addMapping(MappingOrigin.Southbound, eid, siteId, mappingRecord, true);
+ mapService.addMapping(MappingOrigin.Southbound, eid, siteId,
+ new MappingData(mappingRecord, System.currentTimeMillis()));
sleepForSeconds(2);
MappingRecord resultRecord = (MappingRecord) mapService.getMapping(MappingOrigin.Southbound, eid);
}
private MapReply receiveMapReply() throws SocketTimeoutException {
- return MapReplySerializer.getInstance().deserialize(ByteBuffer.wrap(receivePacket().getData()));
+ return receiveMapReply(socket, 1000);
}
private MapRequest receiveMapRequest(DatagramSocket datagramSocket) throws SocketTimeoutException {
}
}
+ private MapReply receiveMapReply(DatagramSocket receivedSocket, int timeout) throws SocketTimeoutException {
+ DatagramPacket packet;
+ try {
+ while (true) {
+ packet = receivePacket(receivedSocket, timeout);
+ final ByteBuffer buff = ByteBuffer.wrap(packet.getData());
+ final int type = ByteUtil.getUnsignedByte(buff, LispMessage.Pos.TYPE) >> 4;
+ final Object lispType = MessageType.forValue(type);
+
+ if (lispType == MessageType.MapReply) {
+ return MapReplySerializer.getInstance().deserialize(buff);
+ }
+ }
+ } catch (SocketTimeoutException ste) {
+ throw ste;
+ }
+ }
+
private void sleepForSeconds(int seconds) {
try {
Thread.sleep(seconds*1000);