[ONOS-3513] Implement PBB I-SID Criterion and test case to Southbound

Change-Id: Ic6836cb7df1eb2d8b871b85029a1a8e31add1289
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 dd31ad4..c94b1e0 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
@@ -581,6 +581,16 @@
     }
 
     /**
+     * Creates a match on PBB I-SID field using the specific value.
+     *
+     * @param pbbIsid PBB I-SID
+     * @return match criterion
+     */
+    public static Criterion matchPbbIsid(int pbbIsid) {
+        return new PbbIsidCriterion(pbbIsid);
+    }
+
+    /**
      * Creates an extension criterion for the specified extension selector.
      *
      * @param extensionSelector extension selector
diff --git a/core/api/src/main/java/org/onosproject/net/flow/criteria/PbbIsidCriterion.java b/core/api/src/main/java/org/onosproject/net/flow/criteria/PbbIsidCriterion.java
new file mode 100644
index 0000000..979aa6b
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/flow/criteria/PbbIsidCriterion.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.net.flow.criteria;
+
+import java.util.Objects;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+/**
+ * Implementation of PBB I-SID criterion (24 bits unsigned integer).
+ */
+public final class PbbIsidCriterion implements Criterion {
+    private static final int MASK = 0xfffff;
+    private final int pbbIsid;              // PBB I-SID: 24 bits
+
+    /**
+     * Constructor.
+     *
+     * @param pbbIsid the PBB I-SID to match (24 bits)
+     */
+    PbbIsidCriterion(int pbbIsid) {
+        this.pbbIsid = pbbIsid & MASK;
+    }
+
+    @Override
+    public Criterion.Type type() {
+        return Criterion.Type.PBB_ISID;
+    }
+
+    /**
+     * Gets the PBB I-SID to match.
+     *
+     * @return the PBB I-SID to match (24 bits)
+     */
+    public int pbbIsid() {
+        return this.pbbIsid;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(type().toString())
+                .add("pbbIsid", Long.toHexString(pbbIsid)).toString();
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(type().ordinal(), pbbIsid);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof PbbIsidCriterion) {
+            PbbIsidCriterion that = (PbbIsidCriterion) obj;
+            return Objects.equals(pbbIsid, that.pbbIsid) &&
+                    Objects.equals(this.type(), that.type());
+        }
+        return false;
+    }
+}
diff --git a/core/api/src/test/java/org/onosproject/net/flow/criteria/CriteriaTest.java b/core/api/src/test/java/org/onosproject/net/flow/criteria/CriteriaTest.java
index d463e82..d113fb9 100644
--- a/core/api/src/test/java/org/onosproject/net/flow/criteria/CriteriaTest.java
+++ b/core/api/src/test/java/org/onosproject/net/flow/criteria/CriteriaTest.java
@@ -279,6 +279,12 @@
     Criterion sameAsMatchOduSignalType1 = Criteria.matchOduSignalType(oduSigType1);
     Criterion matchOduSignalType2 = Criteria.matchOduSignalType(oduSigType2);
 
+    int pbbIsid1 = 1;
+    int pbbIsid2 = 2;
+    Criterion matchPbbIsid1 = Criteria.matchPbbIsid(pbbIsid1);
+    Criterion sameAsMatchPbbIsid1 = Criteria.matchPbbIsid(pbbIsid1);
+    Criterion matchPbbIsid2 = Criteria.matchPbbIsid(pbbIsid2);
+
     /**
      * Checks that a Criterion object has the proper type, and then converts
      * it to the proper type.
@@ -337,6 +343,7 @@
         assertThatClassIsImmutable(LambdaCriterion.class);
         assertThatClassIsImmutable(OduSignalIdCriterion.class);
         assertThatClassIsImmutable(OduSignalTypeCriterion.class);
+        assertThatClassIsImmutable(PbbIsidCriterion.class);
     }
 
     // PortCriterion class
@@ -1218,4 +1225,30 @@
                 .addEqualityGroup(matchOduSignalType2)
                 .testEquals();
     }
+
+    // PbbIsidCriterion class
+
+    /**
+     * Test the matchPbbIsid method.
+     */
+    @Test
+    public void testMatchPbbIsidMethod() {
+        Criterion matchPbbIsid = Criteria.matchPbbIsid(pbbIsid1);
+        PbbIsidCriterion pbbIsidCriterion =
+                checkAndConvert(matchPbbIsid,
+                        Criterion.Type.PBB_ISID,
+                        PbbIsidCriterion.class);
+        assertThat(pbbIsidCriterion.pbbIsid(), is(equalTo(pbbIsid1)));
+    }
+
+    /**
+     * Test the equals() method of the PbbIsidCriterion class.
+     */
+    @Test
+    public void testPbbIsidCriterionEquals() {
+        new EqualsTester()
+                .addEqualityGroup(matchPbbIsid1, sameAsMatchPbbIsid1)
+                .addEqualityGroup(matchPbbIsid2)
+                .testEquals();
+    }
 }
diff --git a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilder.java b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilder.java
index 7a6aeea..dcd7b0f 100644
--- a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilder.java
+++ b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilder.java
@@ -498,6 +498,7 @@
                 break;
             case MPLS_TC:
             case PBB_ISID:
+                // TODO: need to implement PBB-ISID case when OpenFlowJ is ready
             default:
                 log.warn("Match type {} not yet implemented.", c.type());
             }