diff options
author | James Mattis <jmattis@google.com> | 2022-01-20 16:25:05 -0800 |
---|---|---|
committer | James Mattis <jmattis@google.com> | 2022-02-01 21:10:18 -0800 |
commit | 0806138c1c0b9ecbf43f9b093bb0b4b01ecb68c6 (patch) | |
tree | bf4f3189fa67e2d31176ede6479697f1ac70da5d /java | |
parent | 2143e4ff69eefb3f81c58d631af62155c46ecd86 (diff) | |
download | ethernet-0806138c1c0b9ecbf43f9b093bb0b4b01ecb68c6.tar.gz |
Implementation of Eth Connect & Disconnect Network
Implementation of EthernetService APIs for ConnectNetwork() and
DisconnectNetwork().
Bug: 210485380
Test: atest EthernetServiceTests
Change-Id: I4c3e361d052206cb28b97fc439bfeac8e7e0fec0
Diffstat (limited to 'java')
3 files changed, 41 insertions, 6 deletions
diff --git a/java/com/android/server/ethernet/EthernetNetworkFactory.java b/java/com/android/server/ethernet/EthernetNetworkFactory.java index c610f00..0832b50 100644 --- a/java/com/android/server/ethernet/EthernetNetworkFactory.java +++ b/java/com/android/server/ethernet/EthernetNetworkFactory.java @@ -252,8 +252,13 @@ public class EthernetNetworkFactory extends NetworkFactory { } /** Returns true if state has been modified */ - boolean updateInterfaceLinkState(String ifaceName, boolean up) { + @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) + protected boolean updateInterfaceLinkState(@NonNull final String ifaceName, final boolean up, + @Nullable final IInternalNetworkManagementListener listener) { if (!mTrackingInterfaces.containsKey(ifaceName)) { + maybeSendNetworkManagementCallback(listener, null, + new InternalNetworkManagementException( + ifaceName + " can't be updated as it is not available.")); return false; } @@ -262,7 +267,7 @@ public class EthernetNetworkFactory extends NetworkFactory { } NetworkInterfaceState iface = mTrackingInterfaces.get(ifaceName); - return iface.updateLinkState(up); + return iface.updateLinkState(up, listener); } boolean hasInterface(String ifaceName) { @@ -615,16 +620,27 @@ public class EthernetNetworkFactory extends NetworkFactory { } /** Returns true if state has been modified */ - boolean updateLinkState(boolean up) { - if (mLinkUp == up) return false; + boolean updateLinkState(final boolean up, + @Nullable final IInternalNetworkManagementListener listener) { + if (mLinkUp == up) { + EthernetNetworkFactory.maybeSendNetworkManagementCallback(listener, null, + new InternalNetworkManagementException( + "No changes with requested link state " + up + " for " + name)); + return false; + } mLinkUp = up; if (!up) { // was up, goes down + // Save an instance of the current network to use with the callback before stop(). + final Network network = mNetworkAgent != null ? mNetworkAgent.getNetwork() : null; + // Send an abort on a provisioning request callback if necessary before stopping. maybeSendNetworkManagementCallbackForAbort(); stop(); + // If only setting the interface down, send a callback to signal completion. + EthernetNetworkFactory.maybeSendNetworkManagementCallback(listener, network, null); } else { // was down, goes up stop(); - start(); + start(listener); } return true; diff --git a/java/com/android/server/ethernet/EthernetServiceImpl.java b/java/com/android/server/ethernet/EthernetServiceImpl.java index b284477..6f6a04a 100644 --- a/java/com/android/server/ethernet/EthernetServiceImpl.java +++ b/java/com/android/server/ethernet/EthernetServiceImpl.java @@ -243,6 +243,7 @@ public class EthernetServiceImpl extends IEthernetManager.Stub { @Nullable final IInternalNetworkManagementListener listener) { Log.i(TAG, "connectNetwork called with: iface=" + iface + ", listener=" + listener); validateNetworkManagementState(iface, "connectNetwork()"); + mTracker.connectNetwork(iface, listener); } @Override @@ -250,5 +251,6 @@ public class EthernetServiceImpl extends IEthernetManager.Stub { @Nullable final IInternalNetworkManagementListener listener) { Log.i(TAG, "disconnectNetwork called with: iface=" + iface + ", listener=" + listener); validateNetworkManagementState(iface, "disconnectNetwork()"); + mTracker.disconnectNetwork(iface, listener); } } diff --git a/java/com/android/server/ethernet/EthernetTracker.java b/java/com/android/server/ethernet/EthernetTracker.java index 53af955..9784512 100644 --- a/java/com/android/server/ethernet/EthernetTracker.java +++ b/java/com/android/server/ethernet/EthernetTracker.java @@ -190,6 +190,18 @@ public class EthernetTracker { mFactory.updateInterface(iface, ipConfig, capabilities, listener)); } + @VisibleForTesting(visibility = PACKAGE) + protected void connectNetwork(@NonNull final String iface, + @Nullable final IInternalNetworkManagementListener listener) { + mHandler.post(() -> updateInterfaceState(iface, true, listener)); + } + + @VisibleForTesting(visibility = PACKAGE) + protected void disconnectNetwork(@NonNull final String iface, + @Nullable final IInternalNetworkManagementListener listener) { + mHandler.post(() -> updateInterfaceState(iface, false, listener)); + } + IpConfiguration getIpConfiguration(String iface) { return mIpConfigurations.get(iface); } @@ -354,9 +366,14 @@ public class EthernetTracker { } private void updateInterfaceState(String iface, boolean up) { + updateInterfaceState(iface, up, null /* listener */); + } + + private void updateInterfaceState(@NonNull final String iface, final boolean up, + @Nullable final IInternalNetworkManagementListener listener) { final int mode = getInterfaceMode(iface); final boolean factoryLinkStateUpdated = (mode == INTERFACE_MODE_CLIENT) - && mFactory.updateInterfaceLinkState(iface, up); + && mFactory.updateInterfaceLinkState(iface, up, listener); if (factoryLinkStateUpdated) { boolean restricted = isRestrictedInterface(iface); |