ONOS-4107: ISIS Provider - Bug Fixes

Change-Id: I3c5cb3d1f45f7cf417267fe975256cba2dd066ab
diff --git a/protocols/isis/ctl/src/main/java/org/onosproject/isis/controller/impl/LspEventConsumer.java b/protocols/isis/ctl/src/main/java/org/onosproject/isis/controller/impl/LspEventConsumer.java
index 98586f0..bfede6d 100644
--- a/protocols/isis/ctl/src/main/java/org/onosproject/isis/controller/impl/LspEventConsumer.java
+++ b/protocols/isis/ctl/src/main/java/org/onosproject/isis/controller/impl/LspEventConsumer.java
@@ -45,8 +45,6 @@
 public class LspEventConsumer implements Runnable {
     private static final Logger log = LoggerFactory.getLogger(LspEventConsumer.class);
     public static List<LsPdu> lsPdus = new ArrayList<>();
-    private String lspAdded = "LSP_ADDED";
-    private String lspRemoved = "LSP_REMOVED";
     private BlockingQueue queue = null;
     private Controller controller = null;
     private TopologyForDeviceAndLinkImpl deviceAndLink = new TopologyForDeviceAndLinkImpl();
@@ -64,24 +62,21 @@
 
     @Override
     public void run() {
-        log.debug("LspsForProvider:run...!!!");
         try {
             while (true) {
                 if (!queue.isEmpty()) {
                     LspWrapper wrapper = (LspWrapper) queue.take();
                     LsPdu lsPdu = (LsPdu) wrapper.lsPdu();
-                    for (IsisTlv isisTlv : lsPdu.tlvs()) {
-                        if ((isisTlv instanceof IpExtendedReachabilityTlv) ||
-                                (isisTlv instanceof IsExtendedReachability)) {
-                            lsPdus.add(lsPdu);
-                            if (wrapper.lspProcessing().equals(lspAdded)) {
+                    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;
                             }
-                            if (wrapper.lspProcessing().equals(lspRemoved)) {
-                                callTopologyToRemoveInfo(lsPdu);
-                            }
-                            break;
                         }
                     }
                 }
@@ -99,6 +94,9 @@
      */
     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());
@@ -106,9 +104,7 @@
                 sendLinkInfo(lsPdu, ownSystemId);
             }
         } else if (isisNetworkType.equals(IsisNetworkType.P2P)) {
-
             sendDeviceInfo(lsPdu);
-
             for (LsPdu wrapper : lsPdus) {
                 LsPdu lsPduStored = wrapper;
                 List<String> neStringList = neighborList(lsPduStored, ownSystemId);
@@ -117,7 +113,6 @@
                     sendLinkInfo(lsPduStored, ownSystemId);
                 }
             }
-
             List<String> neStringList = neighborList(lsPdu, ownSystemId);
             Map<String, IsisRouter> routerPresence = deviceAndLink.isisDeviceList();
             for (String neighbor : neStringList) {
@@ -137,7 +132,8 @@
      * @param lsPdu ls pdu instance
      */
     private void callTopologyToRemoveInfo(LsPdu lsPdu) {
-        removeDeviceInfo(lsPdu);
+        IsisRouter isisRouter = deviceAndLink.isisRouter(lsPdu.lspId());
+        removeDeviceInfo(isisRouter);
         removeLinkInfo(lsPdu);
     }
 
@@ -195,13 +191,13 @@
     /**
      * Removes the device information from topology provider.
      *
-     * @param lsPdu ls pdu instance
+     * @param isisRouter ISIS router instance
      */
-    private void removeDeviceInfo(LsPdu lsPdu) {
-        IsisRouter isisRouter = deviceAndLink.removeDeviceAndLinkInfo(lsPdu);
+    private void removeDeviceInfo(IsisRouter isisRouter) {
         if (isisRouter.systemId() != null) {
             controller.removeDeviceDetails(isisRouter);
         }
+        deviceAndLink.removeRouter(isisRouter.systemId());
     }
 
     /**
@@ -228,7 +224,7 @@
      * @param lsPdu ls pdu instance
      */
     private void removeLinkInfo(LsPdu lsPdu) {
-        Map<String, LinkInformation> linkInformationList = deviceAndLink.removeLinkInfo(lsPdu);
+        Map<String, LinkInformation> linkInformationList = deviceAndLink.removeLinkInfo(lsPdu.lspId());
         for (String key : linkInformationList.keySet()) {
             LinkInformation linkInformation = linkInformationList.get(key);
             controller.removeLinkDetails(createIsisLink(linkInformation, lsPdu));
diff --git a/protocols/isis/ctl/src/main/java/org/onosproject/isis/controller/impl/topology/TopologyForDeviceAndLinkImpl.java b/protocols/isis/ctl/src/main/java/org/onosproject/isis/controller/impl/topology/TopologyForDeviceAndLinkImpl.java
index 75427b4..8682a4a 100644
--- a/protocols/isis/ctl/src/main/java/org/onosproject/isis/controller/impl/topology/TopologyForDeviceAndLinkImpl.java
+++ b/protocols/isis/ctl/src/main/java/org/onosproject/isis/controller/impl/topology/TopologyForDeviceAndLinkImpl.java
@@ -22,21 +22,24 @@
 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.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.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;
@@ -52,7 +55,6 @@
     private Map<String, DeviceInformation> deviceInformationMapForPointToPoint = new LinkedHashMap<>();
     private Map<String, DeviceInformation> deviceInformationMapToDelete = new LinkedHashMap<>();
     private Map<String, LinkInformation> addedLinkInformationMap = new LinkedHashMap<>();
-    private Map<String, LinkInformation> removeLinkInformationMap = new LinkedHashMap<>();
 
     /**
      * Gets device information.
@@ -226,11 +228,33 @@
     }
 
     /**
-     * Creates Device and Link instance.
+     * Returns the ISIS router instance.
      *
-     * @param lsPdu ISIS LSPDU 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.
@@ -249,18 +273,18 @@
             }
         }
         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.
@@ -302,13 +326,14 @@
     /**
      * Removes link information.
      *
-     * @param lsPdu ls pdu instance
+     * @param systemId system ID to remove link information
      * @return updated link information
      */
-    public Map<String, LinkInformation> removeLinkInfo(LsPdu lsPdu) {
-        String lspId = lsPdu.lspId();
+    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(lspId)) {
+            if (key.contains(routerId)) {
                 removeLinkInformationMap.put(key, addedLinkInformationMap.get(key));
             }
         }
@@ -328,22 +353,24 @@
         LinkInformation linkInformation = new DefaultIsisLinkInformation();
         IsisRouter isisRouter = isisRouterDetails.get(neighborId);
         for (IsisTlv isisTlv : lsPdu.tlvs()) {
-            if (isisTlv instanceof IpExtendedReachabilityTlv) {
-                IpExtendedReachabilityTlv ipExtendedReachabilityTlv = (IpExtendedReachabilityTlv) isisTlv;
-                List<TrafficEngineeringSubTlv> trafEnginSubTlv = ipExtendedReachabilityTlv.teTlvs();
-                for (TrafficEngineeringSubTlv teTlv : trafEnginSubTlv) {
-                    if (teTlv instanceof InterfaceIpAddress) {
-                        InterfaceIpAddress localIpAddress = (InterfaceIpAddress) isisTlv;
-                        linkInformation.setInterfaceIp(localIpAddress.localInterfaceIPAddress());
-                    }
+            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());
+                        }
 
+                    }
                 }
-            } else {
-                linkInformation.setInterfaceIp(IsisConstants.DEFAULTIP);
-                linkInformation.setNeighborIp(IsisConstants.DEFAULTIP);
             }
         }
-        linkInformation.setNeighborIp(IsisConstants.DEFAULTIP);
         linkInformation.setLinkId(linkId);
         linkInformation.setAlreadyCreated(false);
         linkInformation.setLinkDestinationId(neighborId);
@@ -366,21 +393,22 @@
         }
         isisRouter.setSystemId(IsisUtil.removeTailingZeros(lsPdu.lspId()));
         for (IsisTlv isisTlv : lsPdu.tlvs()) {
-            if (isisTlv instanceof IpExtendedReachabilityTlv) {
-                IpExtendedReachabilityTlv ipExtendedReachabilityTlv = (IpExtendedReachabilityTlv) isisTlv;
-                List<TrafficEngineeringSubTlv> trafEnginSubTlv = ipExtendedReachabilityTlv.teTlvs();
-                for (TrafficEngineeringSubTlv teTlv : trafEnginSubTlv) {
-                    if (teTlv instanceof InterfaceIpAddress) {
-                        InterfaceIpAddress localIpAddress = (InterfaceIpAddress) isisTlv;
-                        isisRouter.setInterfaceId(localIpAddress.localInterfaceIPAddress());
-                    }
-                    if (teTlv instanceof NeighborIpAddress) {
-                        NeighborIpAddress neighborIpAddress = (NeighborIpAddress) isisTlv;
-                        isisRouter.setNeighborRouterId(neighborIpAddress.neighborIPAddress());
+            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());
+                        }
+
                     }
                 }
-            } else {
-                log.info("Invalid TLV");
             }
         }
         return isisRouter;
