blob: 6ade434e317015137229b9d44a0e0a2687d9a90b [file] [log] [blame]
Carmelo Cascone00a59962017-06-16 17:51:49 +09001/*
2 * Copyright 2017-present Open Networking Laboratory
3 *
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 */
16
17package org.onosproject.net.pi.impl;
18
19import org.onlab.util.ImmutableByteSequence;
Carmelo Cascone3bf51572017-07-13 17:16:42 -040020import org.onosproject.net.flow.criteria.ArpHaCriterion;
21import org.onosproject.net.flow.criteria.ArpOpCriterion;
22import org.onosproject.net.flow.criteria.ArpPaCriterion;
Carmelo Cascone00a59962017-06-16 17:51:49 +090023import org.onosproject.net.flow.criteria.Criterion;
24import org.onosproject.net.flow.criteria.EthCriterion;
25import org.onosproject.net.flow.criteria.EthTypeCriterion;
26import org.onosproject.net.flow.criteria.IPCriterion;
zhiyong kef2e6a482017-07-10 20:32:20 +080027import org.onosproject.net.flow.criteria.IPDscpCriterion;
Carmelo Cascone3bf51572017-07-13 17:16:42 -040028import org.onosproject.net.flow.criteria.IPEcnCriterion;
zhiyong kef2e6a482017-07-10 20:32:20 +080029import org.onosproject.net.flow.criteria.IPProtocolCriterion;
30import org.onosproject.net.flow.criteria.IPv6ExthdrFlagsCriterion;
31import org.onosproject.net.flow.criteria.IPv6FlowLabelCriterion;
Carmelo Cascone3bf51572017-07-13 17:16:42 -040032import org.onosproject.net.flow.criteria.IPv6NDLinkLayerAddressCriterion;
33import org.onosproject.net.flow.criteria.IPv6NDTargetAddressCriterion;
zhiyong kef2e6a482017-07-10 20:32:20 +080034import org.onosproject.net.flow.criteria.IcmpCodeCriterion;
35import org.onosproject.net.flow.criteria.IcmpTypeCriterion;
36import org.onosproject.net.flow.criteria.Icmpv6CodeCriterion;
37import org.onosproject.net.flow.criteria.Icmpv6TypeCriterion;
zhiyong kef2e6a482017-07-10 20:32:20 +080038import org.onosproject.net.flow.criteria.MetadataCriterion;
39import org.onosproject.net.flow.criteria.MplsBosCriterion;
40import org.onosproject.net.flow.criteria.MplsCriterion;
41import org.onosproject.net.flow.criteria.MplsTcCriterion;
zhiyong kef2e6a482017-07-10 20:32:20 +080042import org.onosproject.net.flow.criteria.PbbIsidCriterion;
Carmelo Cascone3bf51572017-07-13 17:16:42 -040043import org.onosproject.net.flow.criteria.PortCriterion;
zhiyong kef2e6a482017-07-10 20:32:20 +080044import org.onosproject.net.flow.criteria.SctpPortCriterion;
45import org.onosproject.net.flow.criteria.TcpFlagsCriterion;
46import org.onosproject.net.flow.criteria.TcpPortCriterion;
47import org.onosproject.net.flow.criteria.TunnelIdCriterion;
Carmelo Cascone3bf51572017-07-13 17:16:42 -040048import org.onosproject.net.flow.criteria.UdpPortCriterion;
49import org.onosproject.net.flow.criteria.VlanIdCriterion;
zhiyong kef2e6a482017-07-10 20:32:20 +080050import org.onosproject.net.flow.criteria.VlanPcpCriterion;
Carmelo Cascone00a59962017-06-16 17:51:49 +090051
52import static org.onlab.util.ImmutableByteSequence.ByteSequenceTrimException;
53import static org.onlab.util.ImmutableByteSequence.copyFrom;
54
55/**
56 * Factory class of criterion translator implementations.
57 */
58final class CriterionTranslators {
59
60 /**
61 * Translator of PortCriterion.
62 */
63 static final class PortCriterionTranslator extends AbstractCriterionTranslator {
64 @Override
65 public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
66 PortCriterion c = (PortCriterion) criterion;
67 initAsExactMatch(copyFrom(c.port().toLong()), bitWidth);
68 }
69 }
70
71 /**
72 * Translator of EthTypeCriterion.
73 */
74 static final class EthTypeCriterionTranslator extends AbstractCriterionTranslator {
75 @Override
76 public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
77 EthTypeCriterion c = (EthTypeCriterion) criterion;
78 initAsExactMatch(copyFrom(c.ethType().toShort()), bitWidth);
79 }
80 }
81
82 /**
83 * Translator of EthCriterion.
84 */
85 static final class EthCriterionTranslator extends AbstractCriterionTranslator {
86 @Override
87 public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
88 EthCriterion c = (EthCriterion) criterion;
89 ImmutableByteSequence value = copyFrom(c.mac().toBytes());
90 if (c.mask() == null) {
91 initAsExactMatch(value, bitWidth);
92 } else {
93 ImmutableByteSequence mask = copyFrom(c.mask().toBytes());
94 initAsTernaryMatch(value, mask, bitWidth);
95 }
96 }
97 }
98
99 /**
100 * Translator of IpCriterion.
101 */
102 static final class IpCriterionTranslator extends AbstractCriterionTranslator {
zhiyong kef2e6a482017-07-10 20:32:20 +0800103 @Override
Carmelo Cascone00a59962017-06-16 17:51:49 +0900104 public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
105 IPCriterion c = (IPCriterion) criterion;
106 initAsLpm(copyFrom(c.ip().address().toOctets()), c.ip().prefixLength(), bitWidth);
107 }
108 }
zhiyong kef2e6a482017-07-10 20:32:20 +0800109
110 /**
111 * Translator of VlanIdCriterion.
112 */
113 static final class VlanIdCriterionTranslator extends AbstractCriterionTranslator {
114 @Override
115 public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
116 VlanIdCriterion c = (VlanIdCriterion) criterion;
117 initAsExactMatch(copyFrom(c.vlanId().toShort()), bitWidth);
118 }
119 }
120
121 /**
122 * Translator of UdpPortCriterion.
123 */
124 static final class UdpPortCriterionTranslator extends AbstractCriterionTranslator {
125 @Override
126 public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
127 UdpPortCriterion c = (UdpPortCriterion) criterion;
128 ImmutableByteSequence value = copyFrom(c.udpPort().toInt());
129 if (c.mask() == null) {
130 initAsExactMatch(value, bitWidth);
131 } else {
132 ImmutableByteSequence mask = copyFrom(c.mask().toInt());
133 initAsTernaryMatch(value, mask, bitWidth);
134 }
135 }
136 }
137
138 /**
zhiyong kef2e6a482017-07-10 20:32:20 +0800139 * Translator of IPDscpCriterion.
140 */
141 static final class IPDscpCriterionTranslator extends AbstractCriterionTranslator {
142 @Override
143 public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
144 IPDscpCriterion c = (IPDscpCriterion) criterion;
145 ImmutableByteSequence value = copyFrom(c.ipDscp());
146 initAsExactMatch(value, bitWidth);
147 }
148 }
149
150 /**
151 * Translator of IPProtocolCriterion.
152 */
153 static final class IPProtocolCriterionTranslator extends AbstractCriterionTranslator {
154 @Override
155 public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
156 IPProtocolCriterion c = (IPProtocolCriterion) criterion;
157 initAsExactMatch(copyFrom(c.protocol()), bitWidth);
158 }
159 }
160
161 /**
162 * Translator of IPv6ExthdrFlagsCriterion.
163 */
164 static final class IPv6ExthdrFlagsCriterionTranslator extends AbstractCriterionTranslator {
165 @Override
166 public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
167 IPv6ExthdrFlagsCriterion c = (IPv6ExthdrFlagsCriterion) criterion;
168 initAsExactMatch(copyFrom(c.exthdrFlags()), bitWidth);
169 }
170 }
171
172 /**
173 * Translator of IPv6FlowLabelCriterion.
174 */
175 static final class IPv6FlowLabelCriterionTranslator extends AbstractCriterionTranslator {
176 @Override
177 public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
178 IPv6FlowLabelCriterion c = (IPv6FlowLabelCriterion) criterion;
179 initAsExactMatch(copyFrom(c.flowLabel()), bitWidth);
180 }
181 }
182
183 /**
184 * Translator of IPv6NDLinkLayerAddressCriterion.
185 */
186 static final class IPv6NDLinkLayerAddressCriterionTranslator extends AbstractCriterionTranslator {
187 @Override
188 public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
189 IPv6NDLinkLayerAddressCriterion c = (IPv6NDLinkLayerAddressCriterion) criterion;
190 initAsExactMatch(copyFrom(c.mac().toLong()), bitWidth);
191 }
192 }
193
194 /**
195 * Translator of IPv6NDTargetAddressCriterion.
196 */
197 static final class IPv6NDTargetAddressCriterionTranslator extends AbstractCriterionTranslator {
198 @Override
199 public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
200 IPv6NDTargetAddressCriterion c = (IPv6NDTargetAddressCriterion) criterion;
201 initAsExactMatch(copyFrom(c.targetAddress().getIp6Address().toOctets()), bitWidth);
202 }
203 }
204
205 /**
206 * Translator of IcmpCodeCriterion.
207 */
208 static final class IcmpCodeCriterionTranslator extends AbstractCriterionTranslator {
209 @Override
210 public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
211 IcmpCodeCriterion c = (IcmpCodeCriterion) criterion;
212 initAsExactMatch(copyFrom(c.icmpCode()), bitWidth);
213 }
214 }
215
216 /**
217 * Translator of IcmpTypeCriterion.
218 */
219 static final class IcmpTypeCriterionTranslator extends AbstractCriterionTranslator {
220 @Override
221 public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
222 IcmpTypeCriterion c = (IcmpTypeCriterion) criterion;
223 initAsExactMatch(copyFrom(c.icmpType()), bitWidth);
224 }
225 }
226
227 /**
228 * Translator of Icmpv6CodeCriterion.
229 */
230 static final class Icmpv6CodeCriterionTranslator extends AbstractCriterionTranslator {
231 @Override
232 public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
233 Icmpv6CodeCriterion c = (Icmpv6CodeCriterion) criterion;
234 initAsExactMatch(copyFrom(c.icmpv6Code()), bitWidth);
235 }
236 }
237
238 /**
239 * Translator of Icmpv6TypeCriterion.
240 */
241 static final class Icmpv6TypeCriterionTranslator extends AbstractCriterionTranslator {
242 @Override
243 public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
244 Icmpv6TypeCriterion c = (Icmpv6TypeCriterion) criterion;
245 initAsExactMatch(copyFrom(c.icmpv6Type()), bitWidth);
246 }
247 }
248
249 /**
zhiyong kef2e6a482017-07-10 20:32:20 +0800250 * Translator of MetadataCriterion.
251 */
252 static final class MetadataCriterionTranslator extends AbstractCriterionTranslator {
253 @Override
254 public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
255 MetadataCriterion c = (MetadataCriterion) criterion;
256 initAsExactMatch(copyFrom(c.metadata()), bitWidth);
257 }
258 }
259
260 /**
261 * Translator of MplsBosCriterion.
262 */
263 static final class MplsBosCriterionTranslator extends AbstractCriterionTranslator {
264 @Override
265 public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
266 MplsBosCriterion c = (MplsBosCriterion) criterion;
zhiyong ke5395e642017-07-20 18:36:06 +0800267 initAsExactMatch(copyFrom(c.mplsBos() ? 1 : 0), bitWidth);
zhiyong kef2e6a482017-07-10 20:32:20 +0800268 }
269 }
270
271 /**
272 * Translator of MplsCriterion.
273 */
274 static final class MplsCriterionTranslator extends AbstractCriterionTranslator {
275 @Override
276 public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
277 MplsCriterion c = (MplsCriterion) criterion;
278 initAsExactMatch(copyFrom(c.label().toInt()), bitWidth);
279 }
280 }
281
282 /**
283 * Translator of MplsTcCriterion.
284 */
285 static final class MplsTcCriterionTranslator extends AbstractCriterionTranslator {
286 @Override
287 public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
288 MplsTcCriterion c = (MplsTcCriterion) criterion;
289 initAsExactMatch(copyFrom(c.tc()), bitWidth);
290 }
291 }
292
293 /**
zhiyong kef2e6a482017-07-10 20:32:20 +0800294 * Translator of PbbIsidCriterion.
295 */
296 static final class PbbIsidCriterionTranslator extends AbstractCriterionTranslator {
297 @Override
298 public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
299 PbbIsidCriterion c = (PbbIsidCriterion) criterion;
300 initAsExactMatch(copyFrom(c.pbbIsid()), bitWidth);
301 }
302 }
303
304 /**
zhiyong kef2e6a482017-07-10 20:32:20 +0800305 * Translator of SctpPortCriterion.
306 */
307 static final class SctpPortCriterionTranslator extends AbstractCriterionTranslator {
308 @Override
309 public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
310 SctpPortCriterion c = (SctpPortCriterion) criterion;
311 ImmutableByteSequence value = copyFrom(c.sctpPort().toInt());
312 if (c.mask() == null) {
313 initAsExactMatch(value, bitWidth);
314 } else {
315 ImmutableByteSequence mask = copyFrom(c.mask().toInt());
316 initAsTernaryMatch(value, mask, bitWidth);
317 }
318 }
319 }
320
321 /**
322 * Translator of TcpFlagsCriterion.
323 */
324 static final class TcpFlagsCriterionTranslator extends AbstractCriterionTranslator {
325 @Override
326 public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
327 TcpFlagsCriterion c = (TcpFlagsCriterion) criterion;
328 initAsExactMatch(copyFrom(c.flags()), bitWidth);
329 }
330 }
331
332 /**
333 * Translator of TcpPortCriterion.
334 */
335 static final class TcpPortCriterionTranslator extends AbstractCriterionTranslator {
336 @Override
337 public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
338 TcpPortCriterion c = (TcpPortCriterion) criterion;
339 ImmutableByteSequence value = copyFrom(c.tcpPort().toInt());
340 if (c.mask() == null) {
341 initAsExactMatch(value, bitWidth);
342 } else {
343 ImmutableByteSequence mask = copyFrom(c.mask().toInt());
344 initAsTernaryMatch(value, mask, bitWidth);
345 }
zhiyong kef2e6a482017-07-10 20:32:20 +0800346 }
347 }
348
349 /**
350 * Translator of TunnelIdCriterion.
351 */
352 static final class TunnelIdCriterionTranslator extends AbstractCriterionTranslator {
353 @Override
354 public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
355 TunnelIdCriterion c = (TunnelIdCriterion) criterion;
356 initAsExactMatch(copyFrom(c.tunnelId()), bitWidth);
357 }
358 }
359
360 /**
361 * Translator of VlanPcpCriterion.
362 */
363 static final class VlanPcpCriterionTranslator extends AbstractCriterionTranslator {
364 @Override
365 public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
366 VlanPcpCriterion c = (VlanPcpCriterion) criterion;
367 initAsExactMatch(copyFrom(c.priority()), bitWidth);
368 }
369 }
370
371 /**
zhiyong ke5395e642017-07-20 18:36:06 +0800372 * Translator of ArpHaCriterion.
zhiyong kef2e6a482017-07-10 20:32:20 +0800373 */
374 static final class ArpHaCriterionTranslator extends AbstractCriterionTranslator {
375 @Override
376 public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
377 ArpHaCriterion c = (ArpHaCriterion) criterion;
378 initAsExactMatch(copyFrom(c.mac().toLong()), bitWidth);
379 }
380 }
381
382 /**
383 * Translator of ArpOpCriterion.
384 */
385 static final class ArpOpCriterionTranslator extends AbstractCriterionTranslator {
386 @Override
387 public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
388 ArpOpCriterion c = (ArpOpCriterion) criterion;
389 initAsExactMatch(copyFrom(c.arpOp()), bitWidth);
390 }
391 }
392
393 /**
394 * Translator of ArpPaCriterion.
395 */
396 static final class ArpPaCriterionTranslator extends AbstractCriterionTranslator {
397 @Override
398 public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
399 ArpPaCriterion c = (ArpPaCriterion) criterion;
400 initAsExactMatch(copyFrom(c.ip().toInt()), bitWidth);
401 }
402 }
403
zhiyong ke897fd2d2017-07-12 11:41:38 +0800404 /**
405 * Translator of IPEcnCriterion.
406 */
407 static final class IPEcnCriterionTranslator extends AbstractCriterionTranslator {
408 @Override
409 public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
410 IPEcnCriterion c = (IPEcnCriterion) criterion;
411 initAsExactMatch(copyFrom(c.ipEcn()), bitWidth);
412 }
413 }
zhiyong ke5395e642017-07-20 18:36:06 +0800414
Carmelo Cascone00a59962017-06-16 17:51:49 +0900415}