2 * Copyright (c) 2017 Pantheon Technologies s.r.o. and others. All rights reserved.
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
9 package org.opendaylight.openflowplugin.impl.protocol.deserialization.multipart;
11 import com.google.common.collect.ImmutableMap;
12 import io.netty.buffer.ByteBuf;
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;
64 public class TableFeaturesMatchFieldDeserializer {
67 * Mapping of match entry code to match set field class.
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)
234 * Processes match entry header and returns if it have mask, or not.
236 * @param in input buffer
237 * @return SetFieldMatchBuilder with hasMask properly set
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
244 return new SetFieldMatchBuilder()
245 .setHasMask(hasMask);
249 * Deserialize match field if deserializer supports it, otherwise returns empty optional.
251 * @param message input buffer
252 * @return set field match
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;
259 if (oxmClass == EncodeConstants.EXPERIMENTER_VALUE) {
260 expId = Uint32.valueOf(message.getUnsignedInt(message.readerIndex() + Short.BYTES + 2 * Byte.BYTES));
263 final MatchEntryDeserializerKey key =
264 new MatchEntryDeserializerKey(EncodeConstants.OF13_VERSION_ID, oxmClass, oxmField);
266 key.setExperimenterId(expId);
269 .ofNullable(codeToFieldMap.get(key))
270 .map(clazz -> processHeader(message)
271 .withKey(new SetFieldMatchKey(clazz))