2 * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.openflowjava.protocol.impl.util;
11 import java.util.ArrayList;
12 import java.util.List;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ActionsInstruction;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ActionsInstructionBuilder;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterInstruction;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterInstructionBuilder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MetadataInstruction;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MetadataInstructionBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MeterIdInstruction;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MeterIdInstructionBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.TableIdInstruction;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.TableIdInstructionBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.ApplyActions;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.ClearActions;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.Experimenter;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.GotoTable;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.Meter;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.WriteActions;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.WriteMetadata;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.Instructions;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.InstructionsBuilder;
34 import io.netty.buffer.ByteBuf;
37 * Deserializes ofp_instruction (OpenFlow v1.3) structures
38 * @author michal.polkorab
39 * @author timotej.kubas
41 public class InstructionsDeserializer {
43 private static final byte WRITE_APPLY_CLEAR_ACTION_LENGTH = 8;
44 private static final byte EXPERIMENTER_HEADER_LENGTH = 8;
45 private static final byte GOTO_TABLE_PADDING = 3;
46 private static final byte WRITE_METADATA_PADDING = 4;
47 private static final byte ACTIONS_RELATED_INSTRUCTION_PADDING = 4;
50 * Creates list of instructions
53 * @return list of ofp_instruction
55 public static List<Instructions> createInstructions(ByteBuf input, int length) {
56 List<Instructions> instructions = new ArrayList<>();
57 if (input.readableBytes() != 0) {
58 int lengthOfInstructions = length;
59 while (lengthOfInstructions > 0) {
60 InstructionsBuilder builder = new InstructionsBuilder();
61 int type = input.readUnsignedShort();
62 int instructionLength = input.readUnsignedShort();
63 lengthOfInstructions -= instructionLength;
66 createGotoTableInstruction(builder, input);
69 createMetadataInstruction(builder, input);
72 builder.setType(WriteActions.class);
73 createActionRelatedInstruction(input, builder, instructionLength - WRITE_APPLY_CLEAR_ACTION_LENGTH);
76 builder.setType(ApplyActions.class);
77 createActionRelatedInstruction(input, builder, instructionLength - WRITE_APPLY_CLEAR_ACTION_LENGTH);
80 builder.setType(ClearActions.class);
81 createActionRelatedInstruction(input, builder, instructionLength - WRITE_APPLY_CLEAR_ACTION_LENGTH);
84 builder.setType(Meter.class);
85 MeterIdInstructionBuilder meterBuilder = new MeterIdInstructionBuilder();
86 meterBuilder.setMeterId(input.readUnsignedInt());
87 builder.addAugmentation(MeterIdInstruction.class, meterBuilder.build());
90 builder.setType(Experimenter.class);
91 ExperimenterInstructionBuilder expBuilder = new ExperimenterInstructionBuilder();
92 expBuilder.setExperimenter(input.readUnsignedInt());
93 int dataLength = instructionLength - EXPERIMENTER_HEADER_LENGTH;
95 byte[] data = new byte[dataLength];
96 input.readBytes(data);
97 expBuilder.setData(data);
99 builder.addAugmentation(ExperimenterInstruction.class, expBuilder.build());
104 instructions.add(builder.build());
110 private static void createGotoTableInstruction(InstructionsBuilder builder,
112 builder.setType(GotoTable.class);
113 TableIdInstructionBuilder tableBuilder = new TableIdInstructionBuilder();
114 tableBuilder.setTableId(input.readUnsignedByte());
115 builder.addAugmentation(TableIdInstruction.class, tableBuilder.build());
116 input.skipBytes(GOTO_TABLE_PADDING);
119 private static void createMetadataInstruction(InstructionsBuilder builder,
121 input.skipBytes(WRITE_METADATA_PADDING);
122 builder.setType(WriteMetadata.class);
123 MetadataInstructionBuilder metadataBuilder = new MetadataInstructionBuilder();
124 byte[] metadata = new byte[EncodeConstants.SIZE_OF_LONG_IN_BYTES];
125 input.readBytes(metadata);
126 metadataBuilder.setMetadata(metadata);
127 byte[] metadata_mask = new byte[EncodeConstants.SIZE_OF_LONG_IN_BYTES];
128 input.readBytes(metadata_mask);
129 metadataBuilder.setMetadata(metadata_mask);
130 builder.addAugmentation(MetadataInstruction.class, metadataBuilder.build());
133 private static void createActionRelatedInstruction(ByteBuf input,
134 InstructionsBuilder builder, int instructionLength) {
135 input.skipBytes(ACTIONS_RELATED_INSTRUCTION_PADDING);
136 ActionsInstructionBuilder actionsBuilder = new ActionsInstructionBuilder();
137 actionsBuilder.setActionsList(ActionsDeserializer.createActionsList(input, instructionLength));
138 builder.addAugmentation(ActionsInstruction.class, actionsBuilder.build());