MPLS label selector and treatment

Change-Id: Id1fba1e04155e6d97de4c8fd95573641537f1b7a
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/criteria/Criteria.java b/core/api/src/main/java/org/onlab/onos/net/flow/criteria/Criteria.java
index 61fe54d..83ade8b 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/criteria/Criteria.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/criteria/Criteria.java
@@ -149,6 +149,16 @@
     }
 
     /**
+     * Creates a match on MPLS label.
+     * @param mplsLabel MPLS label
+     * @return match criterion
+     */
+
+    public static Criterion matchMplsLabel(Integer mplsLabel) {
+        return new MplsCriterion(mplsLabel);
+    }
+
+    /**
      * Creates a match on lambda field using the specified value.
      *
      * @param lambda lamda to match on
@@ -541,6 +551,52 @@
         }
     }
 
+    public static final class MplsCriterion implements Criterion {
+
+        private final Integer mplsLabel;
+
+        public MplsCriterion(Integer mplsLabel) {
+            this.mplsLabel = mplsLabel;
+        }
+
+        @Override
+        public Type type() {
+            return Type.MPLS_LABEL;
+        }
+
+        public Integer label() {
+            return mplsLabel;
+        }
+
+        @Override
+        public String toString() {
+            return toStringHelper(type().toString())
+                    .add("mpls", mplsLabel.intValue()).toString();
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(mplsLabel, type());
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj) {
+                return true;
+            }
+            if (obj instanceof MplsCriterion) {
+                MplsCriterion that = (MplsCriterion) obj;
+                return Objects.equals(mplsLabel, that.mplsLabel) &&
+                        Objects.equals(this.type(), that.type());
+
+
+            }
+            return false;
+        }
+
+    }
+
+
     public static final class LambdaCriterion implements Criterion {
 
         private final short lambda;