ONOS-4505: Bug Fixes

Change-Id: Ia030aa3aff9e2ad34a5e27fbe4ba088dda65bfa7
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/Psnp.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/Psnp.java
old mode 100755
new mode 100644
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/IsisConstants.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/IsisConstants.java
index cf5871a..9156eb4 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/IsisConstants.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/IsisConstants.java
@@ -33,6 +33,7 @@
     public static final int IRPDISCRIMINATOR = 131;
     public static final int ISISVERSION = 1;
     public static final int RESERVED = 0;
+    public static final int PRIORITY = 0;
     public static final int MAXAREAADDRESS = 0;
     public static final int SYSTEMIDLENGTH = 0;
     public static final int PROTOCOLSUPPORTED = 204;
@@ -55,24 +56,15 @@
     public static final String DEFAULTLANID = "0000.0000.0000.00";
     public static final String PROCESSESID = "processId";
     public static final String INTERFACE = "interface";
-    public static final String INTERFACEIP = "interfaceIp";
-    public static final String NETWORKMASK = "networkMask";
     public static final String INTERFACEINDEX = "interfaceIndex";
     public static final String INTERMEDIATESYSTEMNAME = "intermediateSystemName";
     public static final String SYSTEMID = "systemId";
-    public static final String LANID = "lanId";
-    public static final String IDLENGTH = "idLength";
-    public static final String MAXAREAADDRESSES = "maxAreaAddresses";
     public static final String RESERVEDPACKETCIRCUITTYPE = "reservedPacketCircuitType";
     public static final String CIRCUITID = "circuitId";
     public static final String NETWORKTYPE = "networkType";
     public static final String AREAADDRESS = "areaAddress";
-    public static final String AREALENGTH = "areaLength";
-    public static final String LSPID = "lspId";
     public static final String HOLDINGTIME = "holdingTime";
     public static final String HELLOINTERVAL = "helloInterval";
-    public static final String PRIORITY = "priority";
-    public static final String MACADDRESS = "macAddress";
 
     /**
      * Non parameterized constructor.
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/IsisUtil.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/IsisUtil.java
old mode 100755
new mode 100644
index 6b665ac..cfd941e
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/IsisUtil.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/IsisUtil.java
@@ -22,6 +22,7 @@
 import org.onosproject.isis.controller.IsisInterfaceState;
 import org.onosproject.isis.controller.IsisNeighbor;
 import org.onosproject.isis.controller.IsisPduType;
+import org.onosproject.isis.controller.IsisRouterType;
 import org.onosproject.isis.io.isispacket.IsisHeader;
 import org.onosproject.isis.io.isispacket.pdu.L1L2HelloPdu;
 import org.onosproject.isis.io.isispacket.pdu.P2PHelloPdu;
@@ -394,7 +395,6 @@
         isisHeader.setIdLength((byte) IsisConstants.SYSTEMIDLENGTH);
         isisHeader.setIsisPduType(IsisPduType.P2PHELLOPDU.value());
         isisHeader.setVersion2((byte) IsisConstants.ISISVERSION);
-        //isisHeader.setReserved((byte) IsisConstants.RESERVED);
         isisHeader.setReserved((byte) IsisConstants.PDULENGTHPOSITION);
         isisHeader.setMaximumAreaAddresses((byte) IsisConstants.MAXAREAADDRESS);
         P2PHelloPdu p2pHelloPdu = new P2PHelloPdu(isisHeader);
@@ -510,14 +510,32 @@
         l1L2HelloPdu.addTlv(areaAddressTlv);
         Set<MacAddress> neighbors = isisInterface.neighbors();
         if (neighbors.size() > 0) {
+            List<MacAddress> neighborMacs = new ArrayList<>();
+            for (MacAddress neighbor : neighbors) {
+                IsisNeighbor isisNeighbor = isisInterface.lookup(neighbor);
+                if (isisPduType == IsisPduType.L1HELLOPDU) {
+                    if (isisNeighbor.routerType() == IsisRouterType.L1 ||
+                            isisNeighbor.routerType() == IsisRouterType.L1L2) {
+                        neighborMacs.add(neighbor);
+                    }
+                } else if (isisPduType == IsisPduType.L2HELLOPDU) {
+                    if (isisNeighbor.routerType() == IsisRouterType.L2 ||
+                            isisNeighbor.routerType() == IsisRouterType.L1L2) {
+                        neighborMacs.add(neighbor);
+                    }
+                }
+            }
+
             tlvHeader.setTlvType(TlvType.ISNEIGHBORS.value());
             tlvHeader.setTlvLength(0);
+
             IsisNeighborTlv isisNeighborTlv = new IsisNeighborTlv(tlvHeader);
-            for (MacAddress neighbor : neighbors) {
+            for (MacAddress neighbor : neighborMacs) {
                 isisNeighborTlv.addNeighbor(neighbor);
             }
             l1L2HelloPdu.addTlv(isisNeighborTlv);
         }
+
         tlvHeader.setTlvType(TlvType.PROTOCOLSUPPORTED.value());
         tlvHeader.setTlvLength(0);
         ProtocolSupportedTlv protocolSupportedTlv = new ProtocolSupportedTlv(tlvHeader);
@@ -708,4 +726,4 @@
         }
         return Bytes.toArray(byteList);
     }
-}
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/LspGenerator.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/LspGenerator.java
index c6ae962..b72c2ab 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/LspGenerator.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/LspGenerator.java
@@ -140,8 +140,15 @@
         metricOfIntRea.setExpenseIsInternal(true);
         Ip4Address ip4Address = isisInterface.interfaceIpAddress();
         byte[] ipAddress = ip4Address.toOctets();
-        ipAddress[ipAddress.length - 1] = 0;
-        metricOfIntRea.setIpAddress(Ip4Address.valueOf(ipAddress));
+       // ipAddress[ipAddress.length - 1] = 0;
+        byte[] networkmass = isisInterface.networkMask();
+        // metric calculation part
+        byte[] result = new byte[ipAddress.length];
+        result[0] = (byte) (ipAddress[0] & networkmass[0]);
+        result[1] = (byte) (ipAddress[1] & networkmass[1]);
+        result[2] = (byte) (ipAddress[2] & networkmass[2]);
+        result[3] = (byte) (ipAddress[3] & networkmass[3]);
+        metricOfIntRea.setIpAddress(Ip4Address.valueOf(result));
         metricOfIntRea.setSubnetAddres(Ip4Address.valueOf(isisInterface.networkMask()));
         ipInterReacTlv.addInternalReachabilityMetric(metricOfIntRea);
         lsp.addTlv(ipInterReacTlv);