X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fstatistics-manager%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fmd%2Fstatistics%2Fmanager%2FFlowComparator.java;h=f3dac826e8ad609d39e024cbc7e46239934da035;hb=9cd4e7995210f8381892004373acc71c8b3ae7af;hp=2b67edfd9d318d29cbd3508c17a1e8bafd9f4a70;hpb=a3ebcb3c36804de1e4c0177f3462e33958b0c216;p=controller.git diff --git a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/FlowComparator.java b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/FlowComparator.java index 2b67edfd9d..f3dac826e8 100644 --- a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/FlowComparator.java +++ b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/FlowComparator.java @@ -12,8 +12,11 @@ import java.net.InetAddress; import java.net.UnknownHostException; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.MacAddressFilter; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatch; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer3Match; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4Match; import org.slf4j.Logger; @@ -100,7 +103,7 @@ final class FlowComparator { if (statsFlow.getEthernetMatch() != null) { return false; } - } else if(!storedFlow.getEthernetMatch().equals(statsFlow.getEthernetMatch())) { + } else if(!ethernetMatchEquals(statsFlow.getEthernetMatch(),storedFlow.getEthernetMatch())) { return false; } if (storedFlow.getIcmpv4Match()== null) { @@ -183,6 +186,67 @@ final class FlowComparator { return true; } + /* + * Custom EthernetMatch is required because mac address string provided by user in EthernetMatch can be in + * any case (upper or lower or mix). Ethernet Match which controller receives from switch is always + * an upper case string. Default EthernetMatch equals doesn't use equalsIgnoreCase() and hence it fails. + * E.g User provided mac address string in flow match is aa:bb:cc:dd:ee:ff and when controller fetch + * statistic data, openflow driver library returns AA:BB:CC:DD:EE:FF and default eqauls fails here. + */ + @VisibleForTesting + static boolean ethernetMatchEquals(EthernetMatch statsEthernetMatch, EthernetMatch storedEthernetMatch){ + boolean verdict = true; + Boolean checkNullValues = checkNullValues(statsEthernetMatch, storedEthernetMatch); + if (checkNullValues != null) { + verdict = checkNullValues; + } else { + if(verdict){ + verdict = ethernetMatchFieldsEquals(statsEthernetMatch.getEthernetSource(),storedEthernetMatch.getEthernetSource()); + } + if(verdict){ + verdict = ethernetMatchFieldsEquals(statsEthernetMatch.getEthernetDestination(),storedEthernetMatch.getEthernetDestination()); + } + if(verdict){ + if(statsEthernetMatch.getEthernetType() == null){ + if(storedEthernetMatch.getEthernetType() != null){ + verdict = false; + } + }else{ + verdict = statsEthernetMatch.getEthernetType().equals(storedEthernetMatch.getEthernetType()); + } + } + } + return verdict; + } + + private static boolean ethernetMatchFieldsEquals(MacAddressFilter statsEthernetMatchFields, + MacAddressFilter storedEthernetMatchFields){ + boolean verdict = true; + Boolean checkNullValues = checkNullValues(statsEthernetMatchFields, storedEthernetMatchFields); + if (checkNullValues != null) { + verdict = checkNullValues; + } else { + if(verdict){ + verdict = macAddressEquals(statsEthernetMatchFields.getAddress(),storedEthernetMatchFields.getAddress()); + } + if(verdict){ + verdict = macAddressEquals(statsEthernetMatchFields.getMask(),storedEthernetMatchFields.getMask()); + } + } + return verdict; + } + + private static boolean macAddressEquals(MacAddress statsMacAddress, MacAddress storedMacAddress){ + boolean verdict = true; + Boolean checkNullValues = checkNullValues(statsMacAddress, storedMacAddress); + if (checkNullValues != null) { + verdict = checkNullValues; + } else { + verdict = statsMacAddress.getValue().equalsIgnoreCase(storedMacAddress.getValue()); + } + return verdict; + } + @VisibleForTesting static boolean layer3MatchEquals(Layer3Match statsLayer3Match, Layer3Match storedLayer3Match){ boolean verdict = true;