blob: f4394b7965c1d7f3cfd1dde5b74381c2b36343d7 [file] [log] [blame]
alshabibaebe7752015-04-07 17:45:42 -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
alshabib910aff12015-04-09 16:55:57 -070018import com.google.common.collect.Sets;
19import com.google.common.util.concurrent.SettableFuture;
alshabibaebe7752015-04-07 17:45:42 -070020import org.onlab.osgi.ServiceDirectory;
21import org.onlab.packet.Ethernet;
22import org.onlab.packet.MacAddress;
23import org.onlab.packet.VlanId;
24import org.onosproject.core.ApplicationId;
25import org.onosproject.core.CoreService;
26import org.onosproject.net.DeviceId;
27import org.onosproject.net.behaviour.Pipeliner;
Thomas Vachuskaca88bb72015-04-08 19:38:02 -070028import org.onosproject.net.behaviour.PipelinerContext;
Thomas Vachuskafacc3f52015-04-10 08:58:36 -070029import org.onosproject.net.driver.AbstractHandlerBehaviour;
alshabibaebe7752015-04-07 17:45:42 -070030import org.onosproject.net.flow.DefaultFlowRule;
31import org.onosproject.net.flow.DefaultTrafficSelector;
32import org.onosproject.net.flow.DefaultTrafficTreatment;
33import org.onosproject.net.flow.FlowRule;
34import org.onosproject.net.flow.FlowRuleOperations;
35import org.onosproject.net.flow.FlowRuleOperationsContext;
36import org.onosproject.net.flow.FlowRuleService;
37import org.onosproject.net.flow.TrafficSelector;
38import org.onosproject.net.flow.TrafficTreatment;
alshabib910aff12015-04-09 16:55:57 -070039import org.onosproject.net.flow.criteria.Criteria;
40import org.onosproject.net.flow.criteria.Criterion;
alshabibaebe7752015-04-07 17:45:42 -070041import org.onosproject.net.flowobjective.FilteringObjective;
42import org.onosproject.net.flowobjective.ForwardingObjective;
43import org.onosproject.net.flowobjective.NextObjective;
alshabib910aff12015-04-09 16:55:57 -070044import org.onosproject.net.flowobjective.Objective;
alshabibaebe7752015-04-07 17:45:42 -070045import org.slf4j.Logger;
46
47import java.util.Collection;
48import java.util.concurrent.Future;
49
50import static org.slf4j.LoggerFactory.getLogger;
51
52/**
Thomas Vachuska5c2f8132015-04-08 23:09:08 -070053 * Corsa pipeline handler.
alshabibaebe7752015-04-07 17:45:42 -070054 */
Thomas Vachuskafacc3f52015-04-10 08:58:36 -070055public class OVSCorsaPipeline extends AbstractHandlerBehaviour implements Pipeliner {
alshabibaebe7752015-04-07 17:45:42 -070056
57 private static final int CONTROLLER_PRIORITY = 255;
58 private static final int DROP_PRIORITY = 0;
59 private static final int HIGHEST_PRIORITY = 0xffff;
60
61 private final Logger log = getLogger(getClass());
62
63 private ServiceDirectory serviceDirectory;
64 private FlowRuleService flowRuleService;
65 private CoreService coreService;
66 private DeviceId deviceId;
67 private ApplicationId appId;
68
69 @Override
Thomas Vachuskaca88bb72015-04-08 19:38:02 -070070 public void init(DeviceId deviceId, PipelinerContext context) {
71 this.serviceDirectory = context.directory();
alshabibaebe7752015-04-07 17:45:42 -070072 this.deviceId = deviceId;
73
74
75 coreService = serviceDirectory.get(CoreService.class);
76 flowRuleService = serviceDirectory.get(FlowRuleService.class);
77
78 appId = coreService.registerApplication(
79 "org.onosproject.driver.OVSCorsaPipeline");
80
81 pushDefaultRules();
alshabibaebe7752015-04-07 17:45:42 -070082 }
83
84 @Override
85 public Future<Boolean> filter(Collection<FilteringObjective> filteringObjectives) {
alshabib910aff12015-04-09 16:55:57 -070086 Collection<Future<Boolean>> results =
87 Sets.newHashSet();
88 filteringObjectives.stream()
89 .filter(obj -> obj.type() == FilteringObjective.Type.PERMIT)
90 .forEach(obj -> obj.conditions()
91 .forEach(condition ->
92 results.add(processCondition(condition,
93 obj.op() == Objective.Operation.ADD,
94 obj.appId()))
95 ));
96
97 //TODO: return something more helpful/sensible in the future (no pun intended)
98 return results.iterator().next();
99
100 }
101
102 private Future<Boolean> processCondition(Criterion c, boolean install,
103 ApplicationId applicationId) {
104 SettableFuture<Boolean> result = SettableFuture.create();
105 if (c.type() == Criterion.Type.ETH_DST) {
106 Criteria.EthCriterion e = (Criteria.EthCriterion) c;
107 log.debug("adding rule for MAC: {}", e.mac());
108
109 TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
110 TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
111 selector.matchEthDst(e.mac());
112 treatment.transition(FlowRule.Type.VLAN_MPLS);
113 FlowRule rule = new DefaultFlowRule(deviceId, selector.build(),
114 treatment.build(),
115 CONTROLLER_PRIORITY, applicationId, 0,
116 true, FlowRule.Type.FIRST);
117 FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
118 ops = install ? ops.add(rule) : ops.remove(rule);
119 flowRuleService.apply(ops.build(new FlowRuleOperationsContext() {
120 @Override
121 public void onSuccess(FlowRuleOperations ops) {
122 result.set(true);
123 log.info("Provisioned default table for bgp router");
124 }
125
126 @Override
127 public void onError(FlowRuleOperations ops) {
128 result.set(false);
129 log.info("Failed to provision default table for bgp router");
130 }
131 }));
132 }
133 return result;
alshabibaebe7752015-04-07 17:45:42 -0700134 }
135
136 @Override
137 public Future<Boolean> forward(Collection<ForwardingObjective> forwardObjectives) {
138 return null;
139 }
140
141 @Override
142 public Future<Boolean> next(Collection<NextObjective> nextObjectives) {
143 return null;
144 }
145
alshabibaebe7752015-04-07 17:45:42 -0700146 private void pushDefaultRules() {
147 boolean install = true;
148 processTableZero(install);
149 processTableOne(install);
150 processTableTwo(install);
151 processTableFour(install);
152 processTableFive(install);
153 processTableSix(install);
154 processTableNine(install);
155 }
156
157 private void processTableZero(boolean install) {
158 TrafficSelector.Builder selector;
159 TrafficTreatment.Builder treatment;
160
161 // Bcast rule
162 selector = DefaultTrafficSelector.builder();
163 treatment = DefaultTrafficTreatment.builder();
164
165 selector.matchEthDst(MacAddress.BROADCAST);
166 treatment.transition(FlowRule.Type.VLAN_MPLS);
167
168 FlowRule rule = new DefaultFlowRule(deviceId, selector.build(),
169 treatment.build(),
170 CONTROLLER_PRIORITY, appId, 0,
171 true, FlowRule.Type.FIRST);
172
173 FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
174
175 ops = install ? ops.add(rule) : ops.remove(rule);
176
177
alshabibaebe7752015-04-07 17:45:42 -0700178 //Drop rule
179 selector = DefaultTrafficSelector.builder();
180 treatment = DefaultTrafficTreatment.builder();
181
182 treatment.drop();
183
184 rule = new DefaultFlowRule(deviceId, selector.build(),
185 treatment.build(), DROP_PRIORITY, appId,
186 0, true, FlowRule.Type.FIRST);
187
188 ops = install ? ops.add(rule) : ops.remove(rule);
189
190 flowRuleService.apply(ops.build(new FlowRuleOperationsContext() {
191 @Override
192 public void onSuccess(FlowRuleOperations ops) {
193 log.info("Provisioned default table for bgp router");
194 }
195
196 @Override
197 public void onError(FlowRuleOperations ops) {
198 log.info("Failed to provision default table for bgp router");
199 }
200 }));
201
202 }
203
204 private void processTableOne(boolean install) {
205 TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
206 TrafficTreatment.Builder treatment = DefaultTrafficTreatment
207 .builder();
208 FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
209 FlowRule rule;
210
211 selector.matchVlanId(VlanId.ANY);
212 treatment.transition(FlowRule.Type.VLAN);
213
214 rule = new DefaultFlowRule(deviceId, selector.build(),
215 treatment.build(), CONTROLLER_PRIORITY,
216 appId, 0, true, FlowRule.Type.VLAN_MPLS);
217
218 ops = install ? ops.add(rule) : ops.remove(rule);
219
220 flowRuleService.apply(ops.build(new FlowRuleOperationsContext() {
221 @Override
222 public void onSuccess(FlowRuleOperations ops) {
223 log.info("Provisioned vlan/mpls table for bgp router");
224 }
225
226 @Override
227 public void onError(FlowRuleOperations ops) {
228 log.info(
229 "Failed to provision vlan/mpls table for bgp router");
230 }
231 }));
232
233 }
234
235 private void processTableTwo(boolean install) {
236 TrafficSelector.Builder selector;
237 TrafficTreatment.Builder treatment;
238 FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
239 FlowRule rule;
240
241
alshabibaebe7752015-04-07 17:45:42 -0700242 //Drop rule
243 selector = DefaultTrafficSelector.builder();
244 treatment = DefaultTrafficTreatment.builder();
245
246 treatment.drop();
247
248 rule = new DefaultFlowRule(deviceId, selector.build(),
249 treatment.build(), DROP_PRIORITY, appId,
250 0, true, FlowRule.Type.VLAN);
251
252 ops = install ? ops.add(rule) : ops.remove(rule);
253
254 flowRuleService.apply(ops.build(new FlowRuleOperationsContext() {
255 @Override
256 public void onSuccess(FlowRuleOperations ops) {
257 log.info("Provisioned vlan table for bgp router");
258 }
259
260 @Override
261 public void onError(FlowRuleOperations ops) {
262 log.info("Failed to provision vlan table for bgp router");
263 }
264 }));
265 }
266
267 private void processTableFour(boolean install) {
268 TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
269 TrafficTreatment.Builder treatment = DefaultTrafficTreatment
270 .builder();
271 FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
272 FlowRule rule;
273
274 selector.matchEthType(Ethernet.TYPE_ARP);
275 treatment.punt();
276
277 rule = new DefaultFlowRule(deviceId, selector.build(),
278 treatment.build(), CONTROLLER_PRIORITY,
279 appId, 0, true, FlowRule.Type.ETHER);
280
281 ops = install ? ops.add(rule) : ops.remove(rule);
282
283 selector = DefaultTrafficSelector.builder();
284 treatment = DefaultTrafficTreatment.builder();
285
286 selector.matchEthType(Ethernet.TYPE_IPV4);
287 treatment.transition(FlowRule.Type.COS);
288
289 rule = new DefaultFlowRule(deviceId, selector.build(),
290 treatment.build(), CONTROLLER_PRIORITY,
291 appId, 0, true, FlowRule.Type.ETHER);
292
293 ops = install ? ops.add(rule) : ops.remove(rule);
294
295 //Drop rule
296 selector = DefaultTrafficSelector.builder();
297 treatment = DefaultTrafficTreatment.builder();
298
299 treatment.drop();
300
301 rule = new DefaultFlowRule(deviceId, selector.build(),
302 treatment.build(), DROP_PRIORITY, appId,
303 0, true, FlowRule.Type.ETHER);
304
305 ops = install ? ops.add(rule) : ops.remove(rule);
306
307 flowRuleService.apply(ops.build(new FlowRuleOperationsContext() {
308 @Override
309 public void onSuccess(FlowRuleOperations ops) {
310 log.info("Provisioned ether table for bgp router");
311 }
312
313 @Override
314 public void onError(FlowRuleOperations ops) {
315 log.info("Failed to provision ether table for bgp router");
316 }
317 }));
318
319 }
320
321 private void processTableFive(boolean install) {
322 TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
323 TrafficTreatment.Builder treatment = DefaultTrafficTreatment
324 .builder();
325 FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
326 FlowRule rule;
327
328 treatment.transition(FlowRule.Type.IP);
329
330 rule = new DefaultFlowRule(deviceId, selector.build(),
331 treatment.build(), DROP_PRIORITY, appId,
332 0, true, FlowRule.Type.COS);
333
334 ops = install ? ops.add(rule) : ops.remove(rule);
335
336 flowRuleService.apply(ops.build(new FlowRuleOperationsContext() {
337 @Override
338 public void onSuccess(FlowRuleOperations ops) {
339 log.info("Provisioned cos table for bgp router");
340 }
341
342 @Override
343 public void onError(FlowRuleOperations ops) {
344 log.info("Failed to provision cos table for bgp router");
345 }
346 }));
347
348 }
349
350 private void processTableSix(boolean install) {
351 TrafficSelector.Builder selector;
352 TrafficTreatment.Builder treatment;
353 FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
354 FlowRule rule;
355
356 //Drop rule
357 selector = DefaultTrafficSelector.builder();
358 treatment = DefaultTrafficTreatment.builder();
359
360 treatment.drop();
361
362 rule = new DefaultFlowRule(deviceId, selector.build(),
363 treatment.build(), DROP_PRIORITY, appId,
364 0, true, FlowRule.Type.IP);
365
366 ops = install ? ops.add(rule) : ops.remove(rule);
367
368 flowRuleService.apply(ops.build(new FlowRuleOperationsContext() {
369 @Override
370 public void onSuccess(FlowRuleOperations ops) {
371 log.info("Provisioned FIB table for bgp router");
372 }
373
374 @Override
375 public void onError(FlowRuleOperations ops) {
376 log.info("Failed to provision FIB table for bgp router");
377 }
378 }));
379 }
380
381 private void processTableNine(boolean install) {
382 TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
383 TrafficTreatment.Builder treatment = DefaultTrafficTreatment
384 .builder();
385 FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
386 FlowRule rule;
387
388 treatment.punt();
389
390 rule = new DefaultFlowRule(deviceId, selector.build(),
391 treatment.build(), CONTROLLER_PRIORITY,
392 appId, 0, true, FlowRule.Type.DEFAULT);
393
394 ops = install ? ops.add(rule) : ops.remove(rule);
395
396 flowRuleService.apply(ops.build(new FlowRuleOperationsContext() {
397 @Override
398 public void onSuccess(FlowRuleOperations ops) {
399 log.info("Provisioned Local table for bgp router");
400 }
401
402 @Override
403 public void onError(FlowRuleOperations ops) {
404 log.info("Failed to provision Local table for bgp router");
405 }
406 }));
407 }
408
409}