package org.opendaylight.lispflowmapping.implementation.lisp;
import com.google.common.base.Preconditions;
+import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import java.util.ArrayList;
import java.util.List;
import org.opendaylight.lispflowmapping.lisp.type.MappingData;
import org.opendaylight.lispflowmapping.lisp.util.LispAddressStringifier;
import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil;
+import org.opendaylight.lispflowmapping.lisp.util.MappingRecordUtil;
import org.opendaylight.lispflowmapping.lisp.util.SourceDestKeyHelper;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv4Afi;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv4PrefixAfi;
private IMapRequestResultHandler requestHandler;
private boolean authenticate = true;
private ISmrNotificationListener smrNotificationListener;
+ private static final int TTL_DELETE_MAPPING = 0;
public MapResolver(IMappingService mapService, boolean smr, String elpPolicy,
IMapRequestResultHandler requestHandler) {
}
public void handleMapRequest(MapRequest request) {
+ LOG.trace("Map-Request received: {}", request);
// SMRs and RLOC probes are directed towards xTRs and we're a Map-Resolver here, so ignore them
if (request.isSmr() != null && request.isSmr()) {
LOG.debug("Map-Resolver ignoring incoming SMR control message.");
}
if (request.isSmrInvoked()) {
LOG.debug("SMR-invoked request received.");
+ LOG.trace("Map-Request object: {}", request);
for (EidItem eidItem : request.getEidItem()) {
- final SmrEvent event = new SmrEvent(LispAddressUtil.addressBinariesFromItrRlocs(request.getItrRloc()),
- eidItem.getEid(), request.getNonce());
+ final SmrEvent event = new SmrEvent(
+ subscriberListFromItrRlocs(request.getItrRloc(), request.getSourceEid().getEid()),
+ eidItem.getEid(),
+ request.getNonce());
smrNotificationListener.onSmrInvokedReceived(event);
}
}
mapping = updateLocators(mapping, itrRlocs);
}
mapping = fixIfNotSDRequest(mapping, eidRecord.getEid());
+ mapping = fixTtlIfSmrInvoked(request, mapping);
replyBuilder.getMappingRecordItem().add(new MappingRecordItemBuilder().setMappingRecord(mapping).build());
}
requestHandler.handleMapReply(replyBuilder.build());
subscribers.remove(subscriber);
}
if (LOG.isTraceEnabled()) {
- LOG.trace("Adding new subscriber {} for EID {}, source EID {}",
- LispAddressStringifier.getString(subscriber.getSrcRloc()),
- LispAddressStringifier.getString(subscribedEid),
- LispAddressStringifier.getString(subscriber.getSrcEid()));
+ LOG.trace("Adding new subscriber {} for EID {}", subscriber.getString(),
+ LispAddressStringifier.getString(subscribedEid));
}
subscribers.add(subscriber);
addSubscribers(subscribedEid, subscribers);
return mapping;
}
+ // When an SMR-invoked Map-Request is asking for a mapping that is negative, it is most likely an attempt to delete
+ // that mapping.
+ private MappingRecord fixTtlIfSmrInvoked(MapRequest request, MappingRecord mapping) {
+ if (request.isSmrInvoked() && MappingRecordUtil.isNegativeMapping(mapping)) {
+ return new MappingRecordBuilder(mapping).setRecordTtl(TTL_DELETE_MAPPING).build();
+ }
+ return mapping;
+ }
+
private boolean locatorsNeedFixing(List<LocatorRecord> locatorRecords) {
// no locators - no fixing needed ;)
if (locatorRecords == null) {
return nextHop;
}
+ private static List<Subscriber> subscriberListFromItrRlocs(List<ItrRloc> itrRlocs, Eid srcEid) {
+ List<Subscriber> subscriberList = Lists.newArrayList();
+ for (ItrRloc itrRloc : itrRlocs) {
+ subscriberList.add(new Subscriber(itrRloc.getRloc(), srcEid, Subscriber.DEFAULT_SUBSCRIBER_TIMEOUT));
+ }
+ return subscriberList;
+ }
+
@SuppressWarnings("unchecked")
private Set<Subscriber> getSubscribers(Eid address) {
return (Set<Subscriber>) mapService.getData(MappingOrigin.Southbound, address, SubKeys.SUBSCRIBERS);