GroupId and MeterId used in model (as requested)
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / deserialization / factories / GetAsyncReplyMessageFactory.java
1 /* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
2 package org.opendaylight.openflowjava.protocol.impl.deserialization.factories;\r
3 \r
4 import io.netty.buffer.ByteBuf;\r
5 \r
6 import java.util.ArrayList;\r
7 import java.util.List;\r
8 \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
21 \r
22 /**\r
23  * Translates GetAsyncReply messages\r
24  * @author timotej.kubas\r
25  * @author michal.polkorab\r
26  */\r
27 public class GetAsyncReplyMessageFactory implements OFDeserializer<GetAsyncOutput> {\r
28     \r
29     private static GetAsyncReplyMessageFactory instance;\r
30     private static final byte SEPARATE_ROLES = 2;\r
31     \r
32     private GetAsyncReplyMessageFactory() {\r
33         // singleton\r
34     }\r
35 \r
36     /**\r
37      * @return singleton factory\r
38      */\r
39     public static synchronized GetAsyncReplyMessageFactory getInstance() {\r
40         if (instance == null) {\r
41             instance = new GetAsyncReplyMessageFactory();\r
42         }\r
43         return instance;\r
44     }\r
45     \r
46     @Override\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
55     }\r
56     \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
64         }\r
65         return inMasks;\r
66     }\r
67     \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
75         }\r
76         return inMasks;\r
77     }\r
78     \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
86         }\r
87         return inMasks;\r
88     }\r
89     \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
94         }\r
95         if ((input & (1 << 1)) != 0) {\r
96             reasons.add(PacketInReason.OFPRACTION);\r
97         }\r
98         if ((input & (1 << 2)) != 0) {\r
99             reasons.add(PacketInReason.OFPRINVALIDTTL);\r
100         }\r
101         return reasons;\r
102     }\r
103     \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
108         }\r
109         if ((input & (1 << 1)) != 0) {\r
110             reasons.add(PortReason.OFPPRDELETE);\r
111         }\r
112         if ((input & (1 << 2)) != 0) {\r
113             reasons.add(PortReason.OFPPRMODIFY);\r
114         }\r
115         return reasons;\r
116     }\r
117     \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
122         }\r
123         if ((input & (1 << 1)) != 0) {\r
124             reasons.add(FlowRemovedReason.OFPRRHARDTIMEOUT);\r
125         }\r
126         if ((input & (1 << 2)) != 0) {\r
127             reasons.add(FlowRemovedReason.OFPRRDELETE);\r
128         }\r
129         if ((input & (1 << 3)) != 0) {\r
130             reasons.add(FlowRemovedReason.OFPRRGROUPDELETE);\r
131         }\r
132         return reasons;\r
133     }\r
134 }\r