blob: 2b4cb2277a0b35d928251b9fe61f4628a657ec04 [file] [log] [blame]
alshabibfaa1e362015-04-02 15:01:54 -07001/*
2 * Copyright 2015 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 */
16package org.onosproject.driver.pipeline;
17
alshabibfaa1e362015-04-02 15:01:54 -070018import org.onlab.osgi.ServiceDirectory;
alshabibfaa1e362015-04-02 15:01:54 -070019import org.onosproject.net.DeviceId;
20import org.onosproject.net.behaviour.Pipeliner;
Thomas Vachuskaca88bb72015-04-08 19:38:02 -070021import org.onosproject.net.behaviour.PipelinerContext;
Thomas Vachuskafacc3f52015-04-10 08:58:36 -070022import org.onosproject.net.driver.AbstractHandlerBehaviour;
alshabibfaa1e362015-04-02 15:01:54 -070023import org.onosproject.net.flow.DefaultFlowRule;
Srikanth Vavilapallif5b234a2015-04-21 13:04:13 -070024import org.onosproject.net.flow.DefaultTrafficTreatment;
alshabibfaa1e362015-04-02 15:01:54 -070025import org.onosproject.net.flow.FlowRule;
26import org.onosproject.net.flow.FlowRuleOperations;
27import org.onosproject.net.flow.FlowRuleOperationsContext;
28import org.onosproject.net.flow.FlowRuleService;
29import org.onosproject.net.flow.TrafficSelector;
Srikanth Vavilapallif5b234a2015-04-21 13:04:13 -070030import org.onosproject.net.flow.TrafficTreatment;
31import org.onosproject.net.flow.instructions.Instructions;
alshabibfaa1e362015-04-02 15:01:54 -070032import org.onosproject.net.flowobjective.FilteringObjective;
33import org.onosproject.net.flowobjective.ForwardingObjective;
alshabib77b88482015-04-07 15:47:50 -070034import org.onosproject.net.flowobjective.NextObjective;
alshabib2a441c62015-04-13 18:39:38 -070035import org.onosproject.net.flowobjective.ObjectiveError;
alshabibfaa1e362015-04-02 15:01:54 -070036import org.slf4j.Logger;
37
alshabibfaa1e362015-04-02 15:01:54 -070038import static org.slf4j.LoggerFactory.getLogger;
39
40/**
41 * Simple single table pipeline abstraction.
42 */
Thomas Vachuskafacc3f52015-04-10 08:58:36 -070043public class DefaultSingleTablePipeline extends AbstractHandlerBehaviour implements Pipeliner {
alshabibfaa1e362015-04-02 15:01:54 -070044
45 private final Logger log = getLogger(getClass());
46
47 private ServiceDirectory serviceDirectory;
48 private FlowRuleService flowRuleService;
49 private DeviceId deviceId;
50
51 @Override
Thomas Vachuskaca88bb72015-04-08 19:38:02 -070052 public void init(DeviceId deviceId, PipelinerContext context) {
53 this.serviceDirectory = context.directory();
alshabibfaa1e362015-04-02 15:01:54 -070054 this.deviceId = deviceId;
55
56 flowRuleService = serviceDirectory.get(FlowRuleService.class);
alshabibfaa1e362015-04-02 15:01:54 -070057 }
58
59 @Override
alshabib2a441c62015-04-13 18:39:38 -070060 public void filter(FilteringObjective filter) {
alshabibfaa1e362015-04-02 15:01:54 -070061 throw new UnsupportedOperationException("Single table does not filter.");
62 }
63
64 @Override
alshabib2a441c62015-04-13 18:39:38 -070065 public void forward(ForwardingObjective fwd) {
alshabibfaa1e362015-04-02 15:01:54 -070066 FlowRuleOperations.Builder flowBuilder = FlowRuleOperations.builder();
alshabibfaa1e362015-04-02 15:01:54 -070067
alshabib2a441c62015-04-13 18:39:38 -070068 if (fwd.flag() != ForwardingObjective.Flag.VERSATILE) {
69 throw new UnsupportedOperationException(
70 "Only VERSATILE is supported.");
71 }
alshabibfaa1e362015-04-02 15:01:54 -070072
alshabib2a441c62015-04-13 18:39:38 -070073 TrafficSelector selector = fwd.selector();
Srikanth Vavilapallif5b234a2015-04-21 13:04:13 -070074 TrafficTreatment treatment = fwd.treatment();
75 if ((fwd.treatment().deferred().size() == 0) &&
76 (fwd.treatment().immediate().size() == 0) &&
77 (fwd.treatment().tableTransition() == null) &&
78 (!fwd.treatment().clearedDeferred())) {
79 TrafficTreatment.Builder flowTreatment = DefaultTrafficTreatment.builder();
80 flowTreatment.add(Instructions.createDrop());
81 treatment = flowTreatment.build();
82 }
alshabibfaa1e362015-04-02 15:01:54 -070083
alshabibb452fd72015-04-22 20:46:20 -070084 FlowRule.Builder ruleBuilder = DefaultFlowRule.builder()
85 .forDevice(deviceId)
86 .withSelector(selector)
87 .withTreatment(fwd.treatment())
88 .fromApp(fwd.appId())
89 .withPriority(fwd.priority());
90
91 if (fwd.permanent()) {
92 ruleBuilder.makePermanent();
93 } else {
94 ruleBuilder.makeTemporary(fwd.timeout());
95 }
96
alshabibfaa1e362015-04-02 15:01:54 -070097
alshabib2a441c62015-04-13 18:39:38 -070098 switch (fwd.op()) {
alshabibfaa1e362015-04-02 15:01:54 -070099
alshabib2a441c62015-04-13 18:39:38 -0700100 case ADD:
alshabibb452fd72015-04-22 20:46:20 -0700101 flowBuilder.add(ruleBuilder.build());
alshabib2a441c62015-04-13 18:39:38 -0700102 break;
103 case REMOVE:
alshabibb452fd72015-04-22 20:46:20 -0700104 flowBuilder.remove(ruleBuilder.build());
alshabib2a441c62015-04-13 18:39:38 -0700105 break;
106 default:
107 log.warn("Unknown operation {}", fwd.op());
108 }
109
alshabibfaa1e362015-04-02 15:01:54 -0700110 flowRuleService.apply(flowBuilder.build(new FlowRuleOperationsContext() {
111 @Override
112 public void onSuccess(FlowRuleOperations ops) {
alshabib2a441c62015-04-13 18:39:38 -0700113 if (fwd.context().isPresent()) {
114 fwd.context().get().onSuccess(fwd);
115 }
alshabibfaa1e362015-04-02 15:01:54 -0700116 }
117
118 @Override
119 public void onError(FlowRuleOperations ops) {
alshabib2a441c62015-04-13 18:39:38 -0700120 if (fwd.context().isPresent()) {
121 fwd.context().get().onError(fwd, ObjectiveError.FLOWINSTALLATIONFAILED);
122 }
alshabibfaa1e362015-04-02 15:01:54 -0700123 }
124 }));
alshabib2a441c62015-04-13 18:39:38 -0700125
alshabibfaa1e362015-04-02 15:01:54 -0700126 }
alshabib77b88482015-04-07 15:47:50 -0700127
128 @Override
alshabib2a441c62015-04-13 18:39:38 -0700129 public void next(NextObjective nextObjective) {
alshabib77b88482015-04-07 15:47:50 -0700130 throw new UnsupportedOperationException("Single table does not next hop.");
131 }
132
alshabibfaa1e362015-04-02 15:01:54 -0700133}