@@ -398,6 +426,7 @@
         isisRouter.setDis(false);
         isisRouter.setInterfaceId(IsisConstants.DEFAULTIP);
         isisRouter.setNeighborRouterId(IsisConstants.DEFAULTIP);
+
         return isisRouter;
     }
 
@@ -410,26 +439,50 @@
     public IsisLinkTed createIsisLinkTedInfo(LsPdu lsPdu) {
         IsisLinkTed isisLinkTed = new DefaultIsisLinkTed();
         for (IsisTlv isisTlv : lsPdu.tlvs()) {
-            if (isisTlv instanceof IpExtendedReachabilityTlv) {
-                IpExtendedReachabilityTlv ipExtendedReachabilityTlv = (IpExtendedReachabilityTlv) isisTlv;
-                List<TrafficEngineeringSubTlv> trafficEngSubTlv = ipExtendedReachabilityTlv.teTlvs();
-                for (TrafficEngineeringSubTlv teTlv : trafficEngSubTlv) {
-                    if (teTlv instanceof AdministrativeGroup) {
-                        AdministrativeGroup ag = (AdministrativeGroup) isisTlv;
-                        isisLinkTed.setAdministrativeGroup(ag.administrativeGroup());
-                    }
-                    if (teTlv instanceof TrafficEngineeringMetric) {
-                        TrafficEngineeringMetric teM = (TrafficEngineeringMetric) isisTlv;
-                        isisLinkTed.setTeDefaultMetric(teM.getTrafficEngineeringMetricValue());
-                    }
-                    if (teTlv instanceof MaximumReservableBandwidth) {
-                        MaximumReservableBandwidth reservableBw = (MaximumReservableBandwidth) isisTlv;
-                        isisLinkTed.setMaximumReservableLinkBandwidth(
-                                Bandwidth.bps(reservableBw.getMaximumBandwidthValue()));
+            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);
+                        }
                     }
                 }
-            } else {
-                log.debug("TLV type not supported");
             }
         }
         return isisLinkTed;
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/NeighborForExtendedIs.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/NeighborForExtendedIs.java
index 0bc57b4..f5cd03b 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/NeighborForExtendedIs.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/NeighborForExtendedIs.java
@@ -46,6 +46,15 @@
     }
 
     /**
+     * Returns list of sub tlvs.
+     *
+     * @return teSubTlv list of sub tlvs
+     */
+    public List<TrafficEngineeringSubTlv> teSubTlv() {
+        return teSubTlv;
+    }
+
+    /**
      * Sets neighbor ID.
      *
      * @param neighborId neighbor ID
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvFinder.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvFinder.java
index b18f69c..bb3dfaf 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvFinder.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvFinder.java
@@ -67,10 +67,15 @@
                 subTlv = unreservedBandwidth;
                 break;
             case INTERFACEADDRESS:
-                NeighborIpAddress ipInterfaceAddressTlv = new NeighborIpAddress(tlvHeader);
+                InterfaceIpAddress ipInterfaceAddressTlv = new InterfaceIpAddress(tlvHeader);
                 ipInterfaceAddressTlv.readFrom(channelBuffer);
                 subTlv = ipInterfaceAddressTlv;
                 break;
+            case NEIGHBORADDRESS:
+                NeighborIpAddress ipNeighborAddressTlv = new NeighborIpAddress(tlvHeader);
+                ipNeighborAddressTlv.readFrom(channelBuffer);
+                subTlv = ipNeighborAddressTlv;
+                break;
             default:
                 //TODO
                 break;
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/UnreservedBandwidth.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/UnreservedBandwidth.java
index 94db6bb..4b3e7b6 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/UnreservedBandwidth.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/UnreservedBandwidth.java
@@ -54,7 +54,7 @@
      *
      * @return List of un reserved bandwidth
      */
