package org.opendaylight.lispflowmapping.implementation;
+import java.util.ArrayList;
import java.util.EnumMap;
import java.util.List;
import org.opendaylight.lispflowmapping.interfaces.mapcache.IMapCache;
import org.opendaylight.lispflowmapping.interfaces.mapcache.IMappingSystem;
import org.opendaylight.lispflowmapping.lisp.util.LispAddressStringifier;
+import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil;
+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.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ServicePath;
+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;
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.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;
tableMap.get(origin).updateMappingRegistration(key);
}
+ private MappingRecord updateServicePathMappingRecord(MappingRecord mapping, Eid eid) {
+ // keep properties of original record
+ MappingRecordBuilder recordBuilder = new MappingRecordBuilder(mapping);
+ recordBuilder.setLocatorRecord(new ArrayList<LocatorRecord>());
+
+ // there should only be one locator record
+ if (mapping.getLocatorRecord().size() != 1) {
+ LOG.warn("MappingRecord associated to ServicePath EID has more than one locator!");
+ return mapping;
+ }
+
+ LocatorRecord locatorRecord = mapping.getLocatorRecord().get(0);
+ long serviceIndex = ((ServicePath) eid.getAddress()).getServicePath().getServiceIndex();
+ int index = 255 - (int) serviceIndex;
+ Rloc rloc = locatorRecord.getRloc();
+ if (rloc.getAddress() instanceof Ipv4 || rloc.getAddress() instanceof Ipv6) {
+ if (index != 0) {
+ LOG.warn("Service Index should be 255 for simple IP RLOCs!");
+ }
+ return mapping;
+ } else if (rloc.getAddress() instanceof ExplicitLocatorPath) {
+ ExplicitLocatorPath elp = (ExplicitLocatorPath) rloc.getAddress();
+ List<Hop> hops = elp.getExplicitLocatorPath().getHop();
+
+ if (index < 0 || index > hops.size()) {
+ LOG.warn("Service Index out of bounds!");
+ return mapping;
+ }
+
+ SimpleAddress nextHop = hops.get(index).getAddress();
+ LocatorRecordBuilder lrb = new LocatorRecordBuilder(locatorRecord);
+ lrb.setRloc(LispAddressUtil.toRloc(nextHop));
+ recordBuilder.getLocatorRecord().add(lrb.build());
+ return recordBuilder.build();
+ } else {
+ LOG.warn("Nothing to do with ServicePath mapping record");
+ return mapping;
+ }
+ }
+
@Override
public Object getMapping(Eid src, Eid dst) {
// NOTE: what follows is just a simple implementation of a lookup logic, it SHOULD be subject to future
return smc.getMapping(src, dst);
}
+ if (dst.getAddress() instanceof ServicePath) {
+ return updateServicePathMappingRecord((MappingRecord)mapping, dst);
+ }
return mapping;
}
import org.opendaylight.lispflowmapping.interfaces.dao.MappingEntry;
import org.opendaylight.lispflowmapping.interfaces.dao.SubKeys;
import org.opendaylight.lispflowmapping.interfaces.mapcache.IMapCache;
+import org.opendaylight.lispflowmapping.lisp.util.MaskUtil;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.mapping.authkey.container.MappingAuthkey;
}
@Override
- public void addMapping(Eid key, Object data, boolean shouldOverwrite) {
+ public void addMapping(Eid eid, Object data, boolean shouldOverwrite) {
+ Eid key = MaskUtil.normalize(eid);
dao.put(key, new MappingEntry<>(SubKeys.REGDATE, new Date(System.currentTimeMillis())));
dao.put(key, new MappingEntry<>(SubKeys.RECORD, data));
}
if (dstKey == null) {
return null;
}
- return dao.getSpecific(dstKey, SubKeys.RECORD);
+ Eid key = MaskUtil.normalize(dstKey);
+ return dao.getSpecific(key, SubKeys.RECORD);
}
@Override
- public void removeMapping(Eid key, boolean overwrite) {
+ public void removeMapping(Eid eid, boolean overwrite) {
+ Eid key = MaskUtil.normalize(eid);
dao.removeSpecific(key, SubKeys.RECORD);
}
@Override
- public void addAuthenticationKey(Eid key, MappingAuthkey authKey) {
+ public void addAuthenticationKey(Eid eid, MappingAuthkey authKey) {
+ Eid key = MaskUtil.normalize(eid);
dao.put(key, new MappingEntry<>(SubKeys.AUTH_KEY, authKey));
}
@Override
- public MappingAuthkey getAuthenticationKey(Eid key) {
+ public MappingAuthkey getAuthenticationKey(Eid eid) {
+ Eid key = MaskUtil.normalize(eid);
Object data = dao.getSpecific(key, SubKeys.AUTH_KEY);
if (data instanceof MappingAuthkey) {
return (MappingAuthkey) data;
}
@Override
- public void removeAuthenticationKey(Eid key) {
+ public void removeAuthenticationKey(Eid eid) {
+ Eid key = MaskUtil.normalize(eid);
dao.removeSpecific(key, SubKeys.AUTH_KEY);
}
@Override
- public void updateMappingRegistration(Eid key) {
+ public void updateMappingRegistration(Eid eid) {
+ Eid key = MaskUtil.normalize(eid);
if (dao.get(key) != null) {
dao.put(key, new MappingEntry<>(SubKeys.REGDATE, new Date(System.currentTimeMillis())));
}
}
@Override
- public void addData(Eid key, String subKey, Object data) {
+ public void addData(Eid eid, String subKey, Object data) {
+ Eid key = MaskUtil.normalize(eid);
dao.put(key, new MappingEntry<>(subKey, data));
}
@Override
- public Object getData(Eid key, String subKey) {
+ public Object getData(Eid eid, String subKey) {
+ Eid key = MaskUtil.normalize(eid);
return dao.getSpecific(key, subKey);
}
@Override
- public void removeData(Eid key, String subKey) {
+ public void removeData(Eid eid, String subKey) {
+ Eid key = MaskUtil.normalize(eid);
dao.removeSpecific(key, subKey);
}
// Method returns the DAO entry (hash) corresponding to either the longest prefix match of eid, if eid is maskable,
// or the exact match otherwise. eid must be a 'simple' address
private Map<String, ?> getDaoEntryBest(Eid eid, ILispDAO dao) {
+ Eid key;
if (MaskUtil.isMaskable(eid.getAddress())) {
- Eid key;
short mask = MaskUtil.getMaskForAddress(eid.getAddress());
while (mask > 0) {
key = MaskUtil.normalize(eid, mask);
}
return null;
} else {
- Map<String, ?> entry = dao.get(eid);
+ key = MaskUtil.normalize(eid);
+ Map<String, ?> entry = dao.get(key);
if (entry != null) {
- return dao.get(eid);
+ return dao.get(key);
} else {
return null;
}
}
return null;
} else {
- Object password = table.getSpecific(eid, SubKeys.AUTH_KEY);
+ Eid key = MaskUtil.normalize(eid);
+ Object password = table.getSpecific(key, SubKeys.AUTH_KEY);
if (password != null && password instanceof MappingAuthkey) {
return (MappingAuthkey) password;
} else {
Eid key = MaskUtil.normalize(eid);
ILispDAO table = getOrInstantiateVniTable(key);
-
if (key.getAddress() instanceof SourceDestKey) {
ILispDAO srcDstDao = getOrInstantiateSDInnerDao(key, table);
srcDstDao.put(SourceDestKeyHelper.getSrc(key), new MappingEntry<Object>(subKey, data));
}
@Override
- public Object getData(Eid key, String subKey) {
+ public Object getData(Eid eid, String subKey) {
+ Eid key = MaskUtil.normalize(eid);
ILispDAO table = getVniTable(key);
if (table == null) {
return null;
// Method returns the DAO entry (hash) corresponding to either the longest prefix match of eid, if eid is maskable,
// or the exact match otherwise. eid must be a 'simple' address
- private Map<String, ?> getDaoEntryBest(Eid key, ILispDAO dao) {
- if (MaskUtil.isMaskable(key.getAddress())) {
- Eid lookupKey;
- short mask = MaskUtil.getMaskForAddress(key.getAddress());
+ private Map<String, Object> getDaoEntryBest(Eid eid, ILispDAO dao) {
+ Eid key;
+ if (MaskUtil.isMaskable(eid.getAddress())) {
+ short mask = MaskUtil.getMaskForAddress(eid.getAddress());
while (mask > 0) {
- lookupKey = MaskUtil.normalize(key, mask);
+ key = MaskUtil.normalize(eid, mask);
mask--;
- Map<String, ?> entry = dao.get(lookupKey);
+ Map<String, Object> entry = dao.get(key);
if (entry != null) {
return entry;
}
}
return null;
} else {
+ key = MaskUtil.normalize(eid);
return dao.get(key);
}
}
if (MaskUtil.isMaskable(eid.getAddress())) {
return getAuthKeyLpm(eid, table);
} else {
- Object password = table.getSpecific(eid, SubKeys.AUTH_KEY);
+ Eid key = MaskUtil.normalize(eid);
+ Object password = table.getSpecific(key, SubKeys.AUTH_KEY);
if (password != null && password instanceof MappingAuthkey) {
return (MappingAuthkey) password;
} else {
}
@Override
- public void updateMappingRegistration(Eid key) {
- ILispDAO table = getVniTable(key);
+ public void updateMappingRegistration(Eid eid) {
+ ILispDAO table = getVniTable(eid);
if (table == null) {
return;
}
- Map<String, ?> daoEntry = getDaoEntryBest(key, table);
+ Map<String, Object> daoEntry = getDaoEntryBest(eid, table);
if (daoEntry != null) {
- table.put(key, new MappingEntry<>(SubKeys.REGDATE, new Date(System.currentTimeMillis())));
+ daoEntry.put(SubKeys.REGDATE, new Date(System.currentTimeMillis()));
}
}
@Override
- public void addData(Eid key, String subKey, Object data) {
- Eid normKey = MaskUtil.normalize(key);
- ILispDAO table = getOrInstantiateVniTable(normKey);
- table.put(normKey, new MappingEntry<>(subKey, data));
+ public void addData(Eid eid, String subKey, Object data) {
+ Eid key = MaskUtil.normalize(eid);
+ ILispDAO table = getOrInstantiateVniTable(key);
+ table.put(key, new MappingEntry<>(subKey, data));
}
@Override
- public Object getData(Eid key, String subKey) {
- ILispDAO table = getOrInstantiateVniTable(key);
+ public Object getData(Eid eid, String subKey) {
+ ILispDAO table = getOrInstantiateVniTable(eid);
if (table == null) {
return null;
}
+ Eid key = MaskUtil.normalize(eid);
return table.getSpecific(key, subKey);
}
@Override
- public void removeData(Eid key, String subKey) {
- ILispDAO table = getOrInstantiateVniTable(key);
+ public void removeData(Eid eid, String subKey) {
+ ILispDAO table = getOrInstantiateVniTable(eid);
if (table == null) {
return;
}
+ Eid key = MaskUtil.normalize(eid);
table.removeSpecific(key, subKey);
}
}
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.LispAddressFamily;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.MacAfi;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.NoAddressAfi;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ServicePathIdType;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ServicePathLcaf;
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.SourceDestKeyLcaf;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.Address;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.KeyValueAddress;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.MacBuilder;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.NoAddressBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ServicePathBuilder;
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.eid.container.EidBuilder;
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.rloc.container.Rloc;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.RlocBuilder;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.key.value.address.KeyValueAddressBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.service.path.ServicePath;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.source.dest.key.SourceDestKey;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.source.dest.key.SourceDestKeyBuilder;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
}
}
+ public static Address addressFromServicePath(ServicePath address) {
+ if (address == null) {
+ return null;
+ } else {
+ return (Address) new ServicePathBuilder().setServicePath(address).build();
+ }
+ }
+
public static Address addressFromDistinguishedName(DistinguishedNameType address) {
if (address == null) {
return null;
return builder.build();
}
+ public static Eid asServicePathEid(long vni, long servicePathId, short serviceIndex) {
+ EidBuilder eb = new EidBuilder();
+ eb.setAddressType(ServicePathLcaf.class);
+ eb.setVirtualNetworkId(new InstanceIdType(vni));
+ org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.service.path.ServicePathBuilder spb = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.service.path.ServicePathBuilder();
+ spb.setServicePathId(new ServicePathIdType(servicePathId));
+ spb.setServiceIndex(serviceIndex);
+ return eb.setAddress(addressFromServicePath(spb.build())).build();
+ }
+
public static Eid toEid(MacAddress mac, InstanceIdType vni) {
EidBuilder builder = new EidBuilder();
builder.setAddressType(MacAfi.class);
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4Prefix;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6Prefix;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ServicePath;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.SourceDestKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
import org.slf4j.Logger;
} else if (address instanceof InstanceId) {
// TODO - not absolutely necessary, but should be implemented
return eid;
+ } else if (address instanceof ServicePath) {
+ // Build new Service Path eid with service index set to 0
+ long spi = ((ServicePath) address).getServicePath().getServicePathId().getValue();
+ return LispAddressUtil.asServicePathEid(0, spi, (short)0);
}
} catch (UnknownHostException e) {
LOG.trace("Failed to normalize eid {}: {}", eid, ExceptionUtils.getStackTrace(e));