InstructionDeserializer split into separate deserializers
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / util / OF10ActionsDeserializer.java
index 5fd546df516c308e1128e94585a4ce2778fb7338..75be481a9226f273bacb5bf124555bb84beaba6b 100644 (file)
-/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\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.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;\r
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DlAddressAction;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DlAddressActionBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterActionBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.IpAddressActionBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthAction;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthActionBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTosAction;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTosActionBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortAction;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortActionBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdAction;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdActionBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpActionBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidAction;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidActionBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Enqueue;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetDlDst;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetDlSrc;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwDst;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwSrc;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwTos;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetTpDst;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetTpSrc;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetVlanPcp;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetVlanVid;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.StripVlan;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.ActionsList;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.ActionsListBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.ActionBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;\r
-import org.opendaylight.yangtools.yang.binding.Augmentation;\r
-\r
-import com.google.common.base.Joiner;\r
-\r
-/**\r
- * Deserializes ofp_action (OpenFlow v1.0) structures\r
- * @author michal.polkorab\r
- */\r
-public class OF10ActionsDeserializer {\r
-\r
-    /**\r
-     * Creates list of actions (OpenFlow v1.0) from ofp_action structures\r
-     * @param input input ByteBuf\r
-     * @return ActionsList list of actions\r
-     */\r
-    public static List<ActionsList> createActionsList(ByteBuf input) {\r
-        List<ActionsList> actions = new ArrayList<>();\r
-        while (input.readableBytes() > 0) {\r
-            ActionsListBuilder actionsBuilder = new ActionsListBuilder();\r
-            int type = input.readUnsignedShort();\r
-            input.skipBytes(Short.SIZE / Byte.SIZE);\r
-            switch(type) {\r
-            case 0:  \r
-                actions.add(createOutputAction(input, actionsBuilder));\r
-                break;\r
-            case 1: \r
-                actions.add(createSetVlanVidAction(input, actionsBuilder));\r
-                break;\r
-            case 2: \r
-                actions.add(createVlanPcpAction(input, actionsBuilder));\r
-                break;\r
-            case 3: \r
-                actions.add(createStripVlanAction(input, actionsBuilder));\r
-                break;\r
-            case 4:                              \r
-                actions.add(createSetDlSrcAction(input, actionsBuilder));\r
-                break;\r
-            case 5: \r
-                actions.add(createSetDlDstAction(input, actionsBuilder));\r
-                break;\r
-            case 6:                              \r
-                actions.add(createSetNwSrcAction(input, actionsBuilder));\r
-                break;\r
-            case 7: \r
-                actions.add(createSetNwDstAction(input, actionsBuilder));\r
-                break;\r
-            case 8: \r
-                actions.add(createSetNwTosAction(input, actionsBuilder));\r
-                break;\r
-            case 9: \r
-                actions.add(createSetTpSrcAction(input, actionsBuilder));\r
-                break;\r
-            case 10: \r
-                actions.add(createSetTpDstAction(input, actionsBuilder));\r
-                break;\r
-            case 11: \r
-                actions.add(createEnqueueAction(input, actionsBuilder));\r
-                break;\r
-            case 0xFFFF:\r
-                actions.add(createExperimenterAction(input, actionsBuilder));\r
-                break;\r
-            default: \r
-                break;\r
-            }\r
-        } \r
-        return actions;\r
-    }\r
-\r
-    /**\r
-     * @param in input ByteBuf\r
-     * @param builder \r
-     * @return ActionList\r
-     */\r
-    public static ActionsList createOutputAction(ByteBuf in, ActionsListBuilder builder) {\r
-        ActionBuilder actionBuilder = new ActionBuilder();\r
-        actionBuilder.setType(Output.class);\r
-        createPortAugmentation(in, actionBuilder);\r
-        MaxLengthActionBuilder maxLen = new MaxLengthActionBuilder();\r
-        maxLen.setMaxLength(in.readUnsignedShort());\r
-        actionBuilder.addAugmentation(MaxLengthAction.class, maxLen.build());\r
-        builder.setAction(actionBuilder.build());\r
-        return builder.build();\r
-    }\r
-\r
-    private static ActionsList createSetVlanVidAction(ByteBuf input, ActionsListBuilder builder) {\r
-        final byte PADDING_IN_SET_VLAN_VID_ACTION = 2;\r
-        ActionBuilder actionBuilder = new ActionBuilder();\r
-        actionBuilder.setType(SetVlanVid.class);\r
-        VlanVidActionBuilder vlanBuilder = new VlanVidActionBuilder();\r
-        vlanBuilder.setVlanVid(input.readUnsignedShort());\r
-        input.skipBytes(PADDING_IN_SET_VLAN_VID_ACTION);\r
-        actionBuilder.addAugmentation(VlanVidAction.class, vlanBuilder.build());\r
-        builder.setAction(actionBuilder.build());\r
-        return builder.build();\r
-    }\r
-\r
-    private static ActionsList createVlanPcpAction(ByteBuf input, ActionsListBuilder builder) {\r
-        final byte PADDING_IN_SET_VLAN_PCP_ACTION = 3;\r
-        ActionBuilder actionBuilder = new ActionBuilder();\r
-        actionBuilder.setType(SetVlanPcp.class);\r
-        VlanPcpActionBuilder vlanBuilder = new VlanPcpActionBuilder();\r
-        vlanBuilder.setVlanPcp(input.readUnsignedByte());\r
-        input.skipBytes(PADDING_IN_SET_VLAN_PCP_ACTION);\r
-        actionBuilder.addAugmentation(VlanVidAction.class, vlanBuilder.build());\r
-        builder.setAction(actionBuilder.build());\r
-        return builder.build();\r
-    }\r
-\r
-    private static ActionsList createStripVlanAction(ByteBuf input, ActionsListBuilder builder) {\r
-        final byte PADDING_IN_STRIP_VLAN_ACTION = 4;\r
-        ActionBuilder actionBuilder = new ActionBuilder();\r
-        actionBuilder.setType(StripVlan.class);\r
-        input.skipBytes(PADDING_IN_STRIP_VLAN_ACTION);\r
-        builder.setAction(actionBuilder.build());\r
-        return builder.build();\r
-    }\r
-\r
-    private static ActionsList createSetDlSrcAction(ByteBuf input, ActionsListBuilder builder) {\r
-        ActionBuilder actionBuilder = new ActionBuilder();\r
-        actionBuilder.setType(SetDlSrc.class);\r
-        actionBuilder.addAugmentation(DlAddressAction.class, createDlAugmentationAndPad(input));\r
-        builder.setAction(actionBuilder.build());\r
-        return builder.build();\r
-    }\r
-\r
-    private static ActionsList createSetDlDstAction(ByteBuf input, ActionsListBuilder builder) {\r
-        ActionBuilder actionBuilder = new ActionBuilder();\r
-        actionBuilder.setType(SetDlDst.class);\r
-        actionBuilder.addAugmentation(DlAddressAction.class, createDlAugmentationAndPad(input));\r
-        builder.setAction(actionBuilder.build());\r
-        return builder.build();\r
-    }\r
-    \r
-    private static DlAddressAction createDlAugmentationAndPad(ByteBuf input) {\r
-        final byte MAC_ADDRESS_LENGTH = 6;\r
-        final byte PADDING_IN_SET_DL_ACTION = 6;\r
-        DlAddressActionBuilder dlBuilder = new DlAddressActionBuilder();\r
-        byte[] address = new byte[MAC_ADDRESS_LENGTH];\r
-        input.readBytes(address);\r
-        dlBuilder.setDlAddress(new MacAddress(ByteBufUtils.macAddressToString(address)));\r
-        input.skipBytes(PADDING_IN_SET_DL_ACTION);\r
-        return dlBuilder.build();\r
-    }\r
-\r
-    private static ActionsList createSetNwSrcAction(ByteBuf input, ActionsListBuilder builder) {\r
-        ActionBuilder actionBuilder = new ActionBuilder();\r
-        actionBuilder.setType(SetNwSrc.class);\r
-        actionBuilder.addAugmentation(DlAddressAction.class, createNwAddressAugmentationAndPad(input));\r
-        builder.setAction(actionBuilder.build());\r
-        return builder.build();\r
-    }\r
-\r
-    private static ActionsList createSetNwDstAction(ByteBuf input, ActionsListBuilder builder) {\r
-        ActionBuilder actionBuilder = new ActionBuilder();\r
-        actionBuilder.setType(SetNwDst.class);\r
-        actionBuilder.addAugmentation(DlAddressAction.class, createNwAddressAugmentationAndPad(input));\r
-        builder.setAction(actionBuilder.build());\r
-        return builder.build();\r
-    }\r
-    \r
-    private static Augmentation<Action> createNwAddressAugmentationAndPad(ByteBuf input) {\r
-        final byte GROUPS_IN_IPV4_ADDRESS = 4;\r
-        IpAddressActionBuilder ipBuilder = new IpAddressActionBuilder();\r
-        List<String> groups = new ArrayList<>();\r
-        for (int i = 0; i < GROUPS_IN_IPV4_ADDRESS; i++) {\r
-            groups.add(Short.toString(input.readUnsignedByte()));\r
-        }\r
-        Joiner joiner = Joiner.on(".");\r
-        ipBuilder.setIpAddress(new Ipv4Address(joiner.join(groups)));\r
-        return ipBuilder.build();\r
-    }\r
-\r
-    private static ActionsList createSetNwTosAction(ByteBuf input, ActionsListBuilder builder) {\r
-        final byte PADDING_IN_NW_TOS_ACTION = 3;\r
-        ActionBuilder actionBuilder = new ActionBuilder();\r
-        actionBuilder.setType(SetNwTos.class);\r
-        NwTosActionBuilder tosBuilder = new NwTosActionBuilder();\r
-        tosBuilder.setNwTos(input.readUnsignedByte());\r
-        actionBuilder.addAugmentation(NwTosAction.class, tosBuilder.build());\r
-        input.skipBytes(PADDING_IN_NW_TOS_ACTION);\r
-        builder.setAction(actionBuilder.build());\r
-        return builder.build();\r
-    }\r
-\r
-    private static ActionsList createSetTpSrcAction(ByteBuf input, ActionsListBuilder builder) {\r
-        final byte PADDING_IN_TP_ACTION = 2;\r
-        ActionBuilder actionBuilder = new ActionBuilder();\r
-        actionBuilder.setType(SetTpSrc.class);\r
-        createPortAugmentation(input, actionBuilder);\r
-        input.skipBytes(PADDING_IN_TP_ACTION);\r
-        builder.setAction(actionBuilder.build());\r
-        return builder.build();\r
-    }\r
-\r
-    private static ActionsList createSetTpDstAction(ByteBuf input, ActionsListBuilder builder) {\r
-        final byte PADDING_IN_TP_ACTION = 2;\r
-        ActionBuilder actionBuilder = new ActionBuilder();\r
-        actionBuilder.setType(SetTpDst.class);\r
-        createPortAugmentation(input, actionBuilder);\r
-        input.skipBytes(PADDING_IN_TP_ACTION);\r
-        builder.setAction(actionBuilder.build());\r
-        return builder.build();\r
-    }\r
-    \r
-    private static void createPortAugmentation(ByteBuf input, ActionBuilder actionBuilder) {\r
-        PortActionBuilder portBuilder = new PortActionBuilder();\r
-        portBuilder.setPort(new PortNumber((long) input.readUnsignedShort()));\r
-        actionBuilder.addAugmentation(PortAction.class, portBuilder.build());\r
-    }\r
-\r
-    private static ActionsList createEnqueueAction(ByteBuf input, ActionsListBuilder builder) {\r
-        final byte PADDING_IN_ENQUEUE_ACTION = 6;\r
-        ActionBuilder actionBuilder = new ActionBuilder();\r
-        actionBuilder.setType(Enqueue.class);\r
-        createPortAugmentation(input, actionBuilder);\r
-        input.skipBytes(PADDING_IN_ENQUEUE_ACTION);\r
-        QueueIdActionBuilder queueBuilder = new QueueIdActionBuilder();\r
-        queueBuilder.setQueueId(input.readUnsignedInt());\r
-        actionBuilder.addAugmentation(QueueIdAction.class, queueBuilder.build());\r
-        builder.setAction(actionBuilder.build());\r
-        return builder.build();\r
-    }\r
-\r
-    private static ActionsList createExperimenterAction(ByteBuf input, ActionsListBuilder builder) {\r
-        ActionBuilder actionBuilder = new ActionBuilder();\r
-        actionBuilder.setType(Enqueue.class);\r
-        ExperimenterActionBuilder expBuilder = new ExperimenterActionBuilder();\r
-        expBuilder.setExperimenter(input.readUnsignedInt());\r
-        actionBuilder.addAugmentation(QueueIdAction.class, expBuilder.build());\r
-        builder.setAction(actionBuilder.build());\r
-        return builder.build();\r
-    }\r
-    \r
-    \r
-}\r
+/*
+ * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.openflowjava.protocol.impl.util;
+
+import io.netty.buffer.ByteBuf;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;
+import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistryInjector;
+import org.opendaylight.openflowjava.protocol.api.extensibility.MessageCodeKey;
+import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DlAddressAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DlAddressActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.IpAddressAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.IpAddressActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTosAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTosActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Enqueue;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetDlDst;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetDlSrc;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwDst;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwSrc;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwTos;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetTpDst;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetTpSrc;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetVlanPcp;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetVlanVid;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.StripVlan;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.ActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
+import org.opendaylight.yangtools.yang.binding.Augmentation;
+
+import com.google.common.base.Joiner;
+
+/**
+ * Deserializes ofp_action (OpenFlow v1.0) structures
+ * @author michal.polkorab
+ */
+public class OF10ActionsDeserializer implements OFDeserializer<Action>,
+        DeserializerRegistryInjector {
+    
+    private static final byte PADDING_IN_SET_VLAN_VID_ACTION = 2;
+    private static final byte PADDING_IN_SET_VLAN_PCP_ACTION = 3;
+    private static final byte PADDING_IN_STRIP_VLAN_ACTION = 4;
+    private static final byte PADDING_IN_SET_DL_ACTION = 6;
+    private static final byte PADDING_IN_NW_TOS_ACTION = 3;
+    private static final byte PADDING_IN_TP_ACTION = 2;
+    private static final byte PADDING_IN_ENQUEUE_ACTION = 6;
+    private DeserializerRegistry registry;
+
+    @Override
+    public Action deserialize(ByteBuf input) {
+        int type = input.readUnsignedShort();
+        input.skipBytes(EncodeConstants.SIZE_OF_SHORT_IN_BYTES);
+        ActionBuilder actionsBuilder = new ActionBuilder();
+        Action actionsList = null;
+        switch(type) {
+        case 0:
+            actionsList = createOutputAction(input, actionsBuilder);
+            break;
+        case 1:
+            actionsList = createSetVlanVidAction(input, actionsBuilder);
+            break;
+        case 2:
+            actionsList = createVlanPcpAction(input, actionsBuilder);
+            break;
+        case 3:
+            actionsList = createStripVlanAction(input, actionsBuilder);
+            break;
+        case 4:
+            actionsList = createSetDlSrcAction(input, actionsBuilder);
+            break;
+        case 5:
+            actionsList = createSetDlDstAction(input, actionsBuilder);
+            break;
+        case 6:
+            actionsList = createSetNwSrcAction(input, actionsBuilder);
+            break;
+        case 7:
+            actionsList = createSetNwDstAction(input, actionsBuilder);
+            break;
+        case 8:
+            actionsList = createSetNwTosAction(input, actionsBuilder);
+            break;
+        case 9:
+            actionsList = createSetTpSrcAction(input, actionsBuilder);
+            break;
+        case 10:
+            actionsList = createSetTpDstAction(input, actionsBuilder);
+            break;
+        case 11:
+            actionsList = createEnqueueAction(input, actionsBuilder);
+            break;
+        case 0xFFFF:
+            OFDeserializer<ExperimenterAction> expDeserializer = registry.getDeserializer(
+                    new MessageCodeKey(EncodeConstants.OF10_VERSION_ID, 0xFFFF, ExperimenterAction.class));
+            expDeserializer.deserialize(input);
+            break;
+        default:
+            break;
+        }
+        return actionsList;
+    }
+
+    /**
+     * @param in input ByteBuf
+     * @param builder 
+     * @return ActionList
+     */
+    public static Action createOutputAction(ByteBuf in, ActionBuilder builder) {
+        builder.setType(Output.class);
+        createPortAugmentation(in, builder);
+        MaxLengthActionBuilder maxLen = new MaxLengthActionBuilder();
+        maxLen.setMaxLength(in.readUnsignedShort());
+        builder.addAugmentation(MaxLengthAction.class, maxLen.build());
+        return builder.build();
+    }
+
+    private static Action createSetVlanVidAction(ByteBuf input, ActionBuilder builder) {
+        builder.setType(SetVlanVid.class);
+        VlanVidActionBuilder vlanBuilder = new VlanVidActionBuilder();
+        vlanBuilder.setVlanVid(input.readUnsignedShort());
+        input.skipBytes(PADDING_IN_SET_VLAN_VID_ACTION);
+        builder.addAugmentation(VlanVidAction.class, vlanBuilder.build());
+        return builder.build();
+    }
+
+    private static Action createVlanPcpAction(ByteBuf input, ActionBuilder builder) {
+        builder.setType(SetVlanPcp.class);
+        VlanPcpActionBuilder vlanBuilder = new VlanPcpActionBuilder();
+        vlanBuilder.setVlanPcp(input.readUnsignedByte());
+        input.skipBytes(PADDING_IN_SET_VLAN_PCP_ACTION);
+        builder.addAugmentation(VlanPcpAction.class, vlanBuilder.build());
+        return builder.build();
+    }
+
+    private static Action createStripVlanAction(ByteBuf input, ActionBuilder builder) {
+        builder.setType(StripVlan.class);
+        input.skipBytes(PADDING_IN_STRIP_VLAN_ACTION);
+        return builder.build();
+    }
+
+    private static Action createSetDlSrcAction(ByteBuf input, ActionBuilder builder) {
+        builder.setType(SetDlSrc.class);
+        builder.addAugmentation(DlAddressAction.class, createDlAugmentationAndPad(input));
+        return builder.build();
+    }
+
+    private static Action createSetDlDstAction(ByteBuf input, ActionBuilder builder) {
+        builder.setType(SetDlDst.class);
+        builder.addAugmentation(DlAddressAction.class, createDlAugmentationAndPad(input));
+        return builder.build();
+    }
+    
+    private static DlAddressAction createDlAugmentationAndPad(ByteBuf input) {
+        DlAddressActionBuilder dlBuilder = new DlAddressActionBuilder();
+        byte[] address = new byte[EncodeConstants.MAC_ADDRESS_LENGTH];
+        input.readBytes(address);
+        dlBuilder.setDlAddress(new MacAddress(ByteBufUtils.macAddressToString(address)));
+        input.skipBytes(PADDING_IN_SET_DL_ACTION);
+        return dlBuilder.build();
+    }
+
+    private static Action createSetNwSrcAction(ByteBuf input, ActionBuilder builder) {
+        builder.setType(SetNwSrc.class);
+        builder.addAugmentation(IpAddressAction.class, createNwAddressAugmentationAndPad(input));
+        return builder.build();
+    }
+
+    private static Action createSetNwDstAction(ByteBuf input, ActionBuilder builder) {
+        builder.setType(SetNwDst.class);
+        builder.addAugmentation(IpAddressAction.class, createNwAddressAugmentationAndPad(input));
+        return builder.build();
+    }
+    
+    private static Augmentation<Action> createNwAddressAugmentationAndPad(ByteBuf input) {
+        IpAddressActionBuilder ipBuilder = new IpAddressActionBuilder();
+        List<String> groups = new ArrayList<>();
+        for (int i = 0; i < EncodeConstants.GROUPS_IN_IPV4_ADDRESS; i++) {
+            groups.add(Short.toString(input.readUnsignedByte()));
+        }
+        Joiner joiner = Joiner.on(".");
+        ipBuilder.setIpAddress(new Ipv4Address(joiner.join(groups)));
+        return ipBuilder.build();
+    }
+
+    private static Action createSetNwTosAction(ByteBuf input, ActionBuilder builder) {
+        builder.setType(SetNwTos.class);
+        NwTosActionBuilder tosBuilder = new NwTosActionBuilder();
+        tosBuilder.setNwTos(input.readUnsignedByte());
+        builder.addAugmentation(NwTosAction.class, tosBuilder.build());
+        input.skipBytes(PADDING_IN_NW_TOS_ACTION);
+        return builder.build();
+    }
+
+    private static Action createSetTpSrcAction(ByteBuf input, ActionBuilder builder) {
+        builder.setType(SetTpSrc.class);
+        createPortAugmentation(input, builder);
+        input.skipBytes(PADDING_IN_TP_ACTION);
+        return builder.build();
+    }
+
+    private static Action createSetTpDstAction(ByteBuf input, ActionBuilder builder) {
+        builder.setType(SetTpDst.class);
+        createPortAugmentation(input, builder);
+        input.skipBytes(PADDING_IN_TP_ACTION);
+        return builder.build();
+    }
+    
+    private static void createPortAugmentation(ByteBuf input, ActionBuilder actionBuilder) {
+        PortActionBuilder portBuilder = new PortActionBuilder();
+        portBuilder.setPort(new PortNumber((long) input.readUnsignedShort()));
+        actionBuilder.addAugmentation(PortAction.class, portBuilder.build());
+    }
+
+    private static Action createEnqueueAction(ByteBuf input, ActionBuilder builder) {
+        builder.setType(Enqueue.class);
+        createPortAugmentation(input, builder);
+        input.skipBytes(PADDING_IN_ENQUEUE_ACTION);
+        QueueIdActionBuilder queueBuilder = new QueueIdActionBuilder();
+        queueBuilder.setQueueId(input.readUnsignedInt());
+        builder.addAugmentation(QueueIdAction.class, queueBuilder.build());
+        return builder.build();
+    }
+
+    @Override
+    public void injectDeserializerRegistry(DeserializerRegistry deserializerRegistry) {
+        registry = deserializerRegistry;
+    }
+}