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:
@@ -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;
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user