1 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
5 * This class is used for converting the data from SAL layer to OF Library Layer for Meter Mod Command.
9 import java.util.ArrayList;
10 import java.util.Iterator;
11 import java.util.List;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.meter.update.UpdatedMeter;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.Drop;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.DscpRemark;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.Experimenter;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.MeterBandHeaders;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeader;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterBandType;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterFlags;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterId;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterModCommand;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInputBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.MeterBand;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDropBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDscpRemarkBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenterBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.mod.Bands;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.mod.BandsBuilder;
31 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory;
34 public final class MeterConvertor {
35 private static final Logger logger = LoggerFactory.getLogger(MeterConvertor.class);
36 private static final String PREFIX_SEPARATOR = "/";
38 private MeterConvertor() {
42 // Get all the data for the meter from the Yang/SAL-Layer
47 * @return MeterModInput required by OF Library
49 public static MeterModInput toMeterModInput(
50 org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.Meter source, short version) {
52 MeterModInputBuilder meterModInputBuilder = new MeterModInputBuilder();
53 List<Bands> bands = new ArrayList<Bands>();
55 if (source instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterInput) {
56 meterModInputBuilder.setCommand(MeterModCommand.OFPMCADD);
57 } else if (source instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterInput) {
58 meterModInputBuilder.setCommand(MeterModCommand.OFPMCDELETE);
59 } else if (source instanceof UpdatedMeter) {
60 meterModInputBuilder.setCommand(MeterModCommand.OFPMCMODIFY);
63 meterModInputBuilder.setMeterId(new MeterId(source.getMeterId().getValue()));
65 if (null != source.getFlags()) {
66 meterModInputBuilder.setFlags(new MeterFlags(source.getFlags().isMeterBurst(), source.getFlags()
67 .isMeterKbps(), source.getFlags().isMeterPktps(), source.getFlags().isMeterStats()));
71 * As per 0F1.3.1,The rate field indicates the rate value above
72 * which the corresponding band may apply to packets (see 5.7.1).
73 * The rate value is in kilobit per seconds, unless the flags eld
74 * includes OFPMF_PKTPS, in which case the rate is in packets per
78 meterModInputBuilder.setFlags(new MeterFlags(false, false, true, false));
80 if (source.getMeterBandHeaders() != null) {
81 getBandsFromSAL(source.getMeterBandHeaders(), bands);
82 meterModInputBuilder.setBands(bands);
84 logger.error("For this meter Id" + source.getMeterId().getValue() + ",no associated band data found!");
87 meterModInputBuilder.setVersion(version);
88 return meterModInputBuilder.build();
91 private static void getBandsFromSAL(MeterBandHeaders meterBandHeaders, List<Bands> bands) {
93 Iterator<MeterBandHeader> bandHeadersIterator = meterBandHeaders.getMeterBandHeader().iterator();
94 MeterBandHeader meterBandHeader;
96 BandsBuilder bandsB = null;
98 while (bandHeadersIterator.hasNext()) {
99 meterBandHeader = bandHeadersIterator.next();
100 MeterBand meterBandItem = null;
101 // The band types :drop,DSCP_Remark or experimenter.
102 if (null != meterBandHeader.getMeterBandTypes() &&
103 null != meterBandHeader.getMeterBandTypes().getFlags()) {
105 if (meterBandHeader.getMeterBandTypes().getFlags().isOfpmbtDrop()) {
106 if (meterBandHeader.getBandType() != null) {
107 MeterBandDropBuilder meterBandDropBuilder = new MeterBandDropBuilder();
108 meterBandDropBuilder.setType(MeterBandType.OFPMBTDROP);
109 Drop drop = (Drop) meterBandHeader.getBandType();
110 meterBandDropBuilder.setBurstSize(drop.getRate());
111 meterBandDropBuilder.setRate(drop.getBurstSize());
112 meterBandItem = meterBandDropBuilder.build();
113 bandsB = new BandsBuilder();
114 bandsB.setMeterBand(meterBandItem);
115 bands.add(bandsB.build()); // Bands list
118 logger.error("BandType: " + MeterBandType.OFPMBTDROP + "No Band Data found");
120 } else if (meterBandHeader.getMeterBandTypes().getFlags().isOfpmbtDscpRemark()) {
121 if (meterBandHeader.getBandType() != null) {
122 MeterBandDscpRemarkBuilder meterBandDscpRemarkBuilder = new MeterBandDscpRemarkBuilder();
123 meterBandDscpRemarkBuilder.setType(MeterBandType.OFPMBTDSCPREMARK);
124 DscpRemark dscpRemark = (DscpRemark) meterBandHeader.getBandType();
125 meterBandDscpRemarkBuilder.setBurstSize(dscpRemark.getBurstSize());
126 meterBandDscpRemarkBuilder.setRate(dscpRemark.getRate());
127 meterBandDscpRemarkBuilder.setPrecLevel(dscpRemark.getPercLevel());
128 meterBandItem = meterBandDscpRemarkBuilder.build();
129 bandsB = new BandsBuilder();
130 bandsB.setMeterBand(meterBandItem);
131 bands.add(bandsB.build()); // Bands list
134 logger.error("BandType: " + MeterBandType.OFPMBTDSCPREMARK + "No Band Data found");
136 } else if (meterBandHeader.getMeterBandTypes().getFlags().isOfpmbtExperimenter()) {
137 if (meterBandHeader.getBandType() != null) {
138 MeterBandExperimenterBuilder meterBandExperimenterBuilder = new MeterBandExperimenterBuilder();
139 meterBandExperimenterBuilder.setType(MeterBandType.OFPMBTEXPERIMENTER);
140 Experimenter experimenter = (Experimenter) meterBandHeader.getBandType();
141 meterBandExperimenterBuilder.setBurstSize(experimenter.getBurstSize());
142 meterBandExperimenterBuilder.setRate(experimenter.getRate());
143 meterBandExperimenterBuilder.setExperimenter(experimenter.getExperimenter());
144 meterBandItem = meterBandExperimenterBuilder.build();
145 bandsB = new BandsBuilder();
146 bandsB.setMeterBand(meterBandItem);
147 bands.add(bandsB.build()); // Bands list
150 logger.error("BandType: " + MeterBandType.OFPMBTEXPERIMENTER + "No Band Data found");
155 logger.error("Invalid meter band data found.");