import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey;\r
import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterActionDeserializerKey;\r
import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterDeserializerKey;\r
+import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterIdDeserializerKey;\r
import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterInstructionDeserializerKey;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterMessage;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessage;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenterCase;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.queue.property.header.QueueProperty;\r
\r
/**\r
* Provides methods for deserialization part of extensibility\r
*/\r
public void registerMatchEntryDeserializer(MatchEntryDeserializerKey key,\r
OFGeneralDeserializer deserializer);\r
-}\r
+\r
+ /**\r
+ * Registers error message deserializer\r
+ * @param key used for deserializer lookup\r
+ * @param deserializer deserializer instance\r
+ */\r
+ void registerErrorDeserializer(ExperimenterIdDeserializerKey key,\r
+ OFDeserializer<ErrorMessage> deserializer);\r
+\r
+ /**\r
+ * Registers experimenter (vendor) message deserializer\r
+ * @param key used for deserializer lookup\r
+ * @param deserializer deserializer instance\r
+ */\r
+ void registerExperimenterMessageDeserializer(ExperimenterIdDeserializerKey key,\r
+ OFDeserializer<ExperimenterMessage> deserializer);\r
+\r
+ /**\r
+ * Registers multipart-reply (stats) message deserializer\r
+ * @param key used for deserializer lookup\r
+ * @param deserializer deserializer instance\r
+ */\r
+ void registerMultipartReplyMessageDeserializer(ExperimenterIdDeserializerKey key,\r
+ OFDeserializer<MultipartReplyMessage> deserializer);\r
+\r
+ /**\r
+ * Registers multipart-reply table-features message deserializer\r
+ * @param key used for deserializer lookup\r
+ * @param deserializer deserializer instance\r
+ */\r
+ void registerMultipartReplyTFDeserializer(ExperimenterIdDeserializerKey key,\r
+ OFGeneralDeserializer deserializer);\r
+\r
+ /**\r
+ * Registers meter band deserializer (used in multipart-reply meter-config)\r
+ * @param key used for deserializer lookup\r
+ * @param deserializer deserializer instance\r
+ */\r
+ void registerMeterBandDeserializer(ExperimenterIdDeserializerKey key,\r
+ OFDeserializer<MeterBandExperimenterCase> deserializer);\r
+\r
+ /**\r
+ * Registers queue property (QUEUE_GET_CONFIG_REPLY message) deserializer\r
+ * @param key used for deserializer lookup\r
+ * @param deserializer deserializer instance\r
+ */\r
+ void registerQueuePropertyDeserializer(ExperimenterIdDeserializerKey key,\r
+ OFDeserializer<QueueProperty> deserializer);\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) 2014 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.api.keys.experimenter;\r
+\r
+import org.opendaylight.openflowjava.protocol.api.extensibility.MessageCodeKey;\r
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public final class ExperimenterIdDeserializerKey extends MessageCodeKey \r
+ implements ExperimenterDeserializerKey {\r
+\r
+ private Long experimenterId;\r
+\r
+ /**\r
+ * @param version protocol wire version\r
+ * @param experimenterId experimenter / vendor ID\r
+ * @param objectClass class of created object\r
+ */\r
+ public ExperimenterIdDeserializerKey(short version, Long experimenterId, Class<?> objectClass) {\r
+ super(version, EncodeConstants.EXPERIMENTER_VALUE, objectClass);\r
+ this.experimenterId = experimenterId;\r
+ }\r
+\r
+ \r
+ @Override\r
+ public int hashCode() {\r
+ final int prime = 31;\r
+ int result = super.hashCode();\r
+ result = prime * result + ((experimenterId == null) ? 0 : experimenterId.hashCode());\r
+ return result;\r
+ }\r
+\r
+ @Override\r
+ public boolean equals(Object obj) {\r
+ if (this == obj)\r
+ return true;\r
+ if (!super.equals(obj))\r
+ return false;\r
+ if (!(obj instanceof ExperimenterIdDeserializerKey))\r
+ return false;\r
+ ExperimenterIdDeserializerKey other = (ExperimenterIdDeserializerKey) obj;\r
+ if (experimenterId == null) {\r
+ if (other.experimenterId != null)\r
+ return false;\r
+ } else if (!experimenterId.equals(other.experimenterId))\r
+ return false;\r
+ return true;\r
+ }\r
+\r
+ @Override\r
+ public String toString() {\r
+ return super.toString() + " experimenterID: " + experimenterId;\r
+ }\r
+}
\ No newline at end of file
import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;
import org.opendaylight.openflowjava.protocol.api.extensibility.MessageCodeKey;
import org.opendaylight.openflowjava.protocol.api.extensibility.MessageTypeKey;
+import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
import org.opendaylight.openflowjava.protocol.api.extensibility.OFGeneralDeserializer;
import org.opendaylight.openflowjava.protocol.api.extensibility.OFGeneralSerializer;
import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;
import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterActionDeserializerKey;
import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterActionSerializerKey;
import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterDeserializerKey;
+import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterIdDeserializerKey;
import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterInstructionDeserializerKey;
import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterInstructionSerializerKey;
import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterSerializerKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.config.rev140630.TransportProtocol;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmClassBase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterMessage;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessage;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenterCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.queue.property.header.QueueProperty;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
OFGeneralDeserializer deserializer) {
deserializerRegistry.registerDeserializer(key, deserializer);
}
+
+ @Override
+ public void registerErrorDeserializer(ExperimenterIdDeserializerKey key,
+ OFDeserializer<ErrorMessage> deserializer) {
+ deserializerRegistry.registerDeserializer(key, deserializer);
+ }
+
+ @Override
+ public void registerExperimenterMessageDeserializer(ExperimenterIdDeserializerKey key,
+ OFDeserializer<ExperimenterMessage> deserializer) {
+ deserializerRegistry.registerDeserializer(key, deserializer);
+ }
+
+ @Override
+ public void registerMultipartReplyMessageDeserializer(ExperimenterIdDeserializerKey key,
+ OFDeserializer<MultipartReplyMessage> deserializer) {
+ deserializerRegistry.registerDeserializer(key, deserializer);
+ }
+
+ @Override
+ public void registerMultipartReplyTFDeserializer(ExperimenterIdDeserializerKey key,
+ OFGeneralDeserializer deserializer) {
+ deserializerRegistry.registerDeserializer(key, deserializer);
+ }
+
+ @Override
+ public void registerQueuePropertyDeserializer(ExperimenterIdDeserializerKey key,
+ OFDeserializer<QueueProperty> deserializer) {
+ deserializerRegistry.registerDeserializer(key, deserializer);
+ }
+
+ @Override
+ public void registerMeterBandDeserializer(ExperimenterIdDeserializerKey key,
+ OFDeserializer<MeterBandExperimenterCase> deserializer) {
+ deserializerRegistry.registerDeserializer(key, deserializer);
+ }
}
\ No newline at end of file
import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;
import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistryInjector;
-import org.opendaylight.openflowjava.protocol.api.extensibility.MessageCodeKey;
import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterIdError;
+import org.opendaylight.openflowjava.util.ExperimenterDeserializerKeyFactory;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadActionCode;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadInstructionCode;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadMatchCode;
@Override
public ErrorMessage deserialize(ByteBuf rawMessage) {
+ int startIndex = rawMessage.readerIndex();
ErrorMessageBuilder builder = new ErrorMessageBuilder();
builder.setVersion((short) EncodeConstants.OF13_VERSION_ID);
builder.setXid(rawMessage.readUnsignedInt());
int type = rawMessage.readUnsignedShort();
ErrorType errorType = ErrorType.forValue(type);
if (ErrorType.EXPERIMENTER.equals(errorType)) {
- builder.setType(errorType.getIntValue());
- OFDeserializer<ExperimenterIdError> deserializer = registry.getDeserializer(new MessageCodeKey(
- EncodeConstants.OF13_VERSION_ID, EncodeConstants.EXPERIMENTER_VALUE, ErrorMessage.class));
- ExperimenterIdError error = deserializer.deserialize(rawMessage);
- builder.addAugmentation(ExperimenterIdError.class, error);
- } else {
- decodeType(builder, errorType, type);
- decodeCode(rawMessage, builder, errorType);
- if (rawMessage.readableBytes() > 0) {
- builder.setData(rawMessage.readBytes(rawMessage.readableBytes()).array());
- }
+ OFDeserializer<ErrorMessage> deserializer = registry.getDeserializer(
+ ExperimenterDeserializerKeyFactory.createExperimenterErrorDeserializerKey(
+ EncodeConstants.OF13_VERSION_ID, rawMessage.getUnsignedInt(
+ rawMessage.readerIndex() + EncodeConstants.SIZE_OF_SHORT_IN_BYTES)));
+ rawMessage.readerIndex(startIndex);
+ return deserializer.deserialize(rawMessage);
+ }
+ decodeType(builder, errorType, type);
+ decodeCode(rawMessage, builder, errorType);
+ if (rawMessage.readableBytes() > 0) {
+ builder.setData(rawMessage.readBytes(rawMessage.readableBytes()).array());
}
return builder.build();
}
--- /dev/null
+/*\r
+ * Copyright (c) 2014 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.deserialization.factories;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;\r
+import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistryInjector;\r
+import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;\r
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;\r
+import org.opendaylight.openflowjava.util.ExperimenterDeserializerKeyFactory;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterMessage;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class ExperimenterMessageFactory implements OFDeserializer<ExperimenterMessage>,\r
+ DeserializerRegistryInjector {\r
+\r
+ private static final byte EXPERIMENTER_ID_INDEX = 8;\r
+ private DeserializerRegistry deserializerRegistry;\r
+\r
+ @Override\r
+ public ExperimenterMessage deserialize(ByteBuf message) {\r
+ long expId = message.getUnsignedInt(message.readerIndex() + EXPERIMENTER_ID_INDEX);\r
+ OFDeserializer<ExperimenterMessage> deserializer = deserializerRegistry.getDeserializer(\r
+ ExperimenterDeserializerKeyFactory.createExperimenterMessageDeserializerKey(\r
+ EncodeConstants.OF13_VERSION_ID, expId));\r
+ return deserializer.deserialize(message);\r
+ }\r
+\r
+ @Override\r
+ public void injectDeserializerRegistry(DeserializerRegistry deserializerRegistry) {\r
+ this.deserializerRegistry = deserializerRegistry;\r
+ }\r
+}
\ No newline at end of file
import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistryInjector;
import org.opendaylight.openflowjava.protocol.api.extensibility.MessageCodeKey;
import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
-import org.opendaylight.openflowjava.util.ByteBufUtils;
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
import org.opendaylight.openflowjava.protocol.impl.util.CodeKeyMaker;
import org.opendaylight.openflowjava.protocol.impl.util.CodeKeyMakerFactory;
-import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
import org.opendaylight.openflowjava.protocol.impl.util.ListDeserializer;
+import org.opendaylight.openflowjava.util.ByteBufUtils;
+import org.opendaylight.openflowjava.util.ExperimenterDeserializerKeyFactory;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ActionRelatedTableFeatureProperty;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ActionRelatedTableFeaturePropertyBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.grouping.BucketsListBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDropCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDscpRemarkCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenterCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenterCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.meter.band.drop._case.MeterBandDropBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.meter.band.dscp.remark._case.MeterBandDscpRemarkBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.meter.band.experimenter._case.MeterBandExperimenterBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyAggregateCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyAggregateCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyDescCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyDescCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyExperimenterCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyExperimenterCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyFlowCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyFlowCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyTableFeaturesCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.aggregate._case.MultipartReplyAggregateBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.desc._case.MultipartReplyDescBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.experimenter._case.MultipartReplyExperimenterBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.MultipartReplyFlowBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.multipart.reply.flow.FlowStats;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.multipart.reply.flow.FlowStatsBuilder;
List<TableFeatureProperties> properties = new ArrayList<>();
int tableFeaturesLength = length;
while (tableFeaturesLength > 0) {
+ int propStartIndex = input.readerIndex();
TableFeaturePropertiesBuilder builder = new TableFeaturePropertiesBuilder();
TableFeaturesPropType type = TableFeaturesPropType.forValue(input.readUnsignedShort());
builder.setType(type);
builder.addAugmentation(OxmRelatedTableFeatureProperty.class, oxmBuilder.build());
} else if (type.equals(TableFeaturesPropType.OFPTFPTEXPERIMENTER)
|| type.equals(TableFeaturesPropType.OFPTFPTEXPERIMENTERMISS)) {
- // return index to property start, so that the experimenter properties are deserialized
- // correctly - as whole ofp_table_feature_prop_experimenter property
- input.readerIndex(input.readerIndex() - 2 * EncodeConstants.SIZE_OF_SHORT_IN_BYTES);
+ long expId = input.readUnsignedInt();
+ input.readerIndex(propStartIndex);
OFDeserializer<TableFeatureProperties> propDeserializer = registry.getDeserializer(
- new MessageCodeKey(EncodeConstants.OF13_VERSION_ID,
- type.getIntValue(), TableFeatureProperties.class));
+ ExperimenterDeserializerKeyFactory.createMultipartReplyTFDeserializerKey(
+ EncodeConstants.OF13_VERSION_ID, expId));
TableFeatureProperties expProp = propDeserializer.deserialize(input);
properties.add(expProp);
continue;
return caseBuilder.build();
}
- private static MultipartReplyMeterConfigCase setMeterConfig(ByteBuf input) {
+ private MultipartReplyMeterConfigCase setMeterConfig(ByteBuf input) {
MultipartReplyMeterConfigCaseBuilder caseBuilder = new MultipartReplyMeterConfigCaseBuilder();
MultipartReplyMeterConfigBuilder builder = new MultipartReplyMeterConfigBuilder();
List<MeterConfig> meterConfigList = new ArrayList<>();
int actualLength = METER_CONFIG_LENGTH;
List<Bands> bandsList = new ArrayList<>();
while (actualLength < meterConfigBodyLength) {
+ int bandStartIndex = input.readerIndex();
BandsBuilder bandsBuilder = new BandsBuilder();
int bandType = input.readUnsignedShort();
switch (bandType) {
bandsBuilder.setMeterBand(bandDscpRemarkCaseBuilder.build());
break;
case 0xFFFF:
- MeterBandExperimenterCaseBuilder bandExperimenterCaseBuilder = new MeterBandExperimenterCaseBuilder();
- MeterBandExperimenterBuilder bandExperimenterBuilder = new MeterBandExperimenterBuilder();
- // TODO - implement lookup into registry
-// bandExperimenterBuilder.setType(MeterBandType.forValue(bandType));
-// actualLength += input.readUnsignedShort();
-// bandExperimenterBuilder.setRate(input.readUnsignedInt());
-// bandExperimenterBuilder.setBurstSize(input.readUnsignedInt());
-// bandExperimenterBuilder.setExperimenter(input.readUnsignedInt());
-// bandExperimenterCaseBuilder.setMeterBandExperimenter(bandExperimenterBuilder.build());
- bandsBuilder.setMeterBand(bandExperimenterCaseBuilder.build());
+ actualLength += input.readUnsignedShort();
+ long expId = input.getUnsignedInt(input.readerIndex() + 2 * EncodeConstants.SIZE_OF_INT_IN_BYTES);
+ input.readerIndex(bandStartIndex);
+ OFDeserializer<MeterBandExperimenterCase> deserializer = registry.getDeserializer(
+ ExperimenterDeserializerKeyFactory.createMeterBandDeserializerKey(
+ EncodeConstants.OF13_VERSION_ID, expId));
+ bandsBuilder.setMeterBand(deserializer.deserialize(input));
break;
default:
break;
return caseBuilder.build();
}
- private static MultipartReplyExperimenterCase setExperimenter(ByteBuf input) {
- // TODO - implement lookup into registry
- MultipartReplyExperimenterCaseBuilder caseBuilder = new MultipartReplyExperimenterCaseBuilder();
- MultipartReplyExperimenterBuilder builder = new MultipartReplyExperimenterBuilder();
-// builder.setExperimenter(input.readUnsignedInt());
-// builder.setExpType(input.readUnsignedInt());
-// byte[] data = new byte[input.readableBytes()];
-// input.readBytes(data);
-// builder.setData(data);
- caseBuilder.setMultipartReplyExperimenter(builder.build());
- return caseBuilder.build();
+ private MultipartReplyExperimenterCase setExperimenter(ByteBuf input) {
+ return registry.getDeserializer(ExperimenterDeserializerKeyFactory.createMultipartReplyMessageDeserializerKey(
+ EncodeConstants.OF13_VERSION_ID, input.readUnsignedInt()));
}
private static MultipartReplyPortDescCase setPortDesc(ByteBuf input) {
import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistryInjector;
import org.opendaylight.openflowjava.protocol.api.extensibility.MessageCodeKey;
import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
-import org.opendaylight.openflowjava.util.ByteBufUtils;
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
import org.opendaylight.openflowjava.protocol.impl.util.CodeKeyMaker;
import org.opendaylight.openflowjava.protocol.impl.util.CodeKeyMakerFactory;
-import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
import org.opendaylight.openflowjava.protocol.impl.util.ListDeserializer;
import org.opendaylight.openflowjava.protocol.impl.util.OF10MatchDeserializer;
+import org.opendaylight.openflowjava.util.ByteBufUtils;
+import org.opendaylight.openflowjava.util.ExperimenterDeserializerKeyFactory;
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.types.rev130731.MultipartRequestFlags;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyDescCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyDescCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyExperimenterCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyExperimenterCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyFlowCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyFlowCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyPortStatsCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyTableCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.aggregate._case.MultipartReplyAggregateBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.desc._case.MultipartReplyDescBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.experimenter._case.MultipartReplyExperimenterBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.MultipartReplyFlowBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.multipart.reply.flow.FlowStats;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.multipart.reply.flow.FlowStatsBuilder;
return caseBuilder.build();
}
- private static MultipartReplyExperimenterCase setExperimenter(ByteBuf input) {
- // TODO - implement lookup into registry
- MultipartReplyExperimenterCaseBuilder caseBuilder = new MultipartReplyExperimenterCaseBuilder();
- MultipartReplyExperimenterBuilder builder = new MultipartReplyExperimenterBuilder();
-// builder.setExperimenter(input.readUnsignedInt());
-// byte[] data = new byte[EncodeConstants.SIZE_OF_LONG_IN_BYTES];
-// input.readBytes(data);
-// builder.setData(data);
- caseBuilder.setMultipartReplyExperimenter(builder.build());
- return caseBuilder.build();
+ private MultipartReplyExperimenterCase setExperimenter(ByteBuf input) {
+ return registry.getDeserializer(ExperimenterDeserializerKeyFactory.createMultipartReplyMessageDeserializerKey(
+ EncodeConstants.OF10_VERSION_ID, input.readUnsignedInt()));
}
@Override
import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;
import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistryInjector;
-import org.opendaylight.openflowjava.protocol.api.extensibility.MessageCodeKey;
import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
+import org.opendaylight.openflowjava.util.ExperimenterDeserializerKeyFactory;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.RateQueueProperty;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.RateQueuePropertyBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
private static final byte PADDING_IN_QUEUE_PROPERTY_HEADER = 4;
private static final int PADDING_IN_RATE_QUEUE_PROPERTY = 6;
private static final byte PACKET_QUEUE_LENGTH = 16;
- private static final byte QUEUE_PROP_HEADER_SIZE = 8;
private DeserializerRegistry registry;
@Override
int propertiesLength = length;
List<QueueProperty> propertiesList = new ArrayList<>();
while (propertiesLength > 0) {
+ int propertyStartIndex = input.readerIndex();
QueuePropertyBuilder propertiesBuilder = new QueuePropertyBuilder();
QueueProperties property = QueueProperties.forValue(input.readUnsignedShort());
propertiesBuilder.setProperty(property);
propertiesBuilder.addAugmentation(RateQueueProperty.class, rateBuilder.build());
input.skipBytes(PADDING_IN_RATE_QUEUE_PROPERTY);
} else if (property.equals(QueueProperties.OFPQTEXPERIMENTER)) {
- // return index to property start, so that the experimenter properties are deserialized
- // correctly - as whole ofp_queue_prop_experimenter property
- input.readerIndex(input.readerIndex() - 2 * EncodeConstants.SIZE_OF_SHORT_IN_BYTES
- - PADDING_IN_QUEUE_PROPERTY_HEADER);
+ long expId = input.readUnsignedInt();
+ input.readerIndex(propertyStartIndex);
OFDeserializer<QueueProperty> deserializer = registry.getDeserializer(
- new MessageCodeKey(EncodeConstants.OF13_VERSION_ID,
- EncodeConstants.EXPERIMENTER_VALUE, QueueProperty.class));
- QueueProperty expProp = deserializer.deserialize(input.slice(input.readerIndex(),
- currentPropertyLength - QUEUE_PROP_HEADER_SIZE));
- propertiesList.add(expProp);
+ ExperimenterDeserializerKeyFactory.createQueuePropertyDeserializerKey(
+ EncodeConstants.OF13_VERSION_ID, expId));
+ propertiesList.add(deserializer.deserialize(input));
continue;
}
propertiesList.add(propertiesBuilder.build());
public void injectDeserializerRegistry(DeserializerRegistry deserializerRegistry) {
this.registry = deserializerRegistry;
}
-
}
--- /dev/null
+/*\r
+ * Copyright (c) 2014 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.deserialization.factories;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;\r
+import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistryInjector;\r
+import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;\r
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;\r
+import org.opendaylight.openflowjava.util.ExperimenterDeserializerKeyFactory;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterMessage;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class VendorMessageFactory implements OFDeserializer<ExperimenterMessage>,\r
+ DeserializerRegistryInjector {\r
+\r
+ private static final byte VENDOR_ID_INDEX = 8;\r
+ private DeserializerRegistry deserializerRegistry;\r
+\r
+ @Override\r
+ public ExperimenterMessage deserialize(ByteBuf message) {\r
+ long expId = message.getUnsignedInt(message.readerIndex() + VENDOR_ID_INDEX);\r
+ OFDeserializer<ExperimenterMessage> deserializer = deserializerRegistry.getDeserializer(\r
+ ExperimenterDeserializerKeyFactory.createExperimenterMessageDeserializerKey(\r
+ EncodeConstants.OF10_VERSION_ID, expId));\r
+ return deserializer.deserialize(message);\r
+ }\r
+\r
+ @Override\r
+ public void injectDeserializerRegistry(DeserializerRegistry deserializerRegistry) {\r
+ this.deserializerRegistry = deserializerRegistry;\r
+ }\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) 2014 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.util;\r
+\r
+import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterIdDeserializerKey;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterMessage;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessage;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenterCase;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.queue.property.header.QueueProperty;\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 ExperimenterDeserializerKeyFactory {\r
+\r
+ /**\r
+ * @param version openflow wire version\r
+ * @param experimenterId experimenter / vendor ID\r
+ * @return key instance\r
+ */\r
+ public static ExperimenterIdDeserializerKey createExperimenterErrorDeserializerKey(\r
+ short version, Long experimenterId) {\r
+ return new ExperimenterIdDeserializerKey(version, experimenterId, ErrorMessage.class);\r
+ }\r
+\r
+ /**\r
+ * @param version openflow wire version\r
+ * @param experimenterId experimenter / vendor ID\r
+ * @return key instance\r
+ */\r
+ public static ExperimenterIdDeserializerKey createExperimenterMessageDeserializerKey(\r
+ short version, Long experimenterId) {\r
+ return new ExperimenterIdDeserializerKey(version, experimenterId, ExperimenterMessage.class);\r
+ }\r
+\r
+ /**\r
+ * @param version openflow wire version\r
+ * @param experimenterId experimenter / vendor ID\r
+ * @return key instance\r
+ */\r
+ public static ExperimenterIdDeserializerKey createMultipartReplyMessageDeserializerKey(\r
+ short version, Long experimenterId) {\r
+ return new ExperimenterIdDeserializerKey(version, experimenterId, MultipartReplyMessage.class);\r
+ }\r
+\r
+ /**\r
+ * @param version openflow wire version\r
+ * @param experimenterId experimenter / vendor ID\r
+ * @return key instance\r
+ */\r
+ public static ExperimenterIdDeserializerKey createMultipartReplyTFDeserializerKey(\r
+ short version, Long experimenterId) {\r
+ return new ExperimenterIdDeserializerKey(version, experimenterId, TableFeatureProperties.class);\r
+ }\r
+\r
+ /**\r
+ * @param version openflow wire version\r
+ * @param experimenterId experimenter / vendor ID\r
+ * @return key instance\r
+ */\r
+ public static ExperimenterIdDeserializerKey createQueuePropertyDeserializerKey(\r
+ short version, Long experimenterId) {\r
+ return new ExperimenterIdDeserializerKey(version, experimenterId, QueueProperty.class);\r
+ }\r
+\r
+ /**\r
+ * @param version openflow wire version\r
+ * @param experimenterId experimenter / vendor ID\r
+ * @return key instance\r
+ */\r
+ public static ExperimenterIdDeserializerKey createMeterBandDeserializerKey(\r
+ short version, Long experimenterId) {\r
+ return new ExperimenterIdDeserializerKey(version, experimenterId, MeterBandExperimenterCase.class);\r
+ }\r
+}
\ No newline at end of file