Minor model refactor
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / util / MatchIdsDeserializer.java
1 /*\r
2  * Copyright (c) 2013 Pantheon Technologies s.r.o. and others.  All rights reserved.\r
3  *\r
4  * This program and the accompanying materials are made available under the\r
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
6  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
7  */\r
8 package org.opendaylight.openflowjava.protocol.impl.util;\r
9 \r
10 import io.netty.buffer.ByteBuf;\r
11 \r
12 import java.util.ArrayList;\r
13 import java.util.List;\r
14 \r
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpOp;\r
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpSha;\r
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpSpa;\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpTha;\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpTpa;\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthDst;\r
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthSrc;\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthType;\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ExperimenterClass;\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv4Code;\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv4Type;\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv6Code;\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv6Type;\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.InPhyPort;\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.InPort;\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpDscp;\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpEcn;\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpProto;\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv4Dst;\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv4Src;\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Dst;\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Exthdr;\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Flabel;\r
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6NdSll;\r
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6NdTarget;\r
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6NdTll;\r
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Src;\r
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Metadata;\r
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsBos;\r
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsLabel;\r
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsTc;\r
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm0Class;\r
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm1Class;\r
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OpenflowBasicClass;\r
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.PbbIsid;\r
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpDst;\r
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpSrc;\r
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpDst;\r
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpSrc;\r
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TunnelId;\r
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.UdpDst;\r
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.UdpSrc;\r
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.VlanPcp;\r
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.VlanVid;\r
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries;\r
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntriesBuilder;\r
61 \r
62 /**\r
63  * Encodes match ids (oxm_ids) needed in Multipart-TableFeatures messages\r
64  * @author michal.polkorab\r
65  */\r
66 public abstract class MatchIdsDeserializer {\r
67 \r
68     /** Decodes oxm ids\r
69      * @param in input ByteBuf\r
70      * @param matchLength match entries length\r
71      * @return list of match ids\r
72      */\r
73     public static List<MatchEntries> createOxmIds(ByteBuf in, int matchLength) {\r
74         List<MatchEntries> matchEntriesList = new ArrayList<>();\r
75         int currLength = 0;\r
76         while(currLength < matchLength) {\r
77             MatchEntriesBuilder matchEntriesBuilder = new MatchEntriesBuilder();\r
78             switch (in.readUnsignedShort()) {\r
79             case 0x0000:\r
80                         matchEntriesBuilder.setOxmClass(Nxm0Class.class);\r
81                         break;\r
82             case 0x0001:\r
83                         matchEntriesBuilder.setOxmClass(Nxm1Class.class);\r
84                         break;\r
85             case 0x8000:\r
86                         matchEntriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
87                         break;\r
88             case 0xFFFF:\r
89                         matchEntriesBuilder.setOxmClass(ExperimenterClass.class);\r
90                         break;\r
91             default:\r
92                         break;\r
93             }\r
94 \r
95             int fieldAndMask = in.readUnsignedByte();\r
96             boolean hasMask = (fieldAndMask & 1) != 0;\r
97             matchEntriesBuilder.setHasMask(hasMask);\r
98             int matchField =  fieldAndMask >> 1;\r
99             in.skipBytes(EncodeConstants.SIZE_OF_BYTE_IN_BYTES);\r
100             currLength += EncodeConstants.SIZE_OF_SHORT_IN_BYTES +\r
101                     (2 * EncodeConstants.SIZE_OF_BYTE_IN_BYTES);\r
102 \r
103             switch(matchField) {\r
104             case 0:\r
105                 matchEntriesBuilder.setOxmMatchField(InPort.class);\r
106                 break;\r
107             case 1:\r
108                 matchEntriesBuilder.setOxmMatchField(InPhyPort.class);\r
109                 break;\r
110             case 2:\r
111                 matchEntriesBuilder.setOxmMatchField(Metadata.class);\r
112                 break;\r
113             case 3:\r
114                 matchEntriesBuilder.setOxmMatchField(EthDst.class);\r
115                 break;\r
116             case 4:\r
117                 matchEntriesBuilder.setOxmMatchField(EthSrc.class);\r
118                 break;\r
119             case 5:\r
120                 matchEntriesBuilder.setOxmMatchField(EthType.class);\r
121                 break;\r
122             case 6:\r
123                 matchEntriesBuilder.setOxmMatchField(VlanVid.class);\r
124                 break;\r
125             case 7:\r
126                 matchEntriesBuilder.setOxmMatchField(VlanPcp.class);\r
127                 break;\r
128             case 8:\r
129                 matchEntriesBuilder.setOxmMatchField(IpDscp.class);\r
130                 break;\r
131             case 9:\r
132                 matchEntriesBuilder.setOxmMatchField(IpEcn.class);\r
133                 break;\r
134             case 10:\r
135                 matchEntriesBuilder.setOxmMatchField(IpProto.class);\r
136                 break;\r
137             case 11:\r
138                 matchEntriesBuilder.setOxmMatchField(Ipv4Src.class);\r
139                 break;\r
140             case 12:\r
141                 matchEntriesBuilder.setOxmMatchField(Ipv4Dst.class);\r
142                 break;\r
143             case 13:\r
144                 matchEntriesBuilder.setOxmMatchField(TcpSrc.class);\r
145                 break;\r
146             case 14:\r
147                 matchEntriesBuilder.setOxmMatchField(TcpDst.class);\r
148                 break;\r
149             case 15:\r
150                 matchEntriesBuilder.setOxmMatchField(UdpSrc.class);\r
151                 break;\r
152             case 16:\r
153                 matchEntriesBuilder.setOxmMatchField(UdpDst.class);\r
154                 break;\r
155             case 17:\r
156                 matchEntriesBuilder.setOxmMatchField(SctpSrc.class);\r
157                 break;\r
158             case 18:\r
159                 matchEntriesBuilder.setOxmMatchField(SctpDst.class);\r
160                 break;\r
161             case 19:\r
162                 matchEntriesBuilder.setOxmMatchField(Icmpv4Type.class);\r
163                 break;\r
164             case 20:\r
165                 matchEntriesBuilder.setOxmMatchField(Icmpv4Code.class);\r
166                 break;\r
167             case 21:\r
168                 matchEntriesBuilder.setOxmMatchField(ArpOp.class);\r
169                 break;\r
170             case 22:\r
171                 matchEntriesBuilder.setOxmMatchField(ArpSpa.class);\r
172                 break;\r
173             case 23:\r
174                 matchEntriesBuilder.setOxmMatchField(ArpTpa.class);\r
175                 break;\r
176             case 24:\r
177                 matchEntriesBuilder.setOxmMatchField(ArpSha.class);\r
178                 break;\r
179             case 25:\r
180                 matchEntriesBuilder.setOxmMatchField(ArpTha.class);\r
181                 break;\r
182             case 26:\r
183                 matchEntriesBuilder.setOxmMatchField(Ipv6Src.class);\r
184                 break;\r
185             case 27:\r
186                 matchEntriesBuilder.setOxmMatchField(Ipv6Dst.class);\r
187                 break;\r
188             case 28:\r
189                 matchEntriesBuilder.setOxmMatchField(Ipv6Flabel.class);\r
190                 break;\r
191             case 29:\r
192                 matchEntriesBuilder.setOxmMatchField(Icmpv6Type.class);\r
193                 break;\r
194             case 30:\r
195                 matchEntriesBuilder.setOxmMatchField(Icmpv6Code.class);\r
196                 break;\r
197             case 31:\r
198                 matchEntriesBuilder.setOxmMatchField(Ipv6NdTarget.class);\r
199                 break;\r
200             case 32:\r
201                 matchEntriesBuilder.setOxmMatchField(Ipv6NdSll.class);\r
202                 break;\r
203             case 33:\r
204                 matchEntriesBuilder.setOxmMatchField(Ipv6NdTll.class);\r
205                 break;\r
206             case 34:\r
207                 matchEntriesBuilder.setOxmMatchField(MplsLabel.class);\r
208                 break;\r
209             case 35:\r
210                 matchEntriesBuilder.setOxmMatchField(MplsTc.class);\r
211                 break;\r
212             case 36:\r
213                 matchEntriesBuilder.setOxmMatchField(MplsBos.class);\r
214                 break;\r
215             case 37:\r
216                 matchEntriesBuilder.setOxmMatchField(PbbIsid.class);\r
217                 break;\r
218             case 38:\r
219                 matchEntriesBuilder.setOxmMatchField(TunnelId.class);\r
220                 break;\r
221             case 39:\r
222                 matchEntriesBuilder.setOxmMatchField(Ipv6Exthdr.class);\r
223                 break;\r
224             default:\r
225                 break;\r
226             }\r
227           matchEntriesList.add(matchEntriesBuilder.build());\r
228         }\r
229         return matchEntriesList;\r
230     }\r
231 }\r