[meta-networking,v3,1/4] ot-br-posix: add recipe for an OpenThread Border Router

Message ID 20220407191438.3696227-1-stefan@datenfreihafen.org
State New
Headers show
Series [meta-networking,v3,1/4] ot-br-posix: add recipe for an OpenThread Border Router | expand

Commit Message

Stefan Schmidt April 7, 2022, 7:14 p.m. UTC
From: Stefan Schmidt <stefan.schmidt@huawei.com>

The OpenThread project is an open source implementation of the Thread
low-power mesh network protocol. In a Thread network devices can have
different roles, and of of these roles is a Border Router that allows a
Thread network to be connected with other IP networks.

Ot-br-posix runs as a systemd service on a standard Linux system to
handle the connection to a Thread network.

In terms of patches we need a fix to allow building on musl + clang
(CMSG_NXTHDR macro triggers a -Wsign-compare warning) and a systemd
unit file change is OE specific and avoids having service dependencies
implemented as pre exec hooks.

Signed-off-by: Stefan Schmidt <stefan.schmidt@huawei.com>
---
v3:
- Dropped the musl include fixed which was merged upstream and we bumped the
  version
- Version bump also fixed a C++ deprecated-copy error I saw
- Included new patch to fix CMSG_NXTHDR macro usage on musl+clang

 ...ce.in-remove-pre-exec-hook-for-mdns-.patch |  35 +++++
 .../Turn-off-sign-compare-for-musl-libc.patch | 131 ++++++++++++++++++
 .../openthread/ot-br-posix_git.bb             |  59 ++++++++
 3 files changed, 225 insertions(+)
 create mode 100644 meta-networking/recipes-connectivity/openthread/ot-br-posix/0001-otbr-agent.service.in-remove-pre-exec-hook-for-mdns-.patch
 create mode 100644 meta-networking/recipes-connectivity/openthread/ot-br-posix/Turn-off-sign-compare-for-musl-libc.patch
 create mode 100644 meta-networking/recipes-connectivity/openthread/ot-br-posix_git.bb

Comments

Khem Raj April 12, 2022, 1:56 p.m. UTC | #1
this fails with gcc ( especially with gcc12 )

https://errors.yoctoproject.org/Errors/Details/654559/

