Jonathan Gravel
Committed by Gerrit Code Review

Add driver support for Corsa Pipeline V3

Change-Id: If5c1aa9cec6093e3c9f2f908de6066957d9ad8fd
...@@ -15,13 +15,17 @@ ...@@ -15,13 +15,17 @@
15 */ 15 */
16 package org.onosproject.driver.handshaker; 16 package org.onosproject.driver.handshaker;
17 17
18 +import org.onosproject.net.meter.MeterId;
18 import org.onosproject.openflow.controller.driver.AbstractOpenFlowSwitch; 19 import org.onosproject.openflow.controller.driver.AbstractOpenFlowSwitch;
19 import org.onosproject.openflow.controller.driver.SwitchDriverSubHandshakeAlreadyStarted; 20 import org.onosproject.openflow.controller.driver.SwitchDriverSubHandshakeAlreadyStarted;
20 import org.onosproject.openflow.controller.driver.SwitchDriverSubHandshakeCompleted; 21 import org.onosproject.openflow.controller.driver.SwitchDriverSubHandshakeCompleted;
21 import org.onosproject.openflow.controller.driver.SwitchDriverSubHandshakeNotStarted; 22 import org.onosproject.openflow.controller.driver.SwitchDriverSubHandshakeNotStarted;
22 import org.projectfloodlight.openflow.protocol.OFBarrierRequest; 23 import org.projectfloodlight.openflow.protocol.OFBarrierRequest;
23 import org.projectfloodlight.openflow.protocol.OFFlowMod; 24 import org.projectfloodlight.openflow.protocol.OFFlowMod;
25 +import org.projectfloodlight.openflow.protocol.OFGroupMod;
26 +import org.projectfloodlight.openflow.protocol.OFGroupType;
24 import org.projectfloodlight.openflow.protocol.OFMessage; 27 import org.projectfloodlight.openflow.protocol.OFMessage;
28 +import org.projectfloodlight.openflow.protocol.OFMeterMod;
25 import org.projectfloodlight.openflow.protocol.OFType; 29 import org.projectfloodlight.openflow.protocol.OFType;
26 import org.projectfloodlight.openflow.types.OFGroup; 30 import org.projectfloodlight.openflow.types.OFGroup;
27 import org.projectfloodlight.openflow.types.TableId; 31 import org.projectfloodlight.openflow.types.TableId;
...@@ -58,6 +62,19 @@ public class CorsaSwitchHandshaker extends AbstractOpenFlowSwitch { ...@@ -58,6 +62,19 @@ public class CorsaSwitchHandshaker extends AbstractOpenFlowSwitch {
58 62
59 sendMsg(Collections.singletonList(fm)); 63 sendMsg(Collections.singletonList(fm));
60 64
65 + OFGroupMod gm = factory().buildGroupDelete()
66 + .setGroup(OFGroup.ALL)
67 + .setGroupType(OFGroupType.ALL)
68 + .build();
69 +
70 + sendMsg(Collections.singletonList(gm));
71 +
72 + OFMeterMod mm = factory().buildMeterMod()
73 + .setMeterId(MeterId.ALL.id())
74 + .build();
75 +
76 + sendMsg(Collections.singletonList(mm));
77 +
61 barrierXid = getNextTransactionId(); 78 barrierXid = getNextTransactionId();
62 OFBarrierRequest barrier = factory().buildBarrierRequest() 79 OFBarrierRequest barrier = factory().buildBarrierRequest()
63 .setXid(barrierXid).build(); 80 .setXid(barrierXid).build();
......
...@@ -26,8 +26,13 @@ import org.onosproject.net.flow.FlowRuleOperations; ...@@ -26,8 +26,13 @@ import org.onosproject.net.flow.FlowRuleOperations;
26 import org.onosproject.net.flow.FlowRuleOperationsContext; 26 import org.onosproject.net.flow.FlowRuleOperationsContext;
27 import org.onosproject.net.flow.TrafficSelector; 27 import org.onosproject.net.flow.TrafficSelector;
28 import org.onosproject.net.flow.TrafficTreatment; 28 import org.onosproject.net.flow.TrafficTreatment;
29 +import org.onosproject.net.flowobjective.ForwardingObjective;
30 +import org.onosproject.net.flowobjective.ObjectiveError;
29 import org.slf4j.Logger; 31 import org.slf4j.Logger;
30 32
33 +import java.util.Collection;
34 +import java.util.Collections;
35 +
31 /** 36 /**
32 * Driver for Corsa TTP. 37 * Driver for Corsa TTP.
33 * 38 *
...@@ -70,7 +75,14 @@ public class CorsaPipeline extends OVSCorsaPipeline { ...@@ -70,7 +75,14 @@ public class CorsaPipeline extends OVSCorsaPipeline {
70 "Failed to provision vlan/mpls table"); 75 "Failed to provision vlan/mpls table");
71 } 76 }
72 })); 77 }));
78 + }
73 79
80 + @Override
81 + protected Collection<FlowRule> processSpecificSwitch(ForwardingObjective fwd) {
82 + /* Not supported by until CorsaPipelineV3 */
83 + log.warn("Vlan switching not supported in corsa-v1 driver");
84 + fail(fwd, ObjectiveError.UNSUPPORTED);
85 + return Collections.emptySet();
74 } 86 }
75 87
76 } 88 }
......
...@@ -67,6 +67,7 @@ import org.onosproject.net.group.GroupEvent; ...@@ -67,6 +67,7 @@ import org.onosproject.net.group.GroupEvent;
67 import org.onosproject.net.group.GroupKey; 67 import org.onosproject.net.group.GroupKey;
68 import org.onosproject.net.group.GroupListener; 68 import org.onosproject.net.group.GroupListener;
69 import org.onosproject.net.group.GroupService; 69 import org.onosproject.net.group.GroupService;
70 +import org.onosproject.net.meter.MeterService;
70 import org.slf4j.Logger; 71 import org.slf4j.Logger;
71 72
72 import java.util.Collection; 73 import java.util.Collection;
...@@ -96,8 +97,8 @@ public class OVSCorsaPipeline extends AbstractHandlerBehaviour implements Pipeli ...@@ -96,8 +97,8 @@ public class OVSCorsaPipeline extends AbstractHandlerBehaviour implements Pipeli
96 97
97 98
98 protected static final int CONTROLLER_PRIORITY = 255; 99 protected static final int CONTROLLER_PRIORITY = 255;
99 - private static final int DROP_PRIORITY = 0; 100 + protected static final int DROP_PRIORITY = 0;
100 - private static final int HIGHEST_PRIORITY = 0xffff; 101 + protected static final int HIGHEST_PRIORITY = 0xffff;
101 102
102 private final Logger log = getLogger(getClass()); 103 private final Logger log = getLogger(getClass());
103 104
...@@ -105,6 +106,7 @@ public class OVSCorsaPipeline extends AbstractHandlerBehaviour implements Pipeli ...@@ -105,6 +106,7 @@ public class OVSCorsaPipeline extends AbstractHandlerBehaviour implements Pipeli
105 protected FlowRuleService flowRuleService; 106 protected FlowRuleService flowRuleService;
106 private CoreService coreService; 107 private CoreService coreService;
107 private GroupService groupService; 108 private GroupService groupService;
109 + protected MeterService meterService;
108 private FlowObjectiveStore flowObjectiveStore; 110 private FlowObjectiveStore flowObjectiveStore;
109 protected DeviceId deviceId; 111 protected DeviceId deviceId;
110 protected ApplicationId appId; 112 protected ApplicationId appId;
...@@ -140,6 +142,7 @@ public class OVSCorsaPipeline extends AbstractHandlerBehaviour implements Pipeli ...@@ -140,6 +142,7 @@ public class OVSCorsaPipeline extends AbstractHandlerBehaviour implements Pipeli
140 coreService = serviceDirectory.get(CoreService.class); 142 coreService = serviceDirectory.get(CoreService.class);
141 flowRuleService = serviceDirectory.get(FlowRuleService.class); 143 flowRuleService = serviceDirectory.get(FlowRuleService.class);
142 groupService = serviceDirectory.get(GroupService.class); 144 groupService = serviceDirectory.get(GroupService.class);
145 + meterService = serviceDirectory.get(MeterService.class);
143 flowObjectiveStore = context.store(); 146 flowObjectiveStore = context.store();
144 147
145 groupService.addListener(new InnerGroupListener()); 148 groupService.addListener(new InnerGroupListener());
...@@ -205,6 +208,7 @@ public class OVSCorsaPipeline extends AbstractHandlerBehaviour implements Pipeli ...@@ -205,6 +208,7 @@ public class OVSCorsaPipeline extends AbstractHandlerBehaviour implements Pipeli
205 Collection<TrafficTreatment> treatments = nextObjective.next(); 208 Collection<TrafficTreatment> treatments = nextObjective.next();
206 if (treatments.size() == 1) { 209 if (treatments.size() == 1) {
207 TrafficTreatment treatment = treatments.iterator().next(); 210 TrafficTreatment treatment = treatments.iterator().next();
211 + treatment = processNextTreatment(treatment);
208 GroupBucket bucket = 212 GroupBucket bucket =
209 DefaultGroupBucket.createIndirectGroupBucket(treatment); 213 DefaultGroupBucket.createIndirectGroupBucket(treatment);
210 final GroupKey key = new DefaultGroupKey(appKryo.serialize(nextObjective.id())); 214 final GroupKey key = new DefaultGroupKey(appKryo.serialize(nextObjective.id()));
...@@ -233,6 +237,11 @@ public class OVSCorsaPipeline extends AbstractHandlerBehaviour implements Pipeli ...@@ -233,6 +237,11 @@ public class OVSCorsaPipeline extends AbstractHandlerBehaviour implements Pipeli
233 237
234 } 238 }
235 239
240 + /* Hook for altering the NextObjective treatment */
241 + protected TrafficTreatment processNextTreatment(TrafficTreatment treatment) {
242 + return treatment; /* Keep treatment as is for OVSCorsaPipeline */
243 + }
244 +
236 private Collection<FlowRule> processForward(ForwardingObjective fwd) { 245 private Collection<FlowRule> processForward(ForwardingObjective fwd) {
237 switch (fwd.flag()) { 246 switch (fwd.flag()) {
238 case SPECIFIC: 247 case SPECIFIC:
...@@ -301,22 +310,32 @@ public class OVSCorsaPipeline extends AbstractHandlerBehaviour implements Pipeli ...@@ -301,22 +310,32 @@ public class OVSCorsaPipeline extends AbstractHandlerBehaviour implements Pipeli
301 private Collection<FlowRule> processSpecific(ForwardingObjective fwd) { 310 private Collection<FlowRule> processSpecific(ForwardingObjective fwd) {
302 log.debug("Processing specific forwarding objective"); 311 log.debug("Processing specific forwarding objective");
303 TrafficSelector selector = fwd.selector(); 312 TrafficSelector selector = fwd.selector();
313 +
304 EthTypeCriterion ethType = 314 EthTypeCriterion ethType =
305 (EthTypeCriterion) selector.getCriterion(Criterion.Type.ETH_TYPE); 315 (EthTypeCriterion) selector.getCriterion(Criterion.Type.ETH_TYPE);
306 - if (ethType == null || ethType.ethType().toShort() != Ethernet.TYPE_IPV4) { 316 + if (ethType != null) {
307 - fail(fwd, ObjectiveError.UNSUPPORTED); 317 + short et = ethType.ethType().toShort();
308 - return Collections.emptySet(); 318 + if (et == Ethernet.TYPE_IPV4) {
319 + return processSpecificRoute(fwd);
320 + } else if (et == Ethernet.TYPE_VLAN) {
321 + /* The ForwardingObjective must specify VLAN ethtype in order to use the Transit Circuit */
322 + return processSpecificSwitch(fwd);
323 + }
309 } 324 }
310 325
326 + fail(fwd, ObjectiveError.UNSUPPORTED);
327 + return Collections.emptySet();
328 + }
329 +
330 + private Collection<FlowRule> processSpecificRoute(ForwardingObjective fwd) {
311 TrafficSelector filteredSelector = 331 TrafficSelector filteredSelector =
312 DefaultTrafficSelector.builder() 332 DefaultTrafficSelector.builder()
313 .matchEthType(Ethernet.TYPE_IPV4) 333 .matchEthType(Ethernet.TYPE_IPV4)
314 .matchIPDst( 334 .matchIPDst(
315 - ((IPCriterion) 335 + ((IPCriterion) fwd.selector().getCriterion(Criterion.Type.IPV4_DST)).ip())
316 - selector.getCriterion(Criterion.Type.IPV4_DST)).ip())
317 .build(); 336 .build();
318 337
319 - TrafficTreatment.Builder tb = DefaultTrafficTreatment.builder(); 338 + TrafficTreatment.Builder tb = processSpecificRoutingTreatment();
320 339
321 if (fwd.nextId() != null) { 340 if (fwd.nextId() != null) {
322 NextGroup next = flowObjectiveStore.getNextGroup(fwd.nextId()); 341 NextGroup next = flowObjectiveStore.getNextGroup(fwd.nextId());
...@@ -337,20 +356,35 @@ public class OVSCorsaPipeline extends AbstractHandlerBehaviour implements Pipeli ...@@ -337,20 +356,35 @@ public class OVSCorsaPipeline extends AbstractHandlerBehaviour implements Pipeli
337 .withSelector(filteredSelector) 356 .withSelector(filteredSelector)
338 .withTreatment(tb.build()); 357 .withTreatment(tb.build());
339 358
359 + ruleBuilder = processSpecificRoutingRule(ruleBuilder);
360 +
340 if (fwd.permanent()) { 361 if (fwd.permanent()) {
341 ruleBuilder.makePermanent(); 362 ruleBuilder.makePermanent();
342 } else { 363 } else {
343 ruleBuilder.makeTemporary(fwd.timeout()); 364 ruleBuilder.makeTemporary(fwd.timeout());
344 } 365 }
345 366
346 - ruleBuilder.forTable(FIB_TABLE); 367 + return Collections.singletonList(ruleBuilder.build());
368 + }
347 369
370 + /* Hook for modifying Route traffic treatment */
371 + protected TrafficTreatment.Builder processSpecificRoutingTreatment() {
372 + return DefaultTrafficTreatment.builder();
373 + }
348 374
349 - return Collections.singletonList(ruleBuilder.build()); 375 + /* Hook for modifying Route flow rule */
376 + protected FlowRule.Builder processSpecificRoutingRule(FlowRule.Builder rb) {
377 + return rb.forTable(FIB_TABLE);
378 + }
350 379
380 + protected Collection<FlowRule> processSpecificSwitch(ForwardingObjective fwd) {
381 + /* Not supported by until CorsaPipelineV3 */
382 + log.warn("Vlan switching not supported in ovs-corsa driver");
383 + fail(fwd, ObjectiveError.UNSUPPORTED);
384 + return Collections.emptySet();
351 } 385 }
352 386
353 - private void processFilter(FilteringObjective filt, boolean install, 387 + protected void processFilter(FilteringObjective filt, boolean install,
354 ApplicationId applicationId) { 388 ApplicationId applicationId) {
355 // This driver only processes filtering criteria defined with switch 389 // This driver only processes filtering criteria defined with switch
356 // ports as the key 390 // ports as the key
...@@ -441,19 +475,19 @@ public class OVSCorsaPipeline extends AbstractHandlerBehaviour implements Pipeli ...@@ -441,19 +475,19 @@ public class OVSCorsaPipeline extends AbstractHandlerBehaviour implements Pipeli
441 })); 475 }));
442 } 476 }
443 477
444 - private void pass(Objective obj) { 478 + protected void pass(Objective obj) {
445 if (obj.context().isPresent()) { 479 if (obj.context().isPresent()) {
446 obj.context().get().onSuccess(obj); 480 obj.context().get().onSuccess(obj);
447 } 481 }
448 } 482 }
449 483
450 - private void fail(Objective obj, ObjectiveError error) { 484 + protected void fail(Objective obj, ObjectiveError error) {
451 if (obj.context().isPresent()) { 485 if (obj.context().isPresent()) {
452 obj.context().get().onError(obj, error); 486 obj.context().get().onError(obj, error);
453 } 487 }
454 } 488 }
455 489
456 - private void initializePipeline() { 490 + protected void initializePipeline() {
457 processMacTable(true); 491 processMacTable(true);
458 processVlanMplsTable(true); 492 processVlanMplsTable(true);
459 processVlanTable(true); 493 processVlanTable(true);
......
...@@ -84,6 +84,20 @@ ...@@ -84,6 +84,20 @@
84 <behaviour api="org.onosproject.openflow.controller.driver.OpenFlowSwitchDriver" 84 <behaviour api="org.onosproject.openflow.controller.driver.OpenFlowSwitchDriver"
85 impl="org.onosproject.driver.handshaker.CorsaSwitchHandshaker"/> 85 impl="org.onosproject.driver.handshaker.CorsaSwitchHandshaker"/>
86 </driver> 86 </driver>
87 + <driver name="corsa-v1"
88 + manufacturer="Corsa" hwVersion="Corsa Element" swVersion="2.3.1">
89 + <behaviour api="org.onosproject.net.behaviour.Pipeliner"
90 + impl="org.onosproject.driver.pipeline.CorsaPipeline"/>
91 + <behaviour api="org.onosproject.openflow.controller.driver.OpenFlowSwitchDriver"
92 + impl="org.onosproject.driver.handshaker.CorsaSwitchHandshaker"/>
93 + </driver>
94 + <driver name="corsa-v3"
95 + manufacturer="Corsa" hwVersion="Corsa Element" swVersion="2.3.1">
96 + <behaviour api="org.onosproject.net.behaviour.Pipeliner"
97 + impl="org.onosproject.driver.pipeline.CorsaPipelineV3"/>
98 + <behaviour api="org.onosproject.openflow.controller.driver.OpenFlowSwitchDriver"
99 + impl="org.onosproject.driver.handshaker.CorsaSwitchHandshaker"/>
100 + </driver>
87 <driver name="ofdpa" extends="default" 101 <driver name="ofdpa" extends="default"
88 manufacturer="Broadcom Corp." hwVersion="OF-DPA.*" swVersion="OF-DPA.*"> 102 manufacturer="Broadcom Corp." hwVersion="OF-DPA.*" swVersion="OF-DPA.*">
89 <behaviour api="org.onosproject.net.behaviour.Pipeliner" 103 <behaviour api="org.onosproject.net.behaviour.Pipeliner"
......