blob: 644d8046acd58c0ac91dfce73c1f8242aa5433e2 [file] [log] [blame]
sdn87018982018-05-08 11:46:27 +09001/*
2 * Copyright 2018-present Open Networking Foundation
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
18import org.onlab.osgi.ServiceDirectory;
19import org.onosproject.net.DeviceId;
20import org.onosproject.net.Device;
21import org.onosproject.net.behaviour.PipelinerContext;
22import org.onosproject.net.device.DeviceService;
23import org.onosproject.net.flow.DefaultTrafficTreatment;
24import org.onosproject.net.flow.TrafficTreatment;
25import org.onosproject.net.flowobjective.DefaultForwardingObjective;
26import org.onosproject.net.flowobjective.ForwardingObjective;
27import org.slf4j.Logger;
28
29import java.util.Optional;
30
31import static org.slf4j.LoggerFactory.getLogger;
32
33/**
sdn3b223942018-05-30 20:37:21 +090034 * Arista OpenFlow Switch single table pipeline abstraction.
sdn87018982018-05-08 11:46:27 +090035 */
36public class AristaPipeliner extends DefaultSingleTablePipeline {
37
38 private final Logger log = getLogger(getClass());
39 private ServiceDirectory serviceDirectory;
40 private DeviceId deviceId;
sdn35cc3e62018-06-01 18:08:41 +090041 protected DeviceService deviceService;
sdn87018982018-05-08 11:46:27 +090042
sdn87018982018-05-08 11:46:27 +090043 @Override
44 public void init(DeviceId deviceId, PipelinerContext context) {
sdn35cc3e62018-06-01 18:08:41 +090045 super.init(deviceId, context);
sdn87018982018-05-08 11:46:27 +090046 this.deviceId = deviceId;
47 this.serviceDirectory = context.directory();
sdn35cc3e62018-06-01 18:08:41 +090048 deviceService = serviceDirectory.get(DeviceService.class);
sdn87018982018-05-08 11:46:27 +090049 }
50
51
52 @Override
53 public void forward(ForwardingObjective forwardObjective) {
54 ForwardingObjective newFwd = forwardObjective;
sdn35cc3e62018-06-01 18:08:41 +090055 Device device = deviceService.getDevice(deviceId);
sdn87018982018-05-08 11:46:27 +090056
sdn87018982018-05-08 11:46:27 +090057 if (forwardObjective.treatment() != null && forwardObjective.treatment().clearedDeferred()) {
58 log.warn("Using 'clear actions' instruction which is not supported by {} {} {} Switch"
59 + " removing the clear deferred from the forwarding objective",
60 device.id(), device.manufacturer(), device.hwVersion());
61 newFwd = forwardingObjectiveWithoutCleardDef(forwardObjective).orElse(forwardObjective);
62 }
63
64 super.forward(newFwd);
65 }
66
67
68 private Optional<ForwardingObjective> forwardingObjectiveWithoutCleardDef(ForwardingObjective forwardingObjective) {
69 TrafficTreatment treatment = trafficTreatmentWithoutClearedDeffered(forwardingObjective.treatment());
70
71 DefaultForwardingObjective.Builder foBuilder = (DefaultForwardingObjective.Builder) forwardingObjective.copy();
72 foBuilder.withTreatment(treatment);
73
74 switch (forwardingObjective.op()) {
75 case ADD:
76 return Optional.of(foBuilder.add(forwardingObjective.context().orElse(null)));
77 case REMOVE:
78 return Optional.of(foBuilder.remove(forwardingObjective.context().orElse(null)));
79 default:
80 log.warn("Driver Not support other operations for forwarding objective");
81 return Optional.empty();
82 }
83
84 }
85
86
87 private TrafficTreatment trafficTreatmentWithoutClearedDeffered(TrafficTreatment treatment) {
88 return DefaultTrafficTreatment.builder(treatment)
89 .notWipeDeferred()
90 .build();
91 }
92
93}