ONOS-4083,ONOS-4084:ISIS PDU TLV Data Structures
Change-Id: Ice0d42f2c886fa5f398b562e126614ed45f858a2
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();
+ }
+}