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%2FMeterModInputMessageFactory.java;h=36eb64f5f2229fa5d02804e14255937c36f7b0f5;hb=e522c58d71ba5eed20ec5199b8cad6ad22550079;hp=30c91ab28699cdbbdfd0948e8f19dbfb09a35648;hpb=7d9b6038060779d819e17d5add8556dcc097fcea;p=openflowjava.git diff --git a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/MeterModInputMessageFactory.java b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/MeterModInputMessageFactory.java old mode 100644 new mode 100755 index 30c91ab2..36eb64f5 --- a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/MeterModInputMessageFactory.java +++ b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/MeterModInputMessageFactory.java @@ -1,110 +1,118 @@ -/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */ -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.impl.serialization.OFSerializer; -import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterFlags; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterBandCommons; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.MeterBand; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDrop; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDscpRemark; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenter; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.mod.Bands; - -/** - * Translates MeterMod messages - * @author timotej.kubas - * @author michal.polkorab - */ -public class MeterModInputMessageFactory implements OFSerializer { - private static final byte MESSAGE_TYPE = 29; - private static final int MESSAGE_LENGTH = 16; - private static final short LENGTH_OF_METER_BANDS = 16; - private static final short PADDING_IN_METER_BAND_DROP = 4; - private static final short PADDING_IN_METER_BAND_DSCP_REMARK = 3; - private static MeterModInputMessageFactory instance; - - private MeterModInputMessageFactory() { - // singleton - } - - /** - * @return singleton factory - */ - public static synchronized MeterModInputMessageFactory getInstance() { - if (instance == null) { - instance = new MeterModInputMessageFactory(); - } - return instance; - } - - @Override - public void messageToBuffer(short version, ByteBuf out, - MeterModInput message) { - ByteBufUtils.writeOFHeader(instance, message, out); - out.writeShort(message.getCommand().getIntValue()); - out.writeShort(createMeterFlagsBitmask(message.getFlags())); - out.writeInt(message.getMeterId().getValue().intValue()); - encodeBands(message.getBands(), out); - } - - @Override - public int computeLength(MeterModInput message) { - int length = MESSAGE_LENGTH; - if (message.getBands() != null) { - length += message.getBands().size() * LENGTH_OF_METER_BANDS; - } - return length; - } - - @Override - public byte getMessageType() { - return MESSAGE_TYPE; - } - - private static int createMeterFlagsBitmask(MeterFlags flags) { - int meterFlagBitmask = 0; - Map meterModFlagsMap = new HashMap<>(); - meterModFlagsMap.put(0, flags.isOFPMFKBPS()); - meterModFlagsMap.put(1, flags.isOFPMFPKTPS()); - meterModFlagsMap.put(2, flags.isOFPMFBURST()); - meterModFlagsMap.put(3, flags.isOFPMFSTATS()); - - meterFlagBitmask = ByteBufUtils.fillBitMaskFromMap(meterModFlagsMap); - return meterFlagBitmask; - } - - private static void encodeBands(List bands, ByteBuf outBuffer) { - if (bands != null) { - for (Bands currentBand : bands) { - MeterBand meterBand = currentBand.getMeterBand(); - writeBandCommonFields((MeterBandCommons) meterBand, outBuffer); - if (meterBand instanceof MeterBandDrop) { - ByteBufUtils.padBuffer(PADDING_IN_METER_BAND_DROP, outBuffer); - } else if (meterBand instanceof MeterBandDscpRemark) { - MeterBandDscpRemark dscpRemarkBand = (MeterBandDscpRemark) meterBand; - outBuffer.writeByte(dscpRemarkBand.getPrecLevel()); - ByteBufUtils.padBuffer(PADDING_IN_METER_BAND_DSCP_REMARK, outBuffer); - } else if (meterBand instanceof MeterBandExperimenter) { - MeterBandExperimenter experimenterBand = (MeterBandExperimenter) meterBand; - outBuffer.writeInt(experimenterBand.getExperimenter().intValue()); - } - } - } - } - - private static void writeBandCommonFields(MeterBandCommons meterBand, ByteBuf outBuffer) { - outBuffer.writeShort(meterBand.getType().getIntValue()); - outBuffer.writeShort(LENGTH_OF_METER_BANDS); - outBuffer.writeInt(meterBand.getRate().intValue()); - outBuffer.writeInt(meterBand.getBurstSize().intValue()); - } - -} +/* + * 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.serialization.factories; + +import io.netty.buffer.ByteBuf; +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.util.EncodeConstants; +import org.opendaylight.openflowjava.util.ByteBufUtils; +import org.opendaylight.openflowjava.util.ExperimenterSerializerKeyFactory; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.ExperimenterIdMeterBand; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ExperimenterMeterBandSubType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterFlags; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterBandCommons; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.MeterBand; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDropCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDscpRemarkCase; +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.MeterBandDrop; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.meter.band.dscp.remark._case.MeterBandDscpRemark; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.meter.band.experimenter._case.MeterBandExperimenter; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.mod.Bands; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + +/** + * Translates MeterMod messages + * @author timotej.kubas + * @author michal.polkorab + */ +public class MeterModInputMessageFactory implements OFSerializer, + SerializerRegistryInjector { + + private static final Logger LOG = LoggerFactory + .getLogger(MeterModInputMessageFactory.class); + private static final byte MESSAGE_TYPE = 29; + private static final short LENGTH_OF_METER_BANDS = 16; + private static final short PADDING_IN_METER_BAND_DROP = 4; + private static final short PADDING_IN_METER_BAND_DSCP_REMARK = 3; + private SerializerRegistry registry; + + @Override + public void serialize(final MeterModInput message, final ByteBuf outBuffer) { + ByteBufUtils.writeOFHeader(MESSAGE_TYPE, message, outBuffer, EncodeConstants.EMPTY_LENGTH); + outBuffer.writeShort(message.getCommand().getIntValue()); + outBuffer.writeShort(createMeterFlagsBitmask(message.getFlags())); + outBuffer.writeInt(message.getMeterId().getValue().intValue()); + serializeBands(message.getBands(), outBuffer); + ByteBufUtils.updateOFHeaderLength(outBuffer); + } + + private static int createMeterFlagsBitmask(final MeterFlags flags) { + return ByteBufUtils.fillBitMask(0, + flags.isOFPMFKBPS(), + flags.isOFPMFPKTPS(), + flags.isOFPMFBURST(), + flags.isOFPMFSTATS()); + } + + private void serializeBands(final List bands, final ByteBuf outBuffer) { + if (bands != null) { + for (Bands currentBand : bands) { + MeterBand meterBand = currentBand.getMeterBand(); + if (meterBand instanceof MeterBandDropCase) { + MeterBandDropCase dropBandCase = (MeterBandDropCase) meterBand; + MeterBandDrop dropBand = dropBandCase.getMeterBandDrop(); + writeBandCommonFields(dropBand, outBuffer); + outBuffer.writeZero(PADDING_IN_METER_BAND_DROP); + } else if (meterBand instanceof MeterBandDscpRemarkCase) { + MeterBandDscpRemarkCase dscpRemarkBandCase = (MeterBandDscpRemarkCase) meterBand; + MeterBandDscpRemark dscpRemarkBand = dscpRemarkBandCase.getMeterBandDscpRemark(); + writeBandCommonFields(dscpRemarkBand, outBuffer); + outBuffer.writeByte(dscpRemarkBand.getPrecLevel()); + outBuffer.writeZero(PADDING_IN_METER_BAND_DSCP_REMARK); + } else if (meterBand instanceof MeterBandExperimenterCase) { + MeterBandExperimenterCase experimenterBandCase = (MeterBandExperimenterCase) meterBand; + MeterBandExperimenter experimenterBand = experimenterBandCase.getMeterBandExperimenter(); + ExperimenterIdMeterBand expIdMeterBand = experimenterBand.getAugmentation(ExperimenterIdMeterBand.class); + if (expIdMeterBand != null) { + long expId = expIdMeterBand.getExperimenter().getValue(); + Class meterBandSubType = expIdMeterBand.getSubType(); + try { + OFSerializer serializer = registry.getSerializer( + ExperimenterSerializerKeyFactory.createMeterBandSerializerKey( + EncodeConstants.OF13_VERSION_ID, expId, meterBandSubType)); + serializer.serialize(experimenterBandCase, outBuffer); + } catch (final IllegalStateException e) { + LOG.warn("Serializer for key: {} wasn't found, exception {}", ExperimenterSerializerKeyFactory.createMeterBandSerializerKey( + EncodeConstants.OF13_VERSION_ID, expId, meterBandSubType), e); + } + } + } + } + } + } + + private static void writeBandCommonFields(final MeterBandCommons meterBand, final ByteBuf outBuffer) { + outBuffer.writeShort(meterBand.getType().getIntValue()); + outBuffer.writeShort(LENGTH_OF_METER_BANDS); + outBuffer.writeInt(meterBand.getRate().intValue()); + outBuffer.writeInt(meterBand.getBurstSize().intValue()); + } + + @Override + public void injectSerializerRegistry(final SerializerRegistry serializerRegistry) { + registry = serializerRegistry; + } +} \ No newline at end of file