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
8 * Contributor: usha.m.s@ericsson.com
10 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
14 * This class is used for converting the data from SAL layer to OF Library Layer for Meter Mod Command.
18 import java.util.ArrayList;
19 import java.util.Iterator;
20 import java.util.List;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.meter.update.UpdatedMeter;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.Drop;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.DscpRemark;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.Experimenter;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.MeterBandHeaders;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeader;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterIdMeterBand;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterIdMeterBandBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ExperimenterId;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterBandType;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterFlags;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterId;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterModCommand;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInputBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.MeterBand;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDropCaseBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDscpRemarkCaseBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenterCaseBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.meter.band.drop._case.MeterBandDropBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.meter.band.dscp.remark._case.MeterBandDscpRemarkBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.meter.band.experimenter._case.MeterBandExperimenterBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.mod.Bands;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.mod.BandsBuilder;
45 import org.slf4j.Logger;
46 import org.slf4j.LoggerFactory;
48 public final class MeterConvertor {
49 private static final Logger logger = LoggerFactory.getLogger(MeterConvertor.class);
50 private static final String PREFIX_SEPARATOR = "/";
52 private MeterConvertor() {
56 // Get all the data for the meter from the Yang/SAL-Layer
61 * @return MeterModInput required by OF Library
63 public static MeterModInputBuilder toMeterModInput(
64 org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.Meter source, short version) {
66 MeterModInputBuilder meterModInputBuilder = new MeterModInputBuilder();
67 List<Bands> bands = new ArrayList<Bands>();
69 if (source instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterInput) {
70 meterModInputBuilder.setCommand(MeterModCommand.OFPMCADD);
71 } else if (source instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterInput) {
72 meterModInputBuilder.setCommand(MeterModCommand.OFPMCDELETE);
73 } else if (source instanceof UpdatedMeter) {
74 meterModInputBuilder.setCommand(MeterModCommand.OFPMCMODIFY);
77 meterModInputBuilder.setMeterId(new MeterId(source.getMeterId().getValue()));
79 if (null != source.getFlags()) {
80 meterModInputBuilder.setFlags(new MeterFlags(source.getFlags().isMeterBurst(), source.getFlags()
81 .isMeterKbps(), source.getFlags().isMeterPktps(), source.getFlags().isMeterStats()));
85 * As per 0F1.3.1,The rate field indicates the rate value above
86 * which the corresponding band may apply to packets (see 5.7.1).
87 * The rate value is in kilobit per seconds, unless the flags eld
88 * includes OFPMF_PKTPS, in which case the rate is in packets per
92 meterModInputBuilder.setFlags(new MeterFlags(false, false, true, false));
94 if (source.getMeterBandHeaders() != null) {
95 getBandsFromSAL(source.getMeterBandHeaders(), bands);
96 meterModInputBuilder.setBands(bands);
98 logger.error("For this meter Id" + source.getMeterId().getValue() + ",no associated band data found!");
101 meterModInputBuilder.setVersion(version);
102 return meterModInputBuilder;
105 private static void getBandsFromSAL(MeterBandHeaders meterBandHeaders, List<Bands> bands) {
107 Iterator<MeterBandHeader> bandHeadersIterator = meterBandHeaders.getMeterBandHeader().iterator();
108 MeterBandHeader meterBandHeader;
110 BandsBuilder bandsB = null;
112 while (bandHeadersIterator.hasNext()) {
113 meterBandHeader = bandHeadersIterator.next();
114 MeterBand meterBandItem = null;
115 // The band types :drop,DSCP_Remark or experimenter.
116 if (null != meterBandHeader.getMeterBandTypes() &&
117 null != meterBandHeader.getMeterBandTypes().getFlags()) {
119 if (meterBandHeader.getMeterBandTypes().getFlags().isOfpmbtDrop()) {
120 if (meterBandHeader.getBandType() != null) {
121 MeterBandDropCaseBuilder dropCaseBuilder = new MeterBandDropCaseBuilder();
122 MeterBandDropBuilder meterBandDropBuilder = new MeterBandDropBuilder();
123 meterBandDropBuilder.setType(MeterBandType.OFPMBTDROP);
124 Drop drop = (Drop) meterBandHeader.getBandType();
125 meterBandDropBuilder.setBurstSize(drop.getDropBurstSize());
126 meterBandDropBuilder.setRate(drop.getDropRate());
127 dropCaseBuilder.setMeterBandDrop(meterBandDropBuilder.build());
128 meterBandItem = dropCaseBuilder.build();
129 bandsB = new BandsBuilder();
130 bandsB.setMeterBand(meterBandItem);
131 bands.add(bandsB.build()); // Bands list
134 logger.error("BandType: " + MeterBandType.OFPMBTDROP + "No Band Data found");
136 } else if (meterBandHeader.getMeterBandTypes().getFlags().isOfpmbtDscpRemark()) {
137 if (meterBandHeader.getBandType() != null) {
138 MeterBandDscpRemarkCaseBuilder dscpCaseBuilder = new MeterBandDscpRemarkCaseBuilder();
139 MeterBandDscpRemarkBuilder meterBandDscpRemarkBuilder = new MeterBandDscpRemarkBuilder();
140 meterBandDscpRemarkBuilder.setType(MeterBandType.OFPMBTDSCPREMARK);
141 DscpRemark dscpRemark = (DscpRemark) meterBandHeader.getBandType();
142 meterBandDscpRemarkBuilder.setBurstSize(dscpRemark.getDscpRemarkBurstSize());
143 meterBandDscpRemarkBuilder.setRate(dscpRemark.getDscpRemarkRate());
144 meterBandDscpRemarkBuilder.setPrecLevel(dscpRemark.getPrecLevel());
145 dscpCaseBuilder.setMeterBandDscpRemark(meterBandDscpRemarkBuilder.build());
146 meterBandItem = dscpCaseBuilder.build();
147 bandsB = new BandsBuilder();
148 bandsB.setMeterBand(meterBandItem);
149 bands.add(bandsB.build()); // Bands list
152 logger.error("BandType: " + MeterBandType.OFPMBTDSCPREMARK + "No Band Data found");
154 } else if (meterBandHeader.getMeterBandTypes().getFlags().isOfpmbtExperimenter()) {
155 if (meterBandHeader.getBandType() != null) {
156 MeterBandExperimenterCaseBuilder experimenterCaseBuilder = new MeterBandExperimenterCaseBuilder();
157 MeterBandExperimenterBuilder meterBandExperimenterBuilder = new MeterBandExperimenterBuilder();
158 meterBandExperimenterBuilder.setType(MeterBandType.OFPMBTEXPERIMENTER);
159 Experimenter experimenter = (Experimenter) meterBandHeader.getBandType();
160 meterBandExperimenterBuilder.setBurstSize(experimenter.getExperimenterBurstSize());
161 meterBandExperimenterBuilder.setRate(experimenter.getExperimenterRate());
162 ExperimenterIdMeterBandBuilder expBuilder = new ExperimenterIdMeterBandBuilder();
163 expBuilder.setExperimenter(new ExperimenterId(experimenter.getExperimenter()));
164 meterBandExperimenterBuilder.addAugmentation(ExperimenterIdMeterBand.class, expBuilder.build());
165 // TODO - implement / finish experimenter meter band translation
166 experimenterCaseBuilder.setMeterBandExperimenter(meterBandExperimenterBuilder.build());
167 meterBandItem = experimenterCaseBuilder.build();
168 bandsB = new BandsBuilder();
169 bandsB.setMeterBand(meterBandItem);
170 bands.add(bandsB.build()); // Bands list
173 logger.error("BandType: " + MeterBandType.OFPMBTEXPERIMENTER + "No Band Data found");
178 logger.error("Invalid meter band data found.");