| /* |
| * Copyright 2016-present Open Networking Laboratory |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.onosproject.isis.controller.impl.topology; |
| |
| import org.onlab.util.Bandwidth; |
| import org.onosproject.isis.controller.topology.DeviceInformation; |
| import org.onosproject.isis.controller.topology.IsisRouter; |
| import org.onosproject.isis.controller.topology.LinkInformation; |
| import org.onosproject.isis.controller.topology.TopologyForDeviceAndLink; |
| import org.onosproject.isis.controller.topology.IsisLinkTed; |
| import org.onosproject.isis.io.isispacket.pdu.LsPdu; |
| import org.onosproject.isis.io.isispacket.tlv.IsExtendedReachability; |
| import org.onosproject.isis.io.isispacket.tlv.IsisTlv; |
| import org.onosproject.isis.io.isispacket.tlv.NeighborForExtendedIs; |
| |
| import org.onosproject.isis.io.isispacket.tlv.subtlv.TrafficEngineeringSubTlv; |
| import org.onosproject.isis.io.isispacket.tlv.subtlv.InterfaceIpAddress; |
| import org.onosproject.isis.io.isispacket.tlv.subtlv.NeighborIpAddress; |
| import org.onosproject.isis.io.isispacket.tlv.subtlv.AdministrativeGroup; |
| import org.onosproject.isis.io.isispacket.tlv.subtlv.TrafficEngineeringMetric; |
| import org.onosproject.isis.io.isispacket.tlv.subtlv.UnreservedBandwidth; |
| import org.onosproject.isis.io.isispacket.tlv.subtlv.MaximumReservableBandwidth; |
| import org.onosproject.isis.io.isispacket.tlv.subtlv.MaximumBandwidth; |
| import org.onosproject.isis.io.util.IsisConstants; |
| import org.onosproject.isis.io.util.IsisUtil; |
| import org.slf4j.Logger; |
| import org.slf4j.LoggerFactory; |
| |
| import java.util.ArrayList; |
| import java.util.LinkedHashMap; |
| import java.util.List; |
| import java.util.Map; |
| |
| /** |
| * Represents device and link topology information. |
| */ |
| public class TopologyForDeviceAndLinkImpl implements TopologyForDeviceAndLink { |
| |
| private static final Logger log = LoggerFactory.getLogger(TopologyForDeviceAndLinkImpl.class); |
| private Map<String, DeviceInformation> deviceInformationMap = new LinkedHashMap<>(); |
| private Map<String, IsisRouter> isisRouterDetails = new LinkedHashMap<>(); |
| private Map<String, DeviceInformation> deviceInformationMapForPointToPoint = new LinkedHashMap<>(); |
| private Map<String, DeviceInformation> deviceInformationMapToDelete = new LinkedHashMap<>(); |
| private Map<String, LinkInformation> addedLinkInformationMap = new LinkedHashMap<>(); |
| |
| /** |
| * Gets device information. |
| * |
| * @return device information |
| */ |
| public Map<String, DeviceInformation> deviceInformationMap() { |
| return deviceInformationMap; |
| } |
| |
| /** |
| * Gets ISIS router list information. |
| * |
| * @return router information |
| */ |
| public Map<String, IsisRouter> isisDeviceList() { |
| return isisRouterDetails; |
| } |
| |
| /** |
| * Sets device information. |
| * |
| * @param key key used to add in map |
| * @param deviceInformationMap device information instance |
| */ |
| public void setDeviceInformationMap(String key, DeviceInformation deviceInformationMap) { |
| if (deviceInformationMap != null) { |
| this.deviceInformationMap.put(key, deviceInformationMap); |
| } |
| |
| } |
| |
| /** |
| * Gets deviceInformation as map for Point-To-Point. |
| * |
| * @return deviceInformationMap |
| */ |
| public Map<String, DeviceInformation> deviceInformationMapForPointToPoint() { |
| return deviceInformationMapForPointToPoint; |
| } |
| |
| /** |
| * Sets deviceInformation as map for Point-To-Point.. |
| * |
| * @param key key used to add in map |
| * @param deviceInformationMap device information instance |
| */ |
| public void setDeviceInformationMapForPointToPoint(String key, DeviceInformation deviceInformationMap) { |
| if (deviceInformationMap != null) { |
| this.deviceInformationMapForPointToPoint.put(key, deviceInformationMap); |
| } |
| |
| } |
| |
| /** |
| * Gets deviceInformation as map. |
| * |
| * @return deviceInformationMap to delete from core |
| */ |
| public Map<String, DeviceInformation> deviceInformationMapToDelete() { |
| return deviceInformationMapToDelete; |
| } |
| |
| /** |
| * Sets device information for removal. |
| * |
| * @param key ket used to add in map |
| * @param deviceInformationMapToDelete map from device information to remove |
| */ |
| public void setDeviceInformationMapToDelete(String key, DeviceInformation deviceInformationMapToDelete) { |
| if (deviceInformationMapToDelete != null) { |
| this.deviceInformationMapToDelete.put(key, deviceInformationMapToDelete); |
| } |
| } |
| |
| /** |
| * Removes Device Information. |
| * |
| * @param key ket used to remove from map |
| */ |
| public void removeDeviceInformationMapFromDeleteMap(String key) { |
| removeDeviceInformationMap(key); |
| if (this.deviceInformationMapToDelete.containsKey(key)) { |
| this.deviceInformationMapToDelete.remove(key); |
| } |
| } |
| |
| /** |
| * Gets Device Information. |
| * |
| * @param key system id as key to store in map |
| * @return Device Information |
| */ |
| public DeviceInformation deviceInformation(String key) { |
| DeviceInformation deviceInformation = this.deviceInformationMap.get(key); |
| return deviceInformation; |
| } |
| |
| /** |
| * Removes Device Information from map. |
| * |
| * @param key key used to remove from map |
| */ |
| public void removeDeviceInformationMap(String key) { |
| if (this.deviceInformationMap.containsKey(key)) { |
| this.deviceInformationMap.remove(key); |
| } |
| } |
| |
| @Override |
| public void removeLinks(String linkId) { |
| this.addedLinkInformationMap.remove(linkId); |
| } |
| |
| /** |
| * Gets link information as map. |
| * |
| * @return link information as map |
| */ |
| public Map<String, LinkInformation> linkInformationMap() { |
| return addedLinkInformationMap; |
| } |
| |
| private LinkInformation getLinkInformation(String key) { |
| LinkInformation linkInformation = this.addedLinkInformationMap.get(key); |
| return linkInformation; |
| } |
| |
| /** |
| * Sets link information in map. |
| * |
| * @param key key used to add in map |
| * @param linkInformationMap link information instance |
| */ |
| public void setLinkInformationMap(String key, LinkInformation linkInformationMap) { |
| if (!this.addedLinkInformationMap.containsKey(key)) { |
| this.addedLinkInformationMap.put(key, linkInformationMap); |
| } |
| } |
| |
| /** |
| * Gets linkInformation as map for PointToPoint. |
| * |
| * @return linkInformationMap |
| */ |
| public Map<String, LinkInformation> linkInformationMapForPointToPoint() { |
| return addedLinkInformationMap; |
| } |
| |
| /** |
| * Sets linkInformation as map for PointToPoint. |
| * |
| * @param key key used to add in map |
| * @param linkInformationMap link information instance |
| */ |
| public void setLinkInformationMapForPointToPoint(String key, LinkInformation linkInformationMap) { |
| if (!this.addedLinkInformationMap.containsKey(key)) { |
| this.addedLinkInformationMap.put(key, linkInformationMap); |
| } |
| } |
| |
| /** |
| * Removes Link Information from linkInformationMap. |
| * |
| * @param key key used to remove in map |
| */ |
| public void removeLinkInformationMap(String key) { |
| if (this.addedLinkInformationMap.containsKey(key)) { |
| this.addedLinkInformationMap.remove(key); |
| } |
| } |
| |
| /** |
| * Returns the ISIS router instance. |
| * |
| * @param systemId system ID to get router details |
| * @return ISIS router instance |
| */ |
| public IsisRouter isisRouter(String systemId) { |
| String routerId = IsisUtil.removeTailingZeros(systemId); |
| IsisRouter isisRouter = isisRouterDetails.get(routerId); |
| if (isisRouter != null) { |
| return isisRouter; |
| } else { |
| log.debug("IsisRouter is not available"); |
| IsisRouter isisRouterCheck = new DefaultIsisRouter(); |
| isisRouterCheck.setSystemId(routerId); |
| return isisRouterCheck; |
| } |
| } |
| |
| /** |
| * Removes the ISIS router instance from map. |
| * |
| * @param systemId system ID to remove router details |
| */ |
| public void removeRouter(String systemId) { |
| String routerId = IsisUtil.removeTailingZeros(systemId); |
| isisRouterDetails.remove(systemId); |
| } |
| |
| /** |
| * Creates Device instance. |
| * |
| * @param lsPdu ISIS LSPDU instance |
| * @return isisRouter isisRouter instance |
| */ |
| public IsisRouter createDeviceInfo(LsPdu lsPdu) { |
| IsisRouter isisRouter = createIsisRouter(lsPdu); |
| |
| if (isisRouter.systemId() != null) { |
| if (isisRouter.interfaceId() == null && isisRouter.neighborRouterId() == null) { |
| isisRouter.setInterfaceId(IsisConstants.DEFAULTIP); |
| isisRouter.setNeighborRouterId(IsisConstants.DEFAULTIP); |
| isisRouterDetails.put(isisRouter.systemId(), isisRouter); |
| } |
| } |
| return isisRouter; |
| } |
| |
| /** |
| * Removes Device and Link instance. |
| * |
| * @param lsPdu ISIS LSPDU instance |
| * @return isisRouter isisRouter instance |
| */ |
| /* |
| public IsisRouter removeDeviceAndLinkInfo(LsPdu lsPdu) { |
| IsisRouter isisRouter = createIsisRouter(lsPdu); |
| return isisRouter; |
| }*/ |
| |
| /** |
| * Creates link information. |
| * |
| * @param lsPdu ls pdu instance |
| * @param ownSystemId system ID |
| * @return link information |
| */ |
| public Map<String, LinkInformation> createLinkInfo(LsPdu lsPdu, String ownSystemId) { |
| for (IsisTlv isisTlv : lsPdu.tlvs()) { |
| if (isisTlv instanceof IsExtendedReachability) { |
| IsExtendedReachability isExtendedReachability = (IsExtendedReachability) isisTlv; |
| List<NeighborForExtendedIs> neighborForExtendedIsList = isExtendedReachability.neighbours(); |
| for (NeighborForExtendedIs neighbor : neighborForExtendedIsList) { |
| String neighbourId = neighbor.neighborId(); |
| String routerId = IsisUtil.removeTailingZeros(lsPdu.lspId()); |
| if (!(neighbourId.equals(ownSystemId))) { |
| IsisRouter isisRouter = isisRouterDetails.get(neighbourId); |
| if (isisRouter != null) { |
| String linkId = "link:" + routerId + "-" + neighbourId; |
| addedLinkInformationMap.put(linkId, createLinkInformation(lsPdu, linkId, |
| routerId, neighbourId)); |
| } else { |
| createIsisRouterDummy(neighbourId); |
| String linkId = "link:" + routerId + "-" + neighbourId; |
| LinkInformation linkInformation = createLinkInformation(lsPdu, linkId, |
| routerId, neighbourId); |
| linkInformation.setAlreadyCreated(true); |
| addedLinkInformationMap.put(linkId, linkInformation); |
| } |
| } |
| |
| } |
| } |
| } |
| return addedLinkInformationMap; |
| } |
| |
| /** |
| * Removes link information. |
| * |
| * @param systemId system ID to remove link information |
| * @return updated link information |
| */ |
| public Map<String, LinkInformation> removeLinkInfo(String systemId) { |
| String routerId = IsisUtil.removeTailingZeros(systemId); |
| Map<String, LinkInformation> removeLinkInformationMap = new LinkedHashMap<>(); |
| for (String key : addedLinkInformationMap.keySet()) { |
| if (key.contains(routerId)) { |
| removeLinkInformationMap.put(key, addedLinkInformationMap.get(key)); |
| } |
| } |
| return removeLinkInformationMap; |
| } |
| |
| /** |
| * Creates link information. |
| * |
| * @param lsPdu link state pdu |
| * @param linkId link id |
| * @param localRouter local router system id |
| * @param neighborId destination router system id |
| * @return linkInformation instance |
| */ |
| private LinkInformation createLinkInformation(LsPdu lsPdu, String linkId, String localRouter, String neighborId) { |
| LinkInformation linkInformation = new DefaultIsisLinkInformation(); |
| IsisRouter isisRouter = isisRouterDetails.get(neighborId); |
| for (IsisTlv isisTlv : lsPdu.tlvs()) { |
| if (isisTlv instanceof IsExtendedReachability) { |
| IsExtendedReachability isExtendedReachability = (IsExtendedReachability) isisTlv; |
| List<NeighborForExtendedIs> neighbours = isExtendedReachability.neighbours(); |
| for (NeighborForExtendedIs teTlv : neighbours) { |
| List<TrafficEngineeringSubTlv> teSubTlvs = teTlv.teSubTlv(); |
| for (TrafficEngineeringSubTlv teSubTlv : teSubTlvs) { |
| if (teSubTlv instanceof InterfaceIpAddress) { |
| InterfaceIpAddress localIpAddress = (InterfaceIpAddress) teSubTlv; |
| linkInformation.setInterfaceIp(localIpAddress.localInterfaceIPAddress()); |
| } else if (teSubTlv instanceof NeighborIpAddress) { |
| NeighborIpAddress neighborIpAddress = (NeighborIpAddress) teSubTlv; |
| linkInformation.setNeighborIp(neighborIpAddress.neighborIPAddress()); |
| } |
| |
| } |
| } |
| } |
| } |
| linkInformation.setLinkId(linkId); |
| linkInformation.setAlreadyCreated(false); |
| linkInformation.setLinkDestinationId(neighborId); |
| linkInformation.setLinkSourceId(localRouter); |
| return linkInformation; |
| } |
| |
| /** |
| * Creates ISIS router instance. |
| * |
| * @param lsPdu lsp instance |
| * @return isisRouter instance |
| */ |
| private IsisRouter createIsisRouter(LsPdu lsPdu) { |
| IsisRouter isisRouter = new DefaultIsisRouter(); |
| if (IsisUtil.checkIsDis(lsPdu.lspId())) { |
| isisRouter.setDis(true); |
| } else { |
| isisRouter.setDis(false); |
| } |
| isisRouter.setSystemId(IsisUtil.removeTailingZeros(lsPdu.lspId())); |
| for (IsisTlv isisTlv : lsPdu.tlvs()) { |
| if (isisTlv instanceof IsExtendedReachability) { |
| IsExtendedReachability isExtendedReachability = (IsExtendedReachability) isisTlv; |
| List<NeighborForExtendedIs> neighbours = isExtendedReachability.neighbours(); |
| for (NeighborForExtendedIs teTlv : neighbours) { |
| List<TrafficEngineeringSubTlv> teSubTlvs = teTlv.teSubTlv(); |
| for (TrafficEngineeringSubTlv teSubTlv : teSubTlvs) { |
| if (teSubTlv instanceof InterfaceIpAddress) { |
| InterfaceIpAddress localIpAddress = (InterfaceIpAddress) teSubTlv; |
| isisRouter.setInterfaceId(localIpAddress.localInterfaceIPAddress()); |
| } else if (teSubTlv instanceof NeighborIpAddress) { |
| NeighborIpAddress neighborIpAddress = (NeighborIpAddress) teSubTlv; |
| isisRouter.setNeighborRouterId(neighborIpAddress.neighborIPAddress()); |
| } |
| |
| } |
| } |
| } |
| } |
| return isisRouter; |
| } |
| |
| /** |
| * Creates ISIS router instance. |
| * |
| * @param systemId system ID |
| * @return isisRouter instance |
| */ |
| private IsisRouter createIsisRouterDummy(String systemId) { |
| IsisRouter isisRouter = new DefaultIsisRouter(); |
| isisRouter.setSystemId(systemId); |
| isisRouter.setDis(false); |
| isisRouter.setInterfaceId(IsisConstants.DEFAULTIP); |
| isisRouter.setNeighborRouterId(IsisConstants.DEFAULTIP); |
| |
| return isisRouter; |
| } |
| |
| /** |
| * Creates the ISIS link TED information. |
| * |
| * @param lsPdu link state PDU |
| * @return isisLinkTed |
| */ |
| public IsisLinkTed createIsisLinkTedInfo(LsPdu lsPdu) { |
| IsisLinkTed isisLinkTed = new DefaultIsisLinkTed(); |
| for (IsisTlv isisTlv : lsPdu.tlvs()) { |
| if (isisTlv instanceof IsExtendedReachability) { |
| IsExtendedReachability isExtendedReachability = (IsExtendedReachability) isisTlv; |
| List<NeighborForExtendedIs> neighbours = isExtendedReachability.neighbours(); |
| for (NeighborForExtendedIs teTlv : neighbours) { |
| List<TrafficEngineeringSubTlv> teSubTlvs = teTlv.teSubTlv(); |
| for (TrafficEngineeringSubTlv teSubTlv : teSubTlvs) { |
| if (teSubTlv instanceof AdministrativeGroup) { |
| AdministrativeGroup ag = (AdministrativeGroup) teSubTlv; |
| isisLinkTed.setAdministrativeGroup(ag.administrativeGroup()); |
| } |
| if (teSubTlv instanceof InterfaceIpAddress) { |
| InterfaceIpAddress localIpAddress = (InterfaceIpAddress) teSubTlv; |
| isisLinkTed.setIpv4InterfaceAddress(localIpAddress.localInterfaceIPAddress()); |
| } |
| if (teSubTlv instanceof NeighborIpAddress) { |
| NeighborIpAddress neighborIpAddress = (NeighborIpAddress) teSubTlv; |
| isisLinkTed.setIpv4NeighborAddress(neighborIpAddress.neighborIPAddress()); |
| } |
| if (teSubTlv instanceof TrafficEngineeringMetric) { |
| TrafficEngineeringMetric teM = (TrafficEngineeringMetric) teSubTlv; |
| isisLinkTed.setTeDefaultMetric(teM.getTrafficEngineeringMetricValue()); |
| } |
| if (teSubTlv instanceof MaximumBandwidth) { |
| MaximumBandwidth maxLinkBandwidth = (MaximumBandwidth) teSubTlv; |
| isisLinkTed.setMaximumLinkBandwidth( |
| Bandwidth.bps(maxLinkBandwidth.getMaximumBandwidthValue())); |
| } |
| if (teSubTlv instanceof MaximumReservableBandwidth) { |
| MaximumReservableBandwidth maxReservableBw = (MaximumReservableBandwidth) teSubTlv; |
| isisLinkTed.setMaximumReservableLinkBandwidth( |
| Bandwidth.bps(maxReservableBw.getMaximumBandwidthValue())); |
| } |
| if (teSubTlv instanceof UnreservedBandwidth) { |
| UnreservedBandwidth unReservedBandwidth = (UnreservedBandwidth) teSubTlv; |
| List<Bandwidth> bandwidthList = new ArrayList<>(); |
| List<Float> unReservedBandwidthList = unReservedBandwidth.unReservedBandwidthValue(); |
| for (Float unReservedBandwidthFloatValue : unReservedBandwidthList) { |
| Bandwidth bandwidth = Bandwidth.bps(unReservedBandwidthFloatValue); |
| bandwidthList.add(bandwidth); |
| } |
| isisLinkTed.setUnreservedBandwidth(bandwidthList); |
| } |
| } |
| } |
| } |
| } |
| return isisLinkTed; |
| } |
| } |