Bug-5562 - Ipv4 L3-ArbitraryMask patch 71/36571/1
authorSai MarapaReddy <sai.marapareddy@gmail.com>
Sat, 19 Mar 2016 06:36:20 +0000 (23:36 -0700)
committerSai MarapaReddy <sai.marapareddy@gmail.com>
Tue, 22 Mar 2016 19:27:10 +0000 (12:27 -0700)
Current code expects the Arbitrary Mask to be normalized from switch.
Example:- 3.3.3.3/255.0.255.0 to 3.0.3.0/255.0.255.0
Not all switches normalizes arbitrary bit mask in the flows when they are injected.
Example:- 3.3.3.3/255.0.255.0 to 3.3.3.3/255.0.255.0
This patch ensures that the operational data store is in congruent with the flows
that are shown on the switch. Patch is built on checking the mask & comparing the
normalized stores & stats flows which ensures Ipv4 L3-ArbitraryMask works independant
of how the switches normalizes the ip addresses when flows are pushed.

Conflicts:
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/IpConversionUtil.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImpl.java

Change-Id: Icfc6d4805c58f6483fc3ca0458b827b14c0a0cb1
Signed-off-by: Sai MarapaReddy <sai.marapareddy@gmail.com>
applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/helper/MatchComparatorHelper.java
applications/statistics-manager/src/test/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/helper/MatchComparatorHelperTest.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/IpConversionUtil.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImpl.java
openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/IpConversionUtilTest.java
openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImplV13Test.java

index 1682da69a657aaef184a3577d727054cfddc348a..6762fea79f60105d182261a825202654a9ec8aac 100644 (file)
@@ -7,17 +7,13 @@
  */
 package org.opendaylight.openflowplugin.applications.statistics.manager.impl.helper;
 
-import com.google.common.net.InetAddresses;
 import java.math.BigInteger;
 import java.net.Inet4Address;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.Arrays;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.primitives.UnsignedBytes;
+
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
 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;
@@ -27,8 +23,14 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026
 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;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchArbitraryBitMask;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6Match;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.net.InetAddresses;
