X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflow-protocol-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowjava%2Fprotocol%2Fimpl%2Fdeserialization%2Ffactories%2FGetAsyncReplyMessageFactory.java;h=39d757cc784fdbbcbb304406dee605cb3620dda5;hb=07de1ed897da9d7dc70c6d550f38c59339ed751e;hp=5d401bcde6c083bcc95b29f4fde84b194b83ac18;hpb=b2f0ec681b3460c5f0e504ef6fb536c98e35cc6c;p=openflowjava.git diff --git a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/factories/GetAsyncReplyMessageFactory.java b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/factories/GetAsyncReplyMessageFactory.java index 5d401bcd..39d757cc 100644 --- a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/factories/GetAsyncReplyMessageFactory.java +++ b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/factories/GetAsyncReplyMessageFactory.java @@ -1,147 +1,127 @@ -/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */ -package org.opendaylight.openflowjava.protocol.impl.deserialization.factories; - -import io.netty.buffer.ByteBuf; - -import java.util.ArrayList; -import java.util.List; - -import org.opendaylight.openflowjava.protocol.impl.deserialization.OFDeserializer; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowRemovedReason; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PacketInReason; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortReason; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncOutput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncOutputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.get.async.reply.FlowRemovedMask; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.get.async.reply.FlowRemovedMaskBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.get.async.reply.PacketInMask; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.get.async.reply.PacketInMaskBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.get.async.reply.PortStatusMask; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.get.async.reply.PortStatusMaskBuilder; - -/** - * @author timotej.kubas - * @author michal.polkorab - */ -public class GetAsyncReplyMessageFactory implements OFDeserializer { - private static GetAsyncReplyMessageFactory instance; - - private GetAsyncReplyMessageFactory() { - // singleton - } - - /** - * @return singleton factory - */ - public static GetAsyncReplyMessageFactory getInstance() { - if (instance == null) { - instance = new GetAsyncReplyMessageFactory(); - } - return instance; - } - - @Override - public GetAsyncOutput bufferToMessage(ByteBuf rawMessage, short version) { - GetAsyncOutputBuilder builder = new GetAsyncOutputBuilder(); - builder.setVersion(version); - builder.setXid(rawMessage.readUnsignedInt()); - builder.setPacketInMask(decodePacketInMask(rawMessage)); - builder.setPortStatusMask(decodePortStatusMask(rawMessage)); - builder.setFlowRemovedMask(decodeFlowRemovedMask(rawMessage)); - return builder.build(); - } - - private static List decodePacketInMask(ByteBuf outputBuf) { - List readPIRList = new ArrayList(); - List inMasks = new ArrayList(); - PacketInMaskBuilder maskBuilder = new PacketInMaskBuilder(); - - readPIRList.add(decodedPacketInReason((int) outputBuf.readUnsignedInt())); - readPIRList.add(decodedPacketInReason((int) outputBuf.readUnsignedInt())); - inMasks.add(maskBuilder.setMask(readPIRList).build()); - return inMasks; - } - - private static List decodePortStatusMask(ByteBuf outputBuf) { - List readPortReasonList = new ArrayList(); - List inMasks = new ArrayList(); - PortStatusMaskBuilder maskBuilder = new PortStatusMaskBuilder(); - - readPortReasonList.add(decodePortReason((int) outputBuf.readUnsignedInt())); - readPortReasonList.add(decodePortReason((int) outputBuf.readUnsignedInt())); - inMasks.add(maskBuilder.setMask(readPortReasonList).build()); - return inMasks; - } - - private static List decodeFlowRemovedMask(ByteBuf outputBuf) { - List readFlowRemovedReasonList = new ArrayList(); - List inMasks = new ArrayList(); - FlowRemovedMaskBuilder maskBuilder = new FlowRemovedMaskBuilder(); - - readFlowRemovedReasonList.add(decodeFlowRemovedReason((int) outputBuf.readUnsignedInt())); - readFlowRemovedReasonList.add(decodeFlowRemovedReason((int) outputBuf.readUnsignedInt())); - inMasks.add(maskBuilder.setMask(readFlowRemovedReasonList).build()); - return inMasks; - } - - private static PacketInReason decodedPacketInReason(int input) { - PacketInReason reason = null; - Boolean OFPRNOMATCH = (input & (1 << 0)) != 0; - Boolean OFPRACTION = (input & (1 << 1)) != 0; - Boolean OFPRINVALIDTTL = (input & (1 << 2)) != 0; - - if (OFPRNOMATCH) { - return PacketInReason.forValue(0); - } - if (OFPRACTION) { - return PacketInReason.forValue(1); - } - if (OFPRINVALIDTTL) { - return PacketInReason.forValue(2); - } - - return reason; - } - - private static PortReason decodePortReason(int input) { - PortReason reason = null; - Boolean OFPPRADD = (input & (1 << 0)) != 0; - Boolean OFPPRDELETE = (input & (1 << 1)) != 0; - Boolean OFPPRMODIFY = (input & (1 << 2)) != 0; - - if (OFPPRADD) { - return PortReason.forValue(0); - } - if (OFPPRDELETE) { - return PortReason.forValue(1); - } - if (OFPPRMODIFY) { - return PortReason.forValue(2); - } - - return reason; - } - - private static FlowRemovedReason decodeFlowRemovedReason(int input) { - FlowRemovedReason reason = null; - Boolean OFPRRIDLETIMEOUT = (input & (1 << 0)) != 0; - Boolean OFPRRHARDTIMEOUT = (input & (1 << 1)) != 0; - Boolean OFPRRDELETE = (input & (1 << 2)) != 0; - Boolean OFPRRGROUPDELETE = (input & (1 << 3)) != 0; - - if (OFPRRIDLETIMEOUT) { - return FlowRemovedReason.forValue(0); - } - if (OFPRRHARDTIMEOUT) { - return FlowRemovedReason.forValue(1); - } - if (OFPRRDELETE) { - return FlowRemovedReason.forValue(2); - } - if (OFPRRGROUPDELETE) { - return FlowRemovedReason.forValue(3); - } - - return reason; - } -} +/* + * Copyright (c) 2013 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.openflowjava.protocol.impl.deserialization.factories; + +import io.netty.buffer.ByteBuf; + +import java.util.ArrayList; +import java.util.List; + +import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowRemovedReason; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PacketInReason; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortReason; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.async.body.grouping.FlowRemovedMask; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.async.body.grouping.FlowRemovedMaskBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.async.body.grouping.PacketInMask; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.async.body.grouping.PacketInMaskBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.async.body.grouping.PortStatusMask; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.async.body.grouping.PortStatusMaskBuilder; + +/** + * Translates GetAsyncReply messages + * @author timotej.kubas + * @author michal.polkorab + */ +public class GetAsyncReplyMessageFactory implements OFDeserializer { + + private static final byte SEPARATE_ROLES = 2; + + @Override + public GetAsyncOutput deserialize(ByteBuf rawMessage) { + GetAsyncOutputBuilder builder = new GetAsyncOutputBuilder(); + builder.setVersion((short) EncodeConstants.OF13_VERSION_ID); + builder.setXid(rawMessage.readUnsignedInt()); + builder.setPacketInMask(decodePacketInMask(rawMessage)); + builder.setPortStatusMask(decodePortStatusMask(rawMessage)); + builder.setFlowRemovedMask(decodeFlowRemovedMask(rawMessage)); + return builder.build(); + } + + private static List decodePacketInMask(ByteBuf input) { + List inMasks = new ArrayList<>(); + PacketInMaskBuilder maskBuilder; + for (int i = 0; i < SEPARATE_ROLES; i++) { + maskBuilder = new PacketInMaskBuilder(); + maskBuilder.setMask(decodePacketInReasons(input.readUnsignedInt())); + inMasks.add(maskBuilder.build()); + } + return inMasks; + } + + private static List decodePortStatusMask(ByteBuf input) { + List inMasks = new ArrayList<>(); + PortStatusMaskBuilder maskBuilder; + for (int i = 0; i < SEPARATE_ROLES; i++) { + maskBuilder = new PortStatusMaskBuilder(); + maskBuilder.setMask(decodePortReasons(input.readUnsignedInt())); + inMasks.add(maskBuilder.build()); + } + return inMasks; + } + + private static List decodeFlowRemovedMask(ByteBuf input) { + List inMasks = new ArrayList<>(); + FlowRemovedMaskBuilder maskBuilder; + for (int i = 0; i < SEPARATE_ROLES; i++) { + maskBuilder = new FlowRemovedMaskBuilder(); + maskBuilder.setMask(decodeFlowRemovedReasons(input.readUnsignedInt())); + inMasks.add(maskBuilder.build()); + } + return inMasks; + } + + private static List decodePacketInReasons(long input) { + List reasons = new ArrayList<>(); + if ((input & (1 << 0)) != 0) { + reasons.add(PacketInReason.OFPRNOMATCH); + } + if ((input & (1 << 1)) != 0) { + reasons.add(PacketInReason.OFPRACTION); + } + if ((input & (1 << 2)) != 0) { + reasons.add(PacketInReason.OFPRINVALIDTTL); + } + return reasons; + } + + private static List decodePortReasons(long input) { + List reasons = new ArrayList<>(); + if ((input & (1 << 0)) != 0) { + reasons.add(PortReason.OFPPRADD); + } + if ((input & (1 << 1)) != 0) { + reasons.add(PortReason.OFPPRDELETE); + } + if ((input & (1 << 2)) != 0) { + reasons.add(PortReason.OFPPRMODIFY); + } + return reasons; + } + + private static List decodeFlowRemovedReasons(long input) { + List reasons = new ArrayList<>(); + if ((input & (1 << 0)) != 0) { + reasons.add(FlowRemovedReason.OFPRRIDLETIMEOUT); + } + if ((input & (1 << 1)) != 0) { + reasons.add(FlowRemovedReason.OFPRRHARDTIMEOUT); + } + if ((input & (1 << 2)) != 0) { + reasons.add(FlowRemovedReason.OFPRRDELETE); + } + if ((input & (1 << 3)) != 0) { + reasons.add(FlowRemovedReason.OFPRRGROUPDELETE); + } + return reasons; + } +}