adding a criterion for inner vlans
used by olt to match on the inner vlan

Change-Id: I7671b68d9860d598395cba134a589ca23f264c7e
diff --git a/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficSelector.java b/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficSelector.java
index 0525d8f..779bccd 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficSelector.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficSelector.java
@@ -194,6 +194,16 @@
         }
 
         @Override
+        public Builder matchInnerVlanId(VlanId vlanId) {
+            return add(Criteria.matchInnerVlanId(vlanId));
+        }
+
+        @Override
+        public Builder matchInnerVlanPcp(byte vlanPcp) {
+            return add(Criteria.matchInnerVlanPcp(vlanPcp));
+        }
+
+        @Override
         public Builder matchIPDscp(byte ipDscp) {
             return add(Criteria.matchIPDscp(ipDscp));
         }
diff --git a/core/api/src/main/java/org/onosproject/net/flow/TrafficSelector.java b/core/api/src/main/java/org/onosproject/net/flow/TrafficSelector.java
index 0d055ad..b45dc45 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/TrafficSelector.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/TrafficSelector.java
@@ -129,6 +129,22 @@
         Builder matchVlanPcp(byte vlanPcp);
 
         /**
+         * Matches the inner vlan id.
+         *
+         * @param vlanId a vlan id
+         * @return a selection builder
+         */
+        Builder matchInnerVlanId(VlanId vlanId);
+
+        /**
+         * Matches a vlan priority.
+         *
+         * @param vlanPcp a vlan priority
+         * @return a selection builder
+         */
+        Builder matchInnerVlanPcp(byte vlanPcp);
+
+        /**
          * Matches an IP DSCP (6 bits in ToS field).
          *
          * @param ipDscp an IP DSCP value
diff --git a/core/api/src/main/java/org/onosproject/net/flow/criteria/Criteria.java b/core/api/src/main/java/org/onosproject/net/flow/criteria/Criteria.java
index c94b1e0..0c26b89 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/criteria/Criteria.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/criteria/Criteria.java
@@ -127,6 +127,16 @@
     }
 
     /**
+     * Creates a match on the inner VLAN ID field using the specified value.
+     *
+     * @param vlanId vlan id value
+     * @return match criterion
+     */
+    public static Criterion matchInnerVlanId(VlanId vlanId) {
+        return new VlanIdCriterion(vlanId, Type.INNER_VLAN_VID);
+    }
+
+    /**
      * Creates a match on VLAN PCP field using the specified value.
      *
      * @param vlanPcp vlan pcp value (3 bits)
@@ -137,6 +147,16 @@
     }
 
     /**
+     * Creates a match on the inner VLAN PCP field using the specified value.
+     *
+     * @param vlanPcp vlan pcp value (3 bits)
+     * @return match criterion
+     */
+    public static Criterion matchInnerVlanPcp(byte vlanPcp) {
+        return new VlanPcpCriterion(vlanPcp, Type.INNER_VLAN_PCP);
+    }
+
+    /**
      * Creates a match on IP DSCP field using the specified value.
      *
      * @param ipDscp ip dscp value (6 bits)
diff --git a/core/api/src/main/java/org/onosproject/net/flow/criteria/Criterion.java b/core/api/src/main/java/org/onosproject/net/flow/criteria/Criterion.java
index 17557b9..e6b4939 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/criteria/Criterion.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/criteria/Criterion.java
@@ -50,6 +50,20 @@
         /** VLAN priority. */
         VLAN_PCP,
 
+        /**
+         * Inner VLAN id.
+         *
+         * Note: Some drivers may not support this.
+         */
+        INNER_VLAN_VID,
+
+        /**
+         * Inner VLAN pcp.
+         *
+         * Note: Some drivers may not support this.
+         */
+        INNER_VLAN_PCP,
+
         /** IP DSCP (6 bits in ToS field). */
         IP_DSCP,
 
diff --git a/core/api/src/main/java/org/onosproject/net/flow/criteria/VlanIdCriterion.java b/core/api/src/main/java/org/onosproject/net/flow/criteria/VlanIdCriterion.java
index c73edb1..757e8ce 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/criteria/VlanIdCriterion.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/criteria/VlanIdCriterion.java
@@ -20,12 +20,14 @@
 import java.util.Objects;
 
 import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkArgument;
 
 /**
  * Implementation of VLAN ID criterion.
  */
 public final class VlanIdCriterion implements Criterion {
     private final VlanId vlanId;
+    private final Type type;
 
     /**
      * Constructor.
@@ -34,11 +36,26 @@
      */
     VlanIdCriterion(VlanId vlanId) {
         this.vlanId = vlanId;
+        this.type = Type.VLAN_VID;
+    }
+
+    /**
+     * Constructs a vlan criterion with a specific type.
+     *
+     * @param vlanId a vlan id to match
+     * @param type a criterion type (only INNER_VLAN_VID and VLAN_ID are supported)
+     */
+    VlanIdCriterion(VlanId vlanId, Type type) {
+        checkArgument(
+                type == Type.INNER_VLAN_VID || type == Type.VLAN_VID,
+                "Type can only be inner vlan or vlan");
+        this.vlanId = vlanId;
+        this.type = type;
     }
 
     @Override
     public Type type() {
-        return Type.VLAN_VID;
+        return type;
     }
 
     /**
diff --git a/core/api/src/main/java/org/onosproject/net/flow/criteria/VlanPcpCriterion.java b/core/api/src/main/java/org/onosproject/net/flow/criteria/VlanPcpCriterion.java
index 0c83e14..99607c8 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/criteria/VlanPcpCriterion.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/criteria/VlanPcpCriterion.java
@@ -18,6 +18,7 @@
 import java.util.Objects;
 
 import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkArgument;
 
 /**
  * Implementation of VLAN priority criterion (3 bits).
@@ -25,6 +26,7 @@
 public final class VlanPcpCriterion implements Criterion {
     private static final byte MASK = 0x7;
     private final byte vlanPcp;             // VLAN pcp value: 3 bits
+    private final Type type;
 
     /**
      * Constructor.
@@ -33,11 +35,26 @@
      */
     VlanPcpCriterion(byte vlanPcp) {
         this.vlanPcp = (byte) (vlanPcp & MASK);
+        this.type = Type.VLAN_PCP;
+    }
+
+    /**
+     * Constructs a vlan priority criterion with a specific type.
+     *
+     * @param vlanPcp the VLAN priority to match (3 bits)
+     * @param type a criterion type (only INNER_VLAN_PCP and VLAN_PCP are supported)
+     */
+    VlanPcpCriterion(byte vlanPcp, Type type) {
+        checkArgument(
+                type == Type.INNER_VLAN_PCP || type == Type.VLAN_PCP,
+                "Type can only be inner vlan or vlan");
+        this.vlanPcp = (byte) (vlanPcp & MASK);
+        this.type = type;
     }
 
     @Override
     public Type type() {
-        return Type.VLAN_PCP;
+        return type;
     }
 
     /**