*/
package org.opendaylight.openflowjava.protocol.impl.deserialization.factories;
+import static java.util.Objects.requireNonNull;
+import static org.opendaylight.yangtools.yang.common.netty.ByteBufUtils.readUint32;
+import static org.opendaylight.yangtools.yang.common.netty.ByteBufUtils.readUint8;
+
import io.netty.buffer.ByteBuf;
import java.util.ArrayList;
import java.util.List;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.mod.BandsBuilder;
/**
- * @author giuseppex.petralia@intel.com
+ * Translates MeterModInput messages.
*
+ * @author giuseppex.petralia@intel.com
*/
public class MeterModInputMessageFactory implements OFDeserializer<MeterModInput>, DeserializerRegistryInjector {
-
- private DeserializerRegistry registry;
private static final byte PADDING_IN_METER_BAND_DROP_HEADER = 4;
private static final byte PADDING_IN_METER_BAND_DSCP_HEADER = 3;
+ private DeserializerRegistry registry = null;
+
@Override
- public void injectDeserializerRegistry(DeserializerRegistry deserializerRegistry) {
- registry = deserializerRegistry;
+ public void injectDeserializerRegistry(final DeserializerRegistry deserializerRegistry) {
+ registry = requireNonNull(deserializerRegistry);
}
@Override
- public MeterModInput deserialize(ByteBuf rawMessage) {
- MeterModInputBuilder builder = new MeterModInputBuilder();
- builder.setVersion((short) EncodeConstants.OF13_VERSION_ID);
- builder.setXid(rawMessage.readUnsignedInt());
- builder.setCommand(MeterModCommand.forValue(rawMessage.readUnsignedShort()));
- builder.setFlags(createMeterFlags(rawMessage.readUnsignedShort()));
- builder.setMeterId(new MeterId(rawMessage.readUnsignedInt()));
+ public MeterModInput deserialize(final ByteBuf rawMessage) {
+ MeterModInputBuilder builder = new MeterModInputBuilder()
+ .setVersion(EncodeConstants.OF_VERSION_1_3)
+ .setXid(readUint32(rawMessage))
+ .setCommand(MeterModCommand.forValue(rawMessage.readUnsignedShort()))
+ .setFlags(createMeterFlags(rawMessage.readUnsignedShort()))
+ .setMeterId(new MeterId(readUint32(rawMessage)));
List<Bands> bandsList = new ArrayList<>();
while (rawMessage.readableBytes() > 0) {
BandsBuilder bandsBuilder = new BandsBuilder();
int bandStartIndex = rawMessage.readerIndex();
int bandType = rawMessage.readUnsignedShort();
switch (bandType) {
- case 1:
- MeterBandDropCaseBuilder bandDropCaseBuilder = new MeterBandDropCaseBuilder();
- MeterBandDropBuilder bandDropBuilder = new MeterBandDropBuilder();
- bandDropBuilder.setType(MeterBandType.forValue(bandType));
- rawMessage.readUnsignedShort();
- bandDropBuilder.setRate(rawMessage.readUnsignedInt());
- bandDropBuilder.setBurstSize(rawMessage.readUnsignedInt());
- rawMessage.skipBytes(PADDING_IN_METER_BAND_DROP_HEADER);
- bandDropCaseBuilder.setMeterBandDrop(bandDropBuilder.build());
- bandsBuilder.setMeterBand(bandDropCaseBuilder.build());
- break;
- case 2:
- MeterBandDscpRemarkCaseBuilder bandDscpRemarkCaseBuilder = new MeterBandDscpRemarkCaseBuilder();
- MeterBandDscpRemarkBuilder bandDscpRemarkBuilder = new MeterBandDscpRemarkBuilder();
- bandDscpRemarkBuilder.setType(MeterBandType.forValue(bandType));
- rawMessage.readUnsignedShort();
- bandDscpRemarkBuilder.setRate(rawMessage.readUnsignedInt());
- bandDscpRemarkBuilder.setBurstSize(rawMessage.readUnsignedInt());
- bandDscpRemarkBuilder.setPrecLevel(rawMessage.readUnsignedByte());
- rawMessage.skipBytes(PADDING_IN_METER_BAND_DSCP_HEADER);
- bandDscpRemarkCaseBuilder.setMeterBandDscpRemark(bandDscpRemarkBuilder.build());
- bandsBuilder.setMeterBand(bandDscpRemarkCaseBuilder.build());
- break;
- case 0xFFFF:
- long expId = rawMessage
- .getUnsignedInt(rawMessage.readerIndex() + 2 * EncodeConstants.SIZE_OF_INT_IN_BYTES);
- rawMessage.readerIndex(bandStartIndex);
- OFDeserializer<MeterBandExperimenterCase> deserializer = registry
- .getDeserializer(ExperimenterDeserializerKeyFactory
- .createMeterBandDeserializerKey(EncodeConstants.OF13_VERSION_ID, expId));
- bandsBuilder.setMeterBand(deserializer.deserialize(rawMessage));
- break;
+ case 1:
+ rawMessage.readUnsignedShort();
+ MeterBandDropBuilder bandDropBuilder = new MeterBandDropBuilder()
+ .setType(MeterBandType.forValue(bandType))
+ .setRate(readUint32(rawMessage))
+ .setBurstSize(readUint32(rawMessage));
+ rawMessage.skipBytes(PADDING_IN_METER_BAND_DROP_HEADER);
+
+ bandsBuilder.setMeterBand(new MeterBandDropCaseBuilder()
+ .setMeterBandDrop(bandDropBuilder.build())
+ .build());
+ break;
+ case 2:
+ rawMessage.readUnsignedShort();
+ MeterBandDscpRemarkBuilder bandDscpRemarkBuilder = new MeterBandDscpRemarkBuilder()
+ .setType(MeterBandType.forValue(bandType))
+ .setRate(readUint32(rawMessage))
+ .setBurstSize(readUint32(rawMessage))
+ .setPrecLevel(readUint8(rawMessage));
+ rawMessage.skipBytes(PADDING_IN_METER_BAND_DSCP_HEADER);
+ bandsBuilder.setMeterBand(new MeterBandDscpRemarkCaseBuilder()
+ .setMeterBandDscpRemark(bandDscpRemarkBuilder.build())
+ .build());
+ break;
+ case 0xFFFF:
+ long expId = rawMessage.getUnsignedInt(rawMessage.readerIndex() + 2 * Integer.BYTES);
+ rawMessage.readerIndex(bandStartIndex);
+ OFDeserializer<MeterBandExperimenterCase> deserializer = registry
+ .getDeserializer(ExperimenterDeserializerKeyFactory
+ .createMeterBandDeserializerKey(EncodeConstants.OF13_VERSION_ID, expId));
+ bandsBuilder.setMeterBand(deserializer.deserialize(rawMessage));
+ break;
+ default:
+ break;
}
bandsList.add(bandsBuilder.build());
}
- builder.setBands(bandsList);
- return builder.build();
+ return builder.setBands(bandsList).build();
}
- private static MeterFlags createMeterFlags(int input) {
- final Boolean mfKBPS = (input & (1 << 0)) != 0;
- final Boolean mfPKTPS = (input & (1 << 1)) != 0;
- final Boolean mfBURST = (input & (1 << 2)) != 0;
- final Boolean mfSTATS = (input & (1 << 3)) != 0;
+ @SuppressWarnings("checkstyle:AbbreviationAsWordInName")
+ private static MeterFlags createMeterFlags(final int input) {
+ final Boolean mfKBPS = (input & 1 << 0) != 0;
+ final Boolean mfPKTPS = (input & 1 << 1) != 0;
+ final Boolean mfBURST = (input & 1 << 2) != 0;
+ final Boolean mfSTATS = (input & 1 << 3) != 0;
return new MeterFlags(mfBURST, mfKBPS, mfPKTPS, mfSTATS);
}
-
}