Support static IP configuration internally

Also, stop passing around "reason" for IPv4 provision success
or failure.

Bug: 17345682
Change-Id: I4c4b22977a93048e0b291206721d0ccc77cfaaf2
diff --git a/services/net/java/android/net/ip/IpManager.java b/services/net/java/android/net/ip/IpManager.java
index 87ac846..62c635d 100644
--- a/services/net/java/android/net/ip/IpManager.java
+++ b/services/net/java/android/net/ip/IpManager.java
@@ -18,6 +18,7 @@
 
 import android.content.Context;
 import android.net.DhcpResults;
+import android.net.InterfaceConfiguration;
 import android.net.LinkProperties;
 import android.net.LinkProperties.ProvisioningChange;
 import android.net.RouteInfo;
@@ -86,8 +87,8 @@
 
         // TODO: Kill with fire once DHCP and static configuration are moved
         // out of WifiStateMachine.
-        public void onIPv4ProvisioningSuccess(DhcpResults dhcpResults, int reason) {}
-        public void onIPv4ProvisioningFailure(int reason) {}
+        public void onIPv4ProvisioningSuccess(DhcpResults dhcpResults) {}
+        public void onIPv4ProvisioningFailure() {}
 
         public void onProvisioningSuccess(LinkProperties newLp) {}
         public void onProvisioningFailure(LinkProperties newLp) {}
@@ -216,8 +217,8 @@
     }
 
     // TODO: Kill with fire once DHCPv4/static config is moved into IpManager.
-    public void updateWithDhcpResults(DhcpResults dhcpResults, int reason) {
-        sendMessage(CMD_UPDATE_DHCPV4_RESULTS, reason, 0, dhcpResults);
+    public void updateWithDhcpResults(DhcpResults dhcpResults) {
+        sendMessage(CMD_UPDATE_DHCPV4_RESULTS, dhcpResults);
     }
 
 
@@ -382,7 +383,15 @@
                         }
                     });
 
-            // TODO: Check mStaticIpConfig and handle accordingly.
+            // If we have a StaticIpConfiguration attempt to apply it and
+            // handle the result accordingly.
+            if (mStaticIpConfig != null) {
+                if (applyStaticIpConfig()) {
+                    sendMessage(CMD_UPDATE_DHCPV4_RESULTS, new DhcpResults(mStaticIpConfig));
+                } else {
+                    sendMessage(CMD_UPDATE_DHCPV4_RESULTS);
+                }
+            }
         }
 
         @Override
@@ -415,15 +424,14 @@
 
                 case CMD_UPDATE_DHCPV4_RESULTS:
                     final DhcpResults dhcpResults = (DhcpResults) msg.obj;
-                    final int reason = msg.arg1;
                     if (dhcpResults != null) {
                         mDhcpResults = new DhcpResults(dhcpResults);
                         setLinkProperties(assembleLinkProperties());
-                        mCallback.onIPv4ProvisioningSuccess(dhcpResults, reason);
+                        mCallback.onIPv4ProvisioningSuccess(dhcpResults);
                     } else {
                         mDhcpResults = null;
                         setLinkProperties(assembleLinkProperties());
-                        mCallback.onIPv4ProvisioningFailure(reason);
+                        mCallback.onIPv4ProvisioningFailure();
                     }
                     break;
 
@@ -457,5 +465,19 @@
             return HANDLED;
         }
 
+        private boolean applyStaticIpConfig() {
+            final InterfaceConfiguration ifcg = new InterfaceConfiguration();
+            ifcg.setLinkAddress(mStaticIpConfig.ipAddress);
+            ifcg.setInterfaceUp();
+            try {
+                mNwService.setInterfaceConfig(mInterfaceName, ifcg);
+                if (DBG) Log.d(TAG, "Static IP configuration succeeded");
+            } catch (IllegalStateException | RemoteException e) {
+                Log.e(TAG, "Static IP configuration failed: ", e);
+                return false;
+            }
+
+            return true;
+        }
     }
 }