0013b433984bcc1338f57195c17b8497878ca87c
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / deserialization / DecoderTable.java
1 /* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
2 package org.opendaylight.openflowjava.protocol.impl.deserialization;\r
3 \r
4 import java.util.HashMap;\r
5 import java.util.Map;\r
6 \r
7 import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.BarrierReplyMessageFactory;\r
8 import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.EchoReplyMessageFactory;\r
9 import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.EchoRequestMessageFactory;\r
10 import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.ErrorMessageFactory;\r
11 import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.ExperimenterMessageFactory;\r
12 import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.FeaturesReplyMessageFactory;\r
13 import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.FlowRemovedMessageFactory;\r
14 import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.GetAsyncReplyMessageFactory;\r
15 import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.GetConfigReplyMessageFactory;\r
16 import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.HelloMessageFactory;\r
17 import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.MultipartReplyMessageFactory;\r
18 import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.OF10ErrorMessageFactory;\r
19 import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.OF10FeaturesReplyMessageFactory;\r
20 import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.OF10FlowRemovedMessageFactory;\r
21 import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.OF10HelloMessageFactory;\r
22 import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.OF10PacketInMessageFactory;\r
23 import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.OF10PortStatusMessageFactory;\r
24 import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.OF10QueueGetConfigReplyMessageFactory;\r
25 import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.OF10StatsReplyMessageFactory;\r
26 import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.OF10VendorMessageFactory;\r
27 import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.PacketInMessageFactory;\r
28 import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.PortStatusMessageFactory;\r
29 import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.QueueGetConfigReplyMessageFactory;\r
30 import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.RoleReplyMessageFactory;\r
31 import org.opendaylight.openflowjava.protocol.impl.util.EncodeConstants;\r
32 \r
33 /**\r
34  * Stores and provides correct decoders for received messages\r
35  * @author michal.polkorab\r
36  * \r
37  *  <pre>         \r
38  *  Type   Message\r
39  *   0: HELLO\r
40  *   1: ERROR\r
41  *   2: ECHO_REQUEST\r
42  *   3: ECHO_REPLY\r
43  *   4: EXPERIMENTER\r
44  *   5: FEATURES_REQUEST\r
45  *   6: FEATURES_REPLY\r
46  *   7: GET_CONFIG_REQUEST\r
47  *   8: GET_CONFIG_REPLY\r
48  *   9: SET_CONFIG\r
49  *   10: PACKET_IN\r
50  *   11: FLOW_REMOVED\r
51  *   12: PORT_STATUS\r
52  *   13: PACKET_OUT\r
53  *   14: FLOW_MOD\r
54  *   15: GROUP_MOD\r
55  *   16: PORT_MOD\r
56  *   17: TABLE_MOD\r
57  *   18: MULTIPART_REQUEST\r
58  *   19: MULTIPART_REPLY\r
59  *   20: BARRIER_REQUEST\r
60  *   21: BARRIER_REPLY\r
61  *   22: QUEUE_GET_CONFIG_REQUEST\r
62  *   23: QUEUE_GET_CONFIG_REPLY\r
63  *   24: ROLE_REQUEST\r
64  *   25: ROLE_REPLY    \r
65  *   26: GET_ASYNC_REQUEST\r
66  *   27: GET_ASYNC_REPLY\r
67  *   28: SET_ASYNC\r
68  *   29: METER_MOD\r
69  *   </pre>\r
70  */\r
71 public class DecoderTable {\r
72     \r
73     private static final short OF10 = EncodeConstants.OF10_VERSION_ID;\r
74     private static final short OF13 = EncodeConstants.OF13_VERSION_ID;\r
75     private Map<MessageTypeCodeKey, OFDeserializer<?>> table;\r
76     private static DecoderTable instance;\r
77     \r
78     \r
79     private DecoderTable() {\r
80         // do nothing\r
81     }\r
82     \r
83     /**\r
84      * @return singleton instance\r
85      */\r
86     public static synchronized DecoderTable getInstance() {\r
87         if (instance == null) {\r
88             instance = new DecoderTable();\r
89             instance.init();\r
90         }\r
91         return instance;\r
92     }\r
93     \r
94     /**\r
95      * Decoder table provisioning\r
96      */\r
97     public void init() {\r
98         table = new HashMap<>();\r
99         table.put(new MessageTypeCodeKey(OF10, (short) 0), OF10HelloMessageFactory.getInstance());\r
100         table.put(new MessageTypeCodeKey(OF10, (short) 1), OF10ErrorMessageFactory.getInstance());\r
101         table.put(new MessageTypeCodeKey(OF10, (short) 2), EchoRequestMessageFactory.getInstance());\r
102         table.put(new MessageTypeCodeKey(OF10, (short) 3), EchoReplyMessageFactory.getInstance());\r
103         table.put(new MessageTypeCodeKey(OF10, (short) 4), OF10VendorMessageFactory.getInstance());\r
104         table.put(new MessageTypeCodeKey(OF10, (short) 6), OF10FeaturesReplyMessageFactory.getInstance());\r
105         table.put(new MessageTypeCodeKey(OF10, (short) 8), GetConfigReplyMessageFactory.getInstance());\r
106         table.put(new MessageTypeCodeKey(OF10, (short) 10), OF10PacketInMessageFactory.getInstance());\r
107         table.put(new MessageTypeCodeKey(OF10, (short) 11), OF10FlowRemovedMessageFactory.getInstance());\r
108         table.put(new MessageTypeCodeKey(OF10, (short) 12), OF10PortStatusMessageFactory.getInstance());\r
109         table.put(new MessageTypeCodeKey(OF10, (short) 16), OF10StatsReplyMessageFactory.getInstance());\r
110         table.put(new MessageTypeCodeKey(OF10, (short) 18), BarrierReplyMessageFactory.getInstance());\r
111         table.put(new MessageTypeCodeKey(OF10, (short) 20), OF10QueueGetConfigReplyMessageFactory.getInstance());\r
112         table.put(new MessageTypeCodeKey(OF13, (short) 0), HelloMessageFactory.getInstance());\r
113         table.put(new MessageTypeCodeKey(OF13, (short) 1), ErrorMessageFactory.getInstance());\r
114         table.put(new MessageTypeCodeKey(OF13, (short) 2), EchoRequestMessageFactory.getInstance());\r
115         table.put(new MessageTypeCodeKey(OF13, (short) 3), EchoReplyMessageFactory.getInstance());\r
116         table.put(new MessageTypeCodeKey(OF13, (short) 4), ExperimenterMessageFactory.getInstance());\r
117         table.put(new MessageTypeCodeKey(OF13, (short) 6), FeaturesReplyMessageFactory.getInstance());\r
118         table.put(new MessageTypeCodeKey(OF13, (short) 8), GetConfigReplyMessageFactory.getInstance());\r
119         table.put(new MessageTypeCodeKey(OF13, (short) 10), PacketInMessageFactory.getInstance());\r
120         table.put(new MessageTypeCodeKey(OF13, (short) 11), FlowRemovedMessageFactory.getInstance());\r
121         table.put(new MessageTypeCodeKey(OF13, (short) 12), PortStatusMessageFactory.getInstance());\r
122         table.put(new MessageTypeCodeKey(OF13, (short) 19), MultipartReplyMessageFactory.getInstance());\r
123         table.put(new MessageTypeCodeKey(OF13, (short) 21), BarrierReplyMessageFactory.getInstance());\r
124         table.put(new MessageTypeCodeKey(OF13, (short) 23), QueueGetConfigReplyMessageFactory.getInstance());\r
125         table.put(new MessageTypeCodeKey(OF13, (short) 25), RoleReplyMessageFactory.getInstance());\r
126         table.put(new MessageTypeCodeKey(OF13, (short) 27), GetAsyncReplyMessageFactory.getInstance());\r
127     }\r
128     \r
129     /**\r
130      * @param msgTypeKey\r
131      * @return decoder for given message types\r
132      */\r
133     public OFDeserializer<?> getDecoder(MessageTypeCodeKey msgTypeKey) {\r
134         return table.get(msgTypeKey);\r
135     }\r
136 \r
137 }\r