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. > >> > >> > >> > >> > >> > >> > >
