Merge "TableFeatures deserialization fix"
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / util / MatchIdsReader.java
diff --git a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/util/MatchIdsReader.java b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/util/MatchIdsReader.java
new file mode 100644 (file)
index 0000000..9ecdc0c
--- /dev/null
@@ -0,0 +1,231 @@
+/*\r
+ * Copyright (c) 2013 Pantheon Technologies s.r.o. and others.  All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+package org.opendaylight.openflowjava.protocol.impl.util;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpOp;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpSha;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpSpa;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpTha;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpTpa;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthDst;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthSrc;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthType;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ExperimenterClass;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv4Code;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv4Type;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv6Code;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv6Type;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.InPhyPort;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.InPort;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpDscp;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpEcn;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpProto;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv4Dst;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv4Src;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Dst;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Exthdr;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Flabel;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6NdSll;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6NdTarget;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6NdTll;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Src;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Metadata;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsBos;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsLabel;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsTc;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm0Class;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm1Class;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OpenflowBasicClass;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.PbbIsid;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpDst;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpSrc;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpDst;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpSrc;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TunnelId;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.UdpDst;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.UdpSrc;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.VlanPcp;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.VlanVid;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.MatchEntries;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.MatchEntriesBuilder;\r
+\r
+/**\r
+ * Encodes match ids (oxm_ids) needed in Multipart-TableFeatures messages\r
+ * @author michal.polkorab\r
+ */\r
+public abstract class MatchIdsReader {\r
+\r
+    /** Decodes oxm ids\r
+     * @param in input ByteBuf\r
+     * @param matchLength match entries length\r
+     * @return list of match ids\r
+     */\r
+    public static List<MatchEntries> createOxmIds(ByteBuf in, int matchLength) {\r
+        List<MatchEntries> matchEntriesList = new ArrayList<>();\r
+        int currLength = 0;\r
+        while(currLength < matchLength) {\r
+            MatchEntriesBuilder matchEntriesBuilder = new MatchEntriesBuilder();\r
+            switch (in.readUnsignedShort()) {\r
+            case 0x0000:\r
+                        matchEntriesBuilder.setOxmClass(Nxm0Class.class);\r
+                        break;\r
+            case 0x0001:\r
+                        matchEntriesBuilder.setOxmClass(Nxm1Class.class);\r
+                        break;\r
+            case 0x8000:\r
+                        matchEntriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+                        break;\r
+            case 0xFFFF:\r
+                        matchEntriesBuilder.setOxmClass(ExperimenterClass.class);\r
+                        break;\r
+            default:\r
+                        break;\r
+            }\r
+\r
+            int fieldAndMask = in.readUnsignedByte();\r
+            boolean hasMask = (fieldAndMask & 1) != 0;\r
+            matchEntriesBuilder.setHasMask(hasMask);\r
+            int matchField =  fieldAndMask >> 1;\r
+            int matchEntryLength = in.readUnsignedByte();\r
+            currLength += EncodeConstants.SIZE_OF_SHORT_IN_BYTES +\r
+                    (2 * EncodeConstants.SIZE_OF_BYTE_IN_BYTES) + matchEntryLength;\r
+\r
+            switch(matchField) {\r
+            case 0:\r
+                matchEntriesBuilder.setOxmMatchField(InPort.class);\r
+                break;\r
+            case 1:\r
+                matchEntriesBuilder.setOxmMatchField(InPhyPort.class);\r
+                break;\r
+            case 2:\r
+                matchEntriesBuilder.setOxmMatchField(Metadata.class);\r
+                break;\r
+            case 3:\r
+                matchEntriesBuilder.setOxmMatchField(EthDst.class);\r
+                break;\r
+            case 4:\r
+                matchEntriesBuilder.setOxmMatchField(EthSrc.class);\r
+                break;\r
+            case 5:\r
+                matchEntriesBuilder.setOxmMatchField(EthType.class);\r
+                break;\r
+            case 6:\r
+                matchEntriesBuilder.setOxmMatchField(VlanVid.class);\r
+                break;\r
+            case 7:\r
+                matchEntriesBuilder.setOxmMatchField(VlanPcp.class);\r
+                break;\r
+            case 8:\r
+                matchEntriesBuilder.setOxmMatchField(IpDscp.class);\r
+                break;\r
+            case 9:\r
+                matchEntriesBuilder.setOxmMatchField(IpEcn.class);\r
+                break;\r
+            case 10:\r
+                matchEntriesBuilder.setOxmMatchField(IpProto.class);\r
+                break;\r
+            case 11:\r
+                matchEntriesBuilder.setOxmMatchField(Ipv4Src.class);\r
+                break;\r
+            case 12:\r
+                matchEntriesBuilder.setOxmMatchField(Ipv4Dst.class);\r
+                break;\r
+            case 13:\r
+                matchEntriesBuilder.setOxmMatchField(TcpSrc.class);\r
+                break;\r
+            case 14:\r
+                matchEntriesBuilder.setOxmMatchField(TcpDst.class);\r
+                break;\r
+            case 15:\r
+                matchEntriesBuilder.setOxmMatchField(UdpSrc.class);\r
+                break;\r
+            case 16:\r
+                matchEntriesBuilder.setOxmMatchField(UdpDst.class);\r
+                break;\r
+            case 17:\r
+                matchEntriesBuilder.setOxmMatchField(SctpSrc.class);\r
+                break;\r
+            case 18:\r
+                matchEntriesBuilder.setOxmMatchField(SctpDst.class);\r
+                break;\r
+            case 19:\r
+                matchEntriesBuilder.setOxmMatchField(Icmpv4Type.class);\r
+                break;\r
+            case 20:\r
+                matchEntriesBuilder.setOxmMatchField(Icmpv4Code.class);\r
+                break;\r
+            case 21:\r
+                matchEntriesBuilder.setOxmMatchField(ArpOp.class);\r
+                break;\r
+            case 22:\r
+                matchEntriesBuilder.setOxmMatchField(ArpSpa.class);\r
+                break;\r
+            case 23:\r
+                matchEntriesBuilder.setOxmMatchField(ArpTpa.class);\r
+                break;\r
+            case 24:\r
+                matchEntriesBuilder.setOxmMatchField(ArpSha.class);\r
+                break;\r
+            case 25:\r
+                matchEntriesBuilder.setOxmMatchField(ArpTha.class);\r
+                break;\r
+            case 26:\r
+                matchEntriesBuilder.setOxmMatchField(Ipv6Src.class);\r
+                break;\r
+            case 27:\r
+                matchEntriesBuilder.setOxmMatchField(Ipv6Dst.class);\r
+                break;\r
+            case 28:\r
+                matchEntriesBuilder.setOxmMatchField(Ipv6Flabel.class);\r
+                break;\r
+            case 29:\r
+                matchEntriesBuilder.setOxmMatchField(Icmpv6Type.class);\r
+                break;\r
+            case 30:\r
+                matchEntriesBuilder.setOxmMatchField(Icmpv6Code.class);\r
+                break;\r
+            case 31:\r
+                matchEntriesBuilder.setOxmMatchField(Ipv6NdTarget.class);\r
+                break;\r
+            case 32:\r
+                matchEntriesBuilder.setOxmMatchField(Ipv6NdSll.class);\r
+                break;\r
+            case 33:\r
+                matchEntriesBuilder.setOxmMatchField(Ipv6NdTll.class);\r
+                break;\r
+            case 34:\r
+                matchEntriesBuilder.setOxmMatchField(MplsLabel.class);\r
+                break;\r
+            case 35:\r
+                matchEntriesBuilder.setOxmMatchField(MplsTc.class);\r
+                break;\r
+            case 36:\r
+                matchEntriesBuilder.setOxmMatchField(MplsBos.class);\r
+                break;\r
+            case 37:\r
+                matchEntriesBuilder.setOxmMatchField(PbbIsid.class);\r
+                break;\r
+            case 38:\r
+                matchEntriesBuilder.setOxmMatchField(TunnelId.class);\r
+                break;\r
+            case 39:\r
+                matchEntriesBuilder.setOxmMatchField(Ipv6Exthdr.class);\r
+                break;\r
+            default:\r
+                break;\r
+            }\r
+          matchEntriesList.add(matchEntriesBuilder.build());\r
+        }\r
+        return matchEntriesList;\r
+    }\r
+}\r