Hi Anchao,

That is not technically true: Intel donated the same BLE stack to Zephyr.
Greg got it from the Intel Genuino project when it was still under the BSD
License. (Although both stacks have the same origin, it is different from
saying that NuttX Bluetooth came from Zephyr).

Regarding the ZBlue integration discussion, I think we should follow your
suggestion of modifying the existing code instead of copying it
periodically, as Xiaomi is doing. However, we can do this while keeping it
in nuttx-apps.

I think only a small adapter layer should be on the kernel side (and that
code should not contain any lines of code from zblue).

BR,

Alan

On Thu, Oct 29, 2026 at 10:01 AM chao an <[email protected]> wrote:

> Tomek,
>
> I think you should take a look at the history of NuttX's existing native
> Bluetooth stack. It was also ported from Zephyr by Greg Nutt — here's the
> original commit:
>
>
> https://github.com/apache/nuttx/commit/accef0ca9e96ced73ebe3e141975993edb52d42e
>
> That stack was brought in-tree, adapted to NuttX's APIs and threading
> model, and evolved through many subsequent commits to fill in the missing
> pieces. This is exactly the same pattern I'm following with libs/zblue. So
> I have to ask — do you also take issue with that earlier fork? Or were the
> CVE concerns somehow not applicable back then?
>
> The precedent was set a long time ago. I'm not doing anything fundamentally
> different.
>
> BRs,
>
> Tomek CEDRO <[email protected]> 于2026年10月29日周四 20:51写道:
>
> > === TLDR ===
> >
> > Internal bluetooth stack seems perfect, but it comes from external
> > code and active project with better maintenance capabilities thus we
> > should not fork their code adapt it as our own and then jump into the
> > maintenance nightmare of chasing the upstream rabbit both for updates
> > and security fixes.
> >
> > ======
> >
> > Just to have reference in this thread also based on discussion from
> > https://github.com/apache/nuttx/pull/20686
> >
> > Regarding architecture:
> > * @anchao I think more people here (i.e. me, @jerpelea, @acassis,
> > @xiaoxiang781216, @linguini1, ..) asks for keeping ZBlue as "external
> > module".
> > * I know you prefer to keep it "internal" and "adapted with time" but
> > this may make maintenance harder in future.
> > * We can clone a given zblue commit, then use "glue" to make it work on
> > NuttX.
> > * That way we only adapt the "glue" while external implementation is
> > "original" and can be very easily updated with only hash update.
> > * This is especially important for security updates and reported CVEs
> > - we have them for free and always updated with no additional work.
> > * One thing to consider here is the 1. licensing (is it Apache??) and
> > 2. software supply chain security (we may keep our local fork).
> >
> > Regarding nomenclature:
> > * I like "CONFIG_BT*" prefix for all Bluetooth related.
> > * Bluetooth in general would be enabled with `CONFIG_BT`.
> > * I would then prefer `CONFIG_BT_ZBLUE` over `CONFIG_ZBLUE` because
> > ZBlue jumps under the BT category.
> > * Specific functionalities would then be provided by a selected
> > implementation (i.e. zblue, nimble, nxbt) and could have overlappping
> > names to provide the same "low level" stuff on their own - that would
> > provide common API for the "higher level" user applications.
> >
> > We have friction in the architecture area - Anchao wants to keep the
> > implementation "internal", while most folks prefer "external module".
> > How can we solve this?
> >
> > For me there are two main issues:
> >
> > 1. Updates, maintenance, security - with "external module" we only
> > need to update "glue" on our part while the (zblue) upstream provides
> > the updates, functionalities, security fixes. When we take "zblue" and
> > make it "internal" we are forever tied to run after the upstream -
> > which is a lot of additional work, security, compatibility, maybe even
> > certification problem - which sounds like a maintenance nightmare (or
> > warm position for the maintainter but what happens when maintainer is
> > gone?).
> >
> > 2. It does not sound okay to take some implementation and call it my
> > own now while still planning on using their updates ;-) As Alan stated
> > ~90% of the code is original zblue and only small (but important) part
> > is the "glue". It sound more fair to keep the original code from the
> > upstream and only maintain the "glue" part as our own.
> >
> >
> > Plus I am adding Alan's precise remarks below quotation why Bluetooth
> > Security and Maintenance is really important and why we should keep
> > even ZBlue as external module, which I agree with.
> >
> > Thanks :-)
> > Tomek
> >
> >
> > On Sat, Oct 24, 2026 at 2:05 PM Alan C. Assis <[email protected]>
> > wrote:
> > >
> > > acassis left a comment (apache/nuttx#20686)
> > >
> > > @anchao I think enhancing the native stack is always the best option,
> > because we got an implementation that is not the same code from a foreign
> > project and are not affected by the same vulnerabilities.
> > >
> > > Just to prove my point, from 2019 until now were 73 vulnerabilities
> > found on ZBlue:
> > > (CVE-2019-9506, CVE-2020-10061, CVE-2020-10065, CVE-2020-10066,
> > CVE-2020-10068, CVE-2020-10069, CVE-2021-3430,
> > > CVE-2021-3431, CVE-2021-3432, CVE-2021-3433, CVE-2021-3434,
> > CVE-2021-3435, CVE-2021-3436, CVE-2021-3454,
> > > CVE-2021-3455, CVE-2021-3581, CVE-2021-3966, CVE-2022-1041,
> > CVE-2022-1042, CVE-2022-2993, CVE-2022-3806,
> > > CVE-2023-0396, CVE-2023-0397, CVE-2023-1901, CVE-2023-1902,
> > CVE-2023-4258, CVE-2023-4264, CVE-2023-4424,
> > > CVE-2023-5055, CVE-2023-5753, CVE-2024-1638, CVE-2024-3077,
> > CVE-2024-3332, CVE-2024-4785, CVE-2024-5754,
> > > CVE-2024-5931, CVE-2024-6135, CVE-2024-6137, CVE-2024-6258,
> > CVE-2024-6259, CVE-2024-6442, CVE-2024-6443,
> > > CVE-2024-6444, CVE-2024-8798, CVE-2025-7403, CVE-2025-9557,
> > CVE-2025-9558, CVE-2025-10456, CVE-2025-10457,
> > > CVE-2025-10458, CVE-2025-12035, CVE-2025-12890, CVE-2026-2411,
> > CVE-2026-5068, CVE-2026-5589, CVE-2026-9263,
> > > CVE-2026-10593, CVE-2026-10641, CVE-2026-10651, CVE-2026-10653,
> > CVE-2026-10654, CVE-2026-10658, CVE-2026-10660
> > > CVE-2026-10675, CVE-2026-10680, CVE-2026-10685, CVE-2026-10774,
> > CVE-2026-11368, CVE-2026-11893, CVE-2026-11894
> > > CVE-2026-12236, CVE-2026-13213, CVE-2026-15460, and counting)
> > >
> > > 21 only this year! You can think: good these are vulnerabilities that
> > were fixed and we will not be affected. The problem is the year didn't
> > finish, they will discover a lot more before the end of the year, and
> many
> > more in the coming years.
> > >
> > > And since Zephyr is becoming used in more products from different
> > vendors (like Windows) it mean any product with NuttX will be affected as
> > well.
> > >
> > > Perhaps ZBlue could be a great stack (if you think so), but it could it
> > is a foreign code injected on NuttX in the most critical part of NuttX
> > (kernel), it means any vulnerability found on that stack will put a NuttX
> > product in risk.
> > >
> > > This is why I suggested to add a Kconfig "Bluetooth Support" and inside
> > it add:
> > >
> > > [] NuttX Native BLE stack (WIP)
> > > [] ZBlue (Zephyr Bluetooth stack)
> > > [] NimBLE stack
> > >
> > > I think we need to hear more from other developers, seems like only you
> > and I are interested on it.
> > > Ping @xiaoxiang781216 @raiden00pl @hartmannathan @jerpelea @cederom
> > @michallenc @casaroli @simbit18
> >
> > --
> > CeDeROM, SQ7MHZ, http://www.tomek.cedro.info
> >
> > On Thu, Oct 29, 2026 at 5:36 AM chao an <[email protected]> wrote:
> > >
> > > Hi Chengkai,
> > >
> > > Thanks for the clarification, I replied to you on GitHub:
> > >
> > > I think we are mostly aligned on the long-term direction, especially
> > about
> > > converging to one Zephyr-based Bluetooth host and moving toward a
> > > BlueZ/Linux-style split for protected/kernel builds.
> > >
> > > For open point 2, I still prefer not to start from an external
> repository
> > > model in the main NuttX integration path.
> > >
> > > My suggestion is that the code should first be adapted into a
> > NuttX-native
> > > integration style, and then submitted directly to either nuttx.git or
> > > nuttx-apps.git, depending on the agreed layering. Fetching a large
> > external
> > > repository at build time will also bring dependency and maintenance
> > issues
> > > with other third-party code, and I do not think that is the best
> > long-term
> > > integration model for an official NuttX Bluetooth stack.
> > >
> > > In my view, if the stack is going to become part of the NuttX Bluetooth
> > > architecture, it should be reviewed, built, tested, and maintained as
> > part
> > > of the NuttX repositories, not as an external component that is only
> > pinned
> > > by revision.
> > >
> > > Maybe you can use the current PR as a reference for the NuttX-native
> > > integration structure: top-level CONFIG_ZBLUE_ENABLED, NuttX
> > build/Kconfig
> > > integration, NuttX-style public headers, and direct integration with
> the
> > > NuttX Bluetooth driver path. The implementation details can certainly
> be
> > > changed, but I think this kind of native integration is a better
> > direction
> > > than relying on an external fetched repository.
> > >
> > > If the openvela version is adjusted in this direction and accepted by
> the
> > > community as the common upstream solution, I am willing to drop my
> > current
> > > PR and help with that effort. My goal is not to keep my own patch, but
> to
> > > help NuttX get a complete and maintainable Bluetooth stack.
> > >
> > > BRs,
> > >
> > > 成凯 via dev <[email protected]> 于2026年10月29日周四 10:46写道:
> > >
> > > >   Hi anchao,
> > > >
> > > >   Thank you for the detailed reply, and for the offer to work
> > together. I
> > > > am
> > > >   glad we agree on the most important point: NuttX should have one
> > > >   Zephyr-based Bluetooth host, not two.
> > > >
> > > >   Let me first list where I think we already agree, then the open
> > points
> > > > and
> > > >   a proposed order of work.
> > > >
> > > >   Where we agree:
> > > >
> > > >   1. One common stack. We are happy to use the openvela stack as the
> > common
> > > >      base and to work on it together with you.
> > > >   2. Long-term architecture for protected/kernel builds: a
> > > > BlueZ/Linux-style
> > > >      split, with HCI/core/L2CAP and socket integration in the kernel,
> > and
> > > >      profiles, services and tools in userspace. This is the path
> > described
> > > > in
> > > >      Section 5 of the proposal.
> > > >   3. Flat builds may keep a more direct HCI path (btdev callback) for
> > > > low-end
> > > >      IoT chips. We see no conflict with that; it can be an option
> next
> > to
> > > > the
> > > >      socket model.
> > > >   4. Kconfig: CONFIG_ZBLUE_ENABLED as the top-level switch, with
> > > > CONFIG_BT_*
> > > >      for the feature options, as agreed with Alan, is fine with us.
> > > >
> > > >   Open point 1: fork vs. staying in sync with Zephyr
> > > >
> > > >   You are right that the port layer needs NuttX kernel-style
> primitives
> > > >   today, and that the compatibility layer has a cost. In flat build
> we
> > use
> > > >   some internal primitives; making the port layer use only public
> > > > interfaces
> > > >   is part of the protected/kernel work.
> > > >
> > > >   Our suggestion is to fork only where the NuttX architecture
> requires
> > it,
> > > >   not by default:
> > > >
> > > >   - The layers that move into the kernel (HCI core, connection
> > management,
> > > >     L2CAP, socket integration) become NuttX-maintained code. Those
> are
> > the
> > > >     parts that must be adapted to NuttX networking, memory management
> > and
> > > >     build modes anyway.
> > > >   - The layers above (profiles, GATT services, LE Audio, Mesh,
> Classic
> > > >     profiles) only depend on the Zephyr Bluetooth host API, not on
> the
> > > > Zephyr
> > > >     kernel. That is also where most upstream development and security
> > fixes
> > > >     happen. Keeping them close to upstream lets NuttX keep picking
> > those
> > > >     fixes up with little effort.
> > > >
> > > >   This way the compatibility layer shrinks over time instead of
> > growing,
> > > > and
> > > >   the divergence happens step by step, where it brings real value.
> > > >
> > > >   Open point 2: external repository vs. in-tree
> > > >
> > > >   We suggest starting with an external git repository, fetched at a
> > pinned
> > > >   revision like NimBLE. This keeps the first patches small and easy
> to
> > > > review,
> > > >   and gives everyone a working stack to test against from the start.
> > The
> > > >   kernel part will live in nuttx.git. Once the userspace part only
> > contains
> > > >   the layers above L2CAP, we can move it into nuttx-apps.git if the
> > > > community
> > > >   prefers that.
> > > >
> > > >   Proposed order of work:
> > > >
> > > >   1. Integrate the stack into nuttx-apps as an external git
> > repository, as
> > > >      described in the proposal.
> > > >   2. Move the L2CAP layer and below into the NuttX kernel, replacing
> > the
> > > >      current kernel Bluetooth implementation (wireless/bluetooth and
> > > >      net/bluetooth). The new kernel part must keep the existing
> > > > functionality
> > > >      and add BR/EDR Classic support.
> > > >   3. Change the stack in nuttx-apps to drop its own L2CAP-and-below
> > layers
> > > > and
> > > >      use the NuttX kernel instead (sockets for protected/kernel
> > builds; for
> > > >      flat builds, optionally a direct function-call/callback path to
> > the
> > > >      kernel L2CAP layer). If needed at this step, the remaining
> > > > Zephyr-derived
> > > >      code can be moved into nuttx-apps.git.
> > > >
> > > >   Each step is a separate series of small patches, and the stack
> keeps
> > > > working
> > > >   after every step.
> > > >
> > > >   I would like to hear what Xiang, Alan, raiden00pl and others think
> > about
> > > >   this order and the two points above.
> > > >
> > > >   Proposed next step: once this is settled, we write a short joint
> > roadmap
> > > >   (owners and schedule for each step), post it here for review, and
> > then
> > > >   start with small, reviewable patches.
> > > >
> > > >   Thanks again for the open discussion.
> > > >
> > > >   Best regards,
> > > >   Kai Cheng
> > > >
> > > >
> > > > ________________________________
> > > > From: chao an <[email protected]>
> > > > Sent: Wednesday, October 28, 2026 9:03 PM
> > > > To: [email protected]
> > > > Cc: 黄玉龙; 高子豪; 梁超众; 李剑; 陈建; 成凯
> > > > Subject: Re: [External Mail][DISCUSS] Proposal: integrate a
> > Zephyr-based
> > > > Bluetooth host (openvela zblue) as a userspace stack in nuttx-apps,
> > kept in
> > > > sync with upstream Zephyr
> > > >
> > > >
> > > > [外部邮件] 此邮件来源于小米公司外部,请谨慎处理。若对邮件安全性存疑,请将邮件转发给[email protected]进行反馈
> > > >
> > > > Hi Chengkai and Vela team,
> > > >
> > > > First, thank you for writing this proposal. I think this is a good
> > start:
> > > > the community is now discussing the Bluetooth host stack direction
> > > > seriously, and that is very helpful for NuttX.
> > > >
> > > > I agree that we should converge on one Zephyr-based Bluetooth host
> > instead
> > > > of maintaining two unrelated solutions. However, I have a different
> > view on
> > > > the long-term implementation model.
> > > >
> > > > My current opinion is that once we import the Zephyr Bluetooth host
> > into
> > > > NuttX, we should treat it more like a forked NuttX Bluetooth stack,
> > not as
> > > > a subtree that keeps rebasing/syncing with Zephyr forever.
> > > >
> > > > The reason is that zblue is deeply coupled with the Zephyr kernel
> > model.
> > > > If we want to keep it continuously synchronized with Zephyr, then in
> > > > practice we also need to keep a large Zephyr compatibility layer
> > alive. For
> > > > an official NuttX solution, I do not think it is ideal to introduce
> and
> > > > maintain a large part of the Zephyr kernel abstraction just for one
> > > > protocol stack.
> > > >
> > > > Some comments on the questions:
> > > >
> > > >   1.  About putting a userspace Zephyr host in nuttx-apps and
> fetching
> > it
> > > > from an external repository while keeping it synchronized with
> Zephyr:
> > > > I still have concerns about this model.
> > > > First, zblue is not really an independent userspace library. It was
> > > > designed to run inside Zephyr and depends heavily on Zephyr kernel
> > > > concepts. Even if it is placed in apps, the porting layer still needs
> > many
> > > > NuttX kernel-style primitives, such as nxsem, nxmutex, work queues,
> > ticks,
> > > > timers, and internal scheduling behavior. So I do not think simply
> > placing
> > > > it in nuttx-apps makes it a clean application-level library.
> > > > Second, this does not match the original direction that Greg wanted
> for
> > > > the NuttX Bluetooth stack. My understanding is that the goal was a
> > > > Unix-like Bluetooth architecture, where data communication goes
> through
> > > > network/socket APIs. A pure userspace Zephyr-style host over HCI does
> > not
> > > > really provide that architecture.
> > > > Third, I think keeping full long-term synchronization with Zephyr
> will
> > be
> > > > very difficult unless we preserve too much of Zephyr's own kernel
> > model.
> > > > Once we adapt the stack seriously to NuttX APIs, networking, memory
> > > > management, driver model, and build modes, it will naturally diverge.
> > So I
> > > > prefer to accept that it becomes a NuttX-maintained Bluetooth stack
> > based
> > > > on Zephyr, rather than trying to keep it as an almost-unmodified
> Zephyr
> > > > module.
> > > >   2.  About where the external repository should live:
> > > > My preference is not to maintain it as a separate external repository
> > in
> > > > the long term. I think it should be integrated directly into either
> > > > nuttx.git or nuttx-apps.git, depending on the final layering
> decision.
> > This
> > > > makes review, CI, release management, and maintenance clearer for the
> > NuttX
> > > > community.
> > > >   3.  About coexistence with PR #20686:
> > > > I am very happy to drop my current PR if the community agrees on a
> > better
> > > > common direction. My original goal is not to push my own
> > implementation,
> > > > but to help NuttX get a complete Bluetooth stack and improve the
> > > > kernel-side networking architecture.
> > > > If the openvela roadmap is aligned with that goal, especially if it
> can
> > > > eventually support a Unix-like Bluetooth model for NuttX, I would be
> > very
> > > > happy to work with you and use your solution as the base.
> > > >   4.  About Kconfig naming:
> > > > I discussed this with Alan before. The current compromise is to use a
> > > > global switch like CONFIG_ZBLUE_ENABLED, while keeping the internal
> > Kconfig
> > > > options close to Zephyr style, such as CONFIG_BT_*. I think this is
> > > > friendly to both Zephyr and Linux Bluetooth developers, while still
> > making
> > > > the top-level NuttX feature explicit.
> > > >   5.  About the long-term split:
> > > > My preference is:
> > > >      *   For protected/kernel builds, move toward a BlueZ/Linux-style
> > > > split: kernel-side HCI/core/L2CAP/socket integration, with profiles
> and
> > > > tools in userspace.
> > > >      *   For flat builds, allow a more direct HCI/btdev callback path
> > for
> > > > better performance on low-end IoT chips.
> > > > In other words, I do not think we need one single boundary for all
> > build
> > > > modes. NuttX supports very different deployment models, so the
> > Bluetooth
> > > > architecture may also need to support different integration paths.
> > > >
> > > > Again, thanks for proposing this. I think the most important thing is
> > to
> > > > reach a common direction first. I am open to working together and
> > adjusting
> > > > my PR if we can agree on a roadmap that gives NuttX a complete
> > Bluetooth
> > > > stack while also moving toward the right long-term architecture.
> > > >
> > > > BRs,
> > > >
> > > > 成凯 via dev <[email protected]<mailto:[email protected]>>
> > > > 于2026年10月28日周三 20:46写道:
> > > >     Hi all,
> > > >
> > > >     Apologies for the garbled characters in my previous mail; my mail
> > > > client
> > > >     used a non-UTF-8 encoding. The "??5" / "��5" references mean
> > "Section
> > > > 5"
> > > >     (Optional path to a BlueZ/Linux-style split), "Section 7" is the
> > Plan,
> > > > and
> > > >     the dashes in the phase titles are plain hyphens. The content is
> > > > otherwise
> > > >     unchanged.
> > > >
> > > >     Please also ignore the confidentiality footer added by our mail
> > > > gateway;
> > > >     this proposal is intended for public discussion.
> > > >
> > > >     Best regards,
> > > >     Kai Cheng
> > > >
> > > >
> > > >
> > > > ________________________________
> > > > From: 成凯 via dev <[email protected]<mailto:[email protected]>>
> > > > Sent: Wednesday, October 28, 2026 5:54 PM
> > > > To: [email protected]<mailto:[email protected]>
> > > > Cc: 黄玉龙; 高子豪; 梁超众; 李剑; 陈建; 成凯
> > > > Subject: [External Mail][DISCUSS] Proposal: integrate a Zephyr-based
> > > > Bluetooth host (openvela zblue) as a userspace stack in nuttx-apps,
> > kept in
> > > > sync with upstream Zephyr
> > > >
> > > > [外部邮件] 此邮件来源于小米公司外部,请谨慎处理。若对邮件安全性存疑,请将邮件转发给[email protected]<mailto:
> > > > [email protected]>进行反馈
> > > >
> > > > Hi all,
> > > >
> > > > Following the discussion on PR #20686 [1] and the thread "PR #20686 —
> > > > Introducing
> > > > a Zephyr-based Bluetooth host stack under net/bt" [2], I would like
> to
> > > > propose an
> > > > alternative integration model for a full-featured (BLE + BR/EDR
> > Classic)
> > > > Bluetooth host on NuttX, and ask for the community's opinion before
> we
> > > > start
> > > > sending patches.
> > > >
> > > > First, thanks to Archer (anchao) for pushing this topic forward.
> > Everyone
> > > > in the
> > > > thread seems to agree that NuttX needs a more complete Bluetooth
> host.
> > The
> > > > open
> > > > question is where it should live and how it should be maintained.
> This
> > > > proposal
> > > > only covers that question.
> > > >
> > > >
> > > >
> >
> ------------------------------------------------------------------------------
> > > > 1. Summary
> > > >
> > > >
> >
> ------------------------------------------------------------------------------
> > > >
> > > > - Integrate the Zephyr Bluetooth host as a userspace library in
> > nuttx-apps,
> > > >   under wireless/bluetooth/, the same way NimBLE is integrated today
> > [3].
> > > > - The stack source lives in a standalone repository and is fetched
> at a
> > > > pinned
> > > >   revision at build time. Zephyr's subsys/bluetooth is kept
> > unmodified; all
> > > >   NuttX adaptation goes into a separate, small port layer.
> > > > - At the start, the NuttX kernel only provides the HCI transport (the
> > > >   existing drivers/wireless/bluetooth bt_driver_s drivers, exposed to
> > > >   userspace through the H4 character device or the HCI user-channel
> > > > socket).
> > > >   If the community prefers a BlueZ/Linux-style split, the L2/L3
> layers
> > can
> > > > be
> > > >   moved into the kernel step by step from this base (see §5).
> > > > - The stack is an optional choice selected by Kconfig, next to the
> > native
> > > >   wireless/bluetooth stack and NimBLE. It does not replace them, and
> > it is
> > > > not
> > > >   presented as the default NuttX Bluetooth stack.
> > > > - Fixes go to upstream Zephyr first and come back to NuttX through
> > regular
> > > >   rebases.
> > > >
> > > > If the community agrees with this direction, we will upstream our
> > existing,
> > > > production-proven stack step by step (stack integration first, then
> > tests,
> > > > then the optional Bluetooth service layer).
> > > >
> > > >
> > > >
> >
> ------------------------------------------------------------------------------
> > > > 2. What we already have
> > > >
> > > >
> >
> ------------------------------------------------------------------------------
> > > >
> > > > The openvela team at Xiaomi has run a Zephyr-based Bluetooth host on
> > > > NuttX/openvela in production for some time:
> > > >
> > > > - Baseline: Zephyr v4.0 (upstream commit 2efc8598e39, 2024-11), plus
> > later
> > > >   upstream fixes and our own work.
> > > > - Features: LE GAP/GATT/ATT/SMP, and BR/EDR Classic with A2DP
> > (SRC/SNK),
> > > >   AVRCP (CT/TG), HFP (AG/HF), SPP/RFCOMM, SDP, HID Device/Host and
> > > >   GATT over BR/EDR. LE Audio and Mesh come from upstream.
> > > > - Products: shipping in smart speakers (since 2025), smart panels,
> and
> > > >   wearables (watches and bands).
> > > > - Qualification: Bluetooth SIG qualification against Core 6.2
> > (Declaration
> > > > ID
> > > >   Q386483).
> > > > - Qualification testing: the stack plugs directly into AutoPTS
> through
> > the
> > > >   Zephyr BTP tester. A full dual-mode qualification test run takes
> > about
> > > >   2 person-days.
> > > > - Simulation: conformance tests can run in simulation on BSWorld or a
> > > >   software RF controller, without real hardware or phones. This is
> key
> > to
> > > >   keeping the stack's quality up as it evolves.
> > > > - Performance: the host runs in userspace in a flat build and reaches
> > about
> > > >   210 kB/s SPP throughput on a wearable SoC. Running outside the
> kernel
> > > > has not
> > > >   been a bottleneck for us.
> > > > - Upstream work: our team is one of the major contributors to Classic
> > > >   Bluetooth in the Zephyr community.
> > > > - Public code: https://github.com/open-vela/external_zblue (stack)
> and
> > > >   https://github.com/open-vela/frameworks_bluetooth (service layer).
> > These
> > > >   repositories contain our 2025 changes. The 2026 changes are still
> in
> > our
> > > >   internal tree and will be released and upstreamed.
> > > >
> > > >
> > > >
> >
> ------------------------------------------------------------------------------
> > > > 3. Points raised in the PR #20686 discussion
> > > >
> > > >
> >
> ------------------------------------------------------------------------------
> > > >
> > > > My reading of the review comments and the mailing-list thread:
> > > >
> > > > a) Profiles, shell commands and other application-level code do not
> > belong
> > > > in
> > > >    kernel space (Xiang Xiao, raiden00pl).
> > > > b) A monolithic third-party host stack should live in nuttx-apps or a
> > > > separate
> > > >    git, integrated by download like NimBLE (Xiang Xiao).
> > > > c) A stack of this size is a large attack surface. Keeping it out of
> > the
> > > > kernel
> > > >    protects at least protected and kernel builds (Alan Carvalho de
> > Assis,
> > > >    casaroli).
> > > > d) It should be one selectable option, not the implicit "official"
> > NuttX
> > > >    Bluetooth stack (Alan Carvalho de Assis).
> > > > e) Tests are required, e.g. sim-based or BSWorld (LingaoM, cederom).
> > > > f) Copyright and license headers of the imported code must be handled
> > > >    correctly (jerpelea, acassis, Xiang Xiao).
> > > > g) Unfinished work should not land on master (raiden00pl, Xiang
> Xiao).
> > > >
> > > > The proposal below tries to meet all of these.
> > > >
> > > >
> > > >
> >
> ------------------------------------------------------------------------------
> > > > 4. Proposed architecture
> > > >
> > > >
> >
> ------------------------------------------------------------------------------
> > > >
> > > >     +----------------------------------------------------------+
> > > >     | Applications / btshell / (optional) Bluetooth service    |
> > userspace
> > > >     +----------------------------------------------------------+
> > > >     | Zephyr Bluetooth host (unmodified subsys/bluetooth)      |
> > userspace
> > > >     |   GAP/GATT/SMP/L2CAP/RFCOMM/SDP/A2DP/AVRCP/HFP/HID/...   |
> > > > (nuttx-apps)
> > > >     +----------------------------------------------------------+
> > > >     | Port layer: k_thread/k_sem/k_work/k_timer, net_buf,      |
> > userspace
> > > >     | settings backend, logging, iterable sections, HCI glue   |
> > > >     +=========================== HCI =========================+
> > > >     | HCI transport: /dev/ttyHCIx (H4) or HCI user channel     |
> > kernel
> > > >     | bt_uart / bt_rpmsghci / bt_slip / sim HCI socket ...     |
> > > > (existing)
> > > >     +----------------------------------------------------------+
> > > >     | Controller                                               |
> > > >     +----------------------------------------------------------+
> > > >
> > > > Design rules:
> > > >
> > > > 1. Upstream code stays unmodified. Zephyr's subsys/bluetooth is not
> > > > reformatted
> > > >    or edited in place. Like NimBLE, it is third-party code and not
> > subject
> > > > to
> > > >    nxstyle. Any change the stack needs is sent to Zephyr first. (If
> > parts
> > > > are
> > > >    later moved into the kernel as described in §5, those parts are
> > > > maintained
> > > >    in NuttX; the rest keeps this rule.)
> > > > 2. NuttX adaptation stays in the port layer. Zephyr kernel APIs are
> > > > implemented
> > > >    on top of NuttX. Upstream Bluetooth code keeps calling the Zephyr
> > API,
> > > > so
> > > >    upstream patches still apply.
> > > > 3. The initial kernel/user boundary is HCI. The only kernel component
> > is
> > > > the
> > > >    HCI transport, which NuttX already has. The host stack uses public
> > > >    interfaces only (open/read/write/poll or the HCI socket).
> > > > 4. Kconfig is namespaced. One top-level option (e.g. CONFIG_ZBLUE,
> like
> > > >    CONFIG_NIMBLE) selects the stack. The Zephyr CONFIG_BT_* feature
> > options
> > > >    live under it inside nuttx-apps. If a kernel-side stack also uses
> > > >    CONFIG_BT_*, the two must be made mutually exclusive or renamed;
> we
> > are
> > > >    happy to work this out with Archer.
> > > > 5. Build modes: flat build first. Because only public interfaces are
> > used,
> > > > we
> > > >    plan protected and kernel build support as a follow-up phase (see
> > §7).
> > > >
> > > > Why we start with the split at HCI:
> > > >
> > > > The Zephyr host is not layered like Linux. L2CAP is tightly coupled
> > with
> > > > conn.c, ATT, SMP and the buffer and work-queue model. Splitting at
> HCI
> > > > keeps
> > > > the upstream code untouched and gives NuttX a complete, working stack
> > from
> > > > day one. It is the same model Android uses (a userspace host on top
> of
> > an
> > > > HCI
> > > > transport) and the model NimBLE already uses on NuttX. Moving L2CAP
> and
> > > > below
> > > > into the kernel (the BlueZ model) is possible, but it means
> > restructuring
> > > > those layers, so we propose it as a separate, step-by-step path (§5).
> > > >
> > > >
> > > >
> > > >
> >
> ------------------------------------------------------------------------------
> > > > 5. Optional path to a BlueZ/Linux-style split
> > > >
> > > >
> >
> ------------------------------------------------------------------------------
> > > >
> > > > Some community members prefer the Linux/BlueZ layering, where the
> lower
> > > > protocol layers (HCI core, connection management, L2CAP, and possibly
> > SMP)
> > > > live in the kernel and are exposed through AF_BLUETOOTH sockets,
> while
> > > > profiles, services and tools stay in userspace. This proposal is
> > compatible
> > > > with that goal, and our stack can serve as the base for it.
> > > >
> > > > The difference from PR #20686 is the direction of migration:
> > > >
> > > >   - PR #20686 puts the whole host into the kernel first and plans to
> > move
> > > >     parts back to userspace later.
> > > >   - We start with a complete, product-proven host in userspace, and
> > move
> > > > the
> > > >     L2/L3 layers into the kernel step by step, only where the
> community
> > > >     agrees.
> > > >
> > > > Every intermediate state is a working stack, every step can be
> > reviewed and
> > > > tested on its own, and the code that has not moved yet keeps tracking
> > > > upstream Zephyr.
> > > >
> > > > Possible steps, each a separate patch series:
> > > >
> > > >   1. Define the kernel/user interface first: AF_BLUETOOTH sockets for
> > L2CAP
> > > >      (BTPROTO_L2CAP, struct sockaddr_l2), building on the existing
> > NuttX
> > > >      definitions in include/netpacket/bluetooth.h, plus an HCI
> > management
> > > >      interface.
> > > >   2. Move the HCI core and connection management into the kernel,
> next
> > to
> > > >      the existing HCI drivers.
> > > >   3. Move L2CAP (LE and BR/EDR) into the kernel behind the socket
> > > > interface.
> > > >   4. Decide case by case for SMP, ATT/GATT and RFCOMM, based on
> review
> > and
> > > >      measurements.
> > > >
> > > > What stays in nuttx-apps in all cases: profiles (A2DP, AVRCP, HFP,
> HID,
> > > > ...), GATT services, the Bluetooth service layer, shell and tools.
> > > >
> > > > Trade-off: code moved into the kernel will diverge from upstream
> > Zephyr and
> > > > must be maintained in NuttX. Moving it layer by layer, and keeping
> the
> > > > Zephyr API at the boundary where possible, limits that cost and lets
> > the
> > > > community decide how far to go.
> > > >
> > > >
> > > >
> >
> ------------------------------------------------------------------------------
> > > > 6. Comparison with PR #20686
> > > >
> > > >
> >
> ------------------------------------------------------------------------------
> > > >
> > > >                          PR #20686 (current)           This proposal
> > > >   Location               nuttx (net/bt, now libs/)     nuttx-apps +
> > > > external repo
> > > >   Upstream code          reformatted, Zephyr APIs      unmodified;
> port
> > > > layer only
> > > >                          replaced in place
> > > >   Zephyr sync            close to a re-port per        rebase onto
> new
> > > > Zephyr
> > > >                          release (author describes     releases
> > > >                          it as a fork)
> > > >   Security fixes         backported by hand            picked from
> > upstream
> > > >   Kernel attack surface  whole host in kernel          HCI transport
> > only
> > > >   Shell / profiles       inside kernel tree            userspace
> > > >   Build modes            flat only                     flat first,
> then
> > > >
> protected/kernel
> > > >   License headers        need rewriting in tree        upstream files
> > keep
> > > > their
> > > >                                                        headers, not
> in
> > > > nuttx.git
> > > >   Evolution path         whole host in kernel first,   working host
> in
> > > > userspace
> > > >                          then move parts out           first, then
> move
> > > > L2/L3
> > > >                                                        into kernel if
> > > > agreed
> > > >
> > > > Notes:
> > > >
> > > > - Sync cost: the PR reformats the code to nxstyle and replaces Zephyr
> > > > kernel
> > > >   APIs inside protocol files. A whitespace-insensitive diff against
> > > >   Zephyr v4.5.0-rc1 still differs in roughly 19% of lines, so
> upstream
> > > > patches
> > > >   no longer apply directly. Archer also wrote on the PR that he does
> > not
> > > > expect
> > > >   to keep synchronizing with Zephyr ("more like forking"). For a code
> > base
> > > > this
> > > >   size, with a steady stream of upstream CVE fixes (Alan listed more
> > than
> > > > 70
> > > >   since 2019), we think staying close to upstream is the main
> long-term
> > > > value.
> > > > - Performance: as Xiang pointed out, in a flat build a userspace
> stack
> > has
> > > > the
> > > >   same direct-call cost as an in-kernel one. The remaining per-packet
> > > > overhead
> > > >   is the HCI transport (VFS + one copy). Our static estimate on a
> > wearable
> > > > SoC
> > > >   is a few KB of RAM and negligible CPU. Very constrained parts (for
> > > > example
> > > >   the 80 MHz M0 / 64 KB case Archer described) can get an optional
> > > >   flat-build-only direct HCI binding later, without moving the host
> > into
> > > > the
> > > >   kernel.
> > > >
> > > >
> > > >
> >
> ------------------------------------------------------------------------------
> > > > 7. Plan
> > > >
> > > >
> >
> ------------------------------------------------------------------------------
> > > >
> > > > Phase 0 – Consensus (this thread)
> > > >   Agree on location, naming, Kconfig namespace and coexistence with
> PR
> > > > #20686.
> > > >
> > > > Phase 1 – Stack integration (nuttx-apps)
> > > >   - wireless/bluetooth/zblue: Makefile/CMake download at a pinned
> ref,
> > > > Kconfig,
> > > >     port layer.
> > > >   - Uses the existing HCI transports; no kernel changes expected
> (only
> > > > small,
> > > >     separate fixes if any).
> > > >   - btshell as an NSH builtin (the Zephyr shell, Classic and LE
> > commands).
> > > >   - sim configuration with a host HCI dongle, built in CI.
> > > >
> > > > Phase 2 – Tests
> > > >   - sim-based tests for LE and Classic in CI (BSWorld integration).
> > > >   - AutoPTS support through the Zephyr BTP tester.
> > > >   - Samples: LE peripheral/central, A2DP sink, HFP HF, SPP.
> > > >
> > > > Phase 3 – Protected / kernel build
> > > >   - Port layer audited to use only public NuttX/POSIX interfaces.
> > > >   - Validated on a protected and a kernel build target.
> > > >
> > > > Phase 4 – Bluetooth service layer (optional)
> > > >   - Upstream the openvela Bluetooth service ("btservice"): a stable C
> > API
> > > > for
> > > >     applications, multi-client IPC, and a stack abstraction layer, so
> > > >     applications do not depend on the host stack API.
> > > >
> > > > Phase 5 – Boards
> > > >   - Board configurations with real controllers (UART / RPMsg HCI).
> > > >
> > > > Phase 6 – L2/L3 migration to the kernel (optional, if agreed)
> > > >   - Follow the steps in §5, one layer per patch series.
> > > >
> > > > Ongoing
> > > >   - Track Zephyr releases and send fixes upstream first.
> > > >   - We will provide maintainers for the integration.
> > > >
> > > > The main goal of this mail is to collect feedback on the direction.
> We
> > will
> > > > follow up with a detailed effort estimate and schedule for each phase
> > once
> > > > the
> > > > direction is agreed.
> > > >
> > > >
> > > >
> >
> ------------------------------------------------------------------------------
> > > > 8. Licensing
> > > >
> > > >
> >
> ------------------------------------------------------------------------------
> > > >
> > > > - Zephyr-derived files stay in the external repository with their
> > original
> > > >   Apache-2.0 headers and SPDX tags. They are not copied into
> > apache/nuttx
> > > > or
> > > >   apache/nuttx-apps.
> > > > - New glue code in nuttx-apps uses the standard ASF header and is
> > > > contributed
> > > >   under ICLA/CCLA.
> > > >
> > > >
> > > >
> >
> ------------------------------------------------------------------------------
> > > > 9. Questions for the community
> > > >
> > > >
> >
> ------------------------------------------------------------------------------
> > > >
> > > > 1. Is a userspace Zephyr-based host in nuttx-apps, fetched from an
> > external
> > > >    repository and kept in sync with Zephyr, acceptable as the
> > integration
> > > >    model?
> > > > 2. Where should the external repository live (open-vela GitHub
> > > > organization,
> > > >    or another location the PMC prefers)?
> > > > 3. How should this coexist with PR #20686? We would rather converge
> on
> > one
> > > >    Zephyr-based host than ship two. We are glad to work with Archer
> on
> > a
> > > >    common approach.
> > > > 4. Any preference on the top-level Kconfig name (CONFIG_ZBLUE or
> > other)?
> > > > 5. Should the long-term target stay at the HCI split, or move towards
> > the
> > > >    BlueZ/Linux-style split described in §5?
> > > >
> > > > Feedback is very welcome.
> > > >
> > > > [1] https://github.com/apache/nuttx/pull/20686
> > > > [2] https://www.mail-archive.com/[email protected]/msg15328.html
> > > > [3]
> > > >
> >
> https://github.com/apache/nuttx-apps/tree/master/wireless/bluetooth/nimble
> > > >
> > > > Best regards,
> > > >
> > > > Kai Cheng
> > > >
> > > >
> > > >
> >
> #/******本邮件及其附件含有小米公司的保密信息,仅限于发送给上面地址中列出的个人或群组。禁止任何其他人以任何形式使用(包括但不限于全部或部分地泄露、复制、或散发)本邮件中的信息。如果您错收了本邮件,请您立即电话或邮件通知发件人并删除本邮件!
> > > > This e-mail and its attachments contain confidential information from
> > > > XIAOMI, which is intended only for the person or entity whose address
> > is
> > > > listed above. Any use of the information contained herein in any way
> > > > (including, but not limited to, total or partial disclosure,
> > reproduction,
> > > > or dissemination) by persons other than the intended recipient(s) is
> > > > prohibited. If you receive this e-mail in error, please notify the
> > sender
> > > > by phone or email immediately and delete it!******/#
> > > >
> >
> #/******本邮件及其附件含有小米公司的保密信息,仅限于发送给上面地址中列出的个人或群组。禁止任何其他人以任何形式使用(包括但不限于全部或部分地泄露、复制、或散发)本邮件中的信息。如果您错收了本邮件,请您立即电话或邮件通知发件人并删除本邮件!
> > > > This e-mail and its attachments contain confidential information from
> > > > XIAOMI, which is intended only for the person or entity whose address
> > is
> > > > listed above. Any use of the information contained herein in any way
> > > > (including, but not limited to, total or partial disclosure,
> > reproduction,
> > > > or dissemination) by persons other than the intended recipient(s) is
> > > > prohibited. If you receive this e-mail in error, please notify the
> > sender
> > > > by phone or email immediately and delete it!******/#
> > > >
> >
> #/******本邮件及其附件含有小米公司的保密信息,仅限于发送给上面地址中列出的个人或群组。禁止任何其他人以任何形式使用(包括但不限于全部或部分地泄露、复制、或散发)本邮件中的信息。如果您错收了本邮件,请您立即电话或邮件通知发件人并删除本邮件!
> > > > This e-mail and its attachments contain confidential information from
> > > > XIAOMI, which is intended only for the person or entity whose address
> > is
> > > > listed above. Any use of the information contained herein in any way
> > > > (including, but not limited to, total or partial disclosure,
> > reproduction,
> > > > or dissemination) by persons other than the intended recipient(s) is
> > > > prohibited. If you receive this e-mail in error, please notify the
> > sender
> > > > by phone or email immediately and delete it!******/#
> > > >
> >
> >
>

Reply via email to