On Fri, Oct 16, 2026 at 3:06 PM chao an <[email protected]> wrote:
> I think there's a misunderstanding. Let me clarify the architecture once > more, as this has been stated several times already in this thread: > > 1. L2CAP and below will live in the kernel. This is the same layering as > the existing network stack — TCP/IP sits in the kernel, and that's not > controversial. L2CAP is the BLE equivalent of the transport layer. It > belongs there for the same reasons. > 2. Higher-level profiles (GATT, GAP, etc.) will be moved to libc once > the full stack integration is complete. They will use standard POSIX > APIs > and live in userspace, exactly as NuttX's architecture expects. > I don't agree with putting the bluetooth profile into libc, it must be moved to nuttx-apps.git or separated git. > 3. What you're seeing right now is Phase 1 only. This has been mentioned > in the subject and in previous messages. It's an incremental merge — > we're > not dropping the entire BLE stack into the kernel and calling it done. > The > final architecture will respect NuttX's layering conventions: transport > in > the kernel, application-layer protocols in userspace/libc. > > This is fundamentally the same pattern NuttX already follows for IP > networking. I'm not proposing anything that violates the project's > architectural values. > > Based on the current implementation, what I would prefer is to keep the porting in nuttx-apps.git and move the transport/driver layer to the kernel. > raiden00pl <[email protected]> 于2026年10月16日周五 14:56写道: > > > Your response has nothing to do with my reply to your comment about > Nimble. > > No one is claiming that the porting layer in Nimble is perfect, but it > > certainly > > doesn't use the kernel's private API. > > > > Good architecture and POSIX compliance are the core values of this > project. > > It has always been this way, and I hope it remains so. For this reason, > > adding > > anything to the kernel that sits above the L4–L5 layers of the OSI model > is > > a bad idea and I hope it never happens. > > > > > > pt., 16 paź 2026 o 08:44 chao an <[email protected]> napisał(a): > > > > > Hi raiden00pl, > > > > > > Regarding your point about the NimBLE port using the POSIX API — yes, > it > > > uses POSIX, but there are real issues with the current implementation > > that > > > go beyond just kernel/protected mode support. > > > 1. ble_npl_hw_enter_critical is not a real critical section > > > > > > Look at the NuttX port's implementation: > > > > > > > > > https://github.com/apache/mynewt-nimble/blob/master/porting/npl/nuttx/src/os_atomic.c > > > > > > static pthread_mutex_t s_mutex = > PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; > > > > > > uint32_t ble_npl_hw_enter_critical(void) > > > { > > > pthread_mutex_lock(&s_mutex); > > > return 0; > > > } > > > > > > This is a mutex, not a critical section. It does not disable interrupts > > or > > > preemption — an ISR can still fire and corrupt data that the "critical > > > section" was supposed to protect. On top of that, using a mutex opens > the > > > door to ABBA deadlocks when combined with any other lock held inside > the > > > critical region: > > > > > > - Thread A: enter_critical → lock(s_mutex) → try lock(mutex M) ← > > blocked > > > by B > > > - Thread B: lock(M) → enter_critical → lock(s_mutex) ← blocked by A > > > > > > Compare this with the FreeRTOS port, which correctly uses > > > vPortEnterCritical() / vPortExitCritical() (i.e., actually disabling > > > scheduling/preemption). The current NuttX port simply does not meet the > > > semantic contract that the NimBLE stack expects from > > > ble_npl_hw_enter_critical. > > > 2. Time subsystem uses clock_gettime instead of kernel tick APIs > > > > > > > > > > > > https://github.com/apache/mynewt-nimble/blob/master/porting/npl/nuttx/src/os_time.c > > > > > > ble_npl_time_get() is backed by clock_gettime(CLOCK_MONOTONIC, ...), > > which > > > involves a syscall and floating-point arithmetic on every call. In a > BLE > > > stack where timestamps and timing are on the hot path, this adds > > measurable > > > overhead compared to accessing the kernel tick counter directly. > > > 3. Others are already using the kernel approach — and for good reason > > > > > > A concrete example: Xiaomi's Bluetooth stack (zblue) for openvela/NuttX > > > uses kernel APIs directly, bypassing POSIX for the performance-critical > > > paths: > > > > https://github.com/sprhawk/zblue-port-openvela/tree/yaotepai/port/kernel > > > > > > This isn't an academic exercise — it's a production choice. They > > recognized > > > that a BLE stack needs tight integration with the OS timer subsystem, > > > direct access to critical section primitives, and efficient event > > delivery, > > > none of which POSIX provides well in this context. > > > My question > > > > > > If other organizations are already using a more performant, > > architecturally > > > correct kernel-level integration for their BLE stacks on NuttX, why > > should > > > we be told that we must use the slower, less correct POSIX path? > NuttX's > > > POSIX compliance is valuable, but it shouldn't come at the cost of > > shipping > > > a BLE stack with a broken critical section primitive. There should be > > room > > > for both approaches, and the decision should be driven by technical > > merit, > > > not by treating POSIX as the only acceptable answer. > > > > > > Best regards, > > > > > > raiden00pl <[email protected]> 于2026年10月16日周五 14:06写道: > > > > > > > > We already have a similar problem with the current NimBLE > > integration. > > > > The > > > > > NimBLE port in nuttx-apps directly depends on many NuttX > > > kernel/internal > > > > > APIs. As a result, it is difficult to support protected/kernel > builds > > > > > cleanly, and it is also hard to keep the port synchronized with > > > upstream > > > > > NimBLE over time. > > > > > > > > Is this an AI analysis or something? Because it’s definitely not > true: > > > > Nimble > > > > port uses the POSIX API. The only issue with kernel mode is that > > > > SIGEV_SIGNAL is not supported in kernel mode, but this is a nuttx > > > > limitation, > > > > not a port architecture issue. > > > > I agree that synchronizing with an external repository is a > challenge. > > > > However, > > > > a plus side is that we aren't the ones maintaining the code that must > > > > comply > > > > with the BLE standard. > > > > > > > > I also consider placing the entire BLE stack within the kernel to be > a > > > bad > > > > idea. > > > > Even if performance isn't ideal, it’s the price one pays for a sound > > > > architecture. > > > > NuttX has always focused on addressing architectural challenges > (POSIX > > > > compliance) > > > > rather than striving to be the best in terms of performance. > > > > > > > > > > > > pt., 16 paź 2026 o 06:52 chao an <[email protected]> napisał(a): > > > > > > > > > No, I do not agree that the current port is only a Zephyr API > > > replacement > > > > > and > > > > > NuttX coding-style reformatting. > > > > > > > > > > > > > > > > > > > > This code base has already fixed part of the issues that still > exist > > in > > > > the > > > > > > > > > > Zephyr community implementation. In addition, we still have pending > > > > > features and > > > > > fixes that have not been submitted yet. Since some of those changes > > > were > > > > > made by > > > > > other developers, I cannot submit their work by myself without > proper > > > > > permission > > > > > and attribution. > > > > > > > > > > > > > > > https://github.com/zephyrproject-rtos/zephyr/pull/122348 > > > > > > > > > > > > > > > I have already stated in the email why I do not recommend putting > the > > > > > initial > > > > > Bluetooth host stack into nuttx-apps. Architecturally, placing it > in > > > apps > > > > > would > > > > > cause significant performance degradation compared with the Zephyr > > > > design. > > > > > The > > > > > Bluetooth host stack is tightly coupled with kernel primitives, > > buffer > > > > > > > > > > management, work queues, timing, and HCI/driver paths. Moving it > > > entirely > > > > > to > > > > > apps would change that integration model and make the architecture > > > worse > > > > > from > > > > > the beginning. > > > > > > > > > > > > > > > > > > > > Therefore, please read my previous email more carefully. The > concern > > > here > > > > > is not > > > > > only the initial review size, but also the long-term architecture > and > > > > > runtime > > > > > performance of the Bluetooth stack in NuttX. > > > > > > > > > > BRs, > > > > > > > > > > Xiang Xiao <[email protected]> 于2026年10月16日周五 12:44写道: > > > > > > > > > > > On Fri, Oct 16, 2026 at 11:25 AM chao an <[email protected]> > > > wrote: > > > > > > > > > > > > > Hi all, > > > > > > > > > > > > > > I would like to summarize the background, technical motivation, > > and > > > > > > > proposed evolution plan for PR #20686, which introduces a > > > > Zephyr-based > > > > > > > Bluetooth host stack under net/bt. > > > > > > > > > > > > > > https://github.com/apache/nuttx/pull/20686 > > > > > > > > > > > > > > First of all, I fully understand the concerns raised in the > > > > discussion. > > > > > > > Adding a new Bluetooth stack is a significant architectural > > change, > > > > and > > > > > > it > > > > > > > is reasonable for the community to ask whether we should > instead > > > > > continue > > > > > > > improving the existing NuttX Bluetooth implementation. I would > > like > > > > to > > > > > > > explain why we believe introducing the new stack incrementally > is > > > the > > > > > > more > > > > > > > practical path, while still keeping the long-term NuttX > > > architecture > > > > > > clean > > > > > > > and maintainable. > > > > > > > ------------------------------ > > > > > > > 1. Why not only enhance the existing NuttX Bluetooth stack? > > > > > > > > > > > > > > The existing NuttX Bluetooth implementation is mainly focused > on > > > BLE > > > > > > > functionality. However, modern Bluetooth support is no longer > > > limited > > > > > to > > > > > > > basic BLE. A complete Bluetooth host stack now commonly > includes: > > > > > > > > > > > > > > - BLE GAP/GATT/ATT/SMP > > > > > > > - Classic Bluetooth profiles > > > > > > > - A2DP > > > > > > > - AVRCP > > > > > > > - HFP/HSP > > > > > > > - HID > > > > > > > - LE Mesh > > > > > > > - LE Audio > > > > > > > - Additional profile-level interoperability logic > > > > > > > > > > > > > > > > > > > > But most of these profiles should belong to the userspace, please > > > split > > > > > the > > > > > > related code to nuttx-apps.git, instead nuttx/. > > > > > > especially, the code related shell spread in the whole code base: > > > > > > > > > > > > > > > > > > > > > > > > > > > https://github.com/anchao/nuttx/tree/6d6ddbb271cfdeb3e0993b5ebe992b4eab858c6c/net/bt/audio/shell > > > > > > > > > > > > > > > > > > > > > > > > > > > https://github.com/anchao/nuttx/tree/6d6ddbb271cfdeb3e0993b5ebe992b4eab858c6c/net/bt/host/classic/shell > > > > > > > > > > > > > > > > > > > > > > > > > > > https://github.com/anchao/nuttx/tree/6d6ddbb271cfdeb3e0993b5ebe992b4eab858c6c/net/bt/host/shell > > > > > > > > > > > > > > > > > > > > > > > > > > > https://github.com/anchao/nuttx/blob/6d6ddbb271cfdeb3e0993b5ebe992b4eab858c6c/net/bt/mesh/shell/ > > > > > > > > > > > > > > > > > > > > > > > > > > > https://github.com/anchao/nuttx/blob/6d6ddbb271cfdeb3e0993b5ebe992b4eab858c6c/net/bt/services/ias/shell > > > > > > it's definitely wrong to put the shell code inside kernel space. > > > > > > > > > > > > > > > > > > > The Zephyr Bluetooth stack already provides a broad and > actively > > > > > > maintained > > > > > > > implementation across many of these areas. Rebuilding > equivalent > > > > > > > functionality directly on top of the current NuttX Bluetooth > > stack > > > > > would > > > > > > > require a very large multi-year effort, including not only > > protocol > > > > > > > implementation but also interoperability testing with real > > phones, > > > > > > > headsets, speakers, cars, and other commercial devices. > > > > > > > > > > > > > > Therefore, our goal is not to discard NuttX's existing work > > > lightly, > > > > > but > > > > > > to > > > > > > > provide a practical path to make NuttX capable of supporting a > > much > > > > > wider > > > > > > > Bluetooth feature set in a reasonable time frame. > > > > > > > ------------------------------ > > > > > > > 2. Why place the stack in nuttx instead of nuttx-apps? > > > > > > > > > > > > > > Another important discussion point is whether the new Bluetooth > > > stack > > > > > > > should live in nuttx-apps, similar to how NimBLE is currently > > > > > integrated. > > > > > > > > > > > > > > Our concern is that a host stack is not just an > application-level > > > > > > > component. It interacts closely with: > > > > > > > > > > > > > > - HCI transport > > > > > > > - L2CAP channels > > > > > > > - Socket or device interfaces > > > > > > > - Memory pools > > > > > > > - Timers and work queues > > > > > > > - Security and pairing state > > > > > > > - Profile registration > > > > > > > - Controller event dispatch > > > > > > > - Future kernel/user boundary mechanisms > > > > > > > > > > > > > > Putting the core host stack in nuttx-apps would either require > > > > exposing > > > > > > > many internal kernel interfaces or would force the > > application-side > > > > > stack > > > > > > > to depend on non-public NuttX internals. > > > > > > > > > > > > > > We already have a similar problem with the current NimBLE > > > > integration. > > > > > > The > > > > > > > NimBLE port in nuttx-apps directly depends on many NuttX > > > > > kernel/internal > > > > > > > APIs. As a result, it is difficult to support protected/kernel > > > builds > > > > > > > cleanly, and it is also hard to keep the port synchronized with > > > > > upstream > > > > > > > NimBLE over time. > > > > > > > > > > > > > > > > > > > > These are kernel public API, the only problem is that they are > > called > > > > by > > > > > > userspace. > > > > > > > > > > > > > > > > > > > For this reason, we believe the Bluetooth host core belongs in > > the > > > > > NuttX > > > > > > > tree. User-facing profiles, tools, shell commands, or demo > > > > applications > > > > > > can > > > > > > > still live outside the core as appropriate, but the > > > transport-facing > > > > > host > > > > > > > stack should have a well-defined place inside NuttX. > > > > > > > > > > > > > > There is also a performance consideration. In flat build mode, > > the > > > > > > > Bluetooth host stack can run directly on the kernel side > without > > > > > > additional > > > > > > > syscall or user/kernel boundary overhead. This is especially > > > > important > > > > > > for > > > > > > > IoT chips with relatively low CPU frequency, where Bluetooth > data > > > > path > > > > > > and > > > > > > > profile handling overhead can have a visible impact on > > throughput, > > > > > > latency, > > > > > > > and power consumption. > > > > > > > > > > > > > > At the same time, this does not mean that the final > architecture > > > must > > > > > > > remain flat-build-only. A compatible evolution path is to keep > > the > > > > > > > performance-sensitive transport and host core on the kernel > side, > > > > while > > > > > > > gradually moving suitable Bluetooth profile implementations or > > > > > > > profile-facing helper layers into libc-visible build paths. > This > > > > allows > > > > > > > protected and kernel builds to use proper public interfaces, > > while > > > > > still > > > > > > > preserving good performance for flat build and low-end IoT > > > platforms. > > > > > > > > > > > > > > In other words, placing the stack in nuttx gives us a cleaner > > > > long-term > > > > > > > architecture: > > > > > > > > > > > > > > - Flat build can get the best performance with minimum > > overhead. > > > > > > > - Protected/kernel build can be supported later through > proper > > > > > public > > > > > > > interfaces. > > > > > > > - Profile code can be migrated into libc-compatible paths > > where > > > > > > > appropriate. > > > > > > > - Userspace does not need to directly depend on private > kernel > > > > > > symbols. > > > > > > > - The design avoids repeating the long-term maintainability > > > issue > > > > > seen > > > > > > > in some existing userspace Bluetooth integrations. > > > > > > > > > > > > > > > > > > > > > > > > > > But Zephyr bluetooth stack is implemented as a monolithic block > > like > > > > > > NimBLE. > > > > > > Your current porting just include: > > > > > > > > > > > > 1. Switch Zephyr API to NuttX kernel API > > > > > > 2. Format the code base to follow The NuttX coding style > > > > > > > > > > > > No any change related to the kernel/user space separation, so > it's > > > > better > > > > > > to contain in nuttx-apps.git in the current stage. > > > > > > I would suggest you put the initial code inside nuttx-apps and > move > > > the > > > > > > part which belongs to the kernel step by step, > > > > > > so the community can review the change more carefully. > > > > > > > > > > > > > > > > > > > > >
