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