ONOS-4083,ONOS-4084:ISIS PDU TLV Data Structures
Change-Id: Ice0d42f2c886fa5f398b562e126614ed45f858a2
diff --git a/protocols/isis/isisio/pom.xml b/protocols/isis/isisio/pom.xml
old mode 100755
new mode 100644
index 651d393..9eda506
--- a/protocols/isis/isisio/pom.xml
+++ b/protocols/isis/isisio/pom.xml
@@ -37,7 +37,7 @@
</dependency>
<dependency>
<groupId>io.netty</groupId>
- <artifactId>netty-buffer</artifactId>
+ <artifactId>netty</artifactId>
</dependency>
<dependency>
<groupId>org.easymock</groupId>
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/IsisConstantParameters.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/IsisConstantParameters.java
deleted file mode 100755
index b09e7b5..0000000
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/IsisConstantParameters.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * 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.io.isispacket;
-
-/**
- * Represents ISIS constant parameters.
- */
-public final class IsisConstantParameters {
-
- public static final int IRPDISCRIMINATOR = 131;
- public static final int PROOCOLID = 1;
- public static final int VERSION = 1;
- public static final int RESERVED = 0;
- public static final int MAXAREAADDRESS = 3;
- public static final int IDLENGTH = 6;
- public static final int PROTOCOLSUPPORTED = 6;
- public static final int PACKETMINIMUMLENGTH = 27;
- public static final int PDULENGTHPOSITION = 17;
- public static final int PDUHEADERFORREADFROM = 8;
-
- /**
- * Creates an instance of this class.
- */
- private IsisConstantParameters() {
-
- }
-}
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/package-info.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/package-info.java
old mode 100755
new mode 100644
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/AdjacencyStateTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/AdjacencyStateTlv.java
new file mode 100644
index 0000000..d13841c
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/AdjacencyStateTlv.java
@@ -0,0 +1,164 @@
+/*
+* 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.io.isispacket.tlv;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.primitives.Bytes;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.isis.io.util.IsisUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Representation of adjacency state TLV of P2P neighbor.
+ */
+public class AdjacencyStateTlv extends TlvHeader implements IsisTlv {
+
+ private byte adjacencyType;
+ private int localCircuitId;
+ private String neighborSystemId;
+ private int neighborLocalCircuitId;
+
+ /**
+ * Creates an instance of adjacency state TLV..
+ *
+ * @param tlvHeader tlvHeader
+ */
+ public AdjacencyStateTlv(TlvHeader tlvHeader) {
+ this.setTlvType(tlvHeader.tlvType());
+ this.setTlvLength(tlvHeader.tlvLength());
+ }
+
+ /**
+ * Returns local circuit ID for adjacency state TLV.
+ *
+ * @return local circuit ID
+ */
+ public int localCircuitId() {
+ return localCircuitId;
+ }
+
+ /**
+ * Sets local circuit ID for adjacency state TLV.
+ *
+ * @param localCircuitId local circuit Id
+ */
+ public void setLocalCircuitId(int localCircuitId) {
+ this.localCircuitId = localCircuitId;
+ }
+
+ /**
+ * Returns neighbor system ID for adjacency state TLV.
+ *
+ * @return neighbor system ID
+ */
+ public String neighborSystemId() {
+ return neighborSystemId;
+ }
+
+ /**
+ * Sets neighbor system ID for adjacency state TLV.
+ *
+ * @param neighborSystemId neighbor system ID
+ */
+ public void setNeighborSystemId(String neighborSystemId) {
+ this.neighborSystemId = neighborSystemId;
+ }
+
+ /**
+ * Returns neighbor local circuit ID for adjacency state TLV.
+ *
+ * @return neighbor local circuit ID
+ */
+ public int neighborLocalCircuitId() {
+ return neighborLocalCircuitId;
+ }
+
+ /**
+ * Sets neighbor local circuit ID for adjacency state TLV.
+ *
+ * @param neighborLocalCircuitId neighbor local circuit ID
+ */
+ public void setNeighborLocalCircuitId(int neighborLocalCircuitId) {
+ this.neighborLocalCircuitId = neighborLocalCircuitId;
+ }
+
+ /**
+ * Returns adjacency type of adjacency state TLV.
+ *
+ * @return adjacency type
+ */
+ public byte adjacencyType() {
+ return adjacencyType;
+ }
+
+ /**
+ * Sets adjacency type for adjacency state TLV.
+ *
+ * @param adjacencyType adjacency type
+ */
+ public void setAdjacencyType(byte adjacencyType) {
+ this.adjacencyType = adjacencyType;
+ }
+
+ @Override
+ public void readFrom(ChannelBuffer channelBuffer) {
+ this.setAdjacencyType(channelBuffer.readByte());
+ if (channelBuffer.readableBytes() > 0) {
+ this.setLocalCircuitId(channelBuffer.readInt());
+ byte[] tempByteArray = new byte[IsisUtil.ID_SIX_BYTES];
+ channelBuffer.readBytes(tempByteArray, 0, IsisUtil.ID_SIX_BYTES);
+ this.setNeighborSystemId(IsisUtil.systemId(tempByteArray));
+ this.setNeighborLocalCircuitId(channelBuffer.readInt());
+ }
+ }
+
+ @Override
+ public byte[] asBytes() {
+ byte[] bytes = null;
+ byte[] tlvHeader = tlvHeaderAsByteArray();
+ byte[] tlvBody = tlvBodyAsBytes();
+ tlvHeader[1] = (byte) tlvBody.length;
+ bytes = Bytes.concat(tlvHeader, tlvBody);
+ return bytes;
+ }
+
+ /**
+ * Returns adjacency type TLV body as byte array.
+ *
+ * @return byteArray TLV body of area address TLV
+ */
+ private byte[] tlvBodyAsBytes() {
+ List<Byte> bytes = new ArrayList<>();
+ bytes.add(this.adjacencyType);
+ bytes.addAll(Bytes.asList(IsisUtil.convertToFourBytes(this.localCircuitId)));
+ bytes.addAll(IsisUtil.sourceAndLanIdToBytes(this.neighborSystemId));
+ bytes.addAll(Bytes.asList(IsisUtil.convertToFourBytes(this.neighborLocalCircuitId)));
+ return Bytes.toArray(bytes);
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(getClass())
+ .omitNullValues()
+ .add("adjacencyType", adjacencyType)
+ .add("localCircuitId", localCircuitId)
+ .add("neighborSystemId", neighborSystemId)
+ .add("neighborLocalCircuitId", neighborLocalCircuitId)
+ .toString();
+ }
+}
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/AreaAddressTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/AreaAddressTlv.java
old mode 100755
new mode 100644
index add4127..bc24910
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/AreaAddressTlv.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/AreaAddressTlv.java
@@ -13,52 +13,58 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
package org.onosproject.isis.io.isispacket.tlv;
import com.google.common.base.MoreObjects;
import com.google.common.primitives.Bytes;
-import io.netty.buffer.ByteBuf;
+import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.isis.io.util.IsisUtil;
import java.util.ArrayList;
import java.util.List;
/**
- * Represents the area address TLV.
+ * Representation of area address TLV.
*/
public class AreaAddressTlv extends TlvHeader implements IsisTlv {
- private List<String> areaAddress = new ArrayList();
+ private List<String> areaAddress = new ArrayList<>();
/**
- * Sets TLV type and TLV length of area address TLV.
+ * Creates an instance of area address TLV.
*
- * @param tlvHeader tlvHeader.
+ * @param tlvHeader tlvHeader
*/
public AreaAddressTlv(TlvHeader tlvHeader) {
-
this.setTlvType(tlvHeader.tlvType());
this.setTlvLength(tlvHeader.tlvLength());
-
}
/**
- * Gets the area address of area address TLV.
+ * Adds the area address to the area address TLV.
*
- * @return area address
+ * @param areaAddress area address
+ */
+ public void addAddress(String areaAddress) {
+ this.areaAddress.add(areaAddress);
+ }
+
+ /**
+ * Returns the area address of area address TLV.
+ *
+ * @return areaAddress area address
*/
public List<String> areaAddress() {
return this.areaAddress;
}
@Override
- public void readFrom(ByteBuf byteBuf) {
- while (byteBuf.readableBytes() > 0) {
- int addressLength = byteBuf.readByte();
- byte[] addressBytes = new byte[IsisUtil.THREE_BYTES];
- byteBuf.readBytes(addressBytes, 0, IsisUtil.THREE_BYTES);
- String areaAddress = IsisUtil.areaAddres(addressBytes);
+ public void readFrom(ChannelBuffer channelBuffer) {
+ while (channelBuffer.readableBytes() > 0) {
+ int addressLength = channelBuffer.readByte();
+ byte[] addressbytes = new byte[addressLength];
+ channelBuffer.readBytes(addressbytes, 0, addressLength);
+ String areaAddress = IsisUtil.areaAddres(addressbytes);
this.areaAddress.add(areaAddress);
}
}
@@ -66,38 +72,32 @@
@Override
public byte[] asBytes() {
byte[] bytes = null;
-
byte[] tlvHeader = tlvHeaderAsByteArray();
byte[] tlvBody = tlvBodyAsBytes();
+ tlvHeader[1] = (byte) tlvBody.length;
bytes = Bytes.concat(tlvHeader, tlvBody);
-
return bytes;
}
/**
- * Gets TLV body of area address TLV.
+ * Returns TLV body of area address TLV.
*
* @return byteArray TLV body of area address TLV
*/
- public byte[] tlvBodyAsBytes() {
-
- List<Byte> bytes = new ArrayList();
+ private byte[] tlvBodyAsBytes() {
+ List<Byte> bytes = new ArrayList<>();
for (String areaAddress : this.areaAddress) {
bytes.add((byte) (areaAddress.length() / 2));
- bytes.addAll(IsisUtil.areaAddresToBytes(areaAddress));
+ bytes.addAll(IsisUtil.areaAddressToBytes(areaAddress));
}
- byte[] byteArray = new byte[bytes.size()];
- int i = 0;
- for (byte byt : bytes) {
- byteArray[i++] = byt;
- }
- return byteArray;
+ return Bytes.toArray(bytes);
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.omitNullValues()
+ .add("areaAddress", areaAddress)
.toString();
}
}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/HostNameTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/HostNameTlv.java
new file mode 100644
index 0000000..82e8099
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/HostNameTlv.java
@@ -0,0 +1,91 @@
+/*
+ * 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.io.isispacket.tlv;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.primitives.Bytes;
+import org.jboss.netty.buffer.ChannelBuffer;
+
+/**
+ * Representation of host name TLV.
+ */
+public class HostNameTlv extends TlvHeader {
+ private String hostName;
+
+ /**
+ * Creates an instance of host name TLV.
+ *
+ * @param tlvHeader tlvHeader.
+ */
+ public HostNameTlv(TlvHeader tlvHeader) {
+ this.setTlvType(tlvHeader.tlvType());
+ this.setTlvLength(tlvHeader.tlvLength());
+
+ }
+
+ /**
+ * Returns host name of host name TLV.
+ *
+ * @return host name
+ */
+ public String hostName() {
+ return hostName;
+ }
+
+ /**
+ * Sets host name for host name TLV.
+ *
+ * @param hostName host name.
+ */
+ public void setHostName(String hostName) {
+ this.hostName = hostName;
+ }
+
+ @Override
+ public void readFrom(ChannelBuffer channelBuffer) {
+ byte[] addressbytes = new byte[this.tlvLength()];
+ channelBuffer.readBytes(addressbytes, 0, this.tlvLength());
+ this.hostName = new String(addressbytes);
+ }
+
+ @Override
+ public byte[] asBytes() {
+ byte[] bytes = null;
+ byte[] tlvHeader = tlvHeaderAsByteArray();
+ byte[] tlvBody = tlvBodyAsBytes();
+ tlvHeader[1] = (byte) tlvBody.length;
+ bytes = Bytes.concat(tlvHeader, tlvBody);
+ return bytes;
+ }
+
+ /**
+ * Returns TLV body of host name TLV.
+ *
+ * @return byteArray TLV body of host name TLV
+ */
+ private byte[] tlvBodyAsBytes() {
+ byte[] bytes = this.hostName.getBytes();
+ return bytes;
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(getClass())
+ .omitNullValues()
+ .add("hostName", hostName)
+ .toString();
+ }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IdrpInformationTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IdrpInformationTlv.java
new file mode 100644
index 0000000..b16a54d
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IdrpInformationTlv.java
@@ -0,0 +1,95 @@
+/*
+ * 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.io.isispacket.tlv;
+
+import com.google.common.base.MoreObjects;
+import org.jboss.netty.buffer.ChannelBuffer;
+
+/**
+ * Representation of IDRP information TLV.
+ */
+public class IdrpInformationTlv extends TlvHeader implements IsisTlv {
+
+ private byte irdpInformationType;
+ private int externalInformation;
+
+ /**
+ * Creates an instance of IDRP information TLV.
+ *
+ * @param tlvHeader tlvHeader
+ */
+ public IdrpInformationTlv(TlvHeader tlvHeader) {
+ this.setTlvType(tlvHeader.tlvType());
+ this.setTlvLength(tlvHeader.tlvLength());
+ }
+
+ /**
+ * Returns the external information of IDRP information TLV.
+ *
+ * @return external information
+ */
+ public int externalInformation() {
+ return externalInformation;
+ }
+
+ /**
+ * Sets the external information for IDRP information TLV.
+ *
+ * @param externalInformation external information
+ */
+ public void setExternalInformation(int externalInformation) {
+ this.externalInformation = externalInformation;
+ }
+
+ /**
+ * Returns the IDRP information of IDRP information TLV.
+ *
+ * @return IDRP information type
+ */
+ public byte irdpInformationType() {
+ return irdpInformationType;
+ }
+
+ /**
+ * Sets the IDRP information for IDRP information TLV.
+ *
+ * @param irdpInformationType IDRP information type
+ */
+ public void setIrdpInformationType(byte irdpInformationType) {
+ this.irdpInformationType = irdpInformationType;
+ }
+
+ @Override
+ public void readFrom(ChannelBuffer channelBuffer) {
+ //TODO
+ }
+
+
+ @Override
+ public byte[] asBytes() {
+ //TODO
+ return null;
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(getClass())
+ .omitNullValues()
+ .add("externalInformation", externalInformation)
+ .add("irdpInformationType", irdpInformationType)
+ .toString();
+ }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IpExtendedReachabilityTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IpExtendedReachabilityTlv.java
new file mode 100644
index 0000000..7acb9c8
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IpExtendedReachabilityTlv.java
@@ -0,0 +1,167 @@
+/*
+ * 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.io.isispacket.tlv;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.primitives.Bytes;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.isis.io.isispacket.tlv.subtlv.SubTlvFinder;
+import org.onosproject.isis.io.isispacket.tlv.subtlv.SubTlvToBytes;
+import org.onosproject.isis.io.isispacket.tlv.subtlv.TrafficEngineeringSubTlv;
+import org.onosproject.isis.io.util.IsisUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Representation of IP extended reachability TLV.
+ */
+public class IpExtendedReachabilityTlv extends TlvHeader implements IsisTlv {
+
+ private String sysIdAndPseudoNumber;
+ private int defaultMetric;
+ private byte subTlvLength;
+ private List<TrafficEngineeringSubTlv> trafEnginSubTlv = new ArrayList<>();
+
+ /**
+ * Creates an instance of IP external reachability TLV.
+ *
+ * @param tlvHeader tlvHeader
+ */
+ public IpExtendedReachabilityTlv(TlvHeader tlvHeader) {
+ this.setTlvType(tlvHeader.tlvType());
+ this.setTlvLength(tlvHeader.tlvLength());
+ }
+
+ /**
+ * Returns the system ID and pseudo number of IP external reachability TLV.
+ *
+ * @return sysIdAndPseudoNumber system ID and pseudo number
+ */
+ public String sysIdAndPseudoNumber() {
+ return sysIdAndPseudoNumber;
+ }
+
+ /**
+ * Sets the system ID and pseudo number for IP external reachability TLV.
+ *
+ * @param sysIdAndPseudoNumber system ID and pseudo number
+ */
+ public void setSysIdAndPseudoNumber(String sysIdAndPseudoNumber) {
+ this.sysIdAndPseudoNumber = sysIdAndPseudoNumber;
+ }
+
+ /**
+ * Adds the traffic engineering sub TLV to IP external reachability TLV.
+ *
+ * @param trafEnginSubTlv traffic engineering sub TLV
+ */
+ public void addSubTlv(TrafficEngineeringSubTlv trafEnginSubTlv) {
+ this.trafEnginSubTlv.add(trafEnginSubTlv);
+ }
+
+ /**
+ * Returns the sub TLV length of IP external reachability TLV.
+ *
+ * @return sub TLV length
+ */
+ public byte subTlvLength() {
+ return subTlvLength;
+ }
+
+ /**
+ * Sets the sub TLV length for IP external reachability TLV.
+ *
+ * @param subTlvLength sub TLV length
+ */
+ public void setSubTlvLength(byte subTlvLength) {
+ this.subTlvLength = subTlvLength;
+ }
+
+ /**
+ * Returns default metric of IP external reachability TLV.
+ *
+ * @return default metric
+ */
+ public int defaultMetric() {
+ return defaultMetric;
+ }
+
+ /**
+ * Sets default metric for IP external reachability TLV.
+ *
+ * @param defaultMetric default metric
+ */
+ public void setDefaultMetric(int defaultMetric) {
+ this.defaultMetric = defaultMetric;
+ }
+
+ @Override
+ public void readFrom(ChannelBuffer channelBuffer) {
+ byte[] tempByteArray = new byte[IsisUtil.ID_PLUS_ONE_BYTE];
+ channelBuffer.readBytes(tempByteArray, 0, IsisUtil.ID_PLUS_ONE_BYTE);
+ this.setSysIdAndPseudoNumber(IsisUtil.systemIdPlus(tempByteArray));
+ this.setDefaultMetric(channelBuffer.readUnsignedMedium());
+ this.setSubTlvLength((byte) channelBuffer.readByte());
+ while (channelBuffer.readableBytes() > 0) {
+ TlvHeader tlvHeader = new TlvHeader();
+ tlvHeader.setTlvType(channelBuffer.readByte());
+ tlvHeader.setTlvLength(channelBuffer.readByte());
+ this.addSubTlv(SubTlvFinder.findSubTlv(tlvHeader,
+ channelBuffer.readBytes(tlvHeader.tlvLength())));
+ }
+ }
+
+ @Override
+ public byte[] asBytes() {
+ byte[] bytes = null;
+ byte[] tlvHeader = tlvHeaderAsByteArray();
+ byte[] tlvBody = tlvBodyAsBytes();
+ //systemID + pseudo number+length of subtlv=11l
+ tlvBody[10] = (byte) (tlvBody.length - 11);
+ tlvHeader[1] = (byte) tlvBody.length;
+ bytes = Bytes.concat(tlvHeader, tlvBody);
+ return bytes;
+ }
+
+ /**
+ * Returns TLV body of IP external reachability TLV.
+ *
+ * @return byteArray TLV body of IP external reachability TLV.
+ */
+ private byte[] tlvBodyAsBytes() {
+ List<Byte> bodyLst = new ArrayList<>();
+ bodyLst.addAll(IsisUtil.sourceAndLanIdToBytes(this.sysIdAndPseudoNumber()));
+ bodyLst.addAll(Bytes.asList(IsisUtil.convertToThreeBytes(this.defaultMetric())));
+ bodyLst.add(this.subTlvLength());
+ for (TrafficEngineeringSubTlv trafficEngineeringSubTlv : this.trafEnginSubTlv) {
+ bodyLst.addAll(SubTlvToBytes.tlvToBytes(trafficEngineeringSubTlv));
+ }
+ return Bytes.toArray(bodyLst);
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(getClass())
+ .omitNullValues()
+ .add("sysIdAndPseudoNumber", sysIdAndPseudoNumber)
+ .add("defaultMetric", defaultMetric)
+ .add("subTlvLength", subTlvLength)
+ .add("trafEnginSubTlv", trafEnginSubTlv)
+ .toString();
+ }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IpExternalReachabilityTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IpExternalReachabilityTlv.java
new file mode 100644
index 0000000..e050017
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IpExternalReachabilityTlv.java
@@ -0,0 +1,166 @@
+/*
+ * 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.io.isispacket.tlv;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.primitives.Bytes;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.isis.io.isispacket.tlv.subtlv.SubTlvFinder;
+import org.onosproject.isis.io.isispacket.tlv.subtlv.SubTlvToBytes;
+import org.onosproject.isis.io.isispacket.tlv.subtlv.TrafficEngineeringSubTlv;
+import org.onosproject.isis.io.util.IsisUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Representation of IP external reachability TLV.
+ */
+public class IpExternalReachabilityTlv extends TlvHeader implements IsisTlv {
+
+ private String sysIdAndPseudoNumber;
+ private int defaultMetric;
+ private byte subTlvLength;
+ private List<TrafficEngineeringSubTlv> trafEnginSubTlv = new ArrayList<>();
+
+ /**
+ * Sets TLV type and TLV length for IP external reachability TLV.
+ *
+ * @param tlvHeader tlvHeader
+ */
+ public IpExternalReachabilityTlv(TlvHeader tlvHeader) {
+ this.setTlvType(tlvHeader.tlvType());
+ this.setTlvLength(tlvHeader.tlvLength());
+ }
+
+ /**
+ * Gets the system ID and pseudo number of IP external reachability TLV.
+ *
+ * @return sysIdAndPseudoNumber system ID and pseudo number
+ */
+ public String sysIdAndPseudoNumber() {
+ return sysIdAndPseudoNumber;
+ }
+
+ /**
+ * Gets the system ID and pseudo number for IP external reachability TLV.
+ *
+ * @param sysIdAndPseudoNumber system ID and pseudo number
+ */
+ public void setSysIdAndPseudoNumber(String sysIdAndPseudoNumber) {
+ this.sysIdAndPseudoNumber = sysIdAndPseudoNumber;
+ }
+
+ /**
+ * Adds the traffic engineering sub TLV to IP external reachability TLV.
+ *
+ * @param trafEnginSubTlv traffic engineering sub TLV
+ */
+ public void addSubTlv(TrafficEngineeringSubTlv trafEnginSubTlv) {
+ this.trafEnginSubTlv.add(trafEnginSubTlv);
+ }
+
+ /**
+ * Gets the sub TLV length of IP external reachability TLV.
+ *
+ * @return sub TLV length
+ */
+ public byte subTlvLength() {
+ return subTlvLength;
+ }
+
+ /**
+ * Sets the sub TLV length for IP external reachability TLV.
+ *
+ * @param subTlvLength sub TLV length
+ */
+ public void setSubTlvLength(byte subTlvLength) {
+ this.subTlvLength = subTlvLength;
+ }
+
+ /**
+ * Gets default metric of IP external reachability TLV.
+ *
+ * @return default metric
+ */
+ public int defaultMetric() {
+ return defaultMetric;
+ }
+
+ /**
+ * Sets default metric for IP external reachability TLV.
+ *
+ * @param defaultMetric default metric
+ */
+ public void setDefaultMetric(int defaultMetric) {
+ this.defaultMetric = defaultMetric;
+ }
+
+ @Override
+ public void readFrom(ChannelBuffer channelBuffer) {
+ byte[] tempByteArray = new byte[IsisUtil.ID_PLUS_ONE_BYTE];
+ channelBuffer.readBytes(tempByteArray, 0, IsisUtil.ID_PLUS_ONE_BYTE);
+ this.setSysIdAndPseudoNumber(IsisUtil.systemIdPlus(tempByteArray));
+ this.setDefaultMetric(channelBuffer.readUnsignedMedium());
+ this.setSubTlvLength((byte) channelBuffer.readByte());
+ while (channelBuffer.readableBytes() > 0) {
+ TlvHeader tlvHeader = new TlvHeader();
+ tlvHeader.setTlvType(channelBuffer.readByte());
+ tlvHeader.setTlvLength(channelBuffer.readByte());
+ this.addSubTlv(SubTlvFinder.findSubTlv(tlvHeader,
+ channelBuffer.readBytes(tlvHeader.tlvLength())));
+ }
+ }
+
+ @Override
+ public byte[] asBytes() {
+ byte[] bytes = null;
+ byte[] tlvHeader = tlvHeaderAsByteArray();
+ byte[] tlvBody = tlvBodyAsBytes();
+ //systemID + pseudo number+length of subtlv=11l
+ tlvBody[10] = (byte) (tlvBody.length - 11);
+ tlvHeader[1] = (byte) tlvBody.length;
+ bytes = Bytes.concat(tlvHeader, tlvBody);
+ return bytes;
+ }
+
+ /**
+ * Gets TLV body of IP external reachability TLV.
+ *
+ * @return byteArray TLV body of IP external reachability TLV.
+ */
+ public byte[] tlvBodyAsBytes() {
+ List<Byte> bodyLst = new ArrayList<>();
+ bodyLst.addAll(IsisUtil.sourceAndLanIdToBytes(this.sysIdAndPseudoNumber()));
+ bodyLst.addAll(Bytes.asList(IsisUtil.convertToThreeBytes(this.defaultMetric())));
+ bodyLst.add(this.subTlvLength());
+ for (TrafficEngineeringSubTlv trafficEngineeringSubTlv : this.trafEnginSubTlv) {
+ bodyLst.addAll(SubTlvToBytes.tlvToBytes(trafficEngineeringSubTlv));
+ }
+ return Bytes.toArray(bodyLst);
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(getClass())
+ .omitNullValues()
+ .add("sysIdAndPseudoNumber", sysIdAndPseudoNumber)
+ .add("defaultMetric", defaultMetric)
+ .add("subTlvLength", subTlvLength)
+ .toString();
+ }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IpInterfaceAddressTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IpInterfaceAddressTlv.java
old mode 100755
new mode 100644
index 57dcd32..f372a6b
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IpInterfaceAddressTlv.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IpInterfaceAddressTlv.java
@@ -17,7 +17,7 @@
import com.google.common.base.MoreObjects;
import com.google.common.primitives.Bytes;
-import io.netty.buffer.ByteBuf;
+import org.jboss.netty.buffer.ChannelBuffer;
import org.onlab.packet.Ip4Address;
import org.onosproject.isis.io.util.IsisUtil;
@@ -25,13 +25,14 @@
import java.util.List;
/**
- * Represents IP interface address TLV.
+ * Representation of IP interface address TLV.
*/
public class IpInterfaceAddressTlv extends TlvHeader implements IsisTlv {
- private List<Ip4Address> interfaceAddress = new ArrayList();
+
+ private List<Ip4Address> interfaceAddress = new ArrayList<>();
/**
- * Sets TLV type and TLV length of IP interface address TLV.
+ * Creates an instance of IP interface address TLV.
*
* @param tlvHeader tlvHeader.
*/
@@ -43,58 +44,60 @@
}
/**
- * Gets interface address of interface address TLV.
+ * Adds the interface address to IP interface address TLV.
*
- * @return interfaceAddress interface address
+ * @param interfaceAddress interface address
+ */
+ public void addInterfaceAddres(Ip4Address interfaceAddress) {
+ this.interfaceAddress.add(interfaceAddress);
+ }
+
+ /**
+ * Returns the interface address of IP interface address TLV.
+ *
+ * @return interface address
*/
public List<Ip4Address> interfaceAddress() {
return interfaceAddress;
}
@Override
- public void readFrom(ByteBuf byteBuf) {
- while (byteBuf.readableBytes() >= 4) {
+ public void readFrom(ChannelBuffer channelBuffer) {
+ while (channelBuffer.readableBytes() >= 4) {
byte[] addressbytes = new byte[IsisUtil.FOUR_BYTES];
- byteBuf.readBytes(addressbytes, 0, IsisUtil.FOUR_BYTES);
+ channelBuffer.readBytes(addressbytes, 0, IsisUtil.FOUR_BYTES);
this.interfaceAddress.add(Ip4Address.valueOf(addressbytes));
}
-
}
@Override
public byte[] asBytes() {
byte[] bytes = null;
-
byte[] tlvHeader = tlvHeaderAsByteArray();
byte[] tlvBody = tlvBodyAsBytes();
+ tlvHeader[1] = (byte) tlvBody.length;
bytes = Bytes.concat(tlvHeader, tlvBody);
-
return bytes;
}
/**
- * Gets TLV body of interface address TLV.
+ * Returns TLV body of IP interface address TLV.
*
- * @return byteArray TLV body of interface address TLV.
+ * @return byteArray TLV body of IP interface address TLV
*/
- public byte[] tlvBodyAsBytes() {
-
- List<Byte> bytes = new ArrayList();
+ private byte[] tlvBodyAsBytes() {
+ List<Byte> bytes = new ArrayList<>();
for (Ip4Address ip4Address : this.interfaceAddress) {
bytes.addAll(Bytes.asList(ip4Address.toOctets()));
}
- byte[] byteArray = new byte[bytes.size()];
- int i = 0;
- for (byte byt : bytes) {
- byteArray[i++] = byt;
- }
- return byteArray;
+ return Bytes.toArray(bytes);
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.omitNullValues()
+ .add("interfaceAddress", interfaceAddress)
.toString();
}
}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IpInternalReachabilityTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IpInternalReachabilityTlv.java
new file mode 100644
index 0000000..fd92e1c
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IpInternalReachabilityTlv.java
@@ -0,0 +1,90 @@
+/*
+ * 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.io.isispacket.tlv;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.primitives.Bytes;
+import org.jboss.netty.buffer.ChannelBuffer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Representation of IP internal reachability TLV.
+ */
+public class IpInternalReachabilityTlv extends TlvHeader implements IsisTlv {
+ private List<MetricOfInternalReachability> metricOfInternalReachability = new ArrayList<>();
+
+ /**
+ * Creates an instance of IP internal reachability TLV.
+ *
+ * @param tlvHeader tlvHeader.
+ */
+ public IpInternalReachabilityTlv(TlvHeader tlvHeader) {
+ this.setTlvType(tlvHeader.tlvType());
+ this.setTlvLength(tlvHeader.tlvLength());
+ }
+
+ /**
+ * Adds the metric of internal reachability to internal reachability TLV.
+ *
+ * @param metricValue metric of internal reachability
+ */
+ public void addInternalReachabilityMetric(MetricOfInternalReachability metricValue) {
+ this.metricOfInternalReachability.add(metricValue);
+ }
+
+ @Override
+ public void readFrom(ChannelBuffer channelBuffer) {
+ while (channelBuffer.readableBytes() > 0) {
+ MetricOfInternalReachability metricOfInternalReachability = new MetricOfInternalReachability();
+ metricOfInternalReachability.readFrom(channelBuffer);
+ this.metricOfInternalReachability.add(metricOfInternalReachability);
+ }
+ }
+
+ @Override
+ public byte[] asBytes() {
+ byte[] bytes = null;
+ byte[] tlvHeader = tlvHeaderAsByteArray();
+ byte[] tlvBody = tlvBodyAsBytes();
+ tlvHeader[1] = (byte) tlvBody.length;
+ bytes = Bytes.concat(tlvHeader, tlvBody);
+ return bytes;
+ }
+
+ /**
+ * Returns TLV body of internal reachability TLV.
+ *
+ * @return byteArray TLV body of area address TLV
+ */
+ private byte[] tlvBodyAsBytes() {
+ List<Byte> bytes = new ArrayList<>();
+ for (MetricOfInternalReachability metricOfInternalReachability :
+ this.metricOfInternalReachability) {
+ bytes.addAll(Bytes.asList(metricOfInternalReachability.asBytes()));
+ }
+ return Bytes.toArray(bytes);
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(getClass())
+ .omitNullValues()
+ .add("metricOfInternalReachability", metricOfInternalReachability)
+ .toString();
+ }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsReachabilityTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsReachabilityTlv.java
new file mode 100644
index 0000000..f5e6d43
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsReachabilityTlv.java
@@ -0,0 +1,111 @@
+/*
+ * 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.io.isispacket.tlv;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.primitives.Bytes;
+import org.jboss.netty.buffer.ChannelBuffer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Representation of IS reachability TLV.
+ */
+public class IsReachabilityTlv extends TlvHeader {
+
+ private int reserved;
+ private List<MetricsOfReachability> metricsOfReachabilities = new ArrayList<>();
+
+ /**
+ * Creates an instance of IS reachability TLV.
+ *
+ * @param tlvHeader tlvHeader.
+ */
+ public IsReachabilityTlv(TlvHeader tlvHeader) {
+ this.setTlvType(tlvHeader.tlvType());
+ this.setTlvLength(tlvHeader.tlvLength());
+ }
+
+ /**
+ * Returns the reserved value of IS reachability TLV.
+ *
+ * @return reserved
+ */
+ public int reserved() {
+ return reserved;
+ }
+
+ /**
+ * Sets the reserved value for IS reachability TLV.
+ *
+ * @param reserved reserved
+ */
+ public void setReserved(int reserved) {
+ this.reserved = reserved;
+ }
+
+ /**
+ * Adds the metric of reachability to IS reachability TLV..
+ *
+ * @param metricsOfReachability metric of reachability
+ */
+ public void addMeticsOfReachability(MetricsOfReachability metricsOfReachability) {
+ this.metricsOfReachabilities.add(metricsOfReachability);
+ }
+
+ @Override
+ public void readFrom(ChannelBuffer channelBuffer) {
+ this.setReserved(channelBuffer.readByte());
+ while (channelBuffer.readableBytes() > 0) {
+ MetricsOfReachability metricsOfReachability = new MetricsOfReachability();
+ metricsOfReachability.readFrom(channelBuffer);
+ this.metricsOfReachabilities.add(metricsOfReachability);
+ }
+ }
+
+ @Override
+ public byte[] asBytes() {
+ byte[] bytes = null;
+ byte[] tlvHeader = tlvHeaderAsByteArray();
+ byte[] tlvBody = tlvBodyAsBytes();
+ tlvHeader[1] = (byte) tlvBody.length;
+ bytes = Bytes.concat(tlvHeader, tlvBody);
+ return bytes;
+ }
+
+ /**
+ * Returns TLV body of IS reachability TLV.
+ *
+ * @return byteArray TLV body of area address TLV
+ */
+ private byte[] tlvBodyAsBytes() {
+ List<Byte> bytes = new ArrayList<>();
+ bytes.add((byte) this.reserved());
+ for (MetricsOfReachability metricsOfReachability : this.metricsOfReachabilities) {
+ bytes.addAll(Bytes.asList(metricsOfReachability.asBytes()));
+ }
+ return Bytes.toArray(bytes);
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(getClass())
+ .omitNullValues()
+ .add("metricsOfReachabilities", metricsOfReachabilities)
+ .toString();
+ }
+}
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsisNeighborTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsisNeighborTlv.java
old mode 100755
new mode 100644
index 2b111d4..573568d
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsisNeighborTlv.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsisNeighborTlv.java
@@ -17,7 +17,7 @@
import com.google.common.base.MoreObjects;
import com.google.common.primitives.Bytes;
-import io.netty.buffer.ByteBuf;
+import org.jboss.netty.buffer.ChannelBuffer;
import org.onlab.packet.MacAddress;
import org.onosproject.isis.io.util.IsisUtil;
@@ -25,78 +25,77 @@
import java.util.List;
/**
- * Represents ISIS neighbor TLV.
+ * Representation of ISIS neighbor TLV.
*/
public class IsisNeighborTlv extends TlvHeader implements IsisTlv {
- private List<MacAddress> neighbor = new ArrayList();
+ private List<MacAddress> neighbor = new ArrayList<>();
/**
- * Sets TLV type and TLV length of ISIS neighbor TLV.
+ * Creates an instance of ISIS neighbor TLV.
*
- * @param tlvHeader tlvHeader.
+ * @param tlvHeader tlvHeader
*/
public IsisNeighborTlv(TlvHeader tlvHeader) {
-
this.setTlvType(tlvHeader.tlvType());
this.setTlvLength(tlvHeader.tlvLength());
-
}
/**
- * Gets the MAC address of the neighbor TLV.
+ * Adds the MAC address of the neighbor to ISIS neighbor TLV.
*
- * @return neighbor MAC address of the neighbor TLV
+ * @param macAddress MAC address
+ */
+ public void addNeighbor(MacAddress macAddress) {
+ neighbor.add(macAddress);
+ }
+
+ /**
+ * Returns the MAC address of the ISIS neighbor TLV.
+ *
+ * @return neighbor
*/
public List<MacAddress> neighbor() {
return this.neighbor;
}
@Override
- public void readFrom(ByteBuf byteBuf) {
- while (byteBuf.readableBytes() >= 6) {
+ public void readFrom(ChannelBuffer channelBuffer) {
+ while (channelBuffer.readableBytes() >= 6) {
byte[] addressbytes = new byte[IsisUtil.SIX_BYTES];
- byteBuf.readBytes(addressbytes, 0, IsisUtil.SIX_BYTES);
+ channelBuffer.readBytes(addressbytes, 0, IsisUtil.SIX_BYTES);
this.neighbor.add(MacAddress.valueOf(addressbytes));
}
-
}
@Override
public byte[] asBytes() {
byte[] bytes = null;
-
byte[] tlvHeader = tlvHeaderAsByteArray();
byte[] tlvBody = tlvBodyAsBytes();
+ tlvHeader[1] = (byte) tlvBody.length;
bytes = Bytes.concat(tlvHeader, tlvBody);
-
return bytes;
-
}
/**
- * Gets TLV body of neighbor TLV.
+ * Returns TLV body of ISIS neighbor TLV.
*
- * @return byteArray TLV body of neighbor TLV
+ * @return byteArray TLV body of area address TLV
*/
- public byte[] tlvBodyAsBytes() {
-
- List<Byte> bytes = new ArrayList();
+ private byte[] tlvBodyAsBytes() {
+ List<Byte> bytes = new ArrayList<>();
for (MacAddress macAddress : this.neighbor) {
bytes.addAll(Bytes.asList(macAddress.toBytes()));
}
- byte[] byteArray = new byte[bytes.size()];
- int i = 0;
- for (byte byt : bytes) {
- byteArray[i++] = byt;
- }
- return byteArray;
+ return Bytes.toArray(bytes);
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.omitNullValues()
+ .add("neighbor", neighbor)
.toString();
}
}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsisTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsisTlv.java
old mode 100755
new mode 100644
index fb47057..bc28735
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsisTlv.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsisTlv.java
@@ -16,7 +16,7 @@
package org.onosproject.isis.io.isispacket.tlv;
/**
- * Represents ISIS TLV.
+ * Representation of ISIS TLV.
*/
public interface IsisTlv {
}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/LspEntriesTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/LspEntriesTlv.java
new file mode 100644
index 0000000..5cccfa6
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/LspEntriesTlv.java
@@ -0,0 +1,98 @@
+/*
+ * 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.io.isispacket.tlv;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.primitives.Bytes;
+import org.jboss.netty.buffer.ChannelBuffer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Representation of LSP entries TLV.
+ */
+public class LspEntriesTlv extends TlvHeader implements IsisTlv {
+ private List<LspEntry> lspEntryList = new ArrayList<>();
+
+ /**
+ * Creates an instance of LSP entries TLV.
+ *
+ * @param tlvHeader tlvHeader.
+ */
+ public LspEntriesTlv(TlvHeader tlvHeader) {
+ this.setTlvType(tlvHeader.tlvType());
+ this.setTlvLength(tlvHeader.tlvLength());
+ }
+
+ /**
+ * Returns the LSP entry of LSP entries TLV.
+ *
+ * @return LSP entries
+ */
+ public List<LspEntry> lspEntry() {
+ return lspEntryList;
+ }
+
+ /**
+ * Adds the the LSP entry to LSP entries TLV.
+ *
+ * @param lspEntry LSP entry
+ */
+ public void addLspEntry(LspEntry lspEntry) {
+ this.lspEntryList.add(lspEntry);
+ }
+
+ @Override
+ public void readFrom(ChannelBuffer channelBuffer) {
+ while (channelBuffer.readableBytes() >= 16) {
+ LspEntry lspEntry = new LspEntry();
+ lspEntry.readFrom(channelBuffer.readBytes(16));
+ lspEntryList.add(lspEntry);
+ }
+ }
+
+ @Override
+ public byte[] asBytes() {
+ byte[] bytes = null;
+ byte[] tlvHeader = tlvHeaderAsByteArray();
+ byte[] tlvBody = tlvBodyAsBytes();
+ tlvHeader[1] = (byte) tlvBody.length;
+ bytes = Bytes.concat(tlvHeader, tlvBody);
+ return bytes;
+ }
+
+ /**
+ * Returns TLV body of LSP entries TLV.
+ *
+ * @return byteArray TLV body of LSP entries TLV
+ */
+ private byte[] tlvBodyAsBytes() {
+ List<Byte> bytes = new ArrayList<>();
+ for (LspEntry lspEntry : lspEntryList) {
+ bytes.addAll(Bytes.asList(lspEntry.lspEntryAsBytes()));
+ }
+ return Bytes.toArray(bytes);
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(getClass())
+ .omitNullValues()
+ .add("lspEntryList", lspEntryList)
+ .toString();
+ }
+}
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/LspEntry.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/LspEntry.java
new file mode 100644
index 0000000..184d411
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/LspEntry.java
@@ -0,0 +1,147 @@
+/*
+ * 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.io.isispacket.tlv;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.primitives.Bytes;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.isis.io.util.IsisUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Representation of LSP entry.
+ */
+public class LspEntry {
+
+ private int lspSequenceNumber;
+ private int lspChecksum;
+ private int remainingTime;
+ private String lspId;
+
+
+ /**
+ * Returns LSP sequence number of LSP entry.
+ *
+ * @return LSP sequence number
+ */
+ public int lspSequenceNumber() {
+ return lspSequenceNumber;
+ }
+
+ /**
+ * Sets LSP sequenceNumber for LSP entry.
+ *
+ * @param lspSequenceNumber lspSequenceNumber.
+ */
+ public void setLspSequenceNumber(int lspSequenceNumber) {
+ this.lspSequenceNumber = lspSequenceNumber;
+ }
+
+ /**
+ * Returns LSP checksum of LSP entry.
+ *
+ * @return LSP checksum
+ */
+ public int lspChecksum() {
+ return lspChecksum;
+ }
+
+ /**
+ * Sets LSP checksum for LSP entry.
+ *
+ * @param lspChecksum LSP checksum
+ */
+ public void setLspChecksum(int lspChecksum) {
+ this.lspChecksum = lspChecksum;
+ }
+
+ /**
+ * Returns remaining time of LSP entry.
+ *
+ * @return remaining time
+ */
+ public int remainingTime() {
+ return remainingTime;
+ }
+
+ /**
+ * Sets remaining time for LSP entry.
+ *
+ * @param remainingTime remaining time
+ */
+ public void setRemainingTime(int remainingTime) {
+ this.remainingTime = remainingTime;
+ }
+
+ /**
+ * Returns LSP ID of LSP entry.
+ *
+ * @return LSP ID
+ */
+ public String lspId() {
+ return lspId;
+ }
+
+ /**
+ * Sets LSP ID for LSp entry.
+ *
+ * @param lspId LSP ID
+ */
+ public void setLspId(String lspId) {
+ this.lspId = lspId;
+ }
+
+ /**
+ * Sets the LSP entry values for LSP entry from byte buffer.
+ *
+ * @param channelBuffer channel Buffer instance
+ */
+ public void readFrom(ChannelBuffer channelBuffer) {
+ this.setRemainingTime(channelBuffer.readUnsignedShort());
+ byte[] tempByteArray = new byte[IsisUtil.ID_PLUS_ONE_BYTE];
+ channelBuffer.readBytes(tempByteArray, 0, IsisUtil.ID_PLUS_ONE_BYTE);
+ this.setLspId(IsisUtil.systemIdPlus(tempByteArray));
+ this.setLspSequenceNumber(channelBuffer.readInt());
+ this.setLspChecksum(channelBuffer.readUnsignedByte());
+ }
+
+ /**
+ * Returns LSP entry values as bytes of LSP entry.
+ *
+ * @return byteArray LSP entry values as bytes of LSP entry
+ */
+ public byte[] lspEntryAsBytes() {
+ List<Byte> bytes = new ArrayList<>();
+ bytes.addAll(Bytes.asList(IsisUtil.convertToTwoBytes(this.remainingTime())));
+ bytes.addAll(IsisUtil.sourceAndLanIdToBytes(this.lspId()));
+ bytes.addAll(Bytes.asList(IsisUtil.convertToFourBytes(this.lspSequenceNumber())));
+ bytes.addAll(Bytes.asList(IsisUtil.convertToTwoBytes(this.lspChecksum())));
+ return Bytes.toArray(bytes);
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(getClass())
+ .omitNullValues()
+ .add("lspSequenceNumber", lspSequenceNumber)
+ .add("lspChecksum", lspChecksum)
+ .add("remainingTime", remainingTime)
+ .add("lspId", lspId)
+ .toString();
+ }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/MetricOfInternalReachability.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/MetricOfInternalReachability.java
new file mode 100644
index 0000000..d133656
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/MetricOfInternalReachability.java
@@ -0,0 +1,455 @@
+/*
+ * 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.io.isispacket.tlv;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.primitives.Bytes;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onlab.packet.Ip4Address;
+import org.onosproject.isis.io.util.IsisUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Representation of metric of internal reachability.
+ */
+public class MetricOfInternalReachability {
+ private Ip4Address ipAddress;
+ private Ip4Address subnetAddres;
+ private byte defaultMetric;
+ private byte delayMetric;
+ private byte expenseMetric;
+ private byte errorMetric;
+ private boolean delayMetricSupported;
+ private boolean expenseMetricSupported;
+ private boolean errorMetricSupported;
+ private boolean defaultIsInternal;
+ private boolean defaultDistributionDown;
+ private boolean delayIsInternal;
+ private boolean expenseIsInternal;
+ private boolean errorIsInternal;
+
+ /**
+ * Returns the IP address of metric of internal reachability.
+ *
+ * @return ipAddress IP address of metric of internal reachability
+ */
+ public Ip4Address getIpAddress() {
+ return ipAddress;
+ }
+
+ /**
+ * Sets the IP address for metric of internal reachability.
+ *
+ * @param ipAddress ip address
+ */
+ public void setIpAddress(Ip4Address ipAddress) {
+ this.ipAddress = ipAddress;
+ }
+
+ /**
+ * Returns the subnet address of metric of internal reachability.
+ *
+ * @return subnetAddres subnet address of metric of internal reachability
+ */
+ public Ip4Address getSubnetAddres() {
+ return subnetAddres;
+ }
+
+ /**
+ * Sets the subnet address for metric of internal reachability.
+ *
+ * @param subnetAddres subnet address
+ */
+ public void setSubnetAddres(Ip4Address subnetAddres) {
+ this.subnetAddres = subnetAddres;
+ }
+
+ /**
+ * Returns error metric is internal or not.
+ *
+ * @return true if internal else false
+ */
+ public boolean isErrorIsInternal() {
+ return errorIsInternal;
+ }
+
+ /**
+ * Sets error metric is internal or not.
+ *
+ * @param errorIsInternal true if internal else false
+ */
+ public void setErrorIsInternal(boolean errorIsInternal) {
+ this.errorIsInternal = errorIsInternal;
+ }
+
+ /**
+ * Returns expense metric is internal or not.
+ *
+ * @return true if internal else false
+ */
+ public boolean isExpenseIsInternal() {
+ return expenseIsInternal;
+ }
+
+ /**
+ * Sets expense metric is internal or not.
+ *
+ * @param expenseIsInternal true if internal else false
+ */
+ public void setExpenseIsInternal(boolean expenseIsInternal) {
+ this.expenseIsInternal = expenseIsInternal;
+ }
+
+ /**
+ * Returns delays metric is internal or not.
+ *
+ * @return true if internal else false
+ */
+ public boolean isDelayIsInternal() {
+ return delayIsInternal;
+ }
+
+ /**
+ * Sets delay metric is internal or not.
+ *
+ * @param delayIsInternal true if internal else false
+ */
+ public void setDelayIsInternal(boolean delayIsInternal) {
+ this.delayIsInternal = delayIsInternal;
+ }
+
+ /**
+ * Returns is default distribution is up or down.
+ *
+ * @return true if down else false
+ */
+ public boolean isDefaultDistributionDown() {
+ return defaultDistributionDown;
+ }
+
+ /**
+ * Sets default distribution is up or down.
+ *
+ * @param defaultDistributionDown true if down else false
+ */
+ public void setDefaultDistributionDown(boolean defaultDistributionDown) {
+ this.defaultDistributionDown = defaultDistributionDown;
+ }
+
+ /**
+ * Returns is default metric is internal or not.
+ *
+ * @return true if internal else false
+ */
+ public boolean isDefaultIsInternal() {
+ return defaultIsInternal;
+ }
+
+ /**
+ * Sets default metric is internal or not.
+ *
+ * @param defaultIsInternal true is internal else false
+ */
+ public void setDefaultIsInternal(boolean defaultIsInternal) {
+ this.defaultIsInternal = defaultIsInternal;
+ }
+
+ /**
+ * Returns error metric is supported or not.
+ *
+ * @return true if supported else false
+ */
+ public boolean isErrorMetricSupported() {
+ return errorMetricSupported;
+ }
+
+ /**
+ * Sets error metric is supported or not.
+ *
+ * @param errorMetricSupported true if supported else false
+ */
+ public void setErrorMetricSupported(boolean errorMetricSupported) {
+ this.errorMetricSupported = errorMetricSupported;
+ }
+
+ /**
+ * Returns expense metric is supported or not.
+ *
+ * @return true if supported else false
+ */
+ public boolean isExpenseMetricSupported() {
+ return expenseMetricSupported;
+ }
+
+ /**
+ * Sets expense metric is supported or not.
+ *
+ * @param expenseMetricSupported true if supported else false
+ */
+ public void setExpenseMetricSupported(boolean expenseMetricSupported) {
+ this.expenseMetricSupported = expenseMetricSupported;
+ }
+
+ /**
+ * Returns delay metric is supported or not.
+ *
+ * @return true if supported else false
+ */
+ public boolean isDelayMetricSupported() {
+ return delayMetricSupported;
+ }
+
+ /**
+ * Sets delay metric is supported or not.
+ *
+ * @param delayMetricSupported true if supported else false
+ */
+ public void setDelayMetricSupported(boolean delayMetricSupported) {
+ this.delayMetricSupported = delayMetricSupported;
+ }
+
+ /**
+ * Returns error metric of metric of internal reachability.
+ *
+ * @return errorMetric error metic
+ */
+ public byte errorMetric() {
+ return errorMetric;
+ }
+
+ /**
+ * Sets error metric for metric of internal reachability.
+ *
+ * @param errorMetric error metric
+ */
+ public void setErrorMetric(byte errorMetric) {
+ this.errorMetric = errorMetric;
+ }
+
+ /**
+ * Returns expense metric of metric of internal reachability.
+ *
+ * @return expense metric
+ */
+ public byte expenseMetric() {
+ return expenseMetric;
+ }
+
+ /**
+ * Sets expense metric for metric of internal reachability.
+ *
+ * @param expenseMetric expense metric
+ */
+ public void setExpenseMetric(byte expenseMetric) {
+ this.expenseMetric = expenseMetric;
+ }
+
+ /**
+ * Returns delay metric of metric of internal reachability.
+ *
+ * @return delay metric
+ */
+ public byte delayMetric() {
+ return delayMetric;
+ }
+
+ /**
+ * Sets delay metric for metric of internal reachability.
+ *
+ * @param delayMetric delay metric
+ */
+ public void setDelayMetric(byte delayMetric) {
+ this.delayMetric = delayMetric;
+ }
+
+ /**
+ * Returns default metric of metric of internal reachability.
+ *
+ * @return default metric
+ */
+ public byte defaultMetric() {
+ return defaultMetric;
+ }
+
+ /**
+ * Sets default metric for metric of internal reachability.
+ *
+ * @param defaultMetric default metric
+ */
+ public void setDefaultMetric(byte defaultMetric) {
+ this.defaultMetric = defaultMetric;
+ }
+
+ /**
+ * Sets the metric of internal reachability
+ * values for metric of internal reachability from byte buffer.
+ *
+ * @param channelBuffer channel Buffer instance
+ */
+ public void readFrom(ChannelBuffer channelBuffer) {
+ byte metric = channelBuffer.readByte();
+ this.setDefaultMetric(metric);
+ String metricInBinary = Integer.toBinaryString(Byte.toUnsignedInt(metric));
+ metricInBinary = IsisUtil.toEightBitBinary(metricInBinary);
+ if (metricInBinary.charAt(1) == 0) {
+ this.setDefaultIsInternal(true);
+ } else {
+ this.setDefaultIsInternal(false);
+ }
+ if (metricInBinary.charAt(0) == 0) {
+ this.setDefaultDistributionDown(true);
+ } else {
+ this.setDefaultDistributionDown(false);
+ }
+ byte delayMetric = channelBuffer.readByte();
+ metricInBinary = Integer.toBinaryString(Byte.toUnsignedInt(delayMetric));
+ metricInBinary = IsisUtil.toEightBitBinary(metricInBinary);
+ this.setDelayMetric(Byte.parseByte(metricInBinary.substring(5, metricInBinary.length()), 2));
+ if (metricInBinary.charAt(1) == 0) {
+ this.setDelayIsInternal(true);
+ } else {
+ this.setDelayIsInternal(false);
+ }
+ if (metricInBinary.charAt(0) == 0) {
+ this.setDelayMetricSupported(true);
+ } else {
+ this.setDelayMetricSupported(false);
+ }
+ byte expenseMetric = channelBuffer.readByte();
+ metricInBinary = Integer.toBinaryString(Byte.toUnsignedInt(expenseMetric));
+ metricInBinary = IsisUtil.toEightBitBinary(metricInBinary);
+ this.setExpenseMetric(Byte.parseByte(metricInBinary.substring(5, metricInBinary.length()), 2));
+ if (metricInBinary.charAt(1) == 0) {
+ this.setExpenseIsInternal(true);
+ } else {
+ this.setExpenseIsInternal(false);
+ }
+ if (metricInBinary.charAt(0) == 0) {
+ this.setExpenseMetricSupported(true);
+ } else {
+ this.setExpenseMetricSupported(false);
+ }
+ byte errorMetric = channelBuffer.readByte();
+ metricInBinary = Integer.toBinaryString(Byte.toUnsignedInt(errorMetric));
+ metricInBinary = IsisUtil.toEightBitBinary(metricInBinary);
+ this.setErrorMetric(Byte.parseByte(metricInBinary.substring(5, metricInBinary.length()), 2));
+ if (metricInBinary.charAt(1) == 0) {
+ this.setErrorIsInternal(true);
+ } else {
+ this.setErrorIsInternal(false);
+ }
+ if (metricInBinary.charAt(0) == 0) {
+ this.setErrorMetricSupported(true);
+ } else {
+ this.setErrorMetricSupported(false);
+ }
+ List<Byte> byteList = new ArrayList<>();
+ while (channelBuffer.readableBytes() > 0) {
+ byteList.add(channelBuffer.readByte());
+ }
+ byte[] tempByteArray = new byte[IsisUtil.FOUR_BYTES];
+ channelBuffer.readBytes(tempByteArray, 0, IsisUtil.FOUR_BYTES);
+ this.setIpAddress(Ip4Address.valueOf(tempByteArray));
+
+ tempByteArray = new byte[IsisUtil.FOUR_BYTES];
+ channelBuffer.readBytes(tempByteArray, 0, IsisUtil.FOUR_BYTES);
+ this.setSubnetAddres(Ip4Address.valueOf(tempByteArray));
+ }
+
+ /**
+ * Returns metric of internal reachability values as bytes of metric of internal reachability.
+ *
+ * @return byteArray metric of internal reachability values as bytes of metric of internal reachability
+ */
+ public byte[] asBytes() {
+ List<Byte> bytes = new ArrayList<>();
+ bytes.add(this.defaultMetric());
+ int temp = this.delayMetric();
+ String hsbBits = "";
+ if (this.isDelayMetricSupported()) {
+ hsbBits = "0" + hsbBits;
+ } else {
+ hsbBits = "1" + hsbBits;
+ }
+ if (this.isDelayIsInternal()) {
+ hsbBits = hsbBits + "0";
+ } else {
+ hsbBits = hsbBits + "1";
+ }
+ hsbBits = hsbBits + "00";
+ String binary = hsbBits + IsisUtil.toFourBitBinary(Integer.toBinaryString(temp));
+ bytes.add((byte) Integer.parseInt(binary, 2));
+
+ temp = this.expenseMetric();
+ hsbBits = "";
+ if (this.isExpenseMetricSupported()) {
+ hsbBits = "0" + hsbBits;
+ } else {
+ hsbBits = "1" + hsbBits;
+ }
+ if (this.isExpenseIsInternal()) {
+ hsbBits = hsbBits + "0";
+ } else {
+ hsbBits = hsbBits + "1";
+ }
+ hsbBits = hsbBits + "00";
+ binary = hsbBits + IsisUtil.toFourBitBinary(Integer.toBinaryString(temp));
+ bytes.add((byte) Integer.parseInt(binary, 2));
+
+ temp = this.errorMetric();
+ hsbBits = "";
+ if (this.isErrorMetricSupported()) {
+ hsbBits = "0" + hsbBits;
+ } else {
+ hsbBits = "1" + hsbBits;
+ }
+ if (this.isExpenseIsInternal()) {
+ hsbBits = hsbBits + "0";
+ } else {
+ hsbBits = hsbBits + "1";
+ }
+ hsbBits = hsbBits + "00";
+ binary = hsbBits + IsisUtil.toFourBitBinary(Integer.toBinaryString(temp));
+ bytes.add((byte) Integer.parseInt(binary, 2));
+
+ bytes.addAll(Bytes.asList(this.getIpAddress().toOctets()));
+ bytes.addAll(Bytes.asList(this.getSubnetAddres().toOctets()));
+ return Bytes.toArray(bytes);
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(getClass())
+ .omitNullValues()
+ .add("ipAddress", ipAddress)
+ .add("subnetAddres", subnetAddres)
+ .add("defaultMetric", defaultMetric)
+ .add("delayMetric", delayMetric)
+ .add("expenseMetric", expenseMetric)
+ .add("errorMetric", errorMetric)
+ .add("delayMetricSupported", delayMetricSupported)
+ .add("expenseMetricSupported", expenseMetricSupported)
+ .add("errorMetricSupported", errorMetricSupported)
+ .add("defaultIsInternal", defaultIsInternal)
+ .add("defaultDistributionDown", defaultDistributionDown)
+ .add("delayIsInternal", delayIsInternal)
+ .add("expenseIsInternal", expenseIsInternal)
+ .add("errorIsInternal", errorIsInternal)
+ .toString();
+ }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/MetricsOfReachability.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/MetricsOfReachability.java
new file mode 100644
index 0000000..5274424
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/MetricsOfReachability.java
@@ -0,0 +1,358 @@
+/*
+ * 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.io.isispacket.tlv;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.primitives.Bytes;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.isis.io.util.IsisUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Representation of metric of reachability.
+ */
+public class MetricsOfReachability {
+ private final String value1 = "10000000";
+ private final String value2 = "00000000";
+ private String neighborId;
+ private byte defaultMetric;
+ private byte delayMetric;
+ private byte expenseMetric;
+ private byte errorMetric;
+ private boolean delayMetricSupported;
+ private boolean expenseMetricSupported;
+ private boolean errorMetricSupported;
+ private boolean defaultIsInternal;
+ private boolean delayIsInternal;
+ private boolean expenseIsInternal;
+ private boolean errorIsInternal;
+
+ /**
+ * Returns delay metric is internal or not.
+ *
+ * @return true if internal else false
+ */
+ public boolean isDelayIsInternal() {
+ return delayIsInternal;
+ }
+
+ /**
+ * Sets delay metric is internal or not.
+ *
+ * @param delayIsInternal true if internal else false
+ */
+ public void setDelayIsInternal(boolean delayIsInternal) {
+ this.delayIsInternal = delayIsInternal;
+ }
+
+ /**
+ * Returns expense metric is internal or not.
+ *
+ * @return true if internal else false
+ */
+ public boolean isExpenseIsInternal() {
+ return expenseIsInternal;
+ }
+
+ /**
+ * Sets expense metric is internal or not.
+ *
+ * @param expenseIsInternal true if internal else false
+ */
+ public void setExpenseIsInternal(boolean expenseIsInternal) {
+ this.expenseIsInternal = expenseIsInternal;
+ }
+
+ /**
+ * Returns error metric is internal or not.
+ *
+ * @return true if internal else false
+ */
+ public boolean isErrorIsInternal() {
+ return errorIsInternal;
+ }
+
+ /**
+ * Sets error metric is internal or not.
+ *
+ * @param errorIsInternal true if internal else false
+ */
+ public void setErrorIsInternal(boolean errorIsInternal) {
+ this.errorIsInternal = errorIsInternal;
+ }
+
+ /**
+ * Returns default metric is internal or not.
+ *
+ * @return true if internal else false
+ */
+ public boolean isDefaultIsInternal() {
+ return defaultIsInternal;
+ }
+
+ /**
+ * Sets default metric is internal or not.
+ *
+ * @param defaultIsInternal true if internal else false
+ */
+ public void setDefaultIsInternal(boolean defaultIsInternal) {
+ this.defaultIsInternal = defaultIsInternal;
+ }
+
+ /**
+ * Returns delay metric is supported or not.
+ *
+ * @return true if supported else false
+ */
+ public boolean isDelayMetricSupported() {
+ return delayMetricSupported;
+ }
+
+ /**
+ * Sets delay metric is supported or not.
+ *
+ * @param delayMetricSupported true if supported else false
+ */
+ public void setDelayMetricSupported(boolean delayMetricSupported) {
+ this.delayMetricSupported = delayMetricSupported;
+ }
+
+ /**
+ * Returns expense metric is supported or not.
+ *
+ * @return true if supported else false
+ */
+ public boolean isExpenseMetricSupported() {
+ return expenseMetricSupported;
+ }
+
+ /**
+ * Sets expense metric is supported or not.
+ *
+ * @param expenseMetricSupported true if supported else false
+ */
+ public void setExpenseMetricSupported(boolean expenseMetricSupported) {
+ this.expenseMetricSupported = expenseMetricSupported;
+ }
+
+ /**
+ * Returns error metric is supported or not.
+ *
+ * @return true if supported else false
+ */
+ public boolean isErrorMetricSupported() {
+ return errorMetricSupported;
+ }
+
+ /**
+ * Sets error metric is supported or not.
+ *
+ * @param errorMetricSupported true if supported else false
+ */
+ public void setErrorMetricSupported(boolean errorMetricSupported) {
+ this.errorMetricSupported = errorMetricSupported;
+ }
+
+ /**
+ * Returns neighbor ID of metric of reachability.
+ *
+ * @return neighbor ID
+ */
+ public String neighborId() {
+ return neighborId;
+ }
+
+ /**
+ * Sets neighbor ID for metric of reachability.
+ *
+ * @param neighborId neighbor ID
+ */
+ public void setNeighborId(String neighborId) {
+ this.neighborId = neighborId;
+ }
+
+
+ /**
+ * Returns default metric of metric of reachability.
+ *
+ * @return default metric
+ */
+ public byte defaultMetric() {
+ return defaultMetric;
+ }
+
+ /**
+ * Sets default metric for of reachability.
+ *
+ * @param defaultMetric default metric
+ */
+ public void setDefaultMetric(byte defaultMetric) {
+ this.defaultMetric = defaultMetric;
+ }
+
+ /**
+ * Returns delay metric of metric of reachability.
+ *
+ * @return delay metric
+ */
+ public byte delayMetric() {
+ return delayMetric;
+ }
+
+ /**
+ * Sets delay metric for metric of reachability.
+ *
+ * @param delayMetric delay metric.
+ */
+ public void setDelayMetric(byte delayMetric) {
+ this.delayMetric = delayMetric;
+ }
+
+ /**
+ * Returns Expense metric of metric of reachability.
+ *
+ * @return Expense metric
+ */
+ public byte expenseMetric() {
+ return expenseMetric;
+ }
+
+ /**
+ * Sets Expense metric for metric of reachability.
+ *
+ * @param expenseMetric Expense metric.
+ */
+ public void setExpenseMetric(byte expenseMetric) {
+ this.expenseMetric = expenseMetric;
+ }
+
+ /**
+ * Returns Error metric of metric of reachability.
+ *
+ * @return Error metric
+ */
+ public byte errorMetric() {
+ return errorMetric;
+ }
+
+ /**
+ * Sets Error metric for metric of reachability.
+ *
+ * @param errorMetric Error metric.
+ */
+ public void setErrorMetric(byte errorMetric) {
+ this.errorMetric = errorMetric;
+ }
+
+ /**
+ * Sets the metric of reachability values for metric of reachability from byte buffer.
+ *
+ * @param channelBuffer channel Buffer instance
+ */
+ public void readFrom(ChannelBuffer channelBuffer) {
+ byte metric = channelBuffer.readByte();
+ String metricInBinary = Integer.toBinaryString(Byte.toUnsignedInt(metric));
+ metricInBinary = IsisUtil.toEightBitBinary(metricInBinary);
+ this.setDefaultMetric(metric);
+ this.setDelayMetric(metric);
+ this.setExpenseMetric(metric);
+ this.setErrorMetric(metric);
+ this.setDelayMetric(metric);
+ if (metricInBinary.charAt(0) == 0) {
+ this.setDefaultIsInternal(true);
+ } else {
+ this.setDefaultIsInternal(false);
+ }
+ if (metricInBinary.charAt(0) == 0) {
+ this.setDelayMetricSupported(true);
+ this.setExpenseMetricSupported(true);
+ this.setErrorMetricSupported(true);
+ } else {
+ this.setDelayMetricSupported(false);
+ this.setExpenseMetricSupported(false);
+ this.setErrorMetricSupported(false);
+ }
+ byte temp = channelBuffer.readByte();
+ String internalBit = Integer.toBinaryString(Byte.toUnsignedInt(temp));
+ internalBit = IsisUtil.toEightBitBinary(internalBit);
+ if (internalBit.charAt(1) == 0) {
+ this.setDelayIsInternal(true);
+ }
+ temp = channelBuffer.readByte();
+ internalBit = Integer.toBinaryString(Byte.toUnsignedInt(temp));
+ internalBit = IsisUtil.toEightBitBinary(internalBit);
+ if (internalBit.charAt(1) == 0) {
+ this.setExpenseIsInternal(true);
+ }
+ temp = channelBuffer.readByte();
+ internalBit = Integer.toBinaryString(Byte.toUnsignedInt(temp));
+ internalBit = IsisUtil.toEightBitBinary(internalBit);
+ if (internalBit.charAt(1) == 0) {
+ this.setErrorIsInternal(true);
+ }
+ byte[] tempByteArray = new byte[IsisUtil.ID_PLUS_ONE_BYTE];
+ channelBuffer.readBytes(tempByteArray, 0, IsisUtil.ID_PLUS_ONE_BYTE);
+ this.setNeighborId(IsisUtil.systemIdPlus(tempByteArray));
+ }
+
+ /**
+ * Returns metric of reachability values as bytes of metric of reachability.
+ *
+ * @return byteArray metric of reachability values as bytes of metric of reachability
+ */
+ public byte[] asBytes() {
+ List<Byte> bytes = new ArrayList<>();
+ bytes.add((byte) this.defaultMetric());
+ if (this.isDelayIsInternal()) {
+ bytes.add((byte) Integer.parseInt(value1));
+ } else {
+ bytes.add((byte) Integer.parseInt(value2));
+ }
+ if (this.isExpenseIsInternal()) {
+ bytes.add((byte) Integer.parseInt(value1));
+ } else {
+ bytes.add((byte) Integer.parseInt(value2));
+ }
+ if (this.isErrorIsInternal()) {
+ bytes.add((byte) Integer.parseInt(value1));
+ } else {
+ bytes.add((byte) Integer.parseInt(value2));
+ }
+ bytes.addAll(IsisUtil.sourceAndLanIdToBytes(this.neighborId()));
+ return Bytes.toArray(bytes);
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(getClass())
+ .omitNullValues()
+ .add("neighborId", neighborId)
+ .add("defaultMetric", defaultMetric)
+ .add("delayMetric", delayMetric)
+ .add("expenseMetric", expenseMetric)
+ .add("errorMetric", errorMetric)
+ .add("delayMetricSupported", delayMetricSupported)
+ .add("expenseMetricSupported", expenseMetricSupported)
+ .add("errorMetricSupported", errorMetricSupported)
+ .add("defaultIsInternal", defaultIsInternal)
+ .add("delayIsInternal", delayIsInternal)
+ .add("expenseIsInternal", expenseIsInternal)
+ .add("errorIsInternal", errorIsInternal)
+ .toString();
+ }
+}
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/PaddingTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/PaddingTlv.java
old mode 100755
new mode 100644
index e684dff..7aff5c2
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/PaddingTlv.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/PaddingTlv.java
@@ -17,19 +17,19 @@
import com.google.common.base.MoreObjects;
import com.google.common.primitives.Bytes;
-import io.netty.buffer.ByteBuf;
+import org.jboss.netty.buffer.ChannelBuffer;
import java.util.ArrayList;
import java.util.List;
/**
- * Represents padding TLV.
+ * Representation of padding TLV.
*/
public class PaddingTlv extends TlvHeader implements IsisTlv {
- private List<Byte> paddings = new ArrayList();
+ private List<Byte> paddings = new ArrayList<>();
/**
- * Sets TLV type and TLV length of padding TLV.
+ * Creates an instance of padding TLV.
*
* @param tlvHeader tlvHeader.
*/
@@ -39,9 +39,9 @@
}
@Override
- public void readFrom(ByteBuf byteBuf) {
- while (byteBuf.readableBytes() > 0) {
- this.paddings.add(byteBuf.readByte());
+ public void readFrom(ChannelBuffer channelBuffer) {
+ while (channelBuffer.readableBytes() > 0) {
+ this.paddings.add(channelBuffer.readByte());
}
}
@@ -51,17 +51,18 @@
byte[] tlvHeader = tlvHeaderAsByteArray();
byte[] tlvBody = tlvBodyAsBytes();
+ tlvHeader[1] = (byte) tlvBody.length;
bytes = Bytes.concat(tlvHeader, tlvBody);
return bytes;
}
/**
- * Gets TLV body padding TLV.
+ * Returns TLV body of padding TLV.
*
- * @return areaArea TLV body padding TLV\\
+ * @return byteArray TLV body of padding TLV
*/
- public byte[] tlvBodyAsBytes() {
+ private byte[] tlvBodyAsBytes() {
byte[] areaArea = new byte[this.tlvLength()];
return areaArea;
}
@@ -70,6 +71,7 @@
public String toString() {
return MoreObjects.toStringHelper(getClass())
.omitNullValues()
+ .add("paddings", paddings)
.toString();
}
}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/ProtocolSupportedTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/ProtocolSupportedTlv.java
old mode 100755
new mode 100644
index abc2bee..1c41d12
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/ProtocolSupportedTlv.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/ProtocolSupportedTlv.java
@@ -15,21 +15,22 @@
*/
package org.onosproject.isis.io.isispacket.tlv;
+import com.google.common.base.MoreObjects;
import com.google.common.primitives.Bytes;
-import io.netty.buffer.ByteBuf;
+import org.jboss.netty.buffer.ChannelBuffer;
import java.util.ArrayList;
import java.util.List;
/**
- * Represents Protocol supported TLV.
+ * Representation of protocol supported TLV.
*/
public class ProtocolSupportedTlv extends TlvHeader implements IsisTlv {
- private List<Byte> protocolSupported = new ArrayList();
+ private List<Byte> protocolSupported = new ArrayList<>();
/**
- * Sets TLV type and TLV length of protocol supported TLV.
+ * Creates an instance of protocol supported TLV.
*
* @param tlvHeader tlvHeader.
*/
@@ -41,21 +42,27 @@
}
/**
- * Gets the Protocol Supported by the TLV.
+ * Adds the protocol supported to protocol supported TLV.
*
- * @return Protocol Supported
+ * @param protocolValue protocol supported
+ */
+ public void addProtocolSupported(byte protocolValue) {
+ protocolSupported.add(protocolValue);
+ }
+
+ /**
+ * Returns protocols supported of protocol supported TLV.
+ *
+ * @return protocol supported
*/
public List<Byte> protocolSupported() {
-
return this.protocolSupported;
-
}
@Override
- public void readFrom(ByteBuf byteBuf) {
-
- while (byteBuf.readableBytes() > 0) {
- this.protocolSupported.add(byteBuf.readByte());
+ public void readFrom(ChannelBuffer channelBuffer) {
+ while (channelBuffer.readableBytes() > 0) {
+ this.protocolSupported.add(channelBuffer.readByte());
}
}
@@ -65,8 +72,8 @@
byte[] tlvHeader = tlvHeaderAsByteArray();
byte[] tlvBody = tlvBodyAsBytes();
+ tlvHeader[1] = (byte) tlvBody.length;
bytes = Bytes.concat(tlvHeader, tlvBody);
-
return bytes;
}
@@ -75,9 +82,8 @@
*
* @return byteArray TLV body of protocol supported TLV
*/
- public byte[] tlvBodyAsBytes() {
-
- List<Byte> bytes = new ArrayList();
+ private byte[] tlvBodyAsBytes() {
+ List<Byte> bytes = new ArrayList<>();
for (byte byt : this.protocolSupported) {
bytes.add(byt);
}
@@ -88,4 +94,12 @@
}
return byteArray;
}
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(getClass())
+ .omitNullValues()
+ .add("protocolSupported", protocolSupported)
+ .toString();
+ }
}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvFinder.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvFinder.java
old mode 100755
new mode 100644
index b721cdf..e1fcbdf
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvFinder.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvFinder.java
@@ -15,55 +15,90 @@
*/
package org.onosproject.isis.io.isispacket.tlv;
-import io.netty.buffer.ByteBuf;
-import org.onosproject.isis.io.util.IsisUtil;
+import org.jboss.netty.buffer.ChannelBuffer;
/**
- * Represents TLV finder.
+ * Representation of TLV Finder.
*/
public class TlvFinder extends TlvHeader {
/**
- * Sets the value for TLV header and the body of the TLV.
+ * Sets the value for TLV header.
*
- * @param tlvHeader tlvHeader
- * @param byteBuf byteBuf
- * @return isisTlv ISIS TLV
+ * @param tlvHeader tlvHeader
+ * @param channelBuffer byteBuf
+ * @return isisTlv
*/
- public static IsisTlv findTlv(TlvHeader tlvHeader, ByteBuf byteBuf) {
+ public static IsisTlv findTlv(TlvHeader tlvHeader, ChannelBuffer channelBuffer) {
IsisTlv isisTlv = null;
-
- switch (tlvHeader.tlvType()) {
- case IsisUtil.AREAADDRESS:
+ switch (TlvType.get(tlvHeader.tlvType())) {
+ case AREAADDRESS:
AreaAddressTlv areaAddressTlv = new AreaAddressTlv(tlvHeader);
- areaAddressTlv.readFrom(byteBuf);
+ areaAddressTlv.readFrom(channelBuffer);
isisTlv = areaAddressTlv;
break;
- case IsisUtil.IPINTERFACEADDRESS:
+ case AUTHENTICATION:
+ //TODO
+ break;
+ case EXTENDEDISREACHABILITY:
+ //TODO
+ break;
+ case IDRPINFORMATION:
+ IdrpInformationTlv idrpInformationTlv = new IdrpInformationTlv(tlvHeader);
+ idrpInformationTlv.readFrom(channelBuffer);
+ isisTlv = idrpInformationTlv;
+ break;
+ case IPEXTENDEDREACHABILITY:
+ IpExtendedReachabilityTlv iperTlv = new IpExtendedReachabilityTlv(tlvHeader);
+ iperTlv.readFrom(channelBuffer);
+ isisTlv = iperTlv;
+ break;
+ case IPINTERFACEADDRESS:
IpInterfaceAddressTlv ipTlv = new IpInterfaceAddressTlv(tlvHeader);
- ipTlv.readFrom(byteBuf);
+ ipTlv.readFrom(channelBuffer);
isisTlv = ipTlv;
break;
- case IsisUtil.PROTOCOLSUPPORTED:
+ case IPINTERNALREACHABILITY:
+ IpInternalReachabilityTlv iprTlv = new IpInternalReachabilityTlv(tlvHeader);
+ iprTlv.readFrom(channelBuffer);
+ isisTlv = iprTlv;
+ break;
+ case ISALIAS:
+ break;
+ case PROTOCOLSUPPORTED:
ProtocolSupportedTlv psTlv = new ProtocolSupportedTlv(tlvHeader);
- psTlv.readFrom(byteBuf);
+ psTlv.readFrom(channelBuffer);
isisTlv = psTlv;
break;
- case IsisUtil.ISNEIGHBORS:
+ case ISREACHABILITY:
+ IsReachabilityTlv isrTlv = new IsReachabilityTlv(tlvHeader);
+ isrTlv.readFrom(channelBuffer);
+ isisTlv = isrTlv;
+ break;
+ case ISNEIGHBORS:
IsisNeighborTlv isisNeighborTlv = new IsisNeighborTlv(tlvHeader);
- isisNeighborTlv.readFrom(byteBuf);
+ isisNeighborTlv.readFrom(channelBuffer);
isisTlv = isisNeighborTlv;
break;
- case IsisUtil.PADDING:
+ case LSPENTRY:
+ LspEntriesTlv lspEntriesTlv = new LspEntriesTlv(tlvHeader);
+ lspEntriesTlv.readFrom(channelBuffer);
+ isisTlv = lspEntriesTlv;
+ break;
+ case PADDING:
PaddingTlv paddingTlv = new PaddingTlv(tlvHeader);
- paddingTlv.readFrom(byteBuf);
+ paddingTlv.readFrom(channelBuffer);
isisTlv = paddingTlv;
break;
+ case ADJACENCYSTATE:
+ AdjacencyStateTlv adjacencyStateTlv = new AdjacencyStateTlv(tlvHeader);
+ adjacencyStateTlv.readFrom(channelBuffer);
+ isisTlv = adjacencyStateTlv;
+ break;
default:
break;
}
-
return isisTlv;
}
}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvHeader.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvHeader.java
old mode 100755
new mode 100644
index a645892..9b15cbf
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvHeader.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvHeader.java
@@ -17,29 +17,29 @@
import com.google.common.base.MoreObjects;
import com.google.common.primitives.Bytes;
-import io.netty.buffer.ByteBuf;
+import org.jboss.netty.buffer.ChannelBuffer;
import java.util.ArrayList;
import java.util.List;
/**
- * Represents TLV header.
+ * Representation of TLV header.
*/
public class TlvHeader implements IsisTlv {
private int tlvType;
private int tlvLength;
/**
- * Gets the TLV length of the TLV.
+ * Returns TLV length of TLV.
*
- * @return tlvLength TLV length
+ * @return TLV length
*/
public int tlvLength() {
return tlvLength;
}
/**
- * Sets the TLV length for the mTLV.
+ * Sets TLV length for TLV.
*
* @param tlvLength TLV length
*/
@@ -48,16 +48,16 @@
}
/**
- * Gets the TLV type of the TLV.
+ * Returns TLV type of TLV.
*
- * @return tlvType TLV type
+ * @return TLV type
*/
public int tlvType() {
return tlvType;
}
/**
- * Sets TLV type for the TLV.
+ * Sets TLV type for TLV.
*
* @param tlvType TLV type
*/
@@ -66,32 +66,31 @@
}
/**
- * Sets the TLV values of TLV from b yte buffer.
+ * Sets TLV values from channel buffer.
*
- * @param byteBuf byteBuf.
+ * @param channelBuffer channel Buffer instance
*/
- public void readFrom(ByteBuf byteBuf) {
+ public void readFrom(ChannelBuffer channelBuffer) {
//implemented in sub classes
}
/**
- * Gets the TLV of the TLV as bytes.
+ * Returns TLV as byte array.
*
- * @return null
+ * @return byteArray TLV body of area address TLV
*/
public byte[] asBytes() {
- //implemented the subclasses
return null;
}
/**
- * Gets the TLV header of the TLV.
+ * Returns TLV header of TLV as bytes.
*
- * @return headerLst TLV of the TLV
+ * @return TLV header as bytes
*/
public byte[] tlvHeaderAsByteArray() {
- List<Byte> headerLst = new ArrayList();
+ List<Byte> headerLst = new ArrayList<>();
headerLst.add((byte) this.tlvType);
headerLst.add((byte) this.tlvLength);
return Bytes.toArray(headerLst);
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvType.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvType.java
old mode 100755
new mode 100644
index 5ec9d46..151885a
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvType.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvType.java
@@ -15,8 +15,12 @@
*/
package org.onosproject.isis.io.isispacket.tlv;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Map;
+
/**
- * Represents various values for TLV types.
+ * Representation of various values for TLV types.
*/
public enum TlvType {
AREAADDRESS(1),
@@ -25,19 +29,32 @@
PADDING(8),
LSPENTRY(9),
AUTHENTICATION(10),
- CHECKSUM(12),
+ HOSTNAME(137),
EXTENDEDISREACHABILITY(22),
ISALIAS(24),
IPINTERNALREACHABILITY(128),
PROTOCOLSUPPORTED(129),
IPEXTERNALREACHABILITY(130),
+ IPEXTENDEDREACHABILITY(135),
IDRPINFORMATION(131),
- IPINTERFACEADDRESS(132);
+ IPINTERFACEADDRESS(132),
+ ADJACENCYSTATE(240);
+
+ // Reverse lookup table
+ private static final Map<Integer, TlvType> LOOKUP = new HashMap<>();
+
+ // Populate the lookup table on loading time
+ static {
+ for (TlvType isisTlvType : EnumSet.allOf(TlvType.class)) {
+ LOOKUP.put(isisTlvType.value(), isisTlvType);
+ }
+ }
private int value;
/**
* Sets the TLV type value.
+ *
* @param value value.
*/
TlvType(int value) {
@@ -45,10 +62,21 @@
}
/**
+ * Gets the enum instance from type value - reverse lookup purpose.
+ *
+ * @param tlvTypeValue TLV type value
+ * @return ISIS TLV type instance
+ */
+ public static TlvType get(int tlvTypeValue) {
+ return LOOKUP.get(tlvTypeValue);
+ }
+
+ /**
* Gets value.
+ *
* @return value
*/
public int value() {
return value;
}
-}
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvsToBytes.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvsToBytes.java
old mode 100755
new mode 100644
index f9a9bb8..e3eba57
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvsToBytes.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvsToBytes.java
@@ -16,23 +16,33 @@
package org.onosproject.isis.io.isispacket.tlv;
import com.google.common.primitives.Bytes;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
/**
- * Represents conversion of TLV's to bytes.
+ * Representation of conversion of TLV's to bytes.
*/
public final class TlvsToBytes {
+
+ protected static final Logger log = LoggerFactory.getLogger(TlvsToBytes.class);
+
+ /**
+ * Creates an instance.
+ */
+ private TlvsToBytes() {
+ }
+
/**
* Sets the ISIS TLV and returns in the form of bytes.
*
- * @param isisTlv isisTlv
- * @return tlvBytes TLV bytes
+ * @param isisTlv isisTlv.
+ * @return tlvBytes
*/
public static List<Byte> tlvToBytes(IsisTlv isisTlv) {
-
- List<Byte> tlvBytes = new ArrayList();
+ List<Byte> tlvBytes = new ArrayList<>();
if (isisTlv instanceof AreaAddressTlv) {
AreaAddressTlv areaAddressTlv = (AreaAddressTlv) isisTlv;
tlvBytes.addAll(Bytes.asList(areaAddressTlv.asBytes()));
@@ -48,16 +58,33 @@
} else if (isisTlv instanceof IsisNeighborTlv) {
IsisNeighborTlv isisNeighborTlv = (IsisNeighborTlv) isisTlv;
tlvBytes.addAll(Bytes.asList(isisNeighborTlv.asBytes()));
+ } else if (isisTlv instanceof AdjacencyStateTlv) {
+ AdjacencyStateTlv isisAdjacencyState
+ = (AdjacencyStateTlv) isisTlv;
+ tlvBytes.addAll(Bytes.asList(isisAdjacencyState.asBytes()));
+ } else if (isisTlv instanceof HostNameTlv) {
+ HostNameTlv hostNameTlv
+ = (HostNameTlv) isisTlv;
+ tlvBytes.addAll(Bytes.asList(hostNameTlv.asBytes()));
+ } else if (isisTlv instanceof IpExtendedReachabilityTlv) {
+ IpExtendedReachabilityTlv ipExtendedReachabilityTlv
+ = (IpExtendedReachabilityTlv) isisTlv;
+ tlvBytes.addAll(Bytes.asList(ipExtendedReachabilityTlv.asBytes()));
+ } else if (isisTlv instanceof IpInternalReachabilityTlv) {
+ IpInternalReachabilityTlv ipInternalReachabilityTlv
+ = (IpInternalReachabilityTlv) isisTlv;
+ tlvBytes.addAll(Bytes.asList(ipInternalReachabilityTlv.asBytes()));
+ } else if (isisTlv instanceof IsReachabilityTlv) {
+ IsReachabilityTlv isReachabilityTlv
+ = (IsReachabilityTlv) isisTlv;
+ tlvBytes.addAll(Bytes.asList(isReachabilityTlv.asBytes()));
+ } else if (isisTlv instanceof LspEntriesTlv) {
+ LspEntriesTlv lspEntriesTlv
+ = (LspEntriesTlv) isisTlv;
+ tlvBytes.addAll(Bytes.asList(lspEntriesTlv.asBytes()));
} else {
- System.out.println("UNKNOWN TLV TYPE ::TlvsToBytes ");
+ log.debug("TlvsToBytes::UNKNOWN TLV TYPE ::TlvsToBytes ");
}
-
return tlvBytes;
}
- /**
- * Creates an instance.
- */
- private TlvsToBytes() {
- //private constructor
- }
}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/package-info.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/package-info.java
old mode 100755
new mode 100644
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/AdministrativeGroup.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/AdministrativeGroup.java
new file mode 100644
index 0000000..8e6dfa7
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/AdministrativeGroup.java
@@ -0,0 +1,114 @@
+/*
+ * 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.io.isispacket.tlv.subtlv;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.primitives.Bytes;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.isis.io.isispacket.tlv.TlvHeader;
+import org.onosproject.isis.io.util.IsisUtil;
+
+
+/**
+ * Representation of an administrative group.
+ */
+public class AdministrativeGroup extends TlvHeader implements TrafficEngineeringSubTlv {
+
+ private int administrativeGroup;
+
+ /**
+ * Creates an administrative group instance.
+ *
+ * @param header Tlv Header instance
+ */
+ public AdministrativeGroup(TlvHeader header) {
+ this.setTlvType(header.tlvType());
+ this.setTlvLength(header.tlvLength());
+ }
+
+ /**
+ * Gets administrative group value.
+ *
+ * @return administrative group value
+ */
+ public int administrativeGroup() {
+ return administrativeGroup;
+ }
+
+ /**
+ * Sets administrative group value.
+ *
+ * @param administrativeGroup value
+ */
+ public void setAdministrativeGroup(int administrativeGroup) {
+ this.administrativeGroup = administrativeGroup;
+ }
+
+ /**
+ * Gets administrative group value.
+ *
+ * @return administrativeGroup value
+ */
+ public int getAdministrativeGroupValue() {
+ return this.administrativeGroup;
+ }
+
+ /**
+ * Reads bytes from channel buffer.
+ *
+ * @param channelBuffer Channel buffer instance
+ */
+ public void readFrom(ChannelBuffer channelBuffer) {
+ byte[] tempByteArray = new byte[tlvLength()];
+ channelBuffer.readBytes(tempByteArray, 0, tlvLength());
+ this.setAdministrativeGroup(IsisUtil.byteToInteger(tempByteArray));
+ }
+
+ /**
+ * Returns administrative group as byte array.
+ *
+ * @return administrative group instance as byte array
+ */
+ public byte[] asBytes() {
+ byte[] linkSubType = null;
+
+ byte[] linkSubTlvHeader = tlvHeaderAsByteArray();
+ byte[] linkSubTlvBody = tlvBodyAsBytes();
+ linkSubType = Bytes.concat(linkSubTlvHeader, linkSubTlvBody);
+
+ return linkSubType;
+ }
+
+ /**
+ * Gets administrative group body as byte array.
+ *
+ * @return byte array of sub tlv administrative group
+ */
+ public byte[] tlvBodyAsBytes() {
+
+ byte[] linkSubTypeBody;
+ linkSubTypeBody = IsisUtil.convertToFourBytes(this.administrativeGroup);
+
+ return linkSubTypeBody;
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(getClass())
+ .add("administrativeGroup", administrativeGroup)
+ .toString();
+ }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/MaximumBandwidth.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/MaximumBandwidth.java
new file mode 100644
index 0000000..e5cba2b
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/MaximumBandwidth.java
@@ -0,0 +1,101 @@
+/*
+ * 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.io.isispacket.tlv.subtlv;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.primitives.Bytes;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.isis.io.isispacket.tlv.TlvHeader;
+import org.onosproject.isis.io.util.IsisUtil;
+
+
+/**
+ * Representation of maximum bandwidth TE value.
+ */
+public class MaximumBandwidth extends TlvHeader implements TrafficEngineeringSubTlv {
+ private float maximumBandwidth;
+
+ /**
+ * Creates an instance of maximum bandwidth.
+ *
+ * @param header tlv header instance
+ */
+ public MaximumBandwidth(TlvHeader header) {
+ this.setTlvType(header.tlvType());
+ this.setTlvLength(header.tlvLength());
+ }
+
+ /**
+ * Sets value of maximum bandwidth.
+ *
+ * @param maximumBandwidth value of maximum bandwidth
+ */
+ public void setMaximumBandwidth(float maximumBandwidth) {
+ this.maximumBandwidth = maximumBandwidth;
+ }
+
+ /**
+ * Gets value of maximum bandwidth.
+ *
+ * @return maximumBandwidth value of maximum bandwidth
+ */
+ public float getMaximumBandwidthValue() {
+ return this.maximumBandwidth;
+ }
+
+ /**
+ * Reads bytes from channel buffer.
+ *
+ * @param channelBuffer channel buffer instance
+ */
+ public void readFrom(ChannelBuffer channelBuffer) {
+ byte[] tempByteArray = new byte[tlvLength()];
+ channelBuffer.readBytes(tempByteArray, 0, tlvLength());
+ int maxBandwidth = (IsisUtil.byteToInteger(tempByteArray));
+ this.setMaximumBandwidth(Float.intBitsToFloat(maxBandwidth));
+ }
+
+ /**
+ * Gets byte array of maximum bandwidth sub tlv.
+ *
+ * @return byte array of maximum bandwidth sub tlv
+ */
+ public byte[] asBytes() {
+ byte[] linkSubType = null;
+ byte[] linkSubTlvHeader = tlvHeaderAsByteArray();
+ byte[] linkSubTlvBody = tlvBodyAsBytes();
+ linkSubType = Bytes.concat(linkSubTlvHeader, linkSubTlvBody);
+
+ return linkSubType;
+ }
+
+ /**
+ * Gets maximum bandwidth sub tlv byte array.
+ *
+ * @return byte array of maximum bandwidth sub tlv
+ */
+ public byte[] tlvBodyAsBytes() {
+ byte[] linkSubTypeBody;
+ linkSubTypeBody = IsisUtil.convertToFourBytes(Float.floatToIntBits(this.maximumBandwidth));
+ return linkSubTypeBody;
+ }
+
+ public String toString() {
+ return MoreObjects.toStringHelper(getClass())
+ .add("maximumBandwidth", maximumBandwidth)
+ .toString();
+ }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/MaximumReservableBandwidth.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/MaximumReservableBandwidth.java
new file mode 100644
index 0000000..22d96db
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/MaximumReservableBandwidth.java
@@ -0,0 +1,104 @@
+/*
+ * 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.io.isispacket.tlv.subtlv;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.primitives.Bytes;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.isis.io.isispacket.tlv.TlvHeader;
+import org.onosproject.isis.io.util.IsisUtil;
+
+
+/**
+ * Representation of maximum reservable bandwidth TE value.
+ */
+public class MaximumReservableBandwidth extends TlvHeader implements TrafficEngineeringSubTlv {
+ private float maximumReservableBandwidth;
+
+ /**
+ * Creates an instance of maximum reservable bandwidth.
+ *
+ * @param header tlv header
+ */
+ public MaximumReservableBandwidth(TlvHeader header) {
+ this.setTlvType(header.tlvType());
+ this.setTlvLength(header.tlvLength());
+ }
+
+ /**
+ * Sets value of maximum reversible bandwidth.
+ *
+ * @param maximumBandwidth maximum reversible bandwidth
+ */
+ public void setMaximumBandwidth(float maximumBandwidth) {
+ this.maximumReservableBandwidth = maximumBandwidth;
+ }
+
+ /**
+ * Gets value of maximum reversible bandwidth.
+ *
+ * @return maximumBandwidth maximum reversible bandwidth
+ */
+ public float getMaximumBandwidthValue() {
+ return this.maximumReservableBandwidth;
+ }
+
+ /**
+ * Reads bytes from channel buffer.
+ *
+ * @param channelBuffer channel buffer instance
+ */
+ public void readFrom(ChannelBuffer channelBuffer) {
+ byte[] tempByteArray = new byte[tlvLength()];
+ channelBuffer.readBytes(tempByteArray, 0, tlvLength());
+ int maxBandwidth = (IsisUtil.byteToInteger(tempByteArray));
+ this.setMaximumBandwidth(Float.intBitsToFloat(maxBandwidth));
+ }
+
+ /**
+ * Returns byte array of maximum reservable bandwidth.
+ *
+ * @return byte array of maximum reservable bandwidth
+ */
+ public byte[] asBytes() {
+ byte[] linkSubType = null;
+
+ byte[] linkSubTlvHeader = tlvHeaderAsByteArray();
+ byte[] linkSubTlvBody = tlvBodyAsBytes();
+ linkSubType = Bytes.concat(linkSubTlvHeader, linkSubTlvBody);
+ return linkSubType;
+
+ }
+
+ /**
+ * Gets maximum reservable bandwidth sub tlv body as byte array.
+ *
+ * @return byte of maximum reservable bandwidth sub tlv body
+ */
+ public byte[] tlvBodyAsBytes() {
+ byte[] linkSubTypeBody;
+ linkSubTypeBody = IsisUtil.convertToFourBytes(Float.floatToIntBits(this.maximumReservableBandwidth));
+
+ return linkSubTypeBody;
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(getClass())
+ .add("maximumReservableBandwidth", maximumReservableBandwidth)
+ .toString();
+ }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..7958f53
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvFinder.java
@@ -0,0 +1,75 @@
+/*
+ * 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.io.isispacket.tlv.subtlv;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.isis.io.isispacket.tlv.TlvHeader;
+
+/**
+ * Representation of sub tlv finder.
+ */
+public final class SubTlvFinder {
+ /**
+ * Creates an instance.
+ */
+ private SubTlvFinder() {
+
+ }
+
+ /**
+ * Sets the value for TLV header and to find sub TLV and populate.
+ *
+ * @param tlvHeader tlvHeader
+ * @param channelBuffer byteBuf
+ * @return subTlv traffic engineering sub tlv
+ */
+ public static TrafficEngineeringSubTlv findSubTlv(TlvHeader tlvHeader, ChannelBuffer channelBuffer) {
+
+ TrafficEngineeringSubTlv subTlv = null;
+
+ switch (SubTlvType.get(tlvHeader.tlvType())) {
+ case ADMINISTRATIVEGROUP:
+ AdministrativeGroup administrativeGroup = new AdministrativeGroup(tlvHeader);
+ administrativeGroup.readFrom(channelBuffer);
+ subTlv = administrativeGroup;
+ break;
+ case MAXIMUMBANDWIDTH:
+ MaximumBandwidth maximumBandwidth = new MaximumBandwidth(tlvHeader);
+ maximumBandwidth.readFrom(channelBuffer);
+ subTlv = maximumBandwidth;
+ break;
+ case MAXIMUMRESERVABLEBANDWIDTH:
+ MaximumReservableBandwidth maxResBandwidth = new MaximumReservableBandwidth(tlvHeader);
+ maxResBandwidth.readFrom(channelBuffer);
+ subTlv = maxResBandwidth;
+ break;
+ case TRAFFICENGINEERINGMETRIC:
+ TrafficEngineeringMetric teMetric = new TrafficEngineeringMetric(tlvHeader);
+ teMetric.readFrom(channelBuffer);
+ subTlv = teMetric;
+ break;
+ case UNRESERVEDBANDWIDTH:
+ UnreservedBandwidth unreservedBandwidth = new UnreservedBandwidth(tlvHeader);
+ unreservedBandwidth.readFrom(channelBuffer);
+ subTlv = unreservedBandwidth;
+ break;
+ default:
+ //TODO
+ break;
+ }
+ return subTlv;
+ }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvToBytes.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvToBytes.java
new file mode 100644
index 0000000..8774c04
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvToBytes.java
@@ -0,0 +1,69 @@
+/*
+ * 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.io.isispacket.tlv.subtlv;
+
+import com.google.common.primitives.Bytes;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Representation of conversion of TLV's to bytes.
+ */
+public final class SubTlvToBytes {
+
+ protected static final Logger log = LoggerFactory.getLogger(SubTlvToBytes.class);
+
+ /**
+ * Creates an instance.
+ */
+ private SubTlvToBytes() {
+ //private constructor
+ }
+
+ /**
+ * Sets the ISIS sub TLV and returns in the form of bytes.
+ *
+ * @param subTlv isisTlv.
+ * @return subTlvBytes
+ */
+ public static List<Byte> tlvToBytes(TrafficEngineeringSubTlv subTlv) {
+
+ List<Byte> subTlvBytes = new ArrayList<>();
+ if (subTlv instanceof AdministrativeGroup) {
+ AdministrativeGroup administrativeGroup = (AdministrativeGroup) subTlv;
+ subTlvBytes.addAll(Bytes.asList(administrativeGroup.asBytes()));
+ } else if (subTlv instanceof MaximumBandwidth) {
+ MaximumBandwidth maximumBandwidth = (MaximumBandwidth) subTlv;
+ subTlvBytes.addAll(Bytes.asList(maximumBandwidth.asBytes()));
+ } else if (subTlv instanceof MaximumReservableBandwidth) {
+ MaximumReservableBandwidth maximumReservableBandwidth = (MaximumReservableBandwidth) subTlv;
+ subTlvBytes.addAll(Bytes.asList(maximumReservableBandwidth.asBytes()));
+ } else if (subTlv instanceof TrafficEngineeringMetric) {
+ TrafficEngineeringMetric trafficEngineeringMetric = (TrafficEngineeringMetric) subTlv;
+ subTlvBytes.addAll(Bytes.asList(trafficEngineeringMetric.asBytes()));
+ } else if (subTlv instanceof UnreservedBandwidth) {
+ UnreservedBandwidth unreservedBandwidth = (UnreservedBandwidth) subTlv;
+ subTlvBytes.addAll(Bytes.asList(unreservedBandwidth.asBytes()));
+ } else {
+ log.debug("TlvsToBytes::UNKNOWN TLV TYPE ::TlvsToBytes ");
+ }
+
+ return subTlvBytes;
+ }
+}
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvType.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvType.java
new file mode 100644
index 0000000..b02da25
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvType.java
@@ -0,0 +1,71 @@
+/*
+ * 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.io.isispacket.tlv.subtlv;
+
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Representation of sub tlv type.
+ */
+public enum SubTlvType {
+ ADMINISTRATIVEGROUP(9),
+ MAXIMUMBANDWIDTH(6),
+ MAXIMUMRESERVABLEBANDWIDTH(7),
+ TRAFFICENGINEERINGMETRIC(5),
+ UNRESERVEDBANDWIDTH(8);
+
+ // Reverse lookup table
+ private static final Map<Integer, SubTlvType> LOOKUP = new HashMap<>();
+
+ // Populate the lookup table on loading time
+ static {
+ for (SubTlvType subTlvType : EnumSet.allOf(SubTlvType.class)) {
+ LOOKUP.put(subTlvType.value(), subTlvType);
+ }
+ }
+
+ private int value;
+
+ /**
+ * Sets the sub TLV type value.
+ *
+ * @param value value.
+ */
+ SubTlvType(int value) {
+ this.value = value;
+ }
+
+ /**
+ * Gets the enum instance from type value - reverse lookup purpose.
+ *
+ * @param subTlvTypeValue TLV type value
+ * @return ISIS sub TLV type instance
+ */
+ public static SubTlvType get(int subTlvTypeValue) {
+ return LOOKUP.get(subTlvTypeValue);
+ }
+
+ /**
+ * Gets value.
+ *
+ * @return value
+ */
+ public int value() {
+ return value;
+ }
+}
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/TrafficEngineeringMetric.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/TrafficEngineeringMetric.java
new file mode 100644
index 0000000..cad36e4
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/TrafficEngineeringMetric.java
@@ -0,0 +1,104 @@
+/*
+ * 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.io.isispacket.tlv.subtlv;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.primitives.Bytes;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.isis.io.isispacket.tlv.TlvHeader;
+import org.onosproject.isis.io.util.IsisUtil;
+
+/**
+ * Representation of traffic engineering metric TE value.
+ */
+public class TrafficEngineeringMetric extends TlvHeader implements TrafficEngineeringSubTlv {
+ private long trafficEngineeringMetric;
+
+ /**
+ * Creates an instance of traffic engineering metric .
+ *
+ * @param header tlv header instance
+ */
+ public TrafficEngineeringMetric(TlvHeader header) {
+ this.setTlvType(header.tlvType());
+ this.setTlvLength(header.tlvLength());
+ }
+
+ /**
+ * Sets TE metric value.
+ *
+ * @param trafficEngineeringMetric value of trafficEngineeringMetric
+ */
+ public void setTrafficEngineeringMetric(long trafficEngineeringMetric) {
+ this.trafficEngineeringMetric = trafficEngineeringMetric;
+ }
+
+ /**
+ * Gets TE metric value.
+ *
+ * @return value of traffic engineering metric
+ */
+ public long getTrafficEngineeringMetricValue() {
+ return this.trafficEngineeringMetric;
+ }
+
+ /**
+ * Reads bytes from channel buffer .
+ *
+ * @param channelBuffer channel buffer instance
+ */
+ public void readFrom(ChannelBuffer channelBuffer) {
+ byte[] tempByteArray = new byte[tlvLength()];
+ channelBuffer.readBytes(tempByteArray, 0, tlvLength());
+ this.setTrafficEngineeringMetric(IsisUtil.byteToLong(tempByteArray));
+ }
+
+ /**
+ * Gets instance as byte array.
+ *
+ * @return instance as byte array
+ */
+ public byte[] asBytes() {
+ byte[] linkSubType = null;
+
+ byte[] linkSubTlvHeader = tlvHeaderAsByteArray();
+ byte[] linkSubTlvBody = tlvBodyAsBytes();
+ linkSubType = Bytes.concat(linkSubTlvHeader, linkSubTlvBody);
+
+ return linkSubType;
+ }
+
+ /**
+ * Gets trafficEngineeringMetric as byte array .
+ *
+ * @return byte array of trafficEngineeringMetric
+ */
+ public byte[] tlvBodyAsBytes() {
+
+ byte[] linkSubTypeBody;
+ linkSubTypeBody = IsisUtil.convertToFourBytes(this.trafficEngineeringMetric);
+
+ return linkSubTypeBody;
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(getClass())
+ .omitNullValues()
+ .add("trafficEngineeringMetric", trafficEngineeringMetric)
+ .toString();
+ }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/TrafficEngineeringSubTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/TrafficEngineeringSubTlv.java
new file mode 100644
index 0000000..022cf9c
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/TrafficEngineeringSubTlv.java
@@ -0,0 +1,23 @@
+/*
+ * 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.io.isispacket.tlv.subtlv;
+
+/**
+ * Representation of traffic engineering sub tlv.
+ */
+public interface TrafficEngineeringSubTlv {
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..7ba34f0
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/UnreservedBandwidth.java
@@ -0,0 +1,116 @@
+/*
+ * 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.io.isispacket.tlv.subtlv;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.primitives.Bytes;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.isis.io.isispacket.tlv.TlvHeader;
+import org.onosproject.isis.io.util.IsisUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Representation of an unreserved band width TE value.
+ */
+public class UnreservedBandwidth extends TlvHeader implements TrafficEngineeringSubTlv {
+ private List<Float> unReservedBandwidth = new ArrayList<>();
+
+ /**
+ * Creates an instance of unreserved band width.
+ *
+ * @param header tlv header instance
+ */
+ public UnreservedBandwidth(TlvHeader header) {
+ this.setTlvType(header.tlvType());
+ this.setTlvLength(header.tlvLength());
+ }
+
+ /**
+ * Adds value of un reserved bandwidth .
+ *
+ * @param unreservedBandwidth value of un reserved bandwidth
+ */
+ public void addUnReservedBandwidth(float unreservedBandwidth) {
+ this.unReservedBandwidth.add(unreservedBandwidth);
+ }
+
+ /**
+ * Gets list of un reserved bandwidth .
+ *
+ * @return List of un reserved bandwidth
+ */
+ public List<Float> getUnReservedBandwidthValue() {
+ return this.unReservedBandwidth;
+ }
+
+ /**
+ * Reads bytes from channel buffer .
+ *
+ * @param channelBuffer channel buffer instance
+ */
+ public void readFrom(ChannelBuffer channelBuffer) {
+ while (channelBuffer.readableBytes() >= IsisUtil.FOUR_BYTES) {
+ int maxReversibleBandwidth = channelBuffer.readInt();
+ this.addUnReservedBandwidth(Float.intBitsToFloat(maxReversibleBandwidth));
+ }
+ }
+
+ /**
+ * Gets instance as byte array.
+ *
+ * @return instance as byte array
+ */
+ public byte[] asBytes() {
+ byte[] linkSubType = null;
+
+ byte[] linkSubTlvHeader = tlvHeaderAsByteArray();
+ byte[] linkSubTlvBody = tlvBodyAsBytes();
+ linkSubType = Bytes.concat(linkSubTlvHeader, linkSubTlvBody);
+
+ return linkSubType;
+ }
+
+ /**
+ * Gets unreserved bandwidth as byte array.
+ *
+ * @return unreserved bandwidth as byte array
+ */
+ public byte[] tlvBodyAsBytes() {
+ List<Byte> linkSubTypeBody = new ArrayList<>();
+ if (this.unReservedBandwidth.size() < 8) {
+ int size = IsisUtil.EIGHT_BYTES - this.unReservedBandwidth.size();
+ for (int i = 0; i < size; i++) {
+ linkSubTypeBody.addAll(Bytes.asList(IsisUtil.convertToFourBytes(IsisUtil.INITIAL_BANDWIDTH)));
+ }
+ }
+ for (Float unreservedBandwidth : this.unReservedBandwidth) {
+ int unresBandwidth = Float.floatToIntBits(unreservedBandwidth);
+ linkSubTypeBody.addAll(Bytes.asList(IsisUtil.convertToFourBytes(unresBandwidth)));
+ }
+
+ return Bytes.toArray(linkSubTypeBody);
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(getClass())
+ .omitNullValues()
+ .add("unReservedBandwidth", unReservedBandwidth)
+ .toString();
+ }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/package-info.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/package-info.java
new file mode 100644
index 0000000..699b513
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * 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.
+ */
+
+/**
+ * Implementation of the ISIS protocol.
+ */
+package org.onosproject.isis.io.isispacket.tlv.subtlv;
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/package-info.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/package-info.java
old mode 100755
new mode 100644
index d1601a4..4d5ac06
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/package-info.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/package-info.java
@@ -15,6 +15,6 @@
*/
/**
- * Implementation of the ISIS protocol.
+ * Implementation of the ISIS protocol IO.
*/
package org.onosproject.isis.io;
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/ChecksumCalculator.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/ChecksumCalculator.java
new file mode 100644
index 0000000..d6b91f9
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/ChecksumCalculator.java
@@ -0,0 +1,81 @@
+/*
+ * 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.io.util;
+
+
+import java.util.Arrays;
+
+/**
+ * Calculates checksum for ISIS LSP packets.
+ */
+public class ChecksumCalculator {
+
+ /**
+ * Verifies the checksum is valid in given LSP packet bytes.
+ *
+ * @param lspPacket lsp as byte array
+ * @param lspChecksumPos1 position of checksum bit in packet
+ * @param lspChecksumPos2 position of checksum bit in packet
+ * @return true if valid else false
+ */
+ public boolean validateLspCheckSum(byte[] lspPacket, int lspChecksumPos1, int lspChecksumPos2) {
+ byte[] checksum = calculateLspChecksum(lspPacket, lspChecksumPos1, lspChecksumPos2);
+ if (lspPacket[lspChecksumPos1] == checksum[0] && lspPacket[lspChecksumPos2] == checksum[1]) {
+ return true;
+ }
+ return false;
+ }
+
+
+ /**
+ * Calculates the LSP checksum.
+ *
+ * @param lspBytes as byte array
+ * @param lspChecksumPos1 position of checksum bit in packet
+ * @param lspChecksumPos2 position of checksum bit in packet
+ * @return checksum bytes
+ */
+ public byte[] calculateLspChecksum(byte[] lspBytes, int lspChecksumPos1, int lspChecksumPos2) {
+
+ byte[] tempLsaByte = Arrays.copyOf(lspBytes, lspBytes.length);
+
+ int[] checksumOut = {0, 0};
+ tempLsaByte[lspChecksumPos1] = 0;
+ tempLsaByte[lspChecksumPos2] = 0;
+ byte[] byteCheckSum = {0, 0};
+ if (lspBytes != null) {
+ for (int i = 12; i < tempLsaByte.length; i++) {
+ checksumOut[0] = checksumOut[0] + ((int) tempLsaByte[i] & 0xFF);
+ checksumOut[1] = checksumOut[1] + checksumOut[0];
+ }
+ checksumOut[0] = checksumOut[0] % 255;
+ checksumOut[1] = checksumOut[1] % 255;
+ }
+ int byte1 = (int) ((tempLsaByte.length - lspChecksumPos1 - 1) * checksumOut[0] - checksumOut[1]) % 255;
+ if (byte1 <= 0) {
+ byte1 += 255;
+ }
+ int byte2 = 510 - checksumOut[0] - byte1;
+ if (byte2 > 255) {
+ byte2 -= 255;
+ }
+
+ byteCheckSum[0] = (byte) byte1;
+ byteCheckSum[1] = (byte) byte2;
+
+ return byteCheckSum;
+ }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..53ef74b
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/IsisConstants.java
@@ -0,0 +1,57 @@
+/*
+ * 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.io.util;
+
+/**
+ * Representation of ISIS constants.
+ */
+public final class IsisConstants {
+ public static final char PDU_LENGTH = 1497; // mtu (1500) - (3) LLC
+ public static final int MINIMUM_FRAME_LEN = 1521;
+ public static final int METADATA_LEN = 7;
+ public static final String SHOST = "127.0.0.1";
+ public static final int SPORT = 3000;
+ public static final byte L2 = 1;
+ public static final int IRPDISCRIMINATOR = 131;
+ public static final int ISISVERSION = 1;
+ public static final int RESERVED = 0;
+ public static final int MAXAREAADDRESS = 0;
+ public static final int IDLENGTH = 0;
+ public static final int PROTOCOLSUPPORTED = 204;
+ public static final int LOCALCIRCUITIDFORP2P = 130;
+ public static final int P2PHELLOHEADERLENGTH = 20;
+ public static final int HELLOHEADERLENGTH = 27;
+ public static final int CSNPDUHEADERLENGTH = 33;
+ public static final int PSNPDUHEADERLENGTH = 17;
+ public static final int PDULENGTHPOSITION = 17;
+ public static final int COMMONHEADERLENGTH = 8;
+ public static final int LSPMAXAGE = 1200;
+ public static final int LSPREFRESH = 900;
+ public static final int MAXSEQUENCENUMBER = Integer.MAX_VALUE;
+ public static final int STARTLSSEQUENCENUM = 1;
+ public static final int LENGTHPOSITION = 8;
+ public static final int RESERVEDPOSITION = 6;
+ public static final int CHECKSUMPOSITION = 24;
+ public static final String REFRESHLSP = "refreshLsp";
+ public static final String MAXAGELSP = "maxAgeLsp";
+
+ /**
+ * Non parameterized constructor.
+ */
+ private IsisConstants() {
+ }
+}
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 e929f8b..318eb1b
--- 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
@@ -15,11 +15,13 @@
*/
package org.onosproject.isis.io.util;
-
-import com.google.common.base.MoreObjects;
import com.google.common.primitives.Bytes;
+import org.onlab.packet.Ip4Address;
import org.onosproject.isis.io.isispacket.tlv.PaddingTlv;
import org.onosproject.isis.io.isispacket.tlv.TlvHeader;
+import org.onosproject.isis.io.isispacket.tlv.TlvType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import javax.xml.bind.DatatypeConverter;
import java.util.ArrayList;
@@ -27,56 +29,57 @@
import java.util.StringTokenizer;
/**
- * Represents ISIS utils.
+ * Representation of ISIS utils.
*/
public final class IsisUtil {
- public static final int AREAADDRESS = 1;
- public static final int ISREACHABILITY = 2;
- public static final int ISNEIGHBORS = 6;
- public static final int PADDING = 8;
- public static final int LSPENTRY = 9;
- public static final int AUTHENTICATION = 10;
- public static final int CHECKSUM = 12;
- public static final int EXTENDEDISREACHABILITY = 22;
- public static final int ISALIAS = 24;
- public static final int IPINTERNALREACHABILITY = 128;
- public static final int PROTOCOLSUPPORTED = 129;
- public static final int IPEXTERNALREACHABILITY = 130;
- public static final int IDRPINFORMATION = 131;
- public static final int IPINTERFACEADDRESS = 132;
- public static final int L1HELLOPDU = 1;
- public static final int L2HELLOPDU = 2;
- public static final int P2PHELLOPDU = 3;
- public static final int L1LSPDU = 18;
- public static final int L2LSPDU = 20;
- public static final int L1CSNP = 24;
- public static final int L2CSNP = 25;
- public static final int L1PSNP = 26;
- public static final int L2PSNP = 27;
- public static final int L1L2_LS_PDUHEADERLENGTH = 27;
- public static final int P2PPDUHEADERLENGTH = 20;
- public static final int PSNPPDUHEADERLENGTH = 17;
- public static final char ETHER_FRAME_LEN = 1514;
+ public static final int ETHER_HEADER_LEN = 17;
public static final int ID_SIX_BYTES = 6;
public static final int ID_PLUS_ONE_BYTE = 7;
public static final int ID_PLUS_TWO_BYTE = 8;
public static final int THREE_BYTES = 3;
public static final int SIX_BYTES = 6;
+ public static final int EIGHT_BYTES = 8;
public static final int FOUR_BYTES = 4;
public static final int PADDING_FIXED_LENGTH = 255;
+ public static final int TLVHEADERLENGTH = 2;
+ public static final int INITIAL_BANDWIDTH = 12500000;
+ private static final Logger log = LoggerFactory.getLogger(IsisUtil.class);
/**
- * Creates an instance of this class.
+ * Creates an instance.
*/
private IsisUtil() {
}
/**
+ * Checks given IPs are in same network or not.
+ *
+ * @param ip1 IP address
+ * @param ip2 IP address
+ * @param mask network mask
+ * @return true if both are in same network else false
+ */
+ public static boolean sameNetwork(Ip4Address ip1, Ip4Address ip2, byte[] mask) {
+ try {
+ byte[] a1 = ip1.toOctets();
+ byte[] a2 = ip2.toOctets();
+ for (int i = 0; i < a1.length; i++) {
+ if ((a1[i] & mask[i]) != (a2[i] & mask[i])) {
+ return false;
+ }
+ }
+ } catch (Exception e) {
+ log.debug("Exception::IsisUtil::sameNetwork:: {}", e.getMessage());
+ }
+ return true;
+ }
+
+ /**
* Parse byte array to string system ID.
*
* @param bytes system ID
- * @return systemId system ID.
+ * @return systemId system ID
*/
public static String systemId(byte[] bytes) {
String systemId = "";
@@ -97,7 +100,7 @@
* Parse byte array to LAN ID.
*
* @param bytes LAN ID
- * @return systemId system ID.
+ * @return systemIdPlus system ID
*/
public static String systemIdPlus(byte[] bytes) {
String systemId = "";
@@ -119,23 +122,18 @@
* Parse byte array to area address.
*
* @param bytes area address
- * @return areaAddress area address
+ * @return areaAddres area address
*/
public static String areaAddres(byte[] bytes) {
- int count = 0;
- String areaAddress = "";
+ String areaAddres = "";
for (Byte byt : bytes) {
String hexa = Integer.toHexString(Byte.toUnsignedInt(byt));
if (hexa.length() % 2 != 0) {
hexa = "0" + hexa;
}
- if (count == 0) {
- hexa = hexa + ".";
- }
- areaAddress = areaAddress + hexa;
- count++;
+ areaAddres = areaAddres + hexa;
}
- return areaAddress;
+ return areaAddres;
}
/**
@@ -144,76 +142,98 @@
* @param address area address
* @return areaAddress area address
*/
- public static List<Byte> areaAddresToBytes(String address) {
- List<Byte> idLst = new ArrayList();
- StringTokenizer tokenizer = new StringTokenizer(address, ".");
- int count = 0;
- while (tokenizer.hasMoreElements()) {
- String str = tokenizer.nextToken();
- if (str.length() % 2 != 0) {
- str = "0" + str;
- }
- if (count > 0) {
-
- for (int i = 0; i < str.length(); i = i + 2) {
- idLst.add((byte) Integer.parseInt(str.substring(i, i + 2), 16));
- }
- } else {
- idLst.add((byte) Integer.parseInt(str, 16));
- }
- count++;
+ public static List<Byte> areaAddressToBytes(String address) {
+ List<Byte> idList = new ArrayList<>();
+ for (int i = 0; i < address.length(); i = i + 2) {
+ Character c1 = address.charAt(i);
+ Character c2 = address.charAt(i + 1);
+ String str = c1.toString() + c2.toString();
+ idList.add((byte) Integer.parseInt(str, 16));
}
- return idLst;
+ return idList;
}
/**
- * Gets PDU header length.
+ * Adds the PDU length in packet.
*
- * @param pduType PDU type
- * @return headerLength header length
+ * @param isisPacket ISIS packet
+ * @param lengthBytePos1 length byte position
+ * @param lengthBytePos2 length byte position
+ * @param reservedBytePos reserved byte position
+ * @return byte array with PDU length
*/
- public static int getPduHeaderLength(int pduType) {
- int headerLength = 0;
- switch (pduType) {
- case L1HELLOPDU:
- case L2HELLOPDU:
- case L1LSPDU:
- case L2LSPDU:
- headerLength = L1L2_LS_PDUHEADERLENGTH;
- break;
- case P2PHELLOPDU:
- headerLength = P2PPDUHEADERLENGTH;
- break;
- case L1PSNP:
- case L2PSNP:
- headerLength = PSNPPDUHEADERLENGTH;
- break;
- default:
- break;
+ public static byte[] addLengthAndMarkItInReserved(byte[] isisPacket, int lengthBytePos1,
+ int lengthBytePos2, int reservedBytePos) {
+ //Set the length of the packet
+ //Get the total length of the packet
+ int length = isisPacket.length;
+ //Convert the lenth to two bytes as the length field is 2 bytes
+ byte[] lenthInTwoBytes = IsisUtil.convertToTwoBytes(length);
+ //isis header 3rd and 4th position represents length
+ isisPacket[lengthBytePos1] = lenthInTwoBytes[0]; //assign 1st byte in lengthBytePos1
+ isisPacket[lengthBytePos2] = lenthInTwoBytes[1]; //assign 2st byte in lengthBytePos2
+ isisPacket[reservedBytePos] = (byte) lengthBytePos1;
+ return isisPacket;
+ }
+
+ /**
+ * Adds the checksum in packet.
+ *
+ * @param isisPacket ISIS packet
+ * @param checksumBytePos1 checksum byte position
+ * @param checksumBytePos2 checksum byte position
+ * @return byte array with PDU length
+ */
+ public static byte[] addChecksum(byte[] isisPacket, int checksumBytePos1, int checksumBytePos2) {
+ //Set the checksum for the packet
+ //Convert the lenth to two bytes as the length field is 2 bytes
+ byte[] checksumInTwoBytes = new ChecksumCalculator().calculateLspChecksum(
+ isisPacket, checksumBytePos1, checksumBytePos2);
+ //isis header 3rd and 4th position represents length
+ isisPacket[checksumBytePos1] = checksumInTwoBytes[0];
+ isisPacket[checksumBytePos2] = checksumInTwoBytes[1];
+ return isisPacket;
+ }
+
+ /**
+ * Adds frame a packet of 1498 of size.
+ *
+ * @param isisPacket ISIS packet
+ * @param interfaceIndex interface index
+ * @return byte array with 1498 is the length
+ */
+ public static byte[] framePacket(byte[] isisPacket, int interfaceIndex) {
+ //Set the length of the packet
+ //Get the total length of the packet
+ int length = isisPacket.length;
+ //PDU_LENGTH + 1 byte for interface index
+ if (length < IsisConstants.PDU_LENGTH + 1) {
+ byte[] bytes = new byte[IsisConstants.PDU_LENGTH + 1];
+ System.arraycopy(isisPacket, 0, bytes, 0, length);
+ bytes[IsisConstants.PDU_LENGTH] = (byte) interfaceIndex;
+ return bytes;
}
- return headerLength;
+ return isisPacket;
}
/**
* Parse source and LAN ID.
*
* @param id source and LAN ID
- * @return sourceAndLanIdToBytes source and LAN ID
+ * @return source and LAN ID
*/
public static List<Byte> sourceAndLanIdToBytes(String id) {
- List<Byte> idLst = new ArrayList();
-
- StringTokenizer tokenizer = new StringTokenizer(id, ".");
+ List<Byte> idList = new ArrayList<>();
+ StringTokenizer tokenizer = new StringTokenizer(id, "." + "-");
while (tokenizer.hasMoreElements()) {
int i = 0;
String str = tokenizer.nextToken();
- idLst.add((byte) Integer.parseInt(str.substring(0, i + 2), 16));
+ idList.add((byte) Integer.parseInt(str.substring(0, i + 2), 16));
if (str.length() > 2) {
- idLst.add((byte) Integer.parseInt(str.substring(i + 2, str.length()), 16));
+ idList.add((byte) Integer.parseInt(str.substring(i + 2, str.length()), 16));
}
-
}
- return idLst;
+ return idList;
}
/**
@@ -222,20 +242,20 @@
* @param currentLength current length
* @return byteArray padding array
*/
- public static byte[] paddingForPdu(int currentLength) {
+ public static byte[] getPaddingTlvs(int currentLength) {
List<Byte> bytes = new ArrayList<>();
- while (ETHER_FRAME_LEN > currentLength) {
- int length = ETHER_FRAME_LEN - currentLength;
+ while (IsisConstants.PDU_LENGTH > currentLength) {
+ int length = IsisConstants.PDU_LENGTH - currentLength;
TlvHeader tlvHeader = new TlvHeader();
- tlvHeader.setTlvType(PADDING);
+ tlvHeader.setTlvType(TlvType.PADDING.value());
if (length >= PADDING_FIXED_LENGTH) {
tlvHeader.setTlvLength(PADDING_FIXED_LENGTH);
} else {
- tlvHeader.setTlvLength(ETHER_FRAME_LEN - currentLength);
+ tlvHeader.setTlvLength(IsisConstants.PDU_LENGTH - (currentLength + TLVHEADERLENGTH));
}
PaddingTlv tlv = new PaddingTlv(tlvHeader);
bytes.addAll(Bytes.asList(tlv.asBytes()));
- currentLength = currentLength + tlv.tlvLength();
+ currentLength = currentLength + tlv.tlvLength() + TLVHEADERLENGTH;
}
byte[] byteArray = new byte[bytes.size()];
int i = 0;
@@ -243,7 +263,6 @@
byteArray[i++] = byt;
}
return byteArray;
-
}
/**
@@ -308,10 +327,138 @@
return numInBytes;
}
- @Override
- public String toString() {
- return MoreObjects.toStringHelper(getClass())
- .omitNullValues()
- .toString();
+ /**
+ * Converts a byte to integer variable.
+ *
+ * @param bytesToConvert bytes to convert
+ * @return integer representation of bytes
+ */
+ public static int byteToInteger(byte[] bytesToConvert) {
+ final StringBuilder builder = new StringBuilder();
+ for (byte eachByte : bytesToConvert) {
+ builder.append(String.format("%02x", eachByte));
+ }
+ int number = Integer.parseInt(builder.toString(), 16);
+ return number;
}
-}
\ No newline at end of file
+
+ /**
+ * Converts a byte to long variable.
+ *
+ * @param bytesToConvert bytes to convert
+ * @return long representation of bytes
+ */
+ public static long byteToLong(byte[] bytesToConvert) {
+ final StringBuilder builder = new StringBuilder();
+ for (byte eachByte : bytesToConvert) {
+ builder.append(String.format("%02x", eachByte));
+ }
+ long number = Long.parseLong(builder.toString(), 16);
+ return number;
+ }
+
+ /**
+ * Converts a number to four bytes.
+ *
+ * @param numberToConvert number to convert
+ * @return numInBytes given number as bytes
+ */
+ public static byte[] convertToFourBytes(long numberToConvert) {
+ byte[] numInBytes = new byte[4];
+ String s1 = Long.toHexString(numberToConvert);
+ if (s1.length() % 2 != 0) {
+ s1 = "0" + s1;
+ }
+ if (s1.length() == 16) {
+ s1 = s1.substring(8, s1.length());
+ }
+ byte[] hexas = DatatypeConverter.parseHexBinary(s1);
+ if (hexas.length == 1) {
+ numInBytes[0] = 0;
+ numInBytes[1] = 0;
+ numInBytes[2] = 0;
+ numInBytes[3] = hexas[0];
+ } else if (hexas.length == 2) {
+ numInBytes[0] = 0;
+ numInBytes[1] = 0;
+ numInBytes[2] = hexas[0];
+ numInBytes[3] = hexas[1];
+ } else if (hexas.length == 3) {
+ numInBytes[0] = 0;
+ numInBytes[1] = hexas[0];
+ numInBytes[2] = hexas[1];
+ numInBytes[3] = hexas[2];
+ } else {
+ numInBytes[0] = hexas[0];
+ numInBytes[1] = hexas[1];
+ numInBytes[2] = hexas[2];
+ numInBytes[3] = hexas[3];
+ }
+ return numInBytes;
+ }
+
+ /**
+ * Converts a number to eight bit binary.
+ *
+ * @param binaryString string to binary
+ * @return numInBytes given number as bytes
+ */
+ public static String toEightBitBinary(String binaryString) {
+ String eightBit = binaryString;
+ if (eightBit.length() % 8 != 0) {
+ int numOfZero = 8 - eightBit.length();
+ while (numOfZero > 0) {
+ eightBit = "0" + eightBit;
+ numOfZero--;
+ }
+ }
+ return eightBit;
+ }
+
+ /**
+ * Converts a number to four bit binary.
+ *
+ * @param binaryString string to binary
+ * @return numInBytes given number as bytes
+ */
+ public static String toFourBitBinary(String binaryString) {
+ String fourBit = binaryString;
+ if (fourBit.length() % 4 != 0) {
+ int numOfZero = 4 - fourBit.length();
+ while (numOfZero > 0) {
+ fourBit = "0" + fourBit;
+ numOfZero--;
+ }
+ }
+ return fourBit;
+ }
+
+ /**
+ * Converts a number to three bytes.
+ *
+ * @param numberToConvert number to convert
+ * @return given number as bytes
+ */
+ public static byte[] convertToThreeBytes(int numberToConvert) {
+ byte[] numInBytes = new byte[4];
+ String s1 = Integer.toHexString(numberToConvert);
+ if (s1.length() % 2 != 0) {
+ s1 = "0" + s1;
+ }
+ byte[] hexas = DatatypeConverter.parseHexBinary(s1);
+ if (hexas.length == 1) {
+ numInBytes[0] = 0;
+ numInBytes[1] = 0;
+ numInBytes[2] = hexas[0];
+ } else if (hexas.length == 2) {
+ numInBytes[0] = 0;
+ numInBytes[1] = hexas[0];
+ numInBytes[2] = hexas[1];
+ } else {
+ numInBytes[0] = hexas[0];
+ numInBytes[1] = hexas[1];
+ numInBytes[2] = hexas[2];
+ }
+ return numInBytes;
+ }
+}
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/package-info.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/package-info.java
old mode 100755
new mode 100644
index 0fca245..9156248
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/package-info.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/package-info.java
@@ -15,6 +15,6 @@
*/
/**
- * Implementation of the ISIS protocol.
+ * Implementation of the ISIS protocol util.
*/
package org.onosproject.isis.io.util;
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/package-info.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/package-info.java
old mode 100755
new mode 100644