/* * Copyright (c) 2017 Pantheon Technologies s.r.o. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.openflowplugin.impl.protocol.deserialization.multipart; import io.netty.buffer.ByteBuf; import java.util.ArrayList; import java.util.List; import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter32; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.multipart.reply.multipart.reply.body.MultipartReplyMeterFeaturesBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBand; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBandDrop; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBandDscpRemark; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBurst; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterCapability; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterKbps; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterPktps; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterStats; import org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.multipart.reply.MultipartReplyBody; public class MultipartReplyMeterFeaturesDeserializer implements OFDeserializer<MultipartReplyBody> { @Override public MultipartReplyBody deserialize(ByteBuf message) { return new MultipartReplyMeterFeaturesBuilder() .setMaxMeter(new Counter32(message.readUnsignedInt())) .setMeterBandSupported(readMeterBands(message)) .setMeterCapabilitiesSupported(readMeterCapabilities(message)) .setMaxBands(message.readUnsignedByte()) .setMaxColor(message.readUnsignedByte()) .build(); } private static List<Class<? extends MeterBand>> readMeterBands(ByteBuf message) { final List<Class<? extends MeterBand>> bandTypes = new ArrayList<>(); final long typesMask = message.readUnsignedInt(); final boolean mbtDROP = (typesMask & (1)) != 0; final boolean mbtDSCPREMARK = (typesMask & (1 << 1)) != 0; if (mbtDROP) bandTypes.add(MeterBandDrop.class); if (mbtDSCPREMARK) bandTypes.add(MeterBandDscpRemark.class); return bandTypes; } private static List<Class<? extends MeterCapability>> readMeterCapabilities(ByteBuf message) { final List<Class<? extends MeterCapability>> meterCapabilities = new ArrayList<>(); final long capabilitiesMask = message.readUnsignedInt(); final boolean mfKBPS = (capabilitiesMask & (1)) != 0; final boolean mfPKTPS = (capabilitiesMask & (1 << 1)) != 0; final boolean mfBURST = (capabilitiesMask & (1 << 2)) != 0; final boolean mfSTATS = (capabilitiesMask & (1 << 3)) != 0; if (mfKBPS) meterCapabilities.add(MeterKbps.class); if (mfPKTPS) meterCapabilities.add(MeterPktps.class); if (mfBURST) meterCapabilities.add(MeterBurst.class); if (mfSTATS) meterCapabilities.add(MeterStats.class); return meterCapabilities; } }