Clean up version setters
[openflowplugin.git] / openflowjava / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / deserialization / factories / MeterModInputMessageFactory.java
1 /*
2  * Copyright (c) 2015 NetIDE Consortium and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.openflowjava.protocol.impl.deserialization.factories;
9
10 import static org.opendaylight.yangtools.yang.common.netty.ByteBufUtils.readUint32;
11 import static org.opendaylight.yangtools.yang.common.netty.ByteBufUtils.readUint8;
12
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;
36
37 /**
38  * Translates MeterModInput messages.
39  *
40  * @author giuseppex.petralia@intel.com
41  */
42 public class MeterModInputMessageFactory implements OFDeserializer<MeterModInput>, DeserializerRegistryInjector {
43
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;
47
48     @Override
49     public void injectDeserializerRegistry(DeserializerRegistry deserializerRegistry) {
50         registry = deserializerRegistry;
51     }
52
53     @Override
54     @SuppressFBWarnings("UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR") // FB doesn't recognize Objects.requireNonNull
55     public MeterModInput deserialize(ByteBuf rawMessage) {
56         Objects.requireNonNull(registry);
57
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();
69             switch (bandType) {
70                 case 1:
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());
80                     break;
81                 case 2:
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());
93                     break;
94                 case 0xFFFF:
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));
102                     break;
103                 default:
104                     break;
105             }
106             bandsList.add(bandsBuilder.build());
107         }
108         builder.setBands(bandsList);
109         return builder.build();
110     }
111
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);
119     }
120 }