LCOV - code coverage report
Current view: top level - zephyr - net_buf.h Hit Total Coverage
Test: new.info Lines: 196 196 100.0 %
Date: 2024-12-22 00:14:23

          Line data    Source code
       1           1 : /** @file
       2             :  *  @brief Buffer management.
       3             :  */
       4             : 
       5             : /*
       6             :  * Copyright (c) 2015 Intel Corporation
       7             :  *
       8             :  * SPDX-License-Identifier: Apache-2.0
       9             :  */
      10             : #ifndef ZEPHYR_INCLUDE_NET_BUF_H_
      11             : #define ZEPHYR_INCLUDE_NET_BUF_H_
      12             : 
      13             : #include <stddef.h>
      14             : #include <zephyr/types.h>
      15             : #include <zephyr/sys/util.h>
      16             : #include <zephyr/kernel.h>
      17             : #include <zephyr/sys/iterable_sections.h>
      18             : 
      19             : #ifdef __cplusplus
      20             : extern "C" {
      21             : #endif
      22             : 
      23             : /**
      24             :  * @brief Network buffer library
      25             :  * @defgroup net_buf Network Buffer Library
      26             :  * @since 1.0
      27             :  * @version 1.0.0
      28             :  * @ingroup os_services
      29             :  * @{
      30             :  */
      31             : 
      32             : /* Alignment needed for various parts of the buffer definition */
      33             : #if CONFIG_NET_BUF_ALIGNMENT == 0
      34             : #define __net_buf_align __aligned(sizeof(void *))
      35             : #else
      36             : #define __net_buf_align __aligned(CONFIG_NET_BUF_ALIGNMENT)
      37             : #endif
      38             : 
      39             : /**
      40             :  *  @brief Define a net_buf_simple stack variable.
      41             :  *
      42             :  *  This is a helper macro which is used to define a net_buf_simple object
      43             :  *  on the stack.
      44             :  *
      45             :  *  @param _name Name of the net_buf_simple object.
      46             :  *  @param _size Maximum data storage for the buffer.
      47             :  */
      48           1 : #define NET_BUF_SIMPLE_DEFINE(_name, _size)     \
      49             :         uint8_t net_buf_data_##_name[_size];       \
      50             :         struct net_buf_simple _name = {         \
      51             :                 .data   = net_buf_data_##_name, \
      52             :                 .len    = 0,                    \
      53             :                 .size   = _size,                \
      54             :                 .__buf  = net_buf_data_##_name, \
      55             :         }
      56             : 
      57             : /**
      58             :  *
      59             :  * @brief Define a static net_buf_simple variable.
      60             :  *
      61             :  * This is a helper macro which is used to define a static net_buf_simple
      62             :  * object.
      63             :  *
      64             :  * @param _name Name of the net_buf_simple object.
      65             :  * @param _size Maximum data storage for the buffer.
      66             :  */
      67           1 : #define NET_BUF_SIMPLE_DEFINE_STATIC(_name, _size)        \
      68             :         static __noinit uint8_t net_buf_data_##_name[_size]; \
      69             :         static struct net_buf_simple _name = {            \
      70             :                 .data   = net_buf_data_##_name,           \
      71             :                 .len    = 0,                              \
      72             :                 .size   = _size,                          \
      73             :                 .__buf  = net_buf_data_##_name,           \
      74             :         }
      75             : 
      76             : /**
      77             :  * @brief Simple network buffer representation.
      78             :  *
      79             :  * This is a simpler variant of the net_buf object (in fact net_buf uses
      80             :  * net_buf_simple internally). It doesn't provide any kind of reference
      81             :  * counting, user data, dynamic allocation, or in general the ability to
      82             :  * pass through kernel objects such as FIFOs.
      83             :  *
      84             :  * The main use of this is for scenarios where the meta-data of the normal
      85             :  * net_buf isn't needed and causes too much overhead. This could be e.g.
      86             :  * when the buffer only needs to be allocated on the stack or when the
      87             :  * access to and lifetime of the buffer is well controlled and constrained.
      88             :  */
      89           1 : struct net_buf_simple {
      90             :         /** Pointer to the start of data in the buffer. */
      91           1 :         uint8_t *data;
      92             : 
      93             :         /**
      94             :          * Length of the data behind the data pointer.
      95             :          *
      96             :          * To determine the max length, use net_buf_simple_max_len(), not #size!
      97             :          */
      98           1 :         uint16_t len;
      99             : 
     100             :         /** Amount of data that net_buf_simple#__buf can store. */
     101           1 :         uint16_t size;
     102             : 
     103             :         /** Start of the data storage. Not to be accessed directly
     104             :          *  (the data pointer should be used instead).
     105             :          */
     106             :         uint8_t *__buf;
     107             : };
     108             : 
     109             : /**
     110             :  *
     111             :  * @brief Define a net_buf_simple stack variable and get a pointer to it.
     112             :  *
     113             :  * This is a helper macro which is used to define a net_buf_simple object on
     114             :  * the stack and the get a pointer to it as follows:
     115             :  *
     116             :  * struct net_buf_simple *my_buf = NET_BUF_SIMPLE(10);
     117             :  *
     118             :  * After creating the object it needs to be initialized by calling
     119             :  * net_buf_simple_init().
     120             :  *
     121             :  * @param _size Maximum data storage for the buffer.
     122             :  *
     123             :  * @return Pointer to stack-allocated net_buf_simple object.
     124             :  */
     125           1 : #define NET_BUF_SIMPLE(_size)                        \
     126             :         ((struct net_buf_simple *)(&(struct {        \
     127             :                 struct net_buf_simple buf;           \
     128             :                 uint8_t data[_size];                 \
     129             :         }) {                                         \
     130             :                 .buf.size = _size,                   \
     131             :         }))
     132             : 
     133             : /**
     134             :  * @brief Initialize a net_buf_simple object.
     135             :  *
     136             :  * This needs to be called after creating a net_buf_simple object using
     137             :  * the NET_BUF_SIMPLE macro.
     138             :  *
     139             :  * @param buf Buffer to initialize.
     140             :  * @param reserve_head Headroom to reserve.
     141             :  */
     142           1 : static inline void net_buf_simple_init(struct net_buf_simple *buf,
     143             :                                        size_t reserve_head)
     144             : {
     145             :         if (!buf->__buf) {
     146             :                 buf->__buf = (uint8_t *)buf + sizeof(*buf);
     147             :         }
     148             : 
     149             :         buf->data = buf->__buf + reserve_head;
     150             :         buf->len = 0U;
     151             : }
     152             : 
     153             : /**
     154             :  * @brief Initialize a net_buf_simple object with data.
     155             :  *
     156             :  * Initialized buffer object with external data.
     157             :  *
     158             :  * @param buf Buffer to initialize.
     159             :  * @param data External data pointer
     160             :  * @param size Amount of data the pointed data buffer if able to fit.
     161             :  */
     162           1 : void net_buf_simple_init_with_data(struct net_buf_simple *buf,
     163             :                                    void *data, size_t size);
     164             : 
     165             : /**
     166             :  * @brief Reset buffer
     167             :  *
     168             :  * Reset buffer data so it can be reused for other purposes.
     169             :  *
     170             :  * @param buf Buffer to reset.
     171             :  */
     172           1 : static inline void net_buf_simple_reset(struct net_buf_simple *buf)
     173             : {
     174             :         buf->len  = 0U;
     175             :         buf->data = buf->__buf;
     176             : }
     177             : 
     178             : /**
     179             :  * Clone buffer state, using the same data buffer.
     180             :  *
     181             :  * Initializes a buffer to point to the same data as an existing buffer.
     182             :  * Allows operations on the same data without altering the length and
     183             :  * offset of the original.
     184             :  *
     185             :  * @param original Buffer to clone.
     186             :  * @param clone The new clone.
     187             :  */
     188           1 : void net_buf_simple_clone(const struct net_buf_simple *original,
     189             :                           struct net_buf_simple *clone);
     190             : 
     191             : /**
     192             :  * @brief Prepare data to be added at the end of the buffer
     193             :  *
     194             :  * Increments the data length of a buffer to account for more data
     195             :  * at the end.
     196             :  *
     197             :  * @param buf Buffer to update.
     198             :  * @param len Number of bytes to increment the length with.
     199             :  *
     200             :  * @return The original tail of the buffer.
     201             :  */
     202           1 : void *net_buf_simple_add(struct net_buf_simple *buf, size_t len);
     203             : 
     204             : /**
     205             :  * @brief Copy given number of bytes from memory to the end of the buffer
     206             :  *
     207             :  * Increments the data length of the  buffer to account for more data at the
     208             :  * end.
     209             :  *
     210             :  * @param buf Buffer to update.
     211             :  * @param mem Location of data to be added.
     212             :  * @param len Length of data to be added
     213             :  *
     214             :  * @return The original tail of the buffer.
     215             :  */
     216           1 : void *net_buf_simple_add_mem(struct net_buf_simple *buf, const void *mem,
     217             :                              size_t len);
     218             : 
     219             : /**
     220             :  * @brief Add (8-bit) byte at the end of the buffer
     221             :  *
     222             :  * Increments the data length of the  buffer to account for more data at the
     223             :  * end.
     224             :  *
     225             :  * @param buf Buffer to update.
     226             :  * @param val byte value to be added.
     227             :  *
     228             :  * @return Pointer to the value added
     229             :  */
     230           1 : uint8_t *net_buf_simple_add_u8(struct net_buf_simple *buf, uint8_t val);
     231             : 
     232             : /**
     233             :  * @brief Add 16-bit value at the end of the buffer
     234             :  *
     235             :  * Adds 16-bit value in little endian format at the end of buffer.
     236             :  * Increments the data length of a buffer to account for more data
     237             :  * at the end.
     238             :  *
     239             :  * @param buf Buffer to update.
     240             :  * @param val 16-bit value to be added.
     241             :  */
     242           1 : void net_buf_simple_add_le16(struct net_buf_simple *buf, uint16_t val);
     243             : 
     244             : /**
     245             :  * @brief Add 16-bit value at the end of the buffer
     246             :  *
     247             :  * Adds 16-bit value in big endian format at the end of buffer.
     248             :  * Increments the data length of a buffer to account for more data
     249             :  * at the end.
     250             :  *
     251             :  * @param buf Buffer to update.
     252             :  * @param val 16-bit value to be added.
     253             :  */
     254           1 : void net_buf_simple_add_be16(struct net_buf_simple *buf, uint16_t val);
     255             : 
     256             : /**
     257             :  * @brief Add 24-bit value at the end of the buffer
     258             :  *
     259             :  * Adds 24-bit value in little endian format at the end of buffer.
     260             :  * Increments the data length of a buffer to account for more data
     261             :  * at the end.
     262             :  *
     263             :  * @param buf Buffer to update.
     264             :  * @param val 24-bit value to be added.
     265             :  */
     266           1 : void net_buf_simple_add_le24(struct net_buf_simple *buf, uint32_t val);
     267             : 
     268             : /**
     269             :  * @brief Add 24-bit value at the end of the buffer
     270             :  *
     271             :  * Adds 24-bit value in big endian format at the end of buffer.
     272             :  * Increments the data length of a buffer to account for more data
     273             :  * at the end.
     274             :  *
     275             :  * @param buf Buffer to update.
     276             :  * @param val 24-bit value to be added.
     277             :  */
     278           1 : void net_buf_simple_add_be24(struct net_buf_simple *buf, uint32_t val);
     279             : 
     280             : /**
     281             :  * @brief Add 32-bit value at the end of the buffer
     282             :  *
     283             :  * Adds 32-bit value in little endian format at the end of buffer.
     284             :  * Increments the data length of a buffer to account for more data
     285             :  * at the end.
     286             :  *
     287             :  * @param buf Buffer to update.
     288             :  * @param val 32-bit value to be added.
     289             :  */
     290           1 : void net_buf_simple_add_le32(struct net_buf_simple *buf, uint32_t val);
     291             : 
     292             : /**
     293             :  * @brief Add 32-bit value at the end of the buffer
     294             :  *
     295             :  * Adds 32-bit value in big endian format at the end of buffer.
     296             :  * Increments the data length of a buffer to account for more data
     297             :  * at the end.
     298             :  *
     299             :  * @param buf Buffer to update.
     300             :  * @param val 32-bit value to be added.
     301             :  */
     302           1 : void net_buf_simple_add_be32(struct net_buf_simple *buf, uint32_t val);
     303             : 
     304             : /**
     305             :  * @brief Add 40-bit value at the end of the buffer
     306             :  *
     307             :  * Adds 40-bit value in little endian format at the end of buffer.
     308             :  * Increments the data length of a buffer to account for more data
     309             :  * at the end.
     310             :  *
     311             :  * @param buf Buffer to update.
     312             :  * @param val 40-bit value to be added.
     313             :  */
     314           1 : void net_buf_simple_add_le40(struct net_buf_simple *buf, uint64_t val);
     315             : 
     316             : /**
     317             :  * @brief Add 40-bit value at the end of the buffer
     318             :  *
     319             :  * Adds 40-bit value in big endian format at the end of buffer.
     320             :  * Increments the data length of a buffer to account for more data
     321             :  * at the end.
     322             :  *
     323             :  * @param buf Buffer to update.
     324             :  * @param val 40-bit value to be added.
     325             :  */
     326           1 : void net_buf_simple_add_be40(struct net_buf_simple *buf, uint64_t val);
     327             : 
     328             : /**
     329             :  * @brief Add 48-bit value at the end of the buffer
     330             :  *
     331             :  * Adds 48-bit value in little endian format at the end of buffer.
     332             :  * Increments the data length of a buffer to account for more data
     333             :  * at the end.
     334             :  *
     335             :  * @param buf Buffer to update.
     336             :  * @param val 48-bit value to be added.
     337             :  */
     338           1 : void net_buf_simple_add_le48(struct net_buf_simple *buf, uint64_t val);
     339             : 
     340             : /**
     341             :  * @brief Add 48-bit value at the end of the buffer
     342             :  *
     343             :  * Adds 48-bit value in big endian format at the end of buffer.
     344             :  * Increments the data length of a buffer to account for more data
     345             :  * at the end.
     346             :  *
     347             :  * @param buf Buffer to update.
     348             :  * @param val 48-bit value to be added.
     349             :  */
     350           1 : void net_buf_simple_add_be48(struct net_buf_simple *buf, uint64_t val);
     351             : 
     352             : /**
     353             :  * @brief Add 64-bit value at the end of the buffer
     354             :  *
     355             :  * Adds 64-bit value in little endian format at the end of buffer.
     356             :  * Increments the data length of a buffer to account for more data
     357             :  * at the end.
     358             :  *
     359             :  * @param buf Buffer to update.
     360             :  * @param val 64-bit value to be added.
     361             :  */
     362           1 : void net_buf_simple_add_le64(struct net_buf_simple *buf, uint64_t val);
     363             : 
     364             : /**
     365             :  * @brief Add 64-bit value at the end of the buffer
     366             :  *
     367             :  * Adds 64-bit value in big endian format at the end of buffer.
     368             :  * Increments the data length of a buffer to account for more data
     369             :  * at the end.
     370             :  *
     371             :  * @param buf Buffer to update.
     372             :  * @param val 64-bit value to be added.
     373             :  */
     374           1 : void net_buf_simple_add_be64(struct net_buf_simple *buf, uint64_t val);
     375             : 
     376             : /**
     377             :  * @brief Remove data from the end of the buffer.
     378             :  *
     379             :  * Removes data from the end of the buffer by modifying the buffer length.
     380             :  *
     381             :  * @param buf Buffer to update.
     382             :  * @param len Number of bytes to remove.
     383             :  *
     384             :  * @return New end of the buffer data.
     385             :  */
     386           1 : void *net_buf_simple_remove_mem(struct net_buf_simple *buf, size_t len);
     387             : 
     388             : /**
     389             :  * @brief Remove a 8-bit value from the end of the buffer
     390             :  *
     391             :  * Same idea as with net_buf_simple_remove_mem(), but a helper for operating
     392             :  * on 8-bit values.
     393             :  *
     394             :  * @param buf A valid pointer on a buffer.
     395             :  *
     396             :  * @return The 8-bit removed value
     397             :  */
     398           1 : uint8_t net_buf_simple_remove_u8(struct net_buf_simple *buf);
     399             : 
     400             : /**
     401             :  * @brief Remove and convert 16 bits from the end of the buffer.
     402             :  *
     403             :  * Same idea as with net_buf_simple_remove_mem(), but a helper for operating
     404             :  * on 16-bit little endian data.
     405             :  *
     406             :  * @param buf A valid pointer on a buffer.
     407             :  *
     408             :  * @return 16-bit value converted from little endian to host endian.
     409             :  */
     410           1 : uint16_t net_buf_simple_remove_le16(struct net_buf_simple *buf);
     411             : 
     412             : /**
     413             :  * @brief Remove and convert 16 bits from the end of the buffer.
     414             :  *
     415             :  * Same idea as with net_buf_simple_remove_mem(), but a helper for operating
     416             :  * on 16-bit big endian data.
     417             :  *
     418             :  * @param buf A valid pointer on a buffer.
     419             :  *
     420             :  * @return 16-bit value converted from big endian to host endian.
     421             :  */
     422           1 : uint16_t net_buf_simple_remove_be16(struct net_buf_simple *buf);
     423             : 
     424             : /**
     425             :  * @brief Remove and convert 24 bits from the end of the buffer.
     426             :  *
     427             :  * Same idea as with net_buf_simple_remove_mem(), but a helper for operating
     428             :  * on 24-bit little endian data.
     429             :  *
     430             :  * @param buf A valid pointer on a buffer.
     431             :  *
     432             :  * @return 24-bit value converted from little endian to host endian.
     433             :  */
     434           1 : uint32_t net_buf_simple_remove_le24(struct net_buf_simple *buf);
     435             : 
     436             : /**
     437             :  * @brief Remove and convert 24 bits from the end of the buffer.
     438             :  *
     439             :  * Same idea as with net_buf_simple_remove_mem(), but a helper for operating
     440             :  * on 24-bit big endian data.
     441             :  *
     442             :  * @param buf A valid pointer on a buffer.
     443             :  *
     444             :  * @return 24-bit value converted from big endian to host endian.
     445             :  */
     446           1 : uint32_t net_buf_simple_remove_be24(struct net_buf_simple *buf);
     447             : 
     448             : /**
     449             :  * @brief Remove and convert 32 bits from the end of the buffer.
     450             :  *
     451             :  * Same idea as with net_buf_simple_remove_mem(), but a helper for operating
     452             :  * on 32-bit little endian data.
     453             :  *
     454             :  * @param buf A valid pointer on a buffer.
     455             :  *
     456             :  * @return 32-bit value converted from little endian to host endian.
     457             :  */
     458           1 : uint32_t net_buf_simple_remove_le32(struct net_buf_simple *buf);
     459             : 
     460             : /**
     461             :  * @brief Remove and convert 32 bits from the end of the buffer.
     462             :  *
     463             :  * Same idea as with net_buf_simple_remove_mem(), but a helper for operating
     464             :  * on 32-bit big endian data.
     465             :  *
     466             :  * @param buf A valid pointer on a buffer.
     467             :  *
     468             :  * @return 32-bit value converted from big endian to host endian.
     469             :  */
     470           1 : uint32_t net_buf_simple_remove_be32(struct net_buf_simple *buf);
     471             : 
     472             : /**
     473             :  * @brief Remove and convert 40 bits from the end of the buffer.
     474             :  *
     475             :  * Same idea as with net_buf_simple_remove_mem(), but a helper for operating
     476             :  * on 40-bit little endian data.
     477             :  *
     478             :  * @param buf A valid pointer on a buffer.
     479             :  *
     480             :  * @return 40-bit value converted from little endian to host endian.
     481             :  */
     482           1 : uint64_t net_buf_simple_remove_le40(struct net_buf_simple *buf);
     483             : 
     484             : /**
     485             :  * @brief Remove and convert 40 bits from the end of the buffer.
     486             :  *
     487             :  * Same idea as with net_buf_simple_remove_mem(), but a helper for operating
     488             :  * on 40-bit big endian data.
     489             :  *
     490             :  * @param buf A valid pointer on a buffer.
     491             :  *
     492             :  * @return 40-bit value converted from big endian to host endian.
     493             :  */
     494           1 : uint64_t net_buf_simple_remove_be40(struct net_buf_simple *buf);
     495             : 
     496             : /**
     497             :  * @brief Remove and convert 48 bits from the end of the buffer.
     498             :  *
     499             :  * Same idea as with net_buf_simple_remove_mem(), but a helper for operating
     500             :  * on 48-bit little endian data.
     501             :  *
     502             :  * @param buf A valid pointer on a buffer.
     503             :  *
     504             :  * @return 48-bit value converted from little endian to host endian.
     505             :  */
     506           1 : uint64_t net_buf_simple_remove_le48(struct net_buf_simple *buf);
     507             : 
     508             : /**
     509             :  * @brief Remove and convert 48 bits from the end of the buffer.
     510             :  *
     511             :  * Same idea as with net_buf_simple_remove_mem(), but a helper for operating
     512             :  * on 48-bit big endian data.
     513             :  *
     514             :  * @param buf A valid pointer on a buffer.
     515             :  *
     516             :  * @return 48-bit value converted from big endian to host endian.
     517             :  */
     518           1 : uint64_t net_buf_simple_remove_be48(struct net_buf_simple *buf);
     519             : 
     520             : /**
     521             :  * @brief Remove and convert 64 bits from the end of the buffer.
     522             :  *
     523             :  * Same idea as with net_buf_simple_remove_mem(), but a helper for operating
     524             :  * on 64-bit little endian data.
     525             :  *
     526             :  * @param buf A valid pointer on a buffer.
     527             :  *
     528             :  * @return 64-bit value converted from little endian to host endian.
     529             :  */
     530           1 : uint64_t net_buf_simple_remove_le64(struct net_buf_simple *buf);
     531             : 
     532             : /**
     533             :  * @brief Remove and convert 64 bits from the end of the buffer.
     534             :  *
     535             :  * Same idea as with net_buf_simple_remove_mem(), but a helper for operating
     536             :  * on 64-bit big endian data.
     537             :  *
     538             :  * @param buf A valid pointer on a buffer.
     539             :  *
     540             :  * @return 64-bit value converted from big endian to host endian.
     541             :  */
     542           1 : uint64_t net_buf_simple_remove_be64(struct net_buf_simple *buf);
     543             : 
     544             : /**
     545             :  * @brief Prepare data to be added to the start of the buffer
     546             :  *
     547             :  * Modifies the data pointer and buffer length to account for more data
     548             :  * in the beginning of the buffer.
     549             :  *
     550             :  * @param buf Buffer to update.
     551             :  * @param len Number of bytes to add to the beginning.
     552             :  *
     553             :  * @return The new beginning of the buffer data.
     554             :  */
     555           1 : void *net_buf_simple_push(struct net_buf_simple *buf, size_t len);
     556             : 
     557             : /**
     558             :  * @brief Copy given number of bytes from memory to the start of the buffer.
     559             :  *
     560             :  * Modifies the data pointer and buffer length to account for more data
     561             :  * in the beginning of the buffer.
     562             :  *
     563             :  * @param buf Buffer to update.
     564             :  * @param mem Location of data to be added.
     565             :  * @param len Length of data to be added.
     566             :  *
     567             :  * @return The new beginning of the buffer data.
     568             :  */
     569           1 : void *net_buf_simple_push_mem(struct net_buf_simple *buf, const void *mem,
     570             :                               size_t len);
     571             : 
     572             : /**
     573             :  * @brief Push 16-bit value to the beginning of the buffer
     574             :  *
     575             :  * Adds 16-bit value in little endian format to the beginning of the
     576             :  * buffer.
     577             :  *
     578             :  * @param buf Buffer to update.
     579             :  * @param val 16-bit value to be pushed to the buffer.
     580             :  */
     581           1 : void net_buf_simple_push_le16(struct net_buf_simple *buf, uint16_t val);
     582             : 
     583             : /**
     584             :  * @brief Push 16-bit value to the beginning of the buffer
     585             :  *
     586             :  * Adds 16-bit value in big endian format to the beginning of the
     587             :  * buffer.
     588             :  *
     589             :  * @param buf Buffer to update.
     590             :  * @param val 16-bit value to be pushed to the buffer.
     591             :  */
     592           1 : void net_buf_simple_push_be16(struct net_buf_simple *buf, uint16_t val);
     593             : 
     594             : /**
     595             :  * @brief Push 8-bit value to the beginning of the buffer
     596             :  *
     597             :  * Adds 8-bit value the beginning of the buffer.
     598             :  *
     599             :  * @param buf Buffer to update.
     600             :  * @param val 8-bit value to be pushed to the buffer.
     601             :  */
     602           1 : void net_buf_simple_push_u8(struct net_buf_simple *buf, uint8_t val);
     603             : 
     604             : /**
     605             :  * @brief Push 24-bit value to the beginning of the buffer
     606             :  *
     607             :  * Adds 24-bit value in little endian format to the beginning of the
     608             :  * buffer.
     609             :  *
     610             :  * @param buf Buffer to update.
     611             :  * @param val 24-bit value to be pushed to the buffer.
     612             :  */
     613           1 : void net_buf_simple_push_le24(struct net_buf_simple *buf, uint32_t val);
     614             : 
     615             : /**
     616             :  * @brief Push 24-bit value to the beginning of the buffer
     617             :  *
     618             :  * Adds 24-bit value in big endian format to the beginning of the
     619             :  * buffer.
     620             :  *
     621             :  * @param buf Buffer to update.
     622             :  * @param val 24-bit value to be pushed to the buffer.
     623             :  */
     624           1 : void net_buf_simple_push_be24(struct net_buf_simple *buf, uint32_t val);
     625             : 
     626             : /**
     627             :  * @brief Push 32-bit value to the beginning of the buffer
     628             :  *
     629             :  * Adds 32-bit value in little endian format to the beginning of the
     630             :  * buffer.
     631             :  *
     632             :  * @param buf Buffer to update.
     633             :  * @param val 32-bit value to be pushed to the buffer.
     634             :  */
     635           1 : void net_buf_simple_push_le32(struct net_buf_simple *buf, uint32_t val);
     636             : 
     637             : /**
     638             :  * @brief Push 32-bit value to the beginning of the buffer
     639             :  *
     640             :  * Adds 32-bit value in big endian format to the beginning of the
     641             :  * buffer.
     642             :  *
     643             :  * @param buf Buffer to update.
     644             :  * @param val 32-bit value to be pushed to the buffer.
     645             :  */
     646           1 : void net_buf_simple_push_be32(struct net_buf_simple *buf, uint32_t val);
     647             : 
     648             : /**
     649             :  * @brief Push 40-bit value to the beginning of the buffer
     650             :  *
     651             :  * Adds 40-bit value in little endian format to the beginning of the
     652             :  * buffer.
     653             :  *
     654             :  * @param buf Buffer to update.
     655             :  * @param val 40-bit value to be pushed to the buffer.
     656             :  */
     657           1 : void net_buf_simple_push_le40(struct net_buf_simple *buf, uint64_t val);
     658             : 
     659             : /**
     660             :  * @brief Push 40-bit value to the beginning of the buffer
     661             :  *
     662             :  * Adds 40-bit value in big endian format to the beginning of the
     663             :  * buffer.
     664             :  *
     665             :  * @param buf Buffer to update.
     666             :  * @param val 40-bit value to be pushed to the buffer.
     667             :  */
     668           1 : void net_buf_simple_push_be40(struct net_buf_simple *buf, uint64_t val);
     669             : 
     670             : /**
     671             :  * @brief Push 48-bit value to the beginning of the buffer
     672             :  *
     673             :  * Adds 48-bit value in little endian format to the beginning of the
     674             :  * buffer.
     675             :  *
     676             :  * @param buf Buffer to update.
     677             :  * @param val 48-bit value to be pushed to the buffer.
     678             :  */
     679           1 : void net_buf_simple_push_le48(struct net_buf_simple *buf, uint64_t val);
     680             : 
     681             : /**
     682             :  * @brief Push 48-bit value to the beginning of the buffer
     683             :  *
     684             :  * Adds 48-bit value in big endian format to the beginning of the
     685             :  * buffer.
     686             :  *
     687             :  * @param buf Buffer to update.
     688             :  * @param val 48-bit value to be pushed to the buffer.
     689             :  */
     690           1 : void net_buf_simple_push_be48(struct net_buf_simple *buf, uint64_t val);
     691             : 
     692             : /**
     693             :  * @brief Push 64-bit value to the beginning of the buffer
     694             :  *
     695             :  * Adds 64-bit value in little endian format to the beginning of the
     696             :  * buffer.
     697             :  *
     698             :  * @param buf Buffer to update.
     699             :  * @param val 64-bit value to be pushed to the buffer.
     700             :  */
     701           1 : void net_buf_simple_push_le64(struct net_buf_simple *buf, uint64_t val);
     702             : 
     703             : /**
     704             :  * @brief Push 64-bit value to the beginning of the buffer
     705             :  *
     706             :  * Adds 64-bit value in big endian format to the beginning of the
     707             :  * buffer.
     708             :  *
     709             :  * @param buf Buffer to update.
     710             :  * @param val 64-bit value to be pushed to the buffer.
     711             :  */
     712           1 : void net_buf_simple_push_be64(struct net_buf_simple *buf, uint64_t val);
     713             : 
     714             : /**
     715             :  * @brief Remove data from the beginning of the buffer.
     716             :  *
     717             :  * Removes data from the beginning of the buffer by modifying the data
     718             :  * pointer and buffer length.
     719             :  *
     720             :  * @param buf Buffer to update.
     721             :  * @param len Number of bytes to remove.
     722             :  *
     723             :  * @return New beginning of the buffer data.
     724             :  */
     725           1 : void *net_buf_simple_pull(struct net_buf_simple *buf, size_t len);
     726             : 
     727             : /**
     728             :  * @brief Remove data from the beginning of the buffer.
     729             :  *
     730             :  * Removes data from the beginning of the buffer by modifying the data
     731             :  * pointer and buffer length.
     732             :  *
     733             :  * @param buf Buffer to update.
     734             :  * @param len Number of bytes to remove.
     735             :  *
     736             :  * @return Pointer to the old location of the buffer data.
     737             :  */
     738           1 : void *net_buf_simple_pull_mem(struct net_buf_simple *buf, size_t len);
     739             : 
     740             : /**
     741             :  * @brief Remove a 8-bit value from the beginning of the buffer
     742             :  *
     743             :  * Same idea as with net_buf_simple_pull(), but a helper for operating
     744             :  * on 8-bit values.
     745             :  *
     746             :  * @param buf A valid pointer on a buffer.
     747             :  *
     748             :  * @return The 8-bit removed value
     749             :  */
     750           1 : uint8_t net_buf_simple_pull_u8(struct net_buf_simple *buf);
     751             : 
     752             : /**
     753             :  * @brief Remove and convert 16 bits from the beginning of the buffer.
     754             :  *
     755             :  * Same idea as with net_buf_simple_pull(), but a helper for operating
     756             :  * on 16-bit little endian data.
     757             :  *
     758             :  * @param buf A valid pointer on a buffer.
     759             :  *
     760             :  * @return 16-bit value converted from little endian to host endian.
     761             :  */
     762           1 : uint16_t net_buf_simple_pull_le16(struct net_buf_simple *buf);
     763             : 
     764             : /**
     765             :  * @brief Remove and convert 16 bits from the beginning of the buffer.
     766             :  *
     767             :  * Same idea as with net_buf_simple_pull(), but a helper for operating
     768             :  * on 16-bit big endian data.
     769             :  *
     770             :  * @param buf A valid pointer on a buffer.
     771             :  *
     772             :  * @return 16-bit value converted from big endian to host endian.
     773             :  */
     774           1 : uint16_t net_buf_simple_pull_be16(struct net_buf_simple *buf);
     775             : 
     776             : /**
     777             :  * @brief Remove and convert 24 bits from the beginning of the buffer.
     778             :  *
     779             :  * Same idea as with net_buf_simple_pull(), but a helper for operating
     780             :  * on 24-bit little endian data.
     781             :  *
     782             :  * @param buf A valid pointer on a buffer.
     783             :  *
     784             :  * @return 24-bit value converted from little endian to host endian.
     785             :  */
     786           1 : uint32_t net_buf_simple_pull_le24(struct net_buf_simple *buf);
     787             : 
     788             : /**
     789             :  * @brief Remove and convert 24 bits from the beginning of the buffer.
     790             :  *
     791             :  * Same idea as with net_buf_simple_pull(), but a helper for operating
     792             :  * on 24-bit big endian data.
     793             :  *
     794             :  * @param buf A valid pointer on a buffer.
     795             :  *
     796             :  * @return 24-bit value converted from big endian to host endian.
     797             :  */
     798           1 : uint32_t net_buf_simple_pull_be24(struct net_buf_simple *buf);
     799             : 
     800             : /**
     801             :  * @brief Remove and convert 32 bits from the beginning of the buffer.
     802             :  *
     803             :  * Same idea as with net_buf_simple_pull(), but a helper for operating
     804             :  * on 32-bit little endian data.
     805             :  *
     806             :  * @param buf A valid pointer on a buffer.
     807             :  *
     808             :  * @return 32-bit value converted from little endian to host endian.
     809             :  */
     810           1 : uint32_t net_buf_simple_pull_le32(struct net_buf_simple *buf);
     811             : 
     812             : /**
     813             :  * @brief Remove and convert 32 bits from the beginning of the buffer.
     814             :  *
     815             :  * Same idea as with net_buf_simple_pull(), but a helper for operating
     816             :  * on 32-bit big endian data.
     817             :  *
     818             :  * @param buf A valid pointer on a buffer.
     819             :  *
     820             :  * @return 32-bit value converted from big endian to host endian.
     821             :  */
     822           1 : uint32_t net_buf_simple_pull_be32(struct net_buf_simple *buf);
     823             : 
     824             : /**
     825             :  * @brief Remove and convert 40 bits from the beginning of the buffer.
     826             :  *
     827             :  * Same idea as with net_buf_simple_pull(), but a helper for operating
     828             :  * on 40-bit little endian data.
     829             :  *
     830             :  * @param buf A valid pointer on a buffer.
     831             :  *
     832             :  * @return 40-bit value converted from little endian to host endian.
     833             :  */
     834           1 : uint64_t net_buf_simple_pull_le40(struct net_buf_simple *buf);
     835             : 
     836             : /**
     837             :  * @brief Remove and convert 40 bits from the beginning of the buffer.
     838             :  *
     839             :  * Same idea as with net_buf_simple_pull(), but a helper for operating
     840             :  * on 40-bit big endian data.
     841             :  *
     842             :  * @param buf A valid pointer on a buffer.
     843             :  *
     844             :  * @return 40-bit value converted from big endian to host endian.
     845             :  */
     846           1 : uint64_t net_buf_simple_pull_be40(struct net_buf_simple *buf);
     847             : 
     848             : /**
     849             :  * @brief Remove and convert 48 bits from the beginning of the buffer.
     850             :  *
     851             :  * Same idea as with net_buf_simple_pull(), but a helper for operating
     852             :  * on 48-bit little endian data.
     853             :  *
     854             :  * @param buf A valid pointer on a buffer.
     855             :  *
     856             :  * @return 48-bit value converted from little endian to host endian.
     857             :  */
     858           1 : uint64_t net_buf_simple_pull_le48(struct net_buf_simple *buf);
     859             : 
     860             : /**
     861             :  * @brief Remove and convert 48 bits from the beginning of the buffer.
     862             :  *
     863             :  * Same idea as with net_buf_simple_pull(), but a helper for operating
     864             :  * on 48-bit big endian data.
     865             :  *
     866             :  * @param buf A valid pointer on a buffer.
     867             :  *
     868             :  * @return 48-bit value converted from big endian to host endian.
     869             :  */
     870           1 : uint64_t net_buf_simple_pull_be48(struct net_buf_simple *buf);
     871             : 
     872             : /**
     873             :  * @brief Remove and convert 64 bits from the beginning of the buffer.
     874             :  *
     875             :  * Same idea as with net_buf_simple_pull(), but a helper for operating
     876             :  * on 64-bit little endian data.
     877             :  *
     878             :  * @param buf A valid pointer on a buffer.
     879             :  *
     880             :  * @return 64-bit value converted from little endian to host endian.
     881             :  */
     882           1 : uint64_t net_buf_simple_pull_le64(struct net_buf_simple *buf);
     883             : 
     884             : /**
     885             :  * @brief Remove and convert 64 bits from the beginning of the buffer.
     886             :  *
     887             :  * Same idea as with net_buf_simple_pull(), but a helper for operating
     888             :  * on 64-bit big endian data.
     889             :  *
     890             :  * @param buf A valid pointer on a buffer.
     891             :  *
     892             :  * @return 64-bit value converted from big endian to host endian.
     893             :  */
     894           1 : uint64_t net_buf_simple_pull_be64(struct net_buf_simple *buf);
     895             : 
     896             : /**
     897             :  * @brief Get the tail pointer for a buffer.
     898             :  *
     899             :  * Get a pointer to the end of the data in a buffer.
     900             :  *
     901             :  * @param buf Buffer.
     902             :  *
     903             :  * @return Tail pointer for the buffer.
     904             :  */
     905           1 : static inline uint8_t *net_buf_simple_tail(const struct net_buf_simple *buf)
     906             : {
     907             :         return buf->data + buf->len;
     908             : }
     909             : 
     910             : /**
     911             :  * @brief Check buffer headroom.
     912             :  *
     913             :  * Check how much free space there is in the beginning of the buffer.
     914             :  *
     915             :  * buf A valid pointer on a buffer
     916             :  *
     917             :  * @return Number of bytes available in the beginning of the buffer.
     918             :  */
     919           1 : size_t net_buf_simple_headroom(const struct net_buf_simple *buf);
     920             : 
     921             : /**
     922             :  * @brief Check buffer tailroom.
     923             :  *
     924             :  * Check how much free space there is at the end of the buffer.
     925             :  *
     926             :  * @param buf A valid pointer on a buffer
     927             :  *
     928             :  * @return Number of bytes available at the end of the buffer.
     929             :  */
     930           1 : size_t net_buf_simple_tailroom(const struct net_buf_simple *buf);
     931             : 
     932             : /**
     933             :  * @brief Check maximum net_buf_simple::len value.
     934             :  *
     935             :  * This value is depending on the number of bytes being reserved as headroom.
     936             :  *
     937             :  * @param buf A valid pointer on a buffer
     938             :  *
     939             :  * @return Number of bytes usable behind the net_buf_simple::data pointer.
     940             :  */
     941           1 : uint16_t net_buf_simple_max_len(const struct net_buf_simple *buf);
     942             : 
     943             : /**
     944             :  * @brief Parsing state of a buffer.
     945             :  *
     946             :  * This is used for temporarily storing the parsing state of a buffer
     947             :  * while giving control of the parsing to a routine which we don't
     948             :  * control.
     949             :  */
     950           1 : struct net_buf_simple_state {
     951             :         /** Offset of the data pointer from the beginning of the storage */
     952           1 :         uint16_t offset;
     953             :         /** Length of data */
     954           1 :         uint16_t len;
     955             : };
     956             : 
     957             : /**
     958             :  * @brief Save the parsing state of a buffer.
     959             :  *
     960             :  * Saves the parsing state of a buffer so it can be restored later.
     961             :  *
     962             :  * @param buf Buffer from which the state should be saved.
     963             :  * @param state Storage for the state.
     964             :  */
     965           1 : static inline void net_buf_simple_save(const struct net_buf_simple *buf,
     966             :                                        struct net_buf_simple_state *state)
     967             : {
     968             :         state->offset = (uint16_t)net_buf_simple_headroom(buf);
     969             :         state->len = buf->len;
     970             : }
     971             : 
     972             : /**
     973             :  * @brief Restore the parsing state of a buffer.
     974             :  *
     975             :  * Restores the parsing state of a buffer from a state previously stored
     976             :  * by net_buf_simple_save().
     977             :  *
     978             :  * @param buf Buffer to which the state should be restored.
     979             :  * @param state Stored state.
     980             :  */
     981           1 : static inline void net_buf_simple_restore(struct net_buf_simple *buf,
     982             :                                           struct net_buf_simple_state *state)
     983             : {
     984             :         buf->data = buf->__buf + state->offset;
     985             :         buf->len = state->len;
     986             : }
     987             : 
     988             : /**
     989             :  * Flag indicating that the buffer's associated data pointer, points to
     990             :  * externally allocated memory. Therefore once ref goes down to zero, the
     991             :  * pointed data will not need to be deallocated. This never needs to be
     992             :  * explicitly set or unset by the net_buf API user. Such net_buf is
     993             :  * exclusively instantiated via net_buf_alloc_with_data() function.
     994             :  * Reference count mechanism however will behave the same way, and ref
     995             :  * count going to 0 will free the net_buf but no the data pointer in it.
     996             :  */
     997           1 : #define NET_BUF_EXTERNAL_DATA  BIT(0)
     998             : 
     999             : /**
    1000             :  * @brief Network buffer representation.
    1001             :  *
    1002             :  * This struct is used to represent network buffers. Such buffers are
    1003             :  * normally defined through the NET_BUF_POOL_*_DEFINE() APIs and allocated
    1004             :  * using the net_buf_alloc() API.
    1005             :  */
    1006           1 : struct net_buf {
    1007             :         /** Allow placing the buffer into sys_slist_t */
    1008           1 :         sys_snode_t node;
    1009             : 
    1010             :         /** Fragments associated with this buffer. */
    1011           1 :         struct net_buf *frags;
    1012             : 
    1013             :         /** Reference count. */
    1014           1 :         uint8_t ref;
    1015             : 
    1016             :         /** Bit-field of buffer flags. */
    1017           1 :         uint8_t flags;
    1018             : 
    1019             :         /** Where the buffer should go when freed up. */
    1020           1 :         uint8_t pool_id;
    1021             : 
    1022             :         /** Size of user data on this buffer */
    1023           1 :         uint8_t user_data_size;
    1024             : 
    1025             :         /** Union for convenience access to the net_buf_simple members, also
    1026             :          * preserving the old API.
    1027             :          */
    1028             :         union {
    1029             :                 /* The ABI of this struct must match net_buf_simple */
    1030             :                 struct {
    1031             :                         /** Pointer to the start of data in the buffer. */
    1032           1 :                         uint8_t *data;
    1033             : 
    1034             :                         /** Length of the data behind the data pointer. */
    1035           1 :                         uint16_t len;
    1036             : 
    1037             :                         /** Amount of data that this buffer can store. */
    1038           1 :                         uint16_t size;
    1039             : 
    1040             :                         /** Start of the data storage. Not to be accessed
    1041             :                          *  directly (the data pointer should be used
    1042             :                          *  instead).
    1043             :                          */
    1044             :                         uint8_t *__buf;
    1045             :                 };
    1046             : 
    1047             :                 /** @cond INTERNAL_HIDDEN */
    1048             :                 struct net_buf_simple b;
    1049             :                 /** @endcond */
    1050           1 :         };
    1051             : 
    1052             :         /** System metadata for this buffer. Cleared on allocation. */
    1053           1 :         uint8_t user_data[] __net_buf_align;
    1054             : };
    1055             : 
    1056             : /** @cond INTERNAL_HIDDEN */
    1057             : 
    1058             : struct net_buf_data_cb {
    1059             :         uint8_t * __must_check (*alloc)(struct net_buf *buf, size_t *size,
    1060             :                            k_timeout_t timeout);
    1061             :         uint8_t * __must_check (*ref)(struct net_buf *buf, uint8_t *data);
    1062             :         void   (*unref)(struct net_buf *buf, uint8_t *data);
    1063             : };
    1064             : 
    1065             : struct net_buf_data_alloc {
    1066             :         const struct net_buf_data_cb *cb;
    1067             :         void *alloc_data;
    1068             :         size_t max_alloc_size;
    1069             : };
    1070             : 
    1071             : /** @endcond */
    1072             : 
    1073             : /**
    1074             :  * @brief Network buffer pool representation.
    1075             :  *
    1076             :  * This struct is used to represent a pool of network buffers.
    1077             :  */
    1078           1 : struct net_buf_pool {
    1079             :         /** LIFO to place the buffer into when free */
    1080           1 :         struct k_lifo free;
    1081             : 
    1082             :         /** To prevent concurrent access/modifications */
    1083           1 :         struct k_spinlock lock;
    1084             : 
    1085             :         /** Number of buffers in pool */
    1086           1 :         const uint16_t buf_count;
    1087             : 
    1088             :         /** Number of uninitialized buffers */
    1089           1 :         uint16_t uninit_count;
    1090             : 
    1091             :         /** Size of user data allocated to this pool */
    1092           1 :         uint8_t user_data_size;
    1093             : 
    1094             : #if defined(CONFIG_NET_BUF_POOL_USAGE)
    1095             :         /** Amount of available buffers in the pool. */
    1096             :         atomic_t avail_count;
    1097             : 
    1098             :         /** Total size of the pool. */
    1099             :         const uint16_t pool_size;
    1100             : 
    1101             :         /** Name of the pool. Used when printing pool information. */
    1102             :         const char *name;
    1103             : #endif /* CONFIG_NET_BUF_POOL_USAGE */
    1104             : 
    1105             :         /** Optional destroy callback when buffer is freed. */
    1106           1 :         void (*const destroy)(struct net_buf *buf);
    1107             : 
    1108             :         /** Data allocation handlers. */
    1109           1 :         const struct net_buf_data_alloc *alloc;
    1110             : 
    1111             :         /** Start of buffer storage array */
    1112             :         struct net_buf * const __bufs;
    1113             : };
    1114             : 
    1115             : /** @cond INTERNAL_HIDDEN */
    1116             : #define NET_BUF_POOL_USAGE_INIT(_pool, _count) \
    1117             :         IF_ENABLED(CONFIG_NET_BUF_POOL_USAGE, (.avail_count = ATOMIC_INIT(_count),)) \
    1118             :         IF_ENABLED(CONFIG_NET_BUF_POOL_USAGE, (.name = STRINGIFY(_pool),))
    1119             : 
    1120             : #define NET_BUF_POOL_INITIALIZER(_pool, _alloc, _bufs, _count, _ud_size, _destroy) \
    1121             :         {                                                                          \
    1122             :                 .free = Z_LIFO_INITIALIZER(_pool.free),                            \
    1123             :                 .lock = { },                                                       \
    1124             :                 .buf_count = _count,                                               \
    1125             :                 .uninit_count = _count,                                            \
    1126             :                 .user_data_size = _ud_size,                                        \
    1127             :                 NET_BUF_POOL_USAGE_INIT(_pool, _count)                             \
    1128             :                 .destroy = _destroy,                                               \
    1129             :                 .alloc = _alloc,                                                   \
    1130             :                 .__bufs = (struct net_buf *)_bufs,                                 \
    1131             :         }
    1132             : 
    1133             : #define _NET_BUF_ARRAY_DEFINE(_name, _count, _ud_size)                                         \
    1134             :         struct _net_buf_##_name { uint8_t b[sizeof(struct net_buf)];                           \
    1135             :                                   uint8_t ud[_ud_size]; } __net_buf_align;                     \
    1136             :         BUILD_ASSERT(_ud_size <= UINT8_MAX);                                                \
    1137             :         BUILD_ASSERT(offsetof(struct net_buf, user_data) ==                                    \
    1138             :                      offsetof(struct _net_buf_##_name, ud), "Invalid offset");                       \
    1139             :         BUILD_ASSERT(__alignof__(struct net_buf) ==                                            \
    1140             :                      __alignof__(struct _net_buf_##_name), "Invalid alignment");             \
    1141             :         BUILD_ASSERT(sizeof(struct _net_buf_##_name) ==                                        \
    1142             :                      ROUND_UP(sizeof(struct net_buf) + _ud_size, __alignof__(struct net_buf)), \
    1143             :                      "Size cannot be determined");                                           \
    1144             :         static struct _net_buf_##_name _net_buf_##_name[_count] __noinit
    1145             : 
    1146             : extern const struct net_buf_data_alloc net_buf_heap_alloc;
    1147             : /** @endcond */
    1148             : 
    1149             : /**
    1150             :  *
    1151             :  * @brief Define a new pool for buffers using the heap for the data.
    1152             :  *
    1153             :  * Defines a net_buf_pool struct and the necessary memory storage (array of
    1154             :  * structs) for the needed amount of buffers. After this, the buffers can be
    1155             :  * accessed from the pool through net_buf_alloc. The pool is defined as a
    1156             :  * static variable, so if it needs to be exported outside the current module
    1157             :  * this needs to happen with the help of a separate pointer rather than an
    1158             :  * extern declaration.
    1159             :  *
    1160             :  * The data payload of the buffers will be allocated from the heap using
    1161             :  * k_malloc, so CONFIG_HEAP_MEM_POOL_SIZE must be set to a positive value.
    1162             :  * This kind of pool does not support blocking on the data allocation, so
    1163             :  * the timeout passed to net_buf_alloc will be always treated as K_NO_WAIT
    1164             :  * when trying to allocate the data. This means that allocation failures,
    1165             :  * i.e. NULL returns, must always be handled cleanly.
    1166             :  *
    1167             :  * If provided with a custom destroy callback, this callback is
    1168             :  * responsible for eventually calling net_buf_destroy() to complete the
    1169             :  * process of returning the buffer to the pool.
    1170             :  *
    1171             :  * @param _name      Name of the pool variable.
    1172             :  * @param _count     Number of buffers in the pool.
    1173             :  * @param _ud_size   User data space to reserve per buffer.
    1174             :  * @param _destroy   Optional destroy callback when buffer is freed.
    1175             :  */
    1176           1 : #define NET_BUF_POOL_HEAP_DEFINE(_name, _count, _ud_size, _destroy)          \
    1177             :         _NET_BUF_ARRAY_DEFINE(_name, _count, _ud_size);                      \
    1178             :         static STRUCT_SECTION_ITERABLE(net_buf_pool, _name) =                \
    1179             :                 NET_BUF_POOL_INITIALIZER(_name, &net_buf_heap_alloc,         \
    1180             :                                          _net_buf_##_name, _count, _ud_size, \
    1181             :                                          _destroy)
    1182             : 
    1183             : /** @cond INTERNAL_HIDDEN */
    1184             : 
    1185             : struct net_buf_pool_fixed {
    1186             :         uint8_t *data_pool;
    1187             : };
    1188             : 
    1189             : extern const struct net_buf_data_cb net_buf_fixed_cb;
    1190             : 
    1191             : /** @endcond */
    1192             : 
    1193             : /**
    1194             :  *
    1195             :  * @brief Define a new pool for buffers based on fixed-size data
    1196             :  *
    1197             :  * Defines a net_buf_pool struct and the necessary memory storage (array of
    1198             :  * structs) for the needed amount of buffers. After this, the buffers can be
    1199             :  * accessed from the pool through net_buf_alloc. The pool is defined as a
    1200             :  * static variable, so if it needs to be exported outside the current module
    1201             :  * this needs to happen with the help of a separate pointer rather than an
    1202             :  * extern declaration.
    1203             :  *
    1204             :  * The data payload of the buffers will be allocated from a byte array
    1205             :  * of fixed sized chunks. This kind of pool does not support blocking on
    1206             :  * the data allocation, so the timeout passed to net_buf_alloc will be
    1207             :  * always treated as K_NO_WAIT when trying to allocate the data. This means
    1208             :  * that allocation failures, i.e. NULL returns, must always be handled
    1209             :  * cleanly.
    1210             :  *
    1211             :  * If provided with a custom destroy callback, this callback is
    1212             :  * responsible for eventually calling net_buf_destroy() to complete the
    1213             :  * process of returning the buffer to the pool.
    1214             :  *
    1215             :  * @param _name      Name of the pool variable.
    1216             :  * @param _count     Number of buffers in the pool.
    1217             :  * @param _data_size Maximum data payload per buffer.
    1218             :  * @param _ud_size   User data space to reserve per buffer.
    1219             :  * @param _destroy   Optional destroy callback when buffer is freed.
    1220             :  */
    1221           1 : #define NET_BUF_POOL_FIXED_DEFINE(_name, _count, _data_size, _ud_size, _destroy) \
    1222             :         _NET_BUF_ARRAY_DEFINE(_name, _count, _ud_size);                        \
    1223             :         static uint8_t __noinit net_buf_data_##_name[_count][_data_size] __net_buf_align; \
    1224             :         static const struct net_buf_pool_fixed net_buf_fixed_##_name = {       \
    1225             :                 .data_pool = (uint8_t *)net_buf_data_##_name,                  \
    1226             :         };                                                                     \
    1227             :         static const struct net_buf_data_alloc net_buf_fixed_alloc_##_name = { \
    1228             :                 .cb = &net_buf_fixed_cb,                                       \
    1229             :                 .alloc_data = (void *)&net_buf_fixed_##_name,                  \
    1230             :                 .max_alloc_size = _data_size,                                  \
    1231             :         };                                                                     \
    1232             :         static STRUCT_SECTION_ITERABLE(net_buf_pool, _name) =                  \
    1233             :                 NET_BUF_POOL_INITIALIZER(_name, &net_buf_fixed_alloc_##_name,  \
    1234             :                                          _net_buf_##_name, _count, _ud_size,   \
    1235             :                                          _destroy)
    1236             : 
    1237             : /** @cond INTERNAL_HIDDEN */
    1238             : extern const struct net_buf_data_cb net_buf_var_cb;
    1239             : /** @endcond */
    1240             : 
    1241             : /**
    1242             :  *
    1243             :  * @brief Define a new pool for buffers with variable size payloads
    1244             :  *
    1245             :  * Defines a net_buf_pool struct and the necessary memory storage (array of
    1246             :  * structs) for the needed amount of buffers. After this, the buffers can be
    1247             :  * accessed from the pool through net_buf_alloc. The pool is defined as a
    1248             :  * static variable, so if it needs to be exported outside the current module
    1249             :  * this needs to happen with the help of a separate pointer rather than an
    1250             :  * extern declaration.
    1251             :  *
    1252             :  * The data payload of the buffers will be based on a memory pool from which
    1253             :  * variable size payloads may be allocated.
    1254             :  *
    1255             :  * If provided with a custom destroy callback, this callback is
    1256             :  * responsible for eventually calling net_buf_destroy() to complete the
    1257             :  * process of returning the buffer to the pool.
    1258             :  *
    1259             :  * @param _name      Name of the pool variable.
    1260             :  * @param _count     Number of buffers in the pool.
    1261             :  * @param _data_size Total amount of memory available for data payloads.
    1262             :  * @param _ud_size   User data space to reserve per buffer.
    1263             :  * @param _destroy   Optional destroy callback when buffer is freed.
    1264             :  */
    1265           1 : #define NET_BUF_POOL_VAR_DEFINE(_name, _count, _data_size, _ud_size, _destroy) \
    1266             :         _NET_BUF_ARRAY_DEFINE(_name, _count, _ud_size);                        \
    1267             :         K_HEAP_DEFINE(net_buf_mem_pool_##_name, _data_size);                   \
    1268             :         static const struct net_buf_data_alloc net_buf_data_alloc_##_name = {  \
    1269             :                 .cb = &net_buf_var_cb,                                         \
    1270             :                 .alloc_data = &net_buf_mem_pool_##_name,                       \
    1271             :                 .max_alloc_size = 0,                                           \
    1272             :         };                                                                     \
    1273             :         static STRUCT_SECTION_ITERABLE(net_buf_pool, _name) =                  \
    1274             :                 NET_BUF_POOL_INITIALIZER(_name, &net_buf_data_alloc_##_name,   \
    1275             :                                          _net_buf_##_name, _count, _ud_size,   \
    1276             :                                          _destroy)
    1277             : 
    1278             : /**
    1279             :  *
    1280             :  * @brief Define a new pool for buffers
    1281             :  *
    1282             :  * Defines a net_buf_pool struct and the necessary memory storage (array of
    1283             :  * structs) for the needed amount of buffers. After this,the buffers can be
    1284             :  * accessed from the pool through net_buf_alloc. The pool is defined as a
    1285             :  * static variable, so if it needs to be exported outside the current module
    1286             :  * this needs to happen with the help of a separate pointer rather than an
    1287             :  * extern declaration.
    1288             :  *
    1289             :  * If provided with a custom destroy callback this callback is
    1290             :  * responsible for eventually calling net_buf_destroy() to complete the
    1291             :  * process of returning the buffer to the pool.
    1292             :  *
    1293             :  * @param _name     Name of the pool variable.
    1294             :  * @param _count    Number of buffers in the pool.
    1295             :  * @param _size     Maximum data size for each buffer.
    1296             :  * @param _ud_size  Amount of user data space to reserve.
    1297             :  * @param _destroy  Optional destroy callback when buffer is freed.
    1298             :  */
    1299           1 : #define NET_BUF_POOL_DEFINE(_name, _count, _size, _ud_size, _destroy)        \
    1300             :         NET_BUF_POOL_FIXED_DEFINE(_name, _count, _size, _ud_size, _destroy)
    1301             : 
    1302             : /**
    1303             :  * @brief Looks up a pool based on its ID.
    1304             :  *
    1305             :  * @param id Pool ID (e.g. from buf->pool_id).
    1306             :  *
    1307             :  * @return Pointer to pool.
    1308             :  */
    1309           1 : struct net_buf_pool *net_buf_pool_get(int id);
    1310             : 
    1311             : /**
    1312             :  * @brief Get a zero-based index for a buffer.
    1313             :  *
    1314             :  * This function will translate a buffer into a zero-based index,
    1315             :  * based on its placement in its buffer pool. This can be useful if you
    1316             :  * want to associate an external array of meta-data contexts with the
    1317             :  * buffers of a pool.
    1318             :  *
    1319             :  * @param buf  Network buffer.
    1320             :  *
    1321             :  * @return Zero-based index for the buffer.
    1322             :  */
    1323           1 : int net_buf_id(const struct net_buf *buf);
    1324             : 
    1325             : /**
    1326             :  * @brief Allocate a new fixed buffer from a pool.
    1327             :  *
    1328             :  * @note Some types of data allocators do not support
    1329             :  *       blocking (such as the HEAP type). In this case it's still possible
    1330             :  *       for net_buf_alloc() to fail (return NULL) even if it was given
    1331             :  *       K_FOREVER.
    1332             :  *
    1333             :  * @note The timeout value will be overridden to K_NO_WAIT if called from the
    1334             :  *       system workqueue.
    1335             :  *
    1336             :  * @param pool Which pool to allocate the buffer from.
    1337             :  * @param timeout Affects the action taken should the pool be empty.
    1338             :  *        If K_NO_WAIT, then return immediately. If K_FOREVER, then
    1339             :  *        wait as long as necessary. Otherwise, wait until the specified
    1340             :  *        timeout.
    1341             :  *
    1342             :  * @return New buffer or NULL if out of buffers.
    1343             :  */
    1344             : #if defined(CONFIG_NET_BUF_LOG)
    1345             : struct net_buf * __must_check net_buf_alloc_fixed_debug(struct net_buf_pool *pool,
    1346             :                                                         k_timeout_t timeout,
    1347             :                                                         const char *func,
    1348             :                                                         int line);
    1349             : #define net_buf_alloc_fixed(_pool, _timeout) \
    1350             :         net_buf_alloc_fixed_debug(_pool, _timeout, __func__, __LINE__)
    1351             : #else
    1352           1 : struct net_buf * __must_check net_buf_alloc_fixed(struct net_buf_pool *pool,
    1353             :                                                   k_timeout_t timeout);
    1354             : #endif
    1355             : 
    1356             : /**
    1357             :  * @copydetails net_buf_alloc_fixed
    1358             :  */
    1359           1 : static inline struct net_buf * __must_check net_buf_alloc(struct net_buf_pool *pool,
    1360             :                                                           k_timeout_t timeout)
    1361             : {
    1362             :         return net_buf_alloc_fixed(pool, timeout);
    1363             : }
    1364             : 
    1365             : /**
    1366             :  * @brief Allocate a new variable length buffer from a pool.
    1367             :  *
    1368             :  * @note Some types of data allocators do not support
    1369             :  *       blocking (such as the HEAP type). In this case it's still possible
    1370             :  *       for net_buf_alloc() to fail (return NULL) even if it was given
    1371             :  *       K_FOREVER.
    1372             :  *
    1373             :  * @note The timeout value will be overridden to K_NO_WAIT if called from the
    1374             :  *       system workqueue.
    1375             :  *
    1376             :  * @param pool Which pool to allocate the buffer from.
    1377             :  * @param size Amount of data the buffer must be able to fit.
    1378             :  * @param timeout Affects the action taken should the pool be empty.
    1379             :  *        If K_NO_WAIT, then return immediately. If K_FOREVER, then
    1380             :  *        wait as long as necessary. Otherwise, wait until the specified
    1381             :  *        timeout.
    1382             :  *
    1383             :  * @return New buffer or NULL if out of buffers.
    1384             :  */
    1385             : #if defined(CONFIG_NET_BUF_LOG)
    1386             : struct net_buf * __must_check net_buf_alloc_len_debug(struct net_buf_pool *pool,
    1387             :                                                       size_t size,
    1388             :                                                       k_timeout_t timeout,
    1389             :                                                       const char *func,
    1390             :                                                       int line);
    1391             : #define net_buf_alloc_len(_pool, _size, _timeout) \
    1392             :         net_buf_alloc_len_debug(_pool, _size, _timeout, __func__, __LINE__)
    1393             : #else
    1394           1 : struct net_buf * __must_check net_buf_alloc_len(struct net_buf_pool *pool,
    1395             :                                                 size_t size,
    1396             :                                                 k_timeout_t timeout);
    1397             : #endif
    1398             : 
    1399             : /**
    1400             :  * @brief Allocate a new buffer from a pool but with external data pointer.
    1401             :  *
    1402             :  * Allocate a new buffer from a pool, where the data pointer comes from the
    1403             :  * user and not from the pool.
    1404             :  *
    1405             :  * @note Some types of data allocators do not support
    1406             :  *       blocking (such as the HEAP type). In this case it's still possible
    1407             :  *       for net_buf_alloc() to fail (return NULL) even if it was given
    1408             :  *       K_FOREVER.
    1409             :  *
    1410             :  * @note The timeout value will be overridden to K_NO_WAIT if called from the
    1411             :  *       system workqueue.
    1412             :  *
    1413             :  * @param pool Which pool to allocate the buffer from.
    1414             :  * @param data External data pointer
    1415             :  * @param size Amount of data the pointed data buffer if able to fit.
    1416             :  * @param timeout Affects the action taken should the pool be empty.
    1417             :  *        If K_NO_WAIT, then return immediately. If K_FOREVER, then
    1418             :  *        wait as long as necessary. Otherwise, wait until the specified
    1419             :  *        timeout.
    1420             :  *
    1421             :  * @return New buffer or NULL if out of buffers.
    1422             :  */
    1423             : #if defined(CONFIG_NET_BUF_LOG)
    1424             : struct net_buf * __must_check net_buf_alloc_with_data_debug(struct net_buf_pool *pool,
    1425             :                                                             void *data, size_t size,
    1426             :                                                             k_timeout_t timeout,
    1427             :                                                             const char *func, int line);
    1428             : #define net_buf_alloc_with_data(_pool, _data_, _size, _timeout)         \
    1429             :         net_buf_alloc_with_data_debug(_pool, _data_, _size, _timeout,   \
    1430             :                                       __func__, __LINE__)
    1431             : #else
    1432           1 : struct net_buf * __must_check net_buf_alloc_with_data(struct net_buf_pool *pool,
    1433             :                                                       void *data, size_t size,
    1434             :                                                       k_timeout_t timeout);
    1435             : #endif
    1436             : 
    1437             : /**
    1438             :  * @brief Get a buffer from a FIFO.
    1439             :  *
    1440             :  * @deprecated Use @a k_fifo_get() instead.
    1441             :  *
    1442             :  * @param fifo Which FIFO to take the buffer from.
    1443             :  * @param timeout Affects the action taken should the FIFO be empty.
    1444             :  *        If K_NO_WAIT, then return immediately. If K_FOREVER, then wait as
    1445             :  *        long as necessary. Otherwise, wait until the specified timeout.
    1446             :  *
    1447             :  * @return New buffer or NULL if the FIFO is empty.
    1448             :  */
    1449             : #if defined(CONFIG_NET_BUF_LOG)
    1450             : __deprecated struct net_buf * __must_check net_buf_get_debug(struct k_fifo *fifo,
    1451             :                                                              k_timeout_t timeout,
    1452             :                                                              const char *func, int line);
    1453             : #define net_buf_get(_fifo, _timeout) \
    1454             :         net_buf_get_debug(_fifo, _timeout, __func__, __LINE__)
    1455             : #else
    1456           1 : __deprecated struct net_buf * __must_check net_buf_get(struct k_fifo *fifo,
    1457             :                                                        k_timeout_t timeout);
    1458             : #endif
    1459             : 
    1460             : /**
    1461             :  * @brief Destroy buffer from custom destroy callback
    1462             :  *
    1463             :  * This helper is only intended to be used from custom destroy callbacks.
    1464             :  * If no custom destroy callback is given to NET_BUF_POOL_*_DEFINE() then
    1465             :  * there is no need to use this API.
    1466             :  *
    1467             :  * @param buf Buffer to destroy.
    1468             :  */
    1469           1 : static inline void net_buf_destroy(struct net_buf *buf)
    1470             : {
    1471             :         struct net_buf_pool *pool = net_buf_pool_get(buf->pool_id);
    1472             : 
    1473             :         if (buf->__buf) {
    1474             :                 if (!(buf->flags & NET_BUF_EXTERNAL_DATA)) {
    1475             :                         pool->alloc->cb->unref(buf, buf->__buf);
    1476             :                 }
    1477             :                 buf->__buf = NULL;
    1478             :         }
    1479             : 
    1480             :         k_lifo_put(&pool->free, buf);
    1481             : }
    1482             : 
    1483             : /**
    1484             :  * @brief Reset buffer
    1485             :  *
    1486             :  * Reset buffer data and flags so it can be reused for other purposes.
    1487             :  *
    1488             :  * @param buf Buffer to reset.
    1489             :  */
    1490           1 : void net_buf_reset(struct net_buf *buf);
    1491             : 
    1492             : /**
    1493             :  * @brief Initialize buffer with the given headroom.
    1494             :  *
    1495             :  * The buffer is not expected to contain any data when this API is called.
    1496             :  *
    1497             :  * @param buf Buffer to initialize.
    1498             :  * @param reserve How much headroom to reserve.
    1499             :  */
    1500           1 : void net_buf_simple_reserve(struct net_buf_simple *buf, size_t reserve);
    1501             : 
    1502             : /**
    1503             :  * @brief Put a buffer into a list
    1504             :  *
    1505             :  * @param list Which list to append the buffer to.
    1506             :  * @param buf Buffer.
    1507             :  */
    1508           1 : void net_buf_slist_put(sys_slist_t *list, struct net_buf *buf);
    1509             : 
    1510             : /**
    1511             :  * @brief Get a buffer from a list.
    1512             :  *
    1513             :  * @param list Which list to take the buffer from.
    1514             :  *
    1515             :  * @return New buffer or NULL if the FIFO is empty.
    1516             :  */
    1517           1 : struct net_buf * __must_check net_buf_slist_get(sys_slist_t *list);
    1518             : 
    1519             : /**
    1520             :  * @brief Put a buffer to the end of a FIFO.
    1521             :  *
    1522             :  * @deprecated Use @a k_fifo_put() instead.
    1523             :  *
    1524             :  * @param fifo Which FIFO to put the buffer to.
    1525             :  * @param buf Buffer.
    1526             :  */
    1527           1 : __deprecated void net_buf_put(struct k_fifo *fifo, struct net_buf *buf);
    1528             : 
    1529             : /**
    1530             :  * @brief Decrements the reference count of a buffer.
    1531             :  *
    1532             :  * The buffer is put back into the pool if the reference count reaches zero.
    1533             :  *
    1534             :  * @param buf A valid pointer on a buffer
    1535             :  */
    1536             : #if defined(CONFIG_NET_BUF_LOG)
    1537             : void net_buf_unref_debug(struct net_buf *buf, const char *func, int line);
    1538             : #define net_buf_unref(_buf) \
    1539             :         net_buf_unref_debug(_buf, __func__, __LINE__)
    1540             : #else
    1541           1 : void net_buf_unref(struct net_buf *buf);
    1542             : #endif
    1543             : 
    1544             : /**
    1545             :  * @brief Increment the reference count of a buffer.
    1546             :  *
    1547             :  * @param buf A valid pointer on a buffer
    1548             :  *
    1549             :  * @return the buffer newly referenced
    1550             :  */
    1551           1 : struct net_buf * __must_check net_buf_ref(struct net_buf *buf);
    1552             : 
    1553             : /**
    1554             :  * @brief Clone buffer
    1555             :  *
    1556             :  * Duplicate given buffer including any (user) data and headers currently stored.
    1557             :  *
    1558             :  * @param buf A valid pointer on a buffer
    1559             :  * @param timeout Affects the action taken should the pool be empty.
    1560             :  *        If K_NO_WAIT, then return immediately. If K_FOREVER, then
    1561             :  *        wait as long as necessary. Otherwise, wait until the specified
    1562             :  *        timeout.
    1563             :  *
    1564             :  * @return Cloned buffer or NULL if out of buffers.
    1565             :  */
    1566           1 : struct net_buf * __must_check net_buf_clone(struct net_buf *buf,
    1567             :                                             k_timeout_t timeout);
    1568             : 
    1569             : /**
    1570             :  * @brief Get a pointer to the user data of a buffer.
    1571             :  *
    1572             :  * @param buf A valid pointer on a buffer
    1573             :  *
    1574             :  * @return Pointer to the user data of the buffer.
    1575             :  */
    1576           1 : static inline void * __must_check net_buf_user_data(const struct net_buf *buf)
    1577             : {
    1578             :         return (void *)buf->user_data;
    1579             : }
    1580             : 
    1581             : /**
    1582             :  * @brief Copy user data from one to another buffer.
    1583             :  *
    1584             :  * @param dst A valid pointer to a buffer gettings its user data overwritten.
    1585             :  * @param src A valid pointer to a buffer gettings its user data copied. User data size must be
    1586             :  *            equal to or exceed @a dst.
    1587             :  *
    1588             :  * @return 0 on success or negative error number on failure.
    1589             :  */
    1590           1 : int net_buf_user_data_copy(struct net_buf *dst, const struct net_buf *src);
    1591             : 
    1592             : /**
    1593             :  * @brief Initialize buffer with the given headroom.
    1594             :  *
    1595             :  * The buffer is not expected to contain any data when this API is called.
    1596             :  *
    1597             :  * @param buf Buffer to initialize.
    1598             :  * @param reserve How much headroom to reserve.
    1599             :  */
    1600           1 : static inline void net_buf_reserve(struct net_buf *buf, size_t reserve)
    1601             : {
    1602             :         net_buf_simple_reserve(&buf->b, reserve);
    1603             : }
    1604             : 
    1605             : /**
    1606             :  * @brief Prepare data to be added at the end of the buffer
    1607             :  *
    1608             :  * Increments the data length of a buffer to account for more data
    1609             :  * at the end.
    1610             :  *
    1611             :  * @param buf Buffer to update.
    1612             :  * @param len Number of bytes to increment the length with.
    1613             :  *
    1614             :  * @return The original tail of the buffer.
    1615             :  */
    1616           1 : static inline void *net_buf_add(struct net_buf *buf, size_t len)
    1617             : {
    1618             :         return net_buf_simple_add(&buf->b, len);
    1619             : }
    1620             : 
    1621             : /**
    1622             :  * @brief Copies the given number of bytes to the end of the buffer
    1623             :  *
    1624             :  * Increments the data length of the  buffer to account for more data at
    1625             :  * the end.
    1626             :  *
    1627             :  * @param buf Buffer to update.
    1628             :  * @param mem Location of data to be added.
    1629             :  * @param len Length of data to be added
    1630             :  *
    1631             :  * @return The original tail of the buffer.
    1632             :  */
    1633           1 : static inline void *net_buf_add_mem(struct net_buf *buf, const void *mem,
    1634             :                                     size_t len)
    1635             : {
    1636             :         return net_buf_simple_add_mem(&buf->b, mem, len);
    1637             : }
    1638             : 
    1639             : /**
    1640             :  * @brief Add (8-bit) byte at the end of the buffer
    1641             :  *
    1642             :  * Increments the data length of the  buffer to account for more data at
    1643             :  * the end.
    1644             :  *
    1645             :  * @param buf Buffer to update.
    1646             :  * @param val byte value to be added.
    1647             :  *
    1648             :  * @return Pointer to the value added
    1649             :  */
    1650           1 : static inline uint8_t *net_buf_add_u8(struct net_buf *buf, uint8_t val)
    1651             : {
    1652             :         return net_buf_simple_add_u8(&buf->b, val);
    1653             : }
    1654             : 
    1655             : /**
    1656             :  * @brief Add 16-bit value at the end of the buffer
    1657             :  *
    1658             :  * Adds 16-bit value in little endian format at the end of buffer.
    1659             :  * Increments the data length of a buffer to account for more data
    1660             :  * at the end.
    1661             :  *
    1662             :  * @param buf Buffer to update.
    1663             :  * @param val 16-bit value to be added.
    1664             :  */
    1665           1 : static inline void net_buf_add_le16(struct net_buf *buf, uint16_t val)
    1666             : {
    1667             :         net_buf_simple_add_le16(&buf->b, val);
    1668             : }
    1669             : 
    1670             : /**
    1671             :  * @brief Add 16-bit value at the end of the buffer
    1672             :  *
    1673             :  * Adds 16-bit value in big endian format at the end of buffer.
    1674             :  * Increments the data length of a buffer to account for more data
    1675             :  * at the end.
    1676             :  *
    1677             :  * @param buf Buffer to update.
    1678             :  * @param val 16-bit value to be added.
    1679             :  */
    1680           1 : static inline void net_buf_add_be16(struct net_buf *buf, uint16_t val)
    1681             : {
    1682             :         net_buf_simple_add_be16(&buf->b, val);
    1683             : }
    1684             : 
    1685             : /**
    1686             :  * @brief Add 24-bit value at the end of the buffer
    1687             :  *
    1688             :  * Adds 24-bit value in little endian format at the end of buffer.
    1689             :  * Increments the data length of a buffer to account for more data
    1690             :  * at the end.
    1691             :  *
    1692             :  * @param buf Buffer to update.
    1693             :  * @param val 24-bit value to be added.
    1694             :  */
    1695           1 : static inline void net_buf_add_le24(struct net_buf *buf, uint32_t val)
    1696             : {
    1697             :         net_buf_simple_add_le24(&buf->b, val);
    1698             : }
    1699             : 
    1700             : /**
    1701             :  * @brief Add 24-bit value at the end of the buffer
    1702             :  *
    1703             :  * Adds 24-bit value in big endian format at the end of buffer.
    1704             :  * Increments the data length of a buffer to account for more data
    1705             :  * at the end.
    1706             :  *
    1707             :  * @param buf Buffer to update.
    1708             :  * @param val 24-bit value to be added.
    1709             :  */
    1710           1 : static inline void net_buf_add_be24(struct net_buf *buf, uint32_t val)
    1711             : {
    1712             :         net_buf_simple_add_be24(&buf->b, val);
    1713             : }
    1714             : 
    1715             : /**
    1716             :  * @brief Add 32-bit value at the end of the buffer
    1717             :  *
    1718             :  * Adds 32-bit value in little endian format at the end of buffer.
    1719             :  * Increments the data length of a buffer to account for more data
    1720             :  * at the end.
    1721             :  *
    1722             :  * @param buf Buffer to update.
    1723             :  * @param val 32-bit value to be added.
    1724             :  */
    1725           1 : static inline void net_buf_add_le32(struct net_buf *buf, uint32_t val)
    1726             : {
    1727             :         net_buf_simple_add_le32(&buf->b, val);
    1728             : }
    1729             : 
    1730             : /**
    1731             :  * @brief Add 32-bit value at the end of the buffer
    1732             :  *
    1733             :  * Adds 32-bit value in big endian format at the end of buffer.
    1734             :  * Increments the data length of a buffer to account for more data
    1735             :  * at the end.
    1736             :  *
    1737             :  * @param buf Buffer to update.
    1738             :  * @param val 32-bit value to be added.
    1739             :  */
    1740           1 : static inline void net_buf_add_be32(struct net_buf *buf, uint32_t val)
    1741             : {
    1742             :         net_buf_simple_add_be32(&buf->b, val);
    1743             : }
    1744             : 
    1745             : /**
    1746             :  * @brief Add 40-bit value at the end of the buffer
    1747             :  *
    1748             :  * Adds 40-bit value in little endian format at the end of buffer.
    1749             :  * Increments the data length of a buffer to account for more data
    1750             :  * at the end.
    1751             :  *
    1752             :  * @param buf Buffer to update.
    1753             :  * @param val 40-bit value to be added.
    1754             :  */
    1755           1 : static inline void net_buf_add_le40(struct net_buf *buf, uint64_t val)
    1756             : {
    1757             :         net_buf_simple_add_le40(&buf->b, val);
    1758             : }
    1759             : 
    1760             : /**
    1761             :  * @brief Add 40-bit value at the end of the buffer
    1762             :  *
    1763             :  * Adds 40-bit value in big endian format at the end of buffer.
    1764             :  * Increments the data length of a buffer to account for more data
    1765             :  * at the end.
    1766             :  *
    1767             :  * @param buf Buffer to update.
    1768             :  * @param val 40-bit value to be added.
    1769             :  */
    1770           1 : static inline void net_buf_add_be40(struct net_buf *buf, uint64_t val)
    1771             : {
    1772             :         net_buf_simple_add_be40(&buf->b, val);
    1773             : }
    1774             : 
    1775             : /**
    1776             :  * @brief Add 48-bit value at the end of the buffer
    1777             :  *
    1778             :  * Adds 48-bit value in little endian format at the end of buffer.
    1779             :  * Increments the data length of a buffer to account for more data
    1780             :  * at the end.
    1781             :  *
    1782             :  * @param buf Buffer to update.
    1783             :  * @param val 48-bit value to be added.
    1784             :  */
    1785           1 : static inline void net_buf_add_le48(struct net_buf *buf, uint64_t val)
    1786             : {
    1787             :         net_buf_simple_add_le48(&buf->b, val);
    1788             : }
    1789             : 
    1790             : /**
    1791             :  * @brief Add 48-bit value at the end of the buffer
    1792             :  *
    1793             :  * Adds 48-bit value in big endian format at the end of buffer.
    1794             :  * Increments the data length of a buffer to account for more data
    1795             :  * at the end.
    1796             :  *
    1797             :  * @param buf Buffer to update.
    1798             :  * @param val 48-bit value to be added.
    1799             :  */
    1800           1 : static inline void net_buf_add_be48(struct net_buf *buf, uint64_t val)
    1801             : {
    1802             :         net_buf_simple_add_be48(&buf->b, val);
    1803             : }
    1804             : 
    1805             : /**
    1806             :  * @brief Add 64-bit value at the end of the buffer
    1807             :  *
    1808             :  * Adds 64-bit value in little endian format at the end of buffer.
    1809             :  * Increments the data length of a buffer to account for more data
    1810             :  * at the end.
    1811             :  *
    1812             :  * @param buf Buffer to update.
    1813             :  * @param val 64-bit value to be added.
    1814             :  */
    1815           1 : static inline void net_buf_add_le64(struct net_buf *buf, uint64_t val)
    1816             : {
    1817             :         net_buf_simple_add_le64(&buf->b, val);
    1818             : }
    1819             : 
    1820             : /**
    1821             :  * @brief Add 64-bit value at the end of the buffer
    1822             :  *
    1823             :  * Adds 64-bit value in big endian format at the end of buffer.
    1824             :  * Increments the data length of a buffer to account for more data
    1825             :  * at the end.
    1826             :  *
    1827             :  * @param buf Buffer to update.
    1828             :  * @param val 64-bit value to be added.
    1829             :  */
    1830           1 : static inline void net_buf_add_be64(struct net_buf *buf, uint64_t val)
    1831             : {
    1832             :         net_buf_simple_add_be64(&buf->b, val);
    1833             : }
    1834             : 
    1835             : /**
    1836             :  * @brief Remove data from the end of the buffer.
    1837             :  *
    1838             :  * Removes data from the end of the buffer by modifying the buffer length.
    1839             :  *
    1840             :  * @param buf Buffer to update.
    1841             :  * @param len Number of bytes to remove.
    1842             :  *
    1843             :  * @return New end of the buffer data.
    1844             :  */
    1845           1 : static inline void *net_buf_remove_mem(struct net_buf *buf, size_t len)
    1846             : {
    1847             :         return net_buf_simple_remove_mem(&buf->b, len);
    1848             : }
    1849             : 
    1850             : /**
    1851             :  * @brief Remove a 8-bit value from the end of the buffer
    1852             :  *
    1853             :  * Same idea as with net_buf_remove_mem(), but a helper for operating on
    1854             :  * 8-bit values.
    1855             :  *
    1856             :  * @param buf A valid pointer on a buffer.
    1857             :  *
    1858             :  * @return The 8-bit removed value
    1859             :  */
    1860           1 : static inline uint8_t net_buf_remove_u8(struct net_buf *buf)
    1861             : {
    1862             :         return net_buf_simple_remove_u8(&buf->b);
    1863             : }
    1864             : 
    1865             : /**
    1866             :  * @brief Remove and convert 16 bits from the end of the buffer.
    1867             :  *
    1868             :  * Same idea as with net_buf_remove_mem(), but a helper for operating on
    1869             :  * 16-bit little endian data.
    1870             :  *
    1871             :  * @param buf A valid pointer on a buffer.
    1872             :  *
    1873             :  * @return 16-bit value converted from little endian to host endian.
    1874             :  */
    1875           1 : static inline uint16_t net_buf_remove_le16(struct net_buf *buf)
    1876             : {
    1877             :         return net_buf_simple_remove_le16(&buf->b);
    1878             : }
    1879             : 
    1880             : /**
    1881             :  * @brief Remove and convert 16 bits from the end of the buffer.
    1882             :  *
    1883             :  * Same idea as with net_buf_remove_mem(), but a helper for operating on
    1884             :  * 16-bit big endian data.
    1885             :  *
    1886             :  * @param buf A valid pointer on a buffer.
    1887             :  *
    1888             :  * @return 16-bit value converted from big endian to host endian.
    1889             :  */
    1890           1 : static inline uint16_t net_buf_remove_be16(struct net_buf *buf)
    1891             : {
    1892             :         return net_buf_simple_remove_be16(&buf->b);
    1893             : }
    1894             : 
    1895             : /**
    1896             :  * @brief Remove and convert 24 bits from the end of the buffer.
    1897             :  *
    1898             :  * Same idea as with net_buf_remove_mem(), but a helper for operating on
    1899             :  * 24-bit big endian data.
    1900             :  *
    1901             :  * @param buf A valid pointer on a buffer.
    1902             :  *
    1903             :  * @return 24-bit value converted from big endian to host endian.
    1904             :  */
    1905           1 : static inline uint32_t net_buf_remove_be24(struct net_buf *buf)
    1906             : {
    1907             :         return net_buf_simple_remove_be24(&buf->b);
    1908             : }
    1909             : 
    1910             : /**
    1911             :  * @brief Remove and convert 24 bits from the end of the buffer.
    1912             :  *
    1913             :  * Same idea as with net_buf_remove_mem(), but a helper for operating on
    1914             :  * 24-bit little endian data.
    1915             :  *
    1916             :  * @param buf A valid pointer on a buffer.
    1917             :  *
    1918             :  * @return 24-bit value converted from little endian to host endian.
    1919             :  */
    1920           1 : static inline uint32_t net_buf_remove_le24(struct net_buf *buf)
    1921             : {
    1922             :         return net_buf_simple_remove_le24(&buf->b);
    1923             : }
    1924             : 
    1925             : /**
    1926             :  * @brief Remove and convert 32 bits from the end of the buffer.
    1927             :  *
    1928             :  * Same idea as with net_buf_remove_mem(), but a helper for operating on
    1929             :  * 32-bit little endian data.
    1930             :  *
    1931             :  * @param buf A valid pointer on a buffer.
    1932             :  *
    1933             :  * @return 32-bit value converted from little endian to host endian.
    1934             :  */
    1935           1 : static inline uint32_t net_buf_remove_le32(struct net_buf *buf)
    1936             : {
    1937             :         return net_buf_simple_remove_le32(&buf->b);
    1938             : }
    1939             : 
    1940             : /**
    1941             :  * @brief Remove and convert 32 bits from the end of the buffer.
    1942             :  *
    1943             :  * Same idea as with net_buf_remove_mem(), but a helper for operating on
    1944             :  * 32-bit big endian data.
    1945             :  *
    1946             :  * @param buf A valid pointer on a buffer
    1947             :  *
    1948             :  * @return 32-bit value converted from big endian to host endian.
    1949             :  */
    1950           1 : static inline uint32_t net_buf_remove_be32(struct net_buf *buf)
    1951             : {
    1952             :         return net_buf_simple_remove_be32(&buf->b);
    1953             : }
    1954             : 
    1955             : /**
    1956             :  * @brief Remove and convert 40 bits from the end of the buffer.
    1957             :  *
    1958             :  * Same idea as with net_buf_remove_mem(), but a helper for operating on
    1959             :  * 40-bit little endian data.
    1960             :  *
    1961             :  * @param buf A valid pointer on a buffer.
    1962             :  *
    1963             :  * @return 40-bit value converted from little endian to host endian.
    1964             :  */
    1965           1 : static inline uint64_t net_buf_remove_le40(struct net_buf *buf)
    1966             : {
    1967             :         return net_buf_simple_remove_le40(&buf->b);
    1968             : }
    1969             : 
    1970             : /**
    1971             :  * @brief Remove and convert 40 bits from the end of the buffer.
    1972             :  *
    1973             :  * Same idea as with net_buf_remove_mem(), but a helper for operating on
    1974             :  * 40-bit big endian data.
    1975             :  *
    1976             :  * @param buf A valid pointer on a buffer
    1977             :  *
    1978             :  * @return 40-bit value converted from big endian to host endian.
    1979             :  */
    1980           1 : static inline uint64_t net_buf_remove_be40(struct net_buf *buf)
    1981             : {
    1982             :         return net_buf_simple_remove_be40(&buf->b);
    1983             : }
    1984             : 
    1985             : /**
    1986             :  * @brief Remove and convert 48 bits from the end of the buffer.
    1987             :  *
    1988             :  * Same idea as with net_buf_remove_mem(), but a helper for operating on
    1989             :  * 48-bit little endian data.
    1990             :  *
    1991             :  * @param buf A valid pointer on a buffer.
    1992             :  *
    1993             :  * @return 48-bit value converted from little endian to host endian.
    1994             :  */
    1995           1 : static inline uint64_t net_buf_remove_le48(struct net_buf *buf)
    1996             : {
    1997             :         return net_buf_simple_remove_le48(&buf->b);
    1998             : }
    1999             : 
    2000             : /**
    2001             :  * @brief Remove and convert 48 bits from the end of the buffer.
    2002             :  *
    2003             :  * Same idea as with net_buf_remove_mem(), but a helper for operating on
    2004             :  * 48-bit big endian data.
    2005             :  *
    2006             :  * @param buf A valid pointer on a buffer
    2007             :  *
    2008             :  * @return 48-bit value converted from big endian to host endian.
    2009             :  */
    2010           1 : static inline uint64_t net_buf_remove_be48(struct net_buf *buf)
    2011             : {
    2012             :         return net_buf_simple_remove_be48(&buf->b);
    2013             : }
    2014             : 
    2015             : /**
    2016             :  * @brief Remove and convert 64 bits from the end of the buffer.
    2017             :  *
    2018             :  * Same idea as with net_buf_remove_mem(), but a helper for operating on
    2019             :  * 64-bit little endian data.
    2020             :  *
    2021             :  * @param buf A valid pointer on a buffer.
    2022             :  *
    2023             :  * @return 64-bit value converted from little endian to host endian.
    2024             :  */
    2025           1 : static inline uint64_t net_buf_remove_le64(struct net_buf *buf)
    2026             : {
    2027             :         return net_buf_simple_remove_le64(&buf->b);
    2028             : }
    2029             : 
    2030             : /**
    2031             :  * @brief Remove and convert 64 bits from the end of the buffer.
    2032             :  *
    2033             :  * Same idea as with net_buf_remove_mem(), but a helper for operating on
    2034             :  * 64-bit big endian data.
    2035             :  *
    2036             :  * @param buf A valid pointer on a buffer
    2037             :  *
    2038             :  * @return 64-bit value converted from big endian to host endian.
    2039             :  */
    2040           1 : static inline uint64_t net_buf_remove_be64(struct net_buf *buf)
    2041             : {
    2042             :         return net_buf_simple_remove_be64(&buf->b);
    2043             : }
    2044             : 
    2045             : /**
    2046             :  * @brief Prepare data to be added at the start of the buffer
    2047             :  *
    2048             :  * Modifies the data pointer and buffer length to account for more data
    2049             :  * in the beginning of the buffer.
    2050             :  *
    2051             :  * @param buf Buffer to update.
    2052             :  * @param len Number of bytes to add to the beginning.
    2053             :  *
    2054             :  * @return The new beginning of the buffer data.
    2055             :  */
    2056           1 : static inline void *net_buf_push(struct net_buf *buf, size_t len)
    2057             : {
    2058             :         return net_buf_simple_push(&buf->b, len);
    2059             : }
    2060             : 
    2061             : /**
    2062             :  * @brief Copies the given number of bytes to the start of the buffer
    2063             :  *
    2064             :  * Modifies the data pointer and buffer length to account for more data
    2065             :  * in the beginning of the buffer.
    2066             :  *
    2067             :  * @param buf Buffer to update.
    2068             :  * @param mem Location of data to be added.
    2069             :  * @param len Length of data to be added.
    2070             :  *
    2071             :  * @return The new beginning of the buffer data.
    2072             :  */
    2073           1 : static inline void *net_buf_push_mem(struct net_buf *buf, const void *mem,
    2074             :                                      size_t len)
    2075             : {
    2076             :         return net_buf_simple_push_mem(&buf->b, mem, len);
    2077             : }
    2078             : 
    2079             : /**
    2080             :  * @brief Push 8-bit value to the beginning of the buffer
    2081             :  *
    2082             :  * Adds 8-bit value the beginning of the buffer.
    2083             :  *
    2084             :  * @param buf Buffer to update.
    2085             :  * @param val 8-bit value to be pushed to the buffer.
    2086             :  */
    2087           1 : static inline void net_buf_push_u8(struct net_buf *buf, uint8_t val)
    2088             : {
    2089             :         net_buf_simple_push_u8(&buf->b, val);
    2090             : }
    2091             : 
    2092             : /**
    2093             :  * @brief Push 16-bit value to the beginning of the buffer
    2094             :  *
    2095             :  * Adds 16-bit value in little endian format to the beginning of the
    2096             :  * buffer.
    2097             :  *
    2098             :  * @param buf Buffer to update.
    2099             :  * @param val 16-bit value to be pushed to the buffer.
    2100             :  */
    2101           1 : static inline void net_buf_push_le16(struct net_buf *buf, uint16_t val)
    2102             : {
    2103             :         net_buf_simple_push_le16(&buf->b, val);
    2104             : }
    2105             : 
    2106             : /**
    2107             :  * @brief Push 16-bit value to the beginning of the buffer
    2108             :  *
    2109             :  * Adds 16-bit value in big endian format to the beginning of the
    2110             :  * buffer.
    2111             :  *
    2112             :  * @param buf Buffer to update.
    2113             :  * @param val 16-bit value to be pushed to the buffer.
    2114             :  */
    2115           1 : static inline void net_buf_push_be16(struct net_buf *buf, uint16_t val)
    2116             : {
    2117             :         net_buf_simple_push_be16(&buf->b, val);
    2118             : }
    2119             : 
    2120             : /**
    2121             :  * @brief Push 24-bit value to the beginning of the buffer
    2122             :  *
    2123             :  * Adds 24-bit value in little endian format to the beginning of the
    2124             :  * buffer.
    2125             :  *
    2126             :  * @param buf Buffer to update.
    2127             :  * @param val 24-bit value to be pushed to the buffer.
    2128             :  */
    2129           1 : static inline void net_buf_push_le24(struct net_buf *buf, uint32_t val)
    2130             : {
    2131             :         net_buf_simple_push_le24(&buf->b, val);
    2132             : }
    2133             : 
    2134             : /**
    2135             :  * @brief Push 24-bit value to the beginning of the buffer
    2136             :  *
    2137             :  * Adds 24-bit value in big endian format to the beginning of the
    2138             :  * buffer.
    2139             :  *
    2140             :  * @param buf Buffer to update.
    2141             :  * @param val 24-bit value to be pushed to the buffer.
    2142             :  */
    2143           1 : static inline void net_buf_push_be24(struct net_buf *buf, uint32_t val)
    2144             : {
    2145             :         net_buf_simple_push_be24(&buf->b, val);
    2146             : }
    2147             : 
    2148             : /**
    2149             :  * @brief Push 32-bit value to the beginning of the buffer
    2150             :  *
    2151             :  * Adds 32-bit value in little endian format to the beginning of the
    2152             :  * buffer.
    2153             :  *
    2154             :  * @param buf Buffer to update.
    2155             :  * @param val 32-bit value to be pushed to the buffer.
    2156             :  */
    2157           1 : static inline void net_buf_push_le32(struct net_buf *buf, uint32_t val)
    2158             : {
    2159             :         net_buf_simple_push_le32(&buf->b, val);
    2160             : }
    2161             : 
    2162             : /**
    2163             :  * @brief Push 32-bit value to the beginning of the buffer
    2164             :  *
    2165             :  * Adds 32-bit value in big endian format to the beginning of the
    2166             :  * buffer.
    2167             :  *
    2168             :  * @param buf Buffer to update.
    2169             :  * @param val 32-bit value to be pushed to the buffer.
    2170             :  */
    2171           1 : static inline void net_buf_push_be32(struct net_buf *buf, uint32_t val)
    2172             : {
    2173             :         net_buf_simple_push_be32(&buf->b, val);
    2174             : }
    2175             : 
    2176             : /**
    2177             :  * @brief Push 40-bit value to the beginning of the buffer
    2178             :  *
    2179             :  * Adds 40-bit value in little endian format to the beginning of the
    2180             :  * buffer.
    2181             :  *
    2182             :  * @param buf Buffer to update.
    2183             :  * @param val 40-bit value to be pushed to the buffer.
    2184             :  */
    2185           1 : static inline void net_buf_push_le40(struct net_buf *buf, uint64_t val)
    2186             : {
    2187             :         net_buf_simple_push_le40(&buf->b, val);
    2188             : }
    2189             : 
    2190             : /**
    2191             :  * @brief Push 40-bit value to the beginning of the buffer
    2192             :  *
    2193             :  * Adds 40-bit value in big endian format to the beginning of the
    2194             :  * buffer.
    2195             :  *
    2196             :  * @param buf Buffer to update.
    2197             :  * @param val 40-bit value to be pushed to the buffer.
    2198             :  */
    2199           1 : static inline void net_buf_push_be40(struct net_buf *buf, uint64_t val)
    2200             : {
    2201             :         net_buf_simple_push_be40(&buf->b, val);
    2202             : }
    2203             : 
    2204             : /**
    2205             :  * @brief Push 48-bit value to the beginning of the buffer
    2206             :  *
    2207             :  * Adds 48-bit value in little endian format to the beginning of the
    2208             :  * buffer.
    2209             :  *
    2210             :  * @param buf Buffer to update.
    2211             :  * @param val 48-bit value to be pushed to the buffer.
    2212             :  */
    2213           1 : static inline void net_buf_push_le48(struct net_buf *buf, uint64_t val)
    2214             : {
    2215             :         net_buf_simple_push_le48(&buf->b, val);
    2216             : }
    2217             : 
    2218             : /**
    2219             :  * @brief Push 48-bit value to the beginning of the buffer
    2220             :  *
    2221             :  * Adds 48-bit value in big endian format to the beginning of the
    2222             :  * buffer.
    2223             :  *
    2224             :  * @param buf Buffer to update.
    2225             :  * @param val 48-bit value to be pushed to the buffer.
    2226             :  */
    2227           1 : static inline void net_buf_push_be48(struct net_buf *buf, uint64_t val)
    2228             : {
    2229             :         net_buf_simple_push_be48(&buf->b, val);
    2230             : }
    2231             : 
    2232             : /**
    2233             :  * @brief Push 64-bit value to the beginning of the buffer
    2234             :  *
    2235             :  * Adds 64-bit value in little endian format to the beginning of the
    2236             :  * buffer.
    2237             :  *
    2238             :  * @param buf Buffer to update.
    2239             :  * @param val 64-bit value to be pushed to the buffer.
    2240             :  */
    2241           1 : static inline void net_buf_push_le64(struct net_buf *buf, uint64_t val)
    2242             : {
    2243             :         net_buf_simple_push_le64(&buf->b, val);
    2244             : }
    2245             : 
    2246             : /**
    2247             :  * @brief Push 64-bit value to the beginning of the buffer
    2248             :  *
    2249             :  * Adds 64-bit value in big endian format to the beginning of the
    2250             :  * buffer.
    2251             :  *
    2252             :  * @param buf Buffer to update.
    2253             :  * @param val 64-bit value to be pushed to the buffer.
    2254             :  */
    2255           1 : static inline void net_buf_push_be64(struct net_buf *buf, uint64_t val)
    2256             : {
    2257             :         net_buf_simple_push_be64(&buf->b, val);
    2258             : }
    2259             : 
    2260             : /**
    2261             :  * @brief Remove data from the beginning of the buffer.
    2262             :  *
    2263             :  * Removes data from the beginning of the buffer by modifying the data
    2264             :  * pointer and buffer length.
    2265             :  *
    2266             :  * @param buf Buffer to update.
    2267             :  * @param len Number of bytes to remove.
    2268             :  *
    2269             :  * @return New beginning of the buffer data.
    2270             :  */
    2271           1 : static inline void *net_buf_pull(struct net_buf *buf, size_t len)
    2272             : {
    2273             :         return net_buf_simple_pull(&buf->b, len);
    2274             : }
    2275             : 
    2276             : /**
    2277             :  * @brief Remove data from the beginning of the buffer.
    2278             :  *
    2279             :  * Removes data from the beginning of the buffer by modifying the data
    2280             :  * pointer and buffer length.
    2281             :  *
    2282             :  * @param buf Buffer to update.
    2283             :  * @param len Number of bytes to remove.
    2284             :  *
    2285             :  * @return Pointer to the old beginning of the buffer data.
    2286             :  */
    2287           1 : static inline void *net_buf_pull_mem(struct net_buf *buf, size_t len)
    2288             : {
    2289             :         return net_buf_simple_pull_mem(&buf->b, len);
    2290             : }
    2291             : 
    2292             : /**
    2293             :  * @brief Remove a 8-bit value from the beginning of the buffer
    2294             :  *
    2295             :  * Same idea as with net_buf_pull(), but a helper for operating on
    2296             :  * 8-bit values.
    2297             :  *
    2298             :  * @param buf A valid pointer on a buffer.
    2299             :  *
    2300             :  * @return The 8-bit removed value
    2301             :  */
    2302           1 : static inline uint8_t net_buf_pull_u8(struct net_buf *buf)
    2303             : {
    2304             :         return net_buf_simple_pull_u8(&buf->b);
    2305             : }
    2306             : 
    2307             : /**
    2308             :  * @brief Remove and convert 16 bits from the beginning of the buffer.
    2309             :  *
    2310             :  * Same idea as with net_buf_pull(), but a helper for operating on
    2311             :  * 16-bit little endian data.
    2312             :  *
    2313             :  * @param buf A valid pointer on a buffer.
    2314             :  *
    2315             :  * @return 16-bit value converted from little endian to host endian.
    2316             :  */
    2317           1 : static inline uint16_t net_buf_pull_le16(struct net_buf *buf)
    2318             : {
    2319             :         return net_buf_simple_pull_le16(&buf->b);
    2320             : }
    2321             : 
    2322             : /**
    2323             :  * @brief Remove and convert 16 bits from the beginning of the buffer.
    2324             :  *
    2325             :  * Same idea as with net_buf_pull(), but a helper for operating on
    2326             :  * 16-bit big endian data.
    2327             :  *
    2328             :  * @param buf A valid pointer on a buffer.
    2329             :  *
    2330             :  * @return 16-bit value converted from big endian to host endian.
    2331             :  */
    2332           1 : static inline uint16_t net_buf_pull_be16(struct net_buf *buf)
    2333             : {
    2334             :         return net_buf_simple_pull_be16(&buf->b);
    2335             : }
    2336             : 
    2337             : /**
    2338             :  * @brief Remove and convert 24 bits from the beginning of the buffer.
    2339             :  *
    2340             :  * Same idea as with net_buf_pull(), but a helper for operating on
    2341             :  * 24-bit little endian data.
    2342             :  *
    2343             :  * @param buf A valid pointer on a buffer.
    2344             :  *
    2345             :  * @return 24-bit value converted from little endian to host endian.
    2346             :  */
    2347           1 : static inline uint32_t net_buf_pull_le24(struct net_buf *buf)
    2348             : {
    2349             :         return net_buf_simple_pull_le24(&buf->b);
    2350             : }
    2351             : 
    2352             : /**
    2353             :  * @brief Remove and convert 24 bits from the beginning of the buffer.
    2354             :  *
    2355             :  * Same idea as with net_buf_pull(), but a helper for operating on
    2356             :  * 24-bit big endian data.
    2357             :  *
    2358             :  * @param buf A valid pointer on a buffer.
    2359             :  *
    2360             :  * @return 24-bit value converted from big endian to host endian.
    2361             :  */
    2362           1 : static inline uint32_t net_buf_pull_be24(struct net_buf *buf)
    2363             : {
    2364             :         return net_buf_simple_pull_be24(&buf->b);
    2365             : }
    2366             : 
    2367             : /**
    2368             :  * @brief Remove and convert 32 bits from the beginning of the buffer.
    2369             :  *
    2370             :  * Same idea as with net_buf_pull(), but a helper for operating on
    2371             :  * 32-bit little endian data.
    2372             :  *
    2373             :  * @param buf A valid pointer on a buffer.
    2374             :  *
    2375             :  * @return 32-bit value converted from little endian to host endian.
    2376             :  */
    2377           1 : static inline uint32_t net_buf_pull_le32(struct net_buf *buf)
    2378             : {
    2379             :         return net_buf_simple_pull_le32(&buf->b);
    2380             : }
    2381             : 
    2382             : /**
    2383             :  * @brief Remove and convert 32 bits from the beginning of the buffer.
    2384             :  *
    2385             :  * Same idea as with net_buf_pull(), but a helper for operating on
    2386             :  * 32-bit big endian data.
    2387             :  *
    2388             :  * @param buf A valid pointer on a buffer
    2389             :  *
    2390             :  * @return 32-bit value converted from big endian to host endian.
    2391             :  */
    2392           1 : static inline uint32_t net_buf_pull_be32(struct net_buf *buf)
    2393             : {
    2394             :         return net_buf_simple_pull_be32(&buf->b);
    2395             : }
    2396             : 
    2397             : /**
    2398             :  * @brief Remove and convert 40 bits from the beginning of the buffer.
    2399             :  *
    2400             :  * Same idea as with net_buf_pull(), but a helper for operating on
    2401             :  * 40-bit little endian data.
    2402             :  *
    2403             :  * @param buf A valid pointer on a buffer.
    2404             :  *
    2405             :  * @return 40-bit value converted from little endian to host endian.
    2406             :  */
    2407           1 : static inline uint64_t net_buf_pull_le40(struct net_buf *buf)
    2408             : {
    2409             :         return net_buf_simple_pull_le40(&buf->b);
    2410             : }
    2411             : 
    2412             : /**
    2413             :  * @brief Remove and convert 40 bits from the beginning of the buffer.
    2414             :  *
    2415             :  * Same idea as with net_buf_pull(), but a helper for operating on
    2416             :  * 40-bit big endian data.
    2417             :  *
    2418             :  * @param buf A valid pointer on a buffer
    2419             :  *
    2420             :  * @return 40-bit value converted from big endian to host endian.
    2421             :  */
    2422           1 : static inline uint64_t net_buf_pull_be40(struct net_buf *buf)
    2423             : {
    2424             :         return net_buf_simple_pull_be40(&buf->b);
    2425             : }
    2426             : 
    2427             : /**
    2428             :  * @brief Remove and convert 48 bits from the beginning of the buffer.
    2429             :  *
    2430             :  * Same idea as with net_buf_pull(), but a helper for operating on
    2431             :  * 48-bit little endian data.
    2432             :  *
    2433             :  * @param buf A valid pointer on a buffer.
    2434             :  *
    2435             :  * @return 48-bit value converted from little endian to host endian.
    2436             :  */
    2437           1 : static inline uint64_t net_buf_pull_le48(struct net_buf *buf)
    2438             : {
    2439             :         return net_buf_simple_pull_le48(&buf->b);
    2440             : }
    2441             : 
    2442             : /**
    2443             :  * @brief Remove and convert 48 bits from the beginning of the buffer.
    2444             :  *
    2445             :  * Same idea as with net_buf_pull(), but a helper for operating on
    2446             :  * 48-bit big endian data.
    2447             :  *
    2448             :  * @param buf A valid pointer on a buffer
    2449             :  *
    2450             :  * @return 48-bit value converted from big endian to host endian.
    2451             :  */
    2452           1 : static inline uint64_t net_buf_pull_be48(struct net_buf *buf)
    2453             : {
    2454             :         return net_buf_simple_pull_be48(&buf->b);
    2455             : }
    2456             : 
    2457             : /**
    2458             :  * @brief Remove and convert 64 bits from the beginning of the buffer.
    2459             :  *
    2460             :  * Same idea as with net_buf_pull(), but a helper for operating on
    2461             :  * 64-bit little endian data.
    2462             :  *
    2463             :  * @param buf A valid pointer on a buffer.
    2464             :  *
    2465             :  * @return 64-bit value converted from little endian to host endian.
    2466             :  */
    2467           1 : static inline uint64_t net_buf_pull_le64(struct net_buf *buf)
    2468             : {
    2469             :         return net_buf_simple_pull_le64(&buf->b);
    2470             : }
    2471             : 
    2472             : /**
    2473             :  * @brief Remove and convert 64 bits from the beginning of the buffer.
    2474             :  *
    2475             :  * Same idea as with net_buf_pull(), but a helper for operating on
    2476             :  * 64-bit big endian data.
    2477             :  *
    2478             :  * @param buf A valid pointer on a buffer
    2479             :  *
    2480             :  * @return 64-bit value converted from big endian to host endian.
    2481             :  */
    2482           1 : static inline uint64_t net_buf_pull_be64(struct net_buf *buf)
    2483             : {
    2484             :         return net_buf_simple_pull_be64(&buf->b);
    2485             : }
    2486             : 
    2487             : /**
    2488             :  * @brief Check buffer tailroom.
    2489             :  *
    2490             :  * Check how much free space there is at the end of the buffer.
    2491             :  *
    2492             :  * @param buf A valid pointer on a buffer
    2493             :  *
    2494             :  * @return Number of bytes available at the end of the buffer.
    2495             :  */
    2496           1 : static inline size_t net_buf_tailroom(const struct net_buf *buf)
    2497             : {
    2498             :         return net_buf_simple_tailroom(&buf->b);
    2499             : }
    2500             : 
    2501             : /**
    2502             :  * @brief Check buffer headroom.
    2503             :  *
    2504             :  * Check how much free space there is in the beginning of the buffer.
    2505             :  *
    2506             :  * buf A valid pointer on a buffer
    2507             :  *
    2508             :  * @return Number of bytes available in the beginning of the buffer.
    2509             :  */
    2510           1 : static inline size_t net_buf_headroom(const struct net_buf *buf)
    2511             : {
    2512             :         return net_buf_simple_headroom(&buf->b);
    2513             : }
    2514             : 
    2515             : /**
    2516             :  * @brief Check maximum net_buf::len value.
    2517             :  *
    2518             :  * This value is depending on the number of bytes being reserved as headroom.
    2519             :  *
    2520             :  * @param buf A valid pointer on a buffer
    2521             :  *
    2522             :  * @return Number of bytes usable behind the net_buf::data pointer.
    2523             :  */
    2524           1 : static inline uint16_t net_buf_max_len(const struct net_buf *buf)
    2525             : {
    2526             :         return net_buf_simple_max_len(&buf->b);
    2527             : }
    2528             : 
    2529             : /**
    2530             :  * @brief Get the tail pointer for a buffer.
    2531             :  *
    2532             :  * Get a pointer to the end of the data in a buffer.
    2533             :  *
    2534             :  * @param buf Buffer.
    2535             :  *
    2536             :  * @return Tail pointer for the buffer.
    2537             :  */
    2538           1 : static inline uint8_t *net_buf_tail(const struct net_buf *buf)
    2539             : {
    2540             :         return net_buf_simple_tail(&buf->b);
    2541             : }
    2542             : 
    2543             : /**
    2544             :  * @brief Find the last fragment in the fragment list.
    2545             :  *
    2546             :  * @return Pointer to last fragment in the list.
    2547             :  */
    2548           1 : struct net_buf *net_buf_frag_last(struct net_buf *frags);
    2549             : 
    2550             : /**
    2551             :  * @brief Insert a new fragment to a chain of bufs.
    2552             :  *
    2553             :  * Insert a new fragment into the buffer fragments list after the parent.
    2554             :  *
    2555             :  * Note: This function takes ownership of the fragment reference so the
    2556             :  * caller is not required to unref.
    2557             :  *
    2558             :  * @param parent Parent buffer/fragment.
    2559             :  * @param frag Fragment to insert.
    2560             :  */
    2561           1 : void net_buf_frag_insert(struct net_buf *parent, struct net_buf *frag);
    2562             : 
    2563             : /**
    2564             :  * @brief Add a new fragment to the end of a chain of bufs.
    2565             :  *
    2566             :  * Append a new fragment into the buffer fragments list.
    2567             :  *
    2568             :  * Note: This function takes ownership of the fragment reference so the
    2569             :  * caller is not required to unref.
    2570             :  *
    2571             :  * @param head Head of the fragment chain.
    2572             :  * @param frag Fragment to add.
    2573             :  *
    2574             :  * @return New head of the fragment chain. Either head (if head
    2575             :  *         was non-NULL) or frag (if head was NULL).
    2576             :  */
    2577           1 : struct net_buf *net_buf_frag_add(struct net_buf *head, struct net_buf *frag);
    2578             : 
    2579             : /**
    2580             :  * @brief Delete existing fragment from a chain of bufs.
    2581             :  *
    2582             :  * @param parent Parent buffer/fragment, or NULL if there is no parent.
    2583             :  * @param frag Fragment to delete.
    2584             :  *
    2585             :  * @return Pointer to the buffer following the fragment, or NULL if it
    2586             :  *         had no further fragments.
    2587             :  */
    2588             : #if defined(CONFIG_NET_BUF_LOG)
    2589             : struct net_buf *net_buf_frag_del_debug(struct net_buf *parent,
    2590             :                                        struct net_buf *frag,
    2591             :                                        const char *func, int line);
    2592             : #define net_buf_frag_del(_parent, _frag) \
    2593             :         net_buf_frag_del_debug(_parent, _frag, __func__, __LINE__)
    2594             : #else
    2595           1 : struct net_buf *net_buf_frag_del(struct net_buf *parent, struct net_buf *frag);
    2596             : #endif
    2597             : 
    2598             : /**
    2599             :  * @brief Copy bytes from net_buf chain starting at offset to linear buffer
    2600             :  *
    2601             :  * Copy (extract) @a len bytes from @a src net_buf chain, starting from @a
    2602             :  * offset in it, to a linear buffer @a dst. Return number of bytes actually
    2603             :  * copied, which may be less than requested, if net_buf chain doesn't have
    2604             :  * enough data, or destination buffer is too small.
    2605             :  *
    2606             :  * @param dst Destination buffer
    2607             :  * @param dst_len Destination buffer length
    2608             :  * @param src Source net_buf chain
    2609             :  * @param offset Starting offset to copy from
    2610             :  * @param len Number of bytes to copy
    2611             :  * @return number of bytes actually copied
    2612             :  */
    2613           1 : size_t net_buf_linearize(void *dst, size_t dst_len,
    2614             :                          const struct net_buf *src, size_t offset, size_t len);
    2615             : 
    2616             : /**
    2617             :  * @typedef net_buf_allocator_cb
    2618             :  * @brief Network buffer allocator callback.
    2619             :  *
    2620             :  * @details The allocator callback is called when net_buf_append_bytes
    2621             :  * needs to allocate a new net_buf.
    2622             :  *
    2623             :  * @param timeout Affects the action taken should the net buf pool be empty.
    2624             :  *        If K_NO_WAIT, then return immediately. If K_FOREVER, then
    2625             :  *        wait as long as necessary. Otherwise, wait until the specified
    2626             :  *        timeout.
    2627             :  * @param user_data The user data given in net_buf_append_bytes call.
    2628             :  * @return pointer to allocated net_buf or NULL on error.
    2629             :  */
    2630             : typedef struct net_buf * __must_check (*net_buf_allocator_cb)(k_timeout_t timeout,
    2631             :                                                               void *user_data);
    2632             : 
    2633             : /**
    2634             :  * @brief Append data to a list of net_buf
    2635             :  *
    2636             :  * @details Append data to a net_buf. If there is not enough space in the
    2637             :  * net_buf then more net_buf will be added, unless there are no free net_buf
    2638             :  * and timeout occurs. If not allocator is provided it attempts to allocate from
    2639             :  * the same pool as the original buffer.
    2640             :  *
    2641             :  * @param buf Network buffer.
    2642             :  * @param len Total length of input data
    2643             :  * @param value Data to be added
    2644             :  * @param timeout Timeout is passed to the net_buf allocator callback.
    2645             :  * @param allocate_cb When a new net_buf is required, use this callback.
    2646             :  * @param user_data A user data pointer to be supplied to the allocate_cb.
    2647             :  *        This pointer is can be anything from a mem_pool or a net_pkt, the
    2648             :  *        logic is left up to the allocate_cb function.
    2649             :  *
    2650             :  * @return Length of data actually added. This may be less than input
    2651             :  *         length if other timeout than K_FOREVER was used, and there
    2652             :  *         were no free fragments in a pool to accommodate all data.
    2653             :  */
    2654           1 : size_t net_buf_append_bytes(struct net_buf *buf, size_t len,
    2655             :                             const void *value, k_timeout_t timeout,
    2656             :                             net_buf_allocator_cb allocate_cb, void *user_data);
    2657             : 
    2658             : /**
    2659             :  * @brief Match data with a net_buf's content
    2660             :  *
    2661             :  * @details Compare data with a content of a net_buf. Provide information about
    2662             :  * the number of bytes matching between both. If needed, traverse
    2663             :  * through multiple buffer fragments.
    2664             :  *
    2665             :  * @param buf Network buffer
    2666             :  * @param offset Starting offset to compare from
    2667             :  * @param data Data buffer for comparison
    2668             :  * @param len Number of bytes to compare
    2669             :  *
    2670             :  * @return The number of bytes compared before the first difference.
    2671             :  */
    2672           1 : size_t net_buf_data_match(const struct net_buf *buf, size_t offset, const void *data, size_t len);
    2673             : 
    2674             : /**
    2675             :  * @brief Skip N number of bytes in a net_buf
    2676             :  *
    2677             :  * @details Skip N number of bytes starting from fragment's offset. If the total
    2678             :  * length of data is placed in multiple fragments, this function will skip from
    2679             :  * all fragments until it reaches N number of bytes.  Any fully skipped buffers
    2680             :  * are removed from the net_buf list.
    2681             :  *
    2682             :  * @param buf Network buffer.
    2683             :  * @param len Total length of data to be skipped.
    2684             :  *
    2685             :  * @return Pointer to the fragment or
    2686             :  *         NULL and pos is 0 after successful skip,
    2687             :  *         NULL and pos is 0xffff otherwise.
    2688             :  */
    2689           1 : static inline struct net_buf *net_buf_skip(struct net_buf *buf, size_t len)
    2690             : {
    2691             :         while (buf && len--) {
    2692             :                 net_buf_pull_u8(buf);
    2693             :                 if (!buf->len) {
    2694             :                         buf = net_buf_frag_del(NULL, buf);
    2695             :                 }
    2696             :         }
    2697             : 
    2698             :         return buf;
    2699             : }
    2700             : 
    2701             : /**
    2702             :  * @brief Calculate amount of bytes stored in fragments.
    2703             :  *
    2704             :  * Calculates the total amount of data stored in the given buffer and the
    2705             :  * fragments linked to it.
    2706             :  *
    2707             :  * @param buf Buffer to start off with.
    2708             :  *
    2709             :  * @return Number of bytes in the buffer and its fragments.
    2710             :  */
    2711           1 : static inline size_t net_buf_frags_len(const struct net_buf *buf)
    2712             : {
    2713             :         size_t bytes = 0;
    2714             : 
    2715             :         while (buf) {
    2716             :                 bytes += buf->len;
    2717             :                 buf = buf->frags;
    2718             :         }
    2719             : 
    2720             :         return bytes;
    2721             : }
    2722             : 
    2723             : /**
    2724             :  * @}
    2725             :  */
    2726             : 
    2727             : #ifdef __cplusplus
    2728             : }
    2729             : #endif
    2730             : 
    2731             : #endif /* ZEPHYR_INCLUDE_NET_BUF_H_ */

Generated by: LCOV version 1.14