import java.util.ArrayList;
import java.util.EnumMap;
import java.util.List;
-
+import org.opendaylight.lispflowmapping.dsbackend.DataStoreBackEnd;
import org.opendaylight.lispflowmapping.implementation.config.ConfigIni;
-import org.opendaylight.lispflowmapping.implementation.mapcache.FlatMapCache;
-import org.opendaylight.lispflowmapping.implementation.mapcache.MultiTableMapCache;
-import org.opendaylight.lispflowmapping.implementation.mapcache.SimpleMapCache;
-import org.opendaylight.lispflowmapping.implementation.mdsal.DataStoreBackEnd;
import org.opendaylight.lispflowmapping.implementation.util.DSBEInputUtil;
import org.opendaylight.lispflowmapping.implementation.util.MappingMergeUtil;
import org.opendaylight.lispflowmapping.interfaces.dao.ILispDAO;
import org.opendaylight.lispflowmapping.interfaces.mappingservice.IMappingService;
import org.opendaylight.lispflowmapping.lisp.util.LispAddressStringifier;
import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil;
+import org.opendaylight.lispflowmapping.mapcache.FlatMapCache;
+import org.opendaylight.lispflowmapping.mapcache.MultiTableMapCache;
+import org.opendaylight.lispflowmapping.mapcache.SimpleMapCache;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SimpleAddress;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ExplicitLocatorPath;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecord;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecordBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.authkey.container.MappingAuthkey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecord;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecordBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.Rloc;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.MappingOrigin;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.db.instance.AuthenticationKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.db.instance.Mapping;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.mapping.authkey.container.MappingAuthkey;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* The Mapping System coordinates caching of md-sal stored mappings and if so configured enables longest prefix match
- * mapping lookups
+ * mapping lookups.
*
* @author Florin Coras
*
*/
public class MappingSystem implements IMappingSystem {
- private final static Logger LOG = LoggerFactory.getLogger(MappingSystem.class);
+ private static final Logger LOG = LoggerFactory.getLogger(MappingSystem.class);
private boolean iterateMask;
private boolean notificationService;
private boolean overwrite;
tableMap.put(MappingOrigin.Southbound, smc);
}
- public void addMapping(MappingOrigin origin, Eid key, Object value) {
- tableMap.get(origin).addMapping(key, value, origin == MappingOrigin.Southbound ? overwrite : true);
+ public void addMapping(MappingOrigin origin, Eid key, Object value, boolean merge) {
+ tableMap.get(origin).addMapping(key, value, origin == MappingOrigin.Southbound ? overwrite : true, merge);
}
- public void updateMappingRegistration(MappingOrigin origin, Eid key) {
- tableMap.get(origin).updateMappingRegistration(key);
+ public void updateMappingRegistration(MappingOrigin origin, Eid key, Long timestamp) {
+ tableMap.get(origin).updateMappingRegistration(key, timestamp);
}
private MappingRecord updateServicePathMappingRecord(MappingRecord mapping, Eid eid) {
}
}
+ @Override
+ public Object getMapping(Eid dst) {
+ return getMapping((Eid)null, dst);
+ }
+
+ @Override
+ public Object getMapping(MappingOrigin origin, Eid key) {
+ if (origin.equals(MappingOrigin.Southbound)) {
+ return getSbMappingWithExpiration(null, key);
+ }
+ return tableMap.get(origin).getMapping(null, key);
+ }
+
private Object getMappingNbFirst(Eid src, Eid dst) {
// Default lookup policy is northboundFirst
}
@Override
- public Object getMapping(Eid dst) {
- return getMapping((Eid)null, dst);
- }
+ public Eid getWidestNegativePrefix(Eid key) {
+ Eid nbPrefix = pmc.getWidestNegativeMapping(key);
+ if (nbPrefix == null) {
+ return null;
+ }
- @Override
- public Object getMapping(MappingOrigin origin, Eid key) {
- if (origin.equals(MappingOrigin.Southbound)) {
- return getSbMappingWithExpiration(null, key);
+ Eid sbPrefix = smc.getWidestNegativeMapping(key);
+ if (sbPrefix == null) {
+ return null;
+ }
+
+ // since prefixes overlap, just return the more specific (larger mask)
+ if (LispAddressUtil.getIpPrefixMask(nbPrefix) < LispAddressUtil.getIpPrefixMask(sbPrefix)) {
+ return sbPrefix;
+ } else {
+ return nbPrefix;
}
- return tableMap.get(origin).getMapping(null, key);
}
@Override
/**
- * Restore all mappings and keys from mdsal datastore
+ * Restore all mappings and keys from mdsal datastore.
*/
private void restoreDaoFromDatastore() {
List<Mapping> mappings = dsbe.getAllMappings();
expiredMappings++;
continue;
}
- addMapping(mapping.getOrigin(), mapping.getMappingRecord().getEid(), mapping.getMappingRecord());
+ addMapping(mapping.getOrigin(), mapping.getMappingRecord().getEid(), mapping.getMappingRecord(), false);
}
LOG.info("{} mappings were expired and were not restored", expiredMappings);