Hi,

This is something I was working on few past few weeks: using packed structs 
for building and parsing HCI commands in NimBLE stack. For easier transition
I decided to have one big commit affecting both controller and host (mind the 
size of change!:).

In general this follows similar changes done already for SMP and ATT. Packed 
structs are used for accesing and creating protocol ordered data. While 
parsing, unchanged data is passed up in stack as much as possible, so there 
are some API constifications required due to that.

As usual, rule of thumb is that protocol data is accessed via packed structs, 
and host ordered (parsed) data is (if needed) passed as unpacked structs. 

I decided to leave unit tests "as is", which means some defines were moved 
there and tests are stil using byte-by-byte parsing and contructions. I think 
this is fine since it provides additional cross checking for implemention :)

There are serveral benefits of this approach:
 - less source code - 4470 insertions(+), 6137 deletions(-)
 - easy to map where host and controller use same command/event
 - last but not least, less code size. Sample numbers for optimized build with
   most features enabled:
      nimble_controller.a     55602 -> 55246
      nimble_host.a           68001 -> 65285


Note that while PR is ready to be merged (no regressions in our tests), there 
is stil place for improvements: using packed structs for ACL, HCI transports, 
some cleanups in generic code for HCI handling etc. This will be work on later 
on.

PR implementing this is pending review at
https://github.com/apache/mynewt-nimble/pull/507

Comments are welcome.

-- 
pozdrawiam
Szymon Janc


Reply via email to