Implementation of Eth Connect & Disconnect Network

Implementation of EthernetService APIs for ConnectNetwork() and
DisconnectNetwork().

Bug: 210485380
Test: atest EthernetServiceTests
Change-Id: I4c3e361d052206cb28b97fc439bfeac8e7e0fec0
This commit is contained in:
James Mattis
2022-01-20 16:25:05 -08:00
parent 724a0aea08
commit 9b9952ebe1
6 changed files with 163 additions and 41 deletions

View File

@@ -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;

View File

@@ -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);
}
}

View File

@@ -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);