blob: b4fd8416530c96c3323411be991ff0c41b3c17be [file] [log] [blame]
Jian Li7d361572017-01-13 11:39:37 +09001/*
2 * Copyright 2017-present Open Networking Laboratory
3 *
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
18import org.apache.felix.scr.annotations.Activate;
19import org.apache.felix.scr.annotations.Component;
20import org.apache.felix.scr.annotations.Deactivate;
21import org.apache.felix.scr.annotations.Reference;
22import org.apache.felix.scr.annotations.ReferenceCardinality;
23import org.onosproject.lisp.ctl.LispController;
24import org.onosproject.lisp.ctl.LispMessageListener;
25import org.onosproject.lisp.ctl.LispRouterId;
26import org.onosproject.lisp.ctl.LispRouterListener;
Jian Li77d6e752017-01-29 23:24:18 +090027import org.onosproject.lisp.msg.protocols.LispMapNotify;
Jian Lib8436bb2017-02-23 03:39:08 +090028import org.onosproject.lisp.msg.protocols.LispMapRecord;
Jian Li77079332017-04-24 19:35:36 +090029import org.onosproject.lisp.msg.protocols.LispMapRegister;
Jian Li77d6e752017-01-29 23:24:18 +090030import org.onosproject.lisp.msg.protocols.LispMapReply;
Jian Li7d361572017-01-13 11:39:37 +090031import org.onosproject.lisp.msg.protocols.LispMessage;
Jian Li77d6e752017-01-29 23:24:18 +090032import org.onosproject.mapping.MappingEntry;
33import org.onosproject.mapping.MappingProvider;
34import org.onosproject.mapping.MappingProviderRegistry;
35import org.onosproject.mapping.MappingProviderService;
Jian Lib8436bb2017-02-23 03:39:08 +090036import org.onosproject.mapping.MappingStore;
Jian Li77d6e752017-01-29 23:24:18 +090037import org.onosproject.net.DeviceId;
Jian Lie5aa5df2017-04-02 22:40:56 +090038import org.onosproject.net.device.DeviceService;
Jian Li7d361572017-01-13 11:39:37 +090039import org.onosproject.net.provider.AbstractProvider;
40import org.onosproject.net.provider.ProviderId;
Jian Li77d6e752017-01-29 23:24:18 +090041import org.onosproject.provider.lisp.mapping.util.MappingEntryBuilder;
Jian Li7d361572017-01-13 11:39:37 +090042import org.slf4j.Logger;
43import org.slf4j.LoggerFactory;
44
Jian Lided80012017-04-24 22:13:22 +090045import java.net.URI;
46import java.net.URISyntaxException;
Jian Lib8436bb2017-02-23 03:39:08 +090047import java.util.List;
48
Jian Lic7badf92017-02-02 19:43:46 +090049import static org.onosproject.mapping.MappingStore.Type.MAP_CACHE;
50import static org.onosproject.mapping.MappingStore.Type.MAP_DATABASE;
51
Jian Li7d361572017-01-13 11:39:37 +090052/**
53 * Provider which uses a LISP controller to manage EID-RLOC mapping.
54 */
55@Component(immediate = true)
Jian Li77d6e752017-01-29 23:24:18 +090056public class LispMappingProvider extends AbstractProvider implements MappingProvider {
Jian Li7d361572017-01-13 11:39:37 +090057
58 private static final Logger log = LoggerFactory.getLogger(LispMappingProvider.class);
59
60 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
61 protected LispController controller;
62
Jian Li77d6e752017-01-29 23:24:18 +090063 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
64 protected MappingProviderRegistry providerRegistry;
65
Jian Lie5aa5df2017-04-02 22:40:56 +090066 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
67 protected DeviceService deviceService;
68
Jian Li77d6e752017-01-29 23:24:18 +090069 protected MappingProviderService providerService;
70
Jian Li7d361572017-01-13 11:39:37 +090071 private static final String SCHEME_NAME = "lisp";
72 private static final String MAPPING_PROVIDER_PACKAGE =
73 "org.onosproject.lisp.provider.mapping";
74
75 private final InternalMappingProvider listener = new InternalMappingProvider();
76
77 /**
78 * Creates a LISP mapping provider with the supplier identifier.
79 */
80 public LispMappingProvider() {
81 super(new ProviderId(SCHEME_NAME, MAPPING_PROVIDER_PACKAGE));
82 }
83
84 @Activate
85 public void activate() {
86
Jian Li77d6e752017-01-29 23:24:18 +090087 providerService = providerRegistry.register(this);
88
Jian Li7d361572017-01-13 11:39:37 +090089 // listens all LISP router related events
90 controller.addRouterListener(listener);
91
92 // listens all LISP control message
93 controller.addMessageListener(listener);
94
95 log.info("Started");
96 }
97
98 @Deactivate
99 public void deactivate() {
100
Jian Li77d6e752017-01-29 23:24:18 +0900101 providerRegistry.unregister(this);
102
Jian Li7d361572017-01-13 11:39:37 +0900103 // stops listening all LISP router related events
104 controller.removeRouterListener(listener);
105
106 // stops listening all LISP control messages
107 controller.removeMessageListener(listener);
108
Jian Li77d6e752017-01-29 23:24:18 +0900109 providerService = null;
110
Jian Li7d361572017-01-13 11:39:37 +0900111 log.info("Stopped");
112 }
113
114 /**
115 * A listener for LISP router events and control messages.
116 */
117 private class InternalMappingProvider implements LispRouterListener,
118 LispMessageListener {
119
120 @Override
121 public void routerAdded(LispRouterId routerId) {
122
123 }
124
125 @Override
126 public void routerRemoved(LispRouterId routerId) {
127
128 }
129
130 @Override
131 public void routerChanged(LispRouterId routerId) {
132
133 }
134
135 @Override
136 public void handleIncomingMessage(LispRouterId routerId, LispMessage msg) {
Jian Li77079332017-04-24 19:35:36 +0900137 if (providerService == null) {
138 log.warn("provider service has not been initialized");
139 return;
140 }
Jian Li7d361572017-01-13 11:39:37 +0900141
Jian Lided80012017-04-24 22:13:22 +0900142 DeviceId deviceId = getDeviceId(routerId.toString());
Jian Li77079332017-04-24 19:35:36 +0900143 switch (msg.getType()) {
144
145 case LISP_MAP_REQUEST:
146 log.warn("LISP mapping query feature will be added when " +
147 "provider service supports it.");
148 break;
149
150 case LISP_MAP_REGISTER:
151 LispMapRegister register = (LispMapRegister) msg;
152 processMappings(deviceId, register.getMapRecords(), MAP_DATABASE);
153 break;
154
155 default:
156 log.warn("Unhandled message type: {}", msg.getType());
157 }
Jian Li7d361572017-01-13 11:39:37 +0900158 }
159
160 @Override
161 public void handleOutgoingMessage(LispRouterId routerId, LispMessage msg) {
Jian Li77d6e752017-01-29 23:24:18 +0900162 if (providerService == null) {
Jian Li77079332017-04-24 19:35:36 +0900163 log.warn("provider service has not been initialized");
Jian Li77d6e752017-01-29 23:24:18 +0900164 return;
165 }
Jian Li7d361572017-01-13 11:39:37 +0900166
Jian Lided80012017-04-24 22:13:22 +0900167 DeviceId deviceId = getDeviceId(routerId.toString());
Jian Li77d6e752017-01-29 23:24:18 +0900168 switch (msg.getType()) {
169
170 case LISP_MAP_REPLY:
171 LispMapReply reply = (LispMapReply) msg;
Jian Lib8436bb2017-02-23 03:39:08 +0900172 processMappings(deviceId, reply.getMapRecords(), MAP_CACHE);
Jian Li77d6e752017-01-29 23:24:18 +0900173 break;
174
175 case LISP_MAP_NOTIFY:
176 LispMapNotify notify = (LispMapNotify) msg;
Jian Lib8436bb2017-02-23 03:39:08 +0900177 processMappings(deviceId, notify.getMapRecords(), MAP_DATABASE);
Jian Li77d6e752017-01-29 23:24:18 +0900178 break;
179
180 default:
181 log.warn("Unhandled message type: {}", msg.getType());
182 }
Jian Li7d361572017-01-13 11:39:37 +0900183 }
Jian Lib8436bb2017-02-23 03:39:08 +0900184
185 /**
186 * Converts map records into mapping, notifies to provider.
187 *
188 * @param deviceId device identifier
189 * @param records a collection of map records
190 * @param type MappingStore type
191 */
192 private void processMappings(DeviceId deviceId,
193 List<LispMapRecord> records,
194 MappingStore.Type type) {
195 records.forEach(r -> {
Jian Lie5aa5df2017-04-02 22:40:56 +0900196 MappingEntry me =
197 new MappingEntryBuilder(deviceId, r, deviceService).build();
Jian Lib8436bb2017-02-23 03:39:08 +0900198 providerService.mappingAdded(me, type);
199 });
200 }
Jian Li7d361572017-01-13 11:39:37 +0900201 }
Jian Lided80012017-04-24 22:13:22 +0900202
203 /**
204 * Obtains the DeviceId contains IP address of LISP router.
205 *
206 * @param ip IP address
207 * @return DeviceId device identifier
208 */
209 private DeviceId getDeviceId(String ip) {
210 try {
211 return DeviceId.deviceId(new URI(SCHEME_NAME, ip, null));
212 } catch (URISyntaxException e) {
213 throw new IllegalArgumentException("Unable to build deviceID for device "
214 + ip, e);
215 }
216 }
Jian Li7d361572017-01-13 11:39:37 +0900217}