zephyr中net_buf的定義

1、相關數據結構說明:

數據結構如下:

struct net_buf {
    union {
        int _unused;
        struct net_buf *frags;
    };

    uint8_t ref;
    uint8_t flags;
    struct net_buf_pool *pool;
    union {
        struct {
            uint8_t *data;
            uint16_t len;
            uint16_t size;
        };

        struct net_buf_simple b;
    };
    uint8_t __buf[0] __net_buf_align;
};

struct net_buf_pool {
    struct k_lifo free;  // LIFO to place the buffer into when free 
    const uint16_t buf_count;
    uint16_t uninit_count;
    const uint16_t buf_size;
    const uint16_t user_data_size;
    void (*const destroy)(struct net_buf *buf);
    struct net_buf * const __bufs;
};
#define SYS_DLIST_STATIC_INIT(ptr_to_list) {{(ptr_to_list)}, {(ptr_to_list)}}

#define K_LIFO_INITIALIZER(obj) \
    { \
    .wait_q = SYS_DLIST_STATIC_INIT(&obj.wait_q), \
    .list = NULL, \
    _OBJECT_TRACING_INIT \
    }

#define NET_BUF_POOL_INITIALIZER(_pool, _bufs, _count, _size, _ud_size,      \
                 _destroy)                                   \
    {                                                                    \
        .free = K_LIFO_INITIALIZER(_pool.free),                      \
        .__bufs = (struct net_buf *)_bufs,                           \
        .buf_count = _count,                                         \
        .uninit_count = _count,                                      \
        .buf_size = _size,                                           \
        .user_data_size = _ud_size,                                  \
        .destroy = _destroy,                                         \
    }
#define NET_BUF_POOL_DEFINE(_name, _count, _size, _ud_size, _destroy)        \
static struct {                                                      \
        struct net_buf buf;                                          \
        uint8_t data[_size] __net_buf_align;                         \
        uint8_t ud[ROUND_UP(_ud_size, 4)] __net_buf_align;           \
    } _net_buf_pool_##_name[_count] __noinit;                            \
    static struct net_buf_pool _name =                                   \
        NET_BUF_POOL_INITIALIZER(_name, _net_buf_pool_##_name,       \
                     _count, _size, _ud_size, _destroy)

用以上的定義,來聲明幾個變量,用一個宏來搞定

NET_BUF_POOL_DEFINE(bufs_pool, 22, 74, 6, buf_destroy);

這個宏展開後如下

    static struct {                                                      
        struct net_buf buf;                                          
        uint8_t data[74] __net_buf_align;                        
        uint8_t ud[ROUND_UP(6, 4)] __net_buf_align;           
    } _net_buf_pool_bufs_pool[22] __noinit;

    static struct net_buf_pool bufs_pool =                                   
    {                                                                    
        .free = { 
                .wait_q = {{(&bufs_pool.free.wait_q)}, {(&bufs_pool.free.wait_q)}},
                .list = NULL, 
                _OBJECT_TRACING_INIT //與這個結構沒有關係,就先不展開這個宏定義了
                },

        .__bufs = (struct net_buf *)_net_buf_pool_bufs_pool,                           
        .buf_count = 22,                                         
        .uninit_count = 22,                                      
        .buf_size = 74,                                           
        .user_data_size = 6,                                  
        .destroy = buf_destroy,                                         
    }

相當於定義了一個數組_net_buf_pool_bufs_pool[22] 和一個變量bufs_pool.

bufs_pool用來描述一個buffer池的,即這個buffer池有多少個buffer,用了多少個,首地址在什麼地方,釋放和銷燬的函數是什麼,每個buffer的大小等信息。

net_buf_pool_bufs_pool[22] 是具體的buffer池子,bufs_pool實際上是用來描述這個池子的。

2、補充:
(lifo在\kernel\lifo.c中定義和實現相關的函數)
補充羅列不太相關的結構定義,在前面有用到了,實際上是一個雙向鏈表:

struct _dnode {
    union {
        struct _dnode *head; /* ptr to head of list (sys_dlist_t) */
        struct _dnode *next; /* ptr to next node    (sys_dnode_t) */
    };
    union {
        struct _dnode *tail; /* ptr to tail of list (sys_dlist_t) */
        struct _dnode *prev; /* ptr to previous node (sys_dnode_t) */
    };
};
typedef struct _dnode sys_dlist_t;
typedef sys_dlist_t _wait_q_t;
struct k_lifo {
    _wait_q_t wait_q;
    void *list;

    _OBJECT_TRACING_NEXT_PTR(k_lifo);
};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章