Bug 2951 - ipv6 addresses containing zeros in input flow should be handled in operati... 20/35520/1
authorAnil Vishnoi <vishnoianil@gmail.com>
Sun, 28 Feb 2016 03:43:22 +0000 (19:43 -0800)
committerAnil Vishnoi <vishnoianil@gmail.com>
Sun, 28 Feb 2016 03:45:13 +0000 (03:45 +0000)
Change-Id: I60955de3c9c28825de46520f8ccdd272ca62838d
Signed-off-by: Anil Vishnoi <vishnoianil@gmail.com>
applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/helper/MatchComparatorHelper.java

index 4688d6bd91886950c0a1e1dca0334628d28cabb8..c6e97f1120b9a9d3e64abb240cdeb4050be37464 100644 (file)
@@ -12,11 +12,13 @@ import java.net.Inet4Address;
 
 import com.google.common.annotations.VisibleForTesting;
 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.inet.types.rev100924.Ipv6Prefix;
 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.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.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6Match;
 
 /**
  * @author joe
@@ -106,7 +108,16 @@ public class MatchComparatorHelper {
                 verdict = MatchComparatorHelper.compareIpv4PrefixNullSafe(statsIpv4Match.getIpv4Source(),
                         storedIpv4Match.getIpv4Source());
             }
-        } else {
+        } else if(statsLayer3Match instanceof Ipv6Match && storedLayer3Match instanceof Ipv6Match) {
+            final Ipv6Match statsIpv6Match = (Ipv6Match) statsLayer3Match;
+            final Ipv6Match storedIpv6Match = (Ipv6Match) storedLayer3Match;
+            verdict = MatchComparatorHelper.compareIpv6PrefixNullSafe(storedIpv6Match.getIpv6Destination(),
+                    statsIpv6Match.getIpv6Destination());
+            if (verdict) {
+                verdict = MatchComparatorHelper.compareIpv6PrefixNullSafe(statsIpv6Match.getIpv6Source(),
+                        storedIpv6Match.getIpv6Source());
+            }
+        }else {
             final Boolean nullCheckOut = checkNullValues(storedLayer3Match, statsLayer3Match);
             if (nullCheckOut != null) {
                 verdict = nullCheckOut;
@@ -118,6 +129,7 @@ public class MatchComparatorHelper {
         return verdict;
     }
 
+
     /**
      * TODO: why don't we use the default Ipv4Prefix.equals()?
      *
@@ -148,6 +160,20 @@ public class MatchComparatorHelper {
         return (statsIpAddressInt.getIp() == storedIpAddressInt.getIp());
     }
 
+
+    private static boolean IpAddressEquals(Ipv6Prefix statsIpv6, Ipv6Prefix storedIpv6) {
+        final String[] statsIpMask = statsIpv6.getValue().split("/");
+        final String[] storedIpMask = storedIpv6.getValue().split("/");
+        if(! (statsIpMask.length > 1 && storedIpMask.length > 1 &&  statsIpMask[1].equals(storedIpMask[1]))){
+            return false;
+        }
+        if(InetAddresses.forString(statsIpMask[0]).equals(InetAddresses.forString(storedIpMask[0]))){
+            return true;
+        }
+        return false;
+    }
+
+
     static Boolean checkNullValues(final Object v1, final Object v2) {
         Boolean verdict = null;
         if (v1 == null && v2 != null) {
@@ -173,6 +199,18 @@ public class MatchComparatorHelper {
         return verdict;
     }
 
+    private static boolean compareIpv6PrefixNullSafe(Ipv6Prefix statsIpv6, Ipv6Prefix storedIpv6) {
+        boolean verdict = true;
+        final Boolean checkDestNullValuesOut = checkNullValues(statsIpv6, storedIpv6);
+        if (checkDestNullValuesOut != null) {
+            verdict = checkDestNullValuesOut;
+        } else if (!IpAddressEquals(statsIpv6, storedIpv6)) {
+            verdict = false;
+        }
+
+        return verdict;
+    }
+
     /**
      * Method return integer version of ip address. Converted int will be mask if mask specified
      */