Use LinkProperties for IP and proxy configuration

Change-Id: I4ae817fb00141e9a742216b7fd02dca1ed228270
diff --git a/core/java/android/net/LinkAddress.java b/core/java/android/net/LinkAddress.java
index cb302da..3f03a2a 100644
--- a/core/java/android/net/LinkAddress.java
+++ b/core/java/android/net/LinkAddress.java
@@ -34,26 +34,26 @@
     private final InetAddress address;
 
     /**
-     * Network prefix
+     * Network prefix length
      */
-    private final int prefix;
+    private final int prefixLength;
 
     public LinkAddress(InetAddress address, InetAddress mask) {
         this.address = address;
-        this.prefix = computeprefix(mask);
+        this.prefixLength = computeprefixLength(mask);
     }
 
-    public LinkAddress(InetAddress address, int prefix) {
+    public LinkAddress(InetAddress address, int prefixLength) {
         this.address = address;
-        this.prefix = prefix;
+        this.prefixLength = prefixLength;
     }
 
     public LinkAddress(InterfaceAddress interfaceAddress) {
         this.address = interfaceAddress.getAddress();
-        this.prefix = interfaceAddress.getNetworkPrefixLength();
+        this.prefixLength = interfaceAddress.getNetworkPrefixLength();
     }
 
-    private static int computeprefix(InetAddress mask) {
+    private static int computeprefixLength(InetAddress mask) {
         int count = 0;
         for (byte b : mask.getAddress()) {
             for (int i = 0; i < 8; ++i) {
@@ -67,12 +67,12 @@
 
     @Override
     public String toString() {
-        return (address == null ? "" : (address.getHostAddress() + "/" + prefix));
+        return (address == null ? "" : (address.getHostAddress() + "/" + prefixLength));
     }
 
     /**
      * Compares this {@code LinkAddress} instance against the specified address
-     * in {@code obj}. Two addresses are equal if their InetAddress and prefix
+     * in {@code obj}. Two addresses are equal if their InetAddress and prefixLength
      * are equal
      *
      * @param obj the object to be tested for equality.
@@ -85,7 +85,7 @@
         }
         LinkAddress linkAddress = (LinkAddress) obj;
         return this.address.equals(linkAddress.address) &&
-            this.prefix == linkAddress.prefix;
+            this.prefixLength == linkAddress.prefixLength;
     }
 
     /**
@@ -98,8 +98,8 @@
     /**
      * Get network prefix length
      */
-    public int getNetworkPrefix() {
-        return prefix;
+    public int getNetworkPrefixLength() {
+        return prefixLength;
     }
 
     /**
@@ -118,7 +118,7 @@
         if (address != null) {
             dest.writeByte((byte)1);
             dest.writeByteArray(address.getAddress());
-            dest.writeInt(prefix);
+            dest.writeInt(prefixLength);
         } else {
             dest.writeByte((byte)0);
         }
@@ -132,14 +132,14 @@
         new Creator<LinkAddress>() {
             public LinkAddress createFromParcel(Parcel in) {
                 InetAddress address = null;
-                int prefix = 0;
+                int prefixLength = 0;
                 if (in.readByte() == 1) {
                     try {
                         address = InetAddress.getByAddress(in.createByteArray());
-                        prefix = in.readInt();
+                        prefixLength = in.readInt();
                     } catch (UnknownHostException e) { }
                 }
-                return new LinkAddress(address, prefix);
+                return new LinkAddress(address, prefixLength);
             }
 
             public LinkAddress[] newArray(int size) {
diff --git a/core/java/android/net/NetworkUtils.java b/core/java/android/net/NetworkUtils.java
index 01004c2..6b1fe99 100644
--- a/core/java/android/net/NetworkUtils.java
+++ b/core/java/android/net/NetworkUtils.java
@@ -146,6 +146,57 @@
     }
 
     /**
+     * Convert a IPv4 address from an InetAddress to an integer
+     * @param inetAddr is an InetAddress corresponding to the IPv4 address
+     * @return the IP address as an integer in network byte order
+     */
+    public static int inetAddressToInt(InetAddress inetAddr)
+            throws IllegalArgumentException {
+        byte [] addr = inetAddr.getAddress();
+        if (addr.length != 4) {
+            throw new IllegalArgumentException("Not an IPv4 address");
+        }
+        return ((addr[3] & 0xff) << 24) | ((addr[2] & 0xff) << 16) |
+                ((addr[1] & 0xff) << 8) | (addr[0] & 0xff);
+    }
+
+    /**
+     * Convert a network prefix length to an IPv4 netmask integer
+     * @param prefixLength
+     * @return the IPv4 netmask as an integer in network byte order
+     */
+    public static int prefixLengthToNetmaskInt(int prefixLength)
+            throws IllegalArgumentException {
+        if (prefixLength < 0 || prefixLength > 32) {
+            throw new IllegalArgumentException("Invalid prefix length (0 <= prefix <= 32)");
+        }
+        int value = 0xffffffff << (32 - prefixLength);
+        return Integer.reverseBytes(value);
+    }
+
+    public static boolean isIpAddress(String address) {
+        //TODO: Add NetworkUtils support for IPv6 configuration and
+        //remove IPv4 validation and use a generic InetAddress validation
+        try {
+            String[] parts = address.split("\\.");
+            if (parts.length != 4) {
+                return false;
+            }
+            int a = Integer.parseInt(parts[0]);
+            if (a < 0 || a > 255) return false;
+            a = Integer.parseInt(parts[1]);
+            if (a < 0 || a > 255) return false;
+            a = Integer.parseInt(parts[2]);
+            if (a < 0 || a > 255) return false;
+            a = Integer.parseInt(parts[3]);
+            if (a < 0 || a > 255) return false;
+        } catch (NumberFormatException ex) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
      * Add a default route through the specified gateway.
      * @param interfaceName interface on which the route should be added
      * @param gw the IP address of the gateway to which the route is desired,