blob: f690d5d43c08e4a0a1a3cfc8b9b29e076c50e558 [file] [log] [blame]
Ray Milkeyd43fe452015-05-29 09:35:12 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2015-present Open Networking Foundation
Ray Milkeyd43fe452015-05-29 09:35:12 -07003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onosproject.codec.impl;
17
andread35f89c2015-11-23 10:02:07 -080018import com.fasterxml.jackson.databind.JsonNode;
19import com.fasterxml.jackson.databind.node.ObjectNode;
Ray Milkeyd43fe452015-05-29 09:35:12 -070020import org.onlab.packet.Ip6Address;
21import org.onlab.packet.IpPrefix;
22import org.onlab.packet.MacAddress;
23import org.onlab.packet.MplsLabel;
Hyunsun Mooncf732fb2015-08-22 21:04:23 -070024import org.onlab.packet.TpPort;
Ray Milkeyd43fe452015-05-29 09:35:12 -070025import org.onlab.packet.VlanId;
Yafit Hadar5796d972015-10-15 13:16:11 +030026import org.onlab.util.HexString;
Ray Milkeyd43fe452015-05-29 09:35:12 -070027import org.onosproject.net.ChannelSpacing;
28import org.onosproject.net.GridType;
29import org.onosproject.net.Lambda;
Yafit Hadar5796d972015-10-15 13:16:11 +030030import org.onosproject.net.OchSignalType;
31import org.onosproject.net.OduSignalId;
32import org.onosproject.net.OduSignalType;
Ray Milkeyd43fe452015-05-29 09:35:12 -070033import org.onosproject.net.PortNumber;
34import org.onosproject.net.flow.criteria.Criteria;
35import org.onosproject.net.flow.criteria.Criterion;
Frank Wang74ce2c12018-04-11 20:26:45 +080036import org.onosproject.net.flow.criteria.PiCriterion;
37import org.onosproject.net.pi.model.PiMatchFieldId;
38import org.onosproject.net.pi.model.PiMatchType;
Ray Milkeyd43fe452015-05-29 09:35:12 -070039
andread35f89c2015-11-23 10:02:07 -080040import java.util.HashMap;
41import java.util.Map;
42
43import static org.onlab.util.Tools.nullIsIllegal;
Ray Milkeyd43fe452015-05-29 09:35:12 -070044
Ray Milkeyd43fe452015-05-29 09:35:12 -070045/**
46 * Decode portion of the criterion codec.
47 */
Ray Milkey6d7968e2015-07-06 14:30:02 -070048public final class DecodeCriterionCodecHelper {
Ray Milkeyd43fe452015-05-29 09:35:12 -070049
50 private final ObjectNode json;
51
52 protected static final String MISSING_MEMBER_MESSAGE =
53 " member is required in Criterion";
54
55 private interface CriterionDecoder {
56 Criterion decodeCriterion(ObjectNode json);
57 }
58 private final Map<String, CriterionDecoder> decoderMap;
59
60 /**
61 * Creates a decode criterion codec object.
62 * Initializes the lookup map for criterion subclass decoders.
63 *
64 * @param json JSON object to decode
65 */
Ray Milkey6d7968e2015-07-06 14:30:02 -070066 public DecodeCriterionCodecHelper(ObjectNode json) {
Ray Milkeyd43fe452015-05-29 09:35:12 -070067 this.json = json;
68 decoderMap = new HashMap<>();
69
70 decoderMap.put(Criterion.Type.IN_PORT.name(), new InPortDecoder());
71 decoderMap.put(Criterion.Type.IN_PHY_PORT.name(), new InPhyPortDecoder());
72 decoderMap.put(Criterion.Type.METADATA.name(), new MetadataDecoder());
73 decoderMap.put(Criterion.Type.ETH_DST.name(), new EthDstDecoder());
Seyeon Jeong37a851c2020-02-26 12:51:03 -080074 decoderMap.put(Criterion.Type.ETH_DST_MASKED.name(), new EthDstMaskedDecoder());
Ray Milkeyd43fe452015-05-29 09:35:12 -070075 decoderMap.put(Criterion.Type.ETH_SRC.name(), new EthSrcDecoder());
76 decoderMap.put(Criterion.Type.ETH_TYPE.name(), new EthTypeDecoder());
77 decoderMap.put(Criterion.Type.VLAN_VID.name(), new VlanVidDecoder());
78 decoderMap.put(Criterion.Type.VLAN_PCP.name(), new VlanPcpDecoder());
alshabibfa0dc662016-01-13 11:23:53 -080079 decoderMap.put(Criterion.Type.INNER_VLAN_VID.name(), new InnerVlanVidDecoder());
80 decoderMap.put(Criterion.Type.INNER_VLAN_PCP.name(), new InnerVlanPcpDecoder());
Ray Milkeyd43fe452015-05-29 09:35:12 -070081 decoderMap.put(Criterion.Type.IP_DSCP.name(), new IpDscpDecoder());
82 decoderMap.put(Criterion.Type.IP_ECN.name(), new IpEcnDecoder());
83 decoderMap.put(Criterion.Type.IP_PROTO.name(), new IpProtoDecoder());
84 decoderMap.put(Criterion.Type.IPV4_SRC.name(), new IpV4SrcDecoder());
85 decoderMap.put(Criterion.Type.IPV4_DST.name(), new IpV4DstDecoder());
86 decoderMap.put(Criterion.Type.TCP_SRC.name(), new TcpSrcDecoder());
Andreas Gilbert5e959612017-12-20 10:30:18 +010087 decoderMap.put(Criterion.Type.TCP_SRC_MASKED.name(), new TcpSrcMaskDecoder());
Ray Milkeyd43fe452015-05-29 09:35:12 -070088 decoderMap.put(Criterion.Type.TCP_DST.name(), new TcpDstDecoder());
Andreas Gilbert5e959612017-12-20 10:30:18 +010089 decoderMap.put(Criterion.Type.TCP_DST_MASKED.name(), new TcpDstMaskDecoder());
Ray Milkeyd43fe452015-05-29 09:35:12 -070090 decoderMap.put(Criterion.Type.UDP_SRC.name(), new UdpSrcDecoder());
Andreas Gilbert5e959612017-12-20 10:30:18 +010091 decoderMap.put(Criterion.Type.UDP_SRC_MASKED.name(), new UdpSrcMaskDecoder());
Ray Milkeyd43fe452015-05-29 09:35:12 -070092 decoderMap.put(Criterion.Type.UDP_DST.name(), new UdpDstDecoder());
Andreas Gilbert5e959612017-12-20 10:30:18 +010093 decoderMap.put(Criterion.Type.UDP_DST_MASKED.name(), new UdpDstMaskDecoder());
Ray Milkeyd43fe452015-05-29 09:35:12 -070094 decoderMap.put(Criterion.Type.SCTP_SRC.name(), new SctpSrcDecoder());
Andreas Gilbert5e959612017-12-20 10:30:18 +010095 decoderMap.put(Criterion.Type.SCTP_SRC_MASKED.name(), new SctpSrcMaskDecoder());
Ray Milkeyd43fe452015-05-29 09:35:12 -070096 decoderMap.put(Criterion.Type.SCTP_DST.name(), new SctpDstDecoder());
Andreas Gilbert5e959612017-12-20 10:30:18 +010097 decoderMap.put(Criterion.Type.SCTP_DST_MASKED.name(), new SctpDstMaskDecoder());
Ray Milkeyd43fe452015-05-29 09:35:12 -070098 decoderMap.put(Criterion.Type.ICMPV4_TYPE.name(), new IcmpV4TypeDecoder());
99 decoderMap.put(Criterion.Type.ICMPV4_CODE.name(), new IcmpV4CodeDecoder());
100 decoderMap.put(Criterion.Type.IPV6_SRC.name(), new IpV6SrcDecoder());
101 decoderMap.put(Criterion.Type.IPV6_DST.name(), new IpV6DstDecoder());
102 decoderMap.put(Criterion.Type.IPV6_FLABEL.name(), new IpV6FLabelDecoder());
103 decoderMap.put(Criterion.Type.ICMPV6_TYPE.name(), new IcmpV6TypeDecoder());
104 decoderMap.put(Criterion.Type.ICMPV6_CODE.name(), new IcmpV6CodeDecoder());
105 decoderMap.put(Criterion.Type.IPV6_ND_TARGET.name(), new V6NDTargetDecoder());
106 decoderMap.put(Criterion.Type.IPV6_ND_SLL.name(), new V6NDSllDecoder());
107 decoderMap.put(Criterion.Type.IPV6_ND_TLL.name(), new V6NDTllDecoder());
108 decoderMap.put(Criterion.Type.MPLS_LABEL.name(), new MplsLabelDecoder());
Jonathan Hartcc962d82016-08-09 16:52:22 -0700109 decoderMap.put(Criterion.Type.MPLS_BOS.name(), new MplsBosDecoder());
Ray Milkeyd43fe452015-05-29 09:35:12 -0700110 decoderMap.put(Criterion.Type.IPV6_EXTHDR.name(), new IpV6ExthdrDecoder());
111 decoderMap.put(Criterion.Type.OCH_SIGID.name(), new OchSigIdDecoder());
112 decoderMap.put(Criterion.Type.OCH_SIGTYPE.name(), new OchSigTypeDecoder());
Hyunsun Moon7080a0d2015-08-14 19:18:48 -0700113 decoderMap.put(Criterion.Type.TUNNEL_ID.name(), new TunnelIdDecoder());
Yafit Hadar5796d972015-10-15 13:16:11 +0300114 decoderMap.put(Criterion.Type.ODU_SIGID.name(), new OduSigIdDecoder());
115 decoderMap.put(Criterion.Type.ODU_SIGTYPE.name(), new OduSigTypeDecoder());
Frank Wang74ce2c12018-04-11 20:26:45 +0800116 decoderMap.put(Criterion.Type.PROTOCOL_INDEPENDENT.name(), new PiDecoder());
Ray Milkeyd43fe452015-05-29 09:35:12 -0700117 }
118
119 private class EthTypeDecoder implements CriterionDecoder {
120 @Override
121 public Criterion decodeCriterion(ObjectNode json) {
Ray Milkeyfe447c52016-02-24 14:17:54 -0800122 JsonNode ethTypeNode = nullIsIllegal(json.get(CriterionCodec.ETH_TYPE),
123 CriterionCodec.ETH_TYPE + MISSING_MEMBER_MESSAGE);
andread35f89c2015-11-23 10:02:07 -0800124 int ethType;
Ray Milkeyfe447c52016-02-24 14:17:54 -0800125 if (ethTypeNode.isInt()) {
126 ethType = ethTypeNode.asInt();
andread35f89c2015-11-23 10:02:07 -0800127 } else {
Ray Milkeyfe447c52016-02-24 14:17:54 -0800128 ethType = Integer.decode(ethTypeNode.textValue());
andread35f89c2015-11-23 10:02:07 -0800129 }
Ray Milkeyd43fe452015-05-29 09:35:12 -0700130 return Criteria.matchEthType(ethType);
131 }
132 }
Ray Milkeyd43fe452015-05-29 09:35:12 -0700133 private class EthDstDecoder implements CriterionDecoder {
134 @Override
135 public Criterion decodeCriterion(ObjectNode json) {
136 MacAddress mac = MacAddress.valueOf(nullIsIllegal(json.get(CriterionCodec.MAC),
137 CriterionCodec.MAC + MISSING_MEMBER_MESSAGE).asText());
138
139 return Criteria.matchEthDst(mac);
140 }
141 }
Seyeon Jeong37a851c2020-02-26 12:51:03 -0800142 private class EthDstMaskedDecoder implements CriterionDecoder {
143 @Override
144 public Criterion decodeCriterion(ObjectNode json) {
145 MacAddress mac = MacAddress.valueOf(nullIsIllegal(json.get(CriterionCodec.MAC),
146 CriterionCodec.MAC + MISSING_MEMBER_MESSAGE).asText());
147 MacAddress macMask = MacAddress.valueOf(nullIsIllegal(json.get(CriterionCodec.MAC_MASK),
148 CriterionCodec.MAC + MISSING_MEMBER_MESSAGE).asText());
149 return Criteria.matchEthDstMasked(mac, macMask);
150 }
151 }
Ray Milkeyd43fe452015-05-29 09:35:12 -0700152 private class EthSrcDecoder implements CriterionDecoder {
153 @Override
154 public Criterion decodeCriterion(ObjectNode json) {
155 MacAddress mac = MacAddress.valueOf(nullIsIllegal(json.get(CriterionCodec.MAC),
156 CriterionCodec.MAC + MISSING_MEMBER_MESSAGE).asText());
157
158 return Criteria.matchEthSrc(mac);
159 }
160 }
161
162 private class InPortDecoder implements CriterionDecoder {
163 @Override
164 public Criterion decodeCriterion(ObjectNode json) {
165 PortNumber port = PortNumber.portNumber(nullIsIllegal(json.get(CriterionCodec.PORT),
alshabibfa0dc662016-01-13 11:23:53 -0800166 CriterionCodec.PORT +
167 MISSING_MEMBER_MESSAGE).asLong());
Ray Milkeyd43fe452015-05-29 09:35:12 -0700168
169 return Criteria.matchInPort(port);
170 }
171 }
172
173 private class InPhyPortDecoder implements CriterionDecoder {
174 @Override
175 public Criterion decodeCriterion(ObjectNode json) {
176 PortNumber port = PortNumber.portNumber(nullIsIllegal(json.get(CriterionCodec.PORT),
alshabibfa0dc662016-01-13 11:23:53 -0800177 CriterionCodec.PORT +
178 MISSING_MEMBER_MESSAGE).asLong());
Ray Milkeyd43fe452015-05-29 09:35:12 -0700179
180 return Criteria.matchInPhyPort(port);
181 }
182 }
183
184 private class MetadataDecoder implements CriterionDecoder {
185 @Override
186 public Criterion decodeCriterion(ObjectNode json) {
187 long metadata = nullIsIllegal(json.get(CriterionCodec.METADATA),
188 CriterionCodec.METADATA + MISSING_MEMBER_MESSAGE).asLong();
189
190 return Criteria.matchMetadata(metadata);
191 }
192 }
193
194 private class VlanVidDecoder implements CriterionDecoder {
195 @Override
196 public Criterion decodeCriterion(ObjectNode json) {
197 short vlanId = (short) nullIsIllegal(json.get(CriterionCodec.VLAN_ID),
198 CriterionCodec.VLAN_ID + MISSING_MEMBER_MESSAGE).asInt();
199
200 return Criteria.matchVlanId(VlanId.vlanId(vlanId));
201 }
202 }
203
204 private class VlanPcpDecoder implements CriterionDecoder {
205 @Override
206 public Criterion decodeCriterion(ObjectNode json) {
207 byte priority = (byte) nullIsIllegal(json.get(CriterionCodec.PRIORITY),
alshabibfa0dc662016-01-13 11:23:53 -0800208 CriterionCodec.PRIORITY + MISSING_MEMBER_MESSAGE).asInt();
Ray Milkeyd43fe452015-05-29 09:35:12 -0700209
210 return Criteria.matchVlanPcp(priority);
211 }
212 }
213
alshabibfa0dc662016-01-13 11:23:53 -0800214 private class InnerVlanVidDecoder implements CriterionDecoder {
215 @Override
216 public Criterion decodeCriterion(ObjectNode json) {
217 short vlanId = (short) nullIsIllegal(json.get(CriterionCodec.INNER_VLAN_ID),
218 CriterionCodec.INNER_VLAN_ID +
219 MISSING_MEMBER_MESSAGE).asInt();
220
221 return Criteria.matchInnerVlanId(VlanId.vlanId(vlanId));
222 }
223 }
224
225 private class InnerVlanPcpDecoder implements CriterionDecoder {
226 @Override
227 public Criterion decodeCriterion(ObjectNode json) {
228 byte priority = (byte) nullIsIllegal(json.get(CriterionCodec.INNER_PRIORITY),
229 CriterionCodec.INNER_PRIORITY +
230 MISSING_MEMBER_MESSAGE).asInt();
231
232 return Criteria.matchInnerVlanPcp(priority);
233 }
234 }
235
Ray Milkeyd43fe452015-05-29 09:35:12 -0700236 private class IpDscpDecoder implements CriterionDecoder {
237 @Override
238 public Criterion decodeCriterion(ObjectNode json) {
239 byte ipDscp = (byte) nullIsIllegal(json.get(CriterionCodec.IP_DSCP),
240 CriterionCodec.IP_DSCP + MISSING_MEMBER_MESSAGE).asInt();
241 return Criteria.matchIPDscp(ipDscp);
242 }
243 }
244
245 private class IpEcnDecoder implements CriterionDecoder {
246 @Override
247 public Criterion decodeCriterion(ObjectNode json) {
248 byte ipEcn = (byte) nullIsIllegal(json.get(CriterionCodec.IP_ECN),
249 CriterionCodec.IP_ECN + MISSING_MEMBER_MESSAGE).asInt();
250 return Criteria.matchIPEcn(ipEcn);
251 }
252 }
253
254 private class IpProtoDecoder implements CriterionDecoder {
255 @Override
256 public Criterion decodeCriterion(ObjectNode json) {
257 short proto = (short) nullIsIllegal(json.get(CriterionCodec.PROTOCOL),
258 CriterionCodec.PROTOCOL + MISSING_MEMBER_MESSAGE).asInt();
259 return Criteria.matchIPProtocol(proto);
260 }
261 }
262
263 private class IpV4SrcDecoder implements CriterionDecoder {
264 @Override
265 public Criterion decodeCriterion(ObjectNode json) {
266 String ip = nullIsIllegal(json.get(CriterionCodec.IP),
267 CriterionCodec.IP + MISSING_MEMBER_MESSAGE).asText();
268 return Criteria.matchIPSrc(IpPrefix.valueOf(ip));
269 }
270 }
271
272 private class IpV4DstDecoder implements CriterionDecoder {
273 @Override
274 public Criterion decodeCriterion(ObjectNode json) {
275 String ip = nullIsIllegal(json.get(CriterionCodec.IP),
276 CriterionCodec.IP + MISSING_MEMBER_MESSAGE).asText();
277 return Criteria.matchIPDst(IpPrefix.valueOf(ip));
278 }
279 }
280
281 private class IpV6SrcDecoder implements CriterionDecoder {
282 @Override
283 public Criterion decodeCriterion(ObjectNode json) {
284 String ip = nullIsIllegal(json.get(CriterionCodec.IP),
285 CriterionCodec.IP + MISSING_MEMBER_MESSAGE).asText();
286 return Criteria.matchIPv6Src(IpPrefix.valueOf(ip));
287 }
288 }
289
290 private class IpV6DstDecoder implements CriterionDecoder {
291 @Override
292 public Criterion decodeCriterion(ObjectNode json) {
293 String ip = nullIsIllegal(json.get(CriterionCodec.IP),
294 CriterionCodec.IP + MISSING_MEMBER_MESSAGE).asText();
295 return Criteria.matchIPv6Dst(IpPrefix.valueOf(ip));
296 }
297 }
298
299 private class TcpSrcDecoder implements CriterionDecoder {
300 @Override
301 public Criterion decodeCriterion(ObjectNode json) {
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700302 TpPort tcpPort = TpPort.tpPort(nullIsIllegal(json.get(CriterionCodec.TCP_PORT),
303 CriterionCodec.TCP_PORT + MISSING_MEMBER_MESSAGE).asInt());
Ray Milkeyd43fe452015-05-29 09:35:12 -0700304 return Criteria.matchTcpSrc(tcpPort);
305 }
306 }
307
Andreas Gilbert5e959612017-12-20 10:30:18 +0100308 private class TcpSrcMaskDecoder implements CriterionDecoder {
309 @Override
310 public Criterion decodeCriterion(ObjectNode json) {
311 TpPort tcpPort = TpPort.tpPort(nullIsIllegal(json.get(CriterionCodec.TCP_PORT),
312 CriterionCodec.TCP_PORT + MISSING_MEMBER_MESSAGE).asInt());
313
314 TpPort tcpMask = TpPort.tpPort(nullIsIllegal(json.get(CriterionCodec.TCP_MASK),
315 CriterionCodec.TCP_MASK + MISSING_MEMBER_MESSAGE).asInt());
316
317 return Criteria.matchTcpSrcMasked(tcpPort, tcpMask);
318 }
319 }
320
Ray Milkeyd43fe452015-05-29 09:35:12 -0700321 private class TcpDstDecoder implements CriterionDecoder {
322 @Override
323 public Criterion decodeCriterion(ObjectNode json) {
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700324 TpPort tcpPort = TpPort.tpPort(nullIsIllegal(json.get(CriterionCodec.TCP_PORT),
325 CriterionCodec.TCP_PORT + MISSING_MEMBER_MESSAGE).asInt());
Ray Milkeyd43fe452015-05-29 09:35:12 -0700326 return Criteria.matchTcpDst(tcpPort);
327 }
328 }
329
Andreas Gilbert5e959612017-12-20 10:30:18 +0100330 private class TcpDstMaskDecoder implements CriterionDecoder {
331 @Override
332 public Criterion decodeCriterion(ObjectNode json) {
333 TpPort tcpPort = TpPort.tpPort(nullIsIllegal(json.get(CriterionCodec.TCP_PORT),
334 CriterionCodec.TCP_PORT + MISSING_MEMBER_MESSAGE).asInt());
335
336 TpPort tcpMask = TpPort.tpPort(nullIsIllegal(json.get(CriterionCodec.TCP_MASK),
337 CriterionCodec.TCP_MASK + MISSING_MEMBER_MESSAGE).asInt());
338
339 return Criteria.matchTcpDstMasked(tcpPort, tcpMask);
340 }
341 }
342
Ray Milkeyd43fe452015-05-29 09:35:12 -0700343 private class UdpSrcDecoder implements CriterionDecoder {
344 @Override
345 public Criterion decodeCriterion(ObjectNode json) {
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700346 TpPort udpPort = TpPort.tpPort(nullIsIllegal(json.get(CriterionCodec.UDP_PORT),
347 CriterionCodec.UDP_PORT + MISSING_MEMBER_MESSAGE).asInt());
Ray Milkeyd43fe452015-05-29 09:35:12 -0700348 return Criteria.matchUdpSrc(udpPort);
349 }
350 }
351
Andreas Gilbert5e959612017-12-20 10:30:18 +0100352 private class UdpSrcMaskDecoder implements CriterionDecoder {
353 @Override
354 public Criterion decodeCriterion(ObjectNode json) {
355 TpPort udpPort = TpPort.tpPort(nullIsIllegal(json.get(CriterionCodec.UDP_PORT),
356 CriterionCodec.UDP_PORT + MISSING_MEMBER_MESSAGE).asInt());
357
358 TpPort udpMask = TpPort.tpPort(nullIsIllegal(json.get(CriterionCodec.UDP_MASK),
359 CriterionCodec.UDP_MASK + MISSING_MEMBER_MESSAGE).asInt());
360
361 return Criteria.matchUdpSrcMasked(udpPort, udpMask);
362 }
363 }
364
Ray Milkeyd43fe452015-05-29 09:35:12 -0700365 private class UdpDstDecoder implements CriterionDecoder {
366 @Override
367 public Criterion decodeCriterion(ObjectNode json) {
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700368 TpPort udpPort = TpPort.tpPort(nullIsIllegal(json.get(CriterionCodec.UDP_PORT),
369 CriterionCodec.UDP_PORT + MISSING_MEMBER_MESSAGE).asInt());
Ray Milkeyd43fe452015-05-29 09:35:12 -0700370 return Criteria.matchUdpDst(udpPort);
371 }
372 }
373
Andreas Gilbert5e959612017-12-20 10:30:18 +0100374 private class UdpDstMaskDecoder implements CriterionDecoder {
375 @Override
376 public Criterion decodeCriterion(ObjectNode json) {
377 TpPort udpPort = TpPort.tpPort(nullIsIllegal(json.get(CriterionCodec.UDP_PORT),
378 CriterionCodec.UDP_PORT + MISSING_MEMBER_MESSAGE).asInt());
379
380 TpPort udpMask = TpPort.tpPort(nullIsIllegal(json.get(CriterionCodec.UDP_MASK),
381 CriterionCodec.UDP_MASK + MISSING_MEMBER_MESSAGE).asInt());
382
383 return Criteria.matchUdpDstMasked(udpPort, udpMask);
384 }
385 }
386
Ray Milkeyd43fe452015-05-29 09:35:12 -0700387 private class SctpSrcDecoder implements CriterionDecoder {
388 @Override
389 public Criterion decodeCriterion(ObjectNode json) {
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700390 TpPort sctpPort = TpPort.tpPort(nullIsIllegal(json.get(CriterionCodec.SCTP_PORT),
391 CriterionCodec.SCTP_PORT + MISSING_MEMBER_MESSAGE).asInt());
Ray Milkeyd43fe452015-05-29 09:35:12 -0700392 return Criteria.matchSctpSrc(sctpPort);
393 }
394 }
395
Andreas Gilbert5e959612017-12-20 10:30:18 +0100396 private class SctpSrcMaskDecoder implements CriterionDecoder {
397 @Override
398 public Criterion decodeCriterion(ObjectNode json) {
399 TpPort sctpPort = TpPort.tpPort(nullIsIllegal(json.get(CriterionCodec.SCTP_PORT),
400 CriterionCodec.SCTP_PORT + MISSING_MEMBER_MESSAGE).asInt());
401
402 TpPort sctpMask = TpPort.tpPort(nullIsIllegal(json.get(CriterionCodec.SCTP_MASK),
403 CriterionCodec.SCTP_MASK + MISSING_MEMBER_MESSAGE).asInt());
404
405 return Criteria.matchSctpSrcMasked(sctpPort, sctpMask);
406 }
407 }
408
Ray Milkeyd43fe452015-05-29 09:35:12 -0700409 private class SctpDstDecoder implements CriterionDecoder {
410 @Override
411 public Criterion decodeCriterion(ObjectNode json) {
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700412 TpPort sctpPort = TpPort.tpPort(nullIsIllegal(json.get(CriterionCodec.SCTP_PORT),
413 CriterionCodec.SCTP_PORT + MISSING_MEMBER_MESSAGE).asInt());
Ray Milkeyd43fe452015-05-29 09:35:12 -0700414 return Criteria.matchSctpDst(sctpPort);
415 }
416 }
417
Andreas Gilbert5e959612017-12-20 10:30:18 +0100418 private class SctpDstMaskDecoder implements CriterionDecoder {
419 @Override
420 public Criterion decodeCriterion(ObjectNode json) {
421 TpPort sctpPort = TpPort.tpPort(nullIsIllegal(json.get(CriterionCodec.SCTP_PORT),
422 CriterionCodec.SCTP_PORT + MISSING_MEMBER_MESSAGE).asInt());
423
424 TpPort sctpMask = TpPort.tpPort(nullIsIllegal(json.get(CriterionCodec.SCTP_MASK),
425 CriterionCodec.SCTP_MASK + MISSING_MEMBER_MESSAGE).asInt());
426
427 return Criteria.matchSctpDstMasked(sctpPort, sctpMask);
428 }
429 }
430
Ray Milkeyd43fe452015-05-29 09:35:12 -0700431 private class IcmpV4TypeDecoder implements CriterionDecoder {
432 @Override
433 public Criterion decodeCriterion(ObjectNode json) {
434 short type = (short) nullIsIllegal(json.get(CriterionCodec.ICMP_TYPE),
435 CriterionCodec.ICMP_TYPE + MISSING_MEMBER_MESSAGE).asInt();
436 return Criteria.matchIcmpType(type);
437 }
438 }
439
440 private class IcmpV4CodeDecoder implements CriterionDecoder {
441 @Override
442 public Criterion decodeCriterion(ObjectNode json) {
443 short code = (short) nullIsIllegal(json.get(CriterionCodec.ICMP_CODE),
444 CriterionCodec.ICMP_CODE + MISSING_MEMBER_MESSAGE).asInt();
445 return Criteria.matchIcmpCode(code);
446 }
447 }
448
449 private class IpV6FLabelDecoder implements CriterionDecoder {
450 @Override
451 public Criterion decodeCriterion(ObjectNode json) {
452 int flowLabel = nullIsIllegal(json.get(CriterionCodec.FLOW_LABEL),
453 CriterionCodec.FLOW_LABEL + MISSING_MEMBER_MESSAGE).asInt();
454 return Criteria.matchIPv6FlowLabel(flowLabel);
455 }
456 }
457
458 private class IcmpV6TypeDecoder implements CriterionDecoder {
459 @Override
460 public Criterion decodeCriterion(ObjectNode json) {
461 short type = (short) nullIsIllegal(json.get(CriterionCodec.ICMPV6_TYPE),
462 CriterionCodec.ICMPV6_TYPE + MISSING_MEMBER_MESSAGE).asInt();
463 return Criteria.matchIcmpv6Type(type);
464 }
465 }
466
467 private class IcmpV6CodeDecoder implements CriterionDecoder {
468 @Override
469 public Criterion decodeCriterion(ObjectNode json) {
470 short code = (short) nullIsIllegal(json.get(CriterionCodec.ICMPV6_CODE),
471 CriterionCodec.ICMPV6_CODE + MISSING_MEMBER_MESSAGE).asInt();
472 return Criteria.matchIcmpv6Code(code);
473 }
474 }
475
476 private class V6NDTargetDecoder implements CriterionDecoder {
477 @Override
478 public Criterion decodeCriterion(ObjectNode json) {
479 Ip6Address target = Ip6Address.valueOf(nullIsIllegal(json.get(CriterionCodec.TARGET_ADDRESS),
480 CriterionCodec.TARGET_ADDRESS + MISSING_MEMBER_MESSAGE).asText());
481 return Criteria.matchIPv6NDTargetAddress(target);
482 }
483 }
484
485 private class V6NDSllDecoder implements CriterionDecoder {
486 @Override
487 public Criterion decodeCriterion(ObjectNode json) {
488 MacAddress mac = MacAddress.valueOf(nullIsIllegal(json.get(CriterionCodec.MAC),
489 CriterionCodec.MAC + MISSING_MEMBER_MESSAGE).asText());
490 return Criteria.matchIPv6NDSourceLinkLayerAddress(mac);
491 }
492 }
493
494 private class V6NDTllDecoder implements CriterionDecoder {
495 @Override
496 public Criterion decodeCriterion(ObjectNode json) {
497 MacAddress mac = MacAddress.valueOf(nullIsIllegal(json.get(CriterionCodec.MAC),
498 CriterionCodec.MAC + MISSING_MEMBER_MESSAGE).asText());
499 return Criteria.matchIPv6NDTargetLinkLayerAddress(mac);
500 }
501 }
502
503 private class MplsLabelDecoder implements CriterionDecoder {
504 @Override
505 public Criterion decodeCriterion(ObjectNode json) {
506 int label = nullIsIllegal(json.get(CriterionCodec.LABEL),
507 CriterionCodec.LABEL + MISSING_MEMBER_MESSAGE).asInt();
508 return Criteria.matchMplsLabel(MplsLabel.mplsLabel(label));
509 }
510 }
511
Jonathan Hartcc962d82016-08-09 16:52:22 -0700512 private class MplsBosDecoder implements CriterionDecoder {
513 @Override
514 public Criterion decodeCriterion(ObjectNode json) {
515 boolean bos = nullIsIllegal(json.get(CriterionCodec.BOS),
516 CriterionCodec.BOS + MISSING_MEMBER_MESSAGE).asBoolean();
517 return Criteria.matchMplsBos(bos);
518 }
519 }
520
Ray Milkeyd43fe452015-05-29 09:35:12 -0700521 private class IpV6ExthdrDecoder implements CriterionDecoder {
522 @Override
523 public Criterion decodeCriterion(ObjectNode json) {
524 int exthdrFlags = nullIsIllegal(json.get(CriterionCodec.EXT_HDR_FLAGS),
525 CriterionCodec.EXT_HDR_FLAGS + MISSING_MEMBER_MESSAGE).asInt();
526 return Criteria.matchIPv6ExthdrFlags(exthdrFlags);
527 }
528 }
529
530 private class OchSigIdDecoder implements CriterionDecoder {
531 @Override
532 public Criterion decodeCriterion(ObjectNode json) {
Sho SHIMIZUcc137a92016-03-11 15:10:54 -0800533 JsonNode ochSignalId = nullIsIllegal(json.get(CriterionCodec.OCH_SIGNAL_ID),
534 CriterionCodec.GRID_TYPE + MISSING_MEMBER_MESSAGE);
535 GridType gridType =
536 GridType.valueOf(
537 nullIsIllegal(ochSignalId.get(CriterionCodec.GRID_TYPE),
538 CriterionCodec.GRID_TYPE + MISSING_MEMBER_MESSAGE).asText());
539 ChannelSpacing channelSpacing =
540 ChannelSpacing.valueOf(
541 nullIsIllegal(ochSignalId.get(CriterionCodec.CHANNEL_SPACING),
542 CriterionCodec.CHANNEL_SPACING + MISSING_MEMBER_MESSAGE).asText());
543 int spacingMultiplier = nullIsIllegal(ochSignalId.get(CriterionCodec.SPACING_MULIPLIER),
544 CriterionCodec.SPACING_MULIPLIER + MISSING_MEMBER_MESSAGE).asInt();
545 int slotGranularity = nullIsIllegal(ochSignalId.get(CriterionCodec.SLOT_GRANULARITY),
546 CriterionCodec.SLOT_GRANULARITY + MISSING_MEMBER_MESSAGE).asInt();
547 return Criteria.matchLambda(
548 Lambda.ochSignal(gridType, channelSpacing,
549 spacingMultiplier, slotGranularity));
Ray Milkeyd43fe452015-05-29 09:35:12 -0700550 }
551 }
552
553 private class OchSigTypeDecoder implements CriterionDecoder {
554 @Override
555 public Criterion decodeCriterion(ObjectNode json) {
Yafit Hadar5796d972015-10-15 13:16:11 +0300556 OchSignalType ochSignalType = OchSignalType.valueOf(nullIsIllegal(json.get(CriterionCodec.OCH_SIGNAL_TYPE),
557 CriterionCodec.OCH_SIGNAL_TYPE + MISSING_MEMBER_MESSAGE).asText());
558 return Criteria.matchOchSignalType(ochSignalType);
Ray Milkeyd43fe452015-05-29 09:35:12 -0700559 }
560 }
561
Hyunsun Moon7080a0d2015-08-14 19:18:48 -0700562 private class TunnelIdDecoder implements CriterionDecoder {
563 @Override
564 public Criterion decodeCriterion(ObjectNode json) {
565 long tunnelId = nullIsIllegal(json.get(CriterionCodec.TUNNEL_ID),
566 CriterionCodec.TUNNEL_ID + MISSING_MEMBER_MESSAGE).asLong();
567 return Criteria.matchTunnelId(tunnelId);
568 }
569 }
570
Yafit Hadar5796d972015-10-15 13:16:11 +0300571 private class OduSigIdDecoder implements CriterionDecoder {
572 @Override
573 public Criterion decodeCriterion(ObjectNode json) {
574 JsonNode oduSignalId = nullIsIllegal(json.get(CriterionCodec.ODU_SIGNAL_ID),
575 CriterionCodec.TRIBUTARY_PORT_NUMBER + MISSING_MEMBER_MESSAGE);
576
577 int tributaryPortNumber = nullIsIllegal(oduSignalId.get(CriterionCodec.TRIBUTARY_PORT_NUMBER),
578 CriterionCodec.TRIBUTARY_PORT_NUMBER + MISSING_MEMBER_MESSAGE).asInt();
579 int tributarySlotLen = nullIsIllegal(oduSignalId.get(CriterionCodec.TRIBUTARY_SLOT_LEN),
580 CriterionCodec.TRIBUTARY_SLOT_LEN + MISSING_MEMBER_MESSAGE).asInt();
581 byte[] tributarySlotBitmap = HexString.fromHexString(
582 nullIsIllegal(oduSignalId.get(CriterionCodec.TRIBUTARY_SLOT_BITMAP),
583 CriterionCodec.TRIBUTARY_SLOT_BITMAP + MISSING_MEMBER_MESSAGE).asText());
584
585 return Criteria.matchOduSignalId(
586 OduSignalId.oduSignalId(tributaryPortNumber, tributarySlotLen, tributarySlotBitmap));
587 }
588 }
589
590 private class OduSigTypeDecoder implements CriterionDecoder {
591 @Override
592 public Criterion decodeCriterion(ObjectNode json) {
593 OduSignalType oduSignalType = OduSignalType.valueOf(nullIsIllegal(json.get(CriterionCodec.ODU_SIGNAL_TYPE),
594 CriterionCodec.ODU_SIGNAL_TYPE + MISSING_MEMBER_MESSAGE).asText());
595 return Criteria.matchOduSignalType(oduSignalType);
596 }
597 }
598
Frank Wang74ce2c12018-04-11 20:26:45 +0800599 private class PiDecoder implements CriterionDecoder {
600 @Override
601 public Criterion decodeCriterion(ObjectNode json) {
602 PiCriterion.Builder builder = PiCriterion.builder();
603 JsonNode matchesNode = nullIsIllegal(json.get(CriterionCodec.PI_MATCHES),
604 CriterionCodec.PI_MATCHES + MISSING_MEMBER_MESSAGE);
605 if (matchesNode.isArray()) {
606 for (JsonNode node : matchesNode) {
607 String type = nullIsIllegal(node.get(CriterionCodec.PI_MATCH_TYPE),
608 CriterionCodec.PI_MATCH_TYPE + MISSING_MEMBER_MESSAGE).asText();
609 switch (PiMatchType.valueOf(type.toUpperCase())) {
610 case EXACT:
611 builder.matchExact(
612 PiMatchFieldId.of(
613 nullIsIllegal(node.get(CriterionCodec.PI_MATCH_FIELD_ID),
614 CriterionCodec.PI_MATCH_FIELD_ID +
615 MISSING_MEMBER_MESSAGE).asText()),
616 HexString.fromHexString(nullIsIllegal(node.get(CriterionCodec.PI_MATCH_VALUE),
617 CriterionCodec.PI_MATCH_VALUE +
618 MISSING_MEMBER_MESSAGE).asText(), null));
619 break;
620 case LPM:
621 builder.matchLpm(
622 PiMatchFieldId.of(
623 nullIsIllegal(node.get(CriterionCodec.PI_MATCH_FIELD_ID),
624 CriterionCodec.PI_MATCH_FIELD_ID +
625 MISSING_MEMBER_MESSAGE).asText()),
626 HexString.fromHexString(nullIsIllegal(node.get(CriterionCodec.PI_MATCH_VALUE),
627 CriterionCodec.PI_MATCH_VALUE +
628 MISSING_MEMBER_MESSAGE).asText(), null),
629 nullIsIllegal(node.get(CriterionCodec.PI_MATCH_PREFIX),
630 CriterionCodec.PI_MATCH_PREFIX +
631 MISSING_MEMBER_MESSAGE).asInt());
632 break;
633 case TERNARY:
634 builder.matchTernary(
635 PiMatchFieldId.of(
636 nullIsIllegal(node.get(CriterionCodec.PI_MATCH_FIELD_ID),
637 CriterionCodec.PI_MATCH_FIELD_ID +
638 MISSING_MEMBER_MESSAGE).asText()),
639 HexString.fromHexString(nullIsIllegal(node.get(CriterionCodec.PI_MATCH_VALUE),
640 CriterionCodec.PI_MATCH_VALUE +
641 MISSING_MEMBER_MESSAGE).asText(), null),
642 HexString.fromHexString(nullIsIllegal(node.get(CriterionCodec.PI_MATCH_MASK),
643 CriterionCodec.PI_MATCH_MASK +
644 MISSING_MEMBER_MESSAGE).asText(), null));
645 break;
646 case RANGE:
647 builder.matchRange(
648 PiMatchFieldId.of(
649 nullIsIllegal(node.get(CriterionCodec.PI_MATCH_FIELD_ID),
650 CriterionCodec.PI_MATCH_FIELD_ID +
651 MISSING_MEMBER_MESSAGE).asText()),
652 HexString.fromHexString(nullIsIllegal(node.get(CriterionCodec.PI_MATCH_LOW_VALUE),
653 CriterionCodec.PI_MATCH_LOW_VALUE +
654 MISSING_MEMBER_MESSAGE).asText(), null),
655 HexString.fromHexString(nullIsIllegal(node.get(CriterionCodec.PI_MATCH_HIGH_VALUE),
656 CriterionCodec.PI_MATCH_HIGH_VALUE +
657 MISSING_MEMBER_MESSAGE).asText(), null)
658 );
659 break;
Frank Wang74ce2c12018-04-11 20:26:45 +0800660 default:
661 throw new IllegalArgumentException("Type " + type + " is unsupported");
662 }
663 }
664 } else {
665 throw new IllegalArgumentException("Protocol-independent matches must be in an array.");
666 }
667
668 return builder.build();
669 }
670 }
671
Ray Milkeyd43fe452015-05-29 09:35:12 -0700672 /**
673 * Decodes the JSON into a criterion object.
674 *
675 * @return Criterion object
676 * @throws IllegalArgumentException if the JSON is invalid
677 */
678 public Criterion decode() {
Ray Milkey52075062016-02-03 17:36:48 -0800679 String type =
680 nullIsIllegal(json.get(CriterionCodec.TYPE), "Type not specified")
681 .asText();
Ray Milkeyd43fe452015-05-29 09:35:12 -0700682
683 CriterionDecoder decoder = decoderMap.get(type);
684 if (decoder != null) {
685 return decoder.decodeCriterion(json);
686 }
687
688 throw new IllegalArgumentException("Type " + type + " is unknown");
689 }
690
691
692}