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);