2 * Copyright (c) 2016 Pantheon Technologies s.r.o. 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.impl.protocol.deserialization.messages;
11 import io.netty.buffer.ByteBuf;
12 import java.util.ArrayList;
13 import java.util.List;
14 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;
15 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistryInjector;
16 import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
17 import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterIdDeserializerKey;
18 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBandType;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterFlags;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterMessage;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterMessageBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.DropBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.DscpRemarkBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.Experimenter;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.MeterBandHeadersBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeader;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeaderBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.meter.band.header.MeterBandTypesBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterModCommand;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
35 public class MeterMessageDeserializer implements OFDeserializer<MeterMessage>, DeserializerRegistryInjector {
36 private static final Logger LOG = LoggerFactory.getLogger(MeterMessageDeserializer.class);
37 private static final int OFPMBTDROP = 1;
38 private static final int OFPMBTDSCP = 2;
39 private static final int OFPMBTEXPERIMENTER = 0xFFFF;
40 private static final byte PADDING_IN_METER_BAND_DROP_HEADER = 4;
41 private static final byte PADDING_IN_METER_BAND_DSCP_HEADER = 3;
42 private DeserializerRegistry registry;
45 public MeterMessage deserialize(ByteBuf message) {
46 final MeterMessageBuilder builder = new MeterMessageBuilder()
47 .setVersion((short) EncodeConstants.OF13_VERSION_ID)
48 .setXid(message.readUnsignedInt())
49 .setCommand(MeterModCommand.forValue(message.readUnsignedShort()))
50 .setFlags(readMeterFlags(message))
51 .setMeterId(new MeterId(message.readUnsignedInt()));
53 final List<MeterBandHeader> bands = new ArrayList<>();
55 while (message.readableBytes() > 0) {
56 final MeterBandHeaderBuilder bandBuilder = new MeterBandHeaderBuilder();
57 final int bandStartIndex = message.readerIndex();
58 final int bandType = message.readUnsignedShort();
63 .setMeterBandTypes(new MeterBandTypesBuilder()
64 .setFlags(new MeterBandType(true, false, false))
66 .setBandType(new DropBuilder()
67 .setDropRate(message.readUnsignedInt())
68 .setDropBurstSize(message.readUnsignedInt())
70 message.skipBytes(PADDING_IN_METER_BAND_DROP_HEADER);
75 .setMeterBandTypes(new MeterBandTypesBuilder()
76 .setFlags(new MeterBandType(false, true, false))
78 .setBandType(new DscpRemarkBuilder()
79 .setDscpRemarkRate(message.readUnsignedInt())
80 .setDscpRemarkBurstSize(message.readUnsignedInt())
81 .setPrecLevel(message.readUnsignedByte())
83 message.skipBytes(PADDING_IN_METER_BAND_DSCP_HEADER);
86 case OFPMBTEXPERIMENTER: {
87 // TODO: Finish meter band experimenter deserialization
89 message.getUnsignedInt(message.readerIndex() + 2 * EncodeConstants.SIZE_OF_INT_IN_BYTES);
90 message.readerIndex(bandStartIndex);
92 OFDeserializer<Experimenter> deserializer = registry.getDeserializer(
93 new ExperimenterIdDeserializerKey(EncodeConstants.OF13_VERSION_ID, expId,
97 .setMeterBandTypes(new MeterBandTypesBuilder()
98 .setFlags(new MeterBandType(false, false, true))
100 .setBandType(deserializer.deserialize(message));
107 bands.add(bandBuilder.build());
111 .setMeterBandHeaders(new MeterBandHeadersBuilder()
112 .setMeterBandHeader(bands)
119 public void injectDeserializerRegistry(DeserializerRegistry deserializerRegistry) {
120 registry = deserializerRegistry;
123 private static MeterFlags readMeterFlags(ByteBuf message) {
124 int input = message.readUnsignedShort();
125 final Boolean mfKbps = (input & (1)) != 0;
126 final Boolean mfPktps = (input & (1 << 1)) != 0;
127 final Boolean mfBurst = (input & (1 << 2)) != 0;
128 final Boolean mfStats = (input & (1 << 3)) != 0;
129 return new MeterFlags(mfBurst, mfKbps, mfPktps, mfStats);