summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/net/InterfaceConfiguration.java42
-rw-r--r--services/core/java/com/android/server/NetworkManagementService.java96
2 files changed, 72 insertions, 66 deletions
diff --git a/core/java/android/net/InterfaceConfiguration.java b/core/java/android/net/InterfaceConfiguration.java
index b27415566368..62cf7d7ceb25 100644
--- a/core/java/android/net/InterfaceConfiguration.java
+++ b/core/java/android/net/InterfaceConfiguration.java
@@ -19,9 +19,11 @@ package android.net;
import android.annotation.UnsupportedAppUsage;
import android.os.Parcel;
import android.os.Parcelable;
+import android.text.TextUtils;
import com.google.android.collect.Sets;
+import java.net.InetAddress;
import java.util.HashSet;
/**
@@ -34,8 +36,10 @@ public class InterfaceConfiguration implements Parcelable {
private LinkAddress mAddr;
private HashSet<String> mFlags = Sets.newHashSet();
- private static final String FLAG_UP = "up";
- private static final String FLAG_DOWN = "down";
+ private static final String FLAG_UP = INetd.IF_STATE_UP;
+ private static final String FLAG_DOWN = INetd.IF_STATE_DOWN;
+
+ private static final String[] EMPTY_STRING_ARRAY = new String[0];
@Override
public String toString() {
@@ -112,6 +116,40 @@ public class InterfaceConfiguration implements Parcelable {
}
/**
+ * Construct InterfaceConfiguration from InterfaceConfigurationParcel.
+ */
+ public static InterfaceConfiguration fromParcel(InterfaceConfigurationParcel p) {
+ InterfaceConfiguration cfg = new InterfaceConfiguration();
+ cfg.setHardwareAddress(p.hwAddr);
+
+ final InetAddress addr = NetworkUtils.numericToInetAddress(p.ipv4Addr);
+ cfg.setLinkAddress(new LinkAddress(addr, p.prefixLength));
+ for (String flag : p.flags) {
+ cfg.setFlag(flag);
+ }
+
+ return cfg;
+ }
+
+ /**
+ * Convert InterfaceConfiguration to InterfaceConfigurationParcel with given ifname.
+ */
+ public InterfaceConfigurationParcel toParcel(String iface) {
+ InterfaceConfigurationParcel cfgParcel = new InterfaceConfigurationParcel();
+ cfgParcel.ifName = iface;
+ if (!TextUtils.isEmpty(mHwAddr)) {
+ cfgParcel.hwAddr = mHwAddr;
+ } else {
+ cfgParcel.hwAddr = "";
+ }
+ cfgParcel.ipv4Addr = mAddr.getAddress().getHostAddress();
+ cfgParcel.prefixLength = mAddr.getPrefixLength();
+ cfgParcel.flags = mFlags.toArray(EMPTY_STRING_ARRAY);
+
+ return cfgParcel;
+ }
+
+ /**
* This function determines if the interface is up and has a valid IP
* configuration (IP address has a non zero octet).
*
diff --git a/services/core/java/com/android/server/NetworkManagementService.java b/services/core/java/com/android/server/NetworkManagementService.java
index 76f29aa48ac0..385ef7f2a81c 100644
--- a/services/core/java/com/android/server/NetworkManagementService.java
+++ b/services/core/java/com/android/server/NetworkManagementService.java
@@ -61,6 +61,7 @@ import android.net.TetherStatsParcel;
import android.net.INetworkManagementEventObserver;
import android.net.ITetheringStatsProvider;
import android.net.InterfaceConfiguration;
+import android.net.InterfaceConfigurationParcel;
import android.net.IpPrefix;
import android.net.LinkAddress;
import android.net.Network;
@@ -965,55 +966,29 @@ public class NetworkManagementService extends INetworkManagementService.Stub
public String[] listInterfaces() {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
try {
- return NativeDaemonEvent.filterMessageList(
- mConnector.executeForList("interface", "list"), InterfaceListResult);
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
+ final List<String> result = mNetdService.interfaceGetList();
+ return result.toArray(EMPTY_STRING_ARRAY);
+ } catch (RemoteException | ServiceSpecificException e) {
+ throw new IllegalStateException(e);
}
}
@Override
public InterfaceConfiguration getInterfaceConfig(String iface) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
-
- final NativeDaemonEvent event;
+ final InterfaceConfigurationParcel result;
try {
- event = mConnector.execute("interface", "getcfg", iface);
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
+ result = mNetdService.interfaceGetCfg(iface);
+ } catch (RemoteException | ServiceSpecificException e) {
+ throw new IllegalStateException(e);
}
- event.checkCode(InterfaceGetCfgResult);
-
- // Rsp: 213 xx:xx:xx:xx:xx:xx yyy.yyy.yyy.yyy zzz flag1 flag2 flag3
- final StringTokenizer st = new StringTokenizer(event.getMessage());
-
- InterfaceConfiguration cfg;
try {
- cfg = new InterfaceConfiguration();
- cfg.setHardwareAddress(st.nextToken(" "));
- InetAddress addr = null;
- int prefixLength = 0;
- try {
- addr = NetworkUtils.numericToInetAddress(st.nextToken());
- } catch (IllegalArgumentException iae) {
- Slog.e(TAG, "Failed to parse ipaddr", iae);
- }
-
- try {
- prefixLength = Integer.parseInt(st.nextToken());
- } catch (NumberFormatException nfe) {
- Slog.e(TAG, "Failed to parse prefixLength", nfe);
- }
-
- cfg.setLinkAddress(new LinkAddress(addr, prefixLength));
- while (st.hasMoreTokens()) {
- cfg.setFlag(st.nextToken());
- }
- } catch (NoSuchElementException nsee) {
- throw new IllegalStateException("Invalid response from daemon: " + event);
+ final InterfaceConfiguration cfg = InterfaceConfiguration.fromParcel(result);
+ return cfg;
+ } catch (IllegalArgumentException iae) {
+ throw new IllegalStateException("Invalid InterfaceConfigurationParcel", iae);
}
- return cfg;
}
@Override
@@ -1024,17 +999,12 @@ public class NetworkManagementService extends INetworkManagementService.Stub
throw new IllegalStateException("Null LinkAddress given");
}
- final Command cmd = new Command("interface", "setcfg", iface,
- linkAddr.getAddress().getHostAddress(),
- linkAddr.getPrefixLength());
- for (String flag : cfg.getFlags()) {
- cmd.appendArg(flag);
- }
+ final InterfaceConfigurationParcel cfgParcel = cfg.toParcel(iface);
try {
- mConnector.execute(cmd);
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
+ mNetdService.interfaceSetCfg(cfgParcel);
+ } catch (RemoteException | ServiceSpecificException e) {
+ throw new IllegalStateException(e);
}
}
@@ -1058,10 +1028,9 @@ public class NetworkManagementService extends INetworkManagementService.Stub
public void setInterfaceIpv6PrivacyExtensions(String iface, boolean enable) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
try {
- mConnector.execute(
- "interface", "ipv6privacyextensions", iface, enable ? "enable" : "disable");
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
+ mNetdService.interfaceSetIPv6PrivacyExtensions(iface, enable);
+ } catch (RemoteException | ServiceSpecificException e) {
+ throw new IllegalStateException(e);
}
}
@@ -1071,9 +1040,9 @@ public class NetworkManagementService extends INetworkManagementService.Stub
public void clearInterfaceAddresses(String iface) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
try {
- mConnector.execute("interface", "clearaddrs", iface);
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
+ mNetdService.interfaceClearAddrs(iface);
+ } catch (RemoteException | ServiceSpecificException e) {
+ throw new IllegalStateException(e);
}
}
@@ -1081,9 +1050,9 @@ public class NetworkManagementService extends INetworkManagementService.Stub
public void enableIpv6(String iface) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
try {
- mConnector.execute("interface", "ipv6", iface, "enable");
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
+ mNetdService.interfaceSetEnableIPv6(iface, true);
+ } catch (RemoteException | ServiceSpecificException e) {
+ throw new IllegalStateException(e);
}
}
@@ -1100,9 +1069,9 @@ public class NetworkManagementService extends INetworkManagementService.Stub
public void disableIpv6(String iface) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
try {
- mConnector.execute("interface", "ipv6", iface, "disable");
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
+ mNetdService.interfaceSetEnableIPv6(iface, false);
+ } catch (RemoteException | ServiceSpecificException e) {
+ throw new IllegalStateException(e);
}
}
@@ -1184,11 +1153,10 @@ public class NetworkManagementService extends INetworkManagementService.Stub
public void setMtu(String iface, int mtu) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
- final NativeDaemonEvent event;
try {
- event = mConnector.execute("interface", "setmtu", iface, mtu);
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
+ mNetdService.interfaceSetMtu(iface, mtu);
+ } catch (RemoteException | ServiceSpecificException e) {
+ throw new IllegalStateException(e);
}
}