-    public List<Float> getUnReservedBandwidthValue() {
+    public List<Float> unReservedBandwidthValue() {
         return this.unReservedBandwidth;
     }
 
diff --git a/providers/isis/topology/src/main/java/org/onosproject/provider/isis/topology/impl/IsisTopologyProvider.java b/providers/isis/topology/src/main/java/org/onosproject/provider/isis/topology/impl/IsisTopologyProvider.java
index 8a58289..78a67c2 100644
--- a/providers/isis/topology/src/main/java/org/onosproject/provider/isis/topology/impl/IsisTopologyProvider.java
+++ b/providers/isis/topology/src/main/java/org/onosproject/provider/isis/topology/impl/IsisTopologyProvider.java
@@ -59,6 +59,7 @@
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
+import java.util.StringTokenizer;
 
 import static org.slf4j.LoggerFactory.getLogger;
 
@@ -132,7 +133,7 @@
     @Override
     public boolean isReachable(DeviceId deviceId) {
         log.debug("IsisDeviceProvider::isReachable...!!!!");
-        return false;
+        return true;
     }
 
     @Override
@@ -149,6 +150,8 @@
     private LinkDescription buildLinkDes(IsisLink isisLink) {
         long srcAddress = 0;
         long dstAddress = 0;
+        boolean localPseduo = false;
+        boolean remotePseduo = false;
         String localSystemId = isisLink.localSystemId();
         String remoteSystemId = isisLink.remoteSystemId();
         //Changing of port numbers
@@ -156,9 +159,17 @@
         dstAddress = isisLink.neighborIp().toInt();
         DeviceId srcId = DeviceId.deviceId(IsisRouterId.uri(localSystemId));
         DeviceId dstId = DeviceId.deviceId(IsisRouterId.uri(remoteSystemId));
-        if (srcAddress == 0) {
+        if (checkIsDis(isisLink.localSystemId())) {
+            localPseduo = true;
+        } else if (checkIsDis(isisLink.remoteSystemId())) {
+            remotePseduo = true;
+        } else {
+            log.debug("IsisDeviceProvider::buildLinkDes : unknown type.!");
+        }
+
+        if (localPseduo && srcAddress == 0) {
             srcAddress = PSEUDO_PORT;
-        } else if (dstAddress == 0) {
+        } else if (remotePseduo && dstAddress == 0) {
             dstAddress = PSEUDO_PORT;
         }
 
@@ -173,6 +184,28 @@
     }
 
     /**
+     * Return the DIS value from the systemId.
+     *
+     * @param systemId system Id.
+     * @return return true if DIS else false
+     */
+    public static boolean checkIsDis(String systemId) {
+        StringTokenizer stringTokenizer = new StringTokenizer(systemId, "." + "-");
+        int count = 0;
+        while (stringTokenizer.hasMoreTokens()) {
+            String str = stringTokenizer.nextToken();
+            if (count == 3) {
+                int x = Integer.parseInt(str);
+                if (x > 0) {
+                    return true;
+                }
+            }
+            count++;
+        }
+        return false;
+    }
+
+    /**
      * Builds port description.
      *
      * @param deviceId   device ID for the port
@@ -181,9 +214,7 @@
      */
     private List<PortDescription> buildPortDescriptions(DeviceId deviceId,
                                                         PortNumber portNumber) {
-
         List<PortDescription> portList;
-
         if (portMap.containsKey(deviceId)) {
             portList = portMap.get(deviceId);
         } else {
@@ -193,8 +224,8 @@
             PortDescription portDescriptions = new DefaultPortDescription(portNumber, true);
             portList.add(portDescriptions);
         }
-
         portMap.put(deviceId, portList);
+
         return portList;
     }
 
@@ -215,6 +246,7 @@
 
         //TE Info
         IsisLinkTed isisLinkTed = isisLink.linkTed();
+        log.info("Ted Information:  {}", isisLinkTed.toString());
         administrativeGroup = isisLinkTed.administrativeGroup();
         teMetric = isisLinkTed.teDefaultMetric();
         maxReservableBandwidth = isisLinkTed.maximumReservableLinkBandwidth();
@@ -251,7 +283,7 @@
             newBuilder.set("RouterId", systemId);
             DeviceDescription description =
                     new DefaultDeviceDescription(IsisRouterId.uri(systemId), deviceType, UNKNOWN, UNKNOWN, UNKNOWN,
-                                                 UNKNOWN, cId, newBuilder.build());
+                            UNKNOWN, cId, newBuilder.build());
             deviceProviderService.deviceConnected(deviceId, description);
         }
 
@@ -276,9 +308,9 @@
             LinkDescription linkDes = buildLinkDes(isisLink);
             //Updating ports of the link
             deviceProviderService.updatePorts(linkDes.src().deviceId(), buildPortDescriptions(linkDes.src().deviceId(),
-                                                                                              linkDes.src().port()));
+                    linkDes.src().port()));
             deviceProviderService.updatePorts(linkDes.dst().deviceId(), buildPortDescriptions(linkDes.dst().deviceId(),
-                                                                                              linkDes.dst().port()));
+                    linkDes.dst().port()));
             registerBandwidth(linkDes, isisLink);
             linkProviderService.linkDetected(linkDes);
         }
@@ -319,4 +351,4 @@
             }
         }
     }
-}
\ No newline at end of file
+}