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.async.body.grouping.FlowRemovedMask;
\r
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.async.body.grouping.FlowRemovedMaskBuilder;
\r
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.async.body.grouping.PacketInMask;
\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.async.body.grouping.PacketInMaskBuilder;
\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.async.body.grouping.PortStatusMask;
\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.async.body.grouping.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
30 private static final byte SEPARATE_ROLES = 2;
\r
32 private GetAsyncReplyMessageFactory() {
\r
37 * @return singleton factory
\r
39 public static synchronized GetAsyncReplyMessageFactory getInstance() {
\r
40 if (instance == null) {
\r
41 instance = new GetAsyncReplyMessageFactory();
\r
47 public GetAsyncOutput bufferToMessage(ByteBuf rawMessage, short version) {
\r
48 GetAsyncOutputBuilder builder = new GetAsyncOutputBuilder();
\r
49 builder.setVersion(version);
\r
50 builder.setXid(rawMessage.readUnsignedInt());
\r
51 builder.setPacketInMask(decodePacketInMask(rawMessage));
\r
52 builder.setPortStatusMask(decodePortStatusMask(rawMessage));
\r
53 builder.setFlowRemovedMask(decodeFlowRemovedMask(rawMessage));
\r
54 return builder.build();
\r
57 private static List<PacketInMask> decodePacketInMask(ByteBuf input) {
\r
58 List<PacketInMask> inMasks = new ArrayList<>();
\r
59 PacketInMaskBuilder maskBuilder;
\r
60 for (int i = 0; i < SEPARATE_ROLES; i++) {
\r
61 maskBuilder = new PacketInMaskBuilder();
\r
62 maskBuilder.setMask(decodePacketInReasons(input.readUnsignedInt()));
\r
63 inMasks.add(maskBuilder.build());
\r
68 private static List<PortStatusMask> decodePortStatusMask(ByteBuf input) {
\r
69 List<PortStatusMask> inMasks = new ArrayList<>();
\r
70 PortStatusMaskBuilder maskBuilder;
\r
71 for (int i = 0; i < SEPARATE_ROLES; i++) {
\r
72 maskBuilder = new PortStatusMaskBuilder();
\r
73 maskBuilder.setMask(decodePortReasons(input.readUnsignedInt()));
\r
74 inMasks.add(maskBuilder.build());
\r
79 private static List<FlowRemovedMask> decodeFlowRemovedMask(ByteBuf input) {
\r
80 List<FlowRemovedMask> inMasks = new ArrayList<>();
\r
81 FlowRemovedMaskBuilder maskBuilder;
\r
82 for (int i = 0; i < SEPARATE_ROLES; i++) {
\r
83 maskBuilder = new FlowRemovedMaskBuilder();
\r
84 maskBuilder.setMask(decodeFlowRemovedReasons(input.readUnsignedInt()));
\r
85 inMasks.add(maskBuilder.build());
\r
90 private static List<PacketInReason> decodePacketInReasons(long input) {
\r
91 List<PacketInReason> reasons = new ArrayList<>();
\r
92 if ((input & (1 << 0)) != 0) {
\r
93 reasons.add(PacketInReason.OFPRNOMATCH);
\r
95 if ((input & (1 << 1)) != 0) {
\r
96 reasons.add(PacketInReason.OFPRACTION);
\r
98 if ((input & (1 << 2)) != 0) {
\r
99 reasons.add(PacketInReason.OFPRINVALIDTTL);
\r
104 private static List<PortReason> decodePortReasons(long input) {
\r
105 List<PortReason> reasons = new ArrayList<>();
\r
106 if ((input & (1 << 0)) != 0) {
\r
107 reasons.add(PortReason.OFPPRADD);
\r
109 if ((input & (1 << 1)) != 0) {
\r
110 reasons.add(PortReason.OFPPRDELETE);
\r
112 if ((input & (1 << 2)) != 0) {
\r
113 reasons.add(PortReason.OFPPRMODIFY);
\r
118 private static List<FlowRemovedReason> decodeFlowRemovedReasons(long input) {
\r
119 List<FlowRemovedReason> reasons = new ArrayList<>();
\r
120 if ((input & (1 << 0)) != 0) {
\r
121 reasons.add(FlowRemovedReason.OFPRRIDLETIMEOUT);
\r
123 if ((input & (1 << 1)) != 0) {
\r
124 reasons.add(FlowRemovedReason.OFPRRHARDTIMEOUT);
\r
126 if ((input & (1 << 2)) != 0) {
\r
127 reasons.add(FlowRemovedReason.OFPRRDELETE);
\r
129 if ((input & (1 << 3)) != 0) {
\r
130 reasons.add(FlowRemovedReason.OFPRRGROUPDELETE);
\r