Support IPv4 multicast in P4 fabric pipeline
- Multicast can use the same table as unicast. Merge into one.
- Allow masked destination MAC in classifier table
Note:
- Pipeliner now translates all exact MAC match to masked match with FF:FF:FF:FF:FF:FF mask.
- Interpreter now only uses masked src/dst MAC
Change-Id: Ibd27ebfb2d72ba929031f07a29927eb6f1844f11
(cherry picked from commit 0865779b66a59a623856b1353615e462af5575c5)
diff --git a/pipelines/fabric/src/main/java/org/onosproject/pipelines/fabric/pipeliner/FabricForwardingPipeliner.java b/pipelines/fabric/src/main/java/org/onosproject/pipelines/fabric/pipeliner/FabricForwardingPipeliner.java
index bdc6d5e..580d398 100644
--- a/pipelines/fabric/src/main/java/org/onosproject/pipelines/fabric/pipeliner/FabricForwardingPipeliner.java
+++ b/pipelines/fabric/src/main/java/org/onosproject/pipelines/fabric/pipeliner/FabricForwardingPipeliner.java
@@ -145,15 +145,13 @@
case L2_BROADCAST:
processL2BroadcastRule(vlanIdCriterion, fwd, resultBuilder);
break;
- case IPV4_UNICAST:
- processIpv4UnicastRule(ipDstCriterion, fwd, resultBuilder);
+ case IPV4_ROUTING:
+ processIpv4RoutingRule(ipDstCriterion, fwd, resultBuilder);
break;
case MPLS:
processMplsRule(mplsCriterion, fwd, resultBuilder);
break;
- case IPV4_MULTICAST:
- case IPV6_UNICAST:
- case IPV6_MULTICAST:
+ case IPV6_ROUTING:
default:
log.warn("Unsupported forwarding function type {}", criteria);
resultBuilder.setError(ObjectiveError.UNSUPPORTED);
@@ -174,7 +172,7 @@
TrafficSelector selector = DefaultTrafficSelector.builder()
.matchVlanId(vlanId)
- .matchEthDst(ethDst)
+ .matchEthDstMasked(ethDst, MacAddress.EXACT_MASK)
.build();
TrafficTreatment treatment = fwd.treatment();
if (fwd.nextId() != null) {
@@ -223,7 +221,7 @@
resultBuilder.addFlowRule(flowRule);
}
- private void processIpv4UnicastRule(IPCriterion ipDstCriterion, ForwardingObjective fwd,
+ private void processIpv4RoutingRule(IPCriterion ipDstCriterion, ForwardingObjective fwd,
PipelinerTranslationResult.Builder resultBuilder) {
checkNotNull(ipDstCriterion, "IP dst criterion should not be null");
TrafficSelector selector = DefaultTrafficSelector.builder()
@@ -232,7 +230,7 @@
TrafficTreatment treatment = fwd.treatment();
if (fwd.nextId() != null) {
treatment = buildSetNextIdTreatment(fwd.nextId(),
- FabricConstants.FABRIC_INGRESS_FORWARDING_SET_NEXT_ID_UNICAST_V4);
+ FabricConstants.FABRIC_INGRESS_FORWARDING_SET_NEXT_ID_ROUTING_V4);
}
FlowRule flowRule = DefaultFlowRule.builder()
.withSelector(selector)
@@ -241,7 +239,7 @@
.withPriority(fwd.priority())
.makePermanent()
.forDevice(deviceId)
- .forTable(FabricConstants.FABRIC_INGRESS_FORWARDING_UNICAST_V4)
+ .forTable(FabricConstants.FABRIC_INGRESS_FORWARDING_ROUTING_V4)
.build();
resultBuilder.addFlowRule(flowRule);