Adding eth masking in match

Change-Id: I95e0ee66b1c6c139de7672f9bc04871fd0ead6d7
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 6e5f466..a0a171ad 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
@@ -174,11 +174,21 @@
         }
 
         @Override
+        public Builder matchEthDstMasked(MacAddress addr, MacAddress mask) {
+            return add(Criteria.matchEthDstMasked(addr, mask));
+        }
+
+        @Override
         public Builder matchEthSrc(MacAddress addr) {
             return add(Criteria.matchEthSrc(addr));
         }
 
         @Override
+        public Builder matchEthSrcMasked(MacAddress addr, MacAddress mask) {
+            return add(Criteria.matchEthSrcMasked(addr, mask));
+        }
+
+        @Override
         public Builder matchEthType(short ethType) {
             return add(Criteria.matchEthType(ethType));
         }
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 b45dc45..dddacea 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
@@ -97,6 +97,15 @@
         Builder matchEthDst(MacAddress addr);
 
         /**
+         * Matches a l2 dst address with mask.
+         *
+         * @param addr a l2 address
+         * @param mask a mask for an l2 address
+         * @return a selection builder
+         */
+        Builder matchEthDstMasked(MacAddress addr, MacAddress mask);
+
+        /**
          * Matches a l2 src address.
          *
          * @param addr a l2 address
@@ -105,6 +114,15 @@
         Builder matchEthSrc(MacAddress addr);
 
         /**
+         * Matches a l2 src address with mask.
+         *
+         * @param addr a l2 address
+         * @param mask a mask for an l2 address
+         * @return a selection builder
+         */
+        Builder matchEthSrcMasked(MacAddress addr, MacAddress mask);
+
+        /**
          * Matches the ethernet type.
          *
          * @param ethType an ethernet type
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 4259f5d..e306871 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
@@ -86,6 +86,17 @@
     }
 
     /**
+     * Creates a masked match on ETH_DST field using the specified value and mask.
+     *
+     * @param mac MAC address value
+     * @param mask MAC address masking
+     * @return match criterion
+     */
+    public static Criterion matchEthDstMasked(MacAddress mac, MacAddress mask) {
+        return new EthCriterion(mac, mask, Type.ETH_DST_MASKED);
+    }
+
+    /**
      * Creates a match on ETH_SRC field using the specified value. This value
      * may be a wildcard mask.
      *
@@ -97,6 +108,17 @@
     }
 
     /**
+     * Creates a masked match on ETH_SRC field using the specified value and mask.
+     *
+     * @param mac MAC address value
+     * @param mask MAC address masking
+     * @return match criterion
+     */
+    public static Criterion matchEthSrcMasked(MacAddress mac, MacAddress mask) {
+        return new EthCriterion(mac, mask, Type.ETH_SRC_MASKED);
+    }
+
+    /**
      * Creates a match on ETH_TYPE field using the specified value.
      *
      * @param ethType eth type value (16 bits unsigned integer)
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 5b2cfcc..c58bd6c 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
@@ -40,9 +40,15 @@
         /** Ethernet destination address. */
         ETH_DST,
 
+        /** Ethernet destination address with masking. */
+        ETH_DST_MASKED,
+
         /** Ethernet source address. */
         ETH_SRC,
 
+        /** Ethernet source address with masking. */
+        ETH_SRC_MASKED,
+
         /** Ethernet frame type. */
         ETH_TYPE,
 
diff --git a/core/api/src/main/java/org/onosproject/net/flow/criteria/EthCriterion.java b/core/api/src/main/java/org/onosproject/net/flow/criteria/EthCriterion.java
index f4664c9..f7c6f48 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/criteria/EthCriterion.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/criteria/EthCriterion.java
@@ -24,18 +24,32 @@
  */
 public final class EthCriterion implements Criterion {
     private final MacAddress mac;
+    private final MacAddress mask;
     private final Type type;
 
     /**
      * Constructor.
      *
      * @param mac the source or destination MAC address to match
+     * @param mask the mask for the address
+     * @param type the match type. Should be either Type.ETH_DST_MASKED or
+     *             Type.ETH_SRC_MASKED
+     */
+    EthCriterion(MacAddress mac, MacAddress mask, Type type) {
+        this.mac = mac;
+        this.mask = mask;
+        this.type = type;
+    }
+
+    /**
+     * Constructor.
+     *
+     * @param mac the source or destination MAC address to match
      * @param type the match type. Should be either Type.ETH_DST or
-     * Type.ETH_SRC
+     *             Type.ETH_SRC
      */
     EthCriterion(MacAddress mac, Type type) {
-        this.mac = mac;
-        this.type = type;
+        this(mac, null, type);
     }
 
     @Override
@@ -52,14 +66,23 @@
         return this.mac;
     }
 
+    /**
+     * Gets the mask for the MAC address to match.
+     *
+     * @return the MAC address to match
+     */
+    public MacAddress mask() {
+        return this.mask;
+    }
+
     @Override
     public String toString() {
-        return type().toString() + SEPARATOR + mac;
+        return type().toString() + SEPARATOR + mac + "/" + mask;
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(type.ordinal(), mac);
+        return Objects.hash(type.ordinal(), mac, mask);
     }
 
     @Override
@@ -70,6 +93,7 @@
         if (obj instanceof EthCriterion) {
             EthCriterion that = (EthCriterion) obj;
             return Objects.equals(mac, that.mac) &&
+                    Objects.equals(mask, that.mask) &&
                     Objects.equals(type, that.type);
         }
         return false;