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 java.util.Set;
import org.apache.commons.lang3.exception.ExceptionUtils;
-import org.opendaylight.lispflowmapping.interfaces.dao.SubKeys;
import org.opendaylight.lispflowmapping.interfaces.dao.Subscriber;
import org.opendaylight.lispflowmapping.interfaces.lisp.IMapRequestResultHandler;
import org.opendaylight.lispflowmapping.interfaces.lisp.IMapResolverAsync;
import org.opendaylight.lispflowmapping.interfaces.lisp.SmrEvent;
import org.opendaylight.lispflowmapping.interfaces.mappingservice.IMappingService;
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.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.ExplicitLocatorPath;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.NoAddress;
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.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.inet.binary.types.rev160303.IpAddressBinary;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapreplymessage.MapReplyBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequest.ItrRloc;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MapResolver implements IMapResolverAsync {
- protected static final Logger LOG = LoggerFactory.getLogger(MapResolver.class);
+ private static final Logger LOG = LoggerFactory.getLogger(MapResolver.class);
private IMappingService mapService;
private boolean subscriptionService;
}
if (itrRlocs != null && itrRlocs.size() != 0) {
- if (subscriptionService) {
+ if (subscriptionService && isValidSourceEidForSubscriber(srcEid)) {
final Rloc resolvedRloc = resolveRloc(itrRlocs, sourceRloc);
updateSubscribers(resolvedRloc, eidRecord.getEid(), mapping.getEid(),
srcEid, mapping.getRecordTtl());
return false;
}
+ private static boolean isValidSourceEidForSubscriber(Eid eid) {
+ if (eid == null || eid.getAddress() instanceof NoAddress) {
+ return false;
+ }
+ return true;
+ }
+
private Rloc resolveRloc(List<ItrRloc> itrRlocList, IpAddressBinary srcRloc) {
if (srcRloc == null) {
return itrRlocList.get(0).getRloc();
subscribedEid = SourceDestKeyHelper.getDstBinary(mapEid);
}
- Set<Subscriber> subscribers = getSubscribers(subscribedEid);
- if (subscribers == null) {
- subscribers = Sets.newConcurrentHashSet();
- } else if (subscribers.contains(subscriber)) {
- // If there is an entry already for this subscriber, remove it, so that it gets the new timestamp
- subscribers.remove(subscriber);
- }
- if (LOG.isTraceEnabled()) {
- LOG.trace("Adding new subscriber {} for EID {}", subscriber.getString(),
- LispAddressStringifier.getString(subscribedEid));
- }
- subscribers.add(subscriber);
- addSubscribers(subscribedEid, subscribers);
+ mapService.subscribe(subscriber, subscribedEid);
}
// Fixes mapping if request was for simple dst EID but the matched mapping is a SourceDest
return subscriberList;
}
- @SuppressWarnings("unchecked")
- private Set<Subscriber> getSubscribers(Eid address) {
- return (Set<Subscriber>) mapService.getData(MappingOrigin.Southbound, address, SubKeys.SUBSCRIBERS);
- }
-
- private void addSubscribers(Eid address, Set<Subscriber> subscribers) {
- mapService.addData(MappingOrigin.Southbound, address, SubKeys.SUBSCRIBERS, subscribers);
- }
-
@Override
public void setSubscriptionService(boolean smr) {
subscriptionService = smr;