X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fsal%2Fapi%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsal%2Fmatch%2FMatchType.java;h=1c964267b130d8b9f82d5e3726cc446683dbc4bd;hp=bb5e0079b7134ed909dccf0280b95c786e1b0ebd;hb=1ae37339c083b30bc564af4e608725c514b2e6b7;hpb=432ddf481f3bb6c297b1353f76a797fc9ef0e454 diff --git a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/match/MatchType.java b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/match/MatchType.java index bb5e0079b7..1c964267b1 100644 --- a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/match/MatchType.java +++ b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/match/MatchType.java @@ -8,7 +8,7 @@ package org.opendaylight.controller.sal.match; -import java.net.Inet6Address; +import java.net.Inet4Address; import java.net.InetAddress; import java.util.Arrays; @@ -25,7 +25,7 @@ public enum MatchType { IN_PORT("inPort", 1 << 0, NodeConnector.class, 1, 0), DL_SRC("dlSrc", 1 << 1, Byte[].class, 0, 0xffffffffffffL), DL_DST("dlDst", 1 << 2, Byte[].class, 0, 0xffffffffffffL), - DL_VLAN("dlVlan", 1 << 3, Short.class, 1, 0xfff), // 2 bytes + DL_VLAN("dlVlan", 1 << 3, Short.class, 0, 0xfff), // 2 bytes DL_VLAN_PR("dlVlanPriority", 1 << 4, Byte.class, 0, 0x7), // 3 bits DL_OUTER_VLAN("dlOuterVlan", 1 << 5, Short.class, 1, 0xfff), DL_OUTER_VLAN_PR("dlOuterVlanPriority", 1 << 6, Short.class, 0, 0x7), @@ -37,6 +37,9 @@ public enum MatchType { TP_SRC("tpSrc", 1 << 12, Short.class, 1, 0xffff), // 2 bytes TP_DST("tpDst", 1 << 13, Short.class, 1, 0xffff); // 2 bytes + // Used to indicate that no VLAN ID is set. + public static final short DL_VLAN_NONE = (short) 0; + private String id; private int index; private Class dataType; @@ -242,8 +245,12 @@ public enum MatchType { break; case NW_SRC: case NW_DST: - result = prime * result + ((v == null)? 0 : v.hashCode()); - result = prime * result + ((m == null)? NetUtils.gethighestIP(v instanceof Inet6Address).hashCode() : m.hashCode()); + // Hash code has to take into account only prefix address + InetAddress ip = (InetAddress) v; + int maskLen = (m == null) ? ((ip instanceof Inet4Address) ? 32 : 128) : NetUtils + .getSubnetMaskLength((InetAddress) m); + InetAddress prefix = NetUtils.getSubnetPrefix(ip, maskLen); + result = prime * result + ((v == null)? 0 : prefix.hashCode()); break; default: result = prime * result + ((v == null)? 0 : v.hashCode()); @@ -278,14 +285,10 @@ public enum MatchType { * For network address mask, network node may return full mask for * flows the controller generated with a null mask object */ - byte maskBytes[] = null; - if (a == null) { - maskBytes = ((InetAddress) b).getAddress(); - } else if (b == null) { - maskBytes = ((InetAddress) a).getAddress(); - } - if (maskBytes != null) { - return (NetUtils.getSubnetMaskLength(maskBytes) == 0); + if (a == null || b == null) { + InetAddress mask = (a == null) ? (InetAddress) b : (InetAddress) a; + int maxLength = (mask instanceof Inet4Address) ? 32 : 128; + return (NetUtils.getSubnetMaskLength(mask) == maxLength); } default: if (a == null) { @@ -294,4 +297,23 @@ public enum MatchType { return a.equals(b); } } + + public boolean equals(Object value1, Object value2, Object mask1, Object mask2) { + switch (this) { + case NW_SRC: + case NW_DST: + // Equality to be checked against prefix addresses + InetAddress thisIP = (InetAddress) value1; + int thisMaskLen = (mask1 == null) ? ((thisIP instanceof Inet4Address) ? 32 : 128) : NetUtils + .getSubnetMaskLength((InetAddress) mask1); + InetAddress otherIP = (InetAddress) value2; + int otherMaskLen = (mask2 == null) ? ((otherIP instanceof Inet4Address) ? 32 : 128) : NetUtils + .getSubnetMaskLength((InetAddress) mask2); + + return NetUtils.getSubnetPrefix(thisIP, thisMaskLen) + .equals(NetUtils.getSubnetPrefix(otherIP, otherMaskLen)); + default: + return (this.equalValues(value1, value2) && this.equalMasks(mask1, mask2)); + } + } }