diff options
6 files changed, 50 insertions, 15 deletions
diff --git a/src/android/aidl/com/android/server/thread/openthread/IOtDaemon.aidl b/src/android/aidl/com/android/server/thread/openthread/IOtDaemon.aidl index 7a4df4eb..d07f72a5 100644 --- a/src/android/aidl/com/android/server/thread/openthread/IOtDaemon.aidl +++ b/src/android/aidl/com/android/server/thread/openthread/IOtDaemon.aidl @@ -94,13 +94,15 @@ oneway interface IOtDaemon { * @param meshcopTxts the MeshCoP TXT values set by the system_server to override the default * ones * @param callback the callback for receiving OtDaemonState changes + * @param countryCode 2 bytes country code (as defined in ISO 3166) to set */ void initialize( in ParcelFileDescriptor tunFd, in boolean enabled, in INsdPublisher nsdPublisher, in MeshcopTxtAttributes meshcopTxts, - in IOtDaemonCallback callback); + in IOtDaemonCallback callback, + in String countryCode); /** Terminates the ot-daemon process. */ void terminate(); @@ -158,7 +160,7 @@ oneway interface IOtDaemon { /** * Sets the country code. * - * @param countryCode 2 byte country code (as defined in ISO 3166) to set. + * @param countryCode 2 bytes country code (as defined in ISO 3166) to set. * @param receiver the receiver to receive result of this operation */ oneway void setCountryCode(in String countryCode, in IOtStatusReceiver receiver); diff --git a/src/android/java/com/android/server/thread/openthread/testing/FakeOtDaemon.java b/src/android/java/com/android/server/thread/openthread/testing/FakeOtDaemon.java index be093fb3..ce50eba9 100644 --- a/src/android/java/com/android/server/thread/openthread/testing/FakeOtDaemon.java +++ b/src/android/java/com/android/server/thread/openthread/testing/FakeOtDaemon.java @@ -84,6 +84,7 @@ public final class FakeOtDaemon extends IOtDaemon.Stub { @Nullable private IOtDaemonCallback mCallback; @Nullable private Long mCallbackListenerId; @Nullable private RemoteException mJoinException; + @Nullable private String mCountryCode; public FakeOtDaemon(Handler handler) { mHandler = handler; @@ -145,12 +146,14 @@ public final class FakeOtDaemon extends IOtDaemon.Stub { boolean enabled, INsdPublisher nsdPublisher, MeshcopTxtAttributes overriddenMeshcopTxts, - IOtDaemonCallback callback) + IOtDaemonCallback callback, + String countryCode) throws RemoteException { mIsInitialized = true; mTunFd = tunFd; mThreadEnabled = enabled ? OT_STATE_ENABLED : OT_STATE_DISABLED; mNsdPublisher = nsdPublisher; + mCountryCode = countryCode; mOverriddenMeshcopTxts = new MeshcopTxtAttributes(); mOverriddenMeshcopTxts.vendorOui = overriddenMeshcopTxts.vendorOui.clone(); @@ -249,6 +252,15 @@ public final class FakeOtDaemon extends IOtDaemon.Stub { return mCallback; } + /** + * Returns the country code sent to OT daemon or {@code null} if {@link #initialize} is never + * called. + */ + @Nullable + public String getCountryCode() { + return mCountryCode; + } + @Override public void join(byte[] activeDataset, IOtStatusReceiver receiver) throws RemoteException { if (mJoinException != null) { diff --git a/src/android/otdaemon_server.cpp b/src/android/otdaemon_server.cpp index ac64e21a..9ffeb7bf 100644 --- a/src/android/otdaemon_server.cpp +++ b/src/android/otdaemon_server.cpp @@ -384,7 +384,8 @@ Status OtDaemonServer::initialize(const ScopedFileDescriptor &aTun const bool enabled, const std::shared_ptr<INsdPublisher> &aINsdPublisher, const MeshcopTxtAttributes &aMeshcopTxts, - const std::shared_ptr<IOtDaemonCallback> &aCallback) + const std::shared_ptr<IOtDaemonCallback> &aCallback, + const std::string &aCountryCode) { otbrLogInfo("OT daemon is initialized by system server (tunFd=%d, enabled=%s)", aTunFd.get(), enabled ? "true" : "false"); @@ -396,8 +397,8 @@ Status OtDaemonServer::initialize(const ScopedFileDescriptor &aTun mINsdPublisher = aINsdPublisher; mMeshcopTxts = aMeshcopTxts; - mTaskRunner.Post([enabled, aINsdPublisher, aMeshcopTxts, aCallback, this]() { - initializeInternal(enabled, mINsdPublisher, mMeshcopTxts, aCallback); + mTaskRunner.Post([enabled, aINsdPublisher, aMeshcopTxts, aCallback, aCountryCode, this]() { + initializeInternal(enabled, mINsdPublisher, mMeshcopTxts, aCallback, aCountryCode); }); return Status::ok(); @@ -406,10 +407,12 @@ Status OtDaemonServer::initialize(const ScopedFileDescriptor &aTun void OtDaemonServer::initializeInternal(const bool enabled, const std::shared_ptr<INsdPublisher> &aINsdPublisher, const MeshcopTxtAttributes &aMeshcopTxts, - const std::shared_ptr<IOtDaemonCallback> &aCallback) + const std::shared_ptr<IOtDaemonCallback> &aCallback, + const std::string &aCountryCode) { std::string instanceName = aMeshcopTxts.vendorName + " " + aMeshcopTxts.modelName; + setCountryCodeInternal(aCountryCode, nullptr /* aReceiver */); registerStateCallbackInternal(aCallback, -1 /* listenerId */); mMdnsPublisher.SetINsdPublisher(aINsdPublisher); diff --git a/src/android/otdaemon_server.hpp b/src/android/otdaemon_server.hpp index b24129c1..81249523 100644 --- a/src/android/otdaemon_server.hpp +++ b/src/android/otdaemon_server.hpp @@ -97,11 +97,13 @@ private: const bool enabled, const std::shared_ptr<INsdPublisher> &aNsdPublisher, const MeshcopTxtAttributes &aMeshcopTxts, - const std::shared_ptr<IOtDaemonCallback> &aCallback) override; + const std::shared_ptr<IOtDaemonCallback> &aCallback, + const std::string &aCountryCode) override; void initializeInternal(const bool enabled, const std::shared_ptr<INsdPublisher> &aINsdPublisher, const MeshcopTxtAttributes &aMeshcopTxts, - const std::shared_ptr<IOtDaemonCallback> &aCallback); + const std::shared_ptr<IOtDaemonCallback> &aCallback, + const std::string &aCountryCode); Status terminate(void) override; Status setThreadEnabled(const bool enabled, const std::shared_ptr<IOtStatusReceiver> &aReceiver) override; void setThreadEnabledInternal(const bool enabled, const std::shared_ptr<IOtStatusReceiver> &aReceiver); @@ -171,7 +173,7 @@ private: std::shared_ptr<IOtStatusReceiver> mMigrationReceiver; std::vector<LeaveCallback> mLeaveCallbacks; BorderRouterConfigurationParcel mBorderRouterConfiguration; - static constexpr Seconds kTelemetryCheckInterval = Seconds(30); // 30 seconds + static constexpr Seconds kTelemetryCheckInterval = Seconds(600); // 600 seconds static constexpr Seconds kTelemetryUploadIntervalThreshold = Seconds(60 * 60 * 12); // 12 hours }; diff --git a/src/border_agent/border_agent.cpp b/src/border_agent/border_agent.cpp index c2becdef..b6acf18c 100644 --- a/src/border_agent/border_agent.cpp +++ b/src/border_agent/border_agent.cpp @@ -143,6 +143,7 @@ BorderAgent::BorderAgent(otbr::Ncp::ControllerOpenThread &aNcp, Mdns::Publisher , mProductName(OTBR_PRODUCT_NAME) , mBaseServiceInstanceName(OTBR_MESHCOP_SERVICE_INSTANCE_NAME) { + mNcp.AddThreadStateChangedCallback([this](otChangedFlags aFlags) { HandleThreadStateChanged(aFlags); }); } otbrError BorderAgent::SetMeshCopServiceValues(const std::string &aServiceInstanceName, @@ -186,8 +187,6 @@ void BorderAgent::Start(void) { otbrLogInfo("Start Thread Border Agent"); - mNcp.AddThreadStateChangedCallback([this](otChangedFlags aFlags) { HandleThreadStateChanged(aFlags); }); - #if OTBR_ENABLE_DBUS_SERVER mNcp.GetThreadHelper()->SetUpdateMeshCopTxtHandler([this](std::map<std::string, std::vector<uint8_t>> aUpdate) { HandleUpdateVendorMeshCoPTxtEntries(std::move(aUpdate)); diff --git a/tests/android/java/com/android/server/thread/openthread/testing/FakeOtDaemonTest.java b/tests/android/java/com/android/server/thread/openthread/testing/FakeOtDaemonTest.java index eaf02afb..b3758ac1 100644 --- a/tests/android/java/com/android/server/thread/openthread/testing/FakeOtDaemonTest.java +++ b/tests/android/java/com/android/server/thread/openthread/testing/FakeOtDaemonTest.java @@ -100,6 +100,7 @@ public final class FakeOtDaemonTest { private static final byte[] TEST_VENDOR_OUI = new byte[] {(byte) 0xAC, (byte) 0xDE, 0x48}; private static final String TEST_VENDOR_NAME = "test vendor"; private static final String TEST_MODEL_NAME = "test model"; + private static final String TEST_DEFAULT_COUNTRY_CODE = "WW"; private FakeOtDaemon mFakeOtDaemon; private TestLooper mTestLooper; @@ -127,7 +128,12 @@ public final class FakeOtDaemonTest { mOverriddenMeshcopTxts.modelName = TEST_MODEL_NAME; mFakeOtDaemon.initialize( - mMockTunFd, true, mMockNsdPublisher, mOverriddenMeshcopTxts, mMockCallback); + mMockTunFd, + true, + mMockNsdPublisher, + mOverriddenMeshcopTxts, + mMockCallback, + TEST_DEFAULT_COUNTRY_CODE); mTestLooper.dispatchAll(); MeshcopTxtAttributes meshcopTxts = mFakeOtDaemon.getOverriddenMeshcopTxtAttributes(); @@ -139,6 +145,7 @@ public final class FakeOtDaemonTest { assertThat(mFakeOtDaemon.getEnabledState()).isEqualTo(OT_STATE_ENABLED); assertThat(mFakeOtDaemon.getNsdPublisher()).isEqualTo(mMockNsdPublisher); assertThat(mFakeOtDaemon.getStateCallback()).isEqualTo(mMockCallback); + assertThat(mFakeOtDaemon.getCountryCode()).isEqualTo(TEST_DEFAULT_COUNTRY_CODE); assertThat(mFakeOtDaemon.isInitialized()).isTrue(); verify(mMockCallback, times(1)).onStateChanged(any(), anyLong()); verify(mMockCallback, times(1)).onBackboneRouterStateChanged(any()); @@ -147,7 +154,12 @@ public final class FakeOtDaemonTest { @Test public void registerStateCallback_noStateChange_callbackIsInvoked() throws Exception { mFakeOtDaemon.initialize( - mMockTunFd, true, mMockNsdPublisher, mOverriddenMeshcopTxts, mMockCallback); + mMockTunFd, + true, + mMockNsdPublisher, + mOverriddenMeshcopTxts, + mMockCallback, + TEST_DEFAULT_COUNTRY_CODE); final AtomicReference<OtDaemonState> stateRef = new AtomicReference<>(); final AtomicLong listenerIdRef = new AtomicLong(); final AtomicReference<BackboneRouterState> bbrStateRef = new AtomicReference<>(); @@ -316,7 +328,12 @@ public final class FakeOtDaemonTest { DeathRecipient mockDeathRecipient = mock(DeathRecipient.class); mFakeOtDaemon.linkToDeath(mockDeathRecipient, 0); mFakeOtDaemon.initialize( - mMockTunFd, true, mMockNsdPublisher, mOverriddenMeshcopTxts, mMockCallback); + mMockTunFd, + true, + mMockNsdPublisher, + mOverriddenMeshcopTxts, + mMockCallback, + TEST_DEFAULT_COUNTRY_CODE); mFakeOtDaemon.terminate(); mTestLooper.dispatchAll(); |