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;