2 * Copyright (c) 2014 Ericsson India Global Services Pvt Ltd. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
11 import java.util.ArrayList;
12 import java.util.List;
13 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.Convertor;
14 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.meter.update.UpdatedMeter;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.Meter;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.Drop;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.DscpRemark;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.Experimenter;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.MeterBandHeaders;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeader;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.ExperimenterIdMeterBand;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.ExperimenterIdMeterBandBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ExperimenterId;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterBandType;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterFlags;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterId;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterModCommand;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInputBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.MeterBand;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDropCaseBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDscpRemarkCaseBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenterCaseBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.meter.band.drop._case.MeterBandDropBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.meter.band.dscp.remark._case.MeterBandDscpRemarkBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.meter.band.experimenter._case.MeterBandExperimenterBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.mod.Bands;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.mod.BandsBuilder;
39 import org.opendaylight.yangtools.yang.binding.DataContainer;
40 import org.slf4j.Logger;
41 import org.slf4j.LoggerFactory;
44 * Converts a MD-SAL meter mod command into the OF library meter mod command.
49 * VersionConvertorData data = new VersionConvertorData(version);
50 * Optional<MeterModInputBuilder> ofMeter = ConvertorManager.getInstance().convert(salMeter, data);
54 public class MeterConvertor implements Convertor<Meter, MeterModInputBuilder, VersionConvertorData> {
55 private static final Logger LOG = LoggerFactory.getLogger(MeterConvertor.class);
58 * Create default empty meter mot input builder.
59 * Use this method, if result from convertor is empty.
61 * @param version Openflow version
62 * @return default empty meter mod input builder
64 public static MeterModInputBuilder defaultResult(short version) {
65 return new MeterModInputBuilder()
67 .setFlags(new MeterFlags(false, false, true, false));
70 private static void getBandsFromSAL(MeterBandHeaders meterBandHeaders, List<Bands> bands) {
71 for (MeterBandHeader meterBandHeader : meterBandHeaders.getMeterBandHeader()) {
72 // The band types :drop,DSCP_Remark or experimenter.
73 if (null != meterBandHeader.getMeterBandTypes() &&
74 null != meterBandHeader.getMeterBandTypes().getFlags()) {
76 if (meterBandHeader.getMeterBandTypes().getFlags().isOfpmbtDrop()) {
77 if (meterBandHeader.getBandType() != null) {
78 MeterBandDropCaseBuilder dropCaseBuilder = new MeterBandDropCaseBuilder();
79 MeterBandDropBuilder meterBandDropBuilder = new MeterBandDropBuilder();
80 meterBandDropBuilder.setType(MeterBandType.OFPMBTDROP);
81 Drop drop = (Drop) meterBandHeader.getBandType();
82 meterBandDropBuilder.setBurstSize(drop.getDropBurstSize());
83 meterBandDropBuilder.setRate(drop.getDropRate());
84 dropCaseBuilder.setMeterBandDrop(meterBandDropBuilder.build());
85 MeterBand meterBandItem = dropCaseBuilder.build();
86 BandsBuilder bandsB = new BandsBuilder();
87 bandsB.setMeterBand(meterBandItem);
89 bands.add(bandsB.build());
91 logBandTypeMissing(MeterBandType.OFPMBTDROP);
93 } else if (meterBandHeader.getMeterBandTypes().getFlags().isOfpmbtDscpRemark()) {
94 if (meterBandHeader.getBandType() != null) {
95 MeterBandDscpRemarkCaseBuilder dscpCaseBuilder = new MeterBandDscpRemarkCaseBuilder();
96 MeterBandDscpRemarkBuilder meterBandDscpRemarkBuilder = new MeterBandDscpRemarkBuilder();
97 meterBandDscpRemarkBuilder.setType(MeterBandType.OFPMBTDSCPREMARK);
98 DscpRemark dscpRemark = (DscpRemark) meterBandHeader.getBandType();
99 meterBandDscpRemarkBuilder.setBurstSize(dscpRemark.getDscpRemarkBurstSize());
100 meterBandDscpRemarkBuilder.setRate(dscpRemark.getDscpRemarkRate());
101 meterBandDscpRemarkBuilder.setPrecLevel(dscpRemark.getPrecLevel());
102 dscpCaseBuilder.setMeterBandDscpRemark(meterBandDscpRemarkBuilder.build());
103 MeterBand meterBandItem = dscpCaseBuilder.build();
104 BandsBuilder bandsB = new BandsBuilder();
105 bandsB.setMeterBand(meterBandItem);
107 bands.add(bandsB.build());
109 logBandTypeMissing(MeterBandType.OFPMBTDSCPREMARK);
111 } else if (meterBandHeader.getMeterBandTypes().getFlags().isOfpmbtExperimenter()) {
112 if (meterBandHeader.getBandType() != null) {
113 MeterBandExperimenterCaseBuilder experimenterCaseBuilder = new MeterBandExperimenterCaseBuilder();
114 MeterBandExperimenterBuilder meterBandExperimenterBuilder = new MeterBandExperimenterBuilder();
115 meterBandExperimenterBuilder.setType(MeterBandType.OFPMBTEXPERIMENTER);
116 Experimenter experimenter = (Experimenter) meterBandHeader.getBandType();
117 meterBandExperimenterBuilder.setBurstSize(experimenter.getExperimenterBurstSize());
118 meterBandExperimenterBuilder.setRate(experimenter.getExperimenterRate());
119 ExperimenterIdMeterBandBuilder expBuilder = new ExperimenterIdMeterBandBuilder();
120 expBuilder.setExperimenter(new ExperimenterId(experimenter.getExperimenter()));
121 meterBandExperimenterBuilder.addAugmentation(ExperimenterIdMeterBand.class, expBuilder.build());
122 // TODO - implement / finish experimenter meter band translation
123 experimenterCaseBuilder.setMeterBandExperimenter(meterBandExperimenterBuilder.build());
124 MeterBand meterBandItem = experimenterCaseBuilder.build();
125 BandsBuilder bandsB = new BandsBuilder();
126 bandsB.setMeterBand(meterBandItem);
128 bands.add(bandsB.build());
130 logBandTypeMissing(MeterBandType.OFPMBTEXPERIMENTER);
134 LOG.error("Invalid meter band data found.");
140 private static void logBandTypeMissing(final MeterBandType meterBandType) {
141 LOG.error("BandType: {} No Band Data found", meterBandType);
145 public Class<? extends DataContainer> getType() {
150 public MeterModInputBuilder convert(Meter source, VersionConvertorData data) {
151 MeterModInputBuilder meterModInputBuilder = new MeterModInputBuilder();
152 List<Bands> bands = new ArrayList<>();
154 if (source instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterInput) {
155 meterModInputBuilder.setCommand(MeterModCommand.OFPMCADD);
156 } else if (source instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterInput) {
157 meterModInputBuilder.setCommand(MeterModCommand.OFPMCDELETE);
158 } else if (source instanceof UpdatedMeter) {
159 meterModInputBuilder.setCommand(MeterModCommand.OFPMCMODIFY);
162 meterModInputBuilder.setMeterId(new MeterId(source.getMeterId().getValue()));
164 if (null != source.getFlags()) {
165 meterModInputBuilder.setFlags(new MeterFlags(source.getFlags().isMeterBurst(), source.getFlags()
166 .isMeterKbps(), source.getFlags().isMeterPktps(), source.getFlags().isMeterStats()));
170 * As per 0F1.3.1,The rate field indicates the rate value above
171 * which the corresponding band may apply to packets (see 5.7.1).
172 * The rate value is in kilobit per seconds, unless the flags eld
173 * includes OFPMF_PKTPS, in which case the rate is in packets per
177 meterModInputBuilder.setFlags(new MeterFlags(false, false, true, false));
180 if (source.getMeterBandHeaders() != null) {
181 getBandsFromSAL(source.getMeterBandHeaders(), bands);
182 meterModInputBuilder.setBands(bands);
184 LOG.error("For this meter Id" + source.getMeterId().getValue() + ",no associated band data found!");
187 meterModInputBuilder.setVersion(data.getVersion());
188 return meterModInputBuilder;