[Thread] fix the issue that border routing is not available after
ot-daemon restarts
This CL tries to fix issue by removing error-prone shortcircuit checks.
The checks skip configuring the ot-daemon if they think the new state
is equal to the old state. However, the old state mainainted in
ThreadNetworkControllerService may be stale which causes issues.
Bug: 372592886
Test: atest ThreadNetworkIntegrationTests
Change-Id: Icab25cf094f8bf33832b4097ab8ee77b54badc6b
diff --git a/thread/service/java/com/android/server/thread/ThreadNetworkControllerService.java b/thread/service/java/com/android/server/thread/ThreadNetworkControllerService.java
index 3d854d7..fb541e6 100644
--- a/thread/service/java/com/android/server/thread/ThreadNetworkControllerService.java
+++ b/thread/service/java/com/android/server/thread/ThreadNetworkControllerService.java
@@ -764,19 +764,17 @@
+ ", localNetworkInfo: "
+ localNetworkInfo
+ "}");
- if (localNetworkInfo.getUpstreamNetwork() == null) {
+ mUpstreamNetwork = localNetworkInfo.getUpstreamNetwork();
+ if (mUpstreamNetwork == null) {
setInfraLinkState(newInfraLinkStateBuilder().build());
return;
}
- if (!localNetworkInfo.getUpstreamNetwork().equals(mUpstreamNetwork)) {
- mUpstreamNetwork = localNetworkInfo.getUpstreamNetwork();
- if (mNetworkToLinkProperties.containsKey(mUpstreamNetwork)) {
- setInfraLinkState(
- newInfraLinkStateBuilder(mNetworkToLinkProperties.get(mUpstreamNetwork))
- .build());
- }
- mNsdPublisher.setNetworkForHostResolution(mUpstreamNetwork);
+ if (mNetworkToLinkProperties.containsKey(mUpstreamNetwork)) {
+ setInfraLinkState(
+ newInfraLinkStateBuilder(mNetworkToLinkProperties.get(mUpstreamNetwork))
+ .build());
}
+ mNsdPublisher.setNetworkForHostResolution(mUpstreamNetwork);
}
}
@@ -1308,20 +1306,15 @@
}
private void setInfraLinkState(InfraLinkState newInfraLinkState) {
- if (mInfraLinkState.equals(newInfraLinkState)) {
- return;
+ if (!Objects.equals(mInfraLinkState, newInfraLinkState)) {
+ LOG.i("Infra link state changed: " + mInfraLinkState + " -> " + newInfraLinkState);
}
- LOG.i("Infra link state changed: " + mInfraLinkState + " -> " + newInfraLinkState);
-
setInfraLinkInterfaceName(newInfraLinkState.interfaceName);
setInfraLinkNat64Prefix(newInfraLinkState.nat64Prefix);
mInfraLinkState = newInfraLinkState;
}
private void setInfraLinkInterfaceName(String newInfraLinkInterfaceName) {
- if (Objects.equals(mInfraLinkState.interfaceName, newInfraLinkInterfaceName)) {
- return;
- }
ParcelFileDescriptor infraIcmp6Socket = null;
if (newInfraLinkInterfaceName != null) {
try {
@@ -1342,9 +1335,6 @@
}
private void setInfraLinkNat64Prefix(@Nullable String newNat64Prefix) {
- if (Objects.equals(mInfraLinkState.nat64Prefix, newNat64Prefix)) {
- return;
- }
try {
getOtDaemon()
.setInfraLinkNat64Prefix(
diff --git a/thread/tests/integration/src/android/net/thread/BorderRoutingTest.java b/thread/tests/integration/src/android/net/thread/BorderRoutingTest.java
index 4a8462d8..3539331 100644
--- a/thread/tests/integration/src/android/net/thread/BorderRoutingTest.java
+++ b/thread/tests/integration/src/android/net/thread/BorderRoutingTest.java
@@ -29,6 +29,7 @@
import static android.net.thread.utils.IntegrationTestUtils.newPacketReader;
import static android.net.thread.utils.IntegrationTestUtils.pollForPacket;
import static android.net.thread.utils.IntegrationTestUtils.sendUdpMessage;
+import static android.net.thread.utils.IntegrationTestUtils.stopOtDaemon;
import static android.net.thread.utils.IntegrationTestUtils.waitFor;
import static android.system.OsConstants.ICMP_ECHO;
@@ -46,7 +47,6 @@
import static java.util.Objects.requireNonNull;
import android.content.Context;
-import android.net.InetAddresses;
import android.net.IpPrefix;
import android.net.LinkAddress;
import android.net.LinkProperties;
@@ -274,6 +274,28 @@
}
@Test
+ public void unicastRouting_otDaemonRestarts_borderRoutingWorks() throws Exception {
+ /*
+ * <pre>
+ * Topology:
+ * infra network Thread
+ * infra device -------------------- Border Router -------------- Full Thread device
+ * (Cuttlefish)
+ * </pre>
+ */
+
+ FullThreadDevice ftd = mFtds.get(0);
+ joinNetworkAndWaitForOmr(ftd, DEFAULT_DATASET);
+
+ stopOtDaemon();
+ ftd.waitForStateAnyOf(List.of("leader", "router", "child"), Duration.ofSeconds(40));
+
+ startInfraDeviceAndWaitForOnLinkAddr();
+ mInfraDevice.sendEchoRequest(ftd.getOmrAddress());
+ assertNotNull(pollForIcmpPacketOnInfraNetwork(ICMPV6_ECHO_REPLY_TYPE, ftd.getOmrAddress()));
+ }
+
+ @Test
@RequiresIpv6MulticastRouting
public void multicastRouting_ftdSubscribedMulticastAddress_infraLinkJoinsMulticastGroup()
throws Exception {
diff --git a/thread/tests/integration/src/android/net/thread/utils/IntegrationTestUtils.kt b/thread/tests/integration/src/android/net/thread/utils/IntegrationTestUtils.kt
index 3df74b0..7f31728 100644
--- a/thread/tests/integration/src/android/net/thread/utils/IntegrationTestUtils.kt
+++ b/thread/tests/integration/src/android/net/thread/utils/IntegrationTestUtils.kt
@@ -601,4 +601,12 @@
fun tearDownInfraNetwork(testNetworkTracker: TestNetworkTracker) {
runAsShell(MANAGE_TEST_NETWORKS) { testNetworkTracker.teardown() }
}
+
+ /**
+ * Stop the ot-daemon by shell command.
+ */
+ @JvmStatic
+ fun stopOtDaemon() {
+ runShellCommandOrThrow("stop ot-daemon")
+ }
}