Adding ACL flow for Table 60 for Ipv6

Change-Id: Iab5a510ab77e2f50a9d8f28fe22edf053efc1884
diff --git a/drivers/default/src/main/java/org/onosproject/driver/pipeline/XpliantPipeline.java b/drivers/default/src/main/java/org/onosproject/driver/pipeline/XpliantPipeline.java
index b5b202d..2dca42d 100644
--- a/drivers/default/src/main/java/org/onosproject/driver/pipeline/XpliantPipeline.java
+++ b/drivers/default/src/main/java/org/onosproject/driver/pipeline/XpliantPipeline.java
@@ -57,4 +57,9 @@
     public boolean requireMplsTtlModification() {
         return false;
     }
+
+    @Override
+    protected boolean requireEthType() {
+        return false;
+    }
 }
diff --git a/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/CpqdOfdpa2Pipeline.java b/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/CpqdOfdpa2Pipeline.java
index de19330..2e14efa 100644
--- a/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/CpqdOfdpa2Pipeline.java
+++ b/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/CpqdOfdpa2Pipeline.java
@@ -138,6 +138,11 @@
         return false;
     }
 
+    @Override
+    protected boolean requireEthType() {
+        return false;
+    }
+
     /**
      * Determines whether this pipeline support copy ttl instructions or not.
      *
diff --git a/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/Ofdpa2Pipeline.java b/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/Ofdpa2Pipeline.java
index ad025b4..f282a00 100644
--- a/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/Ofdpa2Pipeline.java
+++ b/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/Ofdpa2Pipeline.java
@@ -96,6 +96,7 @@
 import java.util.Timer;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import static java.util.concurrent.Executors.newScheduledThreadPool;
 import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor;
@@ -203,6 +204,16 @@
     }
 
     /**
+     * Determines whether this pipeline requires one additional flow matching on ethType 0x86dd in ACL table.
+     *
+     * @return true to create one additional flow matching on ethType 0x86dd in ACL table
+     */
+     protected boolean requireEthType() {
+         return true;
+     }
+
+
+    /**
      * Determines whether this pipeline requires MPLS BOS match.
      *
      * @return true to use MPLS BOS match
@@ -1063,6 +1074,8 @@
     protected Collection<FlowRule> processVersatile(ForwardingObjective fwd) {
         log.debug("Processing versatile forwarding objective:{} in dev:{}",
                  fwd.id(), deviceId);
+        List<FlowRule> flowRules = new ArrayList<>();
+        final AtomicBoolean ethTypeUsed  = new AtomicBoolean(false);
 
         if (fwd.nextId() == null && fwd.treatment() == null) {
             log.error("Forwarding objective {} from {} must contain "
@@ -1110,7 +1123,10 @@
                 } else {
                     sbuilder.add(criterion);
                 }
-            } else {
+            } else if (criterion instanceof EthTypeCriterion) {
+                    sbuilder.add(criterion);
+                    ethTypeUsed.set(true);
+             } else {
                 sbuilder.add(criterion);
             }
         });
@@ -1165,7 +1181,24 @@
                 .withTreatment(ttBuilder.build())
                 .makePermanent()
                 .forTable(ACL_TABLE);
-        return Collections.singletonList(ruleBuilder.build());
+
+        flowRules.add(ruleBuilder.build());
+
+         if (!ethTypeUsed.get() && requireEthType()) {
+            log.debug("{} doesn't match on ethType but requireEthType is true, adding complementary ACL flow.",
+                       sbuilder.toString());
+            sbuilder.matchEthType(Ethernet.TYPE_IPV6);
+            FlowRule.Builder ethTypeRuleBuilder = DefaultFlowRule.builder()
+                    .fromApp(fwd.appId())
+                    .withPriority(fwd.priority())
+                    .forDevice(deviceId)
+                    .withSelector(sbuilder.build())
+                    .withTreatment(ttBuilder.build())
+                    .makePermanent()
+                    .forTable(ACL_TABLE);
+            flowRules.add(ethTypeRuleBuilder.build());
+        }
+        return flowRules;
     }
 
     /**
diff --git a/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/OvsOfdpa2Pipeline.java b/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/OvsOfdpa2Pipeline.java
index 3aa8865..97c6143 100644
--- a/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/OvsOfdpa2Pipeline.java
+++ b/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/OvsOfdpa2Pipeline.java
@@ -55,4 +55,9 @@
     protected boolean supportsUnicastBlackHole() {
         return true;
     }
+
+    @Override
+    protected boolean requireEthType() {
+        return false;
+    }
 }