blob: 5d9d7925eb43047e6b9d3ab704cb05de7ac8704c [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 com.google.common.collect.ImmutableMap;
20import org.apache.commons.lang3.tuple.Pair;
21import org.onlab.util.ImmutableByteSequence;
22import org.onosproject.net.flow.criteria.Criterion;
23import org.onosproject.net.flow.criteria.EthCriterion;
24import org.onosproject.net.flow.criteria.EthTypeCriterion;
25import org.onosproject.net.flow.criteria.IPCriterion;
26import org.onosproject.net.flow.criteria.PortCriterion;
zhiyong kef2e6a482017-07-10 20:32:20 +080027import org.onosproject.net.flow.criteria.VlanIdCriterion;
28import org.onosproject.net.flow.criteria.UdpPortCriterion;
29import org.onosproject.net.flow.criteria.ExtensionCriterion;
30import org.onosproject.net.flow.criteria.IPDscpCriterion;
31import org.onosproject.net.flow.criteria.IPProtocolCriterion;
32import org.onosproject.net.flow.criteria.IPv6ExthdrFlagsCriterion;
33import org.onosproject.net.flow.criteria.IPv6FlowLabelCriterion;
34import org.onosproject.net.flow.criteria.IPv6NDLinkLayerAddressCriterion;
35import org.onosproject.net.flow.criteria.IPv6NDTargetAddressCriterion;
36import org.onosproject.net.flow.criteria.IcmpCodeCriterion;
37import org.onosproject.net.flow.criteria.IcmpTypeCriterion;
38import org.onosproject.net.flow.criteria.Icmpv6CodeCriterion;
39import org.onosproject.net.flow.criteria.Icmpv6TypeCriterion;
40import org.onosproject.net.flow.criteria.LambdaCriterion;
41import org.onosproject.net.flow.criteria.MplsBosCriterion;
42import org.onosproject.net.flow.criteria.MplsCriterion;
43import org.onosproject.net.flow.criteria.MplsTcCriterion;
44import org.onosproject.net.flow.criteria.OchSignalCriterion;
45import org.onosproject.net.flow.criteria.OchSignalTypeCriterion;
46import org.onosproject.net.flow.criteria.OduSignalIdCriterion;
47import org.onosproject.net.flow.criteria.OduSignalTypeCriterion;
48import org.onosproject.net.flow.criteria.PbbIsidCriterion;
49import org.onosproject.net.flow.criteria.PiCriterion;
50import org.onosproject.net.flow.criteria.SctpPortCriterion;
51import org.onosproject.net.flow.criteria.TcpFlagsCriterion;
52import org.onosproject.net.flow.criteria.TcpPortCriterion;
53import org.onosproject.net.flow.criteria.TunnelIdCriterion;
54import org.onosproject.net.flow.criteria.VlanPcpCriterion;
55import org.onosproject.net.flow.criteria.ArpHaCriterion;
56import org.onosproject.net.flow.criteria.ArpOpCriterion;
57import org.onosproject.net.flow.criteria.ArpPaCriterion;
zhiyong ke897fd2d2017-07-12 11:41:38 +080058import org.onosproject.net.flow.criteria.IPEcnCriterion;
59import org.onosproject.net.flow.criteria.MetadataCriterion;
zhiyong kef2e6a482017-07-10 20:32:20 +080060
Carmelo Cascone00a59962017-06-16 17:51:49 +090061import org.onosproject.net.pi.impl.CriterionTranslators.EthCriterionTranslator;
62import org.onosproject.net.pi.impl.CriterionTranslators.EthTypeCriterionTranslator;
63import org.onosproject.net.pi.impl.CriterionTranslators.IpCriterionTranslator;
64import org.onosproject.net.pi.impl.CriterionTranslators.PortCriterionTranslator;
zhiyong kef2e6a482017-07-10 20:32:20 +080065import org.onosproject.net.pi.impl.CriterionTranslators.VlanIdCriterionTranslator;
66import org.onosproject.net.pi.impl.CriterionTranslators.UdpPortCriterionTranslator;
67import org.onosproject.net.pi.impl.CriterionTranslators.ExtensionCriterionTranslator;
68import org.onosproject.net.pi.impl.CriterionTranslators.IPDscpCriterionTranslator;
69import org.onosproject.net.pi.impl.CriterionTranslators.IPProtocolCriterionTranslator;
70import org.onosproject.net.pi.impl.CriterionTranslators.IPv6ExthdrFlagsCriterionTranslator;
71import org.onosproject.net.pi.impl.CriterionTranslators.IPv6FlowLabelCriterionTranslator;
72import org.onosproject.net.pi.impl.CriterionTranslators.IPv6NDLinkLayerAddressCriterionTranslator;
73import org.onosproject.net.pi.impl.CriterionTranslators.IPv6NDTargetAddressCriterionTranslator;
74import org.onosproject.net.pi.impl.CriterionTranslators.IcmpCodeCriterionTranslator;
75import org.onosproject.net.pi.impl.CriterionTranslators.IcmpTypeCriterionTranslator;
76import org.onosproject.net.pi.impl.CriterionTranslators.Icmpv6CodeCriterionTranslator;
77import org.onosproject.net.pi.impl.CriterionTranslators.Icmpv6TypeCriterionTranslator;
78import org.onosproject.net.pi.impl.CriterionTranslators.LambdaCriterionTranslator;
79import org.onosproject.net.pi.impl.CriterionTranslators.MplsBosCriterionTranslator;
80import org.onosproject.net.pi.impl.CriterionTranslators.MplsCriterionTranslator;
81import org.onosproject.net.pi.impl.CriterionTranslators.MplsTcCriterionTranslator;
82import org.onosproject.net.pi.impl.CriterionTranslators.OchSignalCriterionTranslator;
83import org.onosproject.net.pi.impl.CriterionTranslators.OchSignalTypeCriterionTranslator;
84import org.onosproject.net.pi.impl.CriterionTranslators.OduSignalIdCriterionTranslator;
85import org.onosproject.net.pi.impl.CriterionTranslators.OduSignalTypeCriterionTranslator;
86import org.onosproject.net.pi.impl.CriterionTranslators.PbbIsidCriterionTranslator;
87import org.onosproject.net.pi.impl.CriterionTranslators.PiCriterionTranslator;
88import org.onosproject.net.pi.impl.CriterionTranslators.SctpPortCriterionTranslator;
89import org.onosproject.net.pi.impl.CriterionTranslators.TcpFlagsCriterionTranslator;
90import org.onosproject.net.pi.impl.CriterionTranslators.TcpPortCriterionTranslator;
91import org.onosproject.net.pi.impl.CriterionTranslators.TunnelIdCriterionTranslator;
92import org.onosproject.net.pi.impl.CriterionTranslators.VlanPcpCriterionTranslator;
93import org.onosproject.net.pi.impl.CriterionTranslators.ArpHaCriterionTranslator;
94import org.onosproject.net.pi.impl.CriterionTranslators.ArpOpCriterionTranslator;
95import org.onosproject.net.pi.impl.CriterionTranslators.ArpPaCriterionTranslator;
zhiyong ke897fd2d2017-07-12 11:41:38 +080096import org.onosproject.net.pi.impl.CriterionTranslators.IPEcnCriterionTranslator;
97import org.onosproject.net.pi.impl.CriterionTranslators.MetadataCriterionTranslator;
zhiyong kef2e6a482017-07-10 20:32:20 +080098
Carmelo Cascone00a59962017-06-16 17:51:49 +090099import org.onosproject.net.pi.model.PiMatchType;
100import org.onosproject.net.pi.runtime.PiExactFieldMatch;
101import org.onosproject.net.pi.runtime.PiFieldMatch;
102import org.onosproject.net.pi.runtime.PiHeaderFieldId;
103import org.onosproject.net.pi.runtime.PiLpmFieldMatch;
104import org.onosproject.net.pi.runtime.PiTernaryFieldMatch;
105
106import java.util.Map;
107
108import static java.lang.String.format;
109import static org.onlab.util.ImmutableByteSequence.ByteSequenceTrimException;
110import static org.onosproject.net.pi.impl.CriterionTranslator.CriterionTranslatorException;
111import static org.onosproject.net.pi.runtime.PiFlowRuleTranslationService.PiFlowRuleTranslationException;
112
113/**
114 * Helper class to translate criterion instances to PI field matches.
115 */
116final class CriterionTranslatorHelper {
zhiyong ke1667fbb2017-07-04 09:51:24 +0800117 private static final Map<Class<? extends Criterion>, CriterionTranslator> TRANSLATORS =
Carmelo Cascone00a59962017-06-16 17:51:49 +0900118 // Add here new CriterionTranslator implementations.
zhiyong ke1667fbb2017-07-04 09:51:24 +0800119 new ImmutableMap.Builder<Class<? extends Criterion>, CriterionTranslator>()
120 .put(PortCriterion.class, new PortCriterionTranslator())
121 .put(EthCriterion.class, new EthCriterionTranslator())
122 .put(EthTypeCriterion.class, new EthTypeCriterionTranslator())
123 .put(IPCriterion.class, new IpCriterionTranslator())
zhiyong kef2e6a482017-07-10 20:32:20 +0800124 .put(VlanIdCriterion.class, new VlanIdCriterionTranslator())
125 .put(UdpPortCriterion.class, new UdpPortCriterionTranslator())
126 .put(ExtensionCriterion.class, new ExtensionCriterionTranslator())
127 .put(IPDscpCriterion.class, new IPDscpCriterionTranslator())
128 .put(IPProtocolCriterion.class, new IPProtocolCriterionTranslator())
129 .put(IPv6ExthdrFlagsCriterion.class, new IPv6ExthdrFlagsCriterionTranslator())
130 .put(IPv6FlowLabelCriterion.class, new IPv6FlowLabelCriterionTranslator())
131 .put(IPv6NDLinkLayerAddressCriterion.class, new IPv6NDLinkLayerAddressCriterionTranslator())
132 .put(IPv6NDTargetAddressCriterion.class, new IPv6NDTargetAddressCriterionTranslator())
133 .put(IcmpCodeCriterion.class, new IcmpCodeCriterionTranslator())
134 .put(IcmpTypeCriterion.class, new IcmpTypeCriterionTranslator())
135 .put(Icmpv6CodeCriterion.class, new Icmpv6CodeCriterionTranslator())
136 .put(Icmpv6TypeCriterion.class, new Icmpv6TypeCriterionTranslator())
137 .put(LambdaCriterion.class, new LambdaCriterionTranslator())
138 .put(MplsBosCriterion.class, new MplsBosCriterionTranslator())
139 .put(MplsCriterion.class, new MplsCriterionTranslator())
140 .put(MplsTcCriterion.class, new MplsTcCriterionTranslator())
141 .put(OchSignalCriterion.class, new OchSignalCriterionTranslator())
142 .put(OchSignalTypeCriterion.class, new OchSignalTypeCriterionTranslator())
143 .put(OduSignalIdCriterion.class, new OduSignalIdCriterionTranslator())
144 .put(OduSignalTypeCriterion.class, new OduSignalTypeCriterionTranslator())
145 .put(PbbIsidCriterion.class, new PbbIsidCriterionTranslator())
146 .put(PiCriterion.class, new PiCriterionTranslator())
147 .put(SctpPortCriterion.class, new SctpPortCriterionTranslator())
148 .put(TcpFlagsCriterion.class, new TcpFlagsCriterionTranslator())
149 .put(TcpPortCriterion.class, new TcpPortCriterionTranslator())
150 .put(TunnelIdCriterion.class, new TunnelIdCriterionTranslator())
151 .put(VlanPcpCriterion.class, new VlanPcpCriterionTranslator())
152 .put(ArpHaCriterion.class, new ArpHaCriterionTranslator())
153 .put(ArpOpCriterion.class, new ArpOpCriterionTranslator())
154 .put(ArpPaCriterion.class, new ArpPaCriterionTranslator())
zhiyong ke897fd2d2017-07-12 11:41:38 +0800155 .put(IPEcnCriterion.class, new IPEcnCriterionTranslator())
156 .put(MetadataCriterion.class, new MetadataCriterionTranslator())
zhiyong ke1667fbb2017-07-04 09:51:24 +0800157 .build();
Carmelo Cascone00a59962017-06-16 17:51:49 +0900158
159 private CriterionTranslatorHelper() {
160 // Hides constructor.
161 }
162
163 /**
164 * Translates a given criterion instance to a PiFieldMatch with the given id, match type, and bit-width.
165 *
166 * @param fieldId PI header field identifier
167 * @param criterion criterion
168 * @param matchType match type
169 * @param bitWidth size of the field match in bits
170 * @return a PI field match
171 * @throws PiFlowRuleTranslationException if the criterion cannot be translated (see exception message)
172 */
173 static PiFieldMatch translateCriterion(Criterion criterion, PiHeaderFieldId fieldId, PiMatchType matchType,
174 int bitWidth)
175 throws PiFlowRuleTranslationException {
176
177 if (!TRANSLATORS.containsKey(criterion.getClass())) {
178 throw new PiFlowRuleTranslationException(format(
179 "Translation of criterion class %s is not implemented.",
180 criterion.getClass().getSimpleName()));
181 }
182
183 CriterionTranslator translator = TRANSLATORS.get(criterion.getClass());
184
185 try {
186 translator.init(criterion, bitWidth);
187 switch (matchType) {
188 case EXACT:
189 return new PiExactFieldMatch(fieldId, translator.exactMatch());
190 case TERNARY:
191 Pair<ImmutableByteSequence, ImmutableByteSequence> tp = translator.ternaryMatch();
192 return new PiTernaryFieldMatch(fieldId, tp.getLeft(), tp.getRight());
193 case LPM:
194 Pair<ImmutableByteSequence, Integer> lp = translator.lpmMatch();
195 return new PiLpmFieldMatch(fieldId, lp.getLeft(), lp.getRight());
196 default:
197 throw new PiFlowRuleTranslationException(format(
198 "Translation of criterion %s (%s class) to match type %s is not implemented.",
199 criterion.type().name(), criterion.getClass().getSimpleName(), matchType.name()));
200 }
201 } catch (ByteSequenceTrimException e) {
202 throw new PiFlowRuleTranslationException(format(
203 "Size mismatch for criterion %s: %s", criterion.type(), e.getMessage()));
204 } catch (CriterionTranslatorException e) {
205 throw new PiFlowRuleTranslationException(format(
206 "Unable to translate criterion %s: %s", criterion.type(), e.getMessage()));
207 }
208 }
209}