- updated initialization of default Action and Instruction experimenter serializers
- CodingUtils replaced by ListSerializer
- added EnhancedTypeKeyMaker classes to create lookup keys
- added InstructionConstants
- updated unit tests
Signed-off-by: Michal Polkorab <michal.polkorab@pantheon.sk>
Change-Id: If27b8273aadc84ec93e90fbb08326cf7baeb3645
import org.opendaylight.openflowjava.protocol.impl.serialization.action.OF13SetMplsTtlActionSerializer;\r
import org.opendaylight.openflowjava.protocol.impl.serialization.action.OF13SetNwTtlActionSerializer;\r
import org.opendaylight.openflowjava.protocol.impl.serialization.action.OF13SetQueueActionSerializer;\r
-import org.opendaylight.openflowjava.protocol.impl.serialization.experimenters.OF10VendorActionSerializer;\r
-import org.opendaylight.openflowjava.protocol.impl.serialization.experimenters.OF13ExperimenterActionSerializer;\r
import org.opendaylight.openflowjava.protocol.impl.util.EncodeConstants;\r
import org.opendaylight.openflowjava.protocol.impl.util.EnhancedKeyRegistryHelper;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlIn;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecMplsTtl;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecNwTtl;\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.Experimenter;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Group;\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.PopMpls;\r
helper.registerSerializer(SetTpSrc.class, new OF10SetTpSrcActionSerializer());\r
helper.registerSerializer(SetTpDst.class, new OF10SetTpDstActionSerializer());\r
helper.registerSerializer(Enqueue.class, new OF10EnqueueActionSerializer());\r
- helper.registerSerializer(Experimenter.class, new OF10VendorActionSerializer());\r
// register OF v1.0 action serializers\r
helper = new EnhancedKeyRegistryHelper<>(\r
EncodeConstants.OF13_VERSION_ID, actionClass, serializerRegistry);\r
helper.registerSerializer(SetField.class, new OF13SetFieldActionSerializer());\r
helper.registerSerializer(PushPbb.class, new OF13PushPbbActionSerializer());\r
helper.registerSerializer(PopPbb.class, new OF13PopPbbActionSerializer());\r
- helper.registerSerializer(Experimenter.class, new OF13ExperimenterActionSerializer());\r
}\r
}\r
\r
import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;\r
import org.opendaylight.openflowjava.protocol.impl.serialization.experimenters.OF10StatsRequestVendorSerializer;\r
-import org.opendaylight.openflowjava.protocol.impl.serialization.experimenters.OF10VendorActionSerializer;\r
import org.opendaylight.openflowjava.protocol.impl.serialization.experimenters.OF10VendorInputMessageFactory;\r
import org.opendaylight.openflowjava.protocol.impl.serialization.experimenters.OF13ExperimenterActionSerializer;\r
import org.opendaylight.openflowjava.protocol.impl.serialization.experimenters.OF13ExperimenterInputMessageFactory;\r
import org.opendaylight.openflowjava.protocol.impl.serialization.experimenters.OF13TableFeatExpSerializer;\r
import org.opendaylight.openflowjava.protocol.impl.util.CommonMessageRegistryHelper;\r
import org.opendaylight.openflowjava.protocol.impl.util.EncodeConstants;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterAction;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterInstruction;\r
+import org.opendaylight.openflowjava.protocol.impl.util.EnhancedKeyRegistryHelper;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Experimenter;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.grouping.Instruction;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterInput;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.meter.band.experimenter._case.MeterBandExperimenter;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.experimenter._case.MultipartRequestExperimenter;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.table.features.properties.grouping.TableFeatureProperties;\r
\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
public class DefaultExperimenterInitializer {\r
\r
- /**\r
+ /**\r
* Registers message serializers into provided registry\r
* @param serializerRegistry registry to be initialized with message serializers\r
*/\r
short version = EncodeConstants.OF10_VERSION_ID;\r
CommonMessageRegistryHelper helper = new CommonMessageRegistryHelper(version, serializerRegistry);\r
helper.registerSerializer(ExperimenterInput.class, new OF10VendorInputMessageFactory());\r
- helper.registerSerializer(ExperimenterAction.class, new OF10VendorActionSerializer());\r
+ EnhancedKeyRegistryHelper<Action> actionHelper = new EnhancedKeyRegistryHelper<>(\r
+ EncodeConstants.OF10_VERSION_ID, Action.class, serializerRegistry);\r
+ actionHelper.registerSerializer(Experimenter.class, new OF13ExperimenterActionSerializer());\r
helper.registerSerializer(MultipartRequestExperimenter.class, new OF10StatsRequestVendorSerializer());\r
// register OF v1.3 default experimenter serializers\r
version = EncodeConstants.OF13_VERSION_ID;\r
helper = new CommonMessageRegistryHelper(version, serializerRegistry);\r
helper.registerSerializer(ExperimenterInput.class, new OF13ExperimenterInputMessageFactory());\r
- helper.registerSerializer(ExperimenterAction.class, new OF13ExperimenterActionSerializer());\r
- helper.registerSerializer(ExperimenterInstruction.class, new OF13ExperimenterInstructionSerializer());\r
helper.registerSerializer(MultipartRequestExperimenter.class, new OF13MultipartExperimenterSerializer());\r
helper.registerSerializer(TableFeatureProperties.class, new OF13TableFeatExpSerializer());\r
helper.registerSerializer(MeterBandExperimenter.class, new OF13MeterBandExperimenterSerializer());\r
+ actionHelper = new EnhancedKeyRegistryHelper<>(\r
+ EncodeConstants.OF13_VERSION_ID, Action.class, serializerRegistry);\r
+ actionHelper.registerSerializer(Experimenter.class, new OF13ExperimenterActionSerializer());\r
+ EnhancedKeyRegistryHelper<Instruction> insHelper = new EnhancedKeyRegistryHelper<>(\r
+ EncodeConstants.OF13_VERSION_ID, Instruction.class, serializerRegistry);\r
+ insHelper.registerSerializer(org.opendaylight.yang.gen.v1.urn.opendaylight\r
+ .openflow.common.instruction.rev130731.Experimenter.class,\r
+ new OF13ExperimenterInstructionSerializer());\r
}\r
}\r
import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;
import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistryInjector;
import org.opendaylight.openflowjava.protocol.impl.util.EncodeConstants;
+import org.opendaylight.openflowjava.protocol.impl.util.InstructionsInitializer;
import org.opendaylight.openflowjava.protocol.impl.util.OF10MatchSerializer;
-import org.opendaylight.openflowjava.protocol.impl.util.OF13InstructionsSerializer;
import org.opendaylight.openflowjava.protocol.impl.util.OF13MatchSerializer;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.grouping.Instruction;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.grouping.Match;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.v10.grouping.MatchV10;
// Openflow message type serializers
MessageFactoryInitializer.registerMessageSerializers(this);
- // common structure serializers
+ // match structure serializers
registerSerializer(new MessageTypeKey<>(OF10, MatchV10.class), new OF10MatchSerializer());
registerSerializer(new MessageTypeKey<>(OF13, Match.class), new OF13MatchSerializer());
- registerSerializer(new MessageTypeKey<>(OF13, Instruction.class), new OF13InstructionsSerializer());
// match entry serializers
MatchEntriesInitializer.registerMatchEntrySerializers(this);
// action serializers
ActionsInitializer.registerActionSerializers(this);
-
+ // instruction serializers
+ InstructionsInitializer.registerInstructionSerializers(this);
// default vendor / experimenter serializers
DefaultExperimenterInitializer.registerDefaultExperimenterSerializers(this);
}
\r
import io.netty.buffer.ByteBuf;\r
\r
+import org.opendaylight.openflowjava.protocol.api.extensibility.HeaderSerializer;\r
import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;\r
+import org.opendaylight.openflowjava.protocol.impl.util.EncodeConstants;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterInstruction;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.grouping.Instruction;\r
\r
-public class OF13ExperimenterInstructionSerializer \r
- implements OFSerializer<ExperimenterInstruction> {\r
+/**\r
+ * \r
+ * @author michal.polkorab\r
+ */\r
+public class OF13ExperimenterInstructionSerializer implements OFSerializer<Instruction>,\r
+ HeaderSerializer<Instruction>{\r
+\r
+ @Override\r
+ public void serializeHeader(Instruction instruction, ByteBuf outBuffer) {\r
+ outBuffer.writeShort(EncodeConstants.EXPERIMENTER_VALUE);\r
+ outBuffer.writeShort(EncodeConstants.EXPERIMENTER_IDS_LENGTH);\r
+ outBuffer.writeInt(instruction\r
+ .getAugmentation(ExperimenterInstruction.class).getExperimenter().intValue());\r
+ }\r
\r
- @Override\r
- public void serialize(ExperimenterInstruction input, ByteBuf outBuffer) {\r
- if (input.getData() != null) {\r
- outBuffer.writeBytes(input.getData());\r
- }\r
- }\r
+ @Override\r
+ public void serialize(Instruction instruction, ByteBuf outBuffer) {\r
+ int startIndex = outBuffer.writerIndex();\r
+ outBuffer.writeShort(EncodeConstants.EXPERIMENTER_VALUE);\r
+ int lengthIndex = outBuffer.writerIndex();\r
+ outBuffer.writeShort(EncodeConstants.EMPTY_LENGTH);\r
+ ExperimenterInstruction experimenter =\r
+ instruction.getAugmentation(ExperimenterInstruction.class);\r
+ outBuffer.writeInt(experimenter.getExperimenter().intValue());\r
+ if (experimenter.getData() != null) {\r
+ outBuffer.writeBytes(experimenter.getData());\r
+ }\r
+ outBuffer.setShort(lengthIndex, outBuffer.writerIndex() - startIndex);\r
+ }\r
\r
}\r
import org.opendaylight.openflowjava.protocol.api.extensibility.MessageTypeKey;
import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;
-import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistryInjector;
import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;
+import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistryInjector;
import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils;
-import org.opendaylight.openflowjava.protocol.impl.util.CodingUtils;
import org.opendaylight.openflowjava.protocol.impl.util.EncodeConstants;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.grouping.Instruction;
+import org.opendaylight.openflowjava.protocol.impl.util.EnhancedTypeKeyMakerFactory;
+import org.opendaylight.openflowjava.protocol.impl.util.ListSerializer;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFlags;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.grouping.Match;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInput;
ByteBufUtils.padBuffer(PADDING_IN_FLOW_MOD_MESSAGE, outBuffer);
registry.<Match, OFSerializer<Match>>getSerializer(new MessageTypeKey<>(message.getVersion(), Match.class))
.serialize(message.getMatch(), outBuffer);
- OFSerializer<Instruction> instructionSerializer =
- registry.getSerializer(new MessageTypeKey<>(message.getVersion(), Instruction.class));
- CodingUtils.serializeList(message.getInstruction(), instructionSerializer, outBuffer);
+ ListSerializer.serializeList(message.getInstruction(), EnhancedTypeKeyMakerFactory
+ .createInstructionKeyBuilder(EncodeConstants.OF13_VERSION_ID), registry, outBuffer);
ByteBufUtils.updateOFHeaderLength(outBuffer);
}
import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;
import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistryInjector;
import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils;
-import org.opendaylight.openflowjava.protocol.impl.util.CodingUtils;
import org.opendaylight.openflowjava.protocol.impl.util.EncodeConstants;
+import org.opendaylight.openflowjava.protocol.impl.util.EnhancedTypeKeyMakerFactory;
+import org.opendaylight.openflowjava.protocol.impl.util.ListSerializer;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.grouping.BucketsList;
outBuffer.writeInt(currentBucket.getWatchPort().getValue().intValue());
outBuffer.writeInt(currentBucket.getWatchGroup().intValue());
ByteBufUtils.padBuffer(PADDING_IN_BUCKET, outBuffer);
- CodingUtils.serializeActions(currentBucket.getAction(), registry,
- outBuffer, EncodeConstants.OF13_VERSION_ID);
+ ListSerializer.serializeList(currentBucket.getAction(), EnhancedTypeKeyMakerFactory
+ .createActionKeyBuilder(EncodeConstants.OF13_VERSION_ID), registry, outBuffer);
outBuffer.setShort(bucketLengthIndex, outBuffer.writerIndex() - bucketLengthIndex);
}
}
import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;
import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistryInjector;
import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils;
-import org.opendaylight.openflowjava.protocol.impl.util.CodingUtils;
import org.opendaylight.openflowjava.protocol.impl.util.EncodeConstants;
+import org.opendaylight.openflowjava.protocol.impl.util.EnhancedTypeKeyMaker;
+import org.opendaylight.openflowjava.protocol.impl.util.EnhancedTypeKeyMakerFactory;
+import org.opendaylight.openflowjava.protocol.impl.util.ListSerializer;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ActionRelatedTableFeatureProperty;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.InstructionRelatedTableFeatureProperty;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NextTableRelatedTableFeatureProperty;
ByteBufUtils.updateOFHeaderLength(outBuffer);
}
- private void serializeExperimenterBody(MultipartRequestInput message,
- ByteBuf outBuffer) {
- MultipartRequestExperimenterCase expCase =
- (MultipartRequestExperimenterCase) message.getMultipartRequestBody();
- MultipartRequestExperimenter experimenter = expCase.getMultipartRequestExperimenter();
- OFSerializer<MultipartRequestExperimenter> serializer = registry.getSerializer(
- new MessageTypeKey<>(EncodeConstants.OF13_VERSION_ID, MultipartRequestExperimenter.class));
- serializer.serialize(experimenter, outBuffer);
- }
+ private void serializeExperimenterBody(MultipartRequestInput message,
+ ByteBuf outBuffer) {
+ MultipartRequestExperimenterCase expCase =
+ (MultipartRequestExperimenterCase) message.getMultipartRequestBody();
+ MultipartRequestExperimenter experimenter = expCase.getMultipartRequestExperimenter();
+ OFSerializer<MultipartRequestExperimenter> serializer = registry.getSerializer(
+ new MessageTypeKey<>(EncodeConstants.OF13_VERSION_ID, MultipartRequestExperimenter.class));
+ serializer.serialize(experimenter, outBuffer);
+ }
private static int createMultipartRequestFlagsBitmask(MultipartRequestFlags flags) {
int multipartRequestFlagsBitmask = 0;
}
padding = paddingNeeded(length);
output.writeShort(length);
- HeaderSerializer<Instruction> instructionSerializer = registry.getSerializer(
- new MessageTypeKey<>(EncodeConstants.OF13_VERSION_ID, Instruction.class));
- CodingUtils.serializeHeaders(instructions, instructionSerializer, output);
+ EnhancedTypeKeyMaker<Instruction> keyMaker = EnhancedTypeKeyMakerFactory
+ .createInstructionKeyBuilder(EncodeConstants.OF13_VERSION_ID);
+ ListSerializer.serializeHeaderList(instructions, keyMaker, registry, output);
} else {
padding = paddingNeeded(length);
output.writeShort(length);
length += actions.size() * STRUCTURE_HEADER_LENGTH;
padding += paddingNeeded(length);
output.writeShort(length);
- HeaderSerializer<Action> actionSerializer = registry.getSerializer(
- new MessageTypeKey<>(EncodeConstants.OF13_VERSION_ID, Action.class));
- CodingUtils.serializeHeaders(actions, actionSerializer, output);
+ EnhancedTypeKeyMaker<Action> keyMaker = EnhancedTypeKeyMakerFactory
+ .createActionKeyBuilder(EncodeConstants.OF13_VERSION_ID);
+ ListSerializer.serializeHeaderList(actions, keyMaker, registry, output);
} else {
padding = paddingNeeded(length);
output.writeShort(length);
import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;
import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistryInjector;
import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils;
-import org.opendaylight.openflowjava.protocol.impl.util.CodingUtils;
import org.opendaylight.openflowjava.protocol.impl.util.EncodeConstants;
+import org.opendaylight.openflowjava.protocol.impl.util.EnhancedTypeKeyMakerFactory;
+import org.opendaylight.openflowjava.protocol.impl.util.ListSerializer;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFlagsV10;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.v10.grouping.MatchV10;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInput;
outBuffer.writeInt(message.getBufferId().intValue());
outBuffer.writeShort(message.getOutPort().getValue().intValue());
outBuffer.writeShort(createFlowModFlagsBitmask(message.getFlagsV10()));
- CodingUtils.serializeActions(message.getAction(), registry, outBuffer, EncodeConstants.OF10_VERSION_ID);
+ ListSerializer.serializeList(message.getAction(), EnhancedTypeKeyMakerFactory
+ .createActionKeyBuilder(EncodeConstants.OF10_VERSION_ID), registry, outBuffer);
ByteBufUtils.updateOFHeaderLength(outBuffer);
}
import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;
import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistryInjector;
import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils;
-import org.opendaylight.openflowjava.protocol.impl.util.CodingUtils;
import org.opendaylight.openflowjava.protocol.impl.util.EncodeConstants;
+import org.opendaylight.openflowjava.protocol.impl.util.EnhancedTypeKeyMakerFactory;
+import org.opendaylight.openflowjava.protocol.impl.util.ListSerializer;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInput;
/**
int actionsLengthIndex = outBuffer.writerIndex();
outBuffer.writeShort(EncodeConstants.EMPTY_LENGTH);
int actionsStartIndex = outBuffer.writerIndex();
- CodingUtils.serializeActions(message.getAction(), registry, outBuffer, EncodeConstants.OF10_VERSION_ID);
+ ListSerializer.serializeList(message.getAction(), EnhancedTypeKeyMakerFactory
+ .createActionKeyBuilder(EncodeConstants.OF10_VERSION_ID), registry, outBuffer);
outBuffer.setShort(actionsLengthIndex, outBuffer.writerIndex() - actionsStartIndex);
byte[] data = message.getData();
if (data != null) {
import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;
import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistryInjector;
import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils;
-import org.opendaylight.openflowjava.protocol.impl.util.CodingUtils;
import org.opendaylight.openflowjava.protocol.impl.util.EncodeConstants;
+import org.opendaylight.openflowjava.protocol.impl.util.EnhancedTypeKeyMakerFactory;
+import org.opendaylight.openflowjava.protocol.impl.util.ListSerializer;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInput;
/**
outBuffer.writeShort(EncodeConstants.EMPTY_LENGTH);
ByteBufUtils.padBuffer(PADDING_IN_PACKET_OUT_MESSAGE, outBuffer);
int actionsStartIndex = outBuffer.writerIndex();
- CodingUtils.serializeActions(message.getAction(), registry,
- outBuffer, EncodeConstants.OF13_VERSION_ID);
+ ListSerializer.serializeList(message.getAction(), EnhancedTypeKeyMakerFactory
+ .createActionKeyBuilder(EncodeConstants.OF13_VERSION_ID), registry, outBuffer);
outBuffer.setShort(actionsLengthIndex, outBuffer.writerIndex() - actionsStartIndex);
byte[] data = message.getData();
if (data != null) {
--- /dev/null
+/*\r
+ * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.openflowjava.protocol.impl.serialization.instruction;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import java.util.List;\r
+\r
+import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;\r
+import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistryInjector;\r
+import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils;\r
+import org.opendaylight.openflowjava.protocol.impl.util.EncodeConstants;\r
+import org.opendaylight.openflowjava.protocol.impl.util.EnhancedTypeKeyMakerFactory;\r
+import org.opendaylight.openflowjava.protocol.impl.util.InstructionConstants;\r
+import org.opendaylight.openflowjava.protocol.impl.util.ListSerializer;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ActionsInstruction;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.grouping.Instruction;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public abstract class AbstractActionInstructionSerializer extends AbstractInstructionSerializer\r
+ implements SerializerRegistryInjector {\r
+\r
+ private SerializerRegistry registry;\r
+\r
+ @Override\r
+ public void serialize(Instruction instruction, ByteBuf outBuffer) {\r
+ int startIndex = outBuffer.writerIndex();\r
+ outBuffer.writeShort(getType());\r
+ if (instruction.getAugmentation(ActionsInstruction.class) != null) {\r
+ List<Action> actions = instruction.getAugmentation(ActionsInstruction.class).getAction();\r
+ int lengthIndex = outBuffer.writerIndex();\r
+ outBuffer.writeShort(EncodeConstants.EMPTY_LENGTH);\r
+ ByteBufUtils.padBuffer(InstructionConstants.PADDING_IN_ACTIONS_INSTRUCTION, outBuffer);\r
+ ListSerializer.serializeList(actions, EnhancedTypeKeyMakerFactory\r
+ .createActionKeyBuilder(EncodeConstants.OF13_VERSION_ID), getRegistry(), outBuffer);\r
+ int instructionLength = outBuffer.writerIndex() - startIndex;\r
+ outBuffer.setShort(lengthIndex, instructionLength);\r
+ } else {\r
+ outBuffer.writeShort(InstructionConstants.STANDARD_INSTRUCTION_LENGTH);\r
+ ByteBufUtils.padBuffer(InstructionConstants.PADDING_IN_ACTIONS_INSTRUCTION, outBuffer);\r
+ }\r
+ }\r
+\r
+ protected SerializerRegistry getRegistry() {\r
+ return registry;\r
+ }\r
+\r
+ @Override\r
+ public void injectSerializerRegistry(SerializerRegistry serializerRegistry) {\r
+ registry = serializerRegistry;\r
+ }\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.openflowjava.protocol.impl.serialization.instruction;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import org.opendaylight.openflowjava.protocol.api.extensibility.HeaderSerializer;\r
+import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;\r
+import org.opendaylight.openflowjava.protocol.impl.util.InstructionConstants;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.grouping.Instruction;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public abstract class AbstractInstructionSerializer implements OFSerializer<Instruction>,\r
+ HeaderSerializer<Instruction> {\r
+\r
+ @Override\r
+ public void serializeHeader(Instruction input, ByteBuf outBuffer) {\r
+ outBuffer.writeShort(getType());\r
+ outBuffer.writeShort(InstructionConstants.INSTRUCTION_IDS_LENGTH);\r
+ }\r
+\r
+ /**\r
+ * @return numeric representation of action type\r
+ */\r
+ protected abstract int getType();\r
+\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.openflowjava.protocol.impl.serialization.instruction;\r
+\r
+import org.opendaylight.openflowjava.protocol.impl.util.InstructionConstants;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class ApplyActionsInstructionSerializer extends AbstractActionInstructionSerializer {\r
+\r
+ @Override\r
+ protected int getType() {\r
+ return InstructionConstants.APPLY_ACTIONS_TYPE;\r
+ }\r
+\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.openflowjava.protocol.impl.serialization.instruction;\r
+\r
+import org.opendaylight.openflowjava.protocol.impl.util.InstructionConstants;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class ClearActionsInstructionSerializer extends AbstractActionInstructionSerializer {\r
+\r
+ @Override\r
+ protected int getType() {\r
+ return InstructionConstants.CLEAR_ACTIONS_TYPE;\r
+ }\r
+\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.openflowjava.protocol.impl.serialization.instruction;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils;\r
+import org.opendaylight.openflowjava.protocol.impl.util.InstructionConstants;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.TableIdInstruction;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.grouping.Instruction;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class GoToTableInstructionSerializer extends AbstractInstructionSerializer {\r
+\r
+ @Override\r
+ public void serialize(Instruction instruction, ByteBuf outBuffer) {\r
+ outBuffer.writeShort(getType());\r
+ outBuffer.writeShort(InstructionConstants.STANDARD_INSTRUCTION_LENGTH);\r
+ outBuffer.writeByte(instruction.getAugmentation(TableIdInstruction.class).getTableId());\r
+ ByteBufUtils.padBuffer(InstructionConstants.PADDING_IN_GOTO_TABLE, outBuffer);\r
+ }\r
+\r
+ @Override\r
+ protected int getType() {\r
+ return InstructionConstants.GOTO_TABLE_TYPE;\r
+ }\r
+\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.openflowjava.protocol.impl.serialization.instruction;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import org.opendaylight.openflowjava.protocol.impl.util.InstructionConstants;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MeterIdInstruction;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.grouping.Instruction;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class MeterInstructionSerializer extends AbstractInstructionSerializer {\r
+\r
+ @Override\r
+ public void serialize(Instruction instruction, ByteBuf outBuffer) {\r
+ outBuffer.writeShort(getType());\r
+ outBuffer.writeShort(InstructionConstants.STANDARD_INSTRUCTION_LENGTH);\r
+ outBuffer.writeInt(instruction.\r
+ getAugmentation(MeterIdInstruction.class).getMeterId().intValue());\r
+ }\r
+\r
+ @Override\r
+ protected int getType() {\r
+ return InstructionConstants.METER_TYPE;\r
+ }\r
+\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.openflowjava.protocol.impl.serialization.instruction;\r
+\r
+import org.opendaylight.openflowjava.protocol.impl.util.InstructionConstants;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class WriteActionsInstructionSerializer extends AbstractActionInstructionSerializer {\r
+\r
+ @Override\r
+ protected int getType() {\r
+ return InstructionConstants.WRITE_ACTIONS_TYPE;\r
+ }\r
+\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.openflowjava.protocol.impl.serialization.instruction;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils;\r
+import org.opendaylight.openflowjava.protocol.impl.util.InstructionConstants;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MetadataInstruction;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.grouping.Instruction;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class WriteMetadataInstructionSerializer extends AbstractInstructionSerializer {\r
+\r
+ @Override\r
+ public void serialize(Instruction instruction, ByteBuf outBuffer) {\r
+ outBuffer.writeShort(getType());\r
+ outBuffer.writeShort(InstructionConstants.WRITE_METADATA_LENGTH);\r
+ ByteBufUtils.padBuffer(InstructionConstants.PADDING_IN_WRITE_METADATA, outBuffer);\r
+ MetadataInstruction metadata = instruction.getAugmentation(MetadataInstruction.class);\r
+ outBuffer.writeBytes(metadata.getMetadata());\r
+ outBuffer.writeBytes(metadata.getMetadataMask());\r
+ }\r
+\r
+ @Override\r
+ protected int getType() {\r
+ return InstructionConstants.WRITE_METADATA_TYPE;\r
+ }\r
+\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.openflowjava.protocol.impl.util;\r
+\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ * @param <T> type the key maker is based on \r
+ */\r
+public abstract class AbstractEnhancedTypeKeyMaker<T> implements EnhancedTypeKeyMaker<T> {\r
+\r
+ private short version;\r
+\r
+ /**\r
+ * @param version openflow wire version\r
+ */\r
+ public AbstractEnhancedTypeKeyMaker(short version) {\r
+ this.version = version;\r
+ \r
+ }\r
+\r
+ /**\r
+ * @return the version\r
+ */\r
+ public short getVersion() {\r
+ return version;\r
+ }\r
+\r
+}\r
+++ /dev/null
-/*\r
- * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.\r
- *\r
- * This program and the accompanying materials are made available under the\r
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
- * and is available at http://www.eclipse.org/legal/epl-v10.html\r
- */\r
-package org.opendaylight.openflowjava.protocol.impl.util;\r
-\r
-import io.netty.buffer.ByteBuf;\r
-\r
-import java.util.List;\r
-\r
-import org.opendaylight.openflowjava.protocol.api.extensibility.EnhancedMessageTypeKey;\r
-import org.opendaylight.openflowjava.protocol.api.extensibility.HeaderSerializer;\r
-import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;\r
-import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action;\r
-import org.opendaylight.yangtools.yang.binding.DataObject;\r
-\r
-/**\r
- * Class for common serialization & deserialization operations\r
- * @author michal.polkorab\r
- */\r
-public abstract class CodingUtils {\r
-\r
- /**\r
- * Serializes list\r
- * @param list list of items to be serialized\r
- * @param serializer serializer that can serialize list items\r
- * @param outBuffer output buffer\r
- */\r
- public static <T extends DataObject> void serializeList(List<T> list, OFSerializer<T> serializer, ByteBuf outBuffer){\r
- if (list != null) {\r
- for (T item : list) {\r
- serializer.serialize(item, outBuffer);\r
- }\r
- }\r
- }\r
-\r
- /**\r
- * Serializes action list\r
- * @param list actions to be serialized\r
- * @param outBuffer output buffer\r
- * @param version Openflow wire version\r
- * @param serializer serializer that can serialize \r
- */\r
- public static void serializeActions(List<Action> list,\r
- SerializerRegistry registry, ByteBuf outBuffer, short version){\r
- if (list != null) {\r
- for (Action action : list) {\r
- OFSerializer<Action> serializer = registry.getSerializer(\r
- new EnhancedMessageTypeKey<>(version,\r
- Action.class, action.getType()));\r
- serializer.serialize(action, outBuffer);\r
- }\r
- }\r
- }\r
-\r
- /**\r
- * Serializes header fields for all objects in a list\r
- * @param list list of items to be serialized\r
- * @param serializer serializer that can serialize list items\r
- * @param outBuffer output buffer\r
- */\r
- public static <T extends DataObject> void serializeHeaders(List<T> list, HeaderSerializer<T> serializer, ByteBuf outBuffer){\r
- if (list != null) {\r
- for (T item : list) {\r
- serializer.serializeHeader(item, outBuffer);\r
- }\r
- }\r
- }\r
-}\r
--- /dev/null
+/*\r
+ * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.openflowjava.protocol.impl.util;\r
+\r
+import org.opendaylight.openflowjava.protocol.api.extensibility.EnhancedMessageTypeKey;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ * @param <T> \r
+ */\r
+public interface EnhancedTypeKeyMaker<T> {\r
+\r
+ /**\r
+ * @param entry\r
+ * @return key that will be used for serializer lookup in \r
+ * the serializer registry\r
+ */\r
+ public abstract EnhancedMessageTypeKey<?,?> make(T entry);\r
+\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.openflowjava.protocol.impl.util;\r
+\r
+import org.opendaylight.openflowjava.protocol.api.extensibility.EnhancedMessageTypeKey;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.grouping.Instruction;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries;\r
+\r
+/**\r
+ * Creates KeyMakers\r
+ * @author michal.polkorab\r
+ */\r
+public abstract class EnhancedTypeKeyMakerFactory {\r
+\r
+ /**\r
+ * @param version openflow wire version that shall be used\r
+ * in lookup key\r
+ * @return lookup key\r
+ */\r
+ public static EnhancedTypeKeyMaker<MatchEntries> createMatchEntriesKeyBuilder(short version) {\r
+ return new AbstractEnhancedTypeKeyMaker<MatchEntries>(version) {\r
+ @Override\r
+ public EnhancedMessageTypeKey<?, ?> make(MatchEntries entry) {\r
+ return new EnhancedMessageTypeKey<>(\r
+ getVersion(), entry.getOxmClass(), entry.getOxmMatchField());\r
+ }\r
+ };\r
+ }\r
+\r
+ /**\r
+ * @param version openflow wire version that shall be used\r
+ * in lookup key\r
+ * @return lookup key\r
+ */\r
+ public static EnhancedTypeKeyMaker<Action> createActionKeyBuilder(short version) {\r
+ return new AbstractEnhancedTypeKeyMaker<Action>(version) {\r
+ @Override\r
+ public EnhancedMessageTypeKey<?, ?> make(Action entry) {\r
+ return new EnhancedMessageTypeKey<>(getVersion(), Action.class, entry.getType());\r
+ }\r
+ };\r
+ }\r
+\r
+ /**\r
+ * @param version openflow wire version that shall be used\r
+ * in lookup key\r
+ * @return lookup key\r
+ */\r
+ public static EnhancedTypeKeyMaker<Instruction> createInstructionKeyBuilder(short version) {\r
+ return new AbstractEnhancedTypeKeyMaker<Instruction>(version) {\r
+ @Override\r
+ public EnhancedMessageTypeKey<?, ?> make(Instruction entry) {\r
+ return new EnhancedMessageTypeKey<>(getVersion(), Instruction.class, entry.getType());\r
+ }\r
+ };\r
+ }\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.openflowjava.protocol.impl.util;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class InstructionConstants {\r
+\r
+ /** Openflow v1.3 OFPIT_GOTO_TABLE code */\r
+ public static final byte GOTO_TABLE_TYPE = 1;\r
+ /** Openflow v1.3 OFPIT_WRITE_METADATA code */\r
+ public static final byte WRITE_METADATA_TYPE = 2;\r
+ /** Openflow v1.3 OFPIT_WRITE_ACTIONS code */\r
+ public static final byte WRITE_ACTIONS_TYPE = 3;\r
+ /** Openflow v1.3 OFPIT_APPLY_ACTIONS code */\r
+ public static final byte APPLY_ACTIONS_TYPE = 4;\r
+ /** Openflow v1.3 OFPIT_CLEAR_ACTIONS code */\r
+ public static final byte CLEAR_ACTIONS_TYPE = 5;\r
+ /** Openflow v1.3 OFPIT_METER code */\r
+ public static final byte METER_TYPE = 6;\r
+\r
+ /** PADDING in OFPIT_GOTO_TABLE */\r
+ public static final byte PADDING_IN_GOTO_TABLE = 3;\r
+ /** PADDING in OFPIT_WRITE_METADATA */\r
+ public static final byte PADDING_IN_WRITE_METADATA = 4;\r
+ /** PADDING in OFPIT_WRITE_ACTIONS, OFPIT_APPLY_ACTIONS\r
+ * and OFPIT_CLEAR_ACTIONS */\r
+ public static final byte PADDING_IN_ACTIONS_INSTRUCTION = 4;\r
+\r
+ /** Openflow v1.3 header length (padded) */\r
+ public static final byte STANDARD_INSTRUCTION_LENGTH = 8;\r
+ /** Openflow v1.3 OFPIT_WRITE_METADATA length */\r
+ public static final byte WRITE_METADATA_LENGTH = 24;\r
+ /** Openflow v1.3 header length (only type and length fields) */\r
+ public static final byte INSTRUCTION_IDS_LENGTH = 4;\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.openflowjava.protocol.impl.util;\r
+\r
+import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;\r
+import org.opendaylight.openflowjava.protocol.impl.serialization.instruction.ApplyActionsInstructionSerializer;\r
+import org.opendaylight.openflowjava.protocol.impl.serialization.instruction.ClearActionsInstructionSerializer;\r
+import org.opendaylight.openflowjava.protocol.impl.serialization.instruction.GoToTableInstructionSerializer;\r
+import org.opendaylight.openflowjava.protocol.impl.serialization.instruction.MeterInstructionSerializer;\r
+import org.opendaylight.openflowjava.protocol.impl.serialization.instruction.WriteActionsInstructionSerializer;\r
+import org.opendaylight.openflowjava.protocol.impl.serialization.instruction.WriteMetadataInstructionSerializer;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.ApplyActions;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.ClearActions;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.GotoTable;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.Meter;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.WriteActions;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.WriteMetadata;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.grouping.Instruction;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class InstructionsInitializer {\r
+\r
+ /**\r
+ * Registers instruction serializers into provided registry\r
+ * @param serializerRegistry registry to be initialized with instruction serializers\r
+ */\r
+ public static void registerInstructionSerializers(SerializerRegistry serializerRegistry) {\r
+ Class<Instruction> instructionClass = Instruction.class;\r
+ // register OF v1.3 instruction serializers\r
+ EnhancedKeyRegistryHelper<Instruction> helper =\r
+ new EnhancedKeyRegistryHelper<>(EncodeConstants.OF13_VERSION_ID,\r
+ instructionClass, serializerRegistry);\r
+ helper.registerSerializer(GotoTable.class, new GoToTableInstructionSerializer());\r
+ helper.registerSerializer(WriteMetadata.class, new WriteMetadataInstructionSerializer());\r
+ helper.registerSerializer(WriteActions.class, new WriteActionsInstructionSerializer());\r
+ helper.registerSerializer(ApplyActions.class, new ApplyActionsInstructionSerializer());\r
+ helper.registerSerializer(ClearActions.class, new ClearActionsInstructionSerializer());\r
+ helper.registerSerializer(Meter.class, new MeterInstructionSerializer());\r
+ }\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.openflowjava.protocol.impl.util;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import java.util.List;\r
+\r
+import org.opendaylight.openflowjava.protocol.api.extensibility.HeaderSerializer;\r
+import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;\r
+import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;\r
+import org.opendaylight.yangtools.yang.binding.DataObject;\r
+\r
+/**\r
+ * Serializes list items and their headers\r
+ * @author michal.polkorab\r
+ * @param <E> \r
+ */\r
+public abstract class ListSerializer {\r
+\r
+ /**\r
+ * Serializes item list\r
+ * @param list list of items to be serialized\r
+ * @param keyMaker creates key for registry lookup\r
+ * @param registry stores serializers\r
+ * @param outBuffer output buffer\r
+ */\r
+ public static <E extends DataObject> void serializeList(List<E> list,\r
+ EnhancedTypeKeyMaker<E> keyMaker, SerializerRegistry registry, ByteBuf outBuffer) {\r
+ if (list != null) {\r
+ for (E item : list) {\r
+ OFSerializer<E> serializer = registry.getSerializer(keyMaker.make(item));\r
+ serializer.serialize(item, outBuffer);\r
+ }\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Serializes headers of items in list\r
+ * @param list list of items to be serialized\r
+ * @param keyMaker creates key for registry lookup\r
+ * @param registry stores serializers\r
+ * @param outBuffer output buffer\r
+ */\r
+ public static <E extends DataObject> void serializeHeaderList(List<E> list,\r
+ EnhancedTypeKeyMaker<E> keyMaker, SerializerRegistry registry, ByteBuf outBuffer) {\r
+ if (list != null) {\r
+ for (E item : list) {\r
+ HeaderSerializer<E> serializer = registry.getSerializer(keyMaker.make(item));\r
+ serializer.serializeHeader(item, outBuffer);\r
+ }\r
+ }\r
+ }\r
+\r
+}\r
+++ /dev/null
-/*
- * 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.List;
-
-import org.opendaylight.openflowjava.protocol.api.extensibility.HeaderSerializer;
-import org.opendaylight.openflowjava.protocol.api.extensibility.MessageTypeKey;
-import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;
-import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistryInjector;
-import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ActionsInstruction;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterInstruction;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MetadataInstruction;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MeterIdInstruction;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.TableIdInstruction;
-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.instruction.rev130731.ApplyActions;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.ClearActions;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.Experimenter;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.GotoTable;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.Meter;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.WriteActions;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.WriteMetadata;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.grouping.Instruction;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.InstructionBase;
-
-/**
- * Serializes ofp_instruction (OpenFlow v 1.3) structure
- * @author michal.polkorab
- * @author timotej.kubas
- */
-public class OF13InstructionsSerializer implements OFSerializer<Instruction>,
- HeaderSerializer<Instruction>, SerializerRegistryInjector {
-
- private static final byte GOTO_TABLE_TYPE = 1;
- private static final byte WRITE_METADATA_TYPE = 2;
- private static final byte WRITE_ACTIONS_TYPE = 3;
- private static final byte APPLY_ACTIONS_TYPE = 4;
- private static final byte CLEAR_ACTIONS_TYPE = 5;
- private static final byte METER_TYPE = 6;
- private static final byte GOTO_TABLE_LENGTH = 8;
- private static final byte WRITE_METADATA_LENGTH = 24;
- private static final byte METER_LENGTH = 8;
- private static final byte ACTIONS_INSTRUCTION_LENGTH = 8;
- private static final byte PADDING_IN_GOTO_TABLE = 3;
- private static final byte PADDING_IN_WRITE_METADATA = 4;
- private static final byte PADDING_IN_CLEAR_ACTIONS = 4;
- private static final byte INSTRUCTION_IDS_LENGTH = 4;
- private static final byte PADDING_IN_ACTIONS_INSTRUCTION = 4;
- private SerializerRegistry registry;
-
- private static void writeTypeAndLength(ByteBuf out, int type, int length) {
- out.writeShort(type);
- out.writeShort(length);
- }
-
- private void writeActionsInstruction(ByteBuf out,
- Instruction instruction, int type) {
- int instructionStartIndex = out.writerIndex();
- out.writeShort(type);
- if (instruction.getAugmentation(ActionsInstruction.class) != null) {
- List<Action> actions = instruction.getAugmentation(ActionsInstruction.class).getAction();
- int instructionLengthIndex = out.writerIndex();
- out.writeShort(EncodeConstants.EMPTY_LENGTH);
- ByteBufUtils.padBuffer(PADDING_IN_ACTIONS_INSTRUCTION, out);
- CodingUtils.serializeActions(actions, registry,
- out, EncodeConstants.OF13_VERSION_ID);
- int instructionLength = out.writerIndex() - instructionStartIndex;
- out.setShort(instructionLengthIndex, instructionLength);
- } else {
- out.writeShort(ACTIONS_INSTRUCTION_LENGTH);
- ByteBufUtils.padBuffer(PADDING_IN_ACTIONS_INSTRUCTION, out);
- }
- }
-
- @Override
- public void serialize(Instruction instruction, ByteBuf outBuffer) {
- Class<? extends InstructionBase> type = instruction.getType();
- if (type.isAssignableFrom(GotoTable.class)) {
- writeTypeAndLength(outBuffer, GOTO_TABLE_TYPE, GOTO_TABLE_LENGTH);
- outBuffer.writeByte(instruction.getAugmentation(TableIdInstruction.class).getTableId());
- ByteBufUtils.padBuffer(PADDING_IN_GOTO_TABLE, outBuffer);
- } else if (type.isAssignableFrom(WriteMetadata.class)) {
- writeTypeAndLength(outBuffer, WRITE_METADATA_TYPE, WRITE_METADATA_LENGTH);
- ByteBufUtils.padBuffer(PADDING_IN_WRITE_METADATA, outBuffer);
- MetadataInstruction metadata = instruction.getAugmentation(MetadataInstruction.class);
- outBuffer.writeBytes(metadata.getMetadata());
- outBuffer.writeBytes(metadata.getMetadataMask());
- } else if (type.isAssignableFrom(WriteActions.class)) {
- writeActionsInstruction(outBuffer, instruction, WRITE_ACTIONS_TYPE);
- } else if (type.isAssignableFrom(ApplyActions.class)) {
- writeActionsInstruction(outBuffer, instruction, APPLY_ACTIONS_TYPE);
- } else if (type.isAssignableFrom(ClearActions.class)) {
- writeTypeAndLength(outBuffer, CLEAR_ACTIONS_TYPE, ACTIONS_INSTRUCTION_LENGTH);
- ByteBufUtils.padBuffer(PADDING_IN_CLEAR_ACTIONS, outBuffer);
- } else if (type.isAssignableFrom(Meter.class)) {
- writeTypeAndLength(outBuffer, METER_TYPE, METER_LENGTH);
- outBuffer.writeInt(instruction.getAugmentation(MeterIdInstruction.class).getMeterId().intValue());
- } else if (type.isAssignableFrom(Experimenter.class)) {
- int startIndex = outBuffer.writerIndex();
- outBuffer.writeShort(EncodeConstants.EXPERIMENTER_VALUE);
- int lengthIndex = outBuffer.writerIndex();
- outBuffer.writeShort(EncodeConstants.EMPTY_LENGTH);
- ExperimenterInstruction expInstruction =
- instruction.getAugmentation(ExperimenterInstruction.class);
- outBuffer.writeInt(expInstruction.getExperimenter().intValue());
- OFSerializer<ExperimenterInstruction> serializer = registry.getSerializer(new MessageTypeKey<>(
- EncodeConstants.OF13_VERSION_ID, ExperimenterInstruction.class));
- serializer.serialize(expInstruction, outBuffer);
- outBuffer.setShort(lengthIndex, outBuffer.writerIndex() - startIndex);
- }
- }
-
- @Override
- public void injectSerializerRegistry(SerializerRegistry serializerRegistry) {
- this.registry = serializerRegistry;
- }
-
- @Override
- public void serializeHeader(Instruction instruction, ByteBuf outBuffer) {
- Class<? extends InstructionBase> type = instruction.getType();
- if (type.isAssignableFrom(GotoTable.class)) {
- writeTypeAndLength(outBuffer, GOTO_TABLE_TYPE, INSTRUCTION_IDS_LENGTH);
- } else if (type.isAssignableFrom(WriteMetadata.class)) {
- writeTypeAndLength(outBuffer, WRITE_METADATA_TYPE, INSTRUCTION_IDS_LENGTH);
- } else if (type.isAssignableFrom(WriteActions.class)) {
- writeTypeAndLength(outBuffer, WRITE_ACTIONS_TYPE, INSTRUCTION_IDS_LENGTH);
- } else if (type.isAssignableFrom(ApplyActions.class)) {
- writeTypeAndLength(outBuffer, APPLY_ACTIONS_TYPE, INSTRUCTION_IDS_LENGTH);
- } else if (type.isAssignableFrom(ClearActions.class)) {
- writeTypeAndLength(outBuffer, CLEAR_ACTIONS_TYPE, INSTRUCTION_IDS_LENGTH);
- } else if (type.isAssignableFrom(Meter.class)) {
- writeTypeAndLength(outBuffer, METER_TYPE, INSTRUCTION_IDS_LENGTH);
- } else if (type.isAssignableFrom(Experimenter.class)) {
- writeTypeAndLength(outBuffer, EncodeConstants.EXPERIMENTER_VALUE,
- EncodeConstants.EXPERIMENTER_IDS_LENGTH);
- ExperimenterInstruction experimenter =
- instruction.getAugmentation(ExperimenterInstruction.class);
- outBuffer.writeInt(experimenter.getExperimenter().intValue());
- }
- }
-
-}
public void startUp() {
registry = new SerializerRegistryImpl();
registry.init();
- flowModFactory = registry.getSerializer(
- new MessageTypeKey<>(EncodeConstants.OF13_VERSION_ID, FlowModInput.class));
+ flowModFactory = registry.getSerializer(new MessageTypeKey<>(
+ EncodeConstants.OF13_VERSION_ID, FlowModInput.class));
}
/**
actions.add(actionBuilder.build());\r
\r
ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
- CodingUtils.serializeActions(actions, registry, out, EncodeConstants.OF10_VERSION_ID);\r
+ ListSerializer.serializeList(actions, EnhancedTypeKeyMakerFactory\r
+ .createActionKeyBuilder(EncodeConstants.OF10_VERSION_ID), registry, out);\r
\r
Assert.assertEquals("Wrong action type", 0, out.readUnsignedShort());\r
Assert.assertEquals("Wrong action length", 8, out.readUnsignedShort());\r
actions.add(actionBuilder.build());\r
\r
ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
- CodingUtils.serializeActions(actions, registry, out, EncodeConstants.OF13_VERSION_ID);\r
+ ListSerializer.serializeList(actions, EnhancedTypeKeyMakerFactory\r
+ .createActionKeyBuilder(EncodeConstants.OF13_VERSION_ID), registry, out);\r
\r
Assert.assertEquals("Wrong action type", 0, out.readUnsignedShort());\r
Assert.assertEquals("Wrong action length", 16, out.readUnsignedShort());\r
import org.junit.Assert;\r
import org.junit.Before;\r
import org.junit.Test;\r
-import org.opendaylight.openflowjava.protocol.api.extensibility.MessageTypeKey;\r
-import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;\r
import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;\r
import org.opendaylight.openflowjava.protocol.impl.serialization.SerializerRegistryImpl;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ActionsInstruction;\r
public class OF13InstructionsSerializerTest {\r
\r
private SerializerRegistry registry;\r
- private OFSerializer<Instruction> instructionSerializer;\r
\r
/**\r
* Initializes serializer table and stores correct factory in field\r
public void startUp() {\r
registry = new SerializerRegistryImpl();\r
registry.init();\r
- instructionSerializer = registry.getSerializer(\r
- new MessageTypeKey<>(EncodeConstants.OF13_VERSION_ID, Instruction.class));\r
}\r
\r
/**\r
instructions.add(builder.build());\r
\r
ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
- CodingUtils.serializeList(instructions, instructionSerializer, out);\r
+ ListSerializer.serializeList(instructions, EnhancedTypeKeyMakerFactory\r
+ .createInstructionKeyBuilder(EncodeConstants.OF13_VERSION_ID), registry, out);\r
\r
Assert.assertEquals("Wrong instruction type", 1, out.readUnsignedShort());\r
Assert.assertEquals("Wrong instruction length", 8, out.readUnsignedShort());\r