Handle neighbor lost event

Neighbor lost event is received when gateway is not reachable.
Ethernet Factory currently doesn't handle the neighbor lost event and
network will not be brought down. This results in loss of
connectivity even if there are other networks like WiFi.

Restart NetworkInterfaceState when neighbor lost event is
received. If there is a better network like WiFi, it will become
default and apps will be able to use internet. If ethernet gets
connected again, and has backhaul connectivity, it will become
default.

Bug: 180077540
Tests: Builds, Boots, EthernetServiceTests
Change-Id: I26d720994ecb35f6529358a53e115091e7817c2f
This commit is contained in:
Pavan Kumar M
2021-02-08 21:17:20 +05:30
parent ed18ef9f85
commit e600bef8f9
2 changed files with 32 additions and 0 deletions

View File

@@ -346,6 +346,11 @@ public class EthernetNetworkFactory extends NetworkFactory {
mHandler.post(() -> updateLinkProperties(newLp));
}
@Override
public void onReachabilityLost(String logMsg) {
mHandler.post(() -> updateNeighborLostEvent(logMsg));
}
@Override
public void onQuit() {
mIpClient = null;
@@ -479,6 +484,17 @@ public class EthernetNetworkFactory extends NetworkFactory {
}
}
void updateNeighborLostEvent(String logMsg) {
Log.i(TAG, "updateNeighborLostEvent " + logMsg);
// Reachability lost will be seen only if the gateway is not reachable.
// Since ethernet FW doesn't have the mechanism to scan for new networks
// like WiFi, simply restart.
// If there is a better network, that will become default and apps
// will be able to use internet. If ethernet gets connected again,
// and has backhaul connectivity, it will become default.
restart();
}
/** Returns true if state has been modified */
boolean updateLinkState(boolean up) {
if (mLinkUp == up) return false;

View File

@@ -434,4 +434,20 @@ public class EthernetNetworkFactoryTest {
ConnectivityManager.TYPE_NONE);
mNetFactory.removeInterface(iface);
}
@Test
public void testReachabilityLoss() throws Exception {
String iface = "eth0";
createAndVerifyProvisionedInterface(iface);
mIpClientCallbacks.onReachabilityLost("ReachabilityLost");
mLooper.dispatchAll();
// Reachability loss should trigger a stop and start, since the interface is still there
verify(mIpClient).shutdown();
verify(mNetworkAgent).unregister();
verify(mDeps).makeIpClient(any(Context.class), anyString(), any());
verify(mIpClient).startProvisioning(any());
}
}