Snap for 11383711 from 6d5f59e91dd0ba8f0f658ede6e543cb3ffe11fc1 to mainline-cellbroadcast-release

Change-Id: I65780e714c29ce345e3f7a4910436307a746455b
diff --git a/Android.bp b/Android.bp
index 30edee7..f3cc85a 100644
--- a/Android.bp
+++ b/Android.bp
@@ -603,7 +603,6 @@
 
 cc_binary {
     name: "ot-ctl",
-    vendor: true,
     defaults: ["ot_posix_cflags_defaults"],
     generated_headers: ["ot_version_header"],
 
diff --git a/src/android/openthread-android-config.h b/src/android/openthread-android-config.h
index a5d4dc2..5ac3fc8 100644
--- a/src/android/openthread-android-config.h
+++ b/src/android/openthread-android-config.h
@@ -63,16 +63,9 @@
 #define OPENTHREAD_CONFIG_PLATFORM_UDP_ENABLE 0
 
 /**
- * Disables the DAEMON_CLI feature because the Android build system default is built with "Release"
- * type all build buid variants (user, userdebug and eng), but we want to disable CLI for OT daemon
- * in product.
- *
- * This flag will be overriden in "product_variables.debuggable.cflags" to enable CLI in userdebug
- * or eng build, see "ot-daemon-debuggable-cc-defaults".
+ * Enables CLI for Thread certification.
  */
-#ifndef OPENTHREAD_POSIX_CONFIG_DAEMON_CLI_ENABLE
-#define OPENTHREAD_POSIX_CONFIG_DAEMON_CLI_ENABLE 0
-#endif
+#define OPENTHREAD_POSIX_CONFIG_DAEMON_CLI_ENABLE 1
 
 /**
  * @def OPENTHREAD_POSIX_CONFIG_THREAD_NETIF_DEFAULT_NAME
diff --git a/src/android/openthread-core-android-config.h b/src/android/openthread-core-android-config.h
index 28d669d..5cbcfb5 100644
--- a/src/android/openthread-core-android-config.h
+++ b/src/android/openthread-core-android-config.h
@@ -43,7 +43,7 @@
  * The run time data path.
  *
  */
-#define OPENTHREAD_CONFIG_POSIX_SETTINGS_PATH "/data/misc/threadnetwork"
+#define OPENTHREAD_CONFIG_POSIX_SETTINGS_PATH "/data/misc/apexdata/com.android.tethering/ot-daemon"
 
 /**
  * @def OPENTHREAD_POSIX_CONFIG_DAEMON_SOCKET_BASENAME
@@ -51,7 +51,7 @@
  * Define socket basename used by POSIX app daemon.
  *
  */
-#define OPENTHREAD_POSIX_CONFIG_DAEMON_SOCKET_BASENAME "/data/misc/threadnetwork/openthread-%s"
+#define OPENTHREAD_POSIX_CONFIG_DAEMON_SOCKET_BASENAME "/dev/socket/ot-daemon/%s"
 
 /**
  * @def OPENTHREAD_POSIX_CONFIG_RCP_PTY_ENABLE
@@ -274,6 +274,7 @@
 #define OPENTHREAD_CONFIG_UDP_FORWARD_ENABLE 0
 
 #define OPENTHREAD_CONFIG_BORDER_AGENT_ENABLE 1
+#define OPENTHREAD_CONFIG_BORDER_AGENT_ID_ENABLE 1
 #define OPENTHREAD_CONFIG_BORDER_ROUTER_ENABLE 1
 #define OPENTHREAD_CONFIG_BORDER_ROUTING_ENABLE 1
 #define OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE 1
diff --git a/src/android/thread_network_hal/hal_interface.cpp b/src/android/thread_network_hal/hal_interface.cpp
index f1de827..f8553bb 100644
--- a/src/android/thread_network_hal/hal_interface.cpp
+++ b/src/android/thread_network_hal/hal_interface.cpp
@@ -146,11 +146,7 @@
     return kBusSpeed;
 }
 
-otError HalInterface::HardwareReset(void)
-{
-    mThreadChip->hardwareReset();
-    return OT_ERROR_NONE;
-}
+otError HalInterface::HardwareReset(void) { return StatusToError(mThreadChip->hardwareReset()); }
 
 void HalInterface::UpdateFdSet(void *aMainloopContext)
 {
@@ -270,7 +266,7 @@
     return;
 }
 
-otError HalInterface::StatusToError(ScopedAStatus &aStatus)
+otError HalInterface::StatusToError(const ScopedAStatus &aStatus) const
 {
     otError error = OT_ERROR_FAILED;
 
diff --git a/src/android/thread_network_hal/hal_interface.hpp b/src/android/thread_network_hal/hal_interface.hpp
index ef72d05..c3e9aed 100644
--- a/src/android/thread_network_hal/hal_interface.hpp
+++ b/src/android/thread_network_hal/hal_interface.hpp
@@ -164,7 +164,7 @@
 private:
     void        ReceiveFrameCallback(const std::vector<uint8_t> &aFrame);
     static void BinderDeathCallback(void *aContext);
-    otError     StatusToError(::ndk::ScopedAStatus &aStatus);
+    otError     StatusToError(const ::ndk::ScopedAStatus &aStatus) const;
 
     class ThreadChipCallback : public ::aidl::android::hardware::threadnetwork::BnThreadChipCallback
     {
diff --git a/src/posix/platform/daemon.cpp b/src/posix/platform/daemon.cpp
index 5a85b15..403b297 100644
--- a/src/posix/platform/daemon.cpp
+++ b/src/posix/platform/daemon.cpp
@@ -28,6 +28,9 @@
 
 #include "posix/platform/daemon.hpp"
 
+#if defined(__ANDROID__) && !OPENTHREAD_CONFIG_ANDROID_NDK_ENABLE
+#include <cutils/sockets.h>
+#endif
 #include <fcntl.h>
 #include <signal.h>
 #include <stdarg.h>
@@ -169,10 +172,28 @@
     }
 }
 
-void Daemon::SetUp(void)
+#if defined(__ANDROID__) && !OPENTHREAD_CONFIG_ANDROID_NDK_ENABLE
+void Daemon::createListenSocketOrDie(void)
+{
+    Filename socketFile;
+
+    // Don't use OPENTHREAD_POSIX_DAEMON_SOCKET_NAME because android_get_control_socket
+    // below already assumes parent /dev/socket dir
+    GetFilename(socketFile, "ot-daemon/%s.sock");
+
+    // This returns the init-managed stream socket which is already bind to
+    // /dev/socket/ot-daemon/<interface-name>.sock
+    mListenSocket = android_get_control_socket(socketFile);
+    if (mListenSocket == -1)
+    {
+        DieNowWithMessage("android_get_control_socket", OT_EXIT_ERROR_ERRNO);
+    }
+}
+#else
+void Daemon::createListenSocketOrDie(void)
 {
     struct sockaddr_un sockname;
-    int                ret;
+    int ret;
 
     class AllowAllGuard
     {
@@ -180,7 +201,7 @@
         AllowAllGuard(void)
         {
             const char *allowAll = getenv("OT_DAEMON_ALLOW_ALL");
-            mAllowAll            = (allowAll != nullptr && strcmp("1", allowAll) == 0);
+            mAllowAll = (allowAll != nullptr && strcmp("1", allowAll) == 0);
 
             if (mAllowAll)
             {
@@ -196,13 +217,10 @@
         }
 
     private:
-        bool   mAllowAll = false;
-        mode_t mMode     = 0;
+        bool mAllowAll = false;
+        mode_t mMode = 0;
     };
 
-    // This allows implementing pseudo reset.
-    VerifyOrExit(mListenSocket == -1);
-
     mListenSocket = SocketWithCloseExec(AF_UNIX, SOCK_STREAM, 0, kSocketNonBlock);
 
     if (mListenSocket == -1)
@@ -246,6 +264,16 @@
     {
         DieNowWithMessage("bind", OT_EXIT_ERROR_ERRNO);
     }
+}
+#endif // defined(__ANDROID__) && !OPENTHREAD_CONFIG_ANDROID_NDK_ENABLE
+
+void Daemon::SetUp(void)
+{
+    int ret;
+
+    // This allows implementing pseudo reset.
+    VerifyOrExit(mListenSocket == -1);
+    createListenSocketOrDie();
 
     //
     // only accept 1 connection.
@@ -281,6 +309,8 @@
         mSessionSocket = -1;
     }
 
+#if !defined(__ANDROID__) || OPENTHREAD_CONFIG_ANDROID_NDK_ENABLE
+    // The `mListenSocket` is managed by `init` on Android
     if (mListenSocket != -1)
     {
         close(mListenSocket);
@@ -302,6 +332,7 @@
         close(mDaemonLock);
         mDaemonLock = -1;
     }
+#endif
 }
 
 void Daemon::Update(otSysMainloopContext &aContext)
diff --git a/src/posix/platform/daemon.hpp b/src/posix/platform/daemon.hpp
index 4fdd3b3..deba85b 100644
--- a/src/posix/platform/daemon.hpp
+++ b/src/posix/platform/daemon.hpp
@@ -49,6 +49,7 @@
 private:
     int  OutputFormat(const char *aFormat, ...);
     int  OutputFormatV(const char *aFormat, va_list aArguments);
+    void createListenSocketOrDie(void);
     void InitializeSessionSocket(void);
 
     int mListenSocket  = -1;