+import com.google.common.primitives.UnsignedBytes;
 
 /**
  * @author joe
@@ -123,7 +125,7 @@ public class MatchComparatorHelper {
                 verdict = MatchComparatorHelper.compareIpv4PrefixNullSafe(statsIpv4Match.getIpv4Source(),
                         storedIpv4Match.getIpv4Source());
             }
-        } else if(statsLayer3Match instanceof Ipv6Match && storedLayer3Match instanceof Ipv6Match) {
+        } else if (statsLayer3Match instanceof Ipv6Match && storedLayer3Match instanceof Ipv6Match) {
             final Ipv6Match statsIpv6Match = (Ipv6Match) statsLayer3Match;
             final Ipv6Match storedIpv6Match = (Ipv6Match) storedLayer3Match;
             verdict = MatchComparatorHelper.compareIpv6PrefixNullSafe(storedIpv6Match.getIpv6Destination(),
@@ -132,41 +134,42 @@ public class MatchComparatorHelper {
                 verdict = MatchComparatorHelper.compareIpv6PrefixNullSafe(statsIpv6Match.getIpv6Source(),
                         storedIpv6Match.getIpv6Source());
             }
-        } else if(statsLayer3Match instanceof  Ipv4MatchArbitraryBitMask && storedLayer3Match instanceof Ipv4MatchArbitraryBitMask) {
+        } else if (statsLayer3Match instanceof  Ipv4MatchArbitraryBitMask && storedLayer3Match instanceof Ipv4MatchArbitraryBitMask) {
             // At this moment storedIpv4MatchArbitraryBitMask & statsIpv4MatchArbitraryBitMask will always have non null arbitrary masks.
             // In case of no / null arbitrary mask, statsLayer3Match will be an instance of Ipv4Match.
             // Eg:- stats -> 1.0.1.0/255.0.255.0  stored -> 1.1.1.0/255.0.255.0
             final Ipv4MatchArbitraryBitMask statsIpv4MatchArbitraryBitMask= (Ipv4MatchArbitraryBitMask) statsLayer3Match;
             final Ipv4MatchArbitraryBitMask storedIpv4MatchArbitraryBitMask = (Ipv4MatchArbitraryBitMask) storedLayer3Match;
-            if((storedIpv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask() != null |
+            if ((storedIpv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask() != null |
                     storedIpv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask() != null)) {
-                if(storedIpv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask() != null) {
-                        String storedIpAddress = extractIpv4Address(storedIpv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask(),
+                if (storedIpv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask() != null) {
+                        String storedDstIpAddress = normalizeIpv4Address(storedIpv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask(),
                                 storedIpv4MatchArbitraryBitMask.getIpv4DestinationArbitraryBitmask());
-                        if(MatchComparatorHelper.compareStringNullSafe(storedIpv4MatchArbitraryBitMask.getIpv4DestinationArbitraryBitmask().getValue(),
+                        String statsDstIpAddress = normalizeIpv4Address(statsIpv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask(),
+                                statsIpv4MatchArbitraryBitMask.getIpv4DestinationArbitraryBitmask());
+                        if (MatchComparatorHelper.compareStringNullSafe(storedIpv4MatchArbitraryBitMask.getIpv4DestinationArbitraryBitmask().getValue(),
                                 statsIpv4MatchArbitraryBitMask.getIpv4DestinationArbitraryBitmask().getValue())) {
-                            verdict = MatchComparatorHelper.compareStringNullSafe(storedIpAddress,
-                                    statsIpv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask().getValue());
-                        }
-                        else {
+                            verdict = MatchComparatorHelper.compareStringNullSafe(storedDstIpAddress,
+                                    statsDstIpAddress);
+                        } else {
                             verdict = false;
                             return verdict;
                         }
                 }
-                if(storedIpv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask() != null) {
-                        String storedIpAddress = extractIpv4Address(storedIpv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask()
+                if (storedIpv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask() != null) {
+                        String storedSrcIpAddress = normalizeIpv4Address(storedIpv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask()
                                 ,storedIpv4MatchArbitraryBitMask.getIpv4SourceArbitraryBitmask());
-                        if(MatchComparatorHelper.compareStringNullSafe(storedIpv4MatchArbitraryBitMask.getIpv4SourceArbitraryBitmask().getValue(),
+                        String statsSrcIpAddress = normalizeIpv4Address(statsIpv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask()
+                                ,statsIpv4MatchArbitraryBitMask.getIpv4SourceArbitraryBitmask());
+                        if (MatchComparatorHelper.compareStringNullSafe(storedIpv4MatchArbitraryBitMask.getIpv4SourceArbitraryBitmask().getValue(),
                                 statsIpv4MatchArbitraryBitMask.getIpv4SourceArbitraryBitmask().getValue())) {
-                            verdict = MatchComparatorHelper.compareStringNullSafe(storedIpAddress,
-                                    statsIpv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask().getValue());
-                        }
-                        else {
+                            verdict = MatchComparatorHelper.compareStringNullSafe(storedSrcIpAddress,
+                                    statsSrcIpAddress);
+                        } else {
                             verdict = false;
                         }
                 }
-            }
-            else {
+            } else {
                 final Boolean nullCheckOut = checkNullValues(storedLayer3Match, statsLayer3Match);
                 if (nullCheckOut != null) {
                     verdict = nullCheckOut;
@@ -174,8 +177,7 @@ public class MatchComparatorHelper {
                     verdict = storedLayer3Match.equals(statsLayer3Match);
                 }
             }
-        }
-        else if (statsLayer3Match instanceof Ipv4Match && storedLayer3Match instanceof Ipv4MatchArbitraryBitMask) {
+        } else if (statsLayer3Match instanceof Ipv4Match && storedLayer3Match instanceof Ipv4MatchArbitraryBitMask) {
             // Here stored netmask is an instance of Ipv4MatchArbitraryBitMask, when it is pushed in to switch
             // it automatically converts it in to cidr format in case of certain subnet masks ( consecutive ones or zeroes)
             // Eg:- stats src/dest -> 1.1.1.0/24  stored src/dest -> 1.1.1.0/255.255.255.0
@@ -186,12 +188,11 @@ public class MatchComparatorHelper {
                 if (storedIpv4MatchArbitraryBitMask.getIpv4DestinationArbitraryBitmask() != null) {
                     byte[] destByteMask = convertArbitraryMaskToByteArray(storedIpv4MatchArbitraryBitMask.getIpv4DestinationArbitraryBitmask());
                     ipv4PrefixDestination = createPrefix(storedIpv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask(), destByteMask);
-                }
-                else{
+                } else {
                     ipv4PrefixDestination = createPrefix(storedIpv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask());
                 }
                 verdict = MatchComparatorHelper.compareIpv4PrefixNullSafe(ipv4PrefixDestination, statsIpv4Match.getIpv4Destination());
-                if(verdict == false) {
+                if (verdict == false) {
                     return verdict;
                 }
             }
@@ -200,8 +201,7 @@ public class MatchComparatorHelper {
                 if (storedIpv4MatchArbitraryBitMask.getIpv4SourceArbitraryBitmask() != null) {
                     byte[] srcByteMask = convertArbitraryMaskToByteArray(storedIpv4MatchArbitraryBitMask.getIpv4SourceArbitraryBitmask());
                     ipv4PrefixSource = createPrefix(storedIpv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask(), srcByteMask);
-                }
-                else {
+                } else {
                     ipv4PrefixSource = createPrefix(storedIpv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask());
                 }
                 verdict = MatchComparatorHelper.compareIpv4PrefixNullSafe(ipv4PrefixSource, statsIpv4Match.getIpv4Source());
@@ -252,10 +252,10 @@ public class MatchComparatorHelper {
     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]))){
+        if (! (statsIpMask.length > 1 && storedIpMask.length > 1 &&  statsIpMask[1].equals(storedIpMask[1]))){
             return false;
         }
-        if(InetAddresses.forString(statsIpMask[0]).equals(InetAddresses.forString(storedIpMask[0]))){
+        if (InetAddresses.forString(statsIpMask[0]).equals(InetAddresses.forString(storedIpMask[0]))){
             return true;
         }
         return false;
@@ -271,7 +271,6 @@ public class MatchComparatorHelper {
         } else if (v1 == null && v2 == null) {
             verdict = Boolean.TRUE;
         }
-
         return verdict;
     }
 
@@ -291,7 +290,7 @@ public class MatchComparatorHelper {
         final Boolean checkDestNullValuesOut = checkNullValues(stringA,stringB);
         if (checkDestNullValuesOut != null) {
             verdict = checkDestNullValuesOut;
-        }else if (!stringA.equals(stringB)) {
+        } else if (!stringA.equals(stringB)) {
             verdict = false;
         }
         return verdict;
@@ -305,7 +304,6 @@ public class MatchComparatorHelper {
         } else if (!IpAddressEquals(statsIpv6, storedIpv6)) {
             verdict = false;
         }
-
         return verdict;
     }
 
@@ -352,8 +350,7 @@ public class MatchComparatorHelper {
     static boolean isArbitraryBitMask(byte[] byteMask) {
         if (byteMask == null) {
             return false;
-        }
-        else {
+        } else {
             ArrayList<Integer> integerMaskArrayList = new ArrayList<Integer>();
             String maskInBits;
             // converting byte array to bits
@@ -367,12 +364,11 @@ public class MatchComparatorHelper {
     }
 
     static boolean checkArbitraryBitMask(ArrayList<Integer> arrayList) {
-        // checks 0*1* case - Leading zeros in arrayList are truncated
-        if(arrayList.size()>0 && arrayList.size()<32) {
+        if (arrayList.size()>0 && arrayList.size()< IPV4_MASK_LENGTH ) {
+            // checks 0*1* case - Leading zeros in arrayList are truncated
             return true;
-        }
-        //checks 1*0*1 case
-        else {
+        } else {
+            //checks 1*0*1 case
             for(int i=0; i<arrayList.size()-1;i++) {
                 if(arrayList.get(i) ==0 && arrayList.get(i+1) == 1) {
                     return true;
@@ -386,8 +382,7 @@ public class MatchComparatorHelper {
         String maskValue;
         if(mask.getValue() != null && mask != null){
             maskValue  = mask.getValue();
-        }
-        else maskValue = DEFAULT_ARBITRARY_BIT_MASK;
+        } else maskValue = DEFAULT_ARBITRARY_BIT_MASK;
         InetAddress maskInIpFormat = null;
         try {
             maskInIpFormat = InetAddress.getByName(maskValue);
@@ -399,17 +394,17 @@ public class MatchComparatorHelper {
     }
 
 
-    static String extractIpv4Address(Ipv4Address ipAddress, DottedQuad netMask) {
+    static String normalizeIpv4Address(Ipv4Address ipAddress, DottedQuad netMask) {
         String actualIpAddress="";
         String[] netMaskParts = netMask.getValue().split("\\.");
         String[] ipAddressParts = ipAddress.getValue().split("\\.");
 
-        for(int i=0; i<ipAddressParts.length;i++) {
+        for (int i=0; i<ipAddressParts.length;i++) {
             int integerFormatIpAddress=Integer.parseInt(ipAddressParts[i]);
             int integerFormatNetMask=Integer.parseInt(netMaskParts[i]);
             int ipAddressPart=(integerFormatIpAddress) & (integerFormatNetMask);
             actualIpAddress += ipAddressPart;
-            if(i != ipAddressParts.length -1 ) {
+            if (i != ipAddressParts.length -1 ) {
                 actualIpAddress = actualIpAddress+".";
             }
         }
index 1fdb42c6909f4e37d3049aff5905d372247c9764..db4dfecfc2389a80093ed32edd2712fe0412ed51 100644 (file)
@@ -273,7 +273,7 @@ public class MatchComparatorHelperTest {
         Ipv4Address ipAddress = new Ipv4Address("1.1.1.1");
         DottedQuad netMask = new DottedQuad("255.255.255.0");
         String extractedIpAddress;
-        extractedIpAddress = MatchComparatorHelper.extractIpv4Address(ipAddress,netMask);
+        extractedIpAddress = MatchComparatorHelper.normalizeIpv4Address(ipAddress,netMask);
         assertEquals(extractedIpAddress,"1.1.1.0");
     }
 
@@ -284,7 +284,7 @@ public class MatchComparatorHelperTest {
                 (byte)(value >>> 24), (byte)(value >> 16 & 0xff), (byte)(value >> 8 & 0xff), (byte)(value & 0xff) };
         byte[] maskBytes;
         maskBytes = MatchComparatorHelper.convertArbitraryMaskToByteArray(new DottedQuad("255.255.255.255"));
-        for(int i=0; i<bytes.length;i++){
+        for (int i=0; i<bytes.length;i++) {
             int mask = maskBytes[i];
             assertEquals(bytes[i],mask);
         }
index 5151d300c8ba8d8428e5fd8976810079af9e5a91..9a09033db747031aff64dae8db29d6b554e9086f 100644 (file)
@@ -16,19 +16,20 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Iterator;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IetfInetUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
 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.Ipv6Address;
 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.rev130715.DottedQuad;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import com.google.common.base.Preconditions;
 import com.google.common.base.Splitter;
 import com.google.common.base.Strings;
 import com.google.common.collect.Iterators;
 import com.google.common.net.InetAddresses;
 import com.google.common.primitives.UnsignedBytes;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DottedQuad;
 
 
 /**
@@ -129,11 +130,15 @@ public final class IpConversionUtil {
     }
 
     public static DottedQuad createArbitraryBitMask(final byte [] bytemask)  {
-        DottedQuad dottedQuad = new DottedQuad(DEFAULT_ARBITRARY_BIT_MASK);
-        try {
-            dottedQuad = new DottedQuad(InetAddress.getByAddress(bytemask).getHostAddress());
-        } catch (UnknownHostException e) {
-            LOG.error("Failed to create the dottedQuad notation for the given mask ", e);
+        DottedQuad dottedQuad = null;
+        if (bytemask == null ) {
+            dottedQuad = new DottedQuad(DEFAULT_ARBITRARY_BIT_MASK);
+        } else {
+            try {
+                dottedQuad = new DottedQuad(InetAddress.getByAddress(bytemask).getHostAddress());
+            } catch (UnknownHostException e) {
+                LOG.error("Failed to create the dottedQuad notation for the given mask ", e);
+            }
         }
         return dottedQuad;
     }
@@ -584,6 +589,25 @@ public final class IpConversionUtil {
         return IetfInetUtil.INSTANCE.ipv6AddressFrom(ipv6Prefix);
     }
 
+    public static Ipv4Address extractIpv4Address(final Ipv4Prefix ipv4Prefix) {
+        Iterator<String> addressParts = PREFIX_SPLITTER.split(ipv4Prefix.getValue()).iterator();
+        return new Ipv4Address(addressParts.next());
+    }
+
+    public static DottedQuad extractIpv4AddressMask(final Ipv4Prefix ipv4Prefix) {
+        Iterator<String> addressParts = PREFIX_SPLITTER.split(ipv4Prefix.getValue()).iterator();
+        addressParts.next();
+        Integer cidrMask =0;
+        if (addressParts.hasNext()) {
+            cidrMask = Integer.parseInt(addressParts.next());
+        }
+        long maskBits = 0;
+        maskBits = 0xffffffff << IPV4_ADDRESS_LENGTH - cidrMask;
+        String mask = String.format("%d.%d.%d.%d", (maskBits & 0x0000000000ff000000L) >> 24, (maskBits & 0x0000000000ff0000) >> 16, (maskBits & 0x0000000000ff00) >> 8, maskBits & 0xff);
+        DottedQuad netMask = new DottedQuad(mask);
+        return netMask;
+    }
+
     public static Integer extractIpv6Prefix(final Ipv6Prefix ipv6Prefix) {
         return IetfInetUtil.INSTANCE.splitIpv6Prefix(ipv6Prefix).getValue();
     }
@@ -598,10 +622,9 @@ public final class IpConversionUtil {
 
     public static final byte[] convertArbitraryMaskToByteArray(DottedQuad mask) {
         String maskValue;
-        if (mask != null && mask.getValue() != null){
+        if (mask != null && mask.getValue() != null) {
            maskValue  = mask.getValue();
-        }
-        else {
+        } else {
             maskValue = DEFAULT_ARBITRARY_BIT_MASK;
         }
         InetAddress maskInIpFormat = null;
@@ -617,14 +640,13 @@ public final class IpConversionUtil {
     public static boolean isArbitraryBitMask(byte[] byteMask) {
         if (byteMask == null) {
             return false;
-        }
-        else {
+        } else {
             ArrayList<Integer> integerMaskArrayList = new ArrayList<Integer>();
             String maskInBits;
             // converting byte array to bits
             maskInBits = new BigInteger(1, byteMask).toString(2);
             ArrayList<String> stringMaskArrayList = new ArrayList<String>(Arrays.asList(maskInBits.split("(?!^)")));
-            for(String string:stringMaskArrayList){
+            for (String string:stringMaskArrayList) {
                 integerMaskArrayList.add(Integer.parseInt(string));
             }
             return checkArbitraryBitMask(integerMaskArrayList);
@@ -633,13 +655,12 @@ public final class IpConversionUtil {
 
     private static boolean checkArbitraryBitMask(ArrayList<Integer> arrayList) {
         // checks 0*1* case - Leading zeros in arrayList are truncated
-        if(arrayList.size()>0 && arrayList.size()<32) {
+        if (arrayList.size()>0 && arrayList.size()<IPV4_ADDRESS_LENGTH) {
             return true;
-        }
-        //checks 1*0*1 case
-        else {
-            for(int i=0; i<arrayList.size()-1;i++) {
-                if(arrayList.get(i) ==0 && arrayList.get(i+1) == 1) {
+        } else {
+            //checks 1*0*1 case
+            for (int i=0; i<arrayList.size()-1;i++) {
+                if (arrayList.get(i) ==0 && arrayList.get(i+1) == 1) {
                     return true;
                 }
             }
index a78f48968b8844b17180c0219bc51f80edfc1f1a..e900179154df90df4f6d0bc04aa77f9d3f53f6ca 100644 (file)
@@ -9,13 +9,15 @@
 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match;
 
 import static org.opendaylight.openflowjava.util.ByteBufUtils.macAddressToString;
-import com.google.common.base.Optional;
+
 import java.math.BigInteger;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+
 import javax.annotation.Nonnull;
+
 import org.opendaylight.openflowjava.util.ByteBufUtils;
 import org.opendaylight.openflowplugin.api.OFConstants;
 import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
@@ -69,7 +71,16 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TunnelBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatch;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatchBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.*;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder;
+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.Ipv4MatchArbitraryBitMask;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchArbitraryBitMaskBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6Match;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.TunnelIpv4Match;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.TunnelIpv4MatchBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatch;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatchBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatch;
@@ -258,6 +269,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Tunne
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.Optional;
+
 /**
  * Utility class for converting a MD-SAL Flow into the OF flow mod
  */
