From 14f7544c3e5a33ccaa1ef1f1cbdb3a50aa914e3e Mon Sep 17 00:00:00 2001 From: Luke Huang Date: Wed, 15 Aug 2018 19:22:54 +0800 Subject: [PATCH] interface-related commands porting Test: runtest frameworks-net passes Test: manual testing of interface related function works(tethering) Change-Id: Ie1a1ac00c28ef914d62e7d75b0db8c2434c810d2 --- .../android/net/InterfaceConfiguration.java | 42 +++++++- .../server/NetworkManagementService.java | 96 +++++++------------ 2 files changed, 72 insertions(+), 66 deletions(-) diff --git a/core/java/android/net/InterfaceConfiguration.java b/core/java/android/net/InterfaceConfiguration.java index b27415566368b..62cf7d7ceb25e 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 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() { @@ -111,6 +115,40 @@ public class InterfaceConfiguration implements Parcelable { mHwAddr = hwAddr; } + /** + * 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 4e8177bdd5f91..0e94d905d34b9 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; @@ -964,55 +965,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 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 @@ -1023,17 +998,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); } } @@ -1057,10 +1027,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); } } @@ -1070,9 +1039,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); } } @@ -1080,9 +1049,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); } } @@ -1099,9 +1068,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); } } @@ -1183,11 +1152,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); } }