2732 lines
79 KiB
C
2732 lines
79 KiB
C
/** @file
|
|
* @brief Buffer management.
|
|
*/
|
|
|
|
/*
|
|
* Copyright (c) 2015 Intel Corporation
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
#ifndef ZEPHYR_INCLUDE_NET_BUF_H_
|
|
#define ZEPHYR_INCLUDE_NET_BUF_H_
|
|
|
|
#include <stddef.h>
|
|
#include <zephyr/types.h>
|
|
#include <zephyr/sys/util.h>
|
|
#include <zephyr/kernel.h>
|
|
#include <zephyr/sys/iterable_sections.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* @brief Network buffer library
|
|
* @defgroup net_buf Network Buffer Library
|
|
* @since 1.0
|
|
* @version 1.0.0
|
|
* @ingroup os_services
|
|
* @{
|
|
*/
|
|
|
|
/* Alignment needed for various parts of the buffer definition */
|
|
#if CONFIG_NET_BUF_ALIGNMENT == 0
|
|
#define __net_buf_align __aligned(sizeof(void *))
|
|
#else
|
|
#define __net_buf_align __aligned(CONFIG_NET_BUF_ALIGNMENT)
|
|
#endif
|
|
|
|
/**
|
|
* @brief Define a net_buf_simple stack variable.
|
|
*
|
|
* This is a helper macro which is used to define a net_buf_simple object
|
|
* on the stack.
|
|
*
|
|
* @param _name Name of the net_buf_simple object.
|
|
* @param _size Maximum data storage for the buffer.
|
|
*/
|
|
#define NET_BUF_SIMPLE_DEFINE(_name, _size) \
|
|
uint8_t net_buf_data_##_name[_size]; \
|
|
struct net_buf_simple _name = { \
|
|
.data = net_buf_data_##_name, \
|
|
.len = 0, \
|
|
.size = _size, \
|
|
.__buf = net_buf_data_##_name, \
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @brief Define a static net_buf_simple variable.
|
|
*
|
|
* This is a helper macro which is used to define a static net_buf_simple
|
|
* object.
|
|
*
|
|
* @param _name Name of the net_buf_simple object.
|
|
* @param _size Maximum data storage for the buffer.
|
|
*/
|
|
#define NET_BUF_SIMPLE_DEFINE_STATIC(_name, _size) \
|
|
static __noinit uint8_t net_buf_data_##_name[_size]; \
|
|
static struct net_buf_simple _name = { \
|
|
.data = net_buf_data_##_name, \
|
|
.len = 0, \
|
|
.size = _size, \
|
|
.__buf = net_buf_data_##_name, \
|
|
}
|
|
|
|
/**
|
|
* @brief Simple network buffer representation.
|
|
*
|
|
* This is a simpler variant of the net_buf object (in fact net_buf uses
|
|
* net_buf_simple internally). It doesn't provide any kind of reference
|
|
* counting, user data, dynamic allocation, or in general the ability to
|
|
* pass through kernel objects such as FIFOs.
|
|
*
|
|
* The main use of this is for scenarios where the meta-data of the normal
|
|
* net_buf isn't needed and causes too much overhead. This could be e.g.
|
|
* when the buffer only needs to be allocated on the stack or when the
|
|
* access to and lifetime of the buffer is well controlled and constrained.
|
|
*/
|
|
struct net_buf_simple {
|
|
/** Pointer to the start of data in the buffer. */
|
|
uint8_t *data;
|
|
|
|
/**
|
|
* Length of the data behind the data pointer.
|
|
*
|
|
* To determine the max length, use net_buf_simple_max_len(), not #size!
|
|
*/
|
|
uint16_t len;
|
|
|
|
/** Amount of data that net_buf_simple#__buf can store. */
|
|
uint16_t size;
|
|
|
|
/** Start of the data storage. Not to be accessed directly
|
|
* (the data pointer should be used instead).
|
|
*/
|
|
uint8_t *__buf;
|
|
};
|
|
|
|
/**
|
|
*
|
|
* @brief Define a net_buf_simple stack variable and get a pointer to it.
|
|
*
|
|
* This is a helper macro which is used to define a net_buf_simple object on
|
|
* the stack and the get a pointer to it as follows:
|
|
*
|
|
* struct net_buf_simple *my_buf = NET_BUF_SIMPLE(10);
|
|
*
|
|
* After creating the object it needs to be initialized by calling
|
|
* net_buf_simple_init().
|
|
*
|
|
* @param _size Maximum data storage for the buffer.
|
|
*
|
|
* @return Pointer to stack-allocated net_buf_simple object.
|
|
*/
|
|
#define NET_BUF_SIMPLE(_size) \
|
|
((struct net_buf_simple *)(&(struct { \
|
|
struct net_buf_simple buf; \
|
|
uint8_t data[_size]; \
|
|
}) { \
|
|
.buf.size = _size, \
|
|
}))
|
|
|
|
/**
|
|
* @brief Initialize a net_buf_simple object.
|
|
*
|
|
* This needs to be called after creating a net_buf_simple object using
|
|
* the NET_BUF_SIMPLE macro.
|
|
*
|
|
* @param buf Buffer to initialize.
|
|
* @param reserve_head Headroom to reserve.
|
|
*/
|
|
static inline void net_buf_simple_init(struct net_buf_simple *buf,
|
|
size_t reserve_head)
|
|
{
|
|
if (!buf->__buf) {
|
|
buf->__buf = (uint8_t *)buf + sizeof(*buf);
|
|
}
|
|
|
|
buf->data = buf->__buf + reserve_head;
|
|
buf->len = 0U;
|
|
}
|
|
|
|
/**
|
|
* @brief Initialize a net_buf_simple object with data.
|
|
*
|
|
* Initialized buffer object with external data.
|
|
*
|
|
* @param buf Buffer to initialize.
|
|
* @param data External data pointer
|
|
* @param size Amount of data the pointed data buffer if able to fit.
|
|
*/
|
|
void net_buf_simple_init_with_data(struct net_buf_simple *buf,
|
|
void *data, size_t size);
|
|
|
|
/**
|
|
* @brief Reset buffer
|
|
*
|
|
* Reset buffer data so it can be reused for other purposes.
|
|
*
|
|
* @param buf Buffer to reset.
|
|
*/
|
|
static inline void net_buf_simple_reset(struct net_buf_simple *buf)
|
|
{
|
|
buf->len = 0U;
|
|
buf->data = buf->__buf;
|
|
}
|
|
|
|
/**
|
|
* Clone buffer state, using the same data buffer.
|
|
*
|
|
* Initializes a buffer to point to the same data as an existing buffer.
|
|
* Allows operations on the same data without altering the length and
|
|
* offset of the original.
|
|
*
|
|
* @param original Buffer to clone.
|
|
* @param clone The new clone.
|
|
*/
|
|
void net_buf_simple_clone(const struct net_buf_simple *original,
|
|
struct net_buf_simple *clone);
|
|
|
|
/**
|
|
* @brief Prepare data to be added at the end of the buffer
|
|
*
|
|
* Increments the data length of a buffer to account for more data
|
|
* at the end.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param len Number of bytes to increment the length with.
|
|
*
|
|
* @return The original tail of the buffer.
|
|
*/
|
|
void *net_buf_simple_add(struct net_buf_simple *buf, size_t len);
|
|
|
|
/**
|
|
* @brief Copy given number of bytes from memory to the end of the buffer
|
|
*
|
|
* Increments the data length of the buffer to account for more data at the
|
|
* end.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param mem Location of data to be added.
|
|
* @param len Length of data to be added
|
|
*
|
|
* @return The original tail of the buffer.
|
|
*/
|
|
void *net_buf_simple_add_mem(struct net_buf_simple *buf, const void *mem,
|
|
size_t len);
|
|
|
|
/**
|
|
* @brief Add (8-bit) byte at the end of the buffer
|
|
*
|
|
* Increments the data length of the buffer to account for more data at the
|
|
* end.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val byte value to be added.
|
|
*
|
|
* @return Pointer to the value added
|
|
*/
|
|
uint8_t *net_buf_simple_add_u8(struct net_buf_simple *buf, uint8_t val);
|
|
|
|
/**
|
|
* @brief Add 16-bit value at the end of the buffer
|
|
*
|
|
* Adds 16-bit value in little endian format at the end of buffer.
|
|
* Increments the data length of a buffer to account for more data
|
|
* at the end.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 16-bit value to be added.
|
|
*/
|
|
void net_buf_simple_add_le16(struct net_buf_simple *buf, uint16_t val);
|
|
|
|
/**
|
|
* @brief Add 16-bit value at the end of the buffer
|
|
*
|
|
* Adds 16-bit value in big endian format at the end of buffer.
|
|
* Increments the data length of a buffer to account for more data
|
|
* at the end.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 16-bit value to be added.
|
|
*/
|
|
void net_buf_simple_add_be16(struct net_buf_simple *buf, uint16_t val);
|
|
|
|
/**
|
|
* @brief Add 24-bit value at the end of the buffer
|
|
*
|
|
* Adds 24-bit value in little endian format at the end of buffer.
|
|
* Increments the data length of a buffer to account for more data
|
|
* at the end.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 24-bit value to be added.
|
|
*/
|
|
void net_buf_simple_add_le24(struct net_buf_simple *buf, uint32_t val);
|
|
|
|
/**
|
|
* @brief Add 24-bit value at the end of the buffer
|
|
*
|
|
* Adds 24-bit value in big endian format at the end of buffer.
|
|
* Increments the data length of a buffer to account for more data
|
|
* at the end.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 24-bit value to be added.
|
|
*/
|
|
void net_buf_simple_add_be24(struct net_buf_simple *buf, uint32_t val);
|
|
|
|
/**
|
|
* @brief Add 32-bit value at the end of the buffer
|
|
*
|
|
* Adds 32-bit value in little endian format at the end of buffer.
|
|
* Increments the data length of a buffer to account for more data
|
|
* at the end.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 32-bit value to be added.
|
|
*/
|
|
void net_buf_simple_add_le32(struct net_buf_simple *buf, uint32_t val);
|
|
|
|
/**
|
|
* @brief Add 32-bit value at the end of the buffer
|
|
*
|
|
* Adds 32-bit value in big endian format at the end of buffer.
|
|
* Increments the data length of a buffer to account for more data
|
|
* at the end.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 32-bit value to be added.
|
|
*/
|
|
void net_buf_simple_add_be32(struct net_buf_simple *buf, uint32_t val);
|
|
|
|
/**
|
|
* @brief Add 40-bit value at the end of the buffer
|
|
*
|
|
* Adds 40-bit value in little endian format at the end of buffer.
|
|
* Increments the data length of a buffer to account for more data
|
|
* at the end.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 40-bit value to be added.
|
|
*/
|
|
void net_buf_simple_add_le40(struct net_buf_simple *buf, uint64_t val);
|
|
|
|
/**
|
|
* @brief Add 40-bit value at the end of the buffer
|
|
*
|
|
* Adds 40-bit value in big endian format at the end of buffer.
|
|
* Increments the data length of a buffer to account for more data
|
|
* at the end.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 40-bit value to be added.
|
|
*/
|
|
void net_buf_simple_add_be40(struct net_buf_simple *buf, uint64_t val);
|
|
|
|
/**
|
|
* @brief Add 48-bit value at the end of the buffer
|
|
*
|
|
* Adds 48-bit value in little endian format at the end of buffer.
|
|
* Increments the data length of a buffer to account for more data
|
|
* at the end.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 48-bit value to be added.
|
|
*/
|
|
void net_buf_simple_add_le48(struct net_buf_simple *buf, uint64_t val);
|
|
|
|
/**
|
|
* @brief Add 48-bit value at the end of the buffer
|
|
*
|
|
* Adds 48-bit value in big endian format at the end of buffer.
|
|
* Increments the data length of a buffer to account for more data
|
|
* at the end.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 48-bit value to be added.
|
|
*/
|
|
void net_buf_simple_add_be48(struct net_buf_simple *buf, uint64_t val);
|
|
|
|
/**
|
|
* @brief Add 64-bit value at the end of the buffer
|
|
*
|
|
* Adds 64-bit value in little endian format at the end of buffer.
|
|
* Increments the data length of a buffer to account for more data
|
|
* at the end.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 64-bit value to be added.
|
|
*/
|
|
void net_buf_simple_add_le64(struct net_buf_simple *buf, uint64_t val);
|
|
|
|
/**
|
|
* @brief Add 64-bit value at the end of the buffer
|
|
*
|
|
* Adds 64-bit value in big endian format at the end of buffer.
|
|
* Increments the data length of a buffer to account for more data
|
|
* at the end.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 64-bit value to be added.
|
|
*/
|
|
void net_buf_simple_add_be64(struct net_buf_simple *buf, uint64_t val);
|
|
|
|
/**
|
|
* @brief Remove data from the end of the buffer.
|
|
*
|
|
* Removes data from the end of the buffer by modifying the buffer length.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param len Number of bytes to remove.
|
|
*
|
|
* @return New end of the buffer data.
|
|
*/
|
|
void *net_buf_simple_remove_mem(struct net_buf_simple *buf, size_t len);
|
|
|
|
/**
|
|
* @brief Remove a 8-bit value from the end of the buffer
|
|
*
|
|
* Same idea as with net_buf_simple_remove_mem(), but a helper for operating
|
|
* on 8-bit values.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return The 8-bit removed value
|
|
*/
|
|
uint8_t net_buf_simple_remove_u8(struct net_buf_simple *buf);
|
|
|
|
/**
|
|
* @brief Remove and convert 16 bits from the end of the buffer.
|
|
*
|
|
* Same idea as with net_buf_simple_remove_mem(), but a helper for operating
|
|
* on 16-bit little endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 16-bit value converted from little endian to host endian.
|
|
*/
|
|
uint16_t net_buf_simple_remove_le16(struct net_buf_simple *buf);
|
|
|
|
/**
|
|
* @brief Remove and convert 16 bits from the end of the buffer.
|
|
*
|
|
* Same idea as with net_buf_simple_remove_mem(), but a helper for operating
|
|
* on 16-bit big endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 16-bit value converted from big endian to host endian.
|
|
*/
|
|
uint16_t net_buf_simple_remove_be16(struct net_buf_simple *buf);
|
|
|
|
/**
|
|
* @brief Remove and convert 24 bits from the end of the buffer.
|
|
*
|
|
* Same idea as with net_buf_simple_remove_mem(), but a helper for operating
|
|
* on 24-bit little endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 24-bit value converted from little endian to host endian.
|
|
*/
|
|
uint32_t net_buf_simple_remove_le24(struct net_buf_simple *buf);
|
|
|
|
/**
|
|
* @brief Remove and convert 24 bits from the end of the buffer.
|
|
*
|
|
* Same idea as with net_buf_simple_remove_mem(), but a helper for operating
|
|
* on 24-bit big endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 24-bit value converted from big endian to host endian.
|
|
*/
|
|
uint32_t net_buf_simple_remove_be24(struct net_buf_simple *buf);
|
|
|
|
/**
|
|
* @brief Remove and convert 32 bits from the end of the buffer.
|
|
*
|
|
* Same idea as with net_buf_simple_remove_mem(), but a helper for operating
|
|
* on 32-bit little endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 32-bit value converted from little endian to host endian.
|
|
*/
|
|
uint32_t net_buf_simple_remove_le32(struct net_buf_simple *buf);
|
|
|
|
/**
|
|
* @brief Remove and convert 32 bits from the end of the buffer.
|
|
*
|
|
* Same idea as with net_buf_simple_remove_mem(), but a helper for operating
|
|
* on 32-bit big endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 32-bit value converted from big endian to host endian.
|
|
*/
|
|
uint32_t net_buf_simple_remove_be32(struct net_buf_simple *buf);
|
|
|
|
/**
|
|
* @brief Remove and convert 40 bits from the end of the buffer.
|
|
*
|
|
* Same idea as with net_buf_simple_remove_mem(), but a helper for operating
|
|
* on 40-bit little endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 40-bit value converted from little endian to host endian.
|
|
*/
|
|
uint64_t net_buf_simple_remove_le40(struct net_buf_simple *buf);
|
|
|
|
/**
|
|
* @brief Remove and convert 40 bits from the end of the buffer.
|
|
*
|
|
* Same idea as with net_buf_simple_remove_mem(), but a helper for operating
|
|
* on 40-bit big endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 40-bit value converted from big endian to host endian.
|
|
*/
|
|
uint64_t net_buf_simple_remove_be40(struct net_buf_simple *buf);
|
|
|
|
/**
|
|
* @brief Remove and convert 48 bits from the end of the buffer.
|
|
*
|
|
* Same idea as with net_buf_simple_remove_mem(), but a helper for operating
|
|
* on 48-bit little endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 48-bit value converted from little endian to host endian.
|
|
*/
|
|
uint64_t net_buf_simple_remove_le48(struct net_buf_simple *buf);
|
|
|
|
/**
|
|
* @brief Remove and convert 48 bits from the end of the buffer.
|
|
*
|
|
* Same idea as with net_buf_simple_remove_mem(), but a helper for operating
|
|
* on 48-bit big endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 48-bit value converted from big endian to host endian.
|
|
*/
|
|
uint64_t net_buf_simple_remove_be48(struct net_buf_simple *buf);
|
|
|
|
/**
|
|
* @brief Remove and convert 64 bits from the end of the buffer.
|
|
*
|
|
* Same idea as with net_buf_simple_remove_mem(), but a helper for operating
|
|
* on 64-bit little endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 64-bit value converted from little endian to host endian.
|
|
*/
|
|
uint64_t net_buf_simple_remove_le64(struct net_buf_simple *buf);
|
|
|
|
/**
|
|
* @brief Remove and convert 64 bits from the end of the buffer.
|
|
*
|
|
* Same idea as with net_buf_simple_remove_mem(), but a helper for operating
|
|
* on 64-bit big endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 64-bit value converted from big endian to host endian.
|
|
*/
|
|
uint64_t net_buf_simple_remove_be64(struct net_buf_simple *buf);
|
|
|
|
/**
|
|
* @brief Prepare data to be added to the start of the buffer
|
|
*
|
|
* Modifies the data pointer and buffer length to account for more data
|
|
* in the beginning of the buffer.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param len Number of bytes to add to the beginning.
|
|
*
|
|
* @return The new beginning of the buffer data.
|
|
*/
|
|
void *net_buf_simple_push(struct net_buf_simple *buf, size_t len);
|
|
|
|
/**
|
|
* @brief Copy given number of bytes from memory to the start of the buffer.
|
|
*
|
|
* Modifies the data pointer and buffer length to account for more data
|
|
* in the beginning of the buffer.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param mem Location of data to be added.
|
|
* @param len Length of data to be added.
|
|
*
|
|
* @return The new beginning of the buffer data.
|
|
*/
|
|
void *net_buf_simple_push_mem(struct net_buf_simple *buf, const void *mem,
|
|
size_t len);
|
|
|
|
/**
|
|
* @brief Push 16-bit value to the beginning of the buffer
|
|
*
|
|
* Adds 16-bit value in little endian format to the beginning of the
|
|
* buffer.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 16-bit value to be pushed to the buffer.
|
|
*/
|
|
void net_buf_simple_push_le16(struct net_buf_simple *buf, uint16_t val);
|
|
|
|
/**
|
|
* @brief Push 16-bit value to the beginning of the buffer
|
|
*
|
|
* Adds 16-bit value in big endian format to the beginning of the
|
|
* buffer.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 16-bit value to be pushed to the buffer.
|
|
*/
|
|
void net_buf_simple_push_be16(struct net_buf_simple *buf, uint16_t val);
|
|
|
|
/**
|
|
* @brief Push 8-bit value to the beginning of the buffer
|
|
*
|
|
* Adds 8-bit value the beginning of the buffer.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 8-bit value to be pushed to the buffer.
|
|
*/
|
|
void net_buf_simple_push_u8(struct net_buf_simple *buf, uint8_t val);
|
|
|
|
/**
|
|
* @brief Push 24-bit value to the beginning of the buffer
|
|
*
|
|
* Adds 24-bit value in little endian format to the beginning of the
|
|
* buffer.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 24-bit value to be pushed to the buffer.
|
|
*/
|
|
void net_buf_simple_push_le24(struct net_buf_simple *buf, uint32_t val);
|
|
|
|
/**
|
|
* @brief Push 24-bit value to the beginning of the buffer
|
|
*
|
|
* Adds 24-bit value in big endian format to the beginning of the
|
|
* buffer.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 24-bit value to be pushed to the buffer.
|
|
*/
|
|
void net_buf_simple_push_be24(struct net_buf_simple *buf, uint32_t val);
|
|
|
|
/**
|
|
* @brief Push 32-bit value to the beginning of the buffer
|
|
*
|
|
* Adds 32-bit value in little endian format to the beginning of the
|
|
* buffer.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 32-bit value to be pushed to the buffer.
|
|
*/
|
|
void net_buf_simple_push_le32(struct net_buf_simple *buf, uint32_t val);
|
|
|
|
/**
|
|
* @brief Push 32-bit value to the beginning of the buffer
|
|
*
|
|
* Adds 32-bit value in big endian format to the beginning of the
|
|
* buffer.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 32-bit value to be pushed to the buffer.
|
|
*/
|
|
void net_buf_simple_push_be32(struct net_buf_simple *buf, uint32_t val);
|
|
|
|
/**
|
|
* @brief Push 40-bit value to the beginning of the buffer
|
|
*
|
|
* Adds 40-bit value in little endian format to the beginning of the
|
|
* buffer.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 40-bit value to be pushed to the buffer.
|
|
*/
|
|
void net_buf_simple_push_le40(struct net_buf_simple *buf, uint64_t val);
|
|
|
|
/**
|
|
* @brief Push 40-bit value to the beginning of the buffer
|
|
*
|
|
* Adds 40-bit value in big endian format to the beginning of the
|
|
* buffer.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 40-bit value to be pushed to the buffer.
|
|
*/
|
|
void net_buf_simple_push_be40(struct net_buf_simple *buf, uint64_t val);
|
|
|
|
/**
|
|
* @brief Push 48-bit value to the beginning of the buffer
|
|
*
|
|
* Adds 48-bit value in little endian format to the beginning of the
|
|
* buffer.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 48-bit value to be pushed to the buffer.
|
|
*/
|
|
void net_buf_simple_push_le48(struct net_buf_simple *buf, uint64_t val);
|
|
|
|
/**
|
|
* @brief Push 48-bit value to the beginning of the buffer
|
|
*
|
|
* Adds 48-bit value in big endian format to the beginning of the
|
|
* buffer.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 48-bit value to be pushed to the buffer.
|
|
*/
|
|
void net_buf_simple_push_be48(struct net_buf_simple *buf, uint64_t val);
|
|
|
|
/**
|
|
* @brief Push 64-bit value to the beginning of the buffer
|
|
*
|
|
* Adds 64-bit value in little endian format to the beginning of the
|
|
* buffer.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 64-bit value to be pushed to the buffer.
|
|
*/
|
|
void net_buf_simple_push_le64(struct net_buf_simple *buf, uint64_t val);
|
|
|
|
/**
|
|
* @brief Push 64-bit value to the beginning of the buffer
|
|
*
|
|
* Adds 64-bit value in big endian format to the beginning of the
|
|
* buffer.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 64-bit value to be pushed to the buffer.
|
|
*/
|
|
void net_buf_simple_push_be64(struct net_buf_simple *buf, uint64_t val);
|
|
|
|
/**
|
|
* @brief Remove data from the beginning of the buffer.
|
|
*
|
|
* Removes data from the beginning of the buffer by modifying the data
|
|
* pointer and buffer length.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param len Number of bytes to remove.
|
|
*
|
|
* @return New beginning of the buffer data.
|
|
*/
|
|
void *net_buf_simple_pull(struct net_buf_simple *buf, size_t len);
|
|
|
|
/**
|
|
* @brief Remove data from the beginning of the buffer.
|
|
*
|
|
* Removes data from the beginning of the buffer by modifying the data
|
|
* pointer and buffer length.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param len Number of bytes to remove.
|
|
*
|
|
* @return Pointer to the old location of the buffer data.
|
|
*/
|
|
void *net_buf_simple_pull_mem(struct net_buf_simple *buf, size_t len);
|
|
|
|
/**
|
|
* @brief Remove a 8-bit value from the beginning of the buffer
|
|
*
|
|
* Same idea as with net_buf_simple_pull(), but a helper for operating
|
|
* on 8-bit values.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return The 8-bit removed value
|
|
*/
|
|
uint8_t net_buf_simple_pull_u8(struct net_buf_simple *buf);
|
|
|
|
/**
|
|
* @brief Remove and convert 16 bits from the beginning of the buffer.
|
|
*
|
|
* Same idea as with net_buf_simple_pull(), but a helper for operating
|
|
* on 16-bit little endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 16-bit value converted from little endian to host endian.
|
|
*/
|
|
uint16_t net_buf_simple_pull_le16(struct net_buf_simple *buf);
|
|
|
|
/**
|
|
* @brief Remove and convert 16 bits from the beginning of the buffer.
|
|
*
|
|
* Same idea as with net_buf_simple_pull(), but a helper for operating
|
|
* on 16-bit big endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 16-bit value converted from big endian to host endian.
|
|
*/
|
|
uint16_t net_buf_simple_pull_be16(struct net_buf_simple *buf);
|
|
|
|
/**
|
|
* @brief Remove and convert 24 bits from the beginning of the buffer.
|
|
*
|
|
* Same idea as with net_buf_simple_pull(), but a helper for operating
|
|
* on 24-bit little endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 24-bit value converted from little endian to host endian.
|
|
*/
|
|
uint32_t net_buf_simple_pull_le24(struct net_buf_simple *buf);
|
|
|
|
/**
|
|
* @brief Remove and convert 24 bits from the beginning of the buffer.
|
|
*
|
|
* Same idea as with net_buf_simple_pull(), but a helper for operating
|
|
* on 24-bit big endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 24-bit value converted from big endian to host endian.
|
|
*/
|
|
uint32_t net_buf_simple_pull_be24(struct net_buf_simple *buf);
|
|
|
|
/**
|
|
* @brief Remove and convert 32 bits from the beginning of the buffer.
|
|
*
|
|
* Same idea as with net_buf_simple_pull(), but a helper for operating
|
|
* on 32-bit little endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 32-bit value converted from little endian to host endian.
|
|
*/
|
|
uint32_t net_buf_simple_pull_le32(struct net_buf_simple *buf);
|
|
|
|
/**
|
|
* @brief Remove and convert 32 bits from the beginning of the buffer.
|
|
*
|
|
* Same idea as with net_buf_simple_pull(), but a helper for operating
|
|
* on 32-bit big endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 32-bit value converted from big endian to host endian.
|
|
*/
|
|
uint32_t net_buf_simple_pull_be32(struct net_buf_simple *buf);
|
|
|
|
/**
|
|
* @brief Remove and convert 40 bits from the beginning of the buffer.
|
|
*
|
|
* Same idea as with net_buf_simple_pull(), but a helper for operating
|
|
* on 40-bit little endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 40-bit value converted from little endian to host endian.
|
|
*/
|
|
uint64_t net_buf_simple_pull_le40(struct net_buf_simple *buf);
|
|
|
|
/**
|
|
* @brief Remove and convert 40 bits from the beginning of the buffer.
|
|
*
|
|
* Same idea as with net_buf_simple_pull(), but a helper for operating
|
|
* on 40-bit big endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 40-bit value converted from big endian to host endian.
|
|
*/
|
|
uint64_t net_buf_simple_pull_be40(struct net_buf_simple *buf);
|
|
|
|
/**
|
|
* @brief Remove and convert 48 bits from the beginning of the buffer.
|
|
*
|
|
* Same idea as with net_buf_simple_pull(), but a helper for operating
|
|
* on 48-bit little endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 48-bit value converted from little endian to host endian.
|
|
*/
|
|
uint64_t net_buf_simple_pull_le48(struct net_buf_simple *buf);
|
|
|
|
/**
|
|
* @brief Remove and convert 48 bits from the beginning of the buffer.
|
|
*
|
|
* Same idea as with net_buf_simple_pull(), but a helper for operating
|
|
* on 48-bit big endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 48-bit value converted from big endian to host endian.
|
|
*/
|
|
uint64_t net_buf_simple_pull_be48(struct net_buf_simple *buf);
|
|
|
|
/**
|
|
* @brief Remove and convert 64 bits from the beginning of the buffer.
|
|
*
|
|
* Same idea as with net_buf_simple_pull(), but a helper for operating
|
|
* on 64-bit little endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 64-bit value converted from little endian to host endian.
|
|
*/
|
|
uint64_t net_buf_simple_pull_le64(struct net_buf_simple *buf);
|
|
|
|
/**
|
|
* @brief Remove and convert 64 bits from the beginning of the buffer.
|
|
*
|
|
* Same idea as with net_buf_simple_pull(), but a helper for operating
|
|
* on 64-bit big endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 64-bit value converted from big endian to host endian.
|
|
*/
|
|
uint64_t net_buf_simple_pull_be64(struct net_buf_simple *buf);
|
|
|
|
/**
|
|
* @brief Get the tail pointer for a buffer.
|
|
*
|
|
* Get a pointer to the end of the data in a buffer.
|
|
*
|
|
* @param buf Buffer.
|
|
*
|
|
* @return Tail pointer for the buffer.
|
|
*/
|
|
static inline uint8_t *net_buf_simple_tail(const struct net_buf_simple *buf)
|
|
{
|
|
return buf->data + buf->len;
|
|
}
|
|
|
|
/**
|
|
* @brief Check buffer headroom.
|
|
*
|
|
* Check how much free space there is in the beginning of the buffer.
|
|
*
|
|
* buf A valid pointer on a buffer
|
|
*
|
|
* @return Number of bytes available in the beginning of the buffer.
|
|
*/
|
|
size_t net_buf_simple_headroom(const struct net_buf_simple *buf);
|
|
|
|
/**
|
|
* @brief Check buffer tailroom.
|
|
*
|
|
* Check how much free space there is at the end of the buffer.
|
|
*
|
|
* @param buf A valid pointer on a buffer
|
|
*
|
|
* @return Number of bytes available at the end of the buffer.
|
|
*/
|
|
size_t net_buf_simple_tailroom(const struct net_buf_simple *buf);
|
|
|
|
/**
|
|
* @brief Check maximum net_buf_simple::len value.
|
|
*
|
|
* This value is depending on the number of bytes being reserved as headroom.
|
|
*
|
|
* @param buf A valid pointer on a buffer
|
|
*
|
|
* @return Number of bytes usable behind the net_buf_simple::data pointer.
|
|
*/
|
|
uint16_t net_buf_simple_max_len(const struct net_buf_simple *buf);
|
|
|
|
/**
|
|
* @brief Parsing state of a buffer.
|
|
*
|
|
* This is used for temporarily storing the parsing state of a buffer
|
|
* while giving control of the parsing to a routine which we don't
|
|
* control.
|
|
*/
|
|
struct net_buf_simple_state {
|
|
/** Offset of the data pointer from the beginning of the storage */
|
|
uint16_t offset;
|
|
/** Length of data */
|
|
uint16_t len;
|
|
};
|
|
|
|
/**
|
|
* @brief Save the parsing state of a buffer.
|
|
*
|
|
* Saves the parsing state of a buffer so it can be restored later.
|
|
*
|
|
* @param buf Buffer from which the state should be saved.
|
|
* @param state Storage for the state.
|
|
*/
|
|
static inline void net_buf_simple_save(const struct net_buf_simple *buf,
|
|
struct net_buf_simple_state *state)
|
|
{
|
|
state->offset = (uint16_t)net_buf_simple_headroom(buf);
|
|
state->len = buf->len;
|
|
}
|
|
|
|
/**
|
|
* @brief Restore the parsing state of a buffer.
|
|
*
|
|
* Restores the parsing state of a buffer from a state previously stored
|
|
* by net_buf_simple_save().
|
|
*
|
|
* @param buf Buffer to which the state should be restored.
|
|
* @param state Stored state.
|
|
*/
|
|
static inline void net_buf_simple_restore(struct net_buf_simple *buf,
|
|
struct net_buf_simple_state *state)
|
|
{
|
|
buf->data = buf->__buf + state->offset;
|
|
buf->len = state->len;
|
|
}
|
|
|
|
/**
|
|
* Flag indicating that the buffer's associated data pointer, points to
|
|
* externally allocated memory. Therefore once ref goes down to zero, the
|
|
* pointed data will not need to be deallocated. This never needs to be
|
|
* explicitly set or unset by the net_buf API user. Such net_buf is
|
|
* exclusively instantiated via net_buf_alloc_with_data() function.
|
|
* Reference count mechanism however will behave the same way, and ref
|
|
* count going to 0 will free the net_buf but no the data pointer in it.
|
|
*/
|
|
#define NET_BUF_EXTERNAL_DATA BIT(0)
|
|
|
|
/**
|
|
* @brief Network buffer representation.
|
|
*
|
|
* This struct is used to represent network buffers. Such buffers are
|
|
* normally defined through the NET_BUF_POOL_*_DEFINE() APIs and allocated
|
|
* using the net_buf_alloc() API.
|
|
*/
|
|
struct net_buf {
|
|
/** Allow placing the buffer into sys_slist_t */
|
|
sys_snode_t node;
|
|
|
|
/** Fragments associated with this buffer. */
|
|
struct net_buf *frags;
|
|
|
|
/** Reference count. */
|
|
uint8_t ref;
|
|
|
|
/** Bit-field of buffer flags. */
|
|
uint8_t flags;
|
|
|
|
/** Where the buffer should go when freed up. */
|
|
uint8_t pool_id;
|
|
|
|
/** Size of user data on this buffer */
|
|
uint8_t user_data_size;
|
|
|
|
/** Union for convenience access to the net_buf_simple members, also
|
|
* preserving the old API.
|
|
*/
|
|
union {
|
|
/* The ABI of this struct must match net_buf_simple */
|
|
struct {
|
|
/** Pointer to the start of data in the buffer. */
|
|
uint8_t *data;
|
|
|
|
/** Length of the data behind the data pointer. */
|
|
uint16_t len;
|
|
|
|
/** Amount of data that this buffer can store. */
|
|
uint16_t size;
|
|
|
|
/** Start of the data storage. Not to be accessed
|
|
* directly (the data pointer should be used
|
|
* instead).
|
|
*/
|
|
uint8_t *__buf;
|
|
};
|
|
|
|
/** @cond INTERNAL_HIDDEN */
|
|
struct net_buf_simple b;
|
|
/** @endcond */
|
|
};
|
|
|
|
/** System metadata for this buffer. Cleared on allocation. */
|
|
uint8_t user_data[] __net_buf_align;
|
|
};
|
|
|
|
/** @cond INTERNAL_HIDDEN */
|
|
|
|
struct net_buf_data_cb {
|
|
uint8_t * __must_check (*alloc)(struct net_buf *buf, size_t *size,
|
|
k_timeout_t timeout);
|
|
uint8_t * __must_check (*ref)(struct net_buf *buf, uint8_t *data);
|
|
void (*unref)(struct net_buf *buf, uint8_t *data);
|
|
};
|
|
|
|
struct net_buf_data_alloc {
|
|
const struct net_buf_data_cb *cb;
|
|
void *alloc_data;
|
|
size_t max_alloc_size;
|
|
};
|
|
|
|
/** @endcond */
|
|
|
|
/**
|
|
* @brief Network buffer pool representation.
|
|
*
|
|
* This struct is used to represent a pool of network buffers.
|
|
*/
|
|
struct net_buf_pool {
|
|
/** LIFO to place the buffer into when free */
|
|
struct k_lifo free;
|
|
|
|
/** To prevent concurrent access/modifications */
|
|
struct k_spinlock lock;
|
|
|
|
/** Number of buffers in pool */
|
|
const uint16_t buf_count;
|
|
|
|
/** Number of uninitialized buffers */
|
|
uint16_t uninit_count;
|
|
|
|
/** Size of user data allocated to this pool */
|
|
uint8_t user_data_size;
|
|
|
|
#if defined(CONFIG_NET_BUF_POOL_USAGE)
|
|
/** Amount of available buffers in the pool. */
|
|
atomic_t avail_count;
|
|
|
|
/** Total size of the pool. */
|
|
const uint16_t pool_size;
|
|
|
|
/** Name of the pool. Used when printing pool information. */
|
|
const char *name;
|
|
#endif /* CONFIG_NET_BUF_POOL_USAGE */
|
|
|
|
/** Optional destroy callback when buffer is freed. */
|
|
void (*const destroy)(struct net_buf *buf);
|
|
|
|
/** Data allocation handlers. */
|
|
const struct net_buf_data_alloc *alloc;
|
|
|
|
/** Start of buffer storage array */
|
|
struct net_buf * const __bufs;
|
|
};
|
|
|
|
/** @cond INTERNAL_HIDDEN */
|
|
#define NET_BUF_POOL_USAGE_INIT(_pool, _count) \
|
|
IF_ENABLED(CONFIG_NET_BUF_POOL_USAGE, (.avail_count = ATOMIC_INIT(_count),)) \
|
|
IF_ENABLED(CONFIG_NET_BUF_POOL_USAGE, (.name = STRINGIFY(_pool),))
|
|
|
|
#define NET_BUF_POOL_INITIALIZER(_pool, _alloc, _bufs, _count, _ud_size, _destroy) \
|
|
{ \
|
|
.free = Z_LIFO_INITIALIZER(_pool.free), \
|
|
.lock = { }, \
|
|
.buf_count = _count, \
|
|
.uninit_count = _count, \
|
|
.user_data_size = _ud_size, \
|
|
NET_BUF_POOL_USAGE_INIT(_pool, _count) \
|
|
.destroy = _destroy, \
|
|
.alloc = _alloc, \
|
|
.__bufs = (struct net_buf *)_bufs, \
|
|
}
|
|
|
|
#define _NET_BUF_ARRAY_DEFINE(_name, _count, _ud_size) \
|
|
struct _net_buf_##_name { uint8_t b[sizeof(struct net_buf)]; \
|
|
uint8_t ud[_ud_size]; } __net_buf_align; \
|
|
BUILD_ASSERT(_ud_size <= UINT8_MAX); \
|
|
BUILD_ASSERT(offsetof(struct net_buf, user_data) == \
|
|
offsetof(struct _net_buf_##_name, ud), "Invalid offset"); \
|
|
BUILD_ASSERT(__alignof__(struct net_buf) == \
|
|
__alignof__(struct _net_buf_##_name), "Invalid alignment"); \
|
|
BUILD_ASSERT(sizeof(struct _net_buf_##_name) == \
|
|
ROUND_UP(sizeof(struct net_buf) + _ud_size, __alignof__(struct net_buf)), \
|
|
"Size cannot be determined"); \
|
|
static struct _net_buf_##_name _net_buf_##_name[_count] __noinit
|
|
|
|
extern const struct net_buf_data_alloc net_buf_heap_alloc;
|
|
/** @endcond */
|
|
|
|
/**
|
|
*
|
|
* @brief Define a new pool for buffers using the heap for the data.
|
|
*
|
|
* Defines a net_buf_pool struct and the necessary memory storage (array of
|
|
* structs) for the needed amount of buffers. After this, the buffers can be
|
|
* accessed from the pool through net_buf_alloc. The pool is defined as a
|
|
* static variable, so if it needs to be exported outside the current module
|
|
* this needs to happen with the help of a separate pointer rather than an
|
|
* extern declaration.
|
|
*
|
|
* The data payload of the buffers will be allocated from the heap using
|
|
* k_malloc, so CONFIG_HEAP_MEM_POOL_SIZE must be set to a positive value.
|
|
* This kind of pool does not support blocking on the data allocation, so
|
|
* the timeout passed to net_buf_alloc will be always treated as K_NO_WAIT
|
|
* when trying to allocate the data. This means that allocation failures,
|
|
* i.e. NULL returns, must always be handled cleanly.
|
|
*
|
|
* If provided with a custom destroy callback, this callback is
|
|
* responsible for eventually calling net_buf_destroy() to complete the
|
|
* process of returning the buffer to the pool.
|
|
*
|
|
* @param _name Name of the pool variable.
|
|
* @param _count Number of buffers in the pool.
|
|
* @param _ud_size User data space to reserve per buffer.
|
|
* @param _destroy Optional destroy callback when buffer is freed.
|
|
*/
|
|
#define NET_BUF_POOL_HEAP_DEFINE(_name, _count, _ud_size, _destroy) \
|
|
_NET_BUF_ARRAY_DEFINE(_name, _count, _ud_size); \
|
|
static STRUCT_SECTION_ITERABLE(net_buf_pool, _name) = \
|
|
NET_BUF_POOL_INITIALIZER(_name, &net_buf_heap_alloc, \
|
|
_net_buf_##_name, _count, _ud_size, \
|
|
_destroy)
|
|
|
|
/** @cond INTERNAL_HIDDEN */
|
|
|
|
struct net_buf_pool_fixed {
|
|
uint8_t *data_pool;
|
|
};
|
|
|
|
extern const struct net_buf_data_cb net_buf_fixed_cb;
|
|
|
|
/** @endcond */
|
|
|
|
/**
|
|
*
|
|
* @brief Define a new pool for buffers based on fixed-size data
|
|
*
|
|
* Defines a net_buf_pool struct and the necessary memory storage (array of
|
|
* structs) for the needed amount of buffers. After this, the buffers can be
|
|
* accessed from the pool through net_buf_alloc. The pool is defined as a
|
|
* static variable, so if it needs to be exported outside the current module
|
|
* this needs to happen with the help of a separate pointer rather than an
|
|
* extern declaration.
|
|
*
|
|
* The data payload of the buffers will be allocated from a byte array
|
|
* of fixed sized chunks. This kind of pool does not support blocking on
|
|
* the data allocation, so the timeout passed to net_buf_alloc will be
|
|
* always treated as K_NO_WAIT when trying to allocate the data. This means
|
|
* that allocation failures, i.e. NULL returns, must always be handled
|
|
* cleanly.
|
|
*
|
|
* If provided with a custom destroy callback, this callback is
|
|
* responsible for eventually calling net_buf_destroy() to complete the
|
|
* process of returning the buffer to the pool.
|
|
*
|
|
* @param _name Name of the pool variable.
|
|
* @param _count Number of buffers in the pool.
|
|
* @param _data_size Maximum data payload per buffer.
|
|
* @param _ud_size User data space to reserve per buffer.
|
|
* @param _destroy Optional destroy callback when buffer is freed.
|
|
*/
|
|
#define NET_BUF_POOL_FIXED_DEFINE(_name, _count, _data_size, _ud_size, _destroy) \
|
|
_NET_BUF_ARRAY_DEFINE(_name, _count, _ud_size); \
|
|
static uint8_t __noinit net_buf_data_##_name[_count][_data_size] __net_buf_align; \
|
|
static const struct net_buf_pool_fixed net_buf_fixed_##_name = { \
|
|
.data_pool = (uint8_t *)net_buf_data_##_name, \
|
|
}; \
|
|
static const struct net_buf_data_alloc net_buf_fixed_alloc_##_name = { \
|
|
.cb = &net_buf_fixed_cb, \
|
|
.alloc_data = (void *)&net_buf_fixed_##_name, \
|
|
.max_alloc_size = _data_size, \
|
|
}; \
|
|
static STRUCT_SECTION_ITERABLE(net_buf_pool, _name) = \
|
|
NET_BUF_POOL_INITIALIZER(_name, &net_buf_fixed_alloc_##_name, \
|
|
_net_buf_##_name, _count, _ud_size, \
|
|
_destroy)
|
|
|
|
/** @cond INTERNAL_HIDDEN */
|
|
extern const struct net_buf_data_cb net_buf_var_cb;
|
|
/** @endcond */
|
|
|
|
/**
|
|
*
|
|
* @brief Define a new pool for buffers with variable size payloads
|
|
*
|
|
* Defines a net_buf_pool struct and the necessary memory storage (array of
|
|
* structs) for the needed amount of buffers. After this, the buffers can be
|
|
* accessed from the pool through net_buf_alloc. The pool is defined as a
|
|
* static variable, so if it needs to be exported outside the current module
|
|
* this needs to happen with the help of a separate pointer rather than an
|
|
* extern declaration.
|
|
*
|
|
* The data payload of the buffers will be based on a memory pool from which
|
|
* variable size payloads may be allocated.
|
|
*
|
|
* If provided with a custom destroy callback, this callback is
|
|
* responsible for eventually calling net_buf_destroy() to complete the
|
|
* process of returning the buffer to the pool.
|
|
*
|
|
* @param _name Name of the pool variable.
|
|
* @param _count Number of buffers in the pool.
|
|
* @param _data_size Total amount of memory available for data payloads.
|
|
* @param _ud_size User data space to reserve per buffer.
|
|
* @param _destroy Optional destroy callback when buffer is freed.
|
|
*/
|
|
#define NET_BUF_POOL_VAR_DEFINE(_name, _count, _data_size, _ud_size, _destroy) \
|
|
_NET_BUF_ARRAY_DEFINE(_name, _count, _ud_size); \
|
|
K_HEAP_DEFINE(net_buf_mem_pool_##_name, _data_size); \
|
|
static const struct net_buf_data_alloc net_buf_data_alloc_##_name = { \
|
|
.cb = &net_buf_var_cb, \
|
|
.alloc_data = &net_buf_mem_pool_##_name, \
|
|
.max_alloc_size = 0, \
|
|
}; \
|
|
static STRUCT_SECTION_ITERABLE(net_buf_pool, _name) = \
|
|
NET_BUF_POOL_INITIALIZER(_name, &net_buf_data_alloc_##_name, \
|
|
_net_buf_##_name, _count, _ud_size, \
|
|
_destroy)
|
|
|
|
/**
|
|
*
|
|
* @brief Define a new pool for buffers
|
|
*
|
|
* Defines a net_buf_pool struct and the necessary memory storage (array of
|
|
* structs) for the needed amount of buffers. After this,the buffers can be
|
|
* accessed from the pool through net_buf_alloc. The pool is defined as a
|
|
* static variable, so if it needs to be exported outside the current module
|
|
* this needs to happen with the help of a separate pointer rather than an
|
|
* extern declaration.
|
|
*
|
|
* If provided with a custom destroy callback this callback is
|
|
* responsible for eventually calling net_buf_destroy() to complete the
|
|
* process of returning the buffer to the pool.
|
|
*
|
|
* @param _name Name of the pool variable.
|
|
* @param _count Number of buffers in the pool.
|
|
* @param _size Maximum data size for each buffer.
|
|
* @param _ud_size Amount of user data space to reserve.
|
|
* @param _destroy Optional destroy callback when buffer is freed.
|
|
*/
|
|
#define NET_BUF_POOL_DEFINE(_name, _count, _size, _ud_size, _destroy) \
|
|
NET_BUF_POOL_FIXED_DEFINE(_name, _count, _size, _ud_size, _destroy)
|
|
|
|
/**
|
|
* @brief Looks up a pool based on its ID.
|
|
*
|
|
* @param id Pool ID (e.g. from buf->pool_id).
|
|
*
|
|
* @return Pointer to pool.
|
|
*/
|
|
struct net_buf_pool *net_buf_pool_get(int id);
|
|
|
|
/**
|
|
* @brief Get a zero-based index for a buffer.
|
|
*
|
|
* This function will translate a buffer into a zero-based index,
|
|
* based on its placement in its buffer pool. This can be useful if you
|
|
* want to associate an external array of meta-data contexts with the
|
|
* buffers of a pool.
|
|
*
|
|
* @param buf Network buffer.
|
|
*
|
|
* @return Zero-based index for the buffer.
|
|
*/
|
|
int net_buf_id(const struct net_buf *buf);
|
|
|
|
/**
|
|
* @brief Allocate a new fixed buffer from a pool.
|
|
*
|
|
* @note Some types of data allocators do not support
|
|
* blocking (such as the HEAP type). In this case it's still possible
|
|
* for net_buf_alloc() to fail (return NULL) even if it was given
|
|
* K_FOREVER.
|
|
*
|
|
* @note The timeout value will be overridden to K_NO_WAIT if called from the
|
|
* system workqueue.
|
|
*
|
|
* @param pool Which pool to allocate the buffer from.
|
|
* @param timeout Affects the action taken should the pool be empty.
|
|
* If K_NO_WAIT, then return immediately. If K_FOREVER, then
|
|
* wait as long as necessary. Otherwise, wait until the specified
|
|
* timeout.
|
|
*
|
|
* @return New buffer or NULL if out of buffers.
|
|
*/
|
|
#if defined(CONFIG_NET_BUF_LOG)
|
|
struct net_buf * __must_check net_buf_alloc_fixed_debug(struct net_buf_pool *pool,
|
|
k_timeout_t timeout,
|
|
const char *func,
|
|
int line);
|
|
#define net_buf_alloc_fixed(_pool, _timeout) \
|
|
net_buf_alloc_fixed_debug(_pool, _timeout, __func__, __LINE__)
|
|
#else
|
|
struct net_buf * __must_check net_buf_alloc_fixed(struct net_buf_pool *pool,
|
|
k_timeout_t timeout);
|
|
#endif
|
|
|
|
/**
|
|
* @copydetails net_buf_alloc_fixed
|
|
*/
|
|
static inline struct net_buf * __must_check net_buf_alloc(struct net_buf_pool *pool,
|
|
k_timeout_t timeout)
|
|
{
|
|
return net_buf_alloc_fixed(pool, timeout);
|
|
}
|
|
|
|
/**
|
|
* @brief Allocate a new variable length buffer from a pool.
|
|
*
|
|
* @note Some types of data allocators do not support
|
|
* blocking (such as the HEAP type). In this case it's still possible
|
|
* for net_buf_alloc() to fail (return NULL) even if it was given
|
|
* K_FOREVER.
|
|
*
|
|
* @note The timeout value will be overridden to K_NO_WAIT if called from the
|
|
* system workqueue.
|
|
*
|
|
* @param pool Which pool to allocate the buffer from.
|
|
* @param size Amount of data the buffer must be able to fit.
|
|
* @param timeout Affects the action taken should the pool be empty.
|
|
* If K_NO_WAIT, then return immediately. If K_FOREVER, then
|
|
* wait as long as necessary. Otherwise, wait until the specified
|
|
* timeout.
|
|
*
|
|
* @return New buffer or NULL if out of buffers.
|
|
*/
|
|
#if defined(CONFIG_NET_BUF_LOG)
|
|
struct net_buf * __must_check net_buf_alloc_len_debug(struct net_buf_pool *pool,
|
|
size_t size,
|
|
k_timeout_t timeout,
|
|
const char *func,
|
|
int line);
|
|
#define net_buf_alloc_len(_pool, _size, _timeout) \
|
|
net_buf_alloc_len_debug(_pool, _size, _timeout, __func__, __LINE__)
|
|
#else
|
|
struct net_buf * __must_check net_buf_alloc_len(struct net_buf_pool *pool,
|
|
size_t size,
|
|
k_timeout_t timeout);
|
|
#endif
|
|
|
|
/**
|
|
* @brief Allocate a new buffer from a pool but with external data pointer.
|
|
*
|
|
* Allocate a new buffer from a pool, where the data pointer comes from the
|
|
* user and not from the pool.
|
|
*
|
|
* @note Some types of data allocators do not support
|
|
* blocking (such as the HEAP type). In this case it's still possible
|
|
* for net_buf_alloc() to fail (return NULL) even if it was given
|
|
* K_FOREVER.
|
|
*
|
|
* @note The timeout value will be overridden to K_NO_WAIT if called from the
|
|
* system workqueue.
|
|
*
|
|
* @param pool Which pool to allocate the buffer from.
|
|
* @param data External data pointer
|
|
* @param size Amount of data the pointed data buffer if able to fit.
|
|
* @param timeout Affects the action taken should the pool be empty.
|
|
* If K_NO_WAIT, then return immediately. If K_FOREVER, then
|
|
* wait as long as necessary. Otherwise, wait until the specified
|
|
* timeout.
|
|
*
|
|
* @return New buffer or NULL if out of buffers.
|
|
*/
|
|
#if defined(CONFIG_NET_BUF_LOG)
|
|
struct net_buf * __must_check net_buf_alloc_with_data_debug(struct net_buf_pool *pool,
|
|
void *data, size_t size,
|
|
k_timeout_t timeout,
|
|
const char *func, int line);
|
|
#define net_buf_alloc_with_data(_pool, _data_, _size, _timeout) \
|
|
net_buf_alloc_with_data_debug(_pool, _data_, _size, _timeout, \
|
|
__func__, __LINE__)
|
|
#else
|
|
struct net_buf * __must_check net_buf_alloc_with_data(struct net_buf_pool *pool,
|
|
void *data, size_t size,
|
|
k_timeout_t timeout);
|
|
#endif
|
|
|
|
/**
|
|
* @brief Get a buffer from a FIFO.
|
|
*
|
|
* @deprecated Use @a k_fifo_get() instead.
|
|
*
|
|
* @param fifo Which FIFO to take the buffer from.
|
|
* @param timeout Affects the action taken should the FIFO be empty.
|
|
* If K_NO_WAIT, then return immediately. If K_FOREVER, then wait as
|
|
* long as necessary. Otherwise, wait until the specified timeout.
|
|
*
|
|
* @return New buffer or NULL if the FIFO is empty.
|
|
*/
|
|
#if defined(CONFIG_NET_BUF_LOG)
|
|
__deprecated struct net_buf * __must_check net_buf_get_debug(struct k_fifo *fifo,
|
|
k_timeout_t timeout,
|
|
const char *func, int line);
|
|
#define net_buf_get(_fifo, _timeout) \
|
|
net_buf_get_debug(_fifo, _timeout, __func__, __LINE__)
|
|
#else
|
|
__deprecated struct net_buf * __must_check net_buf_get(struct k_fifo *fifo,
|
|
k_timeout_t timeout);
|
|
#endif
|
|
|
|
/**
|
|
* @brief Destroy buffer from custom destroy callback
|
|
*
|
|
* This helper is only intended to be used from custom destroy callbacks.
|
|
* If no custom destroy callback is given to NET_BUF_POOL_*_DEFINE() then
|
|
* there is no need to use this API.
|
|
*
|
|
* @param buf Buffer to destroy.
|
|
*/
|
|
static inline void net_buf_destroy(struct net_buf *buf)
|
|
{
|
|
struct net_buf_pool *pool = net_buf_pool_get(buf->pool_id);
|
|
|
|
if (buf->__buf) {
|
|
if (!(buf->flags & NET_BUF_EXTERNAL_DATA)) {
|
|
pool->alloc->cb->unref(buf, buf->__buf);
|
|
}
|
|
buf->__buf = NULL;
|
|
}
|
|
|
|
k_lifo_put(&pool->free, buf);
|
|
}
|
|
|
|
/**
|
|
* @brief Reset buffer
|
|
*
|
|
* Reset buffer data and flags so it can be reused for other purposes.
|
|
*
|
|
* @param buf Buffer to reset.
|
|
*/
|
|
void net_buf_reset(struct net_buf *buf);
|
|
|
|
/**
|
|
* @brief Initialize buffer with the given headroom.
|
|
*
|
|
* The buffer is not expected to contain any data when this API is called.
|
|
*
|
|
* @param buf Buffer to initialize.
|
|
* @param reserve How much headroom to reserve.
|
|
*/
|
|
void net_buf_simple_reserve(struct net_buf_simple *buf, size_t reserve);
|
|
|
|
/**
|
|
* @brief Put a buffer into a list
|
|
*
|
|
* @param list Which list to append the buffer to.
|
|
* @param buf Buffer.
|
|
*/
|
|
void net_buf_slist_put(sys_slist_t *list, struct net_buf *buf);
|
|
|
|
/**
|
|
* @brief Get a buffer from a list.
|
|
*
|
|
* @param list Which list to take the buffer from.
|
|
*
|
|
* @return New buffer or NULL if the FIFO is empty.
|
|
*/
|
|
struct net_buf * __must_check net_buf_slist_get(sys_slist_t *list);
|
|
|
|
/**
|
|
* @brief Put a buffer to the end of a FIFO.
|
|
*
|
|
* @deprecated Use @a k_fifo_put() instead.
|
|
*
|
|
* @param fifo Which FIFO to put the buffer to.
|
|
* @param buf Buffer.
|
|
*/
|
|
__deprecated void net_buf_put(struct k_fifo *fifo, struct net_buf *buf);
|
|
|
|
/**
|
|
* @brief Decrements the reference count of a buffer.
|
|
*
|
|
* The buffer is put back into the pool if the reference count reaches zero.
|
|
*
|
|
* @param buf A valid pointer on a buffer
|
|
*/
|
|
#if defined(CONFIG_NET_BUF_LOG)
|
|
void net_buf_unref_debug(struct net_buf *buf, const char *func, int line);
|
|
#define net_buf_unref(_buf) \
|
|
net_buf_unref_debug(_buf, __func__, __LINE__)
|
|
#else
|
|
void net_buf_unref(struct net_buf *buf);
|
|
#endif
|
|
|
|
/**
|
|
* @brief Increment the reference count of a buffer.
|
|
*
|
|
* @param buf A valid pointer on a buffer
|
|
*
|
|
* @return the buffer newly referenced
|
|
*/
|
|
struct net_buf * __must_check net_buf_ref(struct net_buf *buf);
|
|
|
|
/**
|
|
* @brief Clone buffer
|
|
*
|
|
* Duplicate given buffer including any (user) data and headers currently stored.
|
|
*
|
|
* @param buf A valid pointer on a buffer
|
|
* @param timeout Affects the action taken should the pool be empty.
|
|
* If K_NO_WAIT, then return immediately. If K_FOREVER, then
|
|
* wait as long as necessary. Otherwise, wait until the specified
|
|
* timeout.
|
|
*
|
|
* @return Cloned buffer or NULL if out of buffers.
|
|
*/
|
|
struct net_buf * __must_check net_buf_clone(struct net_buf *buf,
|
|
k_timeout_t timeout);
|
|
|
|
/**
|
|
* @brief Get a pointer to the user data of a buffer.
|
|
*
|
|
* @param buf A valid pointer on a buffer
|
|
*
|
|
* @return Pointer to the user data of the buffer.
|
|
*/
|
|
static inline void * __must_check net_buf_user_data(const struct net_buf *buf)
|
|
{
|
|
return (void *)buf->user_data;
|
|
}
|
|
|
|
/**
|
|
* @brief Copy user data from one to another buffer.
|
|
*
|
|
* @param dst A valid pointer to a buffer gettings its user data overwritten.
|
|
* @param src A valid pointer to a buffer gettings its user data copied. User data size must be
|
|
* equal to or exceed @a dst.
|
|
*
|
|
* @return 0 on success or negative error number on failure.
|
|
*/
|
|
int net_buf_user_data_copy(struct net_buf *dst, const struct net_buf *src);
|
|
|
|
/**
|
|
* @brief Initialize buffer with the given headroom.
|
|
*
|
|
* The buffer is not expected to contain any data when this API is called.
|
|
*
|
|
* @param buf Buffer to initialize.
|
|
* @param reserve How much headroom to reserve.
|
|
*/
|
|
static inline void net_buf_reserve(struct net_buf *buf, size_t reserve)
|
|
{
|
|
net_buf_simple_reserve(&buf->b, reserve);
|
|
}
|
|
|
|
/**
|
|
* @brief Prepare data to be added at the end of the buffer
|
|
*
|
|
* Increments the data length of a buffer to account for more data
|
|
* at the end.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param len Number of bytes to increment the length with.
|
|
*
|
|
* @return The original tail of the buffer.
|
|
*/
|
|
static inline void *net_buf_add(struct net_buf *buf, size_t len)
|
|
{
|
|
return net_buf_simple_add(&buf->b, len);
|
|
}
|
|
|
|
/**
|
|
* @brief Copies the given number of bytes to the end of the buffer
|
|
*
|
|
* Increments the data length of the buffer to account for more data at
|
|
* the end.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param mem Location of data to be added.
|
|
* @param len Length of data to be added
|
|
*
|
|
* @return The original tail of the buffer.
|
|
*/
|
|
static inline void *net_buf_add_mem(struct net_buf *buf, const void *mem,
|
|
size_t len)
|
|
{
|
|
return net_buf_simple_add_mem(&buf->b, mem, len);
|
|
}
|
|
|
|
/**
|
|
* @brief Add (8-bit) byte at the end of the buffer
|
|
*
|
|
* Increments the data length of the buffer to account for more data at
|
|
* the end.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val byte value to be added.
|
|
*
|
|
* @return Pointer to the value added
|
|
*/
|
|
static inline uint8_t *net_buf_add_u8(struct net_buf *buf, uint8_t val)
|
|
{
|
|
return net_buf_simple_add_u8(&buf->b, val);
|
|
}
|
|
|
|
/**
|
|
* @brief Add 16-bit value at the end of the buffer
|
|
*
|
|
* Adds 16-bit value in little endian format at the end of buffer.
|
|
* Increments the data length of a buffer to account for more data
|
|
* at the end.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 16-bit value to be added.
|
|
*/
|
|
static inline void net_buf_add_le16(struct net_buf *buf, uint16_t val)
|
|
{
|
|
net_buf_simple_add_le16(&buf->b, val);
|
|
}
|
|
|
|
/**
|
|
* @brief Add 16-bit value at the end of the buffer
|
|
*
|
|
* Adds 16-bit value in big endian format at the end of buffer.
|
|
* Increments the data length of a buffer to account for more data
|
|
* at the end.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 16-bit value to be added.
|
|
*/
|
|
static inline void net_buf_add_be16(struct net_buf *buf, uint16_t val)
|
|
{
|
|
net_buf_simple_add_be16(&buf->b, val);
|
|
}
|
|
|
|
/**
|
|
* @brief Add 24-bit value at the end of the buffer
|
|
*
|
|
* Adds 24-bit value in little endian format at the end of buffer.
|
|
* Increments the data length of a buffer to account for more data
|
|
* at the end.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 24-bit value to be added.
|
|
*/
|
|
static inline void net_buf_add_le24(struct net_buf *buf, uint32_t val)
|
|
{
|
|
net_buf_simple_add_le24(&buf->b, val);
|
|
}
|
|
|
|
/**
|
|
* @brief Add 24-bit value at the end of the buffer
|
|
*
|
|
* Adds 24-bit value in big endian format at the end of buffer.
|
|
* Increments the data length of a buffer to account for more data
|
|
* at the end.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 24-bit value to be added.
|
|
*/
|
|
static inline void net_buf_add_be24(struct net_buf *buf, uint32_t val)
|
|
{
|
|
net_buf_simple_add_be24(&buf->b, val);
|
|
}
|
|
|
|
/**
|
|
* @brief Add 32-bit value at the end of the buffer
|
|
*
|
|
* Adds 32-bit value in little endian format at the end of buffer.
|
|
* Increments the data length of a buffer to account for more data
|
|
* at the end.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 32-bit value to be added.
|
|
*/
|
|
static inline void net_buf_add_le32(struct net_buf *buf, uint32_t val)
|
|
{
|
|
net_buf_simple_add_le32(&buf->b, val);
|
|
}
|
|
|
|
/**
|
|
* @brief Add 32-bit value at the end of the buffer
|
|
*
|
|
* Adds 32-bit value in big endian format at the end of buffer.
|
|
* Increments the data length of a buffer to account for more data
|
|
* at the end.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 32-bit value to be added.
|
|
*/
|
|
static inline void net_buf_add_be32(struct net_buf *buf, uint32_t val)
|
|
{
|
|
net_buf_simple_add_be32(&buf->b, val);
|
|
}
|
|
|
|
/**
|
|
* @brief Add 40-bit value at the end of the buffer
|
|
*
|
|
* Adds 40-bit value in little endian format at the end of buffer.
|
|
* Increments the data length of a buffer to account for more data
|
|
* at the end.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 40-bit value to be added.
|
|
*/
|
|
static inline void net_buf_add_le40(struct net_buf *buf, uint64_t val)
|
|
{
|
|
net_buf_simple_add_le40(&buf->b, val);
|
|
}
|
|
|
|
/**
|
|
* @brief Add 40-bit value at the end of the buffer
|
|
*
|
|
* Adds 40-bit value in big endian format at the end of buffer.
|
|
* Increments the data length of a buffer to account for more data
|
|
* at the end.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 40-bit value to be added.
|
|
*/
|
|
static inline void net_buf_add_be40(struct net_buf *buf, uint64_t val)
|
|
{
|
|
net_buf_simple_add_be40(&buf->b, val);
|
|
}
|
|
|
|
/**
|
|
* @brief Add 48-bit value at the end of the buffer
|
|
*
|
|
* Adds 48-bit value in little endian format at the end of buffer.
|
|
* Increments the data length of a buffer to account for more data
|
|
* at the end.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 48-bit value to be added.
|
|
*/
|
|
static inline void net_buf_add_le48(struct net_buf *buf, uint64_t val)
|
|
{
|
|
net_buf_simple_add_le48(&buf->b, val);
|
|
}
|
|
|
|
/**
|
|
* @brief Add 48-bit value at the end of the buffer
|
|
*
|
|
* Adds 48-bit value in big endian format at the end of buffer.
|
|
* Increments the data length of a buffer to account for more data
|
|
* at the end.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 48-bit value to be added.
|
|
*/
|
|
static inline void net_buf_add_be48(struct net_buf *buf, uint64_t val)
|
|
{
|
|
net_buf_simple_add_be48(&buf->b, val);
|
|
}
|
|
|
|
/**
|
|
* @brief Add 64-bit value at the end of the buffer
|
|
*
|
|
* Adds 64-bit value in little endian format at the end of buffer.
|
|
* Increments the data length of a buffer to account for more data
|
|
* at the end.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 64-bit value to be added.
|
|
*/
|
|
static inline void net_buf_add_le64(struct net_buf *buf, uint64_t val)
|
|
{
|
|
net_buf_simple_add_le64(&buf->b, val);
|
|
}
|
|
|
|
/**
|
|
* @brief Add 64-bit value at the end of the buffer
|
|
*
|
|
* Adds 64-bit value in big endian format at the end of buffer.
|
|
* Increments the data length of a buffer to account for more data
|
|
* at the end.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 64-bit value to be added.
|
|
*/
|
|
static inline void net_buf_add_be64(struct net_buf *buf, uint64_t val)
|
|
{
|
|
net_buf_simple_add_be64(&buf->b, val);
|
|
}
|
|
|
|
/**
|
|
* @brief Remove data from the end of the buffer.
|
|
*
|
|
* Removes data from the end of the buffer by modifying the buffer length.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param len Number of bytes to remove.
|
|
*
|
|
* @return New end of the buffer data.
|
|
*/
|
|
static inline void *net_buf_remove_mem(struct net_buf *buf, size_t len)
|
|
{
|
|
return net_buf_simple_remove_mem(&buf->b, len);
|
|
}
|
|
|
|
/**
|
|
* @brief Remove a 8-bit value from the end of the buffer
|
|
*
|
|
* Same idea as with net_buf_remove_mem(), but a helper for operating on
|
|
* 8-bit values.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return The 8-bit removed value
|
|
*/
|
|
static inline uint8_t net_buf_remove_u8(struct net_buf *buf)
|
|
{
|
|
return net_buf_simple_remove_u8(&buf->b);
|
|
}
|
|
|
|
/**
|
|
* @brief Remove and convert 16 bits from the end of the buffer.
|
|
*
|
|
* Same idea as with net_buf_remove_mem(), but a helper for operating on
|
|
* 16-bit little endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 16-bit value converted from little endian to host endian.
|
|
*/
|
|
static inline uint16_t net_buf_remove_le16(struct net_buf *buf)
|
|
{
|
|
return net_buf_simple_remove_le16(&buf->b);
|
|
}
|
|
|
|
/**
|
|
* @brief Remove and convert 16 bits from the end of the buffer.
|
|
*
|
|
* Same idea as with net_buf_remove_mem(), but a helper for operating on
|
|
* 16-bit big endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 16-bit value converted from big endian to host endian.
|
|
*/
|
|
static inline uint16_t net_buf_remove_be16(struct net_buf *buf)
|
|
{
|
|
return net_buf_simple_remove_be16(&buf->b);
|
|
}
|
|
|
|
/**
|
|
* @brief Remove and convert 24 bits from the end of the buffer.
|
|
*
|
|
* Same idea as with net_buf_remove_mem(), but a helper for operating on
|
|
* 24-bit big endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 24-bit value converted from big endian to host endian.
|
|
*/
|
|
static inline uint32_t net_buf_remove_be24(struct net_buf *buf)
|
|
{
|
|
return net_buf_simple_remove_be24(&buf->b);
|
|
}
|
|
|
|
/**
|
|
* @brief Remove and convert 24 bits from the end of the buffer.
|
|
*
|
|
* Same idea as with net_buf_remove_mem(), but a helper for operating on
|
|
* 24-bit little endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 24-bit value converted from little endian to host endian.
|
|
*/
|
|
static inline uint32_t net_buf_remove_le24(struct net_buf *buf)
|
|
{
|
|
return net_buf_simple_remove_le24(&buf->b);
|
|
}
|
|
|
|
/**
|
|
* @brief Remove and convert 32 bits from the end of the buffer.
|
|
*
|
|
* Same idea as with net_buf_remove_mem(), but a helper for operating on
|
|
* 32-bit little endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 32-bit value converted from little endian to host endian.
|
|
*/
|
|
static inline uint32_t net_buf_remove_le32(struct net_buf *buf)
|
|
{
|
|
return net_buf_simple_remove_le32(&buf->b);
|
|
}
|
|
|
|
/**
|
|
* @brief Remove and convert 32 bits from the end of the buffer.
|
|
*
|
|
* Same idea as with net_buf_remove_mem(), but a helper for operating on
|
|
* 32-bit big endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer
|
|
*
|
|
* @return 32-bit value converted from big endian to host endian.
|
|
*/
|
|
static inline uint32_t net_buf_remove_be32(struct net_buf *buf)
|
|
{
|
|
return net_buf_simple_remove_be32(&buf->b);
|
|
}
|
|
|
|
/**
|
|
* @brief Remove and convert 40 bits from the end of the buffer.
|
|
*
|
|
* Same idea as with net_buf_remove_mem(), but a helper for operating on
|
|
* 40-bit little endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 40-bit value converted from little endian to host endian.
|
|
*/
|
|
static inline uint64_t net_buf_remove_le40(struct net_buf *buf)
|
|
{
|
|
return net_buf_simple_remove_le40(&buf->b);
|
|
}
|
|
|
|
/**
|
|
* @brief Remove and convert 40 bits from the end of the buffer.
|
|
*
|
|
* Same idea as with net_buf_remove_mem(), but a helper for operating on
|
|
* 40-bit big endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer
|
|
*
|
|
* @return 40-bit value converted from big endian to host endian.
|
|
*/
|
|
static inline uint64_t net_buf_remove_be40(struct net_buf *buf)
|
|
{
|
|
return net_buf_simple_remove_be40(&buf->b);
|
|
}
|
|
|
|
/**
|
|
* @brief Remove and convert 48 bits from the end of the buffer.
|
|
*
|
|
* Same idea as with net_buf_remove_mem(), but a helper for operating on
|
|
* 48-bit little endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 48-bit value converted from little endian to host endian.
|
|
*/
|
|
static inline uint64_t net_buf_remove_le48(struct net_buf *buf)
|
|
{
|
|
return net_buf_simple_remove_le48(&buf->b);
|
|
}
|
|
|
|
/**
|
|
* @brief Remove and convert 48 bits from the end of the buffer.
|
|
*
|
|
* Same idea as with net_buf_remove_mem(), but a helper for operating on
|
|
* 48-bit big endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer
|
|
*
|
|
* @return 48-bit value converted from big endian to host endian.
|
|
*/
|
|
static inline uint64_t net_buf_remove_be48(struct net_buf *buf)
|
|
{
|
|
return net_buf_simple_remove_be48(&buf->b);
|
|
}
|
|
|
|
/**
|
|
* @brief Remove and convert 64 bits from the end of the buffer.
|
|
*
|
|
* Same idea as with net_buf_remove_mem(), but a helper for operating on
|
|
* 64-bit little endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 64-bit value converted from little endian to host endian.
|
|
*/
|
|
static inline uint64_t net_buf_remove_le64(struct net_buf *buf)
|
|
{
|
|
return net_buf_simple_remove_le64(&buf->b);
|
|
}
|
|
|
|
/**
|
|
* @brief Remove and convert 64 bits from the end of the buffer.
|
|
*
|
|
* Same idea as with net_buf_remove_mem(), but a helper for operating on
|
|
* 64-bit big endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer
|
|
*
|
|
* @return 64-bit value converted from big endian to host endian.
|
|
*/
|
|
static inline uint64_t net_buf_remove_be64(struct net_buf *buf)
|
|
{
|
|
return net_buf_simple_remove_be64(&buf->b);
|
|
}
|
|
|
|
/**
|
|
* @brief Prepare data to be added at the start of the buffer
|
|
*
|
|
* Modifies the data pointer and buffer length to account for more data
|
|
* in the beginning of the buffer.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param len Number of bytes to add to the beginning.
|
|
*
|
|
* @return The new beginning of the buffer data.
|
|
*/
|
|
static inline void *net_buf_push(struct net_buf *buf, size_t len)
|
|
{
|
|
return net_buf_simple_push(&buf->b, len);
|
|
}
|
|
|
|
/**
|
|
* @brief Copies the given number of bytes to the start of the buffer
|
|
*
|
|
* Modifies the data pointer and buffer length to account for more data
|
|
* in the beginning of the buffer.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param mem Location of data to be added.
|
|
* @param len Length of data to be added.
|
|
*
|
|
* @return The new beginning of the buffer data.
|
|
*/
|
|
static inline void *net_buf_push_mem(struct net_buf *buf, const void *mem,
|
|
size_t len)
|
|
{
|
|
return net_buf_simple_push_mem(&buf->b, mem, len);
|
|
}
|
|
|
|
/**
|
|
* @brief Push 8-bit value to the beginning of the buffer
|
|
*
|
|
* Adds 8-bit value the beginning of the buffer.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 8-bit value to be pushed to the buffer.
|
|
*/
|
|
static inline void net_buf_push_u8(struct net_buf *buf, uint8_t val)
|
|
{
|
|
net_buf_simple_push_u8(&buf->b, val);
|
|
}
|
|
|
|
/**
|
|
* @brief Push 16-bit value to the beginning of the buffer
|
|
*
|
|
* Adds 16-bit value in little endian format to the beginning of the
|
|
* buffer.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 16-bit value to be pushed to the buffer.
|
|
*/
|
|
static inline void net_buf_push_le16(struct net_buf *buf, uint16_t val)
|
|
{
|
|
net_buf_simple_push_le16(&buf->b, val);
|
|
}
|
|
|
|
/**
|
|
* @brief Push 16-bit value to the beginning of the buffer
|
|
*
|
|
* Adds 16-bit value in big endian format to the beginning of the
|
|
* buffer.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 16-bit value to be pushed to the buffer.
|
|
*/
|
|
static inline void net_buf_push_be16(struct net_buf *buf, uint16_t val)
|
|
{
|
|
net_buf_simple_push_be16(&buf->b, val);
|
|
}
|
|
|
|
/**
|
|
* @brief Push 24-bit value to the beginning of the buffer
|
|
*
|
|
* Adds 24-bit value in little endian format to the beginning of the
|
|
* buffer.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 24-bit value to be pushed to the buffer.
|
|
*/
|
|
static inline void net_buf_push_le24(struct net_buf *buf, uint32_t val)
|
|
{
|
|
net_buf_simple_push_le24(&buf->b, val);
|
|
}
|
|
|
|
/**
|
|
* @brief Push 24-bit value to the beginning of the buffer
|
|
*
|
|
* Adds 24-bit value in big endian format to the beginning of the
|
|
* buffer.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 24-bit value to be pushed to the buffer.
|
|
*/
|
|
static inline void net_buf_push_be24(struct net_buf *buf, uint32_t val)
|
|
{
|
|
net_buf_simple_push_be24(&buf->b, val);
|
|
}
|
|
|
|
/**
|
|
* @brief Push 32-bit value to the beginning of the buffer
|
|
*
|
|
* Adds 32-bit value in little endian format to the beginning of the
|
|
* buffer.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 32-bit value to be pushed to the buffer.
|
|
*/
|
|
static inline void net_buf_push_le32(struct net_buf *buf, uint32_t val)
|
|
{
|
|
net_buf_simple_push_le32(&buf->b, val);
|
|
}
|
|
|
|
/**
|
|
* @brief Push 32-bit value to the beginning of the buffer
|
|
*
|
|
* Adds 32-bit value in big endian format to the beginning of the
|
|
* buffer.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 32-bit value to be pushed to the buffer.
|
|
*/
|
|
static inline void net_buf_push_be32(struct net_buf *buf, uint32_t val)
|
|
{
|
|
net_buf_simple_push_be32(&buf->b, val);
|
|
}
|
|
|
|
/**
|
|
* @brief Push 40-bit value to the beginning of the buffer
|
|
*
|
|
* Adds 40-bit value in little endian format to the beginning of the
|
|
* buffer.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 40-bit value to be pushed to the buffer.
|
|
*/
|
|
static inline void net_buf_push_le40(struct net_buf *buf, uint64_t val)
|
|
{
|
|
net_buf_simple_push_le40(&buf->b, val);
|
|
}
|
|
|
|
/**
|
|
* @brief Push 40-bit value to the beginning of the buffer
|
|
*
|
|
* Adds 40-bit value in big endian format to the beginning of the
|
|
* buffer.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 40-bit value to be pushed to the buffer.
|
|
*/
|
|
static inline void net_buf_push_be40(struct net_buf *buf, uint64_t val)
|
|
{
|
|
net_buf_simple_push_be40(&buf->b, val);
|
|
}
|
|
|
|
/**
|
|
* @brief Push 48-bit value to the beginning of the buffer
|
|
*
|
|
* Adds 48-bit value in little endian format to the beginning of the
|
|
* buffer.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 48-bit value to be pushed to the buffer.
|
|
*/
|
|
static inline void net_buf_push_le48(struct net_buf *buf, uint64_t val)
|
|
{
|
|
net_buf_simple_push_le48(&buf->b, val);
|
|
}
|
|
|
|
/**
|
|
* @brief Push 48-bit value to the beginning of the buffer
|
|
*
|
|
* Adds 48-bit value in big endian format to the beginning of the
|
|
* buffer.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 48-bit value to be pushed to the buffer.
|
|
*/
|
|
static inline void net_buf_push_be48(struct net_buf *buf, uint64_t val)
|
|
{
|
|
net_buf_simple_push_be48(&buf->b, val);
|
|
}
|
|
|
|
/**
|
|
* @brief Push 64-bit value to the beginning of the buffer
|
|
*
|
|
* Adds 64-bit value in little endian format to the beginning of the
|
|
* buffer.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 64-bit value to be pushed to the buffer.
|
|
*/
|
|
static inline void net_buf_push_le64(struct net_buf *buf, uint64_t val)
|
|
{
|
|
net_buf_simple_push_le64(&buf->b, val);
|
|
}
|
|
|
|
/**
|
|
* @brief Push 64-bit value to the beginning of the buffer
|
|
*
|
|
* Adds 64-bit value in big endian format to the beginning of the
|
|
* buffer.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param val 64-bit value to be pushed to the buffer.
|
|
*/
|
|
static inline void net_buf_push_be64(struct net_buf *buf, uint64_t val)
|
|
{
|
|
net_buf_simple_push_be64(&buf->b, val);
|
|
}
|
|
|
|
/**
|
|
* @brief Remove data from the beginning of the buffer.
|
|
*
|
|
* Removes data from the beginning of the buffer by modifying the data
|
|
* pointer and buffer length.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param len Number of bytes to remove.
|
|
*
|
|
* @return New beginning of the buffer data.
|
|
*/
|
|
static inline void *net_buf_pull(struct net_buf *buf, size_t len)
|
|
{
|
|
return net_buf_simple_pull(&buf->b, len);
|
|
}
|
|
|
|
/**
|
|
* @brief Remove data from the beginning of the buffer.
|
|
*
|
|
* Removes data from the beginning of the buffer by modifying the data
|
|
* pointer and buffer length.
|
|
*
|
|
* @param buf Buffer to update.
|
|
* @param len Number of bytes to remove.
|
|
*
|
|
* @return Pointer to the old beginning of the buffer data.
|
|
*/
|
|
static inline void *net_buf_pull_mem(struct net_buf *buf, size_t len)
|
|
{
|
|
return net_buf_simple_pull_mem(&buf->b, len);
|
|
}
|
|
|
|
/**
|
|
* @brief Remove a 8-bit value from the beginning of the buffer
|
|
*
|
|
* Same idea as with net_buf_pull(), but a helper for operating on
|
|
* 8-bit values.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return The 8-bit removed value
|
|
*/
|
|
static inline uint8_t net_buf_pull_u8(struct net_buf *buf)
|
|
{
|
|
return net_buf_simple_pull_u8(&buf->b);
|
|
}
|
|
|
|
/**
|
|
* @brief Remove and convert 16 bits from the beginning of the buffer.
|
|
*
|
|
* Same idea as with net_buf_pull(), but a helper for operating on
|
|
* 16-bit little endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 16-bit value converted from little endian to host endian.
|
|
*/
|
|
static inline uint16_t net_buf_pull_le16(struct net_buf *buf)
|
|
{
|
|
return net_buf_simple_pull_le16(&buf->b);
|
|
}
|
|
|
|
/**
|
|
* @brief Remove and convert 16 bits from the beginning of the buffer.
|
|
*
|
|
* Same idea as with net_buf_pull(), but a helper for operating on
|
|
* 16-bit big endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 16-bit value converted from big endian to host endian.
|
|
*/
|
|
static inline uint16_t net_buf_pull_be16(struct net_buf *buf)
|
|
{
|
|
return net_buf_simple_pull_be16(&buf->b);
|
|
}
|
|
|
|
/**
|
|
* @brief Remove and convert 24 bits from the beginning of the buffer.
|
|
*
|
|
* Same idea as with net_buf_pull(), but a helper for operating on
|
|
* 24-bit little endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 24-bit value converted from little endian to host endian.
|
|
*/
|
|
static inline uint32_t net_buf_pull_le24(struct net_buf *buf)
|
|
{
|
|
return net_buf_simple_pull_le24(&buf->b);
|
|
}
|
|
|
|
/**
|
|
* @brief Remove and convert 24 bits from the beginning of the buffer.
|
|
*
|
|
* Same idea as with net_buf_pull(), but a helper for operating on
|
|
* 24-bit big endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 24-bit value converted from big endian to host endian.
|
|
*/
|
|
static inline uint32_t net_buf_pull_be24(struct net_buf *buf)
|
|
{
|
|
return net_buf_simple_pull_be24(&buf->b);
|
|
}
|
|
|
|
/**
|
|
* @brief Remove and convert 32 bits from the beginning of the buffer.
|
|
*
|
|
* Same idea as with net_buf_pull(), but a helper for operating on
|
|
* 32-bit little endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 32-bit value converted from little endian to host endian.
|
|
*/
|
|
static inline uint32_t net_buf_pull_le32(struct net_buf *buf)
|
|
{
|
|
return net_buf_simple_pull_le32(&buf->b);
|
|
}
|
|
|
|
/**
|
|
* @brief Remove and convert 32 bits from the beginning of the buffer.
|
|
*
|
|
* Same idea as with net_buf_pull(), but a helper for operating on
|
|
* 32-bit big endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer
|
|
*
|
|
* @return 32-bit value converted from big endian to host endian.
|
|
*/
|
|
static inline uint32_t net_buf_pull_be32(struct net_buf *buf)
|
|
{
|
|
return net_buf_simple_pull_be32(&buf->b);
|
|
}
|
|
|
|
/**
|
|
* @brief Remove and convert 40 bits from the beginning of the buffer.
|
|
*
|
|
* Same idea as with net_buf_pull(), but a helper for operating on
|
|
* 40-bit little endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 40-bit value converted from little endian to host endian.
|
|
*/
|
|
static inline uint64_t net_buf_pull_le40(struct net_buf *buf)
|
|
{
|
|
return net_buf_simple_pull_le40(&buf->b);
|
|
}
|
|
|
|
/**
|
|
* @brief Remove and convert 40 bits from the beginning of the buffer.
|
|
*
|
|
* Same idea as with net_buf_pull(), but a helper for operating on
|
|
* 40-bit big endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer
|
|
*
|
|
* @return 40-bit value converted from big endian to host endian.
|
|
*/
|
|
static inline uint64_t net_buf_pull_be40(struct net_buf *buf)
|
|
{
|
|
return net_buf_simple_pull_be40(&buf->b);
|
|
}
|
|
|
|
/**
|
|
* @brief Remove and convert 48 bits from the beginning of the buffer.
|
|
*
|
|
* Same idea as with net_buf_pull(), but a helper for operating on
|
|
* 48-bit little endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 48-bit value converted from little endian to host endian.
|
|
*/
|
|
static inline uint64_t net_buf_pull_le48(struct net_buf *buf)
|
|
{
|
|
return net_buf_simple_pull_le48(&buf->b);
|
|
}
|
|
|
|
/**
|
|
* @brief Remove and convert 48 bits from the beginning of the buffer.
|
|
*
|
|
* Same idea as with net_buf_pull(), but a helper for operating on
|
|
* 48-bit big endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer
|
|
*
|
|
* @return 48-bit value converted from big endian to host endian.
|
|
*/
|
|
static inline uint64_t net_buf_pull_be48(struct net_buf *buf)
|
|
{
|
|
return net_buf_simple_pull_be48(&buf->b);
|
|
}
|
|
|
|
/**
|
|
* @brief Remove and convert 64 bits from the beginning of the buffer.
|
|
*
|
|
* Same idea as with net_buf_pull(), but a helper for operating on
|
|
* 64-bit little endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer.
|
|
*
|
|
* @return 64-bit value converted from little endian to host endian.
|
|
*/
|
|
static inline uint64_t net_buf_pull_le64(struct net_buf *buf)
|
|
{
|
|
return net_buf_simple_pull_le64(&buf->b);
|
|
}
|
|
|
|
/**
|
|
* @brief Remove and convert 64 bits from the beginning of the buffer.
|
|
*
|
|
* Same idea as with net_buf_pull(), but a helper for operating on
|
|
* 64-bit big endian data.
|
|
*
|
|
* @param buf A valid pointer on a buffer
|
|
*
|
|
* @return 64-bit value converted from big endian to host endian.
|
|
*/
|
|
static inline uint64_t net_buf_pull_be64(struct net_buf *buf)
|
|
{
|
|
return net_buf_simple_pull_be64(&buf->b);
|
|
}
|
|
|
|
/**
|
|
* @brief Check buffer tailroom.
|
|
*
|
|
* Check how much free space there is at the end of the buffer.
|
|
*
|
|
* @param buf A valid pointer on a buffer
|
|
*
|
|
* @return Number of bytes available at the end of the buffer.
|
|
*/
|
|
static inline size_t net_buf_tailroom(const struct net_buf *buf)
|
|
{
|
|
return net_buf_simple_tailroom(&buf->b);
|
|
}
|
|
|
|
/**
|
|
* @brief Check buffer headroom.
|
|
*
|
|
* Check how much free space there is in the beginning of the buffer.
|
|
*
|
|
* buf A valid pointer on a buffer
|
|
*
|
|
* @return Number of bytes available in the beginning of the buffer.
|
|
*/
|
|
static inline size_t net_buf_headroom(const struct net_buf *buf)
|
|
{
|
|
return net_buf_simple_headroom(&buf->b);
|
|
}
|
|
|
|
/**
|
|
* @brief Check maximum net_buf::len value.
|
|
*
|
|
* This value is depending on the number of bytes being reserved as headroom.
|
|
*
|
|
* @param buf A valid pointer on a buffer
|
|
*
|
|
* @return Number of bytes usable behind the net_buf::data pointer.
|
|
*/
|
|
static inline uint16_t net_buf_max_len(const struct net_buf *buf)
|
|
{
|
|
return net_buf_simple_max_len(&buf->b);
|
|
}
|
|
|
|
/**
|
|
* @brief Get the tail pointer for a buffer.
|
|
*
|
|
* Get a pointer to the end of the data in a buffer.
|
|
*
|
|
* @param buf Buffer.
|
|
*
|
|
* @return Tail pointer for the buffer.
|
|
*/
|
|
static inline uint8_t *net_buf_tail(const struct net_buf *buf)
|
|
{
|
|
return net_buf_simple_tail(&buf->b);
|
|
}
|
|
|
|
/**
|
|
* @brief Find the last fragment in the fragment list.
|
|
*
|
|
* @return Pointer to last fragment in the list.
|
|
*/
|
|
struct net_buf *net_buf_frag_last(struct net_buf *frags);
|
|
|
|
/**
|
|
* @brief Insert a new fragment to a chain of bufs.
|
|
*
|
|
* Insert a new fragment into the buffer fragments list after the parent.
|
|
*
|
|
* Note: This function takes ownership of the fragment reference so the
|
|
* caller is not required to unref.
|
|
*
|
|
* @param parent Parent buffer/fragment.
|
|
* @param frag Fragment to insert.
|
|
*/
|
|
void net_buf_frag_insert(struct net_buf *parent, struct net_buf *frag);
|
|
|
|
/**
|
|
* @brief Add a new fragment to the end of a chain of bufs.
|
|
*
|
|
* Append a new fragment into the buffer fragments list.
|
|
*
|
|
* Note: This function takes ownership of the fragment reference so the
|
|
* caller is not required to unref.
|
|
*
|
|
* @param head Head of the fragment chain.
|
|
* @param frag Fragment to add.
|
|
*
|
|
* @return New head of the fragment chain. Either head (if head
|
|
* was non-NULL) or frag (if head was NULL).
|
|
*/
|
|
struct net_buf *net_buf_frag_add(struct net_buf *head, struct net_buf *frag);
|
|
|
|
/**
|
|
* @brief Delete existing fragment from a chain of bufs.
|
|
*
|
|
* @param parent Parent buffer/fragment, or NULL if there is no parent.
|
|
* @param frag Fragment to delete.
|
|
*
|
|
* @return Pointer to the buffer following the fragment, or NULL if it
|
|
* had no further fragments.
|
|
*/
|
|
#if defined(CONFIG_NET_BUF_LOG)
|
|
struct net_buf *net_buf_frag_del_debug(struct net_buf *parent,
|
|
struct net_buf *frag,
|
|
const char *func, int line);
|
|
#define net_buf_frag_del(_parent, _frag) \
|
|
net_buf_frag_del_debug(_parent, _frag, __func__, __LINE__)
|
|
#else
|
|
struct net_buf *net_buf_frag_del(struct net_buf *parent, struct net_buf *frag);
|
|
#endif
|
|
|
|
/**
|
|
* @brief Copy bytes from net_buf chain starting at offset to linear buffer
|
|
*
|
|
* Copy (extract) @a len bytes from @a src net_buf chain, starting from @a
|
|
* offset in it, to a linear buffer @a dst. Return number of bytes actually
|
|
* copied, which may be less than requested, if net_buf chain doesn't have
|
|
* enough data, or destination buffer is too small.
|
|
*
|
|
* @param dst Destination buffer
|
|
* @param dst_len Destination buffer length
|
|
* @param src Source net_buf chain
|
|
* @param offset Starting offset to copy from
|
|
* @param len Number of bytes to copy
|
|
* @return number of bytes actually copied
|
|
*/
|
|
size_t net_buf_linearize(void *dst, size_t dst_len,
|
|
const struct net_buf *src, size_t offset, size_t len);
|
|
|
|
/**
|
|
* @typedef net_buf_allocator_cb
|
|
* @brief Network buffer allocator callback.
|
|
*
|
|
* @details The allocator callback is called when net_buf_append_bytes
|
|
* needs to allocate a new net_buf.
|
|
*
|
|
* @param timeout Affects the action taken should the net buf pool be empty.
|
|
* If K_NO_WAIT, then return immediately. If K_FOREVER, then
|
|
* wait as long as necessary. Otherwise, wait until the specified
|
|
* timeout.
|
|
* @param user_data The user data given in net_buf_append_bytes call.
|
|
* @return pointer to allocated net_buf or NULL on error.
|
|
*/
|
|
typedef struct net_buf * __must_check (*net_buf_allocator_cb)(k_timeout_t timeout,
|
|
void *user_data);
|
|
|
|
/**
|
|
* @brief Append data to a list of net_buf
|
|
*
|
|
* @details Append data to a net_buf. If there is not enough space in the
|
|
* net_buf then more net_buf will be added, unless there are no free net_buf
|
|
* and timeout occurs. If not allocator is provided it attempts to allocate from
|
|
* the same pool as the original buffer.
|
|
*
|
|
* @param buf Network buffer.
|
|
* @param len Total length of input data
|
|
* @param value Data to be added
|
|
* @param timeout Timeout is passed to the net_buf allocator callback.
|
|
* @param allocate_cb When a new net_buf is required, use this callback.
|
|
* @param user_data A user data pointer to be supplied to the allocate_cb.
|
|
* This pointer is can be anything from a mem_pool or a net_pkt, the
|
|
* logic is left up to the allocate_cb function.
|
|
*
|
|
* @return Length of data actually added. This may be less than input
|
|
* length if other timeout than K_FOREVER was used, and there
|
|
* were no free fragments in a pool to accommodate all data.
|
|
*/
|
|
size_t net_buf_append_bytes(struct net_buf *buf, size_t len,
|
|
const void *value, k_timeout_t timeout,
|
|
net_buf_allocator_cb allocate_cb, void *user_data);
|
|
|
|
/**
|
|
* @brief Match data with a net_buf's content
|
|
*
|
|
* @details Compare data with a content of a net_buf. Provide information about
|
|
* the number of bytes matching between both. If needed, traverse
|
|
* through multiple buffer fragments.
|
|
*
|
|
* @param buf Network buffer
|
|
* @param offset Starting offset to compare from
|
|
* @param data Data buffer for comparison
|
|
* @param len Number of bytes to compare
|
|
*
|
|
* @return The number of bytes compared before the first difference.
|
|
*/
|
|
size_t net_buf_data_match(const struct net_buf *buf, size_t offset, const void *data, size_t len);
|
|
|
|
/**
|
|
* @brief Skip N number of bytes in a net_buf
|
|
*
|
|
* @details Skip N number of bytes starting from fragment's offset. If the total
|
|
* length of data is placed in multiple fragments, this function will skip from
|
|
* all fragments until it reaches N number of bytes. Any fully skipped buffers
|
|
* are removed from the net_buf list.
|
|
*
|
|
* @param buf Network buffer.
|
|
* @param len Total length of data to be skipped.
|
|
*
|
|
* @return Pointer to the fragment or
|
|
* NULL and pos is 0 after successful skip,
|
|
* NULL and pos is 0xffff otherwise.
|
|
*/
|
|
static inline struct net_buf *net_buf_skip(struct net_buf *buf, size_t len)
|
|
{
|
|
while (buf && len--) {
|
|
net_buf_pull_u8(buf);
|
|
if (!buf->len) {
|
|
buf = net_buf_frag_del(NULL, buf);
|
|
}
|
|
}
|
|
|
|
return buf;
|
|
}
|
|
|
|
/**
|
|
* @brief Calculate amount of bytes stored in fragments.
|
|
*
|
|
* Calculates the total amount of data stored in the given buffer and the
|
|
* fragments linked to it.
|
|
*
|
|
* @param buf Buffer to start off with.
|
|
*
|
|
* @return Number of bytes in the buffer and its fragments.
|
|
*/
|
|
static inline size_t net_buf_frags_len(const struct net_buf *buf)
|
|
{
|
|
size_t bytes = 0;
|
|
|
|
while (buf) {
|
|
bytes += buf->len;
|
|
buf = buf->frags;
|
|
}
|
|
|
|
return bytes;
|
|
}
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ZEPHYR_INCLUDE_NET_BUF_H_ */
|