doc: Add initial documentation for network buffers
Change-Id: I6c533eab555d73ce337681bb34839c706d969613 Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
This commit is contained in:
parent
3ac7823ba9
commit
6c4b7b1250
2 changed files with 100 additions and 1 deletions
94
doc/subsystems/networking/buffers.rst
Normal file
94
doc/subsystems/networking/buffers.rst
Normal file
|
@ -0,0 +1,94 @@
|
|||
Network Buffers
|
||||
###############
|
||||
|
||||
Network buffers are a core concept of how the networking stack
|
||||
(as well as the Bluetooth stack) pass data around. The API for them is
|
||||
defined in ``include/net/buf.h``.
|
||||
|
||||
Creating buffers
|
||||
================
|
||||
|
||||
Network buffers are created by first declaring a pool of them:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
static struct nano_fifo free_fifo;
|
||||
static NET_BUF_POOL(pool_name, buf_count, buf_size, &free_fifo, NULL,
|
||||
user_data_size);
|
||||
|
||||
Before operating on the pool it also needs to be initialized at runtime:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
net_buf_pool_init(pool_name);
|
||||
|
||||
Once the pool has been initialized the available buffers are managed
|
||||
with the help of a nano_fifo object and can be acquired with:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
buf = net_buf_get(&free_fifo, reserve_headroom);
|
||||
|
||||
In addition to actual protocol data and generic parsing context, network
|
||||
buffers may also contain protocol-specific context, known as user data.
|
||||
Both the maximum data and user data capacity of the buffers is
|
||||
compile-time defined when declaring the buffer pool.
|
||||
|
||||
Since the free buffers are managed with the help of a nano_fifo it means
|
||||
the buffers have native support for being passed through other nano_fifos
|
||||
as well. This is a very practical feature when the buffers need to be
|
||||
passed from one fiber to another.
|
||||
|
||||
Common Operations
|
||||
=================
|
||||
|
||||
The network buffer API provides some useful helpers for encoding and
|
||||
decoding data in the buffers. To fully understand these helpers it's
|
||||
good to understand the basic names of operations used with them:
|
||||
|
||||
Add
|
||||
Add data to the end of the buffer. Modifies the data length value
|
||||
while leaving the actual data pointer intact. Requires that there is
|
||||
enough tailroom in the buffer. Some examples of APIs for adding data:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
void *net_buf_add(struct net_buf *buf, size_t len);
|
||||
uint8_t *net_buf_add_u8(struct net_buf *buf, uint8_t value);
|
||||
void net_buf_add_le16(struct net_buf *buf, uint16_t value);
|
||||
void net_buf_add_le32(struct net_buf *buf, uint32_t value);
|
||||
|
||||
Push
|
||||
Prepend data to the beginning of the buffer. Modifies both the data
|
||||
length value as well as the data pointer. Requires that there is
|
||||
enough headroom in the buffer. Some examples of APIs for pushing data:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
void *net_buf_push(struct net_buf *buf, size_t len);
|
||||
void net_buf_push_le16(struct net_buf *buf, uint16_t value);
|
||||
uint32_t net_buf_pull_le32(struct net_buf *buf);
|
||||
|
||||
Pull
|
||||
Remove data from the beginning of the buffer. Modifies both the data
|
||||
length value as well as the data pointer. Some examples of APIs for
|
||||
pulling data:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
void *net_buf_pull(struct net_buf *buf, size_t len);
|
||||
uint8_t net_buf_pull_u8(struct net_buf *buf);
|
||||
uint16_t net_buf_pull_le16(struct net_buf *buf);
|
||||
|
||||
The Add and Push operations are used when encoding data into the buffer,
|
||||
whereas Pull is used when decoding data from a buffer.
|
||||
|
||||
Reference Counting
|
||||
==================
|
||||
|
||||
Each network buffer is reference counted. The buffer is initially
|
||||
acquired from a free buffers pool by calling :c:func:`net_buf_get()`,
|
||||
resulting in a buffer with reference count 1. The reference count can be
|
||||
incremented with :c:func:`net_buf_ref()` or decremented with
|
||||
:c:func:`net_buf_unref()`. When the count drops to zero the buffer is
|
||||
automatically placed back to the free buffers pool.
|
|
@ -3,6 +3,11 @@
|
|||
Networking
|
||||
###########
|
||||
|
||||
The network section contains information regarding the network stack
|
||||
The networking section contains information regarding the network stack
|
||||
of the Zephyr kernel. Use the information to understand the
|
||||
principles behind the operation of the stacks and how they were implemented.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
buffers.rst
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue