blob: d2ced9641b04d21165b2aa3ce4d56c167617f105 [file] [log] [blame]
Jian Li7d361572017-01-13 11:39:37 +09001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2017-present Open Networking Foundation
Jian Li7d361572017-01-13 11:39:37 +09003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onosproject.provider.lisp.mapping.impl;
17
Jian Li55648ed2017-05-01 02:20:55 +090018import com.google.common.collect.Lists;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070019import org.osgi.service.component.annotations.Activate;
20import org.osgi.service.component.annotations.Component;
21import org.osgi.service.component.annotations.Deactivate;
22import org.osgi.service.component.annotations.Reference;
23import org.osgi.service.component.annotations.ReferenceCardinality;
Jian Li7d361572017-01-13 11:39:37 +090024import org.onosproject.lisp.ctl.LispController;
25import org.onosproject.lisp.ctl.LispMessageListener;
26import org.onosproject.lisp.ctl.LispRouterId;
27import org.onosproject.lisp.ctl.LispRouterListener;
Jian Li55648ed2017-05-01 02:20:55 +090028import org.onosproject.lisp.msg.protocols.LispEidRecord;
Jian Lib8436bb2017-02-23 03:39:08 +090029import org.onosproject.lisp.msg.protocols.LispMapRecord;
Jian Li77079332017-04-24 19:35:36 +090030import org.onosproject.lisp.msg.protocols.LispMapRegister;
Jian Li77d6e752017-01-29 23:24:18 +090031import org.onosproject.lisp.msg.protocols.LispMapReply;
Jian Li55648ed2017-05-01 02:20:55 +090032import org.onosproject.lisp.msg.protocols.LispMapRequest;
Jian Li7d361572017-01-13 11:39:37 +090033import org.onosproject.lisp.msg.protocols.LispMessage;
Jian Li77d6e752017-01-29 23:24:18 +090034import org.onosproject.mapping.MappingEntry;
Jian Li55648ed2017-05-01 02:20:55 +090035import org.onosproject.mapping.MappingKey;
Jian Li77d6e752017-01-29 23:24:18 +090036import org.onosproject.mapping.MappingProvider;
37import org.onosproject.mapping.MappingProviderRegistry;
38import org.onosproject.mapping.MappingProviderService;
Jian Lib8436bb2017-02-23 03:39:08 +090039import org.onosproject.mapping.MappingStore;
Jian Li77d6e752017-01-29 23:24:18 +090040import org.onosproject.net.DeviceId;
Jian Lie5aa5df2017-04-02 22:40:56 +090041import org.onosproject.net.device.DeviceService;
Jian Li7d361572017-01-13 11:39:37 +090042import org.onosproject.net.provider.AbstractProvider;
43import org.onosproject.net.provider.ProviderId;
Jian Li77d6e752017-01-29 23:24:18 +090044import org.onosproject.provider.lisp.mapping.util.MappingEntryBuilder;
Jian Li55648ed2017-05-01 02:20:55 +090045import org.onosproject.provider.lisp.mapping.util.MappingKeyBuilder;
Jian Li7d361572017-01-13 11:39:37 +090046import org.slf4j.Logger;
47import org.slf4j.LoggerFactory;
48
Jian Lided80012017-04-24 22:13:22 +090049import java.net.URI;
50import java.net.URISyntaxException;
Jian Lib8436bb2017-02-23 03:39:08 +090051import java.util.List;
52
Jian Lic7badf92017-02-02 19:43:46 +090053import static org.onosproject.mapping.MappingStore.Type.MAP_CACHE;
54import static org.onosproject.mapping.MappingStore.Type.MAP_DATABASE;
55
Jian Li7d361572017-01-13 11:39:37 +090056/**
57 * Provider which uses a LISP controller to manage EID-RLOC mapping.
58 */
59@Component(immediate = true)
Jian Li77d6e752017-01-29 23:24:18 +090060public class LispMappingProvider extends AbstractProvider implements MappingProvider {
Jian Li7d361572017-01-13 11:39:37 +090061
62 private static final Logger log = LoggerFactory.getLogger(LispMappingProvider.class);
63
Ray Milkeyd84f89b2018-08-17 14:54:17 -070064 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Jian Li7d361572017-01-13 11:39:37 +090065 protected LispController controller;
66
Ray Milkeyd84f89b2018-08-17 14:54:17 -070067 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Jian Li77d6e752017-01-29 23:24:18 +090068 protected MappingProviderRegistry providerRegistry;
69
Ray Milkeyd84f89b2018-08-17 14:54:17 -070070 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Jian Lie5aa5df2017-04-02 22:40:56 +090071 protected DeviceService deviceService;
72
Jian Li77d6e752017-01-29 23:24:18 +090073 protected MappingProviderService providerService;
74
Jian Li7d361572017-01-13 11:39:37 +090075 private static final String SCHEME_NAME = "lisp";
76 private static final String MAPPING_PROVIDER_PACKAGE =
77 "org.onosproject.lisp.provider.mapping";
78
79 private final InternalMappingProvider listener = new InternalMappingProvider();
80
81 /**
82 * Creates a LISP mapping provider with the supplier identifier.
83 */
84 public LispMappingProvider() {
85 super(new ProviderId(SCHEME_NAME, MAPPING_PROVIDER_PACKAGE));
86 }
87
88 @Activate
89 public void activate() {
90
Jian Li77d6e752017-01-29 23:24:18 +090091 providerService = providerRegistry.register(this);
92
Jian Li7d361572017-01-13 11:39:37 +090093 // listens all LISP router related events
94 controller.addRouterListener(listener);
95
96 // listens all LISP control message
97 controller.addMessageListener(listener);
98
99 log.info("Started");
100 }
101
102 @Deactivate
103 public void deactivate() {
104
Jian Li77d6e752017-01-29 23:24:18 +0900105 providerRegistry.unregister(this);
106
Jian Li7d361572017-01-13 11:39:37 +0900107 // stops listening all LISP router related events
108 controller.removeRouterListener(listener);
109
110 // stops listening all LISP control messages
111 controller.removeMessageListener(listener);
112
Jian Li77d6e752017-01-29 23:24:18 +0900113 providerService = null;
114
Jian Li7d361572017-01-13 11:39:37 +0900115 log.info("Stopped");
116 }
117
118 /**
119 * A listener for LISP router events and control messages.
120 */
121 private class InternalMappingProvider implements LispRouterListener,
122 LispMessageListener {
123
124 @Override
125 public void routerAdded(LispRouterId routerId) {
126
127 }
128
129 @Override
130 public void routerRemoved(LispRouterId routerId) {
131
132 }
133
134 @Override
135 public void routerChanged(LispRouterId routerId) {
136
137 }
138
139 @Override
140 public void handleIncomingMessage(LispRouterId routerId, LispMessage msg) {
Jian Li77079332017-04-24 19:35:36 +0900141 if (providerService == null) {
142 log.warn("provider service has not been initialized");
143 return;
144 }
Jian Li7d361572017-01-13 11:39:37 +0900145
Jian Lided80012017-04-24 22:13:22 +0900146 DeviceId deviceId = getDeviceId(routerId.toString());
Jian Li77079332017-04-24 19:35:36 +0900147 switch (msg.getType()) {
148
149 case LISP_MAP_REQUEST:
Jian Li55648ed2017-05-01 02:20:55 +0900150 LispMapRequest request = (LispMapRequest) msg;
151 List<LispEidRecord> records = request.getEids();
152 List<MappingKey> keys = Lists.newArrayList();
153 records.forEach(r -> keys.add(new MappingKeyBuilder(deviceService,
154 deviceId, r.getPrefix()).build()));
Jian Li38bb1092017-05-01 15:04:32 +0900155 // TODO: returned mapping values will be converted to
156 // protocol specifics and wrapped into a mapping record
157 providerService.mappingQueried(keys);
Jian Li77079332017-04-24 19:35:36 +0900158 break;
159
160 case LISP_MAP_REGISTER:
161 LispMapRegister register = (LispMapRegister) msg;
162 processMappings(deviceId, register.getMapRecords(), MAP_DATABASE);
163 break;
164
165 default:
166 log.warn("Unhandled message type: {}", msg.getType());
167 }
Jian Li7d361572017-01-13 11:39:37 +0900168 }
169
170 @Override
171 public void handleOutgoingMessage(LispRouterId routerId, LispMessage msg) {
Jian Li77d6e752017-01-29 23:24:18 +0900172 if (providerService == null) {
Jian Li77079332017-04-24 19:35:36 +0900173 log.warn("provider service has not been initialized");
Jian Li77d6e752017-01-29 23:24:18 +0900174 return;
175 }
Jian Li7d361572017-01-13 11:39:37 +0900176
Jian Lided80012017-04-24 22:13:22 +0900177 DeviceId deviceId = getDeviceId(routerId.toString());
Jian Li77d6e752017-01-29 23:24:18 +0900178 switch (msg.getType()) {
179
180 case LISP_MAP_REPLY:
181 LispMapReply reply = (LispMapReply) msg;
Jian Lib8436bb2017-02-23 03:39:08 +0900182 processMappings(deviceId, reply.getMapRecords(), MAP_CACHE);
Jian Li77d6e752017-01-29 23:24:18 +0900183 break;
184
185 case LISP_MAP_NOTIFY:
Jian Li55648ed2017-05-01 02:20:55 +0900186 // not take any action for map notify, and we've already
187 // store the mapping when receives map register message
Jian Li77d6e752017-01-29 23:24:18 +0900188 break;
189
190 default:
191 log.warn("Unhandled message type: {}", msg.getType());
192 }
Jian Li7d361572017-01-13 11:39:37 +0900193 }
Jian Lib8436bb2017-02-23 03:39:08 +0900194
195 /**
196 * Converts map records into mapping, notifies to provider.
197 *
198 * @param deviceId device identifier
199 * @param records a collection of map records
200 * @param type MappingStore type
201 */
202 private void processMappings(DeviceId deviceId,
203 List<LispMapRecord> records,
204 MappingStore.Type type) {
205 records.forEach(r -> {
Jian Lie5aa5df2017-04-02 22:40:56 +0900206 MappingEntry me =
207 new MappingEntryBuilder(deviceId, r, deviceService).build();
Jian Lib8436bb2017-02-23 03:39:08 +0900208 providerService.mappingAdded(me, type);
209 });
210 }
Jian Li7d361572017-01-13 11:39:37 +0900211 }
Jian Lided80012017-04-24 22:13:22 +0900212
213 /**
214 * Obtains the DeviceId contains IP address of LISP router.
215 *
216 * @param ip IP address
217 * @return DeviceId device identifier
218 */
219 private DeviceId getDeviceId(String ip) {
220 try {
221 return DeviceId.deviceId(new URI(SCHEME_NAME, ip, null));
222 } catch (URISyntaxException e) {
223 throw new IllegalArgumentException("Unable to build deviceID for device "
224 + ip, e);
225 }
226 }
Jian Li7d361572017-01-13 11:39:37 +0900227}