X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflow-protocol-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowjava%2Fprotocol%2Fimpl%2Fserialization%2Ffactories%2FMultipartRequestInputFactory.java;h=b374bef5cf257e231c1819878aaff6d253bebf06;hb=29a2a074c78708f6d18583779ece96bb6573f0c6;hp=6edd6fa4b7266f19146fbf91e9e4355bf94869ec;hpb=79dba1331fc464a3fc6da4623d8ac1807152db4b;p=openflowjava.git diff --git a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/MultipartRequestInputFactory.java b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/MultipartRequestInputFactory.java index 6edd6fa4..b374bef5 100644 --- a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/MultipartRequestInputFactory.java +++ b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/MultipartRequestInputFactory.java @@ -10,37 +10,37 @@ package org.opendaylight.openflowjava.protocol.impl.serialization.factories; import io.netty.buffer.ByteBuf; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import org.opendaylight.openflowjava.protocol.api.extensibility.EnhancedMessageTypeKey; -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.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.augments.rev131002.ActionRelatedTableFeatureProperty; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterRelatedTableFeatureProperty; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.InstructionRelatedTableFeatureProperty; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NextTableRelatedTableFeatureProperty; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OxmRelatedTableFeatureProperty; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.table.features.properties.container.table.feature.properties.NextTableIds; +import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistryInjector; +import org.opendaylight.openflowjava.protocol.api.keys.MessageTypeKey; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.openflowjava.protocol.impl.util.ListSerializer; +import org.opendaylight.openflowjava.protocol.impl.util.TypeKeyMaker; +import org.opendaylight.openflowjava.protocol.impl.util.TypeKeyMakerFactory; +import org.opendaylight.openflowjava.util.ByteBufUtils; +import org.opendaylight.openflowjava.util.ExperimenterSerializerKeyFactory; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.ActionRelatedTableFeatureProperty; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.ExperimenterIdMultipartRequest; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.ExperimenterIdTableFeatureProperty; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.InstructionRelatedTableFeatureProperty; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.NextTableRelatedTableFeatureProperty; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.OxmRelatedTableFeatureProperty; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.table.features.properties.container.table.feature.properties.NextTableIds; 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.Experimenter; 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.MultipartRequestFlags; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableConfig; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableFeaturesPropType; -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.oxm.fields.grouping.MatchEntries; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.MultipartRequestBody; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregateCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestDescCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenterCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlowCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupDescCase; @@ -54,6 +54,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableFeaturesCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.aggregate._case.MultipartRequestAggregate; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.experimenter._case.MultipartRequestExperimenter; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.flow._case.MultipartRequestFlow; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.group._case.MultipartRequestGroup; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter._case.MultipartRequestMeter; @@ -72,7 +73,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731 public class MultipartRequestInputFactory implements OFSerializer, SerializerRegistryInjector { private static final byte MESSAGE_TYPE = 18; private static final byte PADDING_IN_MULTIPART_REQUEST_MESSAGE = 4; - private static final byte TABLE_FEAT_HEADER_LENGTH = 4; private static final byte INSTRUCTIONS_CODE = 0; private static final byte INSTRUCTIONS_MISS_CODE = 1; private static final byte NEXT_TABLE_CODE = 2; @@ -87,9 +87,6 @@ public class MultipartRequestInputFactory implements OFSerializer multipartRequestFlagsMap = new HashMap<>(); - multipartRequestFlagsMap.put(0, flags.isOFPMPFREQMORE()); + private void serializeExperimenterBody(final MultipartRequestInput message, + final ByteBuf outBuffer) { + MultipartRequestExperimenterCase expCase = + (MultipartRequestExperimenterCase) message.getMultipartRequestBody(); + MultipartRequestExperimenter experimenter = expCase.getMultipartRequestExperimenter(); + long expId = experimenter.getAugmentation(ExperimenterIdMultipartRequest.class).getExperimenter().getValue(); + OFSerializer serializer = registry.getSerializer( + ExperimenterSerializerKeyFactory.createMultipartRequestSerializerKey( + EncodeConstants.OF13_VERSION_ID, expId)); + serializer.serialize(expCase, outBuffer); + } - multipartRequestFlagsBitmask = ByteBufUtils.fillBitMaskFromMap(multipartRequestFlagsMap); - return multipartRequestFlagsBitmask; + private static int createMultipartRequestFlagsBitmask(final MultipartRequestFlags flags) { + return ByteBufUtils.fillBitMask(0, flags.isOFPMPFREQMORE()); } /** * @param multipartRequestBody * @param output */ - private void serializeDescBody(MultipartRequestBody multipartRequestBody, - ByteBuf output) { + private void serializeDescBody() { // The body of MultiPartRequestDesc is empty } @@ -162,8 +167,7 @@ public class MultipartRequestInputFactory implements OFSerializer serializer = registry.getSerializer(new MessageTypeKey<>( @@ -218,14 +218,14 @@ public class MultipartRequestInputFactory implements OFSerializer serializer = registry.getSerializer(new MessageTypeKey<>( @@ -233,42 +233,42 @@ public class MultipartRequestInputFactory implements OFSerializer props) { + private void writeTableFeatureProperties(final ByteBuf output, final List props) { if (props != null) { for (TableFeatureProperties property : props) { TableFeaturesPropType type = property.getType(); @@ -324,63 +324,51 @@ public class MultipartRequestInputFactory implements OFSerializer instructions = property. getAugmentation(InstructionRelatedTableFeatureProperty.class).getInstruction(); - int length = TABLE_FEAT_HEADER_LENGTH; - int padding = 0; if (instructions != null) { - for (Instruction instruction : instructions) { - if (instruction.getType().isAssignableFrom(Experimenter.class)) { - length += EncodeConstants.EXPERIMENTER_IDS_LENGTH; - } else { - length += STRUCTURE_HEADER_LENGTH; - } - } - padding = paddingNeeded(length); - output.writeShort(length); - HeaderSerializer instructionSerializer = registry.getSerializer( - new MessageTypeKey<>(EncodeConstants.OF13_VERSION_ID, Instruction.class)); - CodingUtils.serializeHeaders(instructions, instructionSerializer, output); - } else { - padding = paddingNeeded(length); - output.writeShort(length); + TypeKeyMaker keyMaker = TypeKeyMakerFactory + .createInstructionKeyMaker(EncodeConstants.OF13_VERSION_ID); + ListSerializer.serializeHeaderList(instructions, keyMaker, registry, output); } - ByteBufUtils.padBuffer(padding, output); + int length = output.writerIndex() - startIndex; + output.setShort(lengthIndex, length); + output.writeZero(paddingNeeded(length)); } - private static void writeNextTableRelatedTableProperty(ByteBuf output, - TableFeatureProperties property, byte code) { + private static void writeNextTableRelatedTableProperty(final ByteBuf output, + final TableFeatureProperties property, final byte code) { + int startIndex = output.writerIndex(); output.writeShort(code); + int lengthIndex = output.writerIndex(); + output.writeShort(EncodeConstants.EMPTY_LENGTH); List nextTableIds = property. getAugmentation(NextTableRelatedTableFeatureProperty.class).getNextTableIds(); - int length = TABLE_FEAT_HEADER_LENGTH; - int padding = 0; if (nextTableIds != null) { - length += nextTableIds.size(); - padding = paddingNeeded(length); - output.writeShort(length); for (NextTableIds next : nextTableIds) { output.writeByte(next.getTableId()); } - } else { - padding = paddingNeeded(length); - output.writeShort(length + padding); } - ByteBufUtils.padBuffer(padding, output); + int length = output.writerIndex() - startIndex; + output.setShort(lengthIndex, length); + output.writeZero(paddingNeeded(length)); } - private static int paddingNeeded(int length) { + private static int paddingNeeded(final int length) { int paddingRemainder = length % EncodeConstants.PADDING; int result = 0; if (paddingRemainder != 0) { @@ -389,94 +377,57 @@ public class MultipartRequestInputFactory implements OFSerializer actions = property. getAugmentation(ActionRelatedTableFeatureProperty.class).getAction(); - int length = TABLE_FEAT_HEADER_LENGTH; - int padding = 0; if (actions != null) { - for (Action action : actions) { - if (action.getType().isAssignableFrom(Experimenter.class)) { - length += EncodeConstants.EXPERIMENTER_IDS_LENGTH; - } else { - length += STRUCTURE_HEADER_LENGTH; - } - } - length += actions.size() * STRUCTURE_HEADER_LENGTH; - padding += paddingNeeded(length); - output.writeShort(length); - HeaderSerializer actionSerializer = registry.getSerializer( - new MessageTypeKey<>(EncodeConstants.OF13_VERSION_ID, Action.class)); - CodingUtils.serializeHeaders(actions, actionSerializer, output); - } else { - padding = paddingNeeded(length); - output.writeShort(length); + TypeKeyMaker keyMaker = TypeKeyMakerFactory + .createActionKeyMaker(EncodeConstants.OF13_VERSION_ID); + ListSerializer.serializeHeaderList(actions, keyMaker, registry, output); } - ByteBufUtils.padBuffer(padding, output); + int length = output.writerIndex() - startIndex; + output.setShort(lengthIndex, length); + output.writeZero(paddingNeeded(length)); } - private void writeOxmRelatedTableProperty(ByteBuf output, - TableFeatureProperties property, byte code) { + private void writeOxmRelatedTableProperty(final ByteBuf output, + final TableFeatureProperties property, final byte code) { + int startIndex = output.writerIndex(); output.writeShort(code); - List entries = property. - getAugmentation(OxmRelatedTableFeatureProperty.class).getMatchEntries(); - int length = TABLE_FEAT_HEADER_LENGTH; - int padding = 0; + int lengthIndex = output.writerIndex(); + output.writeShort(EncodeConstants.EMPTY_LENGTH); + List entries = property. + getAugmentation(OxmRelatedTableFeatureProperty.class).getMatchEntry(); if (entries != null) { - // experimenter length / definition ? - length += entries.size() * STRUCTURE_HEADER_LENGTH; - padding = paddingNeeded(length); - output.writeShort(length); - - for (MatchEntries entry : entries) { - HeaderSerializer entrySerializer = registry.getSerializer( - new EnhancedMessageTypeKey<>(EncodeConstants.OF13_VERSION_ID, - entry.getOxmClass(), entry.getOxmMatchField())); - entrySerializer.serializeHeader(entry, output); - } - } else { - padding = paddingNeeded(length); - output.writeShort(length); + TypeKeyMaker keyMaker = TypeKeyMakerFactory + .createMatchEntriesKeyMaker(EncodeConstants.OF13_VERSION_ID); + ListSerializer.serializeHeaderList(entries, keyMaker, registry, output); } - ByteBufUtils.padBuffer(padding, output); + int length = output.writerIndex() - startIndex; + output.setShort(lengthIndex, length); + output.writeZero(paddingNeeded(length)); } - private static void writeExperimenterRelatedTableProperty(ByteBuf output, - TableFeatureProperties property, int code) { - output.writeShort(code); - ExperimenterRelatedTableFeatureProperty exp = property. - getAugmentation(ExperimenterRelatedTableFeatureProperty.class); - byte[] data = exp.getData(); - int length = TABLE_FEAT_HEADER_LENGTH + 2 * (EncodeConstants.SIZE_OF_INT_IN_BYTES); - int padding = 0; - if (data != null) { - output.writeShort(length + data.length); - padding = paddingNeeded(length + data.length); - output.writeInt(exp.getExperimenter().intValue()); - output.writeInt(exp.getExpType().intValue()); - output.writeBytes(data); - } else { - output.writeShort(length); - padding = paddingNeeded(length); - output.writeInt(exp.getExperimenter().intValue()); - output.writeInt(exp.getExpType().intValue()); - } - ByteBufUtils.padBuffer(padding, output); + private void writeExperimenterRelatedTableProperty(final ByteBuf output, + final TableFeatureProperties property) { + long expId = property.getAugmentation(ExperimenterIdTableFeatureProperty.class).getExperimenter().getValue(); + OFSerializer serializer = registry.getSerializer( + ExperimenterSerializerKeyFactory.createMultipartRequestTFSerializerKey( + EncodeConstants.OF13_VERSION_ID, expId)); + serializer.serialize(property, output); } - private static int createTableConfigBitmask(TableConfig tableConfig) { - int tableConfigBitmask = 0; - Map tableConfigMap = new HashMap<>(); - tableConfigMap.put(3, tableConfig.isOFPTCDEPRECATEDMASK()); - - tableConfigBitmask = ByteBufUtils.fillBitMaskFromMap(tableConfigMap); - return tableConfigBitmask; + private static int createTableConfigBitmask(final TableConfig tableConfig) { + return ByteBufUtils.fillBitMask(3, tableConfig.isOFPTCDEPRECATEDMASK()); } @Override - public void injectSerializerRegistry(SerializerRegistry serializerRegistry) { + public void injectSerializerRegistry(final SerializerRegistry serializerRegistry) { this.registry = serializerRegistry; } }