2 * Copyright (c) 2015 NetIDE Consortium 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 package org.opendaylight.openflowjava.protocol.impl.deserialization.factories;
10 import static org.opendaylight.yangtools.yang.common.netty.ByteBufUtils.readUint32;
11 import static org.opendaylight.yangtools.yang.common.netty.ByteBufUtils.readUint8;
13 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
14 import io.netty.buffer.ByteBuf;
15 import java.util.ArrayList;
16 import java.util.List;
17 import java.util.Objects;
18 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;
19 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistryInjector;
20 import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
21 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
22 import org.opendaylight.openflowjava.util.ExperimenterDeserializerKeyFactory;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterBandType;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterFlags;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterId;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterModCommand;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInputBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDropCaseBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDscpRemarkCaseBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenterCase;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.meter.band.drop._case.MeterBandDropBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.meter.band.dscp.remark._case.MeterBandDscpRemarkBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.mod.Bands;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.mod.BandsBuilder;
38 * Translates MeterModInput messages.
40 * @author giuseppex.petralia@intel.com
42 public class MeterModInputMessageFactory implements OFDeserializer<MeterModInput>, DeserializerRegistryInjector {
44 private DeserializerRegistry registry;
45 private static final byte PADDING_IN_METER_BAND_DROP_HEADER = 4;
46 private static final byte PADDING_IN_METER_BAND_DSCP_HEADER = 3;
49 public void injectDeserializerRegistry(DeserializerRegistry deserializerRegistry) {
50 registry = deserializerRegistry;
54 @SuppressFBWarnings("UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR") // FB doesn't recognize Objects.requireNonNull
55 public MeterModInput deserialize(ByteBuf rawMessage) {
56 Objects.requireNonNull(registry);
58 MeterModInputBuilder builder = new MeterModInputBuilder()
59 .setVersion(EncodeConstants.OF_VERSION_1_3)
60 .setXid(readUint32(rawMessage))
61 .setCommand(MeterModCommand.forValue(rawMessage.readUnsignedShort()))
62 .setFlags(createMeterFlags(rawMessage.readUnsignedShort()))
63 .setMeterId(new MeterId(readUint32(rawMessage)));
64 List<Bands> bandsList = new ArrayList<>();
65 while (rawMessage.readableBytes() > 0) {
66 BandsBuilder bandsBuilder = new BandsBuilder();
67 int bandStartIndex = rawMessage.readerIndex();
68 int bandType = rawMessage.readUnsignedShort();
71 final MeterBandDropCaseBuilder bandDropCaseBuilder = new MeterBandDropCaseBuilder();
72 MeterBandDropBuilder bandDropBuilder = new MeterBandDropBuilder();
73 bandDropBuilder.setType(MeterBandType.forValue(bandType));
74 rawMessage.readUnsignedShort();
75 bandDropBuilder.setRate(readUint32(rawMessage));
76 bandDropBuilder.setBurstSize(readUint32(rawMessage));
77 rawMessage.skipBytes(PADDING_IN_METER_BAND_DROP_HEADER);
78 bandDropCaseBuilder.setMeterBandDrop(bandDropBuilder.build());
79 bandsBuilder.setMeterBand(bandDropCaseBuilder.build());
82 final MeterBandDscpRemarkCaseBuilder bandDscpRemarkCaseBuilder =
83 new MeterBandDscpRemarkCaseBuilder();
84 MeterBandDscpRemarkBuilder bandDscpRemarkBuilder = new MeterBandDscpRemarkBuilder();
85 bandDscpRemarkBuilder.setType(MeterBandType.forValue(bandType));
86 rawMessage.readUnsignedShort();
87 bandDscpRemarkBuilder.setRate(readUint32(rawMessage));
88 bandDscpRemarkBuilder.setBurstSize(readUint32(rawMessage));
89 bandDscpRemarkBuilder.setPrecLevel(readUint8(rawMessage));
90 rawMessage.skipBytes(PADDING_IN_METER_BAND_DSCP_HEADER);
91 bandDscpRemarkCaseBuilder.setMeterBandDscpRemark(bandDscpRemarkBuilder.build());
92 bandsBuilder.setMeterBand(bandDscpRemarkCaseBuilder.build());
95 long expId = rawMessage.getUnsignedInt(rawMessage.readerIndex()
96 + 2 * EncodeConstants.SIZE_OF_INT_IN_BYTES);
97 rawMessage.readerIndex(bandStartIndex);
98 OFDeserializer<MeterBandExperimenterCase> deserializer = registry
99 .getDeserializer(ExperimenterDeserializerKeyFactory
100 .createMeterBandDeserializerKey(EncodeConstants.OF13_VERSION_ID, expId));
101 bandsBuilder.setMeterBand(deserializer.deserialize(rawMessage));
106 bandsList.add(bandsBuilder.build());
108 builder.setBands(bandsList);
109 return builder.build();
112 @SuppressWarnings("checkstyle:AbbreviationAsWordInName")
113 private static MeterFlags createMeterFlags(int input) {
114 final Boolean mfKBPS = (input & 1 << 0) != 0;
115 final Boolean mfPKTPS = (input & 1 << 1) != 0;
116 final Boolean mfBURST = (input & 1 << 2) != 0;
117 final Boolean mfSTATS = (input & 1 << 3) != 0;
118 return new MeterFlags(mfBURST, mfKBPS, mfPKTPS, mfSTATS);