diff options
Diffstat (limited to 'services')
| -rw-r--r-- | services/net/java/android/net/ip/InterfaceController.java | 105 | ||||
| -rw-r--r-- | services/net/java/android/net/ip/IpClient.java | 2 | ||||
| -rw-r--r-- | services/net/java/android/net/ip/IpServer.java | 2 |
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(); |