[ONOS-7236] Supports simple IPv4 routing on fabric.p4

Change-Id: Ie92b26361b1d646491bd382f698c0f8f61a058a1
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 d37402d..dfd8d85 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
@@ -29,6 +29,7 @@
 import org.onosproject.net.flow.TrafficTreatment;
 import org.onosproject.net.flow.criteria.Criterion;
 import org.onosproject.net.flow.criteria.EthCriterion;
+import org.onosproject.net.flow.criteria.IPCriterion;
 import org.onosproject.net.flow.criteria.VlanIdCriterion;
 import org.onosproject.net.flowobjective.ForwardingObjective;
 import org.onosproject.net.flowobjective.ObjectiveError;
@@ -95,6 +96,7 @@
 
         VlanIdCriterion vlanIdCriterion = null;
         EthCriterion ethDstCriterion = null;
+        IPCriterion ipDstCriterion = null;
 
         for (Criterion criterion : criteria) {
             switch (criterion.type()) {
@@ -104,6 +106,9 @@
                 case VLAN_VID:
                     vlanIdCriterion = (VlanIdCriterion) criterion;
                     break;
+                case IPV4_DST:
+                    ipDstCriterion = (IPCriterion) criterion;
+                    break;
                 default:
                     log.warn("Unsupported criterion {}", criterion);
                     break;
@@ -120,6 +125,8 @@
                 processL2BroadcastRule(vlanIdCriterion, fwd, resultBuilder);
                 break;
             case IPV4_UNICAST:
+                processIpv4UnicastRule(ipDstCriterion, fwd, resultBuilder);
+                break;
             case IPV4_MULTICAST:
             case IPV6_UNICAST:
             case IPV6_MULTICAST:
@@ -195,6 +202,32 @@
         resultBuilder.addFlowRule(flowRule);
     }
 
+    private void processIpv4UnicastRule(IPCriterion ipDstCriterion, ForwardingObjective fwd,
+                                        PipelinerTranslationResult.Builder resultBuilder) {
+        checkNotNull(ipDstCriterion, "IP dst criterion should not be null");
+        if (fwd.nextId() == null) {
+            log.warn("Forwarding objective for IPv4 unicast should contains next id");
+            resultBuilder.setError(ObjectiveError.BADPARAMS);
+            return;
+        }
+        TrafficSelector selector = DefaultTrafficSelector.builder()
+                .matchIPDst(ipDstCriterion.ip())
+                .build();
+
+        TrafficTreatment treatment = buildSetNextIdTreatment(fwd.nextId());
+        FlowRule flowRule = DefaultFlowRule.builder()
+                .withSelector(selector)
+                .withTreatment(treatment)
+                .fromApp(fwd.appId())
+                .withPriority(fwd.priority())
+                .makePermanent()
+                .forDevice(deviceId)
+                .forTable(FabricConstants.TBL_UNICAST_V4_ID)
+                .build();
+
+        resultBuilder.addFlowRule(flowRule);
+    }
+
     private static TrafficTreatment buildSetNextIdTreatment(Integer nextId) {
         PiActionParam nextIdParam = new PiActionParam(FabricConstants.ACT_PRM_NEXT_ID_ID,
                                                       ImmutableByteSequence.copyFrom(nextId.byteValue()));