- MapReply mapReply = new MapReply();
- mapReply.setNonce(request.getNonce());
-
- for (EidRecord eid : request.getEids()) {
- EidToLocatorRecord eidToLocators = new EidToLocatorRecord();
- eidToLocators.setMaskLength(eid.getMaskLength())//
- .setPrefix(eid.getPrefix());
- Map<String, ?> locators = dao.get(eid.getPrefix());
- if (locators != null) {
- addLocators(eidToLocators, locators);
+ MapReplyBuilder builder = new MapReplyBuilder();
+ builder.setEchoNonceEnabled(false);
+ builder.setProbe(false);
+ builder.setSecurityEnabled(false);
+ builder.setNonce(request.getNonce());
+ builder.setEidToLocatorRecord(new ArrayList<EidToLocatorRecord>());
+ for (EidRecord eidRecord : request.getEidRecord()) {
+ EidToLocatorRecord mapping = TopologyMapCache.getMapping(srcEid, eidRecord.getLispAddressContainer(), dao);
+ EidToLocatorRecordBuilder recordBuilder;
+ if (mapping != null) {
+ recordBuilder = new EidToLocatorRecordBuilder(mapping);
+ List<ItrRloc> itrRlocs = request.getItrRloc();
+ if (itrRlocs != null && itrRlocs.size() != 0) {
+ updateLocators(recordBuilder, itrRlocs);
+ LispAddressContainer itrRloc = itrRlocs.get(0).getLispAddressContainer();
+ SubscriberRLOC subscriberRloc = new SubscriberRLOC(itrRloc, srcEid);
+ Set<SubscriberRLOC> subscribers = TopologyMapCache.getSubscribers(mapping.getLispAddressContainer(), dao);
+ if (subscribers == null) {
+ subscribers = Sets.newConcurrentHashSet();
+ } else if (subscribers.contains(subscriberRloc)) {
+ // If there is an entry already for this subscriberRloc, remove it, so that it gets the new
+ // timestamp
+ subscribers.remove(subscriberRloc);
+ }
+ if (smr) {
+ LOG.trace("Adding new subscriber: " + subscriberRloc.toString());
+ subscribers.add(subscriberRloc);
+ TopologyMapCache.addSubscribers(mapping.getLispAddressContainer(), subscribers, dao);
+ }
+ }
+ } else {
+ recordBuilder = new EidToLocatorRecordBuilder();
+ recordBuilder.setAuthoritative(false);
+ recordBuilder.setMapVersion((short) 0);
+ recordBuilder.setMaskLength(eidRecord.getMask());
+ recordBuilder.setLispAddressContainer(eidRecord.getLispAddressContainer());
+ recordBuilder.setAction(Action.NativelyForward);
+ if (shouldAuthenticate() && TopologyMapCache.getAuthenticationKey(eidRecord.getLispAddressContainer(),
+ dao, shouldIterateMask()) != null) {
+ recordBuilder.setRecordTtl(TTL_RLOC_TIMED_OUT);
+ } else {
+ recordBuilder.setRecordTtl(TTL_NO_RLOC_KNOWN);
+
+ }