Manikandan K
Committed by Brian O'Connor

ONOS-4107: ISIS Provider - Bug Fixes

Change-Id: I1945f614c02a39326d22e268fbb015e50d075368
......@@ -122,4 +122,11 @@ public interface IsisLsdb {
* @param l2LspSeqNo link state sequence number
*/
void setL2LspSeqNo(int l2LspSeqNo);
/**
* Removes topology information when neighbor down.
*
* @param neighbor ISIS neighbor instance
* @param isisInterface ISIS interface instance
*/
void removeTopology(IsisNeighbor neighbor, IsisInterface isisInterface);
}
\ No newline at end of file
......
......@@ -356,6 +356,8 @@ public class DefaultIsisNeighbor implements IsisNeighbor {
stopInactivityTimeCheck();
stopHoldingTimeCheck();
isisInterface.removeNeighbor(this);
isisInterface.isisLsdb().removeTopology(this, isisInterface);
}
/**
......
......@@ -15,9 +15,13 @@
*/
package org.onosproject.isis.controller.impl;
import org.onlab.packet.Ip4Address;
import org.onlab.util.Bandwidth;
import org.onosproject.isis.controller.IsisNetworkType;
import org.onosproject.isis.controller.LspWrapper;
import org.onosproject.isis.controller.impl.topology.DefaultIsisLink;
import org.onosproject.isis.controller.impl.topology.DefaultIsisLinkInformation;
import org.onosproject.isis.controller.impl.topology.DefaultIsisLinkTed;
import org.onosproject.isis.controller.impl.topology.DefaultIsisRouter;
import org.onosproject.isis.controller.impl.topology.TopologyForDeviceAndLinkImpl;
import org.onosproject.isis.controller.topology.IsisLink;
......@@ -25,16 +29,24 @@ import org.onosproject.isis.controller.topology.IsisLinkTed;
import org.onosproject.isis.controller.topology.IsisRouter;
import org.onosproject.isis.controller.topology.LinkInformation;
import org.onosproject.isis.io.isispacket.pdu.LsPdu;
import org.onosproject.isis.io.isispacket.tlv.IpExtendedReachabilityTlv;
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.AdministrativeGroup;
import org.onosproject.isis.io.isispacket.tlv.subtlv.InterfaceIpAddress;
import org.onosproject.isis.io.isispacket.tlv.subtlv.MaximumBandwidth;
import org.onosproject.isis.io.isispacket.tlv.subtlv.MaximumReservableBandwidth;
import org.onosproject.isis.io.isispacket.tlv.subtlv.NeighborIpAddress;
import org.onosproject.isis.io.isispacket.tlv.subtlv.TrafficEngineeringMetric;
import org.onosproject.isis.io.isispacket.tlv.subtlv.TrafficEngineeringSubTlv;
import org.onosproject.isis.io.isispacket.tlv.subtlv.UnreservedBandwidth;
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;
import java.util.concurrent.BlockingQueue;
......@@ -44,10 +56,10 @@ import java.util.concurrent.BlockingQueue;
*/
public class LspEventConsumer implements Runnable {
private static final Logger log = LoggerFactory.getLogger(LspEventConsumer.class);
public static List<LsPdu> lsPdus = new ArrayList<>();
private BlockingQueue queue = null;
private Controller controller = null;
private TopologyForDeviceAndLinkImpl deviceAndLink = new TopologyForDeviceAndLinkImpl();
private Map<String, IsisRouter> isisRouterDetails = new LinkedHashMap<>();
/**
* Creates an instance of this.
......@@ -70,14 +82,8 @@ public class LspEventConsumer implements Runnable {
if (wrapper.lspProcessing().equals(IsisConstants.LSPREMOVED)) {
callTopologyToRemoveInfo(lsPdu);
} else if (wrapper.lspProcessing().equals(IsisConstants.LSPADDED)) {
for (IsisTlv isisTlv : lsPdu.tlvs()) {
if ((isisTlv instanceof IpExtendedReachabilityTlv) ||
(isisTlv instanceof IsExtendedReachability)) {
callTopologyToSendInfo(lsPdu, wrapper.isisInterface().networkType(),
wrapper.isisInterface().systemId() + ".00");
break;
}
}
}
}
}
......@@ -91,36 +97,50 @@ public class LspEventConsumer implements Runnable {
*
* @param lsPdu ls pdu instance
* @param isisNetworkType ISIS network type
* @param ownSystemId own system ID
*/
private void callTopologyToSendInfo(LsPdu lsPdu, IsisNetworkType isisNetworkType,
String ownSystemId) {
if ((lsPdu.lspId().equals(ownSystemId + "-00"))) {
return;
}
if (isisNetworkType.equals(IsisNetworkType.BROADCAST)) {
sendDeviceInfo(lsPdu);
boolean isDis = IsisUtil.checkIsDis(lsPdu.lspId());
if (isDis) {
sendLinkInfo(lsPdu, ownSystemId);
}
} else if (isisNetworkType.equals(IsisNetworkType.P2P)) {
sendDeviceInfo(lsPdu);
for (LsPdu wrapper : lsPdus) {
LsPdu lsPduStored = wrapper;
List<String> neStringList = neighborList(lsPduStored, ownSystemId);
String lspId = IsisUtil.removeTailingZeros(lsPdu.lspId());
if (neStringList.contains(lspId)) {
sendLinkInfo(lsPduStored, ownSystemId);
}
}
List<String> neStringList = neighborList(lsPdu, ownSystemId);
Map<String, IsisRouter> routerPresence = deviceAndLink.isisDeviceList();
for (String neighbor : neStringList) {
IsisRouter isisRouter = routerPresence.get(neighbor);
sendDeviceInfo(createDeviceInfo(lsPdu));
for (IsisTlv isisTlv : lsPdu.tlvs()) {
if (isisTlv instanceof IsExtendedReachability) {
IsExtendedReachability isExtendedReachability = (IsExtendedReachability) isisTlv;
List<NeighborForExtendedIs> neighbours = isExtendedReachability.neighbours();
for (NeighborForExtendedIs teTlv : neighbours) {
String neighbor = teTlv.neighborId();
IsisRouter isisRouter = isisRouterDetails.get(neighbor);
if (isisRouter != null) {
sendLinkInfo(lsPdu, ownSystemId);
IsisRouter sourceRouter = isisRouterDetails.get(IsisUtil.removeTailingZeros(lsPdu.lspId()));
IsisRouter destinationRouter = isisRouter;
if (sourceRouter.isDis()) {
LinkInformation linkInformation = createLinkInfo(sourceRouter.systemId(),
destinationRouter.systemId(),
sourceRouter.interfaceId(),
destinationRouter.interfaceId(), lsPdu);
controller.addLinkDetails(createIsisLink(linkInformation, lsPdu));
} else if (destinationRouter.isDis()) {
LinkInformation linkInformation1 = createLinkInfo(destinationRouter.systemId(),
sourceRouter.systemId(),
destinationRouter.interfaceId(),
sourceRouter.interfaceId(), lsPdu);
controller.addLinkDetails(createIsisLink(linkInformation1, lsPdu));
} else {
lsPdus.add(lsPdu);
LinkInformation linkInformation = createLinkInfo(sourceRouter.systemId(),
destinationRouter.systemId(),
sourceRouter.interfaceId(),
destinationRouter.interfaceId(), lsPdu);
controller.addLinkDetails(createIsisLink(linkInformation, lsPdu));
LinkInformation linkInformation1 = createLinkInfo(destinationRouter.systemId(),
sourceRouter.systemId(),
destinationRouter.interfaceId(),
sourceRouter.interfaceId(), lsPdu);
controller.addLinkDetails(createIsisLink(linkInformation1, lsPdu));
}
}
}
}
}
......@@ -132,7 +152,8 @@ public class LspEventConsumer implements Runnable {
* @param lsPdu ls pdu instance
*/
private void callTopologyToRemoveInfo(LsPdu lsPdu) {
IsisRouter isisRouter = deviceAndLink.isisRouter(lsPdu.lspId());
String routerId = IsisUtil.removeTailingZeros(lsPdu.lspId());
IsisRouter isisRouter = isisRouterDetails.get(routerId);
removeDeviceInfo(isisRouter);
removeLinkInfo(lsPdu);
}
......@@ -140,55 +161,98 @@ public class LspEventConsumer implements Runnable {
/**
* Sends the device information to topology provider.
*
* @param lsPdu ls pdu instance
* @param isisRouter ISIS router instance
*/
private void sendDeviceInfo(LsPdu lsPdu) {
IsisRouter isisRouter = deviceAndLink.createDeviceInfo(lsPdu);
private void sendDeviceInfo(IsisRouter isisRouter) {
if (isisRouter.systemId() != null) {
controller.addDeviceDetails(isisRouter);
}
}
/**
* Returns the list of neighbors.
* Creates Device instance.
*
* @param lsPdu link state Pdu
* @return neighbor list
* @param lsPdu ISIS LSPDU instance
* @return isisRouter isisRouter instance
*/
private List<String> neighborList(LsPdu lsPdu, String ownSystemId) {
List<String> neighbourList = new ArrayList<>();
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();
if (!(neighbourId.equals(ownSystemId))) {
neighbourList.add(neighbourId);
}
}
}
public IsisRouter createDeviceInfo(LsPdu lsPdu) {
IsisRouter isisRouter = createIsisRouter(lsPdu);
if (isisRouter.systemId() != null) {
isisRouterDetails.put(isisRouter.systemId(), isisRouter);
}
return neighbourList;
return isisRouter;
}
/**
* Creates ISIS router instance.
*
* @param systemId system ID
* @param lsPdu lsp instance
* @return isisRouter instance
*/
private IsisRouter createIsisRouterDummy(String systemId) {
private IsisRouter createIsisRouter(LsPdu lsPdu) {
IsisRouter isisRouter = new DefaultIsisRouter();
isisRouter.setSystemId(systemId);
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());
}
}
}
}
}
if (isisRouter.interfaceId() == null) {
isisRouter.setInterfaceId(IsisConstants.DEFAULTIP);
}
if (isisRouter.neighborRouterId() == null) {
isisRouter.setNeighborRouterId(IsisConstants.DEFAULTIP);
}
return isisRouter;
}
/**
* Creates link information.
*
* @param localSystemId local system ID
* @param remoteSystemId remote system ID
* @return link information
* @param interfaceIp interface address
* @param neighborIp neighbor address
* @param lsPdu link state PDU instance
* @return link information instance
*/
public LinkInformation createLinkInfo(String localSystemId, String remoteSystemId,
Ip4Address interfaceIp, Ip4Address neighborIp,
LsPdu lsPdu) {
String linkId = "link:" + localSystemId + "-" + remoteSystemId;
LinkInformation linkInformation = new DefaultIsisLinkInformation();
linkInformation.setInterfaceIp(interfaceIp);
linkInformation.setNeighborIp(neighborIp);
linkInformation.setLinkId(linkId);
linkInformation.setAlreadyCreated(false);
linkInformation.setLinkDestinationId(remoteSystemId);
linkInformation.setLinkSourceId(localSystemId);
return linkInformation;
}
/**
* Removes the device information from topology provider.
*
* @param isisRouter ISIS router instance
......@@ -197,26 +261,9 @@ public class LspEventConsumer implements Runnable {
if (isisRouter.systemId() != null) {
controller.removeDeviceDetails(isisRouter);
}
deviceAndLink.removeRouter(isisRouter.systemId());
isisRouterDetails.remove(isisRouter.systemId());
}
/**
* Sends the link information to topology provider.
*
* @param lsPdu ls pdu instance
*/
private void sendLinkInfo(LsPdu lsPdu, String ownSystemId) {
Map<String, LinkInformation> linkInformationList = deviceAndLink.createLinkInfo(lsPdu, ownSystemId);
for (String key : linkInformationList.keySet()) {
LinkInformation linkInformation = linkInformationList.get(key);
if (linkInformation.isAlreadyCreated()) {
controller.addDeviceDetails(createIsisRouterDummy(linkInformation.linkDestinationId()));
controller.addLinkDetails(createIsisLink(linkInformation, lsPdu));
} else {
controller.addLinkDetails(createIsisLink(linkInformation, lsPdu));
}
}
}
/**
* Removes the link information from topology provider.
......@@ -243,18 +290,65 @@ public class LspEventConsumer implements Runnable {
isisLink.setRemoteSystemId(linkInformation.linkDestinationId());
isisLink.setInterfaceIp(linkInformation.interfaceIp());
isisLink.setNeighborIp(linkInformation.neighborIp());
isisLink.setLinkTed(createLinkTedInfo(lsPdu));
isisLink.setLinkTed(createIsisLinkTedInfo(lsPdu));
return isisLink;
}
/**
* Creates the link TED information.
* Creates the ISIS link TED information.
*
* @param lsPdu link state PDU
* @return isisLinkTed
*/
private IsisLinkTed createLinkTedInfo(LsPdu lsPdu) {
IsisLinkTed isisLinkTed = deviceAndLink.createIsisLinkTedInfo(lsPdu);
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;
}
}
\ No newline at end of file
......
......@@ -21,7 +21,9 @@ import org.onosproject.isis.controller.IsisLsdb;
import org.onosproject.isis.controller.IsisLsdbAge;
import org.onosproject.isis.controller.IsisLspBin;
import org.onosproject.isis.controller.IsisMessage;
import org.onosproject.isis.controller.IsisNeighbor;
import org.onosproject.isis.controller.IsisPduType;
import org.onosproject.isis.controller.IsisRouterType;
import org.onosproject.isis.controller.LspWrapper;
import org.onosproject.isis.controller.impl.Controller;
import org.onosproject.isis.controller.impl.LspEventConsumer;
......@@ -394,4 +396,39 @@ public class DefaultIsisLsdb implements IsisLsdb {
log.debug("Added LSp In Blocking queue: {}", lspWrapper);
}
}
/**
* Removes topology information when neighbor down.
*
* @param neighbor ISIS neighbor instance
* @param isisInterface ISIS interface instance
*/
public void removeTopology(IsisNeighbor neighbor, IsisInterface isisInterface) {
String lspKey = neighbor.neighborSystemId() + ".00-00";
LspWrapper lspWrapper = null;
switch (IsisRouterType.get(isisInterface.reservedPacketCircuitType())) {
case L1:
lspWrapper = findLsp(IsisPduType.L1LSPDU, lspKey);
break;
case L2:
lspWrapper = findLsp(IsisPduType.L2LSPDU, lspKey);
break;
case L1L2:
lspWrapper = findLsp(IsisPduType.L1LSPDU, lspKey);
if (lspWrapper == null) {
lspWrapper = findLsp(IsisPduType.L2LSPDU, lspKey);
}
break;
default:
log.debug("Unknown type");
}
try {
if (lspWrapper != null) {
lspWrapper.setLspProcessing(IsisConstants.LSPREMOVED);
lspForProviderQueue.put(lspWrapper);
}
} catch (Exception e) {
log.debug("Added LSp In Blocking queue: {}", lspWrapper);
}
}
}
\ No newline at end of file
......
......@@ -52,6 +52,7 @@ import org.onosproject.net.link.LinkDescription;
import org.onosproject.net.link.LinkProvider;
import org.onosproject.net.link.LinkProviderRegistry;
import org.onosproject.net.link.LinkProviderService;
import org.onosproject.net.link.LinkService;
import org.onosproject.net.provider.AbstractProvider;
import org.onosproject.net.provider.ProviderId;
import org.slf4j.Logger;
......@@ -86,6 +87,8 @@ public class IsisTopologyProvider extends AbstractProvider implements DeviceProv
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected NetworkConfigService networkConfigService;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected LinkService linkService;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected IsisController controller;
//This Interface that defines how this provider can interact with the core.
private LinkProviderService linkProviderService;
......@@ -155,8 +158,14 @@ public class IsisTopologyProvider extends AbstractProvider implements DeviceProv
String localSystemId = isisLink.localSystemId();
String remoteSystemId = isisLink.remoteSystemId();
//Changing of port numbers
srcAddress = isisLink.interfaceIp().toInt();
dstAddress = isisLink.neighborIp().toInt();
if (isisLink.interfaceIp() != null) {
//srcAddress = isisLink.interfaceIp().toInt();
srcAddress = (long) Long.parseUnsignedLong(Integer.toBinaryString(isisLink.interfaceIp().toInt()), 2);
}
if (isisLink.neighborIp() != null) {
//dstAddress = isisLink.neighborIp().toInt();
dstAddress = (long) Long.parseUnsignedLong(Integer.toBinaryString(isisLink.neighborIp().toInt()), 2);
}
DeviceId srcId = DeviceId.deviceId(IsisRouterId.uri(localSystemId));
DeviceId dstId = DeviceId.deviceId(IsisRouterId.uri(remoteSystemId));
if (checkIsDis(isisLink.localSystemId())) {
......@@ -285,6 +294,7 @@ public class IsisTopologyProvider extends AbstractProvider implements DeviceProv
new DefaultDeviceDescription(IsisRouterId.uri(systemId), deviceType, UNKNOWN, UNKNOWN, UNKNOWN,
UNKNOWN, cId, newBuilder.build());
deviceProviderService.deviceConnected(deviceId, description);
System.out.println("Device added: " + systemId);
}
@Override
......@@ -302,17 +312,26 @@ public class IsisTopologyProvider extends AbstractProvider implements DeviceProv
@Override
public void addLink(IsisLink isisLink) {
log.debug("Addlink {}", isisLink.localSystemId());
if (linkProviderService == null) {
return;
}
LinkDescription linkDes = buildLinkDes(isisLink);
//Updating ports of the link
deviceProviderService.updatePorts(linkDes.src().deviceId(), buildPortDescriptions(linkDes.src().deviceId(),
//If already link exists, return
if (linkService.getLink(linkDes.src(), linkDes.dst()) != null || linkProviderService == null) {
return;
}
ConnectPoint destconnectPoint = linkDes.dst();
PortNumber destport = destconnectPoint.port();
if (destport.toLong() != 0) {
deviceProviderService.updatePorts(linkDes.src().deviceId(),
buildPortDescriptions(linkDes.src().deviceId(),
linkDes.src().port()));
deviceProviderService.updatePorts(linkDes.dst().deviceId(), buildPortDescriptions(linkDes.dst().deviceId(),
deviceProviderService.updatePorts(linkDes.dst().deviceId(),
buildPortDescriptions(linkDes.dst().deviceId(),
linkDes.dst().port()));
registerBandwidth(linkDes, isisLink);
linkProviderService.linkDetected(linkDes);
System.out.println("link desc " + linkDes.toString());
}
}
@Override
......
......@@ -81,6 +81,7 @@ public class IsisTopologyProviderTest {
private final TestDeviceRegistry nodeRegistry = new TestDeviceRegistry();
private final TestLinkRegistry linkRegistry = new TestLinkRegistry();
private final TestController controller = new TestController();
private final TestLinkService linkService = new TestLinkService();
private MockNetConfigRegistryAdapter networkConfigService = new MockNetConfigRegistryAdapter();
@Before
......@@ -89,6 +90,7 @@ public class IsisTopologyProviderTest {
provider.linkProviderRegistry = linkRegistry;
provider.networkConfigService = networkConfigService;
provider.controller = controller;
provider.linkService = linkService;
provider.activate();
assertNotNull("provider should be registered", nodeRegistry.provider);
assertNotNull("listener should be registered", controller.nodeListener);
......@@ -289,9 +291,9 @@ public class IsisTopologyProviderTest {
}
}
}
}
private class TestDeviceService extends DeviceServiceAdapter {
private DeviceListener listener;
......