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;
}
/**