Remove EncodeConstants.SIZE_OF_{BYTE,SHORT,INT,LONG}_IN_BYTES
[openflowplugin.git] / openflowplugin-impl / src / main / java / org / opendaylight / openflowplugin / impl / protocol / deserialization / multipart / TableFeaturesMatchFieldDeserializer.java
1 /*
2  * Copyright (c) 2017 Pantheon Technologies s.r.o. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.openflowplugin.impl.protocol.deserialization.multipart;
10
11 import com.google.common.collect.ImmutableMap;
12 import io.netty.buffer.ByteBuf;
13 import java.util.Map;
14 import java.util.Optional;
15 import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey;
16 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
17 import org.opendaylight.openflowjava.protocol.api.util.OxmMatchConstants;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.ArpOp;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.ArpSha;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.ArpSpa;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.ArpTha;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.ArpTpa;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.EthDst;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.EthSrc;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Icmpv4Code;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Icmpv4Type;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Icmpv6Code;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Icmpv6Type;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.InPhyPort;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.InPort;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.IpDscp;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.IpEcn;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.IpProto;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Ipv4Dst;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Ipv4Src;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Ipv6Dst;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Ipv6Exthdr;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Ipv6Flabel;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Ipv6NdSll;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Ipv6NdTarget;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Ipv6NdTll;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Ipv6Src;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.MatchField;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Metadata;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.MplsBos;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.MplsLabel;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.MplsTc;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.PbbIsid;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.SctpDst;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.SctpSrc;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TcpDst;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TcpFlags;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TcpSrc;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TunnelId;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.UdpDst;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.UdpSrc;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.VlanPcp;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.VlanVid;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.set.field.match.SetFieldMatch;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.set.field.match.SetFieldMatchBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.set.field.match.SetFieldMatchKey;
62 import org.opendaylight.yangtools.yang.common.Uint32;
63
64 public class TableFeaturesMatchFieldDeserializer {
65
66     /**
67      * Mapping of match entry code to match set field class.
68      */
69     private final Map<MatchEntryDeserializerKey, Class<? extends MatchField>> codeToFieldMap = ImmutableMap
70         .<MatchEntryDeserializerKey, Class<? extends MatchField>>builder()
71         .put(new MatchEntryDeserializerKey(
72                     EncodeConstants.OF13_VERSION_ID,
73                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
74                     OxmMatchConstants.ARP_OP), ArpOp.class)
75         .put(new MatchEntryDeserializerKey(
76                     EncodeConstants.OF13_VERSION_ID,
77                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
78                     OxmMatchConstants.ARP_SHA), ArpSha.class)
79         .put(new MatchEntryDeserializerKey(
80                     EncodeConstants.OF13_VERSION_ID,
81                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
82                     OxmMatchConstants.ARP_SPA), ArpSpa.class)
83         .put(new MatchEntryDeserializerKey(
84                     EncodeConstants.OF13_VERSION_ID,
85                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
86                     OxmMatchConstants.ARP_THA), ArpTha.class)
87         .put(new MatchEntryDeserializerKey(
88                     EncodeConstants.OF13_VERSION_ID,
89                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
90                     OxmMatchConstants.ARP_TPA), ArpTpa.class)
91         .put(new MatchEntryDeserializerKey(
92                     EncodeConstants.OF13_VERSION_ID,
93                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
94                     OxmMatchConstants.ETH_DST), EthDst.class)
95         .put(new MatchEntryDeserializerKey(
96                     EncodeConstants.OF13_VERSION_ID,
97                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
98                     OxmMatchConstants.ETH_SRC), EthSrc.class)
99         .put(new MatchEntryDeserializerKey(
100                     EncodeConstants.OF13_VERSION_ID,
101                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
102                     OxmMatchConstants.ICMPV4_CODE), Icmpv4Code.class)
103         .put(new MatchEntryDeserializerKey(
104                     EncodeConstants.OF13_VERSION_ID,
105                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
106                     OxmMatchConstants.ICMPV4_TYPE), Icmpv4Type.class)
107         .put(new MatchEntryDeserializerKey(
108                     EncodeConstants.OF13_VERSION_ID,
109                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
110                     OxmMatchConstants.ICMPV6_CODE), Icmpv6Code.class)
111         .put(new MatchEntryDeserializerKey(
112                     EncodeConstants.OF13_VERSION_ID,
113                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
114                     OxmMatchConstants.ICMPV6_TYPE), Icmpv6Type.class)
115         .put(new MatchEntryDeserializerKey(
116                     EncodeConstants.OF13_VERSION_ID,
117                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
118                     OxmMatchConstants.IN_PHY_PORT), InPhyPort.class)
119         .put(new MatchEntryDeserializerKey(
120                     EncodeConstants.OF13_VERSION_ID,
121                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
122                     OxmMatchConstants.IN_PORT), InPort.class)
123         .put(new MatchEntryDeserializerKey(
124                     EncodeConstants.OF13_VERSION_ID,
125                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
126                     OxmMatchConstants.IP_DSCP), IpDscp.class)
127         .put(new MatchEntryDeserializerKey(
128                     EncodeConstants.OF13_VERSION_ID,
129                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
130                     OxmMatchConstants.IP_ECN), IpEcn.class)
131         .put(new MatchEntryDeserializerKey(
132                     EncodeConstants.OF13_VERSION_ID,
133                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
134                     OxmMatchConstants.IP_PROTO), IpProto.class)
135         .put(new MatchEntryDeserializerKey(
136                     EncodeConstants.OF13_VERSION_ID,
137                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
138                     OxmMatchConstants.IPV4_DST), Ipv4Dst.class)
139         .put(new MatchEntryDeserializerKey(
140                     EncodeConstants.OF13_VERSION_ID,
141                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
142                     OxmMatchConstants.IPV4_SRC), Ipv4Src.class)
143         .put(new MatchEntryDeserializerKey(
144                     EncodeConstants.OF13_VERSION_ID,
145                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
146                     OxmMatchConstants.IPV6_DST), Ipv6Dst.class)
147         .put(new MatchEntryDeserializerKey(
148                     EncodeConstants.OF13_VERSION_ID,
149                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
150                     OxmMatchConstants.IPV6_SRC), Ipv6Src.class)
151         .put(new MatchEntryDeserializerKey(
152                     EncodeConstants.OF13_VERSION_ID,
153                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
154                     OxmMatchConstants.IPV6_EXTHDR), Ipv6Exthdr.class)
155         .put(new MatchEntryDeserializerKey(
156                     EncodeConstants.OF13_VERSION_ID,
157                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
158                     OxmMatchConstants.IPV6_FLABEL), Ipv6Flabel.class)
159         .put(new MatchEntryDeserializerKey(
160                     EncodeConstants.OF13_VERSION_ID,
161                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
162                     OxmMatchConstants.IPV6_ND_SLL), Ipv6NdSll.class)
163         .put(new MatchEntryDeserializerKey(
164                     EncodeConstants.OF13_VERSION_ID,
165                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
166                     OxmMatchConstants.IPV6_ND_TLL), Ipv6NdTll.class)
167         .put(new MatchEntryDeserializerKey(
168                     EncodeConstants.OF13_VERSION_ID,
169                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
170                     OxmMatchConstants.IPV6_ND_TARGET), Ipv6NdTarget.class)
171         .put(new MatchEntryDeserializerKey(
172                     EncodeConstants.OF13_VERSION_ID,
173                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
174                     OxmMatchConstants.METADATA), Metadata.class)
175         .put(new MatchEntryDeserializerKey(
176                     EncodeConstants.OF13_VERSION_ID,
177                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
178                     OxmMatchConstants.MPLS_BOS), MplsBos.class)
179         .put(new MatchEntryDeserializerKey(
180                     EncodeConstants.OF13_VERSION_ID,
181                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
182                     OxmMatchConstants.MPLS_LABEL), MplsLabel.class)
183         .put(new MatchEntryDeserializerKey(
184                     EncodeConstants.OF13_VERSION_ID,
185                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
186                     OxmMatchConstants.MPLS_TC), MplsTc.class)
187         .put(new MatchEntryDeserializerKey(
188                     EncodeConstants.OF13_VERSION_ID,
189                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
190                     OxmMatchConstants.PBB_ISID), PbbIsid.class)
191         .put(new MatchEntryDeserializerKey(
192                     EncodeConstants.OF13_VERSION_ID,
193                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
194                     OxmMatchConstants.SCTP_DST), SctpDst.class)
195         .put(new MatchEntryDeserializerKey(
196                     EncodeConstants.OF13_VERSION_ID,
197                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
198                     OxmMatchConstants.SCTP_SRC), SctpSrc.class)
199         .put(new MatchEntryDeserializerKey(
200                     EncodeConstants.OF13_VERSION_ID,
201                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
202                     OxmMatchConstants.TCP_SRC), TcpSrc.class)
203         .put(new MatchEntryDeserializerKey(
204                     EncodeConstants.OF13_VERSION_ID,
205                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
206                     OxmMatchConstants.TCP_DST), TcpDst.class)
207         .put(new MatchEntryDeserializerKey(
208                     EncodeConstants.OF13_VERSION_ID,
209                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
210                     OxmMatchConstants.TUNNEL_ID), TunnelId.class)
211         .put(new MatchEntryDeserializerKey(
212                     EncodeConstants.OF13_VERSION_ID,
213                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
214                     OxmMatchConstants.UDP_SRC), UdpSrc.class)
215         .put(new MatchEntryDeserializerKey(
216                     EncodeConstants.OF13_VERSION_ID,
217                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
218                     OxmMatchConstants.UDP_DST), UdpDst.class)
219         .put(new MatchEntryDeserializerKey(
220                     EncodeConstants.OF13_VERSION_ID,
221                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
222                     OxmMatchConstants.VLAN_PCP), VlanPcp.class)
223         .put(new MatchEntryDeserializerKey(
224                     EncodeConstants.OF13_VERSION_ID,
225                     OxmMatchConstants.OPENFLOW_BASIC_CLASS,
226                     OxmMatchConstants.VLAN_VID), VlanVid.class)
227         .put(new MatchEntryDeserializerKey(
228                     EncodeConstants.OF13_VERSION_ID,
229                     OxmMatchConstants.EXPERIMENTER_CLASS,
230                     OxmMatchConstants.NXM_NX_TCP_FLAG), TcpFlags.class)
231         .build();
232
233     /**
234      * Processes match entry header and returns if it have mask, or not.
235      *
236      * @param in input buffer
237      * @return SetFieldMatchBuilder with hasMask properly set
238      */
239     protected static SetFieldMatchBuilder processHeader(final ByteBuf in) {
240         in.skipBytes(Short.BYTES); // skip oxm_class
241         boolean hasMask = (in.readUnsignedByte() & 1) != 0;
242         in.skipBytes(Byte.BYTES); // skip match entry length
243
244         return new SetFieldMatchBuilder()
245                 .setHasMask(hasMask);
246     }
247
248     /**
249      * Deserialize match field if deserializer supports it, otherwise returns empty optional.
250      *
251      * @param message input buffer
252      * @return set field match
253      */
254     public Optional<SetFieldMatch> deserialize(final ByteBuf message) {
255         int oxmClass = message.getUnsignedShort(message.readerIndex());
256         int oxmField = message.getUnsignedByte(message.readerIndex() + Short.BYTES) >>> 1;
257         Uint32 expId = null;
258
259         if (oxmClass == EncodeConstants.EXPERIMENTER_VALUE) {
260             expId = Uint32.valueOf(message.getUnsignedInt(message.readerIndex() + Short.BYTES + 2 * Byte.BYTES));
261         }
262
263         final MatchEntryDeserializerKey key =
264                 new MatchEntryDeserializerKey(EncodeConstants.OF13_VERSION_ID, oxmClass, oxmField);
265
266         key.setExperimenterId(expId);
267
268         return Optional
269                 .ofNullable(codeToFieldMap.get(key))
270                 .map(clazz -> processHeader(message)
271                         .withKey(new SetFieldMatchKey(clazz))
272                         .setMatchType(clazz)
273                         .build());
274     }
275 }