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 * @author timotej.kubas
\r
24 * @author michal.polkorab
\r
26 public class GetAsyncReplyMessageFactory implements OFDeserializer<GetAsyncOutput> {
\r
27 private static GetAsyncReplyMessageFactory instance;
\r
29 private GetAsyncReplyMessageFactory() {
\r
34 * @return singleton factory
\r
36 public static synchronized GetAsyncReplyMessageFactory getInstance() {
\r
37 if (instance == null) {
\r
38 instance = new GetAsyncReplyMessageFactory();
\r
44 public GetAsyncOutput bufferToMessage(ByteBuf rawMessage, short version) {
\r
45 GetAsyncOutputBuilder builder = new GetAsyncOutputBuilder();
\r
46 builder.setVersion(version);
\r
47 builder.setXid(rawMessage.readUnsignedInt());
\r
48 builder.setPacketInMask(decodePacketInMask(rawMessage));
\r
49 builder.setPortStatusMask(decodePortStatusMask(rawMessage));
\r
50 builder.setFlowRemovedMask(decodeFlowRemovedMask(rawMessage));
\r
51 return builder.build();
\r
54 private static List<PacketInMask> decodePacketInMask(ByteBuf outputBuf) {
\r
55 List<PacketInReason> readPIRList = new ArrayList<>();
\r
56 List<PacketInMask> inMasks = new ArrayList<>();
\r
57 PacketInMaskBuilder maskBuilder = new PacketInMaskBuilder();
\r
59 readPIRList.add(decodedPacketInReason((int) outputBuf.readUnsignedInt()));
\r
60 readPIRList.add(decodedPacketInReason((int) outputBuf.readUnsignedInt()));
\r
61 inMasks.add(maskBuilder.setMask(readPIRList).build());
\r
65 private static List<PortStatusMask> decodePortStatusMask(ByteBuf outputBuf) {
\r
66 List<PortReason> readPortReasonList = new ArrayList<>();
\r
67 List<PortStatusMask> inMasks = new ArrayList<>();
\r
68 PortStatusMaskBuilder maskBuilder = new PortStatusMaskBuilder();
\r
70 readPortReasonList.add(decodePortReason((int) outputBuf.readUnsignedInt()));
\r
71 readPortReasonList.add(decodePortReason((int) outputBuf.readUnsignedInt()));
\r
72 inMasks.add(maskBuilder.setMask(readPortReasonList).build());
\r
76 private static List<FlowRemovedMask> decodeFlowRemovedMask(ByteBuf outputBuf) {
\r
77 List<FlowRemovedReason> readFlowRemovedReasonList = new ArrayList<>();
\r
78 List<FlowRemovedMask> inMasks = new ArrayList<>();
\r
79 FlowRemovedMaskBuilder maskBuilder = new FlowRemovedMaskBuilder();
\r
81 readFlowRemovedReasonList.add(decodeFlowRemovedReason((int) outputBuf.readUnsignedInt()));
\r
82 readFlowRemovedReasonList.add(decodeFlowRemovedReason((int) outputBuf.readUnsignedInt()));
\r
83 inMasks.add(maskBuilder.setMask(readFlowRemovedReasonList).build());
\r
87 private static PacketInReason decodedPacketInReason(int input) {
\r
88 PacketInReason reason = null;
\r
89 Boolean OFPRNOMATCH = (input & (1 << 0)) != 0;
\r
90 Boolean OFPRACTION = (input & (1 << 1)) != 0;
\r
91 Boolean OFPRINVALIDTTL = (input & (1 << 2)) != 0;
\r
94 return PacketInReason.forValue(0);
\r
97 return PacketInReason.forValue(1);
\r
99 if (OFPRINVALIDTTL) {
\r
100 return PacketInReason.forValue(2);
\r
106 private static PortReason decodePortReason(int input) {
\r
107 PortReason reason = null;
\r
108 Boolean OFPPRADD = (input & (1 << 0)) != 0;
\r
109 Boolean OFPPRDELETE = (input & (1 << 1)) != 0;
\r
110 Boolean OFPPRMODIFY = (input & (1 << 2)) != 0;
\r
113 return PortReason.forValue(0);
\r
116 return PortReason.forValue(1);
\r
119 return PortReason.forValue(2);
\r
125 private static FlowRemovedReason decodeFlowRemovedReason(int input) {
\r
126 FlowRemovedReason reason = null;
\r
127 Boolean OFPRRIDLETIMEOUT = (input & (1 << 0)) != 0;
\r
128 Boolean OFPRRHARDTIMEOUT = (input & (1 << 1)) != 0;
\r
129 Boolean OFPRRDELETE = (input & (1 << 2)) != 0;
\r
130 Boolean OFPRRGROUPDELETE = (input & (1 << 3)) != 0;
\r
132 if (OFPRRIDLETIMEOUT) {
\r
133 return FlowRemovedReason.forValue(0);
\r
135 if (OFPRRHARDTIMEOUT) {
\r
136 return FlowRemovedReason.forValue(1);
\r
139 return FlowRemovedReason.forValue(2);
\r
141 if (OFPRRGROUPDELETE) {
\r
142 return FlowRemovedReason.forValue(3);
\r