Yes; 76 or 80. Note that I have not actually tested with 80 byte mbuf blocks. 
That is the theory though :-)

> On Jan 11, 2017, at 4:31 PM, Simon Ratner <[email protected]> wrote:
> 
> Got it; by minimum size you mean the 76/80 bytes?
> 
> On Wed, Jan 11, 2017 at 4:17 PM, will sanfilippo <[email protected]> wrote:
> 
>> Well, yes, there are “definitions” for these things. They are in various
>> places but they are there. Using them might get a bit tricky as you have
>> mentioned; not sure. You would have to make sure the right header files get
>> included in the proper places...
>> 
>> Anyway, here are the definitions:
>> os mbuf header: sizeof(struct os_mbuf). Size = 16
>> os mbuf packet header: sizeof(struct os_mbuf_pkthdr) Size = 8
>> user header: sizeof(struct ble_mbuf_hdr) Size = 8 or 12
>> The HCI ACL data header: BLE_HCI_DATA_HSDR_SZ. 4 bytes
>> The LL PDU header: BLE_LL_PDU_HDR_LEN. 2 bytes
>> 
>> I would always make the size a multiple of 4 but the code should do that
>> for you; I just like to do it so the size you see in the syscfg variable is
>> the actual memory block size.
>> 
>> Another thing I should mention: you should never add a buffer pool to msys
>> smaller than the minimum size I mentioned if you are using the controller.
>> This is something we will address in the future but for now it would be
>> bad. :-)
>> 
>> 
>> 
>>> On Jan 11, 2017, at 3:49 PM, Simon Ratner <[email protected]> wrote:
>>> 
>>> Thanks for the detailed write-up, Will - very useful.
>>> 
>>> Are there defines for these things?
>>> Ideally, if I want a payload size of N, I'd like to specify in
>> syscfg.yml:
>>> 
>>>   MSYS_1_BLOCK_SIZE: '(N + MBUF_HEADER + PKT_HEADER + LL_OVERHEAD +
>> ...)'
>>> 
>>> And magically have optimally-sized buffers.
>>> 
>>> 
>>> On Wed, Jan 11, 2017 at 11:00 AM, will sanfilippo <[email protected]>
>> wrote:
>>> 
>>>> Hello:
>>>> 
>>>> Since this has come up on a number of different occasions I wanted to
>> send
>>>> out an email which discusses how the nimble stack uses mbufs. This will
>> be
>>>> a controller-centric discussion but the concepts apply to the host as
>> well.
>>>> 
>>>> A quick refresher on mbufs: Mynewt, and the nimble stack, use mbufs for
>>>> networking stack packet data. A “packet” is simply a chain of mbufs with
>>>> the first mbuf in the chain being a packet header mbuf and all others
>> being
>>>> “normal” mbufs. A packet header mbuf contains a mbuf header, a packet
>>>> header and an optional user-defined header.
>>>> 
>>>> The length of the packet (i.e. all the data contained in all the mbuf
>>>> chains) is stored in the packet header. Each individual mbuf in the
>> chain
>>>> also contains a length which is the length of the data in that mbuf. The
>>>> sum of all the mbuf data lengths = length of packet.
>>>> 
>>>> The amount of overhead in an mbuf and its size determine the amount of
>>>> data that can be carried in a mbuf. All mbufs have a 16-byte mbuf
>> header.
>>>> Packet header mbufs have an additional 8 bytes for the packet header
>>>> structure and an optional user-data header. The nimble stack uses
>> either an
>>>> 8-byte or 12-byte user data header. If you turn on multi-advertising
>>>> support, the user header is 12 bytes; otherwise it is 8 bytes. This
>> means
>>>> the total packet header mbuf overhead is 32 or 36 bytes.
>>>> 
>>>> The total mbuf size is defined by the various MSYS_X_BLOCK_SIZE syscfg
>>>> variables. Currently, there is one mbuf pool added to msys (MSYS_1)
>> with a
>>>> block size of 292 bytes.
>>>> 
>>>> Controller constraints:
>>>> The controller assumes that a certain minimum data size is available in
>> a
>>>> packet header mbuf. This size is equal to the largest advertising PDU,
>> or
>>>> 37 bytes, and must also contain the 2-byte LL PDU header (for a total
>> of 39
>>>> bytes). Additionally, the controller requires an additional 4 bytes at
>> the
>>>> start of the packet header mbuf to prepend the HCI ACL data packet
>> header.
>>>> This means that the minimum mbuf size that can be allocated in any msys
>>>> mbuf pool is: packet header overhead + 4 + 39 = 75 (79 for multi-adv).
>>>> Since memory pools are always rounded up to the nearest 4 byte boundary,
>>>> this means that the minimum size should be 76 (or 80) bytes.
>>>> 
>>>> For most applications that dont use large packets, setting the mbuf size
>>>> to 80 should be fine as this will accommodate the typical BLE PDU and
>> also
>>>> meets the minimum requirement. If your application generally uses larger
>>>> packets it might be benefical to allocate large mbufs as you dont lose
>> the
>>>> 16-byte overhead per mbuf.
>>>> 
>>>> Finally, here is an example of how many mbufs will be used by the
>>>> controller for received packets. This assumes multi-advertising enabled
>> (36
>>>> byte packet header overhead).
>>>> 
>>>> Example 1: PDU length = 251, msys_1_block_size = 80
>>>> 
>>>> Controller needs to store 251 + 2 = 253 total bytes.
>>>> 
>>>> Packet header mbuf can hold 80 - 36 - 4 bytes, or 40 bytes.
>>>> Each additional mbuf can hold 80 - 16 bytes, or 64 bytes.
>>>> Total mbufs = 5. First mbuf holds 40 bytes, the next three hold 64 bytes
>>>> while the final mbuf holds 21 bytes (40 + 64*3 + 21 = 253).
>>>> 
>>>> Example 2: PDU length = 251, msys_1_block_size = 112
>>>> Total mbufs: 3 (72 + 96 + 85)
>>>> 
>>>> Hope this helps.
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>> 
>> 

Reply via email to