1 /* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */
\r
2 package org.opendaylight.openflowjava.protocol.impl.deserialization.factories;
\r
4 import io.netty.buffer.ByteBuf;
\r
6 import java.util.ArrayList;
\r
7 import java.util.List;
\r
9 import org.opendaylight.openflowjava.protocol.impl.deserialization.OFDeserializer;
\r
10 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowRemovedReason;
\r
11 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PacketInReason;
\r
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortReason;
\r
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncOutput;
\r
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncOutputBuilder;
\r
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.get.async.reply.FlowRemovedMask;
\r
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.get.async.reply.FlowRemovedMaskBuilder;
\r
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.get.async.reply.PacketInMask;
\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.get.async.reply.PacketInMaskBuilder;
\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.get.async.reply.PortStatusMask;
\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.get.async.reply.PortStatusMaskBuilder;
\r
23 * Translates GetAsyncReply messages
\r
24 * @author timotej.kubas
\r
25 * @author michal.polkorab
\r
27 public class GetAsyncReplyMessageFactory implements OFDeserializer<GetAsyncOutput> {
\r
29 private static GetAsyncReplyMessageFactory instance;
\r
31 private GetAsyncReplyMessageFactory() {
\r
36 * @return singleton factory
\r
38 public static synchronized GetAsyncReplyMessageFactory getInstance() {
\r
39 if (instance == null) {
\r
40 instance = new GetAsyncReplyMessageFactory();
\r
46 public GetAsyncOutput bufferToMessage(ByteBuf rawMessage, short version) {
\r
47 GetAsyncOutputBuilder builder = new GetAsyncOutputBuilder();
\r
48 builder.setVersion(version);
\r
49 builder.setXid(rawMessage.readUnsignedInt());
\r
50 builder.setPacketInMask(decodePacketInMask(rawMessage));
\r
51 builder.setPortStatusMask(decodePortStatusMask(rawMessage));
\r
52 builder.setFlowRemovedMask(decodeFlowRemovedMask(rawMessage));
\r
53 return builder.build();
\r
56 private static List<PacketInMask> decodePacketInMask(ByteBuf outputBuf) {
\r
57 List<PacketInReason> readPIRList = new ArrayList<>();
\r
58 List<PacketInMask> inMasks = new ArrayList<>();
\r
59 PacketInMaskBuilder maskBuilder = new PacketInMaskBuilder();
\r
61 readPIRList.add(decodedPacketInReason((int) outputBuf.readUnsignedInt()));
\r
62 readPIRList.add(decodedPacketInReason((int) outputBuf.readUnsignedInt()));
\r
63 inMasks.add(maskBuilder.setMask(readPIRList).build());
\r
67 private static List<PortStatusMask> decodePortStatusMask(ByteBuf outputBuf) {
\r
68 List<PortReason> readPortReasonList = new ArrayList<>();
\r
69 List<PortStatusMask> inMasks = new ArrayList<>();
\r
70 PortStatusMaskBuilder maskBuilder = new PortStatusMaskBuilder();
\r
72 readPortReasonList.add(decodePortReason((int) outputBuf.readUnsignedInt()));
\r
73 readPortReasonList.add(decodePortReason((int) outputBuf.readUnsignedInt()));
\r
74 inMasks.add(maskBuilder.setMask(readPortReasonList).build());
\r
78 private static List<FlowRemovedMask> decodeFlowRemovedMask(ByteBuf outputBuf) {
\r
79 List<FlowRemovedReason> readFlowRemovedReasonList = new ArrayList<>();
\r
80 List<FlowRemovedMask> inMasks = new ArrayList<>();
\r
81 FlowRemovedMaskBuilder maskBuilder = new FlowRemovedMaskBuilder();
\r
83 readFlowRemovedReasonList.add(decodeFlowRemovedReason((int) outputBuf.readUnsignedInt()));
\r
84 readFlowRemovedReasonList.add(decodeFlowRemovedReason((int) outputBuf.readUnsignedInt()));
\r
85 inMasks.add(maskBuilder.setMask(readFlowRemovedReasonList).build());
\r
89 private static PacketInReason decodedPacketInReason(int input) {
\r
90 PacketInReason reason = null;
\r
91 Boolean OFPRNOMATCH = (input & (1 << 0)) != 0;
\r
92 Boolean OFPRACTION = (input & (1 << 1)) != 0;
\r
93 Boolean OFPRINVALIDTTL = (input & (1 << 2)) != 0;
\r
96 return PacketInReason.forValue(0);
\r
99 return PacketInReason.forValue(1);
\r
101 if (OFPRINVALIDTTL) {
\r
102 return PacketInReason.forValue(2);
\r
108 private static PortReason decodePortReason(int input) {
\r
109 PortReason reason = null;
\r
110 Boolean OFPPRADD = (input & (1 << 0)) != 0;
\r
111 Boolean OFPPRDELETE = (input & (1 << 1)) != 0;
\r
112 Boolean OFPPRMODIFY = (input & (1 << 2)) != 0;
\r
115 return PortReason.forValue(0);
\r
118 return PortReason.forValue(1);
\r
121 return PortReason.forValue(2);
\r
127 private static FlowRemovedReason decodeFlowRemovedReason(int input) {
\r
128 FlowRemovedReason reason = null;
\r
129 Boolean OFPRRIDLETIMEOUT = (input & (1 << 0)) != 0;
\r
130 Boolean OFPRRHARDTIMEOUT = (input & (1 << 1)) != 0;
\r
131 Boolean OFPRRDELETE = (input & (1 << 2)) != 0;
\r
132 Boolean OFPRRGROUPDELETE = (input & (1 << 3)) != 0;
\r
134 if (OFPRRIDLETIMEOUT) {
\r
135 return FlowRemovedReason.forValue(0);
\r
137 if (OFPRRHARDTIMEOUT) {
\r
138 return FlowRemovedReason.forValue(1);
\r
141 return FlowRemovedReason.forValue(2);
\r
143 if (OFPRRGROUPDELETE) {
\r
144 return FlowRemovedReason.forValue(3);
\r