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.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.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.Experimenter;
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;
* Deserializes ofp_action (OpenFlow v1.0) structures
* @author michal.polkorab
*/
-public abstract class OF10ActionsDeserializer {
+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_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;
- /**
- * Creates list of actions (OpenFlow v1.0) from ofp_action structures
- * @param input input ByteBuf
- * @return ActionsList list of actions
- */
- public static List<Action> createActionsList(ByteBuf input) {
- List<Action> actions = new ArrayList<>();
- while (input.readableBytes() > 0) {
- int type = input.readUnsignedShort();
- input.skipBytes(EncodeConstants.SIZE_OF_SHORT_IN_BYTES);
- actions.add(decodeAction(input, type));
- }
- return actions;
- }
-
- /**
- * Creates list of actions (OpenFlow v1.0) from ofp_action structures, which are not the last structure
- * in message
- * @param input input ByteBuf
- * @param actionsLength length of actions
- * @return ActionsList list of actions
- */
- public static List<Action> createActionsList(ByteBuf input, int actionsLength) {
- List<Action> actions = new ArrayList<>();
- int currentLength = 0;
- while (currentLength < actionsLength) {
- int type = input.readUnsignedShort();
- currentLength += input.readUnsignedShort();
- actions.add(decodeAction(input, type));
- }
- return actions;
- }
-
- private static Action decodeAction(ByteBuf input, int type) {
+ @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) {
actionsList = createEnqueueAction(input, actionsBuilder);
break;
case 0xFFFF:
- actionsList = createExperimenterAction(input, actionsBuilder);
+ OFDeserializer<ExperimenterAction> expDeserializer = registry.getDeserializer(
+ new MessageCodeKey(EncodeConstants.OF10_VERSION_ID, 0xFFFF, ExperimenterAction.class));
+ expDeserializer.deserialize(input);
break;
default:
break;
return builder.build();
}
- private static Action createExperimenterAction(ByteBuf input, ActionBuilder builder) {
- builder.setType(Experimenter.class);
- ExperimenterActionBuilder expBuilder = new ExperimenterActionBuilder();
- expBuilder.setExperimenter(input.readUnsignedInt());
- builder.addAugmentation(ExperimenterAction.class, expBuilder.build());
- return builder.build();
+ @Override
+ public void injectDeserializerRegistry(DeserializerRegistry deserializerRegistry) {
+ registry = deserializerRegistry;
}
-
}