On Thu, Apr 7, 2022 at 12:15 PM Stefan Schmidt
<stefan@datenfreihafen.org> wrote:
>
> From: Stefan Schmidt <stefan.schmidt@huawei.com>
>
> The OpenThread project is an open source implementation of the Thread
> low-power mesh network protocol. In a Thread network devices can have
> different roles, and of of these roles is a Border Router that allows a
> Thread network to be connected with other IP networks.
>
> Ot-br-posix runs as a systemd service on a standard Linux system to
> handle the connection to a Thread network.
>
> In terms of patches we need a fix to allow building on musl + clang
> (CMSG_NXTHDR macro triggers a -Wsign-compare warning) and a systemd
> unit file change is OE specific and avoids having service dependencies
> implemented as pre exec hooks.
>
> Signed-off-by: Stefan Schmidt <stefan.schmidt@huawei.com>
> ---
> v3:
> - Dropped the musl include fixed which was merged upstream and we bumped the
>   version
> - Version bump also fixed a C++ deprecated-copy error I saw
> - Included new patch to fix CMSG_NXTHDR macro usage on musl+clang
>
>  ...ce.in-remove-pre-exec-hook-for-mdns-.patch |  35 +++++
>  .../Turn-off-sign-compare-for-musl-libc.patch | 131 ++++++++++++++++++
>  .../openthread/ot-br-posix_git.bb             |  59 ++++++++
>  3 files changed, 225 insertions(+)
>  create mode 100644 meta-networking/recipes-connectivity/openthread/ot-br-posix/0001-otbr-agent.service.in-remove-pre-exec-hook-for-mdns-.patch
>  create mode 100644 meta-networking/recipes-connectivity/openthread/ot-br-posix/Turn-off-sign-compare-for-musl-libc.patch
>  create mode 100644 meta-networking/recipes-connectivity/openthread/ot-br-posix_git.bb
>
> diff --git a/meta-networking/recipes-connectivity/openthread/ot-br-posix/0001-otbr-agent.service.in-remove-pre-exec-hook-for-mdns-.patch b/meta-networking/recipes-connectivity/openthread/ot-br-posix/0001-otbr-agent.service.in-remove-pre-exec-hook-for-mdns-.patch
> new file mode 100644
> index 000000000..250de4bdd
> --- /dev/null
> +++ b/meta-networking/recipes-connectivity/openthread/ot-br-posix/0001-otbr-agent.service.in-remove-pre-exec-hook-for-mdns-.patch
> @@ -0,0 +1,35 @@
> +From ed60d4605b81c43b9ba9504a37835109c247c6f8 Mon Sep 17 00:00:00 2001
> +From: Stefan Schmidt <stefan.schmidt@huawei.com>
> +Date: Fri, 1 Apr 2022 21:46:03 +0200
> +Subject: [PATCH] otbr-agent.service.in: remove pre exec hook for mdns service
> +
> +It uses the service command which is not available in all cases under
> +Yocto/OE. The upstream project uses this mainly with Ubuntu and Raspian
> +as testbeds.
> +
> +In our case we simply ensure that avahi-daemon is installed on the
> +system inside the recipe.
> +
> +Upstream-Status: Inappropriate [OE specific]
> +
> +Signed-off-by: Stefan Schmidt <stefan.schmidt@huawei.com>
> +---
> + src/agent/otbr-agent.service.in | 2 +-
> + 1 file changed, 1 insertion(+), 1 deletion(-)
> +
> +diff --git a/src/agent/otbr-agent.service.in b/src/agent/otbr-agent.service.in
> +index 8314121347..4c97869def 100644
> +--- a/src/agent/otbr-agent.service.in
> ++++ b/src/agent/otbr-agent.service.in
> +@@ -6,7 +6,7 @@ After=dbus.socket
> +
> + [Service]
> + EnvironmentFile=-@CMAKE_INSTALL_FULL_SYSCONFDIR@/default/otbr-agent
> +-@EXEC_START_PRE@ExecStart=@CMAKE_INSTALL_FULL_SBINDIR@/otbr-agent $OTBR_AGENT_OPTS
> ++ExecStart=@CMAKE_INSTALL_FULL_SBINDIR@/otbr-agent $OTBR_AGENT_OPTS
> + KillMode=mixed
> + Restart=on-failure
> + RestartSec=5
> +--
> +2.35.1
> +
> diff --git a/meta-networking/recipes-connectivity/openthread/ot-br-posix/Turn-off-sign-compare-for-musl-libc.patch b/meta-networking/recipes-connectivity/openthread/ot-br-posix/Turn-off-sign-compare-for-musl-libc.patch
> new file mode 100644
> index 000000000..df84550be
> --- /dev/null
> +++ b/meta-networking/recipes-connectivity/openthread/ot-br-posix/Turn-off-sign-compare-for-musl-libc.patch
> @@ -0,0 +1,131 @@
> +From: Stefan Schmidt <stefan.schmidt@huawei.com>
> +Subject: Turn off sign compare for musl libc
> +
> +When building with musl and clang the usage of CMSG_NXTHDR results in
> +sign-compare error. Disable the check only in this specific part of the
> +code with a #pragma.
> +
> +| /home/stefan/huawei/yocto-upstream/yoe/workspace/sources/ot-br-posix/third_party/openthread/repo/src/posix/platform/udp.cpp:147:28: fatal error: comparison of integers of different signs: 'unsigned long' and 'long' [-Wsign-compare]
> +|         cmsg             = CMSG_NXTHDR(&msg, cmsg);
> +|                            ^~~~~~~~~~~~~~~~~~~~~~~
> +| /home/stefan/huawei/yocto-upstream/yoe/build/tmp/work/cortexa57-yoe-linux-musl/ot-br-posix/0.3.0+git999-r0/recipe-sysroot/usr/include/sys/socket.h:358:44: note: expanded from macro 'CMSG_NXTHDR'
> +|         __CMSG_LEN(cmsg) + sizeof(struct cmsghdr) >= __MHDR_END(mhdr) - (unsigned char *)(cmsg) \
> +|         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> +| 1 error generated.
> +
> +Idea and fix taken from
> +recipes-devtools/breakpad/breakpad/0001-Turn-off-sign-compare-for-musl-libc.patch
> +by Khem Raj.
> +
> +Upstream-Status: Inappropriate [OE specific]
> +
> +Signed-off-by: Stefan Schmidt <stefan.schmidt@huawei.com>
> +
> +diff --git a/src/backbone_router/nd_proxy.cpp b/src/backbone_router/nd_proxy.cpp
> +index 7136878c3d..8a223c95c7 100644
> +--- a/src/backbone_router/nd_proxy.cpp
> ++++ b/src/backbone_router/nd_proxy.cpp
> +@@ -185,9 +185,18 @@ void NdProxyManager::ProcessMulticastNeighborSolicition()
> +         VerifyOrExit(icmp6header->icmp6_type == ND_NEIGHBOR_SOLICIT, error = OTBR_ERROR_PARSE);
> +
> +         otbrLogDebug("NdProxyManager: Received ND-NS from %s", src.ToString().c_str());
> +-
> ++#ifndef __GLIBC__
> ++  // In musl-libc, CMSG_NXTHDR typecasts char* to cmsghdr* which causes
> ++  // clang to throw sign-compare warning. This is to suppress the warning
> ++  // inline.
> ++  #pragma clang diagnostic push
> ++  #pragma clang diagnostic ignored "-Wsign-compare"
> ++#endif
> +         for (cmsghdr = CMSG_FIRSTHDR(&msghdr); cmsghdr; cmsghdr = CMSG_NXTHDR(&msghdr, cmsghdr))
> +-        {
> ++#ifndef __GLIBC__
> ++  #pragma clang diagnostic pop
> ++#endif
> ++      {
> +             if (cmsghdr->cmsg_level != IPPROTO_IPV6)
> +             {
> +                 continue;
> +Submodule third_party/openthread/repo contains modified content
> +diff --git a/third_party/openthread/repo/src/posix/platform/infra_if.cpp b/third_party/openthread/repo/src/posix/platform/infra_if.cpp
> +index 9f93d2b1c..1ed40fe50 100644
> +--- a/third_party/openthread/repo/src/posix/platform/infra_if.cpp
> ++++ b/third_party/openthread/repo/src/posix/platform/infra_if.cpp
> +@@ -228,7 +228,17 @@ otError InfraNetif::SendIcmp6Nd(uint32_t            aInfraIfIndex,
> +     packetInfo->ipi6_ifindex = mInfraIfIndex;
> +
> +     // Per section 6.1.2 of RFC 4861, we need to send the ICMPv6 message with IP Hop Limit 255.
> ++#ifndef __GLIBC__
> ++  // In musl-libc, CMSG_NXTHDR typecasts char* to cmsghdr* which causes
> ++  // clang to throw sign-compare warning. This is to suppress the warning
> ++  // inline.
> ++  #pragma clang diagnostic push
> ++  #pragma clang diagnostic ignored "-Wsign-compare"
> ++#endif
> +     cmsgPointer             = CMSG_NXTHDR(&msgHeader, cmsgPointer);
> ++#ifndef __GLIBC__
> ++  #pragma clang diagnostic pop
> ++#endif
> +     cmsgPointer->cmsg_level = IPPROTO_IPV6;
> +     cmsgPointer->cmsg_type  = IPV6_HOPLIMIT;
> +     cmsgPointer->cmsg_len   = CMSG_LEN(sizeof(hopLimit));
> +@@ -481,7 +491,17 @@ void InfraNetif::ReceiveIcmp6Message(void)
> +
> +     bufferLength = static_cast<uint16_t>(rval);
> +
> ++#ifndef __GLIBC__
> ++  // In musl-libc, CMSG_NXTHDR typecasts char* to cmsghdr* which causes
> ++  // clang to throw sign-compare warning. This is to suppress the warning
> ++  // inline.
> ++  #pragma clang diagnostic push
> ++  #pragma clang diagnostic ignored "-Wsign-compare"
> ++#endif
> +     for (cmh = CMSG_FIRSTHDR(&msg); cmh; cmh = CMSG_NXTHDR(&msg, cmh))
> ++#ifndef __GLIBC__
> ++  #pragma clang diagnostic pop
> ++#endif
> +     {
> +         if (cmh->cmsg_level == IPPROTO_IPV6 && cmh->cmsg_type == IPV6_PKTINFO &&
> +             cmh->cmsg_len == CMSG_LEN(sizeof(struct in6_pktinfo)))
> +diff --git a/third_party/openthread/repo/src/posix/platform/udp.cpp b/third_party/openthread/repo/src/posix/platform/udp.cpp
> +index b7aacc5fa..a814fea70 100644
> +--- a/third_party/openthread/repo/src/posix/platform/udp.cpp
> ++++ b/third_party/openthread/repo/src/posix/platform/udp.cpp
> +@@ -144,8 +144,18 @@ otError transmitPacket(int aFd, uint8_t *aPayload, uint16_t aLength, const otMes
> +     {
> +         struct in6_pktinfo pktinfo;
> +
> ++#ifndef __GLIBC__
> ++  // In musl-libc, CMSG_NXTHDR typecasts char* to cmsghdr* which causes
> ++  // clang to throw sign-compare warning. This is to suppress the warning
> ++  // inline.
> ++  #pragma clang diagnostic push
> ++  #pragma clang diagnostic ignored "-Wsign-compare"
> ++#endif
> +         cmsg             = CMSG_NXTHDR(&msg, cmsg);
> +-        cmsg->cmsg_level = IPPROTO_IPV6;
> ++#ifndef __GLIBC__
> ++  #pragma clang diagnostic pop
> ++#endif
> ++      cmsg->cmsg_level = IPPROTO_IPV6;
> +         cmsg->cmsg_type  = IPV6_PKTINFO;
> +         cmsg->cmsg_len   = CMSG_LEN(sizeof(pktinfo));
> +
> +@@ -200,7 +210,17 @@ otError receivePacket(int aFd, uint8_t *aPayload, uint16_t &aLength, otMessageIn
> +     VerifyOrExit(rval > 0, perror("recvmsg"));
> +     aLength = static_cast<uint16_t>(rval);
> +
> ++#ifndef __GLIBC__
> ++  // In musl-libc, CMSG_NXTHDR typecasts char* to cmsghdr* which causes
> ++  // clang to throw sign-compare warning. This is to suppress the warning
> ++  // inline.
> ++  #pragma clang diagnostic push
> ++  #pragma clang diagnostic ignored "-Wsign-compare"
> ++#endif
> +     for (struct cmsghdr *cmsg = CMSG_FIRSTHDR(&msg); cmsg != nullptr; cmsg = CMSG_NXTHDR(&msg, cmsg))
> ++#ifndef __GLIBC__
> ++  #pragma clang diagnostic pop
> ++#endif
> +     {
> +         if (cmsg->cmsg_level == IPPROTO_IPV6)
> +         {
> diff --git a/meta-networking/recipes-connectivity/openthread/ot-br-posix_git.bb b/meta-networking/recipes-connectivity/openthread/ot-br-posix_git.bb
> new file mode 100644
> index 000000000..d9f558d79
> --- /dev/null
> +++ b/meta-networking/recipes-connectivity/openthread/ot-br-posix_git.bb
> @@ -0,0 +1,59 @@
> +# SPDX-FileCopyrightText: Huawei Inc.
> +#
> +# SPDX-License-Identifier: Apache-2.0
> +SUMMARY = "OpenThread Border Router"
> +SECTION = "net"
> +LICENSE = "BSD-3-Clause & MIT"
> +LIC_FILES_CHKSUM = "file://LICENSE;md5=87109e44b2fda96a8991f27684a7349c \
> +                    file://third_party/Simple-web-server/repo/LICENSE;md5=852b3f7f320b19f6431487b8b2fb1d74 \
> +                    file://third_party/cJSON/repo/LICENSE;md5=218947f77e8cb8e2fa02918dc41c50d0 \
> +                    file://third_party/http-parser/repo/LICENSE-MIT;md5=9bfa835d048c194ab30487af8d7b3778 \
> +                    file://third_party/openthread/repo/LICENSE;md5=543b6fe90ec5901a683320a36390c65f \
> +                    "
> +DEPENDS = "autoconf-archive dbus readline avahi jsoncpp boost libnetfilter-queue"
> +SRCREV = "ad6822257ffddbac295db97186e4ab449a2ed32a"
> +PV = "0.3.0+git${SRCPV}"
> +
> +SRC_URI = "gitsm://github.com/openthread/ot-br-posix.git;protocol=https;branch=main \
> +           file://0001-otbr-agent.service.in-remove-pre-exec-hook-for-mdns-.patch \
> +           file://Turn-off-sign-compare-for-musl-libc.patch \
> +           "
> +
> +S = "${WORKDIR}/git"
> +SYSTEMD_SERVICE:${PN} = "otbr-agent.service"
> +
> +inherit pkgconfig cmake systemd
> +
> +EXTRA_OECMAKE = "-DBUILD_TESTING=OFF \
> +                 -DOTBR_DBUS=ON \
> +                 -DOTBR_REST=ON \
> +                 -DOTBR_WEB=OFF \
> +                 -DCMAKE_LIBRARY_PATH=${libdir} \
> +                 -DOTBR_MDNS=avahi \
> +                 -DOTBR_BACKBONE_ROUTER=ON \
> +                 -DOTBR_BORDER_ROUTING=ON \
> +                 -DOTBR_SRP_ADVERTISING_PROXY=ON \
> +                 -DOTBR_BORDER_AGENT=ON \
> +                 -DOT_SPINEL_RESET_CONNECTION=ON \
> +                 -DOT_TREL=ON \
> +                 -DOT_MLR=ON \
> +                 -DOT_SRP_SERVER=ON \
> +                 -DOT_ECDSA=ON \
> +                 -DOT_SERVICE=ON \
> +                 -DOTBR_DUA_ROUTING=ON \
> +                 -DOT_DUA=ON \
> +                 -DOT_BORDER_ROUTING_NAT64=ON \
> +                 -DOTBR_DNSSD_DISCOVERY_PROXY=ON \
> +                 -DOTBR_INFRA_IF_NAME=eth0 \
> +                 -DOTBR_NO_AUTO_ATTACH=1 \
> +                 -DOT_REFERENCE_DEVICE=ON \
> +                 -DOT_DHCP6_CLIENT=ON \
> +                 -DOT_DHCP6_SERVER=ON \
> +                 "
> +
> +RDEPENDS:${PN} = "iproute2 avahi-daemon"
> +
> +RCONFLICTS:${PN} = "ot-daemon"
> +
> +FILES:${PN} += "${systemd_unitdir}/*"
> +FILES:${PN} += "${datadir}/*"
> --
> 2.35.1
>
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#96455): https://lists.openembedded.org/g/openembedded-devel/message/96455
> Mute This Topic: https://lists.openembedded.org/mt/90320831/1997914
> Group Owner: openembedded-devel+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-devel/unsub [raj.khem@gmail.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
Stefan Schmidt April 19, 2022, 10:33 a.m. UTC | #2
Hello Khem

On 12.04.22 15:56, Khem Raj wrote:
> this fails with gcc ( especially with gcc12 )
> 
> https://errors.yoctoproject.org/Errors/Details/654559/

I saw you fixed this already while I was enjoying my vacation. Thanks!


I like the CFLAGS override for the specific clang musl case also a lot 
better!

regards
Stefan Schmidt

Patch

diff --git a/meta-networking/recipes-connectivity/openthread/ot-br-posix/0001-otbr-agent.service.in-remove-pre-exec-hook-for-mdns-.patch b/meta-networking/recipes-connectivity/openthread/ot-br-posix/0001-otbr-agent.service.in-remove-pre-exec-hook-for-mdns-.patch
new file mode 100644
index 000000000..250de4bdd
--- /dev/null
+++ b/meta-networking/recipes-connectivity/openthread/ot-br-posix/0001-otbr-agent.service.in-remove-pre-exec-hook-for-mdns-.patch
@@ -0,0 +1,35 @@ 
+From ed60d4605b81c43b9ba9504a37835109c247c6f8 Mon Sep 17 00:00:00 2001
+From: Stefan Schmidt <stefan.schmidt@huawei.com>
+Date: Fri, 1 Apr 2022 21:46:03 +0200
+Subject: [PATCH] otbr-agent.service.in: remove pre exec hook for mdns service
+
+It uses the service command which is not available in all cases under
+Yocto/OE. The upstream project uses this mainly with Ubuntu and Raspian
+as testbeds.
+
+In our case we simply ensure that avahi-daemon is installed on the
+system inside the recipe.
+
+Upstream-Status: Inappropriate [OE specific]
+
+Signed-off-by: Stefan Schmidt <stefan.schmidt@huawei.com>
+---
+ src/agent/otbr-agent.service.in | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/agent/otbr-agent.service.in b/src/agent/otbr-agent.service.in
+index 8314121347..4c97869def 100644
+--- a/src/agent/otbr-agent.service.in
++++ b/src/agent/otbr-agent.service.in
+@@ -6,7 +6,7 @@ After=dbus.socket
+ 
+ [Service]
+ EnvironmentFile=-@CMAKE_INSTALL_FULL_SYSCONFDIR@/default/otbr-agent
+-@EXEC_START_PRE@ExecStart=@CMAKE_INSTALL_FULL_SBINDIR@/otbr-agent $OTBR_AGENT_OPTS
++ExecStart=@CMAKE_INSTALL_FULL_SBINDIR@/otbr-agent $OTBR_AGENT_OPTS
+ KillMode=mixed
+ Restart=on-failure
+ RestartSec=5
+-- 
+2.35.1
+
diff --git a/meta-networking/recipes-connectivity/openthread/ot-br-posix/Turn-off-sign-compare-for-musl-libc.patch b/meta-networking/recipes-connectivity/openthread/ot-br-posix/Turn-off-sign-compare-for-musl-libc.patch
new file mode 100644
index 000000000..df84550be
--- /dev/null
+++ b/meta-networking/recipes-connectivity/openthread/ot-br-posix/Turn-off-sign-compare-for-musl-libc.patch
@@ -0,0 +1,131 @@ 
+From: Stefan Schmidt <stefan.schmidt@huawei.com>
+Subject: Turn off sign compare for musl libc
+
+When building with musl and clang the usage of CMSG_NXTHDR results in
+sign-compare error. Disable the check only in this specific part of the
+code with a #pragma.
+
+| /home/stefan/huawei/yocto-upstream/yoe/workspace/sources/ot-br-posix/third_party/openthread/repo/src/posix/platform/udp.cpp:147:28: fatal error: comparison of integers of different signs: 'unsigned long' and 'long' [-Wsign-compare]
+|         cmsg             = CMSG_NXTHDR(&msg, cmsg);
+|                            ^~~~~~~~~~~~~~~~~~~~~~~
+| /home/stefan/huawei/yocto-upstream/yoe/build/tmp/work/cortexa57-yoe-linux-musl/ot-br-posix/0.3.0+git999-r0/recipe-sysroot/usr/include/sys/socket.h:358:44: note: expanded from macro 'CMSG_NXTHDR'
+|         __CMSG_LEN(cmsg) + sizeof(struct cmsghdr) >= __MHDR_END(mhdr) - (unsigned char *)(cmsg) \
+|         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+| 1 error generated.
+
+Idea and fix taken from
+recipes-devtools/breakpad/breakpad/0001-Turn-off-sign-compare-for-musl-libc.patch
+by Khem Raj.
+
+Upstream-Status: Inappropriate [OE specific]
+
+Signed-off-by: Stefan Schmidt <stefan.schmidt@huawei.com>
+
+diff --git a/src/backbone_router/nd_proxy.cpp b/src/backbone_router/nd_proxy.cpp
+index 7136878c3d..8a223c95c7 100644
+--- a/src/backbone_router/nd_proxy.cpp
++++ b/src/backbone_router/nd_proxy.cpp
+@@ -185,9 +185,18 @@ void NdProxyManager::ProcessMulticastNeighborSolicition()
+         VerifyOrExit(icmp6header->icmp6_type == ND_NEIGHBOR_SOLICIT, error = OTBR_ERROR_PARSE);
+ 
+         otbrLogDebug("NdProxyManager: Received ND-NS from %s", src.ToString().c_str());
+-
++#ifndef __GLIBC__
++  // In musl-libc, CMSG_NXTHDR typecasts char* to cmsghdr* which causes
++  // clang to throw sign-compare warning. This is to suppress the warning
++  // inline.
++  #pragma clang diagnostic push
++  #pragma clang diagnostic ignored "-Wsign-compare"
++#endif
+         for (cmsghdr = CMSG_FIRSTHDR(&msghdr); cmsghdr; cmsghdr = CMSG_NXTHDR(&msghdr, cmsghdr))
+-        {
++#ifndef __GLIBC__
++  #pragma clang diagnostic pop
++#endif
++	{
+             if (cmsghdr->cmsg_level != IPPROTO_IPV6)
+             {
+                 continue;
+Submodule third_party/openthread/repo contains modified content
+diff --git a/third_party/openthread/repo/src/posix/platform/infra_if.cpp b/third_party/openthread/repo/src/posix/platform/infra_if.cpp
+index 9f93d2b1c..1ed40fe50 100644
+--- a/third_party/openthread/repo/src/posix/platform/infra_if.cpp
++++ b/third_party/openthread/repo/src/posix/platform/infra_if.cpp
+@@ -228,7 +228,17 @@ otError InfraNetif::SendIcmp6Nd(uint32_t            aInfraIfIndex,
+     packetInfo->ipi6_ifindex = mInfraIfIndex;
+ 
+     // Per section 6.1.2 of RFC 4861, we need to send the ICMPv6 message with IP Hop Limit 255.
++#ifndef __GLIBC__
++  // In musl-libc, CMSG_NXTHDR typecasts char* to cmsghdr* which causes
++  // clang to throw sign-compare warning. This is to suppress the warning
++  // inline.
++  #pragma clang diagnostic push
++  #pragma clang diagnostic ignored "-Wsign-compare"
++#endif
+     cmsgPointer             = CMSG_NXTHDR(&msgHeader, cmsgPointer);
++#ifndef __GLIBC__
++  #pragma clang diagnostic pop
++#endif
+     cmsgPointer->cmsg_level = IPPROTO_IPV6;
+     cmsgPointer->cmsg_type  = IPV6_HOPLIMIT;
+     cmsgPointer->cmsg_len   = CMSG_LEN(sizeof(hopLimit));
+@@ -481,7 +491,17 @@ void InfraNetif::ReceiveIcmp6Message(void)
+ 
+     bufferLength = static_cast<uint16_t>(rval);
+ 
++#ifndef __GLIBC__
++  // In musl-libc, CMSG_NXTHDR typecasts char* to cmsghdr* which causes
++  // clang to throw sign-compare warning. This is to suppress the warning
++  // inline.
++  #pragma clang diagnostic push
++  #pragma clang diagnostic ignored "-Wsign-compare"
++#endif
+     for (cmh = CMSG_FIRSTHDR(&msg); cmh; cmh = CMSG_NXTHDR(&msg, cmh))
++#ifndef __GLIBC__
++  #pragma clang diagnostic pop
++#endif
+     {
+         if (cmh->cmsg_level == IPPROTO_IPV6 && cmh->cmsg_type == IPV6_PKTINFO &&
+             cmh->cmsg_len == CMSG_LEN(sizeof(struct in6_pktinfo)))
+diff --git a/third_party/openthread/repo/src/posix/platform/udp.cpp b/third_party/openthread/repo/src/posix/platform/udp.cpp
+index b7aacc5fa..a814fea70 100644
+--- a/third_party/openthread/repo/src/posix/platform/udp.cpp
++++ b/third_party/openthread/repo/src/posix/platform/udp.cpp
+@@ -144,8 +144,18 @@ otError transmitPacket(int aFd, uint8_t *aPayload, uint16_t aLength, const otMes
+     {
+         struct in6_pktinfo pktinfo;
+ 
++#ifndef __GLIBC__
++  // In musl-libc, CMSG_NXTHDR typecasts char* to cmsghdr* which causes
++  // clang to throw sign-compare warning. This is to suppress the warning
++  // inline.
++  #pragma clang diagnostic push
++  #pragma clang diagnostic ignored "-Wsign-compare"
++#endif
+         cmsg             = CMSG_NXTHDR(&msg, cmsg);
+-        cmsg->cmsg_level = IPPROTO_IPV6;
++#ifndef __GLIBC__
++  #pragma clang diagnostic pop
++#endif
++	cmsg->cmsg_level = IPPROTO_IPV6;
+         cmsg->cmsg_type  = IPV6_PKTINFO;
+         cmsg->cmsg_len   = CMSG_LEN(sizeof(pktinfo));
+ 
+@@ -200,7 +210,17 @@ otError receivePacket(int aFd, uint8_t *aPayload, uint16_t &aLength, otMessageIn
+     VerifyOrExit(rval > 0, perror("recvmsg"));
+     aLength = static_cast<uint16_t>(rval);
+ 
++#ifndef __GLIBC__
++  // In musl-libc, CMSG_NXTHDR typecasts char* to cmsghdr* which causes
++  // clang to throw sign-compare warning. This is to suppress the warning
++  // inline.
++  #pragma clang diagnostic push
++  #pragma clang diagnostic ignored "-Wsign-compare"
++#endif
+     for (struct cmsghdr *cmsg = CMSG_FIRSTHDR(&msg); cmsg != nullptr; cmsg = CMSG_NXTHDR(&msg, cmsg))
++#ifndef __GLIBC__
++  #pragma clang diagnostic pop
++#endif
+     {
+         if (cmsg->cmsg_level == IPPROTO_IPV6)
+         {
diff --git a/meta-networking/recipes-connectivity/openthread/ot-br-posix_git.bb b/meta-networking/recipes-connectivity/openthread/ot-br-posix_git.bb
new file mode 100644
index 000000000..d9f558d79
--- /dev/null
+++ b/meta-networking/recipes-connectivity/openthread/ot-br-posix_git.bb
@@ -0,0 +1,59 @@ 
+# SPDX-FileCopyrightText: Huawei Inc.
+#
+# SPDX-License-Identifier: Apache-2.0
+SUMMARY = "OpenThread Border Router"
+SECTION = "net"
+LICENSE = "BSD-3-Clause & MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=87109e44b2fda96a8991f27684a7349c \
+                    file://third_party/Simple-web-server/repo/LICENSE;md5=852b3f7f320b19f6431487b8b2fb1d74 \
+                    file://third_party/cJSON/repo/LICENSE;md5=218947f77e8cb8e2fa02918dc41c50d0 \
+                    file://third_party/http-parser/repo/LICENSE-MIT;md5=9bfa835d048c194ab30487af8d7b3778 \
+                    file://third_party/openthread/repo/LICENSE;md5=543b6fe90ec5901a683320a36390c65f \
+                    "
+DEPENDS = "autoconf-archive dbus readline avahi jsoncpp boost libnetfilter-queue"
+SRCREV = "ad6822257ffddbac295db97186e4ab449a2ed32a"
+PV = "0.3.0+git${SRCPV}"
+
+SRC_URI = "gitsm://github.com/openthread/ot-br-posix.git;protocol=https;branch=main \
+           file://0001-otbr-agent.service.in-remove-pre-exec-hook-for-mdns-.patch \
+           file://Turn-off-sign-compare-for-musl-libc.patch \
+           "
+
+S = "${WORKDIR}/git"
+SYSTEMD_SERVICE:${PN} = "otbr-agent.service"
+
+inherit pkgconfig cmake systemd
+
+EXTRA_OECMAKE = "-DBUILD_TESTING=OFF \
+                 -DOTBR_DBUS=ON \
+                 -DOTBR_REST=ON \
+                 -DOTBR_WEB=OFF \
+                 -DCMAKE_LIBRARY_PATH=${libdir} \
+                 -DOTBR_MDNS=avahi \
+                 -DOTBR_BACKBONE_ROUTER=ON \
+                 -DOTBR_BORDER_ROUTING=ON \
+                 -DOTBR_SRP_ADVERTISING_PROXY=ON \
+                 -DOTBR_BORDER_AGENT=ON \
+                 -DOT_SPINEL_RESET_CONNECTION=ON \
+                 -DOT_TREL=ON \
+                 -DOT_MLR=ON \
+                 -DOT_SRP_SERVER=ON \
+                 -DOT_ECDSA=ON \
+                 -DOT_SERVICE=ON \
+                 -DOTBR_DUA_ROUTING=ON \
+                 -DOT_DUA=ON \
+                 -DOT_BORDER_ROUTING_NAT64=ON \
+                 -DOTBR_DNSSD_DISCOVERY_PROXY=ON \
+                 -DOTBR_INFRA_IF_NAME=eth0 \
+                 -DOTBR_NO_AUTO_ATTACH=1 \
+                 -DOT_REFERENCE_DEVICE=ON \
+                 -DOT_DHCP6_CLIENT=ON \
+                 -DOT_DHCP6_SERVER=ON \
+                 "
+
+RDEPENDS:${PN} = "iproute2 avahi-daemon"
+
+RCONFLICTS:${PN} = "ot-daemon"
+
+FILES:${PN} += "${systemd_unitdir}/*"
+FILES:${PN} += "${datadir}/*"