1 /* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */
\r
2 package org.opendaylight.openflowjava.protocol.impl.serialization.factories;
\r
4 import io.netty.buffer.ByteBuf;
\r
6 import java.util.HashMap;
\r
7 import java.util.List;
\r
8 import java.util.Map;
\r
10 import org.opendaylight.openflowjava.protocol.impl.serialization.OFSerializer;
\r
11 import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils;
\r
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterFlags;
\r
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterBandCommons;
\r
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput;
\r
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.MeterBand;
\r
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDrop;
\r
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDscpRemark;
\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenter;
\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.mod.Bands;
\r
22 * @author timotej.kubas
\r
23 * @author michal.polkorab
\r
25 public class MeterModInputMessageFactory implements OFSerializer<MeterModInput> {
\r
26 private static final byte MESSAGE_TYPE = 29;
\r
27 private static final int MESSAGE_LENGTH = 16;
\r
28 private static final short LENGTH_OF_METER_BANDS = 16;
\r
29 private static final short PADDING_IN_METER_BAND_DROP = 4;
\r
30 private static final short PADDING_IN_METER_BAND_DSCP_REMARK = 3;
\r
31 private static MeterModInputMessageFactory instance;
\r
33 private MeterModInputMessageFactory() {
\r
38 * @return singleton factory
\r
40 public static synchronized MeterModInputMessageFactory getInstance() {
\r
41 if (instance == null) {
\r
42 instance = new MeterModInputMessageFactory();
\r
48 public void messageToBuffer(short version, ByteBuf out,
\r
49 MeterModInput message) {
\r
50 ByteBufUtils.writeOFHeader(instance, message, out);
\r
51 out.writeShort(message.getCommand().getIntValue());
\r
52 out.writeShort(createMeterFlagsBitmask(message.getFlags()));
\r
53 out.writeInt(message.getMeterId().getValue().intValue());
\r
54 encodeBands(message.getBands(), out);
\r
58 public int computeLength() {
\r
60 return MESSAGE_LENGTH;
\r
64 public byte getMessageType() {
\r
65 return MESSAGE_TYPE;
\r
68 private static int createMeterFlagsBitmask(MeterFlags flags) {
\r
69 int meterFlagBitmask = 0;
\r
70 Map<Integer, Boolean> meterModFlagsMap = new HashMap<>();
\r
71 meterModFlagsMap.put(0, flags.isOFPMFKBPS());
\r
72 meterModFlagsMap.put(1, flags.isOFPMFPKTPS());
\r
73 meterModFlagsMap.put(2, flags.isOFPMFBURST());
\r
74 meterModFlagsMap.put(3, flags.isOFPMFSTATS());
\r
76 meterFlagBitmask = ByteBufUtils.fillBitMaskFromMap(meterModFlagsMap);
\r
77 return meterFlagBitmask;
\r
80 private static void encodeBands(List<Bands> bands, ByteBuf outBuffer) {
\r
81 for (Bands currentBand : bands) {
\r
82 MeterBand meterBand = currentBand.getMeterBand();
\r
83 writeBandCommonFields((MeterBandCommons) meterBand, outBuffer);
\r
84 if (meterBand instanceof MeterBandDrop) {
\r
85 ByteBufUtils.padBuffer(PADDING_IN_METER_BAND_DROP, outBuffer);
\r
86 } else if (meterBand instanceof MeterBandDscpRemark) {
\r
87 MeterBandDscpRemark dscpRemarkBand = (MeterBandDscpRemark) meterBand;
\r
88 outBuffer.writeByte(dscpRemarkBand.getPrecLevel());
\r
89 ByteBufUtils.padBuffer(PADDING_IN_METER_BAND_DSCP_REMARK, outBuffer);
\r
90 } else if (meterBand instanceof MeterBandExperimenter) {
\r
91 MeterBandExperimenter experimenterBand = (MeterBandExperimenter) meterBand;
\r
92 outBuffer.writeInt(experimenterBand.getExperimenter().intValue());
\r
97 private static void writeBandCommonFields(MeterBandCommons meterBand, ByteBuf outBuffer) {
\r
98 outBuffer.writeShort(meterBand.getType().getIntValue());
\r
99 outBuffer.writeShort(LENGTH_OF_METER_BANDS);
\r
100 outBuffer.writeInt(meterBand.getRate().intValue());
\r
101 outBuffer.writeInt(meterBand.getBurstSize().intValue());
\r