-/* 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.IpAddressAction;\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
- private static final byte PADDING_IN_SET_VLAN_VID_ACTION = 2;\r
- private static final byte PADDING_IN_SET_VLAN_PCP_ACTION = 3;\r
- private static final byte PADDING_IN_STRIP_VLAN_ACTION = 4;\r
- private static final byte PADDING_IN_SET_DL_ACTION = 6;\r
- private static final byte PADDING_IN_NW_TOS_ACTION = 3;\r
- private static final byte PADDING_IN_TP_ACTION = 2;\r
- private static final byte PADDING_IN_ENQUEUE_ACTION = 6;\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(EncodeConstants.SIZE_OF_SHORT_IN_BYTES);\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
- 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
- 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
- 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
- DlAddressActionBuilder dlBuilder = new DlAddressActionBuilder();\r
- byte[] address = new byte[EncodeConstants.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(IpAddressAction.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(IpAddressAction.class, createNwAddressAugmentationAndPad(input));\r
- builder.setAction(actionBuilder.build());\r
- return builder.build();\r
- }\r
- \r
- private static Augmentation<Action> createNwAddressAugmentationAndPad(ByteBuf input) {\r
- IpAddressActionBuilder ipBuilder = new IpAddressActionBuilder();\r
- List<String> groups = new ArrayList<>();\r
- for (int i = 0; i < EncodeConstants.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
- 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
- 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
- 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
- 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.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.ExperimenterActionBuilder;
+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.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.ActionsList;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.ActionsListBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.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 {
+
+ 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;
+
+ /**
+ * Creates list of actions (OpenFlow v1.0) from ofp_action structures
+ * @param input input ByteBuf
+ * @return ActionsList list of actions
+ */
+ public static List<ActionsList> createActionsList(ByteBuf input) {
+ List<ActionsList> actions = new ArrayList<>();
+ while (input.readableBytes() > 0) {
+ ActionsListBuilder actionsBuilder = new ActionsListBuilder();
+ int type = input.readUnsignedShort();
+ input.skipBytes(EncodeConstants.SIZE_OF_SHORT_IN_BYTES);
+ switch(type) {
+ case 0:
+ actions.add(createOutputAction(input, actionsBuilder));
+ break;
+ case 1:
+ actions.add(createSetVlanVidAction(input, actionsBuilder));
+ break;
+ case 2:
+ actions.add(createVlanPcpAction(input, actionsBuilder));
+ break;
+ case 3:
+ actions.add(createStripVlanAction(input, actionsBuilder));
+ break;
+ case 4:
+ actions.add(createSetDlSrcAction(input, actionsBuilder));
+ break;
+ case 5:
+ actions.add(createSetDlDstAction(input, actionsBuilder));
+ break;
+ case 6:
+ actions.add(createSetNwSrcAction(input, actionsBuilder));
+ break;
+ case 7:
+ actions.add(createSetNwDstAction(input, actionsBuilder));
+ break;
+ case 8:
+ actions.add(createSetNwTosAction(input, actionsBuilder));
+ break;
+ case 9:
+ actions.add(createSetTpSrcAction(input, actionsBuilder));
+ break;
+ case 10:
+ actions.add(createSetTpDstAction(input, actionsBuilder));
+ break;
+ case 11:
+ actions.add(createEnqueueAction(input, actionsBuilder));
+ break;
+ case 0xFFFF:
+ actions.add(createExperimenterAction(input, actionsBuilder));
+ break;
+ default:
+ break;
+ }
+ }
+ return actions;
+ }
+
+ /**
+ * @param in input ByteBuf
+ * @param builder
+ * @return ActionList
+ */
+ public static ActionsList createOutputAction(ByteBuf in, ActionsListBuilder builder) {
+ ActionBuilder actionBuilder = new ActionBuilder();
+ actionBuilder.setType(Output.class);
+ createPortAugmentation(in, actionBuilder);
+ MaxLengthActionBuilder maxLen = new MaxLengthActionBuilder();
+ maxLen.setMaxLength(in.readUnsignedShort());
+ actionBuilder.addAugmentation(MaxLengthAction.class, maxLen.build());
+ builder.setAction(actionBuilder.build());
+ return builder.build();
+ }
+
+ private static ActionsList createSetVlanVidAction(ByteBuf input, ActionsListBuilder builder) {
+ ActionBuilder actionBuilder = new ActionBuilder();
+ actionBuilder.setType(SetVlanVid.class);
+ VlanVidActionBuilder vlanBuilder = new VlanVidActionBuilder();
+ vlanBuilder.setVlanVid(input.readUnsignedShort());
+ input.skipBytes(PADDING_IN_SET_VLAN_VID_ACTION);
+ actionBuilder.addAugmentation(VlanVidAction.class, vlanBuilder.build());
+ builder.setAction(actionBuilder.build());
+ return builder.build();
+ }
+
+ private static ActionsList createVlanPcpAction(ByteBuf input, ActionsListBuilder builder) {
+ ActionBuilder actionBuilder = new ActionBuilder();
+ actionBuilder.setType(SetVlanPcp.class);
+ VlanPcpActionBuilder vlanBuilder = new VlanPcpActionBuilder();
+ vlanBuilder.setVlanPcp(input.readUnsignedByte());
+ input.skipBytes(PADDING_IN_SET_VLAN_PCP_ACTION);
+ actionBuilder.addAugmentation(VlanVidAction.class, vlanBuilder.build());
+ builder.setAction(actionBuilder.build());
+ return builder.build();
+ }
+
+ private static ActionsList createStripVlanAction(ByteBuf input, ActionsListBuilder builder) {
+ ActionBuilder actionBuilder = new ActionBuilder();
+ actionBuilder.setType(StripVlan.class);
+ input.skipBytes(PADDING_IN_STRIP_VLAN_ACTION);
+ builder.setAction(actionBuilder.build());
+ return builder.build();
+ }
+
+ private static ActionsList createSetDlSrcAction(ByteBuf input, ActionsListBuilder builder) {
+ ActionBuilder actionBuilder = new ActionBuilder();
+ actionBuilder.setType(SetDlSrc.class);
+ actionBuilder.addAugmentation(DlAddressAction.class, createDlAugmentationAndPad(input));
+ builder.setAction(actionBuilder.build());
+ return builder.build();
+ }
+
+ private static ActionsList createSetDlDstAction(ByteBuf input, ActionsListBuilder builder) {
+ ActionBuilder actionBuilder = new ActionBuilder();
+ actionBuilder.setType(SetDlDst.class);
+ actionBuilder.addAugmentation(DlAddressAction.class, createDlAugmentationAndPad(input));
+ builder.setAction(actionBuilder.build());
+ 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 ActionsList createSetNwSrcAction(ByteBuf input, ActionsListBuilder builder) {
+ ActionBuilder actionBuilder = new ActionBuilder();
+ actionBuilder.setType(SetNwSrc.class);
+ actionBuilder.addAugmentation(IpAddressAction.class, createNwAddressAugmentationAndPad(input));
+ builder.setAction(actionBuilder.build());
+ return builder.build();
+ }
+
+ private static ActionsList createSetNwDstAction(ByteBuf input, ActionsListBuilder builder) {
+ ActionBuilder actionBuilder = new ActionBuilder();
+ actionBuilder.setType(SetNwDst.class);
+ actionBuilder.addAugmentation(IpAddressAction.class, createNwAddressAugmentationAndPad(input));
+ builder.setAction(actionBuilder.build());
+ 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 ActionsList createSetNwTosAction(ByteBuf input, ActionsListBuilder builder) {
+ ActionBuilder actionBuilder = new ActionBuilder();
+ actionBuilder.setType(SetNwTos.class);
+ NwTosActionBuilder tosBuilder = new NwTosActionBuilder();
+ tosBuilder.setNwTos(input.readUnsignedByte());
+ actionBuilder.addAugmentation(NwTosAction.class, tosBuilder.build());
+ input.skipBytes(PADDING_IN_NW_TOS_ACTION);
+ builder.setAction(actionBuilder.build());
+ return builder.build();
+ }
+
+ private static ActionsList createSetTpSrcAction(ByteBuf input, ActionsListBuilder builder) {
+ ActionBuilder actionBuilder = new ActionBuilder();
+ actionBuilder.setType(SetTpSrc.class);
+ createPortAugmentation(input, actionBuilder);
+ input.skipBytes(PADDING_IN_TP_ACTION);
+ builder.setAction(actionBuilder.build());
+ return builder.build();
+ }
+
+ private static ActionsList createSetTpDstAction(ByteBuf input, ActionsListBuilder builder) {
+ ActionBuilder actionBuilder = new ActionBuilder();
+ actionBuilder.setType(SetTpDst.class);
+ createPortAugmentation(input, actionBuilder);
+ input.skipBytes(PADDING_IN_TP_ACTION);
+ builder.setAction(actionBuilder.build());
+ 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 ActionsList createEnqueueAction(ByteBuf input, ActionsListBuilder builder) {
+ ActionBuilder actionBuilder = new ActionBuilder();
+ actionBuilder.setType(Enqueue.class);
+ createPortAugmentation(input, actionBuilder);
+ input.skipBytes(PADDING_IN_ENQUEUE_ACTION);
+ QueueIdActionBuilder queueBuilder = new QueueIdActionBuilder();
+ queueBuilder.setQueueId(input.readUnsignedInt());
+ actionBuilder.addAugmentation(QueueIdAction.class, queueBuilder.build());
+ builder.setAction(actionBuilder.build());
+ return builder.build();
+ }
+
+ private static ActionsList createExperimenterAction(ByteBuf input, ActionsListBuilder builder) {
+ ActionBuilder actionBuilder = new ActionBuilder();
+ actionBuilder.setType(Enqueue.class);
+ ExperimenterActionBuilder expBuilder = new ExperimenterActionBuilder();
+ expBuilder.setExperimenter(input.readUnsignedInt());
+ actionBuilder.addAugmentation(QueueIdAction.class, expBuilder.build());
+ builder.setAction(actionBuilder.build());
+ return builder.build();
+ }
+
+
+}