Bump MRI upstreams
[openflowplugin.git] / openflowplugin-impl / src / main / java / org / opendaylight / openflowplugin / impl / protocol / deserialization / multipart / MultipartReplyMeterFeaturesDeserializer.java
1 /*
2  * Copyright (c) 2017 Pantheon Technologies s.r.o. 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.openflowplugin.impl.protocol.deserialization.multipart;
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 com.google.common.collect.ImmutableSet;
14 import io.netty.buffer.ByteBuf;
15 import java.util.Set;
16 import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
17 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter32;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.multipart.reply.multipart.reply.body.MultipartReplyMeterFeaturesBuilder;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBand;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBandDrop;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBandDscpRemark;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBurst;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterCapability;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterKbps;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterPktps;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterStats;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.multipart.reply.MultipartReplyBody;
28
29 public class MultipartReplyMeterFeaturesDeserializer implements OFDeserializer<MultipartReplyBody> {
30
31     @Override
32     public MultipartReplyBody deserialize(final ByteBuf message) {
33         return new MultipartReplyMeterFeaturesBuilder()
34                 .setMaxMeter(new Counter32(readUint32(message)))
35                 .setMeterBandSupported(readMeterBands(message))
36                 .setMeterCapabilitiesSupported(readMeterCapabilities(message))
37                 .setMaxBands(readUint8(message))
38                 .setMaxColor(readUint8(message))
39                 .build();
40     }
41
42     private static Set<Class<? extends MeterBand>> readMeterBands(final ByteBuf message) {
43         final long typesMask = message.readUnsignedInt();
44
45         final var bandTypes = ImmutableSet.<Class<? extends MeterBand>>builder();
46         if ((typesMask & 1) != 0) {
47             bandTypes.add(MeterBandDrop.class);
48         }
49         if ((typesMask & 1 << 1) != 0) {
50             bandTypes.add(MeterBandDscpRemark.class);
51         }
52         return bandTypes.build();
53     }
54
55     private static Set<Class<? extends MeterCapability>> readMeterCapabilities(final ByteBuf message) {
56         final long capabilitiesMask = message.readUnsignedInt();
57
58         final var meterCapabilities = ImmutableSet.<Class<? extends MeterCapability>>builder();
59         if ((capabilitiesMask & 1) != 0) {
60             meterCapabilities.add(MeterKbps.class);
61         }
62         if ((capabilitiesMask & 1 << 1) != 0) {
63             meterCapabilities.add(MeterPktps.class);
64         }
65         if ((capabilitiesMask & 1 << 2) != 0) {
66             meterCapabilities.add(MeterBurst.class);
67         }
68         if ((capabilitiesMask & 1 << 3) != 0) {
69             meterCapabilities.add(MeterStats.class);
70         }
71
72         return meterCapabilities.build();
73     }
74 }