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 * Translates MeterMod messages
\r
23 * @author timotej.kubas
\r
24 * @author michal.polkorab
\r
26 public class MeterModInputMessageFactory implements OFSerializer<MeterModInput> {
\r
27 private static final byte MESSAGE_TYPE = 29;
\r
28 private static final int MESSAGE_LENGTH = 16;
\r
29 private static final short LENGTH_OF_METER_BANDS = 16;
\r
30 private static final short PADDING_IN_METER_BAND_DROP = 4;
\r
31 private static final short PADDING_IN_METER_BAND_DSCP_REMARK = 3;
\r
32 private static MeterModInputMessageFactory instance;
\r
34 private MeterModInputMessageFactory() {
\r
39 * @return singleton factory
\r
41 public static synchronized MeterModInputMessageFactory getInstance() {
\r
42 if (instance == null) {
\r
43 instance = new MeterModInputMessageFactory();
\r
49 public void messageToBuffer(short version, ByteBuf out,
\r
50 MeterModInput message) {
\r
51 ByteBufUtils.writeOFHeader(instance, message, out);
\r
52 out.writeShort(message.getCommand().getIntValue());
\r
53 out.writeShort(createMeterFlagsBitmask(message.getFlags()));
\r
54 out.writeInt(message.getMeterId().getValue().intValue());
\r
55 encodeBands(message.getBands(), out);
\r
59 public int computeLength(MeterModInput message) {
\r
60 int length = MESSAGE_LENGTH;
\r
61 if (message.getBands() != null) {
\r
62 length += message.getBands().size() * LENGTH_OF_METER_BANDS;
\r
68 public byte getMessageType() {
\r
69 return MESSAGE_TYPE;
\r
72 private static int createMeterFlagsBitmask(MeterFlags flags) {
\r
73 int meterFlagBitmask = 0;
\r
74 Map<Integer, Boolean> meterModFlagsMap = new HashMap<>();
\r
75 meterModFlagsMap.put(0, flags.isOFPMFKBPS());
\r
76 meterModFlagsMap.put(1, flags.isOFPMFPKTPS());
\r
77 meterModFlagsMap.put(2, flags.isOFPMFBURST());
\r
78 meterModFlagsMap.put(3, flags.isOFPMFSTATS());
\r
80 meterFlagBitmask = ByteBufUtils.fillBitMaskFromMap(meterModFlagsMap);
\r
81 return meterFlagBitmask;
\r
84 private static void encodeBands(List<Bands> bands, ByteBuf outBuffer) {
\r
85 if (bands != null) {
\r
86 for (Bands currentBand : bands) {
\r
87 MeterBand meterBand = currentBand.getMeterBand();
\r
88 writeBandCommonFields((MeterBandCommons) meterBand, outBuffer);
\r
89 if (meterBand instanceof MeterBandDrop) {
\r
90 ByteBufUtils.padBuffer(PADDING_IN_METER_BAND_DROP, outBuffer);
\r
91 } else if (meterBand instanceof MeterBandDscpRemark) {
\r
92 MeterBandDscpRemark dscpRemarkBand = (MeterBandDscpRemark) meterBand;
\r
93 outBuffer.writeByte(dscpRemarkBand.getPrecLevel());
\r
94 ByteBufUtils.padBuffer(PADDING_IN_METER_BAND_DSCP_REMARK, outBuffer);
\r
95 } else if (meterBand instanceof MeterBandExperimenter) {
\r
96 MeterBandExperimenter experimenterBand = (MeterBandExperimenter) meterBand;
\r
97 outBuffer.writeInt(experimenterBand.getExperimenter().intValue());
\r
103 private static void writeBandCommonFields(MeterBandCommons meterBand, ByteBuf outBuffer) {
\r
104 outBuffer.writeShort(meterBand.getType().getIntValue());
\r
105 outBuffer.writeShort(LENGTH_OF_METER_BANDS);
\r
106 outBuffer.writeInt(meterBand.getRate().intValue());
\r
107 outBuffer.writeInt(meterBand.getBurstSize().intValue());
\r