* @author michal.polkorab\r
*/\r
public abstract class ActionsDeserializer {\r
- private static ActionBuilder actionBuilder = new ActionBuilder();\r
- private static ActionsListBuilder actionsListBuilder = new ActionsListBuilder();\r
- private static List<ActionsList> actionsList = new ArrayList<>();\r
+ \r
+ private static final byte ACTION_HEADER_LENGTH = 4;\r
\r
/**\r
* @param input input ByteBuf\r
- * @param bucketsLength length of buckets\r
+ * @param actionsLength length of buckets\r
* @return ActionsList\r
*/\r
- public static List<ActionsList> createActionsList(ByteBuf input, int bucketsLength) {\r
- final byte BUCKET_HEADER_LENGTH = 16;\r
- final byte ACTION_HEADER_LENGTH = 4;\r
- int bucketsCurrentLength = BUCKET_HEADER_LENGTH;\r
- int actionsLength = 0;\r
- \r
- while (bucketsCurrentLength < bucketsLength) {\r
- switch(input.readUnsignedShort()) {\r
- case 0: actionsLength = input.readUnsignedShort(); //outputActionLength\r
- actionsList.add(ActionsDeserializer.createOutputAction(input));\r
- break;\r
- case 11: \r
- actionsLength = input.readUnsignedShort();//empty header length\r
- actionsList.add(ActionsDeserializer.createCopyTtlOutAction(input));\r
- break;\r
- \r
- case 12: \r
- actionsLength = input.readUnsignedShort();//empty header length\r
- actionsList.add(ActionsDeserializer.createCopyTtlInAction(input));\r
- break;\r
- \r
- case 15: \r
- actionsLength = input.readUnsignedShort();//empty header length\r
- actionsList.add(ActionsDeserializer.createSetMplsTtlAction(input));\r
- break;\r
- \r
- case 16: \r
- actionsLength = input.readUnsignedShort();//empty header length\r
- actionsList.add(ActionsDeserializer.createDecMplsTtlOutAction(input));\r
- break;\r
- \r
- case 17: \r
- actionsLength = input.readUnsignedShort();\r
- actionsList.add(ActionsDeserializer.createPushVlanAction(input));\r
- break;\r
- \r
- case 18: \r
- actionsLength = input.readUnsignedShort();//empty header length\r
- actionsList.add(ActionsDeserializer.createPopVlanAction(input));\r
- break;\r
- \r
- case 19: \r
- actionsLength = input.readUnsignedShort();//8\r
- actionsList.add(ActionsDeserializer.createPushMplsAction(input));\r
- break;\r
- \r
- case 20: \r
- actionsLength = input.readUnsignedShort();//8\r
- actionsList.add(ActionsDeserializer.createPopMplsAction(input));\r
- break;\r
- \r
- case 21: \r
- actionsLength = input.readUnsignedShort();\r
- actionsList.add(ActionsDeserializer.createSetQueueAction(input));\r
- break;\r
- \r
- case 22: \r
- actionsLength = input.readUnsignedShort();//8\r
- actionsList.add(ActionsDeserializer.createGroupAction(input));\r
- break;\r
- \r
- case 23: \r
- actionsLength = input.readUnsignedShort();//8\r
- actionsList.add(ActionsDeserializer.createSetNwTtlAction(input));\r
- break;\r
- \r
- case 24: \r
- actionsLength = input.readUnsignedShort();//empty header length\r
- actionsList.add(ActionsDeserializer.createDecNwTtlAction(input));\r
- break;\r
- \r
- case 25:\r
- actionsLength = input.readUnsignedShort();//8\r
- actionsList.add(ActionsDeserializer.createSetFieldAction(input,\r
- actionsLength - ACTION_HEADER_LENGTH));\r
- break; \r
- case 26: \r
- actionsLength = input.readUnsignedShort();//8\r
- actionsList.add(ActionsDeserializer.createPushPbbAction(input));\r
- break;\r
- \r
- case 27: \r
- actionsLength = input.readUnsignedShort();//empty header length\r
- actionsList.add(ActionsDeserializer.createPopPbbAction(input));\r
- break;\r
- \r
- case 0xFFFF: \r
- actionsLength = input.readUnsignedShort();\r
- actionsList.add(ActionsDeserializer.createExperimenterAction(input));\r
- break;\r
- default: \r
- break;\r
- }\r
- bucketsCurrentLength += actionsLength;\r
- } \r
+ public static List<ActionsList> createActionsList(ByteBuf input, int actionsLength) {\r
+ ActionsListBuilder actionsListBuilder = new ActionsListBuilder();\r
+ List<ActionsList> actionsList = new ArrayList<>();\r
+ int length = 0;\r
+ while (length < actionsLength) {\r
+ int currentActionLength = 0;\r
+ switch(input.readUnsignedShort()) {\r
+ case 0: currentActionLength = input.readUnsignedShort(); //outputActionLength\r
+ actionsList.add(ActionsDeserializer.createOutputAction(input, actionsListBuilder));\r
+ break;\r
+ case 11: \r
+ currentActionLength = input.readUnsignedShort();//empty header length\r
+ actionsList.add(ActionsDeserializer.createCopyTtlOutAction(input, actionsListBuilder));\r
+ break;\r
+\r
+ case 12: \r
+ currentActionLength = input.readUnsignedShort();//empty header length\r
+ actionsList.add(ActionsDeserializer.createCopyTtlInAction(input, actionsListBuilder));\r
+ break;\r
+\r
+ case 15: \r
+ currentActionLength = input.readUnsignedShort();//empty header length\r
+ actionsList.add(ActionsDeserializer.createSetMplsTtlAction(input, actionsListBuilder));\r
+ break;\r
+\r
+ case 16: \r
+ currentActionLength = input.readUnsignedShort();//empty header length\r
+ actionsList.add(ActionsDeserializer.createDecMplsTtlOutAction(input, actionsListBuilder));\r
+ break;\r
+\r
+ case 17: \r
+ currentActionLength = input.readUnsignedShort();\r
+ actionsList.add(ActionsDeserializer.createPushVlanAction(input, actionsListBuilder));\r
+ break;\r
+\r
+ case 18: \r
+ currentActionLength = input.readUnsignedShort();//empty header length\r
+ actionsList.add(ActionsDeserializer.createPopVlanAction(input, actionsListBuilder));\r
+ break;\r
+\r
+ case 19: \r
+ currentActionLength = input.readUnsignedShort();//8\r
+ actionsList.add(ActionsDeserializer.createPushMplsAction(input, actionsListBuilder));\r
+ break;\r
+\r
+ case 20: \r
+ currentActionLength = input.readUnsignedShort();//8\r
+ actionsList.add(ActionsDeserializer.createPopMplsAction(input, actionsListBuilder));\r
+ break;\r
+\r
+ case 21: \r
+ currentActionLength = input.readUnsignedShort();\r
+ actionsList.add(ActionsDeserializer.createSetQueueAction(input, actionsListBuilder));\r
+ break;\r
+\r
+ case 22: \r
+ currentActionLength = input.readUnsignedShort();//8\r
+ actionsList.add(ActionsDeserializer.createGroupAction(input, actionsListBuilder));\r
+ break;\r
+\r
+ case 23: \r
+ currentActionLength = input.readUnsignedShort();//8\r
+ actionsList.add(ActionsDeserializer.createSetNwTtlAction(input, actionsListBuilder));\r
+ break;\r
+\r
+ case 24: \r
+ currentActionLength = input.readUnsignedShort();//empty header length\r
+ actionsList.add(ActionsDeserializer.createDecNwTtlAction(input, actionsListBuilder));\r
+ break;\r
+\r
+ case 25:\r
+ currentActionLength = input.readUnsignedShort();//8\r
+ actionsList.add(ActionsDeserializer.createSetFieldAction(input, actionsListBuilder,\r
+ currentActionLength));\r
+ break; \r
+ case 26: \r
+ currentActionLength = input.readUnsignedShort();//8\r
+ actionsList.add(ActionsDeserializer.createPushPbbAction(input, actionsListBuilder));\r
+ break;\r
+\r
+ case 27: \r
+ currentActionLength = input.readUnsignedShort();//empty header length\r
+ actionsList.add(ActionsDeserializer.createPopPbbAction(input, actionsListBuilder));\r
+ break;\r
+\r
+ case 0xFFFF: \r
+ currentActionLength = input.readUnsignedShort();\r
+ actionsList.add(ActionsDeserializer.createExperimenterAction(input, actionsListBuilder));\r
+ break;\r
+ default: \r
+ break;\r
+ }\r
+ length += currentActionLength;\r
+ } \r
return actionsList;\r
}\r
\r
/**\r
* @param action input action that contains empty header\r
* @param in input ByteBuf \r
+ * @param actionsListBuilder \r
* @return Action\r
*/\r
private static ActionsList createEmptyHeader(Class<? extends org.opendaylight.yang.gen.v1.\r
- urn.opendaylight.openflow.common.types.rev130731.Action> action, ByteBuf in) {\r
+ urn.opendaylight.openflow.common.types.rev130731.Action> action,\r
+ ByteBuf in, ActionsListBuilder actionsListBuilder) {\r
final byte PADDING_IN_ACTIONS_HEADER = 4;\r
- \r
+ ActionBuilder actionBuilder = new ActionBuilder();\r
actionBuilder.setType(action);\r
in.skipBytes(PADDING_IN_ACTIONS_HEADER);\r
actionsListBuilder.setAction(actionBuilder.build());\r
\r
/**\r
* @param in input ByteBuf\r
+ * @param actionsListBuilder \r
* @return Action\r
*/\r
- public static ActionsList createCopyTtlInAction(ByteBuf in) {\r
- return createEmptyHeader(CopyTtlIn.class, in);\r
+ public static ActionsList createCopyTtlInAction(ByteBuf in, ActionsListBuilder actionsListBuilder) {\r
+ return createEmptyHeader(CopyTtlIn.class, in, actionsListBuilder);\r
}\r
\r
/**\r
* @param in input ByteBuf\r
+ * @param actionsListBuilder \r
* @return Action\r
*/\r
- public static ActionsList createCopyTtlOutAction(ByteBuf in) {\r
- return createEmptyHeader(CopyTtlOut.class, in);\r
+ public static ActionsList createCopyTtlOutAction(ByteBuf in, ActionsListBuilder actionsListBuilder) {\r
+ return createEmptyHeader(CopyTtlOut.class, in, actionsListBuilder);\r
}\r
\r
/**\r
* @param in input ByteBuf\r
+ * @param actionsListBuilder \r
* @return Action\r
*/\r
- public static ActionsList createDecMplsTtlOutAction(ByteBuf in) {\r
- return createEmptyHeader(DecMplsTtl.class, in);\r
+ public static ActionsList createDecMplsTtlOutAction(ByteBuf in, ActionsListBuilder actionsListBuilder) {\r
+ return createEmptyHeader(DecMplsTtl.class, in, actionsListBuilder);\r
}\r
\r
/**\r
* @param in input ByteBuf\r
+ * @param actionsListBuilder \r
* @return Action\r
*/\r
- public static ActionsList createPopVlanAction(ByteBuf in) {\r
- return createEmptyHeader(PopVlan.class, in);\r
+ public static ActionsList createPopVlanAction(ByteBuf in, ActionsListBuilder actionsListBuilder) {\r
+ return createEmptyHeader(PopVlan.class, in, actionsListBuilder);\r
}\r
\r
/**\r
* @param in input ByteBuf\r
+ * @param actionsListBuilder \r
* @return Action\r
*/\r
- public static ActionsList createDecNwTtlAction(ByteBuf in) {\r
- return createEmptyHeader(DecNwTtl.class, in);\r
+ public static ActionsList createDecNwTtlAction(ByteBuf in, ActionsListBuilder actionsListBuilder) {\r
+ return createEmptyHeader(DecNwTtl.class, in, actionsListBuilder);\r
}\r
\r
/**\r
* @param in input ByteBuf\r
+ * @param actionsListBuilder \r
* @return Action\r
*/\r
- public static ActionsList createPopPbbAction(ByteBuf in) {\r
- return createEmptyHeader(PopPbb.class, in);\r
+ public static ActionsList createPopPbbAction(ByteBuf in, ActionsListBuilder actionsListBuilder) {\r
+ return createEmptyHeader(PopPbb.class, in, actionsListBuilder);\r
}\r
\r
/**\r
* @param in input ByteBuf\r
+ * @param actionsListBuilder \r
* @return ActionList\r
*/\r
- public static ActionsList createOutputAction(ByteBuf in) {\r
+ public static ActionsList createOutputAction(ByteBuf in, ActionsListBuilder actionsListBuilder) {\r
final byte PADDING_IN_OUTPUT_ACTIONS_HEADER = 6;\r
- \r
+ ActionBuilder actionBuilder = new ActionBuilder();\r
actionBuilder.setType(Output.class);\r
PortActionBuilder port = new PortActionBuilder();\r
port.setPort(new PortNumber(in.readUnsignedInt()));\r
\r
/**\r
* @param in input ByteBuf\r
+ * @param actionsListBuilder \r
* @return ActionList\r
*/\r
- public static ActionsList createSetMplsTtlAction(ByteBuf in) {\r
+ public static ActionsList createSetMplsTtlAction(ByteBuf in, ActionsListBuilder actionsListBuilder) {\r
final byte PADDING_IN_SET_MPLS_TTL_ACTIONS_HEADER = 3;\r
- \r
+ ActionBuilder actionBuilder = new ActionBuilder();\r
actionBuilder.setType(SetMplsTtl.class);\r
MplsTtlActionBuilder mplsTtl = new MplsTtlActionBuilder();\r
mplsTtl.setMplsTtl(in.readUnsignedByte());\r
/**\r
* @param action input action that contains push\r
* @param in input ByteBuf\r
+ * @param actionsListBuilder \r
* @return ActionList\r
*/\r
- private static ActionsList createPushAction(Class<? extends org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Action> action, ByteBuf in) {\r
+ private static ActionsList createPushAction(Class<? extends org.opendaylight.yang.gen.\r
+ v1.urn.opendaylight.openflow.common.types.rev130731.Action> action,\r
+ ByteBuf in, ActionsListBuilder actionsListBuilder) {\r
final byte PADDING_IN_PUSH_VLAN_ACTIONS_HEADER = 2;\r
- \r
+ ActionBuilder actionBuilder = new ActionBuilder();\r
actionBuilder.setType(action);\r
EthertypeActionBuilder etherType = new EthertypeActionBuilder();\r
etherType.setEthertype(new EtherType(in.readUnsignedShort()));\r
\r
/**\r
* @param in input ByteBuf\r
+ * @param actionsListBuilder \r
* @return Action\r
*/\r
- public static ActionsList createPushVlanAction(ByteBuf in) {\r
- return createPushAction(PushVlan.class, in);\r
+ public static ActionsList createPushVlanAction(ByteBuf in, ActionsListBuilder actionsListBuilder) {\r
+ return createPushAction(PushVlan.class, in, actionsListBuilder);\r
}\r
\r
/**\r
* @param in input ByteBuf\r
+ * @param actionsListBuilder \r
* @return Action\r
*/\r
- public static ActionsList createPushMplsAction(ByteBuf in) {\r
- return createPushAction(PushMpls.class, in);\r
+ public static ActionsList createPushMplsAction(ByteBuf in, ActionsListBuilder actionsListBuilder) {\r
+ return createPushAction(PushMpls.class, in, actionsListBuilder);\r
}\r
\r
/**\r
* @param in input ByteBuf\r
+ * @param actionsListBuilder \r
* @return Action\r
*/\r
- public static ActionsList createPopMplsAction(ByteBuf in) {\r
- return createPushAction(PopMpls.class, in);\r
+ public static ActionsList createPopMplsAction(ByteBuf in, ActionsListBuilder actionsListBuilder) {\r
+ return createPushAction(PopMpls.class, in, actionsListBuilder);\r
}\r
\r
/**\r
* @param in input ByteBuf\r
+ * @param actionsListBuilder \r
* @return Action\r
*/\r
- public static ActionsList createPushPbbAction(ByteBuf in) {\r
- return createPushAction(PushPbb.class, in);\r
+ public static ActionsList createPushPbbAction(ByteBuf in, ActionsListBuilder actionsListBuilder) {\r
+ return createPushAction(PushPbb.class, in, actionsListBuilder);\r
}\r
\r
/**\r
* @param in input ByteBuf\r
+ * @param actionsListBuilder \r
* @return ActionList\r
*/\r
- public static ActionsList createSetQueueAction(ByteBuf in) {\r
+ public static ActionsList createSetQueueAction(ByteBuf in, ActionsListBuilder actionsListBuilder) {\r
+ ActionBuilder actionBuilder = new ActionBuilder();\r
actionBuilder.setType(SetQueue.class);\r
QueueIdActionBuilder queueId = new QueueIdActionBuilder();\r
queueId.setQueueId(in.readUnsignedInt());\r
\r
/**\r
* @param in input ByteBuf\r
+ * @param actionsListBuilder \r
* @return ActionList\r
*/\r
- public static ActionsList createGroupAction(ByteBuf in) {\r
+ public static ActionsList createGroupAction(ByteBuf in, ActionsListBuilder actionsListBuilder) {\r
+ ActionBuilder actionBuilder = new ActionBuilder();\r
actionBuilder.setType(Group.class);\r
GroupIdActionBuilder group = new GroupIdActionBuilder();\r
group.setGroupId(in.readUnsignedInt());\r
\r
/**\r
* @param in input ByteBuf\r
+ * @param actionsListBuilder \r
* @return ActionList\r
*/\r
- public static ActionsList createExperimenterAction(ByteBuf in) {\r
+ public static ActionsList createExperimenterAction(ByteBuf in, ActionsListBuilder actionsListBuilder) {\r
+ ActionBuilder actionBuilder = new ActionBuilder();\r
actionBuilder.setType(Experimenter.class);\r
ExperimenterActionBuilder experimenter = new ExperimenterActionBuilder();\r
experimenter.setExperimenter(in.readUnsignedInt());\r
\r
/**\r
* @param in input ByteBuf\r
+ * @param actionsListBuilder \r
* @return ActionList\r
*/\r
- public static ActionsList createSetNwTtlAction(ByteBuf in) {\r
+ public static ActionsList createSetNwTtlAction(ByteBuf in, ActionsListBuilder actionsListBuilder) {\r
final byte PADDING_IN_NW_TTL_ACTIONS_HEADER = 3;\r
- \r
+ ActionBuilder actionBuilder = new ActionBuilder();\r
actionBuilder.setType(SetNwTtl.class);\r
NwTtlActionBuilder nwTtl = new NwTtlActionBuilder();\r
nwTtl.setNwTtl(in.readUnsignedByte());\r
\r
/**\r
* @param in input ByteBuf\r
+ * @param actionsListBuilder \r
* @param actionLength length of action\r
* @return ActionList\r
*/\r
- public static ActionsList createSetFieldAction(ByteBuf in, int actionLength) {\r
+ public static ActionsList createSetFieldAction(ByteBuf in, ActionsListBuilder actionsListBuilder, int actionLength) {\r
+ ActionBuilder actionBuilder = new ActionBuilder();\r
actionBuilder.setType(SetField.class);\r
OxmFieldsActionBuilder matchEntries = new OxmFieldsActionBuilder();\r
- matchEntries.setMatchEntries(MatchDeserializer.createMatchEntries(in, actionLength));\r
+ matchEntries.setMatchEntries(MatchDeserializer.createMatchEntry(in, actionLength - ACTION_HEADER_LENGTH));\r
actionBuilder.addAugmentation(OxmFieldsAction.class, matchEntries.build());\r
actionsListBuilder.setAction(actionBuilder.build());\r
\r