Add JSON codec for ETH_DST_MASKED Criterion

- Enabling for a mcast flow rule to fetch its mask value from JSON dump

Change-Id: I8a69b0244dc332605d14e40998c329802a921286
(cherry picked from commit b62492324b4f913349ff7ed3e0ed3014b3f8f660)
diff --git a/core/common/src/test/java/org/onosproject/codec/impl/CriterionCodecTest.java b/core/common/src/test/java/org/onosproject/codec/impl/CriterionCodecTest.java
index 2a615c7..2628827 100644
--- a/core/common/src/test/java/org/onosproject/codec/impl/CriterionCodecTest.java
+++ b/core/common/src/test/java/org/onosproject/codec/impl/CriterionCodecTest.java
@@ -70,6 +70,8 @@
     final IpPrefix ipPrefix4 = IpPrefix.valueOf("10.1.1.0/24");
     final IpPrefix ipPrefix6 = IpPrefix.valueOf("fe80::/64");
     final MacAddress mac1 = MacAddress.valueOf("00:00:11:00:00:01");
+    final MacAddress mcastMac = MacAddress.valueOf("01:00:5E:00:00:01");
+    final MacAddress mcastMacMask = MacAddress.valueOf("FF:FF:FF:80:00:00");
     final TpPort tpPort = TpPort.tpPort(40000);
     final int tributaryPortNumber = 11;
     final int tributarySlotLen = 80;
@@ -146,6 +148,16 @@
     }
 
     /**
+     * Tests masked ethernet destination criterion (Criterion.Type.ETH_DST_MASKED).
+     */
+    @Test
+    public void matchEthDstMaskTest() {
+        Criterion criterion = Criteria.matchEthDstMasked(mcastMac, mcastMacMask);
+        ObjectNode result = criterionCodec.encode(criterion, context);
+        assertThat(result, matchesCriterion(criterion));
+    }
+
+    /**
      * Tests ethernet source criterion.
      */
     @Test
diff --git a/core/common/src/test/java/org/onosproject/codec/impl/CriterionJsonMatcher.java b/core/common/src/test/java/org/onosproject/codec/impl/CriterionJsonMatcher.java
index bda5515..b19ee53 100644
--- a/core/common/src/test/java/org/onosproject/codec/impl/CriterionJsonMatcher.java
+++ b/core/common/src/test/java/org/onosproject/codec/impl/CriterionJsonMatcher.java
@@ -137,6 +137,14 @@
             description.appendText("mac was " + jsonMac);
             return false;
         }
+        if (criterion.type() == Criterion.Type.ETH_DST_MASKED) {
+            final String macMask = criterion.mask().toString();
+            final String jsonMacMask = jsonCriterion.get("macMask").textValue();
+            if (!macMask.equals(jsonMacMask)) {
+                description.appendText("macMask was " + jsonMacMask);
+                return false;
+            }
+        }
         return true;
     }
 
@@ -657,6 +665,7 @@
                 return matchCriterion((MetadataCriterion) criterion);
 
             case ETH_DST:
+            case ETH_DST_MASKED:
             case ETH_SRC:
                 return matchCriterion((EthCriterion) criterion);