blob: 1ba85e0335f2f985e389c22eac018bf1e52deecb [file] [log] [blame]
Carmelo Cascone1022a4e2017-05-25 00:16:18 -04001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2017-present Open Networking Foundation
Carmelo Cascone1022a4e2017-05-25 00:16:18 -04003 *
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.model;
18
19import com.google.common.annotations.Beta;
Carmelo Cascone4c289b72019-01-22 15:30:45 -080020import org.onosproject.net.DeviceId;
Carmelo Cascone1e8843f2018-07-19 19:01:12 +020021import org.onosproject.net.PortNumber;
Carmelo Cascone1022a4e2017-05-25 00:16:18 -040022import org.onosproject.net.driver.HandlerBehaviour;
23import org.onosproject.net.flow.TrafficTreatment;
24import org.onosproject.net.flow.criteria.Criterion;
Andrea Campanella288b2732017-07-28 14:16:16 +020025import org.onosproject.net.packet.InboundPacket;
Andrea Campanella432f7182017-07-14 18:43:27 +020026import org.onosproject.net.packet.OutboundPacket;
Carmelo Casconef3a1a382017-07-27 12:04:39 -040027import org.onosproject.net.pi.runtime.PiAction;
Andrea Campanellafc1d34c2017-07-18 17:01:41 +020028import org.onosproject.net.pi.runtime.PiPacketOperation;
Carmelo Cascone1022a4e2017-05-25 00:16:18 -040029
Andrea Campanella432f7182017-07-14 18:43:27 +020030import java.util.Collection;
Carmelo Cascone1022a4e2017-05-25 00:16:18 -040031import java.util.Optional;
32
33/**
Carmelo Cascone87892e22017-11-13 16:01:29 -080034 * An interpreter of a PI pipeline model.
Carmelo Cascone1022a4e2017-05-25 00:16:18 -040035 */
36@Beta
37public interface PiPipelineInterpreter extends HandlerBehaviour {
38
39 /**
Carmelo Cascone1e8843f2018-07-19 19:01:12 +020040 * Returns a PI match field ID that is equivalent to the given criterion
41 * type, if present. If not present, it means that the given criterion type
42 * is not supported by this interpreter.
Carmelo Cascone1022a4e2017-05-25 00:16:18 -040043 *
44 * @param type criterion type
Carmelo Cascone87892e22017-11-13 16:01:29 -080045 * @return optional match field ID
Carmelo Cascone1022a4e2017-05-25 00:16:18 -040046 */
Carmelo Cascone87892e22017-11-13 16:01:29 -080047 Optional<PiMatchFieldId> mapCriterionType(Criterion.Type type);
Carmelo Cascone1022a4e2017-05-25 00:16:18 -040048
49 /**
Carmelo Cascone1e8843f2018-07-19 19:01:12 +020050 * Returns a PI table ID equivalent to the given numeric table ID (as in
51 * {@link org.onosproject.net.flow.FlowRule#tableId()}). If not present, it
52 * means that the given integer table ID cannot be mapped to any table of
53 * the pipeline model.
Carmelo Cascone00a59962017-06-16 17:51:49 +090054 *
Carmelo Cascone87892e22017-11-13 16:01:29 -080055 * @param flowRuleTableId a numeric table ID
56 * @return PI table ID
Carmelo Cascone00a59962017-06-16 17:51:49 +090057 */
Carmelo Casconeb5324e72018-11-25 02:26:32 -080058 // FIXME: remove this method. The only place where this mapping seems useful
59 // is when using the default single table pipeliner which produces flow
60 // rules for table 0. Instead, PI pipeliners should provide a mapping to a
61 // specific PiTableId even when mapping to a single table.
Carmelo Cascone00a59962017-06-16 17:51:49 +090062 Optional<PiTableId> mapFlowRuleTableId(int flowRuleTableId);
63
64 /**
Carmelo Cascone1e8843f2018-07-19 19:01:12 +020065 * Returns an action of a PI pipeline that is functionally equivalent to the
66 * given traffic treatment for the given table.
Carmelo Cascone1022a4e2017-05-25 00:16:18 -040067 *
Carmelo Cascone87892e22017-11-13 16:01:29 -080068 * @param treatment traffic treatment
69 * @param piTableId PI table ID
70 * @return action object
Carmelo Cascone1e8843f2018-07-19 19:01:12 +020071 * @throws PiInterpreterException if the treatment cannot be mapped to any
72 * PI action
Carmelo Cascone1022a4e2017-05-25 00:16:18 -040073 */
Carmelo Casconef3a1a382017-07-27 12:04:39 -040074 PiAction mapTreatment(TrafficTreatment treatment, PiTableId piTableId)
Carmelo Cascone1022a4e2017-05-25 00:16:18 -040075 throws PiInterpreterException;
76
77 /**
Carmelo Cascone1e8843f2018-07-19 19:01:12 +020078 * Returns a collection of PI packet operations equivalent to the given
79 * outbound packet instance.
Andrea Campanella432f7182017-07-14 18:43:27 +020080 *
Carmelo Cascone87892e22017-11-13 16:01:29 -080081 * @param packet outbound packet
82 * @return collection of PI packet operations
Carmelo Cascone1e8843f2018-07-19 19:01:12 +020083 * @throws PiInterpreterException if the packet treatments cannot be
84 * executed by this pipeline
Andrea Campanella432f7182017-07-14 18:43:27 +020085 */
Carmelo Casconef3a1a382017-07-27 12:04:39 -040086 Collection<PiPacketOperation> mapOutboundPacket(OutboundPacket packet)
Andrea Campanella432f7182017-07-14 18:43:27 +020087 throws PiInterpreterException;
88
89 /**
Carmelo Cascone4c289b72019-01-22 15:30:45 -080090 * Returns an inbound packet equivalent to the given PI packet-in operation
91 * for the given device.
Andrea Campanella288b2732017-07-28 14:16:16 +020092 *
Carmelo Cascone87892e22017-11-13 16:01:29 -080093 * @param packetOperation packet operation
Carmelo Cascone4c289b72019-01-22 15:30:45 -080094 * @param deviceId ID of the device that originated the packet-in
Carmelo Cascone87892e22017-11-13 16:01:29 -080095 * @return inbound packet
Carmelo Cascone1e8843f2018-07-19 19:01:12 +020096 * @throws PiInterpreterException if the packet operation cannot be mapped
97 * to an inbound packet
Andrea Campanella288b2732017-07-28 14:16:16 +020098 */
Carmelo Cascone4c289b72019-01-22 15:30:45 -080099 InboundPacket mapInboundPacket(PiPacketOperation packetOperation, DeviceId deviceId)
Andrea Campanella288b2732017-07-28 14:16:16 +0200100 throws PiInterpreterException;
101
102 /**
Carmelo Cascone1e8843f2018-07-19 19:01:12 +0200103 * Maps the given logical port number to the data plane port ID (integer)
104 * identifying the same port for this pipeconf, if such mapping is
105 * possible.
106 *
107 * @param port port number
108 * @return optional integer
109 */
110 default Optional<Integer> mapLogicalPortNumber(PortNumber port) {
111 return Optional.empty();
112 }
113
114 /**
Carmelo Cascone50d195f2018-09-11 13:26:38 -0700115 * If the given table allows for mutable default actions, this method
116 * returns an action instance to be used when ONOS tries to remove a
117 * different default action previously set.
118 *
119 * @param tableId table ID
120 * @return optional default action
121 */
122 default Optional<PiAction> getOriginalDefaultAction(PiTableId tableId) {
123 return Optional.empty();
124 }
125
126 /**
Carmelo Cascone1022a4e2017-05-25 00:16:18 -0400127 * Signals that an error was encountered while executing the interpreter.
128 */
129 @Beta
130 class PiInterpreterException extends Exception {
131 public PiInterpreterException(String message) {
132 super(message);
133 }
134 }
Carmelo Cascone87892e22017-11-13 16:01:29 -0800135}