blob: 4c7bdee4b333a774306dbbecca78a46e642f3742 [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
alshabib2a441c62015-04-13 18:39:38 -070018import com.google.common.cache.Cache;
19import com.google.common.cache.CacheBuilder;
20import com.google.common.cache.RemovalCause;
21import com.google.common.cache.RemovalNotification;
alshabibaebe7752015-04-07 17:45:42 -070022import org.onlab.osgi.ServiceDirectory;
23import org.onlab.packet.Ethernet;
24import org.onlab.packet.MacAddress;
25import org.onlab.packet.VlanId;
alshabib2a441c62015-04-13 18:39:38 -070026import org.onlab.util.KryoNamespace;
alshabibaebe7752015-04-07 17:45:42 -070027import org.onosproject.core.ApplicationId;
28import org.onosproject.core.CoreService;
29import org.onosproject.net.DeviceId;
alshabib2a441c62015-04-13 18:39:38 -070030import org.onosproject.net.behaviour.NextGroup;
alshabibaebe7752015-04-07 17:45:42 -070031import org.onosproject.net.behaviour.Pipeliner;
Thomas Vachuskaca88bb72015-04-08 19:38:02 -070032import org.onosproject.net.behaviour.PipelinerContext;
Thomas Vachuskafacc3f52015-04-10 08:58:36 -070033import org.onosproject.net.driver.AbstractHandlerBehaviour;
alshabibaebe7752015-04-07 17:45:42 -070034import org.onosproject.net.flow.DefaultFlowRule;
35import org.onosproject.net.flow.DefaultTrafficSelector;
36import org.onosproject.net.flow.DefaultTrafficTreatment;
37import org.onosproject.net.flow.FlowRule;
38import org.onosproject.net.flow.FlowRuleOperations;
39import org.onosproject.net.flow.FlowRuleOperationsContext;
40import org.onosproject.net.flow.FlowRuleService;
41import org.onosproject.net.flow.TrafficSelector;
42import org.onosproject.net.flow.TrafficTreatment;
alshabib910aff12015-04-09 16:55:57 -070043import org.onosproject.net.flow.criteria.Criteria;
44import org.onosproject.net.flow.criteria.Criterion;
alshabibaebe7752015-04-07 17:45:42 -070045import org.onosproject.net.flowobjective.FilteringObjective;
alshabib2a441c62015-04-13 18:39:38 -070046import org.onosproject.net.flowobjective.FlowObjectiveStore;
alshabibaebe7752015-04-07 17:45:42 -070047import org.onosproject.net.flowobjective.ForwardingObjective;
48import org.onosproject.net.flowobjective.NextObjective;
alshabib910aff12015-04-09 16:55:57 -070049import org.onosproject.net.flowobjective.Objective;
alshabib2a441c62015-04-13 18:39:38 -070050import org.onosproject.net.flowobjective.ObjectiveError;
51import org.onosproject.net.group.DefaultGroupBucket;
52import org.onosproject.net.group.DefaultGroupDescription;
53import org.onosproject.net.group.DefaultGroupKey;
54import org.onosproject.net.group.Group;
55import org.onosproject.net.group.GroupBucket;
56import org.onosproject.net.group.GroupBuckets;
57import org.onosproject.net.group.GroupDescription;
58import org.onosproject.net.group.GroupEvent;
59import org.onosproject.net.group.GroupKey;
60import org.onosproject.net.group.GroupListener;
61import org.onosproject.net.group.GroupService;
alshabibaebe7752015-04-07 17:45:42 -070062import org.slf4j.Logger;
63
64import java.util.Collection;
alshabib2a441c62015-04-13 18:39:38 -070065import java.util.Collections;
66import java.util.Set;
67import java.util.concurrent.Executors;
68import java.util.concurrent.ScheduledExecutorService;
69import java.util.concurrent.TimeUnit;
70import java.util.stream.Collectors;
alshabibaebe7752015-04-07 17:45:42 -070071
alshabib2a441c62015-04-13 18:39:38 -070072import static org.onlab.util.Tools.groupedThreads;
alshabibaebe7752015-04-07 17:45:42 -070073import static org.slf4j.LoggerFactory.getLogger;
74
75/**
alshabib2a441c62015-04-13 18:39:38 -070076 * OpenvSwitch emulation of the Corsa pipeline handler.
alshabibaebe7752015-04-07 17:45:42 -070077 */
Thomas Vachuskafacc3f52015-04-10 08:58:36 -070078public class OVSCorsaPipeline extends AbstractHandlerBehaviour implements Pipeliner {
alshabibaebe7752015-04-07 17:45:42 -070079
80 private static final int CONTROLLER_PRIORITY = 255;
81 private static final int DROP_PRIORITY = 0;
82 private static final int HIGHEST_PRIORITY = 0xffff;
83
84 private final Logger log = getLogger(getClass());
85
86 private ServiceDirectory serviceDirectory;
87 private FlowRuleService flowRuleService;
88 private CoreService coreService;
alshabib2a441c62015-04-13 18:39:38 -070089 private GroupService groupService;
90 private FlowObjectiveStore flowObjectiveStore;
alshabibaebe7752015-04-07 17:45:42 -070091 private DeviceId deviceId;
92 private ApplicationId appId;
93
alshabib2a441c62015-04-13 18:39:38 -070094 private KryoNamespace appKryo = new KryoNamespace.Builder()
95 .register(GroupKey.class)
96 .register(DefaultGroupKey.class)
97 .register(CorsaGroup.class)
98 .register(byte[].class)
99 .build();
100
101 private Cache<GroupKey, NextObjective> pendingGroups;
102
103 private ScheduledExecutorService groupChecker =
104 Executors.newScheduledThreadPool(2, groupedThreads("onos/pipeliner",
105 "ovs-corsa-%d"));
106
alshabibaebe7752015-04-07 17:45:42 -0700107 @Override
Thomas Vachuskaca88bb72015-04-08 19:38:02 -0700108 public void init(DeviceId deviceId, PipelinerContext context) {
109 this.serviceDirectory = context.directory();
alshabibaebe7752015-04-07 17:45:42 -0700110 this.deviceId = deviceId;
111
alshabib2a441c62015-04-13 18:39:38 -0700112 pendingGroups = CacheBuilder.newBuilder()
113 .expireAfterWrite(20, TimeUnit.SECONDS)
114 .removalListener((RemovalNotification<GroupKey, NextObjective> notification) -> {
115 if (notification.getCause() == RemovalCause.EXPIRED) {
116 fail(notification.getValue(), ObjectiveError.GROUPINSTALLATIONFAILED);
117 }
118 }).build();
119
120 groupChecker.scheduleAtFixedRate(new GroupChecker(), 0, 500, TimeUnit.MILLISECONDS);
alshabibaebe7752015-04-07 17:45:42 -0700121
122 coreService = serviceDirectory.get(CoreService.class);
123 flowRuleService = serviceDirectory.get(FlowRuleService.class);
alshabib2a441c62015-04-13 18:39:38 -0700124 groupService = serviceDirectory.get(GroupService.class);
125 flowObjectiveStore = context.store();
126
127 groupService.addListener(new InnerGroupListener());
alshabibaebe7752015-04-07 17:45:42 -0700128
129 appId = coreService.registerApplication(
130 "org.onosproject.driver.OVSCorsaPipeline");
131
132 pushDefaultRules();
alshabibaebe7752015-04-07 17:45:42 -0700133 }
134
135 @Override
alshabib2a441c62015-04-13 18:39:38 -0700136 public void filter(FilteringObjective filteringObjective) {
137 if (filteringObjective.type() == FilteringObjective.Type.PERMIT) {
138 processFilter(filteringObjective,
139 filteringObjective.op() == Objective.Operation.ADD,
140 filteringObjective.appId());
141 } else {
142 fail(filteringObjective, ObjectiveError.UNSUPPORTED);
143 }
144 }
alshabib910aff12015-04-09 16:55:57 -0700145
alshabib2a441c62015-04-13 18:39:38 -0700146 @Override
147 public void forward(ForwardingObjective fwd) {
148 Collection<FlowRule> rules;
149 FlowRuleOperations.Builder flowBuilder = FlowRuleOperations.builder();
150
151 rules = processForward(fwd);
152 switch (fwd.op()) {
153 case ADD:
154 rules.stream()
155 .filter(rule -> rule != null)
156 .forEach(flowBuilder::add);
157 break;
158 case REMOVE:
159 rules.stream()
160 .filter(rule -> rule != null)
161 .forEach(flowBuilder::remove);
162 break;
163 default:
164 fail(fwd, ObjectiveError.UNKNOWN);
165 log.warn("Unknown forwarding type {}", fwd.op());
166 }
167
168
169 flowRuleService.apply(flowBuilder.build(new FlowRuleOperationsContext() {
170 @Override
171 public void onSuccess(FlowRuleOperations ops) {
172 pass(fwd);
173 }
174
175 @Override
176 public void onError(FlowRuleOperations ops) {
177 fail(fwd, ObjectiveError.FLOWINSTALLATIONFAILED);
178 }
179 }));
alshabib910aff12015-04-09 16:55:57 -0700180
181 }
182
alshabib2a441c62015-04-13 18:39:38 -0700183 @Override
184 public void next(NextObjective nextObjective) {
185 switch (nextObjective.type()) {
186 case SIMPLE:
187 Collection<TrafficTreatment> treatments = nextObjective.next();
188 if (treatments.size() == 1) {
189 TrafficTreatment treatment = treatments.iterator().next();
190 GroupBucket bucket =
191 DefaultGroupBucket.createIndirectGroupBucket(treatment);
192 final GroupKey key = new DefaultGroupKey(appKryo.serialize(nextObjective.id()));
193 GroupDescription groupDescription
194 = new DefaultGroupDescription(deviceId,
195 GroupDescription.Type.INDIRECT,
196 new GroupBuckets(Collections
197 .singletonList(bucket)),
198 key,
199 nextObjective.appId());
200 groupService.addGroup(groupDescription);
201 pendingGroups.put(key, nextObjective);
202 }
203 break;
204 case HASHED:
205 case BROADCAST:
206 case FAILOVER:
207 fail(nextObjective, ObjectiveError.UNSUPPORTED);
208 log.warn("Unsupported next objective type {}", nextObjective.type());
209 break;
210 default:
211 fail(nextObjective, ObjectiveError.UNKNOWN);
212 log.warn("Unknown next objective type {}", nextObjective.type());
213 }
214
215 }
216
217 private Collection<FlowRule> processForward(ForwardingObjective fwd) {
218 switch (fwd.flag()) {
219 case SPECIFIC:
220 return processSpecific(fwd);
221 case VERSATILE:
222 return processVersatile(fwd);
223 default:
224 fail(fwd, ObjectiveError.UNKNOWN);
225 log.warn("Unknown forwarding flag {}", fwd.flag());
226 }
227 return Collections.emptySet();
228 }
229
230 private Collection<FlowRule> processVersatile(ForwardingObjective fwd) {
231 fail(fwd, ObjectiveError.UNSUPPORTED);
232 return Collections.emptySet();
233 }
234
235 private Collection<FlowRule> processSpecific(ForwardingObjective fwd) {
236 log.warn("Processing specific");
237 TrafficSelector selector = fwd.selector();
238 Criteria.EthTypeCriterion ethType =
239 (Criteria.EthTypeCriterion) selector.getCriterion(Criterion.Type.ETH_TYPE);
240 if (ethType == null || ethType.ethType() != Ethernet.TYPE_IPV4) {
241 fail(fwd, ObjectiveError.UNSUPPORTED);
242 return Collections.emptySet();
243 }
244
245 TrafficSelector filteredSelector =
246 DefaultTrafficSelector.builder()
247 .matchEthType(Ethernet.TYPE_IPV4)
248 .matchIPDst(
249 ((Criteria.IPCriterion)
250 selector.getCriterion(Criterion.Type.IPV4_DST)).ip())
251 .build();
252
253 NextGroup next = flowObjectiveStore.getNextGroup(fwd.nextId());
254
255 GroupKey key = appKryo.deserialize(next.data());
256
257 Group group = groupService.getGroup(deviceId, key);
258
259 if (group == null) {
260 log.warn("The group left!");
261 fail(fwd, ObjectiveError.GROUPMISSING);
262 return Collections.emptySet();
263 }
264
265 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
266 .group(group.id())
267 .build();
268
269 return Collections.singletonList(
270 new DefaultFlowRule(deviceId, filteredSelector, treatment,
271 fwd.priority(), fwd.appId(), 0, fwd.permanent(),
272 FlowRule.Type.IP));
273
274 }
275
276 private void processFilter(FilteringObjective filt, boolean install,
alshabib910aff12015-04-09 16:55:57 -0700277 ApplicationId applicationId) {
Saurav Dascfd63d22015-04-13 16:08:24 -0700278 // This driver only processes filtering criteria defined with switch
279 // ports as the key
alshabib2a441c62015-04-13 18:39:38 -0700280 Criteria.PortCriterion p;
Saurav Dascfd63d22015-04-13 16:08:24 -0700281 if (!filt.key().equals(Criteria.dummy()) &&
282 filt.key().type() == Criterion.Type.IN_PORT) {
283 p = (Criteria.PortCriterion) filt.key();
284 } else {
285 log.warn("No key defined in filtering objective from app: {}. Not"
286 + "processing filtering objective", applicationId);
alshabib2a441c62015-04-13 18:39:38 -0700287 fail(filt, ObjectiveError.UNKNOWN);
288 return;
alshabib910aff12015-04-09 16:55:57 -0700289 }
Saurav Dascfd63d22015-04-13 16:08:24 -0700290 // convert filtering conditions for switch-intfs into flowrules
291 FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
292 for (Criterion c : filt.conditions()) {
293 if (c.type() == Criterion.Type.ETH_DST) {
294 Criteria.EthCriterion e = (Criteria.EthCriterion) c;
295 log.debug("adding rule for MAC: {}", e.mac());
296 TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
297 TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
298 selector.matchEthDst(e.mac());
299 treatment.transition(FlowRule.Type.VLAN_MPLS);
300 FlowRule rule = new DefaultFlowRule(deviceId, selector.build(),
301 treatment.build(),
302 CONTROLLER_PRIORITY, applicationId,
303 0, true, FlowRule.Type.FIRST);
304 ops = install ? ops.add(rule) : ops.remove(rule);
305 } else if (c.type() == Criterion.Type.VLAN_VID) {
306 Criteria.VlanIdCriterion v = (Criteria.VlanIdCriterion) c;
307 log.debug("adding rule for VLAN: {}", v.vlanId());
308 TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
309 TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
310 selector.matchVlanId(v.vlanId());
311 selector.matchInPort(p.port());
312 treatment.transition(FlowRule.Type.ETHER);
313 treatment.deferred().popVlan();
314 FlowRule rule = new DefaultFlowRule(deviceId, selector.build(),
315 treatment.build(),
316 CONTROLLER_PRIORITY, applicationId,
317 0, true, FlowRule.Type.VLAN);
318 ops = install ? ops.add(rule) : ops.remove(rule);
319 } else if (c.type() == Criterion.Type.IPV4_DST) {
320 Criteria.IPCriterion ip = (Criteria.IPCriterion) c;
321 log.debug("adding rule for IP: {}", ip.ip());
322 TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
323 TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
324 selector.matchEthType(Ethernet.TYPE_IPV4);
325 selector.matchIPDst(ip.ip());
326 treatment.transition(FlowRule.Type.ACL);
327 FlowRule rule = new DefaultFlowRule(deviceId, selector.build(),
328 treatment.build(), HIGHEST_PRIORITY, appId,
329 0, true, FlowRule.Type.IP);
330 ops = install ? ops.add(rule) : ops.remove(rule);
331 } else {
332 log.warn("Driver does not currently process filtering condition"
333 + " of type: {}", c.type());
alshabib2a441c62015-04-13 18:39:38 -0700334 fail(filt, ObjectiveError.UNSUPPORTED);
Saurav Dascfd63d22015-04-13 16:08:24 -0700335 }
336 }
337 // apply filtering flow rules
338 flowRuleService.apply(ops.build(new FlowRuleOperationsContext() {
339 @Override
340 public void onSuccess(FlowRuleOperations ops) {
alshabib2a441c62015-04-13 18:39:38 -0700341 pass(filt);
Saurav Dascfd63d22015-04-13 16:08:24 -0700342 log.info("Provisioned default table for bgp router");
343 }
344
345 @Override
346 public void onError(FlowRuleOperations ops) {
alshabib2a441c62015-04-13 18:39:38 -0700347 fail(filt, ObjectiveError.FLOWINSTALLATIONFAILED);
Saurav Dascfd63d22015-04-13 16:08:24 -0700348 log.info("Failed to provision default table for bgp router");
349 }
350 }));
alshabibaebe7752015-04-07 17:45:42 -0700351 }
352
alshabib2a441c62015-04-13 18:39:38 -0700353 private void pass(Objective obj) {
354 if (obj.context().isPresent()) {
355 obj.context().get().onSuccess(obj);
356 }
alshabibaebe7752015-04-07 17:45:42 -0700357 }
358
alshabib2a441c62015-04-13 18:39:38 -0700359 private void fail(Objective obj, ObjectiveError error) {
360 if (obj.context().isPresent()) {
361 obj.context().get().onError(obj, error);
362 }
alshabibaebe7752015-04-07 17:45:42 -0700363 }
364
alshabibaebe7752015-04-07 17:45:42 -0700365 private void pushDefaultRules() {
alshabib2a441c62015-04-13 18:39:38 -0700366 processTableZero(true);
367 processTableOne(true);
368 processTableTwo(true);
369 processTableFour(true);
370 processTableFive(true);
371 processTableSix(true);
372 processTableNine(true);
alshabibaebe7752015-04-07 17:45:42 -0700373 }
374
375 private void processTableZero(boolean install) {
376 TrafficSelector.Builder selector;
377 TrafficTreatment.Builder treatment;
378
379 // Bcast rule
380 selector = DefaultTrafficSelector.builder();
381 treatment = DefaultTrafficTreatment.builder();
382
383 selector.matchEthDst(MacAddress.BROADCAST);
384 treatment.transition(FlowRule.Type.VLAN_MPLS);
385
386 FlowRule rule = new DefaultFlowRule(deviceId, selector.build(),
387 treatment.build(),
388 CONTROLLER_PRIORITY, appId, 0,
389 true, FlowRule.Type.FIRST);
390
391 FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
392
393 ops = install ? ops.add(rule) : ops.remove(rule);
394
395
alshabibaebe7752015-04-07 17:45:42 -0700396 //Drop rule
397 selector = DefaultTrafficSelector.builder();
398 treatment = DefaultTrafficTreatment.builder();
399
400 treatment.drop();
401
402 rule = new DefaultFlowRule(deviceId, selector.build(),
403 treatment.build(), DROP_PRIORITY, appId,
404 0, true, FlowRule.Type.FIRST);
405
406 ops = install ? ops.add(rule) : ops.remove(rule);
407
408 flowRuleService.apply(ops.build(new FlowRuleOperationsContext() {
409 @Override
410 public void onSuccess(FlowRuleOperations ops) {
411 log.info("Provisioned default table for bgp router");
412 }
413
414 @Override
415 public void onError(FlowRuleOperations ops) {
416 log.info("Failed to provision default table for bgp router");
417 }
418 }));
419
420 }
421
422 private void processTableOne(boolean install) {
423 TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
424 TrafficTreatment.Builder treatment = DefaultTrafficTreatment
425 .builder();
426 FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
427 FlowRule rule;
428
429 selector.matchVlanId(VlanId.ANY);
430 treatment.transition(FlowRule.Type.VLAN);
431
432 rule = new DefaultFlowRule(deviceId, selector.build(),
433 treatment.build(), CONTROLLER_PRIORITY,
434 appId, 0, true, FlowRule.Type.VLAN_MPLS);
435
436 ops = install ? ops.add(rule) : ops.remove(rule);
437
438 flowRuleService.apply(ops.build(new FlowRuleOperationsContext() {
439 @Override
440 public void onSuccess(FlowRuleOperations ops) {
441 log.info("Provisioned vlan/mpls table for bgp router");
442 }
443
444 @Override
445 public void onError(FlowRuleOperations ops) {
446 log.info(
447 "Failed to provision vlan/mpls table for bgp router");
448 }
449 }));
450
451 }
452
453 private void processTableTwo(boolean install) {
454 TrafficSelector.Builder selector;
455 TrafficTreatment.Builder treatment;
456 FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
457 FlowRule rule;
458
459
alshabibaebe7752015-04-07 17:45:42 -0700460 //Drop rule
461 selector = DefaultTrafficSelector.builder();
462 treatment = DefaultTrafficTreatment.builder();
463
464 treatment.drop();
465
466 rule = new DefaultFlowRule(deviceId, selector.build(),
467 treatment.build(), DROP_PRIORITY, appId,
468 0, true, FlowRule.Type.VLAN);
469
470 ops = install ? ops.add(rule) : ops.remove(rule);
471
472 flowRuleService.apply(ops.build(new FlowRuleOperationsContext() {
473 @Override
474 public void onSuccess(FlowRuleOperations ops) {
475 log.info("Provisioned vlan table for bgp router");
476 }
477
478 @Override
479 public void onError(FlowRuleOperations ops) {
480 log.info("Failed to provision vlan table for bgp router");
481 }
482 }));
483 }
484
485 private void processTableFour(boolean install) {
486 TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
487 TrafficTreatment.Builder treatment = DefaultTrafficTreatment
488 .builder();
489 FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
490 FlowRule rule;
491
492 selector.matchEthType(Ethernet.TYPE_ARP);
493 treatment.punt();
494
495 rule = new DefaultFlowRule(deviceId, selector.build(),
496 treatment.build(), CONTROLLER_PRIORITY,
497 appId, 0, true, FlowRule.Type.ETHER);
498
499 ops = install ? ops.add(rule) : ops.remove(rule);
500
501 selector = DefaultTrafficSelector.builder();
502 treatment = DefaultTrafficTreatment.builder();
503
504 selector.matchEthType(Ethernet.TYPE_IPV4);
505 treatment.transition(FlowRule.Type.COS);
506
507 rule = new DefaultFlowRule(deviceId, selector.build(),
508 treatment.build(), CONTROLLER_PRIORITY,
509 appId, 0, true, FlowRule.Type.ETHER);
510
511 ops = install ? ops.add(rule) : ops.remove(rule);
512
513 //Drop rule
514 selector = DefaultTrafficSelector.builder();
515 treatment = DefaultTrafficTreatment.builder();
516
517 treatment.drop();
518
519 rule = new DefaultFlowRule(deviceId, selector.build(),
520 treatment.build(), DROP_PRIORITY, appId,
521 0, true, FlowRule.Type.ETHER);
522
523 ops = install ? ops.add(rule) : ops.remove(rule);
524
525 flowRuleService.apply(ops.build(new FlowRuleOperationsContext() {
526 @Override
527 public void onSuccess(FlowRuleOperations ops) {
528 log.info("Provisioned ether table for bgp router");
529 }
530
531 @Override
532 public void onError(FlowRuleOperations ops) {
533 log.info("Failed to provision ether table for bgp router");
534 }
535 }));
536
537 }
538
539 private void processTableFive(boolean install) {
540 TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
541 TrafficTreatment.Builder treatment = DefaultTrafficTreatment
542 .builder();
543 FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
544 FlowRule rule;
545
546 treatment.transition(FlowRule.Type.IP);
547
548 rule = new DefaultFlowRule(deviceId, selector.build(),
549 treatment.build(), DROP_PRIORITY, appId,
550 0, true, FlowRule.Type.COS);
551
552 ops = install ? ops.add(rule) : ops.remove(rule);
553
554 flowRuleService.apply(ops.build(new FlowRuleOperationsContext() {
555 @Override
556 public void onSuccess(FlowRuleOperations ops) {
557 log.info("Provisioned cos table for bgp router");
558 }
559
560 @Override
561 public void onError(FlowRuleOperations ops) {
562 log.info("Failed to provision cos table for bgp router");
563 }
564 }));
565
566 }
567
568 private void processTableSix(boolean install) {
569 TrafficSelector.Builder selector;
570 TrafficTreatment.Builder treatment;
571 FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
572 FlowRule rule;
573
574 //Drop rule
575 selector = DefaultTrafficSelector.builder();
576 treatment = DefaultTrafficTreatment.builder();
577
578 treatment.drop();
579
580 rule = new DefaultFlowRule(deviceId, selector.build(),
581 treatment.build(), DROP_PRIORITY, appId,
582 0, true, FlowRule.Type.IP);
583
584 ops = install ? ops.add(rule) : ops.remove(rule);
585
586 flowRuleService.apply(ops.build(new FlowRuleOperationsContext() {
587 @Override
588 public void onSuccess(FlowRuleOperations ops) {
589 log.info("Provisioned FIB table for bgp router");
590 }
591
592 @Override
593 public void onError(FlowRuleOperations ops) {
594 log.info("Failed to provision FIB table for bgp router");
595 }
596 }));
597 }
598
599 private void processTableNine(boolean install) {
600 TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
601 TrafficTreatment.Builder treatment = DefaultTrafficTreatment
602 .builder();
603 FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
604 FlowRule rule;
605
606 treatment.punt();
607
608 rule = new DefaultFlowRule(deviceId, selector.build(),
609 treatment.build(), CONTROLLER_PRIORITY,
610 appId, 0, true, FlowRule.Type.DEFAULT);
611
612 ops = install ? ops.add(rule) : ops.remove(rule);
613
614 flowRuleService.apply(ops.build(new FlowRuleOperationsContext() {
615 @Override
616 public void onSuccess(FlowRuleOperations ops) {
617 log.info("Provisioned Local table for bgp router");
618 }
619
620 @Override
621 public void onError(FlowRuleOperations ops) {
622 log.info("Failed to provision Local table for bgp router");
623 }
624 }));
625 }
626
alshabib2a441c62015-04-13 18:39:38 -0700627 private class InnerGroupListener implements GroupListener {
628 @Override
629 public void event(GroupEvent event) {
630 if (event.type() == GroupEvent.Type.GROUP_ADDED) {
631 GroupKey key = event.subject().appCookie();
632
633 NextObjective obj = pendingGroups.getIfPresent(key);
634 if (obj != null) {
635 flowObjectiveStore.putNextGroup(obj.id(), new CorsaGroup(key));
636 pass(obj);
637 pendingGroups.invalidate(key);
638 }
639 }
640 }
641 }
642
643
644 private class GroupChecker implements Runnable {
645
646 @Override
647 public void run() {
648 Set<GroupKey> keys = pendingGroups.asMap().keySet().stream()
649 .filter(key -> groupService.getGroup(deviceId, key) != null)
650 .collect(Collectors.toSet());
651
652 keys.stream().forEach(key -> {
653 NextObjective obj = pendingGroups.getIfPresent(key);
654 if (obj == null) {
655 return;
656 }
657 pass(obj);
658 pendingGroups.invalidate(key);
659 flowObjectiveStore.putNextGroup(obj.id(), new CorsaGroup(key));
660 });
661 }
662 }
663
664 private class CorsaGroup implements NextGroup {
665
666 private final GroupKey key;
667
668 public CorsaGroup(GroupKey key) {
669 this.key = key;
670 }
671
672 public GroupKey key() {
673 return key;
674 }
675
676 @Override
677 public byte[] data() {
678 return appKryo.serialize(key);
679 }
680
681 }
alshabibaebe7752015-04-07 17:45:42 -0700682}