NetworkManagementService: Introduce API methods for configuring interfaces

Signed-off-by: San Mehat <san@google.com>
diff --git a/services/java/com/android/server/NetworkManagementService.java b/services/java/com/android/server/NetworkManagementService.java
index a4abddb..7b66a76 100644
--- a/services/java/com/android/server/NetworkManagementService.java
+++ b/services/java/com/android/server/NetworkManagementService.java
@@ -24,12 +24,13 @@
 import android.content.res.Resources;
 import android.content.pm.PackageManager;
 import android.net.Uri;
+import android.net.InterfaceConfiguration;
 import android.os.INetworkManagementService;
 import android.os.Handler;
 import android.text.TextUtils;
 import android.util.Log;
 import java.util.ArrayList;
-
+import java.util.StringTokenizer;
 import android.provider.Settings;
 import android.content.ContentResolver;
 import android.database.ContentObserver;
@@ -56,6 +57,7 @@
 
         public static final int TetherStatusResult        = 210;
         public static final int IpFwdStatusResult         = 211;
+        public static final int InterfaceGetCfgResult     = 213;
     }
 
     /**
@@ -99,6 +101,29 @@
         }
     }
 
+    private static int stringToIpAddr(String addrString) throws UnknownHostException {
+        try {
+            String[] parts = addrString.split("\\.");
+            if (parts.length != 4) {
+                throw new UnknownHostException(addrString);
+            }
+
+            int a = Integer.parseInt(parts[0])      ;
+            int b = Integer.parseInt(parts[1]) <<  8;
+            int c = Integer.parseInt(parts[2]) << 16;
+            int d = Integer.parseInt(parts[3]) << 24;
+
+            return a | b | c | d;
+        } catch (NumberFormatException ex) {
+            throw new UnknownHostException(addrString);
+        }
+    }
+
+    public static String intToIpString(int i) {
+        return ((i >> 24 ) & 0xFF) + "." + ((i >> 16 ) & 0xFF) + "." + ((i >>  8 ) & 0xFF) + "." +
+               (i & 0xFF);
+    }
+
     //
     // INetworkManagementService members
     //
@@ -107,7 +132,53 @@
         mContext.enforceCallingOrSelfPermission(
                 android.Manifest.permission.ACCESS_NETWORK_STATE, "NetworkManagementService");
 
-        return mConnector.doListCommand("list_interfaces", NetdResponseCode.InterfaceListResult);
+        return mConnector.doListCommand("interface list", NetdResponseCode.InterfaceListResult);
+    }
+
+    public InterfaceConfiguration getInterfaceConfig(String iface) throws IllegalStateException {
+        String rsp = mConnector.doCommand("interface getcfg " + iface).get(0);
+        Log.d(TAG, String.format("rsp <%s>", rsp));
+
+        // Rsp: 213 xx:xx:xx:xx:xx:xx yyy.yyy.yyy.yyy zzz.zzz.zzz.zzz [flag1 flag2 flag3]
+        StringTokenizer st = new StringTokenizer(rsp);
+
+        try {
+            int code = Integer.parseInt(st.nextToken(" "));
+            if (code != NetdResponseCode.InterfaceGetCfgResult) {
+                throw new IllegalStateException(
+                    String.format("Expected code %d, but got %d",
+                            NetdResponseCode.InterfaceGetCfgResult, code));
+            }
+        } catch (NumberFormatException nfe) {
+            throw new IllegalStateException(
+                    String.format("Invalid response from daemon (%s)", rsp));
+        }
+
+        InterfaceConfiguration cfg = new InterfaceConfiguration();
+        cfg.hwAddr = st.nextToken(" ");
+        try {
+            cfg.ipAddr = stringToIpAddr(st.nextToken(" "));
+        } catch (UnknownHostException uhe) {
+            Log.e(TAG, "Failed to parse ipaddr", uhe);
+            cfg.ipAddr = 0;
+        }
+
+        try {
+            cfg.netmask = stringToIpAddr(st.nextToken(" "));
+        } catch (UnknownHostException uhe) {
+            Log.e(TAG, "Failed to parse netmask", uhe);
+            cfg.netmask = 0;
+        }
+        cfg.interfaceFlags = st.nextToken("]");
+        Log.d(TAG, String.format("flags <%s>", cfg.interfaceFlags));
+        return cfg;
+    }
+
+    public void setInterfaceConfig(
+            String iface, InterfaceConfiguration cfg) throws IllegalStateException {
+        String cmd = String.format("interface setcfg %s %s %s", iface,
+                intToIpString(cfg.ipAddr), intToIpString(cfg.netmask), cfg.interfaceFlags);
+        mConnector.doCommand(cmd);
     }
 
     public void shutdown() {