@@ -1317,14 +1330,43 @@ public class MatchConvertorImpl implements MatchConvertor<List<MatchEntry>> {
                 if (ipv4Address != null) {
                     byte[] mask = ipv4Address.getMask();
                     if (mask != null && IpConversionUtil.isArbitraryBitMask(mask)) {
-                        DottedQuad dottedQuadMask = IpConversionUtil.createArbitraryBitMask(mask);
-                        String Ipv4Address = ipv4Address.getIpv4Address().getValue();
-                        setIpv4MatchArbitraryBitMaskBuilderFields(ipv4MatchArbitraryBitMaskBuilder, ofMatch, dottedQuadMask, Ipv4Address);
+                        // case where ipv4dst is of type ipv4MatchBuilder and ipv4src is of type ipv4MatchArbitrary.
+                        // Needs to convert ipv4dst to ipv4MatchArbitrary.
+                        if (ipv4MatchBuilder.getIpv4Destination() != null) {
+                            Ipv4Prefix ipv4PrefixDestinationAddress = ipv4MatchBuilder.getIpv4Destination();
+                            Ipv4Address ipv4DstAddress = IpConversionUtil.extractIpv4Address(ipv4PrefixDestinationAddress);
+                            DottedQuad dstDottedQuadMask = IpConversionUtil.extractIpv4AddressMask(ipv4PrefixDestinationAddress);
+                            setDstIpv4MatchArbitraryBitMaskBuilderFields(ipv4MatchArbitraryBitMaskBuilder, ofMatch,
+                                    dstDottedQuadMask, ipv4DstAddress.getValue());
+                        }
+                        DottedQuad srcDottedQuadMask = IpConversionUtil.createArbitraryBitMask(mask);
+                        String stringIpv4SrcAddress = ipv4Address.getIpv4Address().getValue();
+                        setSrcIpv4MatchArbitraryBitMaskBuilderFields(ipv4MatchArbitraryBitMaskBuilder, ofMatch,
+                                srcDottedQuadMask, stringIpv4SrcAddress);
                         matchBuilder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build());
-                    }
-                    else {
-                        String ipv4PrefixStr = ipv4Address.getIpv4Address().getValue();
-                        setIpv4MatchBuilderFields(ipv4MatchBuilder, ofMatch, mask, ipv4PrefixStr);
+                    } else if (ipv4MatchArbitraryBitMaskBuilder.getIpv4DestinationAddressNoMask() != null) {
+                         /*
+                        Case where destination is of type ipv4MatchArbitraryBitMask already exists in Layer3Match,
+                        source which of type ipv4Match needs to be converted to ipv4MatchArbitraryBitMask.
+                        We convert 36.36.36.0/24 to 36.36.0/255.255.255.0
+                        expected output example:-
+                        <ipv4-destination>36.36.36.0/24</ipv4-destination>
+                        <ipv4-source-address-no-mask>36.36.36.0</ipv4-source-address-no-mask>
+                        <ipv4-source-arbitrary-bitmask>255.0.255.0</ipv4-source-arbitrary-bitmask>
+                        after conversion output example:-
+                        <ipv4-destination-address-no-mask>36.36.36.0</ipv4-destination-address-no-mask>
+                        <ipv4-destination-arbitrary-bitmask>255.255.255.0</ipv4-destination-arbitrary-bitmask>
+                        <ipv4-source-address-no-mask>36.36.36.0</ipv4-source-address-no-mask>
+                        <ipv4-source-arbitrary-bitmask>255.0.255.0</ipv4-source-arbitrary-bitmask>
+                        */
+                        DottedQuad srcDottedQuadMask = IpConversionUtil.createArbitraryBitMask(mask);
+                        String stringIpv4SrcAddress = ipv4Address.getIpv4Address().getValue();
+                        setSrcIpv4MatchArbitraryBitMaskBuilderFields(ipv4MatchArbitraryBitMaskBuilder, ofMatch,
+                                srcDottedQuadMask, stringIpv4SrcAddress);
+                        matchBuilder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build());
+                    } else {
+                        String stringIpv4SrcAddress = ipv4Address.getIpv4Address().getValue();
+                        setIpv4MatchBuilderFields(ipv4MatchBuilder, ofMatch, mask, stringIpv4SrcAddress);
                         matchBuilder.setLayer3Match(ipv4MatchBuilder.build());
                     }
                 }
