ONOS-4086 to ONOS-4091, ONOS-4098 to ONOS-4100:ISIS controller implementation
Change-Id: I7be52805652fe762baf808515401d6b5042b2aa5
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/LsPdu.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/LsPdu.java
index 11de4f4..f6bd85c 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/LsPdu.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/LsPdu.java
@@ -280,7 +280,7 @@
* Returns the packet data unit length of link state packet.
* Entire length of this PDU, in octets
*
- * @return pduLength packte date unit length
+ * @return pduLength packet data unit length
*/
public int pduLength() {
return pduLength;
@@ -290,7 +290,7 @@
* Sets the packet data unit length for link state packet.
* Entire Length of this PDU, in octets
*
- * @param pduLength packte data length
+ * @param pduLength packet data length
*/
public void setPduLength(int pduLength) {
this.pduLength = pduLength;
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
index 14962d8..f1549e4 100644
--- 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
@@ -220,10 +220,9 @@
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;
}
@@ -246,8 +245,8 @@
} else {
controlInfo = controlInfo + "0";
}
- String prefixlength = IsisUtil.toEightBitBinary(Integer.toBinaryString(this.prefixLength()));
- controlInfo = controlInfo + prefixlength.substring(2, prefixlength.length());
+ String prefixLength = IsisUtil.toEightBitBinary(Integer.toBinaryString(this.prefixLength()));
+ controlInfo = controlInfo + prefixLength.substring(2, prefixLength.length());
bodyLst.add(Byte.parseByte(controlInfo, 2));
if (this.isSubTlvPresence()) {
bodyLst.add(this.subTlvLength());
@@ -255,6 +254,8 @@
bodyLst.addAll(SubTlvToBytes.tlvToBytes(trafficEngineeringSubTlv));
}
}
+ bodyLst.addAll(Bytes.asList(IsisUtil.prefixToBytes(this.prefix())));
+
return Bytes.toArray(bodyLst);
}
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsExtendedReachability.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsExtendedReachability.java
new file mode 100644
index 0000000..c6cd9f0
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsExtendedReachability.java
@@ -0,0 +1,151 @@
+/*
+ * 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.SubTlvType;
+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 IS extended reachability TLV.
+ */
+public class IsExtendedReachability extends TlvHeader implements IsisTlv {
+
+ private String neighborId;
+ private int metric;
+ private List<TrafficEngineeringSubTlv> trafEnginSubTlv = new ArrayList<>();
+
+ /**
+ * Creates an instance of IP external reachability TLV.
+ *
+ * @param tlvHeader TLV header
+ */
+ public IsExtendedReachability(TlvHeader tlvHeader) {
+ this.setTlvType(tlvHeader.tlvType());
+ this.setTlvLength(tlvHeader.tlvLength());
+ }
+
+ /**
+ * Returns neighbor ID.
+ *
+ * @return neighbor ID
+ */
+ public String neighborId() {
+ return neighborId;
+ }
+
+ /**
+ * Sets neighbor ID.
+ *
+ * @param neighborId neighbor ID
+ */
+ public void setNeighborId(String neighborId) {
+ this.neighborId = neighborId;
+ }
+
+ /**
+ * Returns metric.
+ *
+ * @return metric
+ */
+ public int metric() {
+ return metric;
+ }
+
+ /**
+ * Sets metric.
+ *
+ * @param metric metric
+ */
+ public void setMetric(int metric) {
+ this.metric = metric;
+ }
+
+ /**
+ * Adds the traffic engineering sub TLV to IS extended reachability TLV.
+ *
+ * @param trafEnginSubTlv traffic engineering sub TLV
+ */
+ public void addSubTlv(TrafficEngineeringSubTlv trafEnginSubTlv) {
+ this.trafEnginSubTlv.add(trafEnginSubTlv);
+ }
+
+ @Override
+ public void readFrom(ChannelBuffer channelBuffer) {
+ byte[] tempByteArray = new byte[IsisUtil.ID_SIX_BYTES];
+ channelBuffer.readBytes(tempByteArray, 0, IsisUtil.ID_SIX_BYTES);
+ this.setNeighborId(IsisUtil.systemId(tempByteArray));
+ this.setMetric(channelBuffer.readUnsignedMedium());
+ while (channelBuffer.readableBytes() > 0) {
+ TlvHeader tlvHeader = new TlvHeader();
+ tlvHeader.setTlvType(channelBuffer.readByte());
+ tlvHeader.setTlvLength(channelBuffer.readByte());
+ SubTlvType tlvValue = SubTlvType.get(tlvHeader.tlvType());
+ if (tlvValue != null) {
+ this.addSubTlv(SubTlvFinder.findSubTlv(tlvHeader,
+ channelBuffer.readBytes(tlvHeader.tlvLength())));
+ } else {
+ channelBuffer.readBytes(tlvHeader.tlvLength());
+ }
+ }
+ }
+
+ @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 extended reachability TLV.
+ *
+ * @return byteArray TLV body of IS extended reachability TLV.
+ */
+ private byte[] tlvBodyAsBytes() {
+ List<Byte> byteList = new ArrayList<>();
+ byteList.addAll(IsisUtil.sourceAndLanIdToBytes(this.neighborId()));
+ byteList.addAll(Bytes.asList(IsisUtil.convertToThreeBytes(this.metric())));
+ if (this.trafEnginSubTlv.size() > 0) {
+ for (TrafficEngineeringSubTlv trafficEngineeringSubTlv : this.trafEnginSubTlv) {
+ byteList.addAll(SubTlvToBytes.tlvToBytes(trafficEngineeringSubTlv));
+ }
+ }
+ return Bytes.toArray(byteList);
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(getClass())
+ .omitNullValues()
+ .add("neighborId", neighborId)
+ .add("metric", metric)
+ .add("trafEnginSubTlv", trafEnginSubTlv)
+ .toString();
+ }
+
+}
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
index 179b3e6..4ad4871 100644
--- 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
@@ -358,10 +358,7 @@
} 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));
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
index d6bb909..5e31c17 100644
--- 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
@@ -42,7 +42,10 @@
//TODO
break;
case EXTENDEDISREACHABILITY:
- //TODO
+ IsExtendedReachability isExtendedReachability =
+ new IsExtendedReachability(tlvHeader);
+ isExtendedReachability.readFrom(channelBuffer);
+ isisTlv = isExtendedReachability;
break;
case HOSTNAME:
HostNameTlv hostNameTlv = new HostNameTlv(tlvHeader);
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
index e3eba57..7978385 100644
--- 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
@@ -82,6 +82,10 @@
LspEntriesTlv lspEntriesTlv
= (LspEntriesTlv) isisTlv;
tlvBytes.addAll(Bytes.asList(lspEntriesTlv.asBytes()));
+ } else if (isisTlv instanceof IsExtendedReachability) {
+ IsExtendedReachability isExtendedReachability
+ = (IsExtendedReachability) isisTlv;
+ tlvBytes.addAll(Bytes.asList(isExtendedReachability.asBytes()));
} else {
log.debug("TlvsToBytes::UNKNOWN TLV TYPE ::TlvsToBytes ");
}
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/IsisConfig.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/IsisConfig.java
deleted file mode 100644
index 9b37cbd..0000000
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/IsisConfig.java
+++ /dev/null
@@ -1,44 +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.util;
-
-import com.fasterxml.jackson.databind.JsonNode;
-
-/**
- * Representation of ISIS config.
- */
-public enum IsisConfig {
- INSTANCE;
- private JsonNode jsonNodes = null;
-
- /**
- * Returns the config value.
- *
- * @return jsonNodes json node
- */
- public JsonNode config() {
- return jsonNodes;
- }
-
- /**
- * Sets the config value for jsonNode.
- *
- * @param jsonNodes json node
- */
- public void setConfig(JsonNode jsonNodes) {
- this.jsonNodes = jsonNodes;
- }
-}
\ 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
index fe84218..cf5871a 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/IsisConstants.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/IsisConstants.java
@@ -16,21 +16,25 @@
package org.onosproject.isis.io.util;
+import org.onlab.packet.Ip4Address;
+
/**
* Representation of ISIS Constants.
*/
public final class IsisConstants {
- public static final char PDU_LENGTH = 1497; // mtu (1500) - (3) LLC
+ public static final char PDU_LENGTH = 1497;
+ public static final char CONFIG_LENGTH = 1498;
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 Ip4Address DEFAULTIP = Ip4Address.valueOf("0.0.0.0");
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 SYSTEMIDLENGTH = 0;
public static final int PROTOCOLSUPPORTED = 204;
public static final int LOCALCIRCUITIDFORP2P = 130;
public static final int P2PHELLOHEADERLENGTH = 20;
@@ -48,6 +52,27 @@
public static final int CHECKSUMPOSITION = 24;
public static final String REFRESHLSP = "refreshLsp";
public static final String MAXAGELSP = "maxAgeLsp";
+ public static final String DEFAULTLANID = "0000.0000.0000.00";
+ public static final String PROCESSESID = "processId";
+ public static final String INTERFACE = "interface";
+ public static final String INTERFACEIP = "interfaceIp";
+ public static final String NETWORKMASK = "networkMask";
+ public static final String INTERFACEINDEX = "interfaceIndex";
+ public static final String INTERMEDIATESYSTEMNAME = "intermediateSystemName";
+ public static final String SYSTEMID = "systemId";
+ public static final String LANID = "lanId";
+ public static final String IDLENGTH = "idLength";
+ public static final String MAXAREAADDRESSES = "maxAreaAddresses";
+ public static final String RESERVEDPACKETCIRCUITTYPE = "reservedPacketCircuitType";
+ public static final String CIRCUITID = "circuitId";
+ public static final String NETWORKTYPE = "networkType";
+ public static final String AREAADDRESS = "areaAddress";
+ public static final String AREALENGTH = "areaLength";
+ public static final String LSPID = "lspId";
+ public static final String HOLDINGTIME = "holdingTime";
+ public static final String HELLOINTERVAL = "helloInterval";
+ public static final String PRIORITY = "priority";
+ public static final String MACADDRESS = "macAddress";
/**
* Non parameterized constructor.
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/IsisUtil.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/IsisUtil.java
index 44ad9e0..c21a93b 100644
--- 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
@@ -391,7 +391,7 @@
isisHeader.setIrpDiscriminator((byte) IsisConstants.IRPDISCRIMINATOR);
isisHeader.setPduHeaderLength((byte) IsisConstants.P2PHELLOHEADERLENGTH);
isisHeader.setVersion((byte) IsisConstants.ISISVERSION);
- isisHeader.setIdLength((byte) IsisConstants.IDLENGTH);
+ isisHeader.setIdLength((byte) IsisConstants.SYSTEMIDLENGTH);
isisHeader.setIsisPduType(IsisPduType.P2PHELLOPDU.value());
isisHeader.setVersion2((byte) IsisConstants.ISISVERSION);
//isisHeader.setReserved((byte) IsisConstants.RESERVED);
@@ -484,7 +484,7 @@
isisHeader.setIrpDiscriminator((byte) IsisConstants.IRPDISCRIMINATOR);
isisHeader.setPduHeaderLength((byte) IsisConstants.HELLOHEADERLENGTH);
isisHeader.setVersion((byte) IsisConstants.ISISVERSION);
- isisHeader.setIdLength((byte) IsisConstants.IDLENGTH);
+ isisHeader.setIdLength((byte) IsisConstants.SYSTEMIDLENGTH);
if (isisPduType == IsisPduType.L1HELLOPDU) {
isisHeader.setIsisPduType(IsisPduType.L1HELLOPDU.value());
lanId = isisInterface.l1LanId();
@@ -693,4 +693,19 @@
}
return prefix;
}
+
+ /**
+ * Converts the prefix to bytes.
+ *
+ * @param prefix prefix
+ * @return prefix to bytes
+ */
+ public static byte[] prefixToBytes(String prefix) {
+ List<Byte> byteList = new ArrayList<>();
+ StringTokenizer tokenizer = new StringTokenizer(prefix, ".");
+ while (tokenizer.hasMoreTokens()) {
+ byteList.add((byte) Integer.parseInt(tokenizer.nextToken()));
+ }
+ return Bytes.toArray(byteList);
+ }
}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/LspGenerator.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/LspGenerator.java
index 1dfb1a4..c6ae962 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/LspGenerator.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/LspGenerator.java
@@ -26,6 +26,7 @@
import org.onosproject.isis.io.isispacket.pdu.LsPdu;
import org.onosproject.isis.io.isispacket.tlv.AreaAddressTlv;
import org.onosproject.isis.io.isispacket.tlv.HostNameTlv;
+import org.onosproject.isis.io.isispacket.tlv.IpExtendedReachabilityTlv;
import org.onosproject.isis.io.isispacket.tlv.IpInterfaceAddressTlv;
import org.onosproject.isis.io.isispacket.tlv.IpInternalReachabilityTlv;
import org.onosproject.isis.io.isispacket.tlv.IsReachabilityTlv;
@@ -115,7 +116,7 @@
} else if (isisInterface.networkType() == IsisNetworkType.P2P) {
MacAddress neighborMac = isisInterface.neighbors().iterator().next();
IsisNeighbor neighbor = isisInterface.lookup(neighborMac);
- metricsOfReachability.setNeighborId(neighbor.neighborSystemId());
+ metricsOfReachability.setNeighborId(neighbor.neighborSystemId() + ".00");
}
isReachabilityTlv.addMeticsOfReachability(metricsOfReachability);
@@ -137,10 +138,25 @@
metricOfIntRea.setErrorMetric((byte) 0);
metricOfIntRea.setErrorMetricSupported(false);
metricOfIntRea.setExpenseIsInternal(true);
- metricOfIntRea.setIpAddress(isisInterface.interfaceIpAddress());
+ Ip4Address ip4Address = isisInterface.interfaceIpAddress();
+ byte[] ipAddress = ip4Address.toOctets();
+ ipAddress[ipAddress.length - 1] = 0;
+ metricOfIntRea.setIpAddress(Ip4Address.valueOf(ipAddress));
metricOfIntRea.setSubnetAddres(Ip4Address.valueOf(isisInterface.networkMask()));
ipInterReacTlv.addInternalReachabilityMetric(metricOfIntRea);
lsp.addTlv(ipInterReacTlv);
+
+ tlvHeader.setTlvType(TlvType.IPEXTENDEDREACHABILITY.value());
+ tlvHeader.setTlvLength(0);
+ IpExtendedReachabilityTlv extendedTlv = new IpExtendedReachabilityTlv(tlvHeader);
+ extendedTlv.setDown(false);
+ extendedTlv.setMetric(10);
+ extendedTlv.setPrefix("192.168.7");
+ extendedTlv.setPrefixLength(24);
+ extendedTlv.setSubTlvLength((byte) 0);
+ extendedTlv.setSubTlvPresence(false);
+ lsp.addTlv(extendedTlv);
+
return lsp;
}
@@ -149,7 +165,7 @@
isisHeader.setIrpDiscriminator((byte) IsisConstants.IRPDISCRIMINATOR);
isisHeader.setPduHeaderLength((byte) IsisUtil.getPduHeaderLength(pduType.value()));
isisHeader.setVersion((byte) IsisConstants.ISISVERSION);
- isisHeader.setIdLength((byte) IsisConstants.IDLENGTH);
+ isisHeader.setIdLength((byte) IsisConstants.SYSTEMIDLENGTH);
isisHeader.setIsisPduType(pduType.value());
isisHeader.setVersion2((byte) IsisConstants.ISISVERSION);
isisHeader.setReserved((byte) IsisConstants.RESERVED);