summaryrefslogtreecommitdiff
path: root/services
diff options
context:
space:
mode:
Diffstat (limited to 'services')
-rw-r--r--services/net/java/android/net/ip/InterfaceController.java105
-rw-r--r--services/net/java/android/net/ip/IpClient.java2
-rw-r--r--services/net/java/android/net/ip/IpServer.java2
3 files changed, 71 insertions, 38 deletions
diff --git a/services/net/java/android/net/ip/InterfaceController.java b/services/net/java/android/net/ip/InterfaceController.java
index 55dfcef81890..b3af67cdbdc3 100644
--- a/services/net/java/android/net/ip/InterfaceController.java
+++ b/services/net/java/android/net/ip/InterfaceController.java
@@ -18,13 +18,14 @@ package android.net.ip;
import android.net.INetd;
import android.net.InterfaceConfiguration;
+import android.net.InterfaceConfigurationParcel;
import android.net.LinkAddress;
import android.net.util.SharedLog;
-import android.os.INetworkManagementService;
import android.os.RemoteException;
import android.os.ServiceSpecificException;
import android.system.OsConstants;
+import java.net.Inet4Address;
import java.net.InetAddress;
@@ -39,76 +40,96 @@ public class InterfaceController {
private final static boolean DBG = false;
private final String mIfName;
- private final INetworkManagementService mNMS;
private final INetd mNetd;
private final SharedLog mLog;
- public InterfaceController(String ifname, INetworkManagementService nms, INetd netd,
- SharedLog log) {
+ public InterfaceController(String ifname, INetd netd, SharedLog log) {
mIfName = ifname;
- mNMS = nms;
mNetd = netd;
mLog = log;
}
- public boolean setIPv4Address(LinkAddress address) {
- final InterfaceConfiguration ifcg = new InterfaceConfiguration();
- ifcg.setLinkAddress(address);
+ private boolean setInterfaceConfig(InterfaceConfiguration config) {
+ final InterfaceConfigurationParcel cfgParcel = config.toParcel(mIfName);
+
try {
- mNMS.setInterfaceConfig(mIfName, ifcg);
- if (DBG) mLog.log("IPv4 configuration succeeded");
- } catch (IllegalStateException | RemoteException e) {
- logError("IPv4 configuration failed: %s", e);
+ mNetd.interfaceSetCfg(cfgParcel);
+ } catch (RemoteException | ServiceSpecificException e) {
+ logError("Setting IPv4 address to %s/%d failed: %s",
+ cfgParcel.ipv4Addr, cfgParcel.prefixLength, e);
return false;
}
return true;
}
- public boolean clearIPv4Address() {
- try {
- final InterfaceConfiguration ifcg = new InterfaceConfiguration();
- ifcg.setLinkAddress(new LinkAddress("0.0.0.0/0"));
- mNMS.setInterfaceConfig(mIfName, ifcg);
- } catch (IllegalStateException | RemoteException e) {
- logError("Failed to clear IPv4 address on interface %s: %s", mIfName, e);
+ /**
+ * Set the IPv4 address of the interface.
+ */
+ public boolean setIPv4Address(LinkAddress address) {
+ if (!(address.getAddress() instanceof Inet4Address)) {
return false;
}
- return true;
+ final InterfaceConfiguration ifConfig = new InterfaceConfiguration();
+ ifConfig.setLinkAddress(address);
+ return setInterfaceConfig(ifConfig);
}
- public boolean enableIPv6() {
+ /**
+ * Clear the IPv4Address of the interface.
+ */
+ public boolean clearIPv4Address() {
+ final InterfaceConfiguration ifConfig = new InterfaceConfiguration();
+ ifConfig.setLinkAddress(new LinkAddress("0.0.0.0/0"));
+ return setInterfaceConfig(ifConfig);
+ }
+
+ private boolean setEnableIPv6(boolean enabled) {
try {
- mNMS.enableIpv6(mIfName);
- } catch (IllegalStateException | RemoteException e) {
- logError("enabling IPv6 failed: %s", e);
+ mNetd.interfaceSetEnableIPv6(mIfName, enabled);
+ } catch (RemoteException | ServiceSpecificException e) {
+ logError("%s IPv6 failed: %s", (enabled ? "enabling" : "disabling"), e);
return false;
}
return true;
}
+ /**
+ * Enable IPv6 on the interface.
+ */
+ public boolean enableIPv6() {
+ return setEnableIPv6(true);
+ }
+
+ /**
+ * Disable IPv6 on the interface.
+ */
public boolean disableIPv6() {
- try {
- mNMS.disableIpv6(mIfName);
- } catch (IllegalStateException | RemoteException e) {
- logError("disabling IPv6 failed: %s", e);
- return false;
- }
- return true;
+ return setEnableIPv6(false);
}
+ /**
+ * Enable or disable IPv6 privacy extensions on the interface.
+ * @param enabled Whether the extensions should be enabled.
+ */
public boolean setIPv6PrivacyExtensions(boolean enabled) {
try {
- mNMS.setInterfaceIpv6PrivacyExtensions(mIfName, enabled);
- } catch (IllegalStateException | RemoteException e) {
- logError("error setting IPv6 privacy extensions: %s", e);
+ mNetd.interfaceSetIPv6PrivacyExtensions(mIfName, enabled);
+ } catch (RemoteException | ServiceSpecificException e) {
+ logError("error %s IPv6 privacy extensions: %s",
+ (enabled ? "enabling" : "disabling"), e);
return false;
}
return true;
}
+ /**
+ * Set IPv6 address generation mode on the interface.
+ *
+ * <p>IPv6 should be disabled before changing the mode.
+ */
public boolean setIPv6AddrGenModeIfSupported(int mode) {
try {
- mNMS.setIPv6AddrGenMode(mIfName, mode);
+ mNetd.setIPv6AddrGenMode(mIfName, mode);
} catch (RemoteException e) {
logError("Unable to set IPv6 addrgen mode: %s", e);
return false;
@@ -121,10 +142,16 @@ public class InterfaceController {
return true;
}
+ /**
+ * Add an address to the interface.
+ */
public boolean addAddress(LinkAddress addr) {
return addAddress(addr.getAddress(), addr.getPrefixLength());
}
+ /**
+ * Add an address to the interface.
+ */
public boolean addAddress(InetAddress ip, int prefixLen) {
try {
mNetd.interfaceAddAddress(mIfName, ip.getHostAddress(), prefixLen);
@@ -135,6 +162,9 @@ public class InterfaceController {
return true;
}
+ /**
+ * Remove an address from the interface.
+ */
public boolean removeAddress(InetAddress ip, int prefixLen) {
try {
mNetd.interfaceDelAddress(mIfName, ip.getHostAddress(), prefixLen);
@@ -145,9 +175,12 @@ public class InterfaceController {
return true;
}
+ /**
+ * Remove all addresses from the interface.
+ */
public boolean clearAllAddresses() {
try {
- mNMS.clearInterfaceAddresses(mIfName);
+ mNetd.interfaceClearAddrs(mIfName);
} catch (Exception e) {
logError("Failed to clear addresses: %s", e);
return false;
diff --git a/services/net/java/android/net/ip/IpClient.java b/services/net/java/android/net/ip/IpClient.java
index 9f1557354dc4..62cd2d7cf2c8 100644
--- a/services/net/java/android/net/ip/IpClient.java
+++ b/services/net/java/android/net/ip/IpClient.java
@@ -479,7 +479,7 @@ public class IpClient extends StateMachine {
// TODO: Consider creating, constructing, and passing in some kind of
// InterfaceController.Dependencies class.
- mInterfaceCtrl = new InterfaceController(mInterfaceName, mNwService, deps.getNetd(), mLog);
+ mInterfaceCtrl = new InterfaceController(mInterfaceName, deps.getNetd(), mLog);
mNetlinkTracker = new NetlinkTracker(
mInterfaceName,
diff --git a/services/net/java/android/net/ip/IpServer.java b/services/net/java/android/net/ip/IpServer.java
index 8b22f68286af..7910c9a69310 100644
--- a/services/net/java/android/net/ip/IpServer.java
+++ b/services/net/java/android/net/ip/IpServer.java
@@ -226,7 +226,7 @@ public class IpServer extends StateMachine {
mNetd = deps.getNetdService();
mStatsService = statsService;
mCallback = callback;
- mInterfaceCtrl = new InterfaceController(ifaceName, nMService, mNetd, mLog);
+ mInterfaceCtrl = new InterfaceController(ifaceName, mNetd, mLog);
mIfaceName = ifaceName;
mInterfaceType = interfaceType;
mLinkProperties = new LinkProperties();