Double tagged filtering objective with inner vlan criteria

- when double tagged filtering objective an inner vlan criteria is submitted
- update to ofdpa and ovsofdpa drivers to evaluate the inner vlan criteria correctly

Change-Id: I33170c9b83482a5f26f13f7098a9b24a92da9544
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/RoutingRulePopulator.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/RoutingRulePopulator.java
index 2c6b208..ca9ba42 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/RoutingRulePopulator.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/RoutingRulePopulator.java
@@ -1173,7 +1173,7 @@
         fob.withKey(Criteria.matchInPort(portNum))
                 .addCondition(Criteria.matchEthDst(deviceMac))
                 .addCondition(Criteria.matchVlanId(outerVlan))
-                .addCondition(Criteria.matchVlanId(innerVlan))
+                .addCondition(Criteria.matchInnerVlanId(innerVlan))
                 .withPriority(SegmentRoutingService.DEFAULT_PRIORITY);
 
         TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder();
diff --git a/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/Ofdpa3Pipeline.java b/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/Ofdpa3Pipeline.java
index 2ab8a18..4632a4f 100644
--- a/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/Ofdpa3Pipeline.java
+++ b/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/Ofdpa3Pipeline.java
@@ -314,12 +314,10 @@
                     ethCriterion = (EthCriterion) criterion;
                     break;
                 case VLAN_VID:
-                    if (innervidCriterion == null) {
-                        innervidCriterion = (VlanIdCriterion) criterion;
-                    } else {
-                        outerVidCriterion = innervidCriterion;
-                        innervidCriterion = (VlanIdCriterion) criterion;
-                    }
+                    outerVidCriterion = (VlanIdCriterion) criterion;
+                    break;
+                case INNER_VLAN_VID:
+                    innervidCriterion = (VlanIdCriterion) criterion;
                     break;
                 default:
                     log.warn("Unsupported filter {}", criterion);
diff --git a/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/OfdpaPipelineUtility.java b/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/OfdpaPipelineUtility.java
index 683b9f6..242ab47 100644
--- a/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/OfdpaPipelineUtility.java
+++ b/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/OfdpaPipelineUtility.java
@@ -42,9 +42,7 @@
 import org.onosproject.net.flowobjective.ObjectiveError;
 
 import static org.onosproject.net.behaviour.Pipeliner.ACCUMULATOR_ENABLED;
-import static org.onosproject.net.flow.criteria.Criterion.Type.ETH_TYPE;
-import static org.onosproject.net.flow.criteria.Criterion.Type.MPLS_BOS;
-import static org.onosproject.net.flow.criteria.Criterion.Type.VLAN_VID;
+import static org.onosproject.net.flow.criteria.Criterion.Type.*;
 import static org.onosproject.net.flow.instructions.Instruction.Type.L2MODIFICATION;
 import org.onosproject.net.flow.instructions.L2ModificationInstruction.ModVlanIdInstruction;
 import org.onosproject.net.flow.instructions.L2ModificationInstruction.ModEtherInstruction;
@@ -357,7 +355,8 @@
         return fob.meta() != null &&
                 fob.meta().allInstructions().stream().anyMatch(inst -> inst.type() == L2MODIFICATION
                         && ((L2ModificationInstruction) inst).subtype() == L2SubType.VLAN_POP) &&
-                fob.conditions().stream().filter(criterion -> criterion.type() == VLAN_VID).count() == 2;
+                fob.conditions().stream().anyMatch(criterion -> criterion.type() == VLAN_VID) &&
+                fob.conditions().stream().anyMatch(criterion -> criterion.type() == INNER_VLAN_VID);
     }
 
 }
diff --git a/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/OvsOfdpaPipeline.java b/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/OvsOfdpaPipeline.java
index cc6e100..a9c15d8 100644
--- a/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/OvsOfdpaPipeline.java
+++ b/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/OvsOfdpaPipeline.java
@@ -251,12 +251,10 @@
                     ethCriterion = (EthCriterion) criterion;
                     break;
                 case VLAN_VID:
-                    if (innervidCriterion == null) {
-                        innervidCriterion = (VlanIdCriterion) criterion;
-                    } else {
-                        outerVidCriterion = innervidCriterion;
-                        innervidCriterion = (VlanIdCriterion) criterion;
-                    }
+                    outerVidCriterion = (VlanIdCriterion) criterion;
+                    break;
+                case INNER_VLAN_VID:
+                    innervidCriterion = (VlanIdCriterion) criterion;
                     break;
                 default:
                     log.warn("Unsupported filter {}", criterion);