blob: eb985c31bd90537e8d326bc0e50bed9eb63d72b2 [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 Lib8436bb2017-02-23 03:39:08 +090045import java.util.List;
46
Jian Lic7badf92017-02-02 19:43:46 +090047import static org.onosproject.mapping.MappingStore.Type.MAP_CACHE;
48import static org.onosproject.mapping.MappingStore.Type.MAP_DATABASE;
49
Jian Li7d361572017-01-13 11:39:37 +090050/**
51 * Provider which uses a LISP controller to manage EID-RLOC mapping.
52 */
53@Component(immediate = true)
Jian Li77d6e752017-01-29 23:24:18 +090054public class LispMappingProvider extends AbstractProvider implements MappingProvider {
Jian Li7d361572017-01-13 11:39:37 +090055
56 private static final Logger log = LoggerFactory.getLogger(LispMappingProvider.class);
57
58 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
59 protected LispController controller;
60
Jian Li77d6e752017-01-29 23:24:18 +090061 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
62 protected MappingProviderRegistry providerRegistry;
63
Jian Lie5aa5df2017-04-02 22:40:56 +090064 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
65 protected DeviceService deviceService;
66
Jian Li77d6e752017-01-29 23:24:18 +090067 protected MappingProviderService providerService;
68
Jian Li7d361572017-01-13 11:39:37 +090069 private static final String SCHEME_NAME = "lisp";
70 private static final String MAPPING_PROVIDER_PACKAGE =
71 "org.onosproject.lisp.provider.mapping";
72
73 private final InternalMappingProvider listener = new InternalMappingProvider();
74
75 /**
76 * Creates a LISP mapping provider with the supplier identifier.
77 */
78 public LispMappingProvider() {
79 super(new ProviderId(SCHEME_NAME, MAPPING_PROVIDER_PACKAGE));
80 }
81
82 @Activate
83 public void activate() {
84
Jian Li77d6e752017-01-29 23:24:18 +090085 providerService = providerRegistry.register(this);
86
Jian Li7d361572017-01-13 11:39:37 +090087 // listens all LISP router related events
88 controller.addRouterListener(listener);
89
90 // listens all LISP control message
91 controller.addMessageListener(listener);
92
93 log.info("Started");
94 }
95
96 @Deactivate
97 public void deactivate() {
98
Jian Li77d6e752017-01-29 23:24:18 +090099 providerRegistry.unregister(this);
100
Jian Li7d361572017-01-13 11:39:37 +0900101 // stops listening all LISP router related events
102 controller.removeRouterListener(listener);
103
104 // stops listening all LISP control messages
105 controller.removeMessageListener(listener);
106
Jian Li77d6e752017-01-29 23:24:18 +0900107 providerService = null;
108
Jian Li7d361572017-01-13 11:39:37 +0900109 log.info("Stopped");
110 }
111
112 /**
113 * A listener for LISP router events and control messages.
114 */
115 private class InternalMappingProvider implements LispRouterListener,
116 LispMessageListener {
117
118 @Override
119 public void routerAdded(LispRouterId routerId) {
120
121 }
122
123 @Override
124 public void routerRemoved(LispRouterId routerId) {
125
126 }
127
128 @Override
129 public void routerChanged(LispRouterId routerId) {
130
131 }
132
133 @Override
134 public void handleIncomingMessage(LispRouterId routerId, LispMessage msg) {
Jian Li77079332017-04-24 19:35:36 +0900135 if (providerService == null) {
136 log.warn("provider service has not been initialized");
137 return;
138 }
Jian Li7d361572017-01-13 11:39:37 +0900139
Jian Li77079332017-04-24 19:35:36 +0900140 DeviceId deviceId = DeviceId.deviceId(routerId.toString());
141 switch (msg.getType()) {
142
143 case LISP_MAP_REQUEST:
144 log.warn("LISP mapping query feature will be added when " +
145 "provider service supports it.");
146 break;
147
148 case LISP_MAP_REGISTER:
149 LispMapRegister register = (LispMapRegister) msg;
150 processMappings(deviceId, register.getMapRecords(), MAP_DATABASE);
151 break;
152
153 default:
154 log.warn("Unhandled message type: {}", msg.getType());
155 }
Jian Li7d361572017-01-13 11:39:37 +0900156 }
157
158 @Override
159 public void handleOutgoingMessage(LispRouterId routerId, LispMessage msg) {
Jian Li77d6e752017-01-29 23:24:18 +0900160 if (providerService == null) {
Jian Li77079332017-04-24 19:35:36 +0900161 log.warn("provider service has not been initialized");
Jian Li77d6e752017-01-29 23:24:18 +0900162 return;
163 }
Jian Li7d361572017-01-13 11:39:37 +0900164
Jian Li77d6e752017-01-29 23:24:18 +0900165 DeviceId deviceId = DeviceId.deviceId(routerId.toString());
166 switch (msg.getType()) {
167
168 case LISP_MAP_REPLY:
169 LispMapReply reply = (LispMapReply) msg;
Jian Lib8436bb2017-02-23 03:39:08 +0900170 processMappings(deviceId, reply.getMapRecords(), MAP_CACHE);
Jian Li77d6e752017-01-29 23:24:18 +0900171 break;
172
173 case LISP_MAP_NOTIFY:
174 LispMapNotify notify = (LispMapNotify) msg;
Jian Lib8436bb2017-02-23 03:39:08 +0900175 processMappings(deviceId, notify.getMapRecords(), MAP_DATABASE);
Jian Li77d6e752017-01-29 23:24:18 +0900176 break;
177
178 default:
179 log.warn("Unhandled message type: {}", msg.getType());
180 }
Jian Li7d361572017-01-13 11:39:37 +0900181 }
Jian Lib8436bb2017-02-23 03:39:08 +0900182
183 /**
184 * Converts map records into mapping, notifies to provider.
185 *
186 * @param deviceId device identifier
187 * @param records a collection of map records
188 * @param type MappingStore type
189 */
190 private void processMappings(DeviceId deviceId,
191 List<LispMapRecord> records,
192 MappingStore.Type type) {
193 records.forEach(r -> {
Jian Lie5aa5df2017-04-02 22:40:56 +0900194 MappingEntry me =
195 new MappingEntryBuilder(deviceId, r, deviceService).build();
Jian Lib8436bb2017-02-23 03:39:08 +0900196 providerService.mappingAdded(me, type);
197 });
198 }
Jian Li7d361572017-01-13 11:39:37 +0900199 }
200}