@@ -1332,10 +1374,40 @@ public class MatchConvertorImpl implements MatchConvertor<List<MatchEntry>> {
                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv4.dst._case.Ipv4Dst ipv4Address = ((Ipv4DstCase) ofMatch.getMatchEntryValue()).getIpv4Dst();
                 if (ipv4Address != null) {
                     byte[] mask = ipv4Address.getMask();
-                    if(mask != null && IpConversionUtil.isArbitraryBitMask(mask)) {
-                        DottedQuad dottedQuadMask = IpConversionUtil.createArbitraryBitMask(mask);
-                        String Ipv4Address = ipv4Address.getIpv4Address().getValue();
-                        setIpv4MatchArbitraryBitMaskBuilderFields(ipv4MatchArbitraryBitMaskBuilder, ofMatch, dottedQuadMask, Ipv4Address);
+                    if (mask != null && IpConversionUtil.isArbitraryBitMask(mask)) {
+                        // case where ipv4src is of type ipv4MatchBuilder and ipv4dst is of type ipv4MatchArbitrary.
+                        // Needs to convert ipv4src to ipv4MatchArbitrary.
+                        if (ipv4MatchBuilder.getIpv4Source() != null) {
+                            Ipv4Prefix ipv4PrefixSourceAddress = ipv4MatchBuilder.getIpv4Source();
+                            Ipv4Address ipv4SourceAddress = IpConversionUtil.extractIpv4Address(ipv4PrefixSourceAddress);
+                            DottedQuad srcDottedQuad = IpConversionUtil.extractIpv4AddressMask(ipv4PrefixSourceAddress);
+                            setSrcIpv4MatchArbitraryBitMaskBuilderFields(ipv4MatchArbitraryBitMaskBuilder,ofMatch,
+                                    srcDottedQuad, ipv4SourceAddress.getValue());
+                        }
+                        DottedQuad dstDottedQuadMask = IpConversionUtil.createArbitraryBitMask(mask);
+                        String stringIpv4DstAddress = ipv4Address.getIpv4Address().getValue();
+                        setDstIpv4MatchArbitraryBitMaskBuilderFields(ipv4MatchArbitraryBitMaskBuilder, ofMatch,
+                                dstDottedQuadMask, stringIpv4DstAddress);
+                        matchBuilder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build());
+                    } else if (ipv4MatchArbitraryBitMaskBuilder.getIpv4SourceAddressNoMask() != null) {
+                        /*
+                        Case where source is of type ipv4MatchArbitraryBitMask already exists in Layer3Match,
+                        destination which of type ipv4Match needs to be converted to ipv4MatchArbitraryBitMask.
+                        We convert 36.36.36.0/24 to 36.36.0/255.255.255.0
+                        expected output example:-
+                        <ipv4-source>36.36.36.0/24</ipv4-source>
+                        <ipv4-destination-address-no-mask>36.36.36.0</ipv4-destination-address-no-mask>
+                        <ipv4-destination-arbitrary-bitmask>255.0.255.0</ipv4-destination-arbitrary-bitmask>
+                        after conversion output example:-
+                        <ipv4-source-address-no-mask>36.36.36.0</ipv4-source-address-no-mask>
+                        <ipv4-source-arbitrary-bitmask>255.255.255.0</ipv4-source-arbitrary-bitmask>
+                        <ipv4-destination-address-no-mask>36.36.36.0</ipv4-destination-address-no-mask>
+                        <ipv4-destination-arbitrary-bitmask>255.0.255.0</ipv4-destination-arbitrary-bitmask>
+                        */
+                        DottedQuad dstDottedQuadMask = IpConversionUtil.createArbitraryBitMask(mask);
+                        String stringIpv4DstAddress = ipv4Address.getIpv4Address().getValue();
+                        setDstIpv4MatchArbitraryBitMaskBuilderFields(ipv4MatchArbitraryBitMaskBuilder, ofMatch,
+                                dstDottedQuadMask, stringIpv4DstAddress);
                         matchBuilder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build());
                     }
                     else {
@@ -1572,25 +1644,26 @@ public class MatchConvertorImpl implements MatchConvertor<List<MatchEntry>> {
         }
     }
 
-    private static void setIpv4MatchArbitraryBitMaskBuilderFields(final Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder, final MatchEntry ofMatch, final DottedQuad mask, final String ipv4AddressStr) {
+    private static void setSrcIpv4MatchArbitraryBitMaskBuilderFields(
+            final Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder,
+            final MatchEntry ofMatch, final DottedQuad mask, final String ipv4AddressStr) {
         Ipv4Address ipv4Address;
-        DottedQuad dottedQuad;
         if (mask != null) {
-            dottedQuad = mask;
-            if (ofMatch.getOxmMatchField().equals(Ipv4Src.class)) {
-                ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceArbitraryBitmask(dottedQuad);
-            }
-            if (ofMatch.getOxmMatchField().equals(Ipv4Dst.class)) {
-                ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationArbitraryBitmask(dottedQuad);
-            }
+            ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceArbitraryBitmask(mask);
         }
         ipv4Address = new Ipv4Address(ipv4AddressStr);
-        if (ofMatch.getOxmMatchField().equals(Ipv4Src.class)) {
-            ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceAddressNoMask(ipv4Address);
-        }
-        if (ofMatch.getOxmMatchField().equals(Ipv4Dst.class)) {
-            ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationAddressNoMask(ipv4Address);
+        ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceAddressNoMask(ipv4Address);
+    }
+
+    private static void setDstIpv4MatchArbitraryBitMaskBuilderFields(
+            final Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder,
+            final MatchEntry ofMatch, final DottedQuad mask, final String ipv4AddressStr) {
+        Ipv4Address ipv4Address;
+        if (mask != null) {
+            ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationArbitraryBitmask(mask);
         }
+        ipv4Address = new Ipv4Address(ipv4AddressStr);
+        ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationAddressNoMask(ipv4Address);
     }
 
 
index c65fb40b366d6a2e54bdedb41147bafd577db8a7..f74fb152d1470985f532cddddfe28922dff4588c 100644 (file)
@@ -13,6 +13,8 @@ import org.junit.Assert;
 import org.junit.Test;\r
 import org.opendaylight.openflowjava.util.ByteBufUtils;\r
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchConvertorUtil;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;\r
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address;\r
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix;\r
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DottedQuad;\r
@@ -115,7 +117,7 @@ public class IpConversionUtilTest {
                 (byte)(value >>> 24), (byte)(value >> 16 & 0xff), (byte)(value >> 8 & 0xff), (byte)(value & 0xff) };\r
         byte[] maskBytes;\r
         maskBytes = IpConversionUtil.convertArbitraryMaskToByteArray(new DottedQuad("255.255.255.255"));\r
-        for(int i=0; i<bytes.length;i++){\r
+        for (int i=0; i<bytes.length;i++) {\r
             int mask = maskBytes[i];\r
             Assert.assertEquals(bytes[i],mask);\r
         }\r
@@ -133,4 +135,18 @@ public class IpConversionUtilTest {
         arbitraryBitMask = IpConversionUtil.isArbitraryBitMask(null);\r
         Assert.assertEquals(arbitraryBitMask,false);\r
     }\r
+\r
+    @Test\r
+    public void extractIpv4AddressTest() {\r
+        Ipv4Address ipv4Address;\r
+        ipv4Address = IpConversionUtil.extractIpv4Address(new Ipv4Prefix("1.0.1.0/16"));\r
+        Assert.assertEquals(ipv4Address.getValue(),"1.0.1.0");\r
+    }\r
+\r
+    @Test\r
+    public void extractIpv4AddressMaskTest() {\r
+        DottedQuad dottedQuad;\r
+        dottedQuad = IpConversionUtil.extractIpv4AddressMask(new Ipv4Prefix("1.1.1.1/24"));\r
+        Assert.assertEquals(dottedQuad.getValue(),"255.255.255.0");\r
+    }\r
 }\r
index e1e763a7762d21b7e54021256fb1d79e931d26d0..4f3eef615c55048a9fc41cb0b2b12496e3a419bd 100644 (file)
@@ -11,6 +11,7 @@ package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match;
 import java.math.BigInteger;\r
 import java.util.ArrayList;\r
 import java.util.List;\r
+\r
 import org.junit.Assert;\r
 import org.junit.Before;\r
 import org.junit.Test;\r
@@ -166,7 +167,9 @@ public class MatchConvertorImplV13Test {
     }\r
 \r
     /**\r
-     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
+     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(\r
+     * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger,\r
+     * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
      */\r
     @Test(expected = NullPointerException.class)\r
     public void testEmptyMatch() {\r
@@ -176,7 +179,9 @@ public class MatchConvertorImplV13Test {
     }\r
 \r
     /**\r
-     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
+     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(\r
+     * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger,\r
+     * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
      */\r
     @Test\r
     public void testEmptyMatchEntry() {\r
@@ -207,7 +212,9 @@ public class MatchConvertorImplV13Test {
     }\r
 \r
     /**\r
-     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
+     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(\r
+     * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger,\r
+     * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
      */\r
     @Test\r
     public void testWithMatchEntryNoMasks() {\r
@@ -530,7 +537,9 @@ public class MatchConvertorImplV13Test {
     }\r
 \r
     /**\r
-     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
+     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(\r
+     * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger,\r
+     * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
      */\r
     @Test\r
     public void testWithMatchEntryWithMasks() {\r
@@ -661,7 +670,9 @@ public class MatchConvertorImplV13Test {
     }\r
 \r
     /**\r
-     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
+     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(\r
+     * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger,\r
+     * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
      */\r
     @Test\r
     public void testWithMatchEntryWithArbitraryMasks() {\r
@@ -701,16 +712,233 @@ public class MatchConvertorImplV13Test {
         final Match match = builder.build();\r
 \r
         final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow\r
-                .MatchBuilder salMatch = MatchConvertorImpl.fromOFMatchToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF10);\r
+                .MatchBuilder salMatch = MatchConvertorImpl.fromOFMatchToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF13);\r
+        final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatch.build();\r
+\r
+        final Ipv4MatchArbitraryBitMask ipv4MatchArbitraryBitMask = (Ipv4MatchArbitraryBitMask) builtMatch.getLayer3Match();\r
+        Assert.assertEquals("Wrong ipv4 src address", "10.1.1.1",\r
+                ipv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask().getValue());\r
+        Assert.assertEquals("Wrong ipv4 dst address", "10.0.1.1",\r
+                ipv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask().getValue());\r
+    }\r
+\r
+    /**\r
+     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(\r
+     * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger,\r
+     * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
+     */\r
+    @Test\r
+    public void testWithMatchEntryWithSrcCidrMaskAndDstArbitraryBitMask() {\r
+        final MatchBuilder builder = new MatchBuilder();\r
+        builder.setType(OxmMatchType.class);\r
+        final List<MatchEntry> entries = new ArrayList<>();\r
+        MatchEntryBuilder entriesBuilder = new MatchEntryBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Metadata.class);\r
+        entriesBuilder.setHasMask(true);\r
+\r
+        entriesBuilder = new MatchEntryBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(Ipv4Src.class);\r
+        entriesBuilder.setHasMask(true);\r
+        final Ipv4SrcCaseBuilder ipv4SrcCaseBuilder = new Ipv4SrcCaseBuilder();\r
+        final Ipv4SrcBuilder ipv4SrcBuilder = new Ipv4SrcBuilder();\r
+        ipv4SrcBuilder.setIpv4Address(new Ipv4Address("10.1.1.1"));\r
+        ipv4SrcBuilder.setMask(new byte[]{(byte) 255, (byte) 255, (byte) 255, 0});\r
+        ipv4SrcCaseBuilder.setIpv4Src(ipv4SrcBuilder.build());\r
+        entriesBuilder.setMatchEntryValue(ipv4SrcCaseBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+\r
+        entriesBuilder = new MatchEntryBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(Ipv4Dst.class);\r
+        entriesBuilder.setHasMask(true);\r
+        final Ipv4DstCaseBuilder ipv4DstCaseBuilder = new Ipv4DstCaseBuilder();\r
+        final Ipv4DstBuilder ipv4AddressBuilder = new Ipv4DstBuilder();\r
+        ipv4AddressBuilder.setIpv4Address(new Ipv4Address("10.0.1.1"));\r
+        ipv4AddressBuilder.setMask(new byte[]{(byte) 255, 0, (byte) 240, 0});\r
+        ipv4DstCaseBuilder.setIpv4Dst(ipv4AddressBuilder.build());\r
+        entriesBuilder.setMatchEntryValue(ipv4DstCaseBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+\r
+        builder.setMatchEntry(entries);\r
+        final Match match = builder.build();\r
+\r
+        final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow\r
+                .MatchBuilder salMatch = MatchConvertorImpl.fromOFMatchToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF13);\r
+        final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatch.build();\r
+\r
+        final Ipv4MatchArbitraryBitMask ipv4MatchArbitraryBitMask = (Ipv4MatchArbitraryBitMask) builtMatch.getLayer3Match();\r
+        Assert.assertEquals("Wrong ipv4 src address", "10.1.1.1",\r
+                ipv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask().getValue());\r
+        Assert.assertEquals("Wrong ipv4 dst address", "10.0.1.1",\r
+                ipv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask().getValue());\r
+    }\r
+\r
+    /**\r
+     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(\r
+     * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger,\r
+     * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
+     */\r
+    @Test\r
+    public void testWithMatchEntryWithSrcArbitraryBitMaskAndDstCidrMask() {\r
+        final MatchBuilder builder = new MatchBuilder();\r
+        builder.setType(OxmMatchType.class);\r
+        final List<MatchEntry> entries = new ArrayList<>();\r
+        MatchEntryBuilder entriesBuilder = new MatchEntryBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Metadata.class);\r
+        entriesBuilder.setHasMask(true);\r
+\r
+        entriesBuilder = new MatchEntryBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(Ipv4Src.class);\r
+        entriesBuilder.setHasMask(true);\r
+        final Ipv4SrcCaseBuilder ipv4SrcCaseBuilder = new Ipv4SrcCaseBuilder();\r
+        final Ipv4SrcBuilder ipv4SrcBuilder = new Ipv4SrcBuilder();\r
+        ipv4SrcBuilder.setIpv4Address(new Ipv4Address("10.1.1.1"));\r
+        ipv4SrcBuilder.setMask(new byte[]{(byte) 255, (byte) 0, (byte) 255, 0});\r
+        ipv4SrcCaseBuilder.setIpv4Src(ipv4SrcBuilder.build());\r
+        entriesBuilder.setMatchEntryValue(ipv4SrcCaseBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+\r
+        entriesBuilder = new MatchEntryBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(Ipv4Dst.class);\r
+        entriesBuilder.setHasMask(true);\r
+        final Ipv4DstCaseBuilder ipv4DstCaseBuilder = new Ipv4DstCaseBuilder();\r
+        final Ipv4DstBuilder ipv4AddressBuilder = new Ipv4DstBuilder();\r
+        ipv4AddressBuilder.setIpv4Address(new Ipv4Address("10.0.1.1"));\r
+        ipv4AddressBuilder.setMask(new byte[]{(byte) 255, (byte) 255, (byte) 240, 0});\r
+        ipv4DstCaseBuilder.setIpv4Dst(ipv4AddressBuilder.build());\r
+        entriesBuilder.setMatchEntryValue(ipv4DstCaseBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+\r
+        builder.setMatchEntry(entries);\r
+        final Match match = builder.build();\r
+\r
+        final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow\r
+                .MatchBuilder salMatch = MatchConvertorImpl.fromOFMatchToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF13);\r
+        final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatch.build();\r
+\r
+        final Ipv4MatchArbitraryBitMask ipv4MatchArbitraryBitMask = (Ipv4MatchArbitraryBitMask) builtMatch.getLayer3Match();\r
+        Assert.assertEquals("Wrong ipv4 src address", "10.1.1.1",\r
+                ipv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask().getValue());\r
+        Assert.assertEquals("Wrong ipv4 dst address", "10.0.1.1",\r
+                ipv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask().getValue());\r
+    }\r
+\r
+\r
+    /**\r
+     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(\r
+     * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger,\r
+     * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
+     */\r
+    @Test\r
+    public void testWithMatchEntryWithDstArbitraryBitMaskAndSrcCidrMask() {\r
+        final MatchBuilder builder = new MatchBuilder();\r
+        builder.setType(OxmMatchType.class);\r
+        final List<MatchEntry> entries = new ArrayList<>();\r
+        MatchEntryBuilder entriesBuilder = new MatchEntryBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Metadata.class);\r
+        entriesBuilder.setHasMask(true);\r
+\r
+        entriesBuilder = new MatchEntryBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(Ipv4Dst.class);\r
+        entriesBuilder.setHasMask(true);\r
+        final Ipv4DstCaseBuilder ipv4DstCaseBuilder = new Ipv4DstCaseBuilder();\r
+        final Ipv4DstBuilder ipv4AddressBuilder = new Ipv4DstBuilder();\r
+        ipv4AddressBuilder.setIpv4Address(new Ipv4Address("10.0.1.1"));\r
+        ipv4AddressBuilder.setMask(new byte[]{(byte) 255, 0, (byte) 240, 0});\r
+        ipv4DstCaseBuilder.setIpv4Dst(ipv4AddressBuilder.build());\r
+        entriesBuilder.setMatchEntryValue(ipv4DstCaseBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+\r
+        entriesBuilder = new MatchEntryBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(Ipv4Src.class);\r
+        entriesBuilder.setHasMask(true);\r
+        final Ipv4SrcCaseBuilder ipv4SrcCaseBuilder = new Ipv4SrcCaseBuilder();\r
+        final Ipv4SrcBuilder ipv4SrcBuilder = new Ipv4SrcBuilder();\r
+        ipv4SrcBuilder.setIpv4Address(new Ipv4Address("10.1.1.1"));\r
+        ipv4SrcBuilder.setMask(new byte[]{(byte) 255, (byte) 255, (byte) 255, 0});\r
+        ipv4SrcCaseBuilder.setIpv4Src(ipv4SrcBuilder.build());\r
+        entriesBuilder.setMatchEntryValue(ipv4SrcCaseBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+\r
+        builder.setMatchEntry(entries);\r
+        final Match match = builder.build();\r
+\r
+        final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow\r
+                .MatchBuilder salMatch = MatchConvertorImpl.fromOFMatchToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF13);\r
+        final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatch.build();\r
+\r
+        final Ipv4MatchArbitraryBitMask ipv4MatchArbitraryBitMask = (Ipv4MatchArbitraryBitMask) builtMatch.getLayer3Match();\r
+        Assert.assertEquals("Wrong ipv4 src address", "10.1.1.1",\r
+                ipv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask().getValue());\r
+        Assert.assertEquals("Wrong ipv4 dst address", "10.0.1.1",\r
+                ipv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask().getValue());\r
+    }\r
+\r
+    /**\r
+     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(\r
+     * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger,\r
+     * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
+     */\r
+    @Test\r
+    public void testWithMatchEntryWithDstCidrMaskAndSrcArbitraryBitMask() {\r
+        final MatchBuilder builder = new MatchBuilder();\r
+        builder.setType(OxmMatchType.class);\r
+        final List<MatchEntry> entries = new ArrayList<>();\r
+        MatchEntryBuilder entriesBuilder = new MatchEntryBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Metadata.class);\r
+        entriesBuilder.setHasMask(true);\r
+\r
+        entriesBuilder = new MatchEntryBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(Ipv4Dst.class);\r
+        entriesBuilder.setHasMask(true);\r
+        final Ipv4DstCaseBuilder ipv4DstCaseBuilder = new Ipv4DstCaseBuilder();\r
+        final Ipv4DstBuilder ipv4AddressBuilder = new Ipv4DstBuilder();\r
+        ipv4AddressBuilder.setIpv4Address(new Ipv4Address("10.0.1.1"));\r
+        ipv4AddressBuilder.setMask(new byte[]{(byte) 255, (byte) 255, (byte) 240, 0});\r
+        ipv4DstCaseBuilder.setIpv4Dst(ipv4AddressBuilder.build());\r
+        entriesBuilder.setMatchEntryValue(ipv4DstCaseBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+\r
+        entriesBuilder = new MatchEntryBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(Ipv4Src.class);\r
+        entriesBuilder.setHasMask(true);\r
+        final Ipv4SrcCaseBuilder ipv4SrcCaseBuilder = new Ipv4SrcCaseBuilder();\r
+        final Ipv4SrcBuilder ipv4SrcBuilder = new Ipv4SrcBuilder();\r
+        ipv4SrcBuilder.setIpv4Address(new Ipv4Address("10.1.1.1"));\r
+        ipv4SrcBuilder.setMask(new byte[]{(byte) 255, (byte) 0, (byte) 255, 0});\r
+        ipv4SrcCaseBuilder.setIpv4Src(ipv4SrcBuilder.build());\r
+        entriesBuilder.setMatchEntryValue(ipv4SrcCaseBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+\r
+        builder.setMatchEntry(entries);\r
+        final Match match = builder.build();\r
+\r
+        final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow\r
+                .MatchBuilder salMatch = MatchConvertorImpl.fromOFMatchToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF13);\r
         final org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatch.build();\r
 \r
         final Ipv4MatchArbitraryBitMask ipv4MatchArbitraryBitMask = (Ipv4MatchArbitraryBitMask) builtMatch.getLayer3Match();\r
-        Assert.assertEquals("Wrong ipv4 src address", "10.1.1.1", ipv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask().getValue());\r
-        Assert.assertEquals("Wrong ipv4 dst address", "10.0.1.1", ipv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask().getValue());\r
+        Assert.assertEquals("Wrong ipv4 src address", "10.1.1.1",\r
+                ipv4MatchArbitraryBitMask.getIpv4SourceAddressNoMask().getValue());\r
+        Assert.assertEquals("Wrong ipv4 dst address", "10.0.1.1",\r
+                ipv4MatchArbitraryBitMask.getIpv4DestinationAddressNoMask().getValue());\r
     }\r
 \r
     /**\r
-     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
+     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(\r
+     * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger,\r
+     * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
      */\r
     @Test\r
     public void testLayer4MatchUdp() {\r
@@ -753,7 +981,9 @@ public class MatchConvertorImplV13Test {
     }\r
 \r
     /**\r
-     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
+     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(\r
+     * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger,\r
+     * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
      */\r
     @Test\r
     public void testLayer4MatchSctp() {\r
@@ -796,7 +1026,9 @@ public class MatchConvertorImplV13Test {
     }\r
 \r
     /**\r
-     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
+     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(\r
+     * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger,\r
+     * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
      */\r
     @Test\r
     public void testLayer3MatchIpv6() {\r
@@ -899,7 +1131,9 @@ public class MatchConvertorImplV13Test {
     }\r
 \r
     /**\r
-     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
+     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(\r
+     * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger,\r
+     * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
      */\r
     @Test\r
     public void testLayer3MatchIpv6ExtHeader2() {\r
@@ -929,7 +1163,9 @@ public class MatchConvertorImplV13Test {
     }\r
 \r
     /**\r
-     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
+     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(\r
+     * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger,\r
+     * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
      */\r
     @Test\r
     public void testLayer3MatchArp() {\r
@@ -1005,7 +1241,9 @@ public class MatchConvertorImplV13Test {
     }\r
 \r
     /**\r
-     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger, org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
+     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(\r
+     * org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match, java.math.BigInteger,\r
+     * org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion)}\r
      */\r
     @Test\r
     public void testLayer3MatchArpWithMasks() {\r