2 * Copyright (c) 2014 Contextream, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.lispflowmapping.implementation.lisp;
11 import java.util.ArrayList;
14 import org.opendaylight.lispflowmapping.implementation.dao.MappingServiceKeyUtil;
15 import org.opendaylight.lispflowmapping.implementation.util.LispNotificationHelper;
16 import org.opendaylight.lispflowmapping.implementation.util.MaskUtil;
17 import org.opendaylight.lispflowmapping.interfaces.dao.ILispDAO;
18 import org.opendaylight.lispflowmapping.interfaces.dao.IMappingServiceKey;
19 import org.opendaylight.lispflowmapping.interfaces.dao.MappingServiceRLOC;
20 import org.opendaylight.lispflowmapping.interfaces.dao.MappingServiceValue;
21 import org.opendaylight.lispflowmapping.interfaces.lisp.IMapRequestResultHandler;
22 import org.opendaylight.lispflowmapping.interfaces.lisp.IMapResolverAsync;
23 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.MapRequest;
24 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.eidrecords.EidRecord;
25 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.eidtolocatorrecords.EidToLocatorRecord;
26 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.eidtolocatorrecords.EidToLocatorRecord.Action;
27 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.eidtolocatorrecords.EidToLocatorRecordBuilder;
28 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.LispAddressContainerBuilder;
29 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.locatorrecords.LocatorRecord;
30 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.locatorrecords.LocatorRecordBuilder;
31 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.mapreplymessage.MapReplyBuilder;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
35 public class MapResolver implements IMapResolverAsync {
36 private static final int TTL_RLOC_TIMED_OUT = 1;
37 private static final int TTL_NO_RLOC_KNOWN = 15;
39 private volatile boolean shouldAuthenticate;
40 private volatile boolean shouldIterateMask;
41 protected static final Logger logger = LoggerFactory.getLogger(MapResolver.class);
43 public MapResolver(ILispDAO dao) {
44 this(dao, true, true);
47 public MapResolver(ILispDAO dao, boolean authenticate, boolean iterateMask) {
49 this.shouldAuthenticate = authenticate;
50 this.shouldIterateMask = iterateMask;
53 public void handleMapRequest(MapRequest request, IMapRequestResultHandler callback) {
55 logger.warn("handleMapRequest called while dao is uninitialized");
58 if (request.isPitr()) {
59 if (request.getEidRecord().size() > 0) {
60 EidRecord eid = request.getEidRecord().get(0);
61 Map<String, ?> locators = getLocators(eid);
62 MappingServiceValue value = (MappingServiceValue) locators.get("value");
63 if (value.getRlocs() != null && value.getRlocs().size() > 0) {
64 callback.handleNonProxyMapRequest(request,
65 LispNotificationHelper.getInetAddressFromContainer(value.getRlocs().get(0).getRecord().getLispAddressContainer()));
70 MapReplyBuilder builder = new MapReplyBuilder();
71 builder.setEchoNonceEnabled(false);
72 builder.setProbe(false);
73 builder.setSecurityEnabled(false);
74 builder.setNonce(request.getNonce());
75 builder.setEidToLocatorRecord(new ArrayList<EidToLocatorRecord>());
76 for (EidRecord eid : request.getEidRecord()) {
77 EidToLocatorRecordBuilder recordBuilder = new EidToLocatorRecordBuilder();
78 recordBuilder.setRecordTtl(0);
79 recordBuilder.setAction(Action.NoAction);
80 recordBuilder.setAuthoritative(false);
81 recordBuilder.setMapVersion((short) 0);
82 recordBuilder.setMaskLength(eid.getMask());
83 recordBuilder.setLispAddressContainer(eid.getLispAddressContainer());
84 recordBuilder.setLocatorRecord(new ArrayList<LocatorRecord>());
85 Map<String, ?> locators = getLocators(eid);
86 if (locators != null) {
87 MappingServiceValue value = (MappingServiceValue) locators.get("value");
89 if (value.getRlocs() != null && value.getRlocs().size() > 0) {
90 addLocators(recordBuilder, value);
93 .setAction(org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.eidtolocatorrecords.EidToLocatorRecord.Action.NativelyForward);
94 recordBuilder.setRecordTtl(TTL_RLOC_TIMED_OUT);
98 .setAction(org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.eidtolocatorrecords.EidToLocatorRecord.Action.NativelyForward);
99 recordBuilder.setRecordTtl(TTL_NO_RLOC_KNOWN);
101 builder.getEidToLocatorRecord().add(recordBuilder.build());
103 callback.handleMapReply(builder.build());
107 private Map<String, ?> getLocators(EidRecord eid) {
108 IMappingServiceKey key = MappingServiceKeyUtil.generateMappingServiceKey(eid.getLispAddressContainer(), eid.getMask());
109 Map<String, ?> locators = dao.get(key);
110 if (shouldIterateMask() && locators == null && MaskUtil.isMaskable(key.getEID().getAddress())) {
111 locators = findMaskLocators(key);
116 private Map<String, ?> findMaskLocators(IMappingServiceKey key) {
117 int mask = key.getMask();
119 key = MappingServiceKeyUtil.generateMappingServiceKey(
120 new LispAddressContainerBuilder().setAddress(MaskUtil.normalize(key.getEID().getAddress(), mask)).build(), mask);
122 Map<String, ?> locators = dao.get(key);
123 if (locators != null) {
130 private void addLocators(EidToLocatorRecordBuilder recordBuilder, MappingServiceValue value) {
131 for (MappingServiceRLOC rloc : value.getRlocs()) {
132 addLocator(recordBuilder, rloc);
133 recordBuilder.setRecordTtl(rloc.getTtl());
137 private void addLocator(EidToLocatorRecordBuilder recordBuilder, MappingServiceRLOC locatorObject) {
138 if (locatorObject == null) {
142 recordBuilder.getLocatorRecord().add(
143 new LocatorRecordBuilder().setLocalLocator(locatorObject.getRecord().isLocalLocator())
144 .setRlocProbed(locatorObject.getRecord().isRlocProbed()).setWeight(locatorObject.getRecord().getWeight())
145 .setPriority(locatorObject.getRecord().getPriority()).setMulticastWeight(locatorObject.getRecord().getMulticastWeight())
146 .setMulticastPriority(locatorObject.getRecord().getMulticastPriority()).setRouted(true)
147 .setLispAddressContainer(locatorObject.getRecord().getLispAddressContainer()).build());
148 recordBuilder.setAction(locatorObject.getAction());
149 recordBuilder.setAuthoritative(locatorObject.isAuthoritative());
150 recordBuilder.setRecordTtl(locatorObject.getTtl());
151 } catch (ClassCastException cce) {
155 public boolean shouldIterateMask() {
156 return shouldIterateMask;
159 public boolean shouldAuthenticate() {
160 return shouldAuthenticate;
163 public void setShouldIterateMask(boolean shouldIterateMask) {
164 this.shouldIterateMask = shouldIterateMask;
167 public void setShouldAuthenticate(boolean shouldAuthenticate) {
168 this.shouldAuthenticate = shouldAuthenticate;