Bug-5562 - Ipv4 L3-ArbitraryMask patch
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / sal / convertor / IpConversionUtil.java
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;
                 }
             }