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.SerializerRegistry;
import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistryInjector;
-import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey;
+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.rev131002.ActionRelatedTableFeatureProperty;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterMatchEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterIdMultipartRequest;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterIdTableFeatureProperty;
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.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.ExperimenterClass;
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.protocol.rev130731.MultipartRequestInput;
public class MultipartRequestInputFactory implements OFSerializer<MultipartRequestInput>, 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;
private static final byte WRITE_SETFIELD_MISS_CODE = 13;
private static final byte APPLY_SETFIELD_CODE = 14;
private static final byte APPLY_SETFIELD_MISS_CODE = 15;
- private static final byte STRUCTURE_HEADER_LENGTH = 4;
private static final byte PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_01 = 3;
private static final byte PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_02 = 4;
private static final byte PADDING_IN_MULTIPART_REQUEST_AGREGGATE_BODY_01 = 3;
ByteBufUtils.writeOFHeader(MESSAGE_TYPE, message, outBuffer, EncodeConstants.EMPTY_LENGTH);
outBuffer.writeShort(message.getType().getIntValue());
outBuffer.writeShort(createMultipartRequestFlagsBitmask(message.getFlags()));
- ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_MESSAGE, outBuffer);
+ outBuffer.writeZero(PADDING_IN_MULTIPART_REQUEST_MESSAGE);
if (message.getMultipartRequestBody() instanceof MultipartRequestDescCase){
- serializeDescBody(message.getMultipartRequestBody(), outBuffer);
+ serializeDescBody();
} else if (message.getMultipartRequestBody() instanceof MultipartRequestFlowCase) {
serializeFlowBody(message.getMultipartRequestBody(), outBuffer);
} else if (message.getMultipartRequestBody() instanceof MultipartRequestAggregateCase) {
serializeAggregateBody(message.getMultipartRequestBody(), outBuffer);
} else if (message.getMultipartRequestBody() instanceof MultipartRequestTableCase) {
- serializeTableBody(message.getMultipartRequestBody(), outBuffer);
+ serializeTableBody();
} else if (message.getMultipartRequestBody() instanceof MultipartRequestPortStatsCase) {
serializePortStatsBody(message.getMultipartRequestBody(), outBuffer);
} else if (message.getMultipartRequestBody() instanceof MultipartRequestQueueCase) {
} else if (message.getMultipartRequestBody() instanceof MultipartRequestGroupCase) {
serializeeGroupStatsBody(message.getMultipartRequestBody(), outBuffer);
} else if (message.getMultipartRequestBody() instanceof MultipartRequestGroupDescCase) {
- serializeGroupDescBody(message.getMultipartRequestBody(), outBuffer);
+ serializeGroupDescBody();
} else if (message.getMultipartRequestBody() instanceof MultipartRequestGroupFeaturesCase) {
- serializeGroupFeaturesBody(message.getMultipartRequestBody(), outBuffer);
+ serializeGroupFeaturesBody();
} else if (message.getMultipartRequestBody() instanceof MultipartRequestMeterCase) {
serializeMeterBody(message.getMultipartRequestBody(), outBuffer);
} else if (message.getMultipartRequestBody() instanceof MultipartRequestMeterConfigCase) {
serializeMeterConfigBody(message.getMultipartRequestBody(), outBuffer);
} else if (message.getMultipartRequestBody() instanceof MultipartRequestMeterFeaturesCase) {
- serializeMeterFeaturesBody(message.getMultipartRequestBody(), outBuffer);
+ serializeMeterFeaturesBody();
} else if (message.getMultipartRequestBody() instanceof MultipartRequestTableFeaturesCase) {
serializeTableFeaturesBody(message.getMultipartRequestBody(), outBuffer);
} else if (message.getMultipartRequestBody() instanceof MultipartRequestPortDescCase) {
- serializePortDescBody(message.getMultipartRequestBody(), outBuffer);
+ serializePortDescBody();
} else if (message.getMultipartRequestBody() instanceof MultipartRequestExperimenterCase) {
serializeExperimenterBody(message, 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);
+ long expId = experimenter.getAugmentation(ExperimenterIdMultipartRequest.class).getExperimenter().getValue();
+ OFSerializer<MultipartRequestExperimenterCase> serializer = registry.getSerializer(
+ ExperimenterSerializerKeyFactory.createMultipartRequestSerializerKey(
+ EncodeConstants.OF13_VERSION_ID, expId));
+ serializer.serialize(expCase, outBuffer);
}
private static int createMultipartRequestFlagsBitmask(final MultipartRequestFlags flags) {
* @param multipartRequestBody
* @param output
*/
- private void serializeDescBody(final MultipartRequestBody multipartRequestBody,
- final ByteBuf output) {
+ private void serializeDescBody() {
// The body of MultiPartRequestDesc is empty
}
* @param multipartRequestBody
* @param out
*/
- private void serializeTableBody(final MultipartRequestBody multipartRequestBody,
- final ByteBuf out) {
+ private void serializeTableBody() {
// The body of MultiPartTable is empty
}
* @param multipartRequestBody
* @param out
*/
- private void serializeGroupDescBody(final MultipartRequestBody multipartRequestBody,
- final ByteBuf out) {
+ private void serializeGroupDescBody() {
// The body of MultiPartRequestGroupDesc is empty
}
* @param multipartRequestBody
* @param out
*/
- private void serializeGroupFeaturesBody(
- final MultipartRequestBody multipartRequestBody, final ByteBuf out) {
+ private void serializeGroupFeaturesBody() {
// The body of MultiPartRequestGroupFeatures is empty
}
* @param multipartRequestBody
* @param out
*/
- private void serializeMeterFeaturesBody(
- final MultipartRequestBody multipartRequestBody, final ByteBuf out) {
+ private void serializeMeterFeaturesBody() {
// The body of MultiPartMeterFeatures is empty
}
* @param multipartRequestBody
* @param out
*/
- private void serializePortDescBody(final MultipartRequestBody multipartRequestBody,
- final ByteBuf out) {
+ private void serializePortDescBody() {
// The body of MultiPartPortDesc is empty
}
MultipartRequestFlowCase flowCase = (MultipartRequestFlowCase) multipartRequestBody;
MultipartRequestFlow flow = flowCase.getMultipartRequestFlow();
output.writeByte(flow.getTableId().byteValue());
- ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_01, output);
+ output.writeZero(PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_01);
output.writeInt(flow.getOutPort().intValue());
output.writeInt(flow.getOutGroup().intValue());
- ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_02, output);
+ output.writeZero(PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_02);
output.writeLong(flow.getCookie().longValue());
output.writeLong(flow.getCookieMask().longValue());
OFSerializer<Match> serializer = registry.getSerializer(new MessageTypeKey<>(
MultipartRequestAggregateCase aggregateCase = (MultipartRequestAggregateCase) multipartRequestBody;
MultipartRequestAggregate aggregate = aggregateCase.getMultipartRequestAggregate();
output.writeByte(aggregate.getTableId().byteValue());
- ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_AGREGGATE_BODY_01, output);
+ output.writeZero(PADDING_IN_MULTIPART_REQUEST_AGREGGATE_BODY_01);
output.writeInt(aggregate.getOutPort().intValue());
output.writeInt(aggregate.getOutGroup().intValue());
- ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_AGREGGATE_BODY_02, output);
+ output.writeZero(PADDING_IN_MULTIPART_REQUEST_AGREGGATE_BODY_02);
output.writeLong(aggregate.getCookie().longValue());
output.writeLong(aggregate.getCookieMask().longValue());
OFSerializer<Match> serializer = registry.getSerializer(new MessageTypeKey<>(
MultipartRequestPortStatsCase portstatsCase = (MultipartRequestPortStatsCase) multipartRequestBody;
MultipartRequestPortStats portstats = portstatsCase.getMultipartRequestPortStats();
output.writeInt(portstats.getPortNo().intValue());
- ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_PORTSTATS_BODY, output);
+ output.writeZero(PADDING_IN_MULTIPART_REQUEST_PORTSTATS_BODY);
}
private static void serializeQueueBody(final MultipartRequestBody multipartRequestBody, final ByteBuf output) {
MultipartRequestGroupCase groupStatsCase = (MultipartRequestGroupCase) multipartRequestBody;
MultipartRequestGroup groupStats = groupStatsCase.getMultipartRequestGroup();
output.writeInt(groupStats.getGroupId().getValue().intValue());
- ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_GROUP_BODY, output);
+ output.writeZero(PADDING_IN_MULTIPART_REQUEST_GROUP_BODY);
}
private static void serializeMeterBody(final MultipartRequestBody multipartRequestBody, final ByteBuf output) {
MultipartRequestMeterCase meterCase = (MultipartRequestMeterCase) multipartRequestBody;
MultipartRequestMeter meter = meterCase.getMultipartRequestMeter();
output.writeInt(meter.getMeterId().getValue().intValue());
- ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_METER_BODY, output);
+ output.writeZero(PADDING_IN_MULTIPART_REQUEST_METER_BODY);
}
private static void serializeMeterConfigBody(final MultipartRequestBody multipartRequestBody, final ByteBuf output) {
MultipartRequestMeterConfigCase meterConfigCase = (MultipartRequestMeterConfigCase) multipartRequestBody;
MultipartRequestMeterConfig meterConfig = meterConfigCase.getMultipartRequestMeterConfig();
output.writeInt(meterConfig.getMeterId().getValue().intValue());
- ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_METER_CONFIG_BODY, output);
+ output.writeZero(PADDING_IN_MULTIPART_REQUEST_METER_CONFIG_BODY);
}
private void serializeTableFeaturesBody(final MultipartRequestBody multipartRequestBody, final ByteBuf output) {
int tableFeatureLengthIndex = output.writerIndex();
output.writeShort(EncodeConstants.EMPTY_LENGTH);
output.writeByte(currTableFeature.getTableId());
- ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_TABLE_FEATURES_BODY, output);
+ output.writeZero(PADDING_IN_MULTIPART_REQUEST_TABLE_FEATURES_BODY);
output.writeBytes(currTableFeature.getName().getBytes());
- ByteBufUtils.padBuffer((32 - currTableFeature.getName().getBytes().length), output);
+ output.writeZero(32 - currTableFeature.getName().getBytes().length);
output.writeLong(currTableFeature.getMetadataMatch().longValue());
output.writeLong(currTableFeature.getMetadataWrite().longValue());
output.writeInt(createTableConfigBitmask(currTableFeature.getConfig()));
private void writeInstructionRelatedTableProperty(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<Instruction> 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);
TypeKeyMaker<Instruction> keyMaker = TypeKeyMakerFactory
.createInstructionKeyMaker(EncodeConstants.OF13_VERSION_ID);
ListSerializer.serializeHeaderList(instructions, keyMaker, registry, output);
- } else {
- padding = paddingNeeded(length);
- output.writeShort(length);
}
- ByteBufUtils.padBuffer(padding, output);
+ int length = output.writerIndex() - startIndex;
+ output.setShort(lengthIndex, length);
+ output.writeZero(paddingNeeded(length));
}
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> 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(final int length) {
private void writeActionsRelatedTableProperty(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<Action> 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);
TypeKeyMaker<Action> keyMaker = TypeKeyMakerFactory
.createActionKeyMaker(EncodeConstants.OF13_VERSION_ID);
ListSerializer.serializeHeaderList(actions, keyMaker, registry, output);
- } else {
- padding = paddingNeeded(length);
- output.writeShort(length);
}
- ByteBufUtils.padBuffer(padding, output);
+ int length = output.writerIndex() - startIndex;
+ output.setShort(lengthIndex, length);
+ output.writeZero(paddingNeeded(length));
}
private void writeOxmRelatedTableProperty(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<MatchEntries> entries = property.
getAugmentation(OxmRelatedTableFeatureProperty.class).getMatchEntries();
- int length = TABLE_FEAT_HEADER_LENGTH;
- int padding = 0;
if (entries != null) {
- // experimenter length / definition ?
- length += entries.size() * STRUCTURE_HEADER_LENGTH;
- padding = paddingNeeded(length);
- output.writeShort(length);
-
- for (MatchEntries entry : entries) {
- MatchEntrySerializerKey<?, ?> key = new MatchEntrySerializerKey<>(
- EncodeConstants.OF13_VERSION_ID, entry.getOxmClass(), entry.getOxmMatchField());
- if (entry.getOxmClass().equals(ExperimenterClass.class)) {
- key.setExperimenterId(entry.getAugmentation(ExperimenterMatchEntry.class).getExperimenter());
- } else {
- key.setExperimenterId(null);
- }
- HeaderSerializer<MatchEntries> entrySerializer = registry.getSerializer(key);
- entrySerializer.serializeHeader(entry, output);
- }
- } else {
- padding = paddingNeeded(length);
- output.writeShort(length);
+ TypeKeyMaker<MatchEntries> 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 void writeExperimenterRelatedTableProperty(final ByteBuf output,
final TableFeatureProperties property) {
- OFSerializer<TableFeatureProperties> serializer = registry.getSerializer(
- new MessageTypeKey<>(EncodeConstants.OF13_VERSION_ID, TableFeatureProperties.class));
- serializer.serialize(property, output);
+ long expId = property.getAugmentation(ExperimenterIdTableFeatureProperty.class).getExperimenter().getValue();
+ OFSerializer<TableFeatureProperties> serializer = registry.getSerializer(
+ ExperimenterSerializerKeyFactory.createMultipartRequestTFSerializerKey(
+ EncodeConstants.OF13_VERSION_ID, expId));
+ serializer.serialize(property, output);
}
private static int createTableConfigBitmask(final TableConfig tableConfig) {