Committed by
Gerrit Code Review
Add driver support for Corsa Pipeline V3
Change-Id: If5c1aa9cec6093e3c9f2f908de6066957d9ad8fd
Showing
5 changed files
with
91 additions
and
14 deletions
... | @@ -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 | } | ... | ... |
This diff is collapsed. Click to expand it.
... | @@ -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" | ... | ... |
-
Please register or login to post a comment