Loxi support for Optical Transport extensions, onos-2472
Change-Id: I69b9a8839fd899aec531f68103b448dd93cbbe4a
diff --git a/java_gen/java_type.py b/java_gen/java_type.py
index 7cb39fa..e1fa563 100644
--- a/java_gen/java_type.py
+++ b/java_gen/java_type.py
@@ -515,7 +515,10 @@
.op(read="OFBufferId.of(bb.readInt())", write="bb.writeInt($name.getInt())", default="OFBufferId.NO_BUFFER")
lag_id = JType("LagId") \
.op(version=ANY, read="LagId.read4Bytes(bb)", write="$name.write4Bytes(bb)", default="LagId.NONE")
-
+odu_sig_id = JType("OduSignalID") \
+ .op(read="OduSignalID.readFrom(bb)", \
+ write="$name.writeTo(bb)",
+ default='OduSignalID.DEFAULT')
sig_id = JType("CircuitSignalID") \
.op(version=ANY, read="CircuitSignalID.read6Bytes(bb)", write="$name.write6Bytes(bb)", default="CircuitSignalID.NONE")
vrf = JType("VRF") \
@@ -595,6 +598,8 @@
'of_app_code_t': app_code,
'of_sig_id_t': sig_id,
'of_table_desc_t': table_desc,
+ 'of_odu_sig_id_t': odu_sig_id,
+ 'of_och_sig_id_t' : sig_id,
}
## Map that defines exceptions from the standard loxi->java mapping scheme
@@ -772,6 +777,9 @@
'of_oxm_och_sigid_basic' : {'value' : sig_id},
'of_bundle_add_msg' : { 'data' : of_message },
+
+ 'of_oxm_exp_odu_sigtype' : { 'value' : u8obj },
+ 'of_oxm_exp_och_sigtype' : { 'value' : u8obj },
}
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/MatchField.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/MatchField.java
index 3ea9215..55cd59f 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/MatchField.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/MatchField.java
@@ -29,6 +29,7 @@
import org.projectfloodlight.openflow.types.VRF;
import org.projectfloodlight.openflow.types.VlanPcp;
import org.projectfloodlight.openflow.types.CircuitSignalID;
+import org.projectfloodlight.openflow.types.OduSignalID;
@SuppressWarnings("unchecked")
public class MatchField<F extends OFValueType<F>> {
@@ -289,6 +290,18 @@
public final static MatchField<MacAddress> BSN_INNER_ETH_SRC =
new MatchField<MacAddress>("bsn_inner_eth_src", MatchFields.BSN_INNER_ETH_SRC);
+ public final static MatchField<OduSignalID> EXP_ODU_SIG_ID =
+ new MatchField<OduSignalID>("exp_odu_sig_id", MatchFields.EXP_ODU_SIG_ID);
+
+ public final static MatchField<U8> EXP_ODU_SIGTYPE =
+ new MatchField<U8>("exp_odu_sigtype", MatchFields.EXP_ODU_SIGTYPE);
+
+ public final static MatchField<CircuitSignalID> EXP_OCH_SIG_ID =
+ new MatchField<CircuitSignalID>("exp_och_sig_id", MatchFields.EXP_OCH_SIG_ID);
+
+ public final static MatchField<U8> EXP_OCH_SIGTYPE =
+ new MatchField<U8>("exp_och_sigtype", MatchFields.EXP_OCH_SIGTYPE);
+
public String getName() {
return name;
}
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/MatchFields.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/MatchFields.java
index cd5ba32..abfa786 100644
--- a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/MatchFields.java
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/protocol/match/MatchFields.java
@@ -72,4 +72,8 @@
OCH_SIGTYPE_BASIC,
OCH_SIGID,
OCH_SIGID_BASIC,
+ EXP_ODU_SIG_ID,
+ EXP_ODU_SIGTYPE,
+ EXP_OCH_SIG_ID,
+ EXP_OCH_SIGTYPE,
}
diff --git a/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OduSignalID.java b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OduSignalID.java
new file mode 100644
index 0000000..c97c4d0
--- /dev/null
+++ b/java_gen/pre-written/src/main/java/org/projectfloodlight/openflow/types/OduSignalID.java
@@ -0,0 +1,182 @@
+/*
+ * Copyright 2015, ECI Telecom, Inc.
+ * 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.projectfloodlight.openflow.types;
+
+
+import java.util.List;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+
+import com.google.common.collect.ComparisonChain;
+import com.google.common.primitives.UnsignedBytes;
+import com.google.common.hash.PrimitiveSink;
+
+import org.projectfloodlight.openflow.exceptions.OFParseError;
+import org.projectfloodlight.openflow.protocol.*;
+import com.google.common.hash.Funnel;
+import org.projectfloodlight.openflow.util.*;
+import java.util.Arrays;
+
+public class OduSignalID implements OFValueType<OduSignalID> {
+
+ // version: 1.3
+ final static byte WIRE_VERSION = 4;
+ final static int MINIMUM_LENGTH = 4;
+
+ private final static int DEFAULT_TPN = 0x0;
+ private final static int DEFAULT_TSLEN = 80;
+ private final static byte[] DEFAULT_TSMAP = new byte[10];
+
+ // OF message fields
+ private final int tpn;
+ private final int tslen;
+ private final byte[] tsmap;
+
+ // Immutable default instance
+ public final static OduSignalID DEFAULT = new OduSignalID(
+ DEFAULT_TPN, DEFAULT_TSLEN, DEFAULT_TSMAP
+ );
+
+ // package private constructor - used by readers, builders, and factory
+ public OduSignalID(int tpn, int tslen, byte[] tsmap) {
+ this.tpn = tpn;
+ this.tslen = tslen;
+ this.tsmap = tsmap;
+ }
+
+ public int getTpn() {
+ return tpn;
+ }
+
+ public int getTslen() {
+ return tslen;
+ }
+
+ public byte[] getTsmap() {
+ return tsmap;
+ }
+
+
+ @Override
+ public int getLength() {
+ return MINIMUM_LENGTH + 12; // tslen == 80
+ }
+
+ public void writeTo(ChannelBuffer c) {
+ c.writeShort(tpn);
+ c.writeShort(tslen);
+ c.writeBytes(tsmap); // 10 bytes
+ c.writeZero(2); // write bytes for add padding alignment (the size of bytes in tsmap must be divided in 4)
+ }
+
+ public static OduSignalID readFrom(ChannelBuffer c) {
+ int tpn = U16.f(c.readShort());
+ int tslen = U16.f(c.readShort());
+ byte[] tsmap = null;
+ tsmap =ChannelUtils.readBytes(c, 10);
+ ChannelUtils.readBytes(c, 2); // skip padding
+ OduSignalID oduSigId = new OduSignalID(
+ tpn,
+ tslen,
+ tsmap
+ );
+ return oduSigId;
+ }
+
+
+ public void putTo(PrimitiveSink sink) {
+ FUNNEL.funnel(this, sink);
+ }
+
+ final static OduSignalIDFunnel FUNNEL = new OduSignalIDFunnel();
+ static class OduSignalIDFunnel implements Funnel< OduSignalID> {
+ private static final long serialVersionUID = 1L;
+ @Override
+ public void funnel( OduSignalID message, PrimitiveSink sink) {
+ sink.putInt(message.tpn);
+ sink.putInt(message.tslen);
+ sink.putBytes(message.tsmap);
+ }
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder b = new StringBuilder(" OduSignalID(");
+ b.append("tpn=").append(tpn);
+ b.append(", ");
+ b.append("tslen=").append(tslen);
+ b.append(", ");
+ b.append("tsmap=").append(Arrays.toString(tsmap));
+ b.append(")");
+ return b.toString();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ OduSignalID other = (OduSignalID) obj;
+
+ if( tpn != other.tpn)
+ return false;
+ if( tslen != other.tslen)
+ return false;
+ if (!Arrays.equals(tsmap, other.tsmap))
+ return false;
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+
+ result = prime * result + tpn;
+ result = prime * result + tslen;
+ result = prime * result + Arrays.hashCode(tsmap);
+ return result;
+ }
+
+ @Override
+ public OduSignalID applyMask(OduSignalID mask) {
+ byte[] maskTsmap = null;
+ if (this.tsmap!=null && this.tsmap.length > 0) {
+ maskTsmap = new byte[this.tsmap.length];
+ int i = 0;
+ for (byte b : this.tsmap){
+ maskTsmap[i] =(byte) (b & mask.tsmap[i++]);
+ }
+ }
+ return new OduSignalID(this.tpn & mask.tpn,
+ (short) (this.tslen & mask
+ .tslen),
+ maskTsmap);
+ }
+
+ @Override
+ public int compareTo(OduSignalID o) {
+ return ComparisonChain.start()
+ .compare(tpn,o.tpn)
+ .compare(tslen,o.tslen)
+ .compare(tsmap,o.tsmap, UnsignedBytes.lexicographicalComparator())
+ .result();
+ }
+
+}
diff --git a/loxi_ir/ir_offset.py b/loxi_ir/ir_offset.py
index 64c01b6..59d659a 100644
--- a/loxi_ir/ir_offset.py
+++ b/loxi_ir/ir_offset.py
@@ -115,6 +115,8 @@
of_app_code_t = (15,True),
of_sig_id_t = (6, True),
of_bitmap_512_t = (64, True),
+ of_odu_sig_id_t = (16, True),
+ of_och_sig_id_t = (6, True),
)
def type_dec_to_count_base(m_type):
diff --git a/openflow_input/circuit b/openflow_input/circuit
index 0f436a4..7e02014 100644
--- a/openflow_input/circuit
+++ b/openflow_input/circuit
@@ -19,7 +19,7 @@
};
/* Layer classes (families) supported for optical transport port. */
-enum ofp_port_optical_transport_layer_class {
+enum ofp_port_optical_transport_layer_class(wire_type=uint8_t){
OFPPOTL_PORT = 1, /* Class of base port layer signal types */
OFPPOTL_OCH = 2, /* Class of OCH layer signal types*/
OFPPOTL_ODU = 3, /* Class of ODU layer signal types*/
diff --git a/openflow_input/optical_tras_ext b/openflow_input/optical_tras_ext
new file mode 100644
index 0000000..ddb08df
--- /dev/null
+++ b/openflow_input/optical_tras_ext
@@ -0,0 +1,212 @@
+/* This file input supports the Optical Transport Protocol Extentions - version 1.0 */
+
+#version 4
+/*Supported signal types for layer class OFPOTPL_ODU */
+enum ofp_odu_signal_type (wire_type=uint8_t) {
+ OFPODUT_ODU1 = 1,
+ OFPODUT_ODU2 = 2,
+ OFPODUT_ODU3 = 3,
+ OFPODUT_ODU4 = 4,
+ OFPODUT_ODU0 = 10,
+ OFPODUT_ODU2E = 11,
+ OFPODUT_ODUfCBR = 20,
+ OFPODUT_ODUfGFPfHAO = 21,
+ OFPODUT_ODUfGFPf = 22,
+};
+
+
+//enum ofp_experimenter_multipart_type_exp (wire_type=uint32_t){
+ //OFPEMPTE = 1,
+//};
+
+//enum ofp_port_desc_prop_type_exp (wire_type=uint32_t){
+ //OFPPDPT_OPTICAL_TRAMSPORT = 2,
+//};
+
+/* Supported signal types for layer class OFPPOTL_PORT */
+enum ofp_port_optical_transport_signal_type (wire_type=uint8_t) {
+ OFPPOTST_OTSn = 1,
+ OFPPOTST_OMSn = 2,
+ OFPPOTST_OPSn = 3,
+ OFPPOTST_OPSM = 4,
+ OFPPOTST_OCH = 5,
+ OFPPOTST_OTU1 = 11,
+ OFPPOTST_OTU2 = 12,
+ OFPPOTST_OTU3 = 13,
+ OFPPOTST_OTU4 = 14,
+};
+
+
+/* Features of optical transport ports available in switch. */
+enum ofp_port_optical_transport_feature_type (wire_type=uint16_t) {
+ OFPPOTFT_OPT_INTERFACE_CLASS = 1, /* Application code/ID encoding */
+ OFPPOTFT_LAYER_STACK = 2, /* Supported signal types and adaptations */
+};
+
+
+/*Supported signal types for layer class OFPOTPL_ODUCLT */
+enum ofp_oduclt_signal_type(wire_type=uint8_t) {
+ OFPODUCLT_STM16 = 1,
+ OFPODUCLT_STM64 = 2,
+ OFPODUCLT_STM256 = 3,
+ OFPODUCLT_STM1 = 4,
+ OFPODUCLT_STM4 = 5,
+ OFPODUCLT_GBE1 = 6,
+ OFPODUCLT_GBE10 = 7,
+ OFPODUCLT_GBE40 = 8,
+ OFPODUCLT_GBE100 = 9,
+ OFPODUCLT_FC100 = 10,
+ OFPODUCLT_FC200 = 11,
+ OFPODUCLT_FC400 = 12,
+ OFPODUCLT_FC800 = 13,
+ OFPODUCLT_FC1200 = 14,
+ OFPODUCLT_GPON = 15,
+ OFPODUCLT_XGPON = 16,
+ OFPODUCLT_IB_SDR = 17,
+ OFPODUCLT_IB_DDR = 18,
+ OFPODUCLT_IB_QDR = 19,
+ OFPODUCLT_SBCON_ESCON = 20,
+ OFPODUCLT_DVBASI = 21,
+ OFPODUCLT_SDI = 22,
+ OFPODUCLT_SDI1G5 = 23,
+ OFPODUCLT_SDI3G = 24,
+ OFPODUCLT_ATM = 25,
+ OFPODUCLT_ETH = 26,
+ OFPODUCLT_MPLS = 27,
+ OFPODUCLT_IP = 28,
+};
+
+/* Supported adaptations for optical transport port layer stack*/
+enum ofp_adaptations_type (wire_type=uint8_t){
+ OFPADAPT_OTS_OMS = 1,
+ OFPADAPT_OMS_OCH = 2,
+ OFPADAPT_OPS_OCHr = 3,
+ OFPADAPT_OPSM_OTUk = 4,
+ OFPADAPT_OCH_OTUk = 5,
+ OFPADAPT_ODUk_ODUij = 6,
+ OFPADAPT_ODUk_ODUj21 = 7,
+ OFPADAPT_ODUkh_ODUj21 = 8,
+ OFPADAPT_ODU0_CBRx = 9,
+ OFPADAPT_ODUk_CBRx = 10,
+ OFPADAPT_ODUk_CBRxg = 11,
+ OFPADAPT_ODUk_RSn = 12,
+ OFPADAPT_ODUk_ATM = 13,
+ OFPADAPT_ODUk_ETH = 14,
+ OFPADAPT_ODUkh_ETH = 15,
+ OFPADAPT_ODUk_ETHPPOS = 16,
+};
+
+struct of_oxm_exp_odu_sigtype : of_oxm {
+ uint32_t type_len == 0xFFFF0401;
+ uint32_t experimenter == 0xFF000007;
+ uint8_t value;
+};
+
+struct of_oxm_exp_odu_sig_id : of_oxm {
+ uint32_t type_len == 0xFFFF0610;
+ uint32_t experimenter == 0xFF000007;
+ of_odu_sig_id_t value;// size of this struct is 16 bytes 2+2+10+2(pad)
+};
+
+//This struct defenition is unnecessury for the openflow java ("make java" command )
+//It is reqiured for wireshark dissector ("make wireshark" command)
+struct of_odu_sig_id_t {
+ uint16_t tpn; //Tributary Port Number
+ uint16_t length; // Number of Tributary Slots included in tsmap,
+ // based on the Server ODU type and TS Granularity
+ of_octets_t tsmap; //tsmap;
+};
+
+struct of_oxm_exp_och_sigtype : of_oxm {
+ uint32_t type_len == 0xFFFF0801;
+ uint32_t experimenter == 0xFF000007;
+ uint8_t value;
+};
+
+struct of_oxm_exp_och_sig_id : of_oxm {
+ uint32_t type_len == 0xFFFF0A06;
+ uint32_t experimenter == 0xFF000007;
+ of_och_sig_id_t value;
+};
+
+
+// open flow extention - support port description Extentions for OTN Ports
+struct of_exp_port_desc_request : of_experimenter_stats_request {
+ uint8_t version;
+ uint8_t type == 18;
+ uint16_t length;
+ uint32_t xid;
+ uint16_t stats_type == 0xffff;
+ enum ofp_stats_request_flags flags;
+ pad(4);
+ uint32_t experimenter == 0xFF000007;
+ uint32_t subtype == 1;//enum ofp_experimenter_multipart_type exp_type == 1;
+};
+
+struct of_exp_port_desc_reply : of_experimenter_stats_reply {
+ uint8_t version;
+ uint8_t type == 19;
+ uint16_t length;
+ uint32_t xid;
+ uint16_t stats_type == 0xffff;
+ enum ofp_stats_reply_flags flags;
+ pad(4);
+ uint32_t experimenter == 0xFF000007;
+ uint32_t subtype == 1;//enum ofp_experimenter_multipart_type subtype == 1;
+ list(of_exp_port_t) entries;
+};
+
+struct of_exp_port {
+ of_port_no_t port_no;
+ uint16_t length;
+ pad(2);
+ of_mac_addr_t hw_addr;
+ pad(2);
+ of_port_name_t name;
+ enum ofp_port_config config;
+ enum ofp_port_state state;
+ list(of_exp_port_desc_prop_optical_transport_t) properties;
+};
+
+struct of_exp_port_des_prop_header {
+ uint16_t type == 2; //enum ofp_port_desc_prop_type_exp type == 2;
+ uint16_t length;
+};
+
+struct of_exp_port_desc_prop_optical_transport // : of_exp_port_des_prop_header
+{
+ uint16_t type == 2;
+ uint16_t length; // length in bytes of this property
+ enum ofp_port_optical_transport_signal_type port_signal_type;
+ //base port layer signal type (enum ofp_port_optical_transport_signal_type)
+ uint8_t reserved;
+ pad(2);
+ list(of_exp_port_optical_transport_layer_stack_t) features; // list of of_port_optical_transport_feature_header
+};
+
+struct of_exp_port_optical_transport_feature_header {
+ uint16_t feature_type == ?; // from enum ofp_port_optical_transport_feature_type
+ uint16_t length;
+};
+
+/* OTN Layer Stack Feature Encoding */ //of_port_optical_transport_layer_stack (in circuit )
+struct of_exp_port_optical_transport_layer_stack// : of_exp_port_optical_transport_feature_header
+{
+ uint16_t feature_type == 2; /* Set to OFPOTPF_LAYER_STACK */
+ uint16_t length; /* length of feature excluding padding*/
+ pad(4); /* Zero bytes-see above for sizing */
+ list(of_exp_port_optical_transport_layer_entry_t) value; /* 0 or more fields */
+};
+
+/*OTN Layer Stack Entry Encoding */ // can be found in circut of_port_optical_transport_layer_entry
+struct of_exp_port_optical_transport_layer_entry {
+ enum ofp_port_optical_transport_layer_class layer_class; /* OFPPOTL_* */
+ uint8_t signal_type; /*OFP(OTP/OCH/ODU/ODUCL)T_*/
+ enum ofp_adaptations_type adaptation;/* OFPADAPT_*/
+ pad(5); /* Align to 64-bit boundary */
+};
+
+
+
+
+
diff --git a/test_data/of13/exp_port_desc_reply.data b/test_data/of13/exp_port_desc_reply.data
new file mode 100644
index 0000000..df1eeec
--- /dev/null
+++ b/test_data/of13/exp_port_desc_reply.data
@@ -0,0 +1,85 @@
+-- binary
+04 13 # version, type
+00 58 # length
+12 34 56 78 # xid
+ff ff # stats_type
+00 00 # flags
+00 00 00 00 # pad
+FF 00 00 07 # experimenter
+00 00 00 01 # subtype
+# entries[0]
+00 00 00 01 # port
+00 40 # length - ????????
+00 00 # pad
+00 00 00 00 00 00 # entries[0].hw_addr
+00 00 # pad
+69 6e 74 65 72 66 61 63 65 31 32 33 34 35 36 37 # entries[0].name
+00 00 00 60 # entries[0].config
+00 00 00 04 # entries[0].state
+# properties[0]
+00 02 # entries[0].properties[0].type
+00 18 # entries[0].properties[0].length ???????
+0C # port_signal_type OMSn = 2,OCH = 5,OTU2 = 12(oduclt-10),OTU4 = 14(oduclt-100)
+00 #reserved
+00 00 #pad
+# features[0]
+00 02
+00 10 # length - ????????
+00 00 00 00
+# layeres[0]
+03 # layer class (PORT=1,OCH=2,ODU=3,DUCLT=4)
+01 # signal_type; /*OFP(OTP/OCH/ODU/ODUCL)T_*/
+06 #(OTS_OMS=1,OMS_OCH=2,OPS_OCHr=3,OPSM_OTUk=4,OCH_OTUk=5,ODUk_ODUij=6,ODUk_ODUj21=7,
+ #ODUkh_ODUj21=8,ODU0_CBRx=9,ODUk_CBRx=10,ODUk_CBRxg=11,ODUk_RSn=12,ODUk_ATM=13,ODUk_ETH=14,ODUkh_ETH=15,ODUk_ETHPPOS=16
+00 00 00 00 00
+
+-- python
+ofp.message.exp_port_desc_stats_reply(
+ xid=0x12345678,
+ flags=0,
+ entries=[
+ ofp.exp_port_desc(
+ port_no=1,
+ hw_addr=[0,0,0,0,0,0],
+ name="interface1234567",
+ config=0x60,
+ state=0x03,
+ properties=[
+ ofp.exp_port_desc_prop.ethernet(
+ curr=0x70,
+ max_speed=0x80)])])
+
+
+-- java
+builder
+ .setXid(0x12345678)
+ .setFlags(ImmutableSet.<OFStatsReplyFlags>of())
+ .setEntries(ImmutableList.of(
+ factory.buildExpPort()
+ .setPortNo(OFPort.of(1))
+ .setHwAddr(MacAddress.of("00:00:00:00:00:00"))
+ .setName("interface1234567")
+ .setConfig(Sets.immutableEnumSet(OFPortConfig.NO_FWD, OFPortConfig.NO_PACKET_IN))
+ .setState(Sets.immutableEnumSet(OFPortState.LIVE))
+ .setProperties(ImmutableList.of(
+ factory.buildExpPortDescPropOpticalTransport()
+ .setPortSignalType(OFPortOpticalTransportSignalType.OTU2)
+ .setFeatures(ImmutableList.of(
+ factory.buildExpPortOpticalTransportLayerStack()
+ .setValue(ImmutableList.of(
+ factory.buildExpPortOpticalTransportLayerEntry()
+ .setLayerClass(OFPortOpticalTransportLayerClass.ODU)
+ .setSignalType((short)1)
+ .setAdaptation(OFAdaptationsType.ODUK_ODUIJ)
+ .build()))
+ .build()))
+ .build()))
+ .build()))
+ .build();
+
+
+
+
+
+
+
diff --git a/test_data/of13/exp_port_desc_reply_och b/test_data/of13/exp_port_desc_reply_och
new file mode 100644
index 0000000..b32d9a8
--- /dev/null
+++ b/test_data/of13/exp_port_desc_reply_och
@@ -0,0 +1,86 @@
+# To be included in exp_port_dest_reply.data
+-- binary
+04 13 # version, type
+00 58 # length
+12 34 56 78 # xid
+ff ff # stats_type
+00 00 # flags
+00 00 00 00 # pad
+FF 00 00 07 # experimenter
+00 00 00 01 # subtype
+# entries[0]
+00 00 00 01 # port
+00 40 # length - ????????
+00 00 # pad
+00 00 00 00 00 00 # entries[0].hw_addr
+00 00 # pad
+69 6e 74 65 72 66 61 63 65 31 32 33 34 35 36 37 # entries[0].name
+00 00 00 60 # entries[0].config
+00 00 00 04 # entries[0].state
+# properties[0]
+00 02 # entries[0].properties[0].type
+00 18 # entries[0].properties[0].length ???????
+05 # port_signal_type OMSn = 2,OCH = 5,OTU2 = 12(oduclt-10),OTU4 = 14(oduclt-100)
+00 #reserved
+00 00 #pad
+# features[0]
+00 02
+00 10 # length - ????????
+00 00 00 00
+# layeres[0]
+03 # layer class (PORT=1,OCH=2,ODU=3,DUCLT=4)
+01 # signal_type; /*OFP(OTP/OCH/ODU/ODUCL)T_*/
+06 #(OTS_OMS=1,OMS_OCH=2,OPS_OCHr=3,OPSM_OTUk=4,OCH_OTUk=5,ODUk_ODUij=6,ODUk_ODUj21=7,
+ #ODUkh_ODUj21=8,ODU0_CBRx=9,ODUk_CBRx=10,ODUk_CBRxg=11,ODUk_RSn=12,ODUk_ATM=13,ODUk_ETH=14,ODUkh_ETH=15,ODUk_ETHPPOS=16
+00 00 00 00 00
+
+-- python
+ofp.message.exp_port_desc_stats_reply(
+ xid=0x12345678,
+ flags=0,
+ entries=[
+ ofp.exp_port_desc(
+ port_no=1,
+ hw_addr=[0,0,0,0,0,0],
+ name="interface1234567",
+ config=0x60,
+ state=0x03,
+ properties=[
+ ofp.exp_port_desc_prop.ethernet(
+ curr=0x70,
+ max_speed=0x80)])])
+
+
+-- java
+builder
+ .setXid(0x12345678)
+ .setFlags(ImmutableSet.<OFStatsReplyFlags>of())
+ .setEntries(ImmutableList.of(
+ factory.buildExpPort()
+ .setPortNo(OFPort.of(1))
+ .setHwAddr(MacAddress.of("00:00:00:00:00:00"))
+ .setName("interface1234567")
+ .setConfig(Sets.immutableEnumSet(OFPortConfig.NO_FWD, OFPortConfig.NO_PACKET_IN))
+ .setState(Sets.immutableEnumSet(OFPortState.LIVE))
+ .setProperties(ImmutableList.of(
+ factory.buildExpPortDescPropOpticalTransport()
+ .setPortSignalType(OFPortOpticalTransportSignalType.OCH)
+ .setFeatures(ImmutableList.of(
+ factory.buildExpPortOpticalTransportLayerStack()
+ .setValue(ImmutableList.of(
+ factory.buildExpPortOpticalTransportLayerEntry()
+ .setLayerClass(OFPortOpticalTransportLayerClass.ODU)
+ .setSignalType((short)1)
+ .setAdaptation(OFAdaptationsType.ODUK_ODUIJ)
+ .build()))
+ .build()))
+ .build()))
+ .build()))
+ .build();
+
+
+
+
+
+
+
diff --git a/test_data/of13/exp_port_desc_reply_oms b/test_data/of13/exp_port_desc_reply_oms
new file mode 100644
index 0000000..67a03e8
--- /dev/null
+++ b/test_data/of13/exp_port_desc_reply_oms
@@ -0,0 +1,87 @@
+#To put this code in exp_port_desc_reply.data
+
+-- binary
+04 13 # version, type
+00 58 # length
+12 34 56 78 # xid
+ff ff # stats_type
+00 00 # flags
+00 00 00 00 # pad
+FF 00 00 07 # experimenter
+00 00 00 01 # subtype
+# entries[0]
+00 00 00 01 # port
+00 40 # length - ????????
+00 00 # pad
+00 00 00 00 00 00 # entries[0].hw_addr
+00 00 # pad
+69 6e 74 65 72 66 61 63 65 31 32 33 34 35 36 37 # entries[0].name
+00 00 00 60 # entries[0].config
+00 00 00 04 # entries[0].state
+# properties[0]
+00 02 # entries[0].properties[0].type
+00 18 # entries[0].properties[0].length ???????
+02 # port_signal_type OMSn = 2,OCH = 5,OTU2 = 12(oduclt-10),OTU4 = 14(oduclt-100)
+00 #reserved
+00 00 #pad
+# features[0]
+00 02
+00 10 # length - ????????
+00 00 00 00
+# layeres[0]
+02 # layer class (PORT=1,OCH=2,ODU=3,DUCLT=4)
+01 # signal_type; /*OFP(OTP/OCH/ODU/ODUCL)T_*/
+02 #(OTS_OMS=1,OMS_OCH=2,OPS_OCHr=3,OPSM_OTUk=4,OCH_OTUk=5,ODUk_ODUij=6,ODUk_ODUj21=7,
+ #ODUkh_ODUj21=8,ODU0_CBRx=9,ODUk_CBRx=10,ODUk_CBRxg=11,ODUk_RSn=12,ODUk_ATM=13,ODUk_ETH=14,ODUkh_ETH=15,ODUk_ETHPPOS=16
+00 00 00 00 00
+
+-- python
+ofp.message.exp_port_desc_stats_reply(
+ xid=0x12345678,
+ flags=0,
+ entries=[
+ ofp.exp_port_desc(
+ port_no=1,
+ hw_addr=[0,0,0,0,0,0],
+ name="interface1234567",
+ config=0x60,
+ state=0x03,
+ properties=[
+ ofp.exp_port_desc_prop.ethernet(
+ curr=0x70,
+ max_speed=0x80)])])
+
+
+-- java
+builder
+ .setXid(0x12345678)
+ .setFlags(ImmutableSet.<OFStatsReplyFlags>of())
+ .setEntries(ImmutableList.of(
+ factory.buildExpPort()
+ .setPortNo(OFPort.of(1))
+ .setHwAddr(MacAddress.of("00:00:00:00:00:00"))
+ .setName("interface1234567")
+ .setConfig(Sets.immutableEnumSet(OFPortConfig.NO_FWD, OFPortConfig.NO_PACKET_IN))
+ .setState(Sets.immutableEnumSet(OFPortState.LIVE))
+ .setProperties(ImmutableList.of(
+ factory.buildExpPortDescPropOpticalTransport()
+ .setPortSignalType(OFPortOpticalTransportSignalType.OMSN)
+ .setFeatures(ImmutableList.of(
+ factory.buildExpPortOpticalTransportLayerStack()
+ .setValue(ImmutableList.of(
+ factory.buildExpPortOpticalTransportLayerEntry()
+ .setLayerClass(OFPortOpticalTransportLayerClass.OCH)
+ .setSignalType((short)1)
+ .setAdaptation(OFAdaptationsType.OMS_OCH)
+ .build()))
+ .build()))
+ .build()))
+ .build()))
+ .build();
+
+
+
+
+
+
+
diff --git a/test_data/of13/exp_port_desc_reply_otu b/test_data/of13/exp_port_desc_reply_otu
new file mode 100644
index 0000000..441d837
--- /dev/null
+++ b/test_data/of13/exp_port_desc_reply_otu
@@ -0,0 +1,87 @@
+#To put this code in exp_port_desc_reply.data
+
+-- binary
+04 13 # version, type
+00 58 # length
+12 34 56 78 # xid
+ff ff # stats_type
+00 00 # flags
+00 00 00 00 # pad
+FF 00 00 07 # experimenter
+00 00 00 01 # subtype
+# entries[0]
+00 00 00 01 # port
+00 40 # length - ????????
+00 00 # pad
+00 00 00 00 00 00 # entries[0].hw_addr
+00 00 # pad
+69 6e 74 65 72 66 61 63 65 31 32 33 34 35 36 37 # entries[0].name
+00 00 00 60 # entries[0].config
+00 00 00 04 # entries[0].state
+# properties[0]
+00 02 # entries[0].properties[0].type
+00 18 # entries[0].properties[0].length ???????
+0C # port_signal_type OMSn = 2,OCH = 5,OTU2 = 12(oduclt-10),OTU4 = 14(oduclt-100)
+00 #reserved
+00 00 #pad
+# features[0]
+00 02
+00 10 # length - ????????
+00 00 00 00
+# layeres[0]
+03 # layer class (PORT=1,OCH=2,ODU=3,DUCLT=4)
+01 # signal_type; /*OFP(OTP/OCH/ODU/ODUCL)T_*/
+06 #(OTS_OMS=1,OMS_OCH=2,OPS_OCHr=3,OPSM_OTUk=4,OCH_OTUk=5,ODUk_ODUij=6,ODUk_ODUj21=7,
+ #ODUkh_ODUj21=8,ODU0_CBRx=9,ODUk_CBRx=10,ODUk_CBRxg=11,ODUk_RSn=12,ODUk_ATM=13,ODUk_ETH=14,ODUkh_ETH=15,ODUk_ETHPPOS=16
+00 00 00 00 00
+
+-- python
+ofp.message.exp_port_desc_stats_reply(
+ xid=0x12345678,
+ flags=0,
+ entries=[
+ ofp.exp_port_desc(
+ port_no=1,
+ hw_addr=[0,0,0,0,0,0],
+ name="interface1234567",
+ config=0x60,
+ state=0x03,
+ properties=[
+ ofp.exp_port_desc_prop.ethernet(
+ curr=0x70,
+ max_speed=0x80)])])
+
+
+-- java
+builder
+ .setXid(0x12345678)
+ .setFlags(ImmutableSet.<OFStatsReplyFlags>of())
+ .setEntries(ImmutableList.of(
+ factory.buildExpPort()
+ .setPortNo(OFPort.of(1))
+ .setHwAddr(MacAddress.of("00:00:00:00:00:00"))
+ .setName("interface1234567")
+ .setConfig(Sets.immutableEnumSet(OFPortConfig.NO_FWD, OFPortConfig.NO_PACKET_IN))
+ .setState(Sets.immutableEnumSet(OFPortState.LIVE))
+ .setProperties(ImmutableList.of(
+ factory.buildExpPortDescPropOpticalTransport()
+ .setPortSignalType(OFPortOpticalTransportSignalType.OTU2)
+ .setFeatures(ImmutableList.of(
+ factory.buildExpPortOpticalTransportLayerStack()
+ .setValue(ImmutableList.of(
+ factory.buildExpPortOpticalTransportLayerEntry()
+ .setLayerClass(OFPortOpticalTransportLayerClass.ODU)
+ .setSignalType((short)1)
+ .setAdaptation(OFAdaptationsType.ODUK_ODUIJ)
+ .build()))
+ .build()))
+ .build()))
+ .build()))
+ .build();
+
+
+
+
+
+
+
diff --git a/test_data/of13/exp_port_desc_request.data b/test_data/of13/exp_port_desc_request.data
new file mode 100644
index 0000000..1c1b637
--- /dev/null
+++ b/test_data/of13/exp_port_desc_request.data
@@ -0,0 +1,14 @@
+-- binary
+04 12 # version, type
+00 18 # length
+11 11 11 11 # xid
+ff ff # stats_type
+00 00 # flags
+00 00 00 00 # pad
+FF 00 00 07 # experimenter
+00 00 00 01 # subtype
+
+-- python
+ofp.message.exp_port_desc_request(
+ xid=0x111111)
+
diff --git a/test_data/of13/flow_add.data b/test_data/of13/flow_add.data
index d566096..a1359c9 100644
--- a/test_data/of13/flow_add.data
+++ b/test_data/of13/flow_add.data
@@ -1,6 +1,6 @@
-- binary
04 0e # version, type
-00 80 # length
+00 B8 # length
12 34 56 78 # xid
fe dc ba 98 76 54 32 10 # cookie
@@ -21,7 +21,7 @@
00 00 # pad
00 01 # match.type
-00 3F # match.length # 59 bytes OXMs + 4 bytes match header
+00 77 # match.length #
80 00 01 08 # match.oxm_list[0].type_len - IN_PORT
00 00 00 04 # match.oxm_list[0].value
@@ -37,6 +37,31 @@
1C CA FE 1C B1 10 1C 00 00 28 00 00 00 00 00 00 # match.oxm_list[3].value
FF FF FF FF FF F0 FF FF 1C 2C 3C 00 00 00 00 00 # match.oxm_list[3].mask
+FF FF # experimenter class
+06 10 # type_len - EXP_ODU_SIG_ID
+FF 00 00 07 # experimenter id
+55 55 # tpn
+00 50 # tslen
+01 01 01 01 01 01 01 01 01 01 00 00 # tsmap
+
+FF FF # experimenter class
+04 01 # type_len - EXP_ODU_SIG_TYPE
+FF 00 00 07 # experimenter id
+08 # value
+
+FF FF # experimenter class
+0A 06 # type_len - EXP_OCH_SIG_ID
+FF 00 00 07 # experimenter id
+02 # gridType
+01 # channelSpacing
+00 04 # channelNumber
+00 01 # spectralWidth
+
+FF FF # experimenter class
+08 01 # type_len - EXP_OCH_SIG_TYPE
+FF 00 00 07 # experimenter id
+16 # value
+
00 # match.pad
00 01 # instructions[0].type
@@ -68,6 +93,10 @@
ofp.oxm.ipv6_src_masked(
value ='\x1C\xCA\xFE\x1C\xB1\x10\x1C\x00\x00\x28\x00\x00\x00\x00\x00\x00',
value_mask='\xFF\xFF\xFF\xFF\xFF\xF0\xFF\xFF\x1C\x2C\x3C\x00\x00\x00\x00\x00')
+ ofp.oxm.exp_odu_sig_id(21845,80,new byte {1,1,1,1,1,1,1,1,1,1}),
+ ofp.oxm.exp_odu_sigtype(8),
+ ofp.oxm.exp_och_sig_id(2,1,4,1),
+ ofp.oxm.exp_och_sigtype(22)
]),
instructions=[
ofp.instruction.goto_table(table_id=4),
@@ -92,6 +121,10 @@
.setMasked(MatchField.IPV6_SRC,
IPv6Address.of(0x1CCAFE1CB1101C00l, 0x0028000000000000l),
IPv6Address.of(0xFFFFFFFFFFF0FFFFl, 0x1C2C3C0000000000l))
+ .setExact(MatchField.EXP_ODU_SIG_ID, new OduSignalID((short)21845, (short)80,new byte[] {1,1,1,1,1,1,1,1,1,1}))
+ .setExact(MatchField.EXP_ODU_SIGTYPE, U8.of((short) 8 ))
+ .setExact(MatchField.EXP_OCH_SIG_ID, new CircuitSignalID((byte)2,(byte)1,(short)4,(short)1))
+ .setExact(MatchField.EXP_OCH_SIGTYPE, U8.of((short) 22))
.build()
)
.setInstructions(
diff --git a/test_data/of13/flow_delete.data b/test_data/of13/flow_delete.data
index bf9c453..0c1387f 100644
--- a/test_data/of13/flow_delete.data
+++ b/test_data/of13/flow_delete.data
@@ -1,6 +1,6 @@
-- binary
04 0e # version, type
-00 80 # length
+00 B8 # length
12 34 56 78 # xid
fe dc ba 98 76 54 32 10 # cookie
@@ -21,7 +21,7 @@
00 00 # pad
00 01 # match.type
-00 3F # match.length # 59 bytes OXMs + 4 bytes match header
+00 77 # match.length #
80 00 01 08 # match.oxm_list[0].type_len - IN_PORT
00 00 00 04 # match.oxm_list[0].value
@@ -37,6 +37,31 @@
1C CA FE 1C B1 10 1C 00 00 28 00 00 00 00 00 00 # match.oxm_list[3].value
FF FF FF FF FF F0 FF FF 1C 2C 3C 00 00 00 00 00 # match.oxm_list[3].mask
+FF FF # experimenter class
+06 10 # type_len - EXP_ODU_SIG_ID
+FF 00 00 07 # experimenter id
+55 55 # tpn
+00 50 # tslen
+01 01 01 01 01 01 01 01 01 01 00 00 # tsmap
+
+FF FF # experimenter class
+04 01 # type_len - EXP_ODU_SIG_TYPE
+FF 00 00 07 # experimenter id
+08 # value
+
+FF FF # experimenter class
+0A 06 # type_len - EXP_OCH_SIG_ID
+FF 00 00 07 # experimenter id
+02 # gridType
+01 # channelSpacing
+00 04 # channelNumber
+00 01 # spectralWidth
+
+FF FF # experimenter class
+08 01 # type_len - EXP_OCH_SIG_TYPE
+FF 00 00 07 # experimenter id
+16 # value
+
00 # match.pad
00 01 # instructions[0].type
@@ -47,6 +72,7 @@
00 01 # instructions[1].type
00 08 # instructions[1].length
07 # instructions[1].table_id
+
00 00 00 # pad
-- python
ofp.message.flow_delete(
@@ -92,6 +118,10 @@
.setMasked(MatchField.IPV6_SRC,
IPv6Address.of(0x1CCAFE1CB1101C00l, 0x0028000000000000l),
IPv6Address.of(0xFFFFFFFFFFF0FFFFl, 0x1C2C3C0000000000l))
+ .setExact(MatchField.EXP_ODU_SIG_ID, new OduSignalID((short)21845, (short)80,new byte[] {1,1,1,1,1,1,1,1,1,1}))
+ .setExact(MatchField.EXP_ODU_SIGTYPE, U8.of((short) 8 ))
+ .setExact(MatchField.EXP_OCH_SIG_ID, new CircuitSignalID((byte)2,(byte)1,(short)4,(short)1))
+ .setExact(MatchField.EXP_OCH_SIGTYPE, U8.of((short) 22))
.build()
)
.setInstructions(
diff --git a/test_data/of13/flow_modify.data b/test_data/of13/flow_modify.data
index 6f3ebee..1c02f5a 100644
--- a/test_data/of13/flow_modify.data
+++ b/test_data/of13/flow_modify.data
@@ -1,6 +1,6 @@
-- binary
04 0e # version, type
-00 80 # length
+00 B8 # length
12 34 56 78 # xid
fe dc ba 98 76 54 32 10 # cookie
@@ -21,7 +21,7 @@
00 00 # pad
00 01 # match.type
-00 3F # match.length # 59 bytes OXMs + 4 bytes match header
+00 77 # match.length #
80 00 01 08 # match.oxm_list[0].type_len - IN_PORT
00 00 00 04 # match.oxm_list[0].value
@@ -37,6 +37,31 @@
1C CA FE 1C B1 10 1C 00 00 28 00 00 00 00 00 00 # match.oxm_list[3].value
FF FF FF FF FF F0 FF FF 1C 2C 3C 00 00 00 00 00 # match.oxm_list[3].mask
+FF FF # experimenter class
+06 10 # type_len - EXP_ODU_SIG_ID
+FF 00 00 07 # experimenter id
+55 55 # tpn
+00 50 # tslen
+01 01 01 01 01 01 01 01 01 01 00 00 # tsmap
+
+FF FF # experimenter class
+04 01 # type_len - EXP_ODU_SIG_TYPE
+FF 00 00 07 # experimenter id
+08 # value
+
+FF FF # experimenter class
+0A 06 # type_len - EXP_OCH_SIG_ID
+FF 00 00 07 # experimenter id
+02 # gridType
+01 # channelSpacing
+00 04 # channelNumber
+00 01 # spectralWidth
+
+FF FF # experimenter class
+08 01 # type_len - EXP_OCH_SIG_TYPE
+FF 00 00 07 # experimenter id
+16 # value
+
00 # match.pad
00 01 # instructions[0].type
@@ -69,6 +94,10 @@
value ='\x1C\xCA\xFE\x1C\xB1\x10\x1C\x00\x00\x28\x00\x00\x00\x00\x00\x00',
value_mask='\xFF\xFF\xFF\xFF\xFF\xF0\xFF\xFF\x1C\x2C\x3C\x00\x00\x00\x00\x00')
]),
+ ofp.oxm.exp_odu_sig_id(21845,4,10),
+ ofp.oxm.exp_odu_sigtype(8),
+ ofp.oxm.exp_och_sig_id(2,1,4,1),
+ ofp.oxm.exp_och_sigtype(22),
instructions=[
ofp.instruction.goto_table(table_id=4),
ofp.instruction.goto_table(table_id=7)])
@@ -92,6 +121,10 @@
.setMasked(MatchField.IPV6_SRC,
IPv6Address.of(0x1CCAFE1CB1101C00l, 0x0028000000000000l),
IPv6Address.of(0xFFFFFFFFFFF0FFFFl, 0x1C2C3C0000000000l))
+ .setExact(MatchField.EXP_ODU_SIG_ID, new OduSignalID((short)21845, (short)80,new byte[] {1,1,1,1,1,1,1,1,1,1}))
+ .setExact(MatchField.EXP_ODU_SIGTYPE, U8.of((short) 8 ))
+ .setExact(MatchField.EXP_OCH_SIG_ID, new CircuitSignalID((byte)2,(byte)1,(short)4,(short)1))
+ .setExact(MatchField.EXP_OCH_SIGTYPE, U8.of((short) 22))
.build()
)
.setInstructions(
diff --git a/test_data/of13/match_v3.data b/test_data/of13/match_v3.data
index 8d42019..3b5a4f5 100644
--- a/test_data/of13/match_v3.data
+++ b/test_data/of13/match_v3.data
@@ -1,6 +1,6 @@
-- binary
00 01 # type
-00 3C # length
+00 74 # length
80 00 # oxm_list[0].class
05 10 # oxm_list[0].type_len - METADATA
FE DC BA 98 12 14 12 10 # oxm_list[0].value
@@ -15,6 +15,32 @@
36 10 # oxm_list[4].type_len - IPV6_DST
12 12 12 12 12 12 12 12 # oxm_list[4].value
12 12 12 12 12 12 12 12 # ...
+
+FF FF # experimenter class
+06 10 # type_len - EXP_ODU_SIG_ID
+FF 00 00 07 # experimenter id
+55 55 # tpn
+00 50 # tslen
+01 01 01 01 01 01 01 01 01 01 00 00 # tsmap
+
+FF FF # experimenter class
+04 01 # type_len - EXP_ODU_SIG_TYPE
+FF 00 00 07 # experimenter id
+08 # value
+
+FF FF # experimenter class
+0A 06 # type_len - EXP_OCH_SIG_ID
+FF 00 00 07 # experimenter id
+02 # gridType
+01 # channelSpacing
+00 04 # channelNumber
+00 01 # spectralWidth
+
+FF FF # experimenter class
+08 01 # type_len - EXP_OCH_SIG_TYPE
+FF 00 00 07 # experimenter id
+16 # value
+
00 00 00 00 # pad
-- python
ofp.match([
@@ -22,6 +48,10 @@
ofp.oxm.eth_src([1,2,3,4,5,6]),
ofp.oxm.udp_dst(53),
ofp.oxm.ipv6_dst("\x12" * 16),
+ ofp.oxm.exp_odu_sig_id(21845,4,10),
+ ofp.oxm.exp_odu_sigtype(8),
+ ofp.oxm.exp_och_sig_id(2,1,4,1),
+ ofp.oxm.exp_och_sigtype(22)
])
-- java
builder
@@ -30,4 +60,8 @@
.setExact(MatchField.UDP_DST, TransportPort.of(53))
.setExact(MatchField.IPV6_DST, IPv6Address.of(new byte[] { 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12,
0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12 }))
+ .setExact(MatchField.EXP_ODU_SIG_ID, new OduSignalID((short)21845, (short)80,new byte[] {1,1,1,1,1,1,1,1,1,1}))
+ .setExact(MatchField.EXP_ODU_SIGTYPE, U8.of((short) 8 ))
+ .setExact(MatchField.EXP_OCH_SIG_ID, new CircuitSignalID((byte)2,(byte)1,(short)4,(short)1))
+ .setExact(MatchField.EXP_OCH_SIGTYPE, U8.of((short) 22))
\ No newline at end of file