blob: 8730814c4eef4dd480ca981ca9f42e4d71d9187b [file] [log] [blame]
sunish vk7bdf4d42016-06-24 12:29:43 +05301/*
2* Copyright 2016-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.isis.controller.impl;
17
18import org.onlab.packet.Ip4Address;
19import org.onlab.util.Bandwidth;
20import org.onosproject.isis.controller.IsisNetworkType;
21import org.onosproject.isis.controller.LspWrapper;
22import org.onosproject.isis.controller.impl.topology.DefaultIsisLink;
23import org.onosproject.isis.controller.impl.topology.DefaultIsisLinkInformation;
24import org.onosproject.isis.controller.impl.topology.DefaultIsisLinkTed;
25import org.onosproject.isis.controller.impl.topology.DefaultIsisRouter;
26import org.onosproject.isis.controller.impl.topology.TopologyForDeviceAndLinkImpl;
27import org.onosproject.isis.controller.topology.IsisLink;
28import org.onosproject.isis.controller.topology.IsisLinkTed;
29import org.onosproject.isis.controller.topology.IsisRouter;
30import org.onosproject.isis.controller.topology.LinkInformation;
31import org.onosproject.isis.io.isispacket.pdu.LsPdu;
32import org.onosproject.isis.io.isispacket.tlv.IsExtendedReachability;
33import org.onosproject.isis.io.isispacket.tlv.IsisTlv;
34import org.onosproject.isis.io.isispacket.tlv.NeighborForExtendedIs;
35import org.onosproject.isis.io.isispacket.tlv.subtlv.AdministrativeGroup;
36import org.onosproject.isis.io.isispacket.tlv.subtlv.InterfaceIpAddress;
37import org.onosproject.isis.io.isispacket.tlv.subtlv.MaximumBandwidth;
38import org.onosproject.isis.io.isispacket.tlv.subtlv.MaximumReservableBandwidth;
39import org.onosproject.isis.io.isispacket.tlv.subtlv.NeighborIpAddress;
40import org.onosproject.isis.io.isispacket.tlv.subtlv.TrafficEngineeringMetric;
41import org.onosproject.isis.io.isispacket.tlv.subtlv.TrafficEngineeringSubTlv;
42import org.onosproject.isis.io.isispacket.tlv.subtlv.UnreservedBandwidth;
43import org.onosproject.isis.io.util.IsisConstants;
44import org.onosproject.isis.io.util.IsisUtil;
45import org.slf4j.Logger;
46import org.slf4j.LoggerFactory;
47
48import java.util.ArrayList;
49import java.util.LinkedHashMap;
50import java.util.List;
51import java.util.Map;
52import java.util.concurrent.BlockingQueue;
53
54/**
55 * Representation of LSP event consumer.
56 */
57public class LspEventConsumer implements Runnable {
58 private static final Logger log = LoggerFactory.getLogger(LspEventConsumer.class);
59 private BlockingQueue queue = null;
60 private Controller controller = null;
61 private TopologyForDeviceAndLinkImpl deviceAndLink = new TopologyForDeviceAndLinkImpl();
62 private Map<String, IsisRouter> isisRouterDetails = new LinkedHashMap<>();
63
64 /**
65 * Creates an instance of this.
66 *
67 * @param queue blocking queue instance
68 * @param controller controller instance
69 */
70 public LspEventConsumer(BlockingQueue queue, Controller controller) {
71 this.queue = queue;
72 this.controller = controller;
73 }
74
75 @Override
76 public void run() {
77 try {
78 while (true) {
79 if (!queue.isEmpty()) {
80 LspWrapper wrapper = (LspWrapper) queue.take();
81 LsPdu lsPdu = (LsPdu) wrapper.lsPdu();
82 if (wrapper.lspProcessing().equals(IsisConstants.LSPREMOVED)) {
83 callTopologyToRemoveInfo(lsPdu);
84 } else if (wrapper.lspProcessing().equals(IsisConstants.LSPADDED)) {
85 callTopologyToSendInfo(lsPdu, wrapper.isisInterface().networkType(),
86 wrapper.isisInterface().systemId() + ".00");
87 }
88 }
89 }
90 } catch (Exception e) {
91 log.debug("Error::LspsForProvider::{}", e.getMessage());
92 }
93 }
94
95 /**
96 * Sends topology information to core.
97 *
98 * @param lsPdu ls pdu instance
99 * @param isisNetworkType ISIS network type
100 * @param ownSystemId own system ID
101 */
102 private void callTopologyToSendInfo(LsPdu lsPdu, IsisNetworkType isisNetworkType,
103 String ownSystemId) {
104 if ((lsPdu.lspId().equals(ownSystemId + "-00"))) {
105 return;
106 }
107 sendDeviceInfo(createDeviceInfo(lsPdu));
108
109 for (IsisTlv isisTlv : lsPdu.tlvs()) {
110 if (isisTlv instanceof IsExtendedReachability) {
111 IsExtendedReachability isExtendedReachability = (IsExtendedReachability) isisTlv;
112 List<NeighborForExtendedIs> neighbours = isExtendedReachability.neighbours();
113 for (NeighborForExtendedIs teTlv : neighbours) {
114 String neighbor = teTlv.neighborId();
115 IsisRouter isisRouter = isisRouterDetails.get(neighbor);
116 if (isisRouter != null) {
117 IsisRouter sourceRouter = isisRouterDetails.get(IsisUtil.removeTailingZeros(lsPdu.lspId()));
118 IsisRouter destinationRouter = isisRouter;
119 if (sourceRouter.isDis()) {
120 LinkInformation linkInformation = createLinkInfo(sourceRouter.systemId(),
121 destinationRouter.systemId(),
122 sourceRouter.interfaceId(),
123 destinationRouter.interfaceId(), lsPdu);
124 controller.addLinkDetails(createIsisLink(linkInformation, lsPdu));
125 } else if (destinationRouter.isDis()) {
126 LinkInformation linkInformation1 = createLinkInfo(destinationRouter.systemId(),
127 sourceRouter.systemId(),
128 destinationRouter.interfaceId(),
129 sourceRouter.interfaceId(), lsPdu);
130 controller.addLinkDetails(createIsisLink(linkInformation1, lsPdu));
131 } else {
132 LinkInformation linkInformation = createLinkInfo(sourceRouter.systemId(),
133 destinationRouter.systemId(),
134 sourceRouter.interfaceId(),
135 destinationRouter.interfaceId(), lsPdu);
136 controller.addLinkDetails(createIsisLink(linkInformation, lsPdu));
137 LinkInformation linkInformation1 = createLinkInfo(destinationRouter.systemId(),
138 sourceRouter.systemId(),
139 destinationRouter.interfaceId(),
140 sourceRouter.interfaceId(), lsPdu);
141 controller.addLinkDetails(createIsisLink(linkInformation1, lsPdu));
142 }
143 }
144 }
145 }
146 }
147 }
148
149 /**
150 * Removes topology information from core.
151 *
152 * @param lsPdu ls pdu instance
153 */
154 private void callTopologyToRemoveInfo(LsPdu lsPdu) {
155 String routerId = IsisUtil.removeTailingZeros(lsPdu.lspId());
156 IsisRouter isisRouter = isisRouterDetails.get(routerId);
157 removeDeviceInfo(isisRouter);
158 removeLinkInfo(lsPdu);
159 }
160
161 /**
162 * Sends the device information to topology provider.
163 *
164 * @param isisRouter ISIS router instance
165 */
166 private void sendDeviceInfo(IsisRouter isisRouter) {
167 if (isisRouter.systemId() != null) {
168 controller.addDeviceDetails(isisRouter);
169 }
170 }
171
172 /**
173 * Creates Device instance.
174 *
175 * @param lsPdu ISIS LSPDU instance
176 * @return isisRouter isisRouter instance
177 */
178 public IsisRouter createDeviceInfo(LsPdu lsPdu) {
179 IsisRouter isisRouter = createIsisRouter(lsPdu);
180 if (isisRouter.systemId() != null) {
181 isisRouterDetails.put(isisRouter.systemId(), isisRouter);
182 }
183 return isisRouter;
184 }
185
186 /**
187 * Creates ISIS router instance.
188 *
189 * @param lsPdu lsp instance
190 * @return isisRouter instance
191 */
192 private IsisRouter createIsisRouter(LsPdu lsPdu) {
193 IsisRouter isisRouter = new DefaultIsisRouter();
194 if (IsisUtil.checkIsDis(lsPdu.lspId())) {
195 isisRouter.setDis(true);
196 } else {
197 isisRouter.setDis(false);
198 }
199 isisRouter.setSystemId(IsisUtil.removeTailingZeros(lsPdu.lspId()));
200 for (IsisTlv isisTlv : lsPdu.tlvs()) {
201 if (isisTlv instanceof IsExtendedReachability) {
202 IsExtendedReachability isExtendedReachability = (IsExtendedReachability) isisTlv;
203 List<NeighborForExtendedIs> neighbours = isExtendedReachability.neighbours();
204 for (NeighborForExtendedIs teTlv : neighbours) {
205 List<TrafficEngineeringSubTlv> teSubTlvs = teTlv.teSubTlv();
206 for (TrafficEngineeringSubTlv teSubTlv : teSubTlvs) {
207 if (teSubTlv instanceof InterfaceIpAddress) {
208 InterfaceIpAddress localIpAddress = (InterfaceIpAddress) teSubTlv;
209 isisRouter.setInterfaceId(localIpAddress.localInterfaceIPAddress());
210 } else if (teSubTlv instanceof NeighborIpAddress) {
211 NeighborIpAddress neighborIpAddress = (NeighborIpAddress) teSubTlv;
212 isisRouter.setNeighborRouterId(neighborIpAddress.neighborIPAddress());
213 }
214
215 }
216 }
217 }
218 }
219 if (isisRouter.interfaceId() == null) {
220 isisRouter.setInterfaceId(IsisConstants.DEFAULTIP);
221 }
222 if (isisRouter.neighborRouterId() == null) {
223 isisRouter.setNeighborRouterId(IsisConstants.DEFAULTIP);
224 }
225 return isisRouter;
226 }
227
228 /**
229 * Creates link information.
230 *
231 * @param localSystemId local system ID
232 * @param remoteSystemId remote system ID
233 * @return link information
234 * @param interfaceIp interface address
235 * @param neighborIp neighbor address
236 * @param lsPdu link state PDU instance
237 * @return link information instance
238 */
239 public LinkInformation createLinkInfo(String localSystemId, String remoteSystemId,
240 Ip4Address interfaceIp, Ip4Address neighborIp,
241 LsPdu lsPdu) {
242
243 String linkId = "link:" + localSystemId + "-" + remoteSystemId;
244 LinkInformation linkInformation = new DefaultIsisLinkInformation();
245 linkInformation.setInterfaceIp(interfaceIp);
246 linkInformation.setNeighborIp(neighborIp);
247 linkInformation.setLinkId(linkId);
248 linkInformation.setAlreadyCreated(false);
249 linkInformation.setLinkDestinationId(remoteSystemId);
250 linkInformation.setLinkSourceId(localSystemId);
251
252 return linkInformation;
253 }
254
255 /**
256 * Removes the device information from topology provider.
257 *
258 * @param isisRouter ISIS router instance
259 */
260 private void removeDeviceInfo(IsisRouter isisRouter) {
261 if (isisRouter.systemId() != null) {
262 controller.removeDeviceDetails(isisRouter);
263 }
264 isisRouterDetails.remove(isisRouter.systemId());
265 }
266
267
268 /**
269 * Removes the link information from topology provider.
270 *
271 * @param lsPdu ls pdu instance
272 */
273 private void removeLinkInfo(LsPdu lsPdu) {
274 Map<String, LinkInformation> linkInformationList = deviceAndLink.removeLinkInfo(lsPdu.lspId());
275 for (String key : linkInformationList.keySet()) {
276 LinkInformation linkInformation = linkInformationList.get(key);
277 controller.removeLinkDetails(createIsisLink(linkInformation, lsPdu));
278 }
279 }
280
281 /**
282 * Creates ISIS link instance.
283 *
284 * @param linkInformation link information instance
285 * @return isisLink instance
286 */
287 private IsisLink createIsisLink(LinkInformation linkInformation, LsPdu lsPdu) {
288 IsisLink isisLink = new DefaultIsisLink();
289 isisLink.setLocalSystemId(linkInformation.linkSourceId());
290 isisLink.setRemoteSystemId(linkInformation.linkDestinationId());
291 isisLink.setInterfaceIp(linkInformation.interfaceIp());
292 isisLink.setNeighborIp(linkInformation.neighborIp());
293 isisLink.setLinkTed(createIsisLinkTedInfo(lsPdu));
294 return isisLink;
295 }
296
297 /**
298 * Creates the ISIS link TED information.
299 *
300 * @param lsPdu link state PDU
301 * @return isisLinkTed
302 */
303 public IsisLinkTed createIsisLinkTedInfo(LsPdu lsPdu) {
304 IsisLinkTed isisLinkTed = new DefaultIsisLinkTed();
305 for (IsisTlv isisTlv : lsPdu.tlvs()) {
306 if (isisTlv instanceof IsExtendedReachability) {
307 IsExtendedReachability isExtendedReachability = (IsExtendedReachability) isisTlv;
308 List<NeighborForExtendedIs> neighbours = isExtendedReachability.neighbours();
309 for (NeighborForExtendedIs teTlv : neighbours) {
310 List<TrafficEngineeringSubTlv> teSubTlvs = teTlv.teSubTlv();
311 for (TrafficEngineeringSubTlv teSubTlv : teSubTlvs) {
312 if (teSubTlv instanceof AdministrativeGroup) {
313 AdministrativeGroup ag = (AdministrativeGroup) teSubTlv;
314 isisLinkTed.setAdministrativeGroup(ag.administrativeGroup());
315 }
316 if (teSubTlv instanceof InterfaceIpAddress) {
317 InterfaceIpAddress localIpAddress = (InterfaceIpAddress) teSubTlv;
318 isisLinkTed.setIpv4InterfaceAddress(localIpAddress.localInterfaceIPAddress());
319 }
320 if (teSubTlv instanceof NeighborIpAddress) {
321 NeighborIpAddress neighborIpAddress = (NeighborIpAddress) teSubTlv;
322 isisLinkTed.setIpv4NeighborAddress(neighborIpAddress.neighborIPAddress());
323 }
324 if (teSubTlv instanceof TrafficEngineeringMetric) {
325 TrafficEngineeringMetric teM = (TrafficEngineeringMetric) teSubTlv;
326 isisLinkTed.setTeDefaultMetric(teM.getTrafficEngineeringMetricValue());
327 }
328 if (teSubTlv instanceof MaximumBandwidth) {
329 MaximumBandwidth maxLinkBandwidth = (MaximumBandwidth) teSubTlv;
330 isisLinkTed.setMaximumLinkBandwidth(
331 Bandwidth.bps(maxLinkBandwidth.getMaximumBandwidthValue()));
332 }
333 if (teSubTlv instanceof MaximumReservableBandwidth) {
334 MaximumReservableBandwidth maxReservableBw = (MaximumReservableBandwidth) teSubTlv;
335 isisLinkTed.setMaximumReservableLinkBandwidth(
336 Bandwidth.bps(maxReservableBw.getMaximumBandwidthValue()));
337 }
338 if (teSubTlv instanceof UnreservedBandwidth) {
339 UnreservedBandwidth unReservedBandwidth = (UnreservedBandwidth) teSubTlv;
340 List<Bandwidth> bandwidthList = new ArrayList<>();
341 List<Float> unReservedBandwidthList = unReservedBandwidth.unReservedBandwidthValue();
342 for (Float unReservedBandwidthFloatValue : unReservedBandwidthList) {
343 Bandwidth bandwidth = Bandwidth.bps(unReservedBandwidthFloatValue);
344 bandwidthList.add(bandwidth);
345 }
346 isisLinkTed.setUnreservedBandwidth(bandwidthList);
347 }
348 }
349 }
350 }
351 }
352 return isisLinkTed;
353 }
354}