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();
+    }
+
+}