hello-VersionBitmap fixed
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / serialization / factories / SetAsyncInputMessageFactory.java
1 /* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
2 package org.opendaylight.openflowjava.protocol.impl.serialization.factories;\r
3 \r
4 import io.netty.buffer.ByteBuf;\r
5 \r
6 import java.util.HashMap;\r
7 import java.util.Iterator;\r
8 import java.util.List;\r
9 import java.util.Map;\r
10 \r
11 import org.opendaylight.openflowjava.protocol.impl.serialization.OFSerializer;\r
12 import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils;\r
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowRemovedReason;\r
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PacketInReason;\r
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortReason;\r
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetAsyncInput;\r
17 \r
18 /**\r
19  * @author timotej.kubas\r
20  * @author michal.polkorab\r
21  */\r
22 public class SetAsyncInputMessageFactory implements OFSerializer<SetAsyncInput> {\r
23     private static final byte MESSAGE_TYPE = 28;\r
24     private static final int MESSAGE_LENGTH = 32; \r
25     private static SetAsyncInputMessageFactory instance;\r
26     \r
27     private SetAsyncInputMessageFactory() {\r
28         // singleton\r
29     }\r
30     \r
31     /**\r
32      * @return singleton factory\r
33      */\r
34     public static synchronized SetAsyncInputMessageFactory getInstance() {\r
35         if (instance == null) {\r
36             instance = new SetAsyncInputMessageFactory();\r
37         }\r
38         return instance;\r
39     }\r
40     \r
41     @Override\r
42     public void messageToBuffer(short version, ByteBuf out,\r
43             SetAsyncInput message) {\r
44         ByteBufUtils.writeOFHeader(instance, message, out);\r
45         encodePacketInMask(message.getPacketInMask(), out);\r
46         encodePortStatusMask(message.getPortStatusMask(), out);\r
47         encodeFlowRemovedMask(message.getFlowRemovedMask(), out);\r
48     }\r
49 \r
50     @Override\r
51     public int computeLength(SetAsyncInput message) {\r
52         return MESSAGE_LENGTH;\r
53     }\r
54 \r
55     @Override\r
56     public byte getMessageType() {\r
57         return MESSAGE_TYPE;\r
58     }\r
59     \r
60     private static void encodePacketInMask(List<PacketInReason> packetInMask, ByteBuf outBuffer) {\r
61         for (Iterator<PacketInReason> iterator = packetInMask.iterator(); iterator.hasNext();) {\r
62             PacketInReason currentPacketInReason = iterator.next();\r
63             outBuffer.writeInt(packetInReasonToBitmask(currentPacketInReason.getIntValue()));\r
64         }\r
65     }\r
66     \r
67     private static void encodePortStatusMask(List<PortReason> portStatusMask, ByteBuf outBuffer) {\r
68         for (Iterator<PortReason> iterator = portStatusMask.iterator(); iterator.hasNext();) {\r
69             PortReason currentPortReason = iterator.next();\r
70             outBuffer.writeInt(portReasonToBitmask(currentPortReason.getIntValue()));\r
71         }\r
72     }\r
73     \r
74     private static void encodeFlowRemovedMask(List<FlowRemovedReason> flowRemovedMask, ByteBuf outBuffer) {\r
75         for (Iterator<FlowRemovedReason> iterator = flowRemovedMask.iterator(); iterator.hasNext();) {\r
76             FlowRemovedReason currentFlowRemovedReason = iterator.next();\r
77             outBuffer.writeInt(flowRemovedReasonToBitmask(currentFlowRemovedReason.getIntValue()));\r
78         }\r
79     }\r
80     \r
81     private static int packetInReasonToBitmask(int option) {\r
82         Boolean OFPRNOMATCH = false;\r
83         Boolean OFPRACTION = false;\r
84         Boolean OFPRINVALIDTTL = false;\r
85         int packetInReasonBitmask = 0;\r
86         \r
87         switch(option) {\r
88         case 0: OFPRNOMATCH = true; break;\r
89         case 1: OFPRACTION = true; break;\r
90         case 2: OFPRINVALIDTTL = true; break;\r
91         default: break;\r
92         }\r
93         \r
94         Map<Integer, Boolean> packetInReasonMap = new HashMap<>();\r
95         packetInReasonMap.put(0, OFPRNOMATCH);\r
96         packetInReasonMap.put(1, OFPRACTION);\r
97         packetInReasonMap.put(2, OFPRINVALIDTTL);\r
98         \r
99         packetInReasonBitmask = ByteBufUtils.fillBitMaskFromMap(packetInReasonMap);\r
100         \r
101         return packetInReasonBitmask;\r
102     }\r
103     \r
104     private static int portReasonToBitmask(int option) {\r
105         Boolean OFPPRADD = false;\r
106         Boolean OFPPRDELETE = false;\r
107         Boolean OFPPRMODIFY = false;\r
108         int portReasonBitmask = 0;\r
109         \r
110         switch(option) {\r
111         case 0: OFPPRADD = true; break;\r
112         case 1: OFPPRDELETE = true; break;\r
113         case 2: OFPPRMODIFY = true; break;\r
114         default: break;\r
115         }\r
116         \r
117         Map<Integer, Boolean> portReasonMap = new HashMap<>();\r
118         portReasonMap.put(0, OFPPRADD);\r
119         portReasonMap.put(1, OFPPRDELETE);\r
120         portReasonMap.put(2, OFPPRMODIFY);\r
121         \r
122         portReasonBitmask = ByteBufUtils.fillBitMaskFromMap(portReasonMap);\r
123         \r
124         return portReasonBitmask;\r
125     }\r
126     \r
127     private static int flowRemovedReasonToBitmask(int option) {\r
128         Boolean OFPRRIDLETIMEOUT = false;\r
129         Boolean OFPRRHARDTIMEOUT = false;\r
130         Boolean OFPRRDELETE = false;\r
131         Boolean OFPRRGROUPDELETE = false;\r
132         int flowRemovedReasonBitmask = 0;\r
133         \r
134         switch(option) {\r
135         case 0: OFPRRIDLETIMEOUT = true; break;\r
136         case 1: OFPRRHARDTIMEOUT = true; break;\r
137         case 2: OFPRRDELETE = true; break;\r
138         case 3: OFPRRGROUPDELETE = true; break;\r
139         default: break;\r
140         }\r
141         \r
142         Map<Integer, Boolean> portReasonMap = new HashMap<>();\r
143         portReasonMap.put(0, OFPRRIDLETIMEOUT);\r
144         portReasonMap.put(1, OFPRRHARDTIMEOUT);\r
145         portReasonMap.put(2, OFPRRDELETE);\r
146         portReasonMap.put(3, OFPRRGROUPDELETE);\r
147         \r
148         flowRemovedReasonBitmask = ByteBufUtils.fillBitMaskFromMap(portReasonMap);\r
149         \r
150         return flowRemovedReasonBitmask;\r
151     }\r
152 }\r