luckfox-pico-sdk/sysdrv/drv_ko/wifi/hichannel/oal/oal_netbuf.h
2023-08-08 20:36:47 +08:00

475 lines
17 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Copyright (c) Hisilicon Technologies Co., Ltd. 2020-2020. All rights reserved.
* Description: Header file for oal_netbuff.c.
* Author: Hisilicon
* Create: 2020-09-11
*/
#ifndef __OAL_NETBUFF_H__
#define __OAL_NETBUFF_H__
/* 头文件包含 */
#include <linux/skbuff.h>
#include <linux/netdevice.h>
#include "securec.h"
#include "hi_types_base.h"
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif
/* 宏定义 */
#define ETH_P_CONTROL 0x0016 /* Card specific control frames */
#define oal_netbuf_list_num(_pst_head) ((_pst_head)->qlen)
#define oal_net_dev_priv(_pst_dev) ((_pst_dev)->ml_priv)
#define oal_net_dev_wireless_dev(_pst_dev) ((_pst_dev)->ieee80211_ptr)
#define oal_netbuf_next(_pst_buf) ((_pst_buf)->next)
#define oal_netbuf_prev(_pst_buf) ((_pst_buf)->prev)
#define oal_netbuf_head_next(_pst_buf_head) ((_pst_buf_head)->next)
#define oal_netbuf_head_prev(_pst_buf_head) ((_pst_buf_head)->prev)
#define oal_netbuf_protocol(_pst_buf) ((_pst_buf)->protocol)
#define oal_netbuf_last_rx(_pst_buf) ((_pst_buf)->last_rx)
#define oal_netbuf_data(_pst_buf) ((_pst_buf)->data)
#define oal_netbuf_header(_pst_buf) ((_pst_buf)->data)
#define oal_netbuf_payload(_pst_buf) ((_pst_buf)->data)
#define oal_netbuf_cb(_pst_buf) ((_pst_buf)->cb)
#define oal_netbuf_cb_size() (sizeof(((oal_netbuf_stru*)0)->cb))
#define oal_netbuf_len(_pst_buf) ((_pst_buf)->len)
#define oal_netbuf_priority(_pst_buf) ((_pst_buf)->priority)
#define OAL_NETBUF_TAIL skb_tail_pointer
#define OAL_NETBUF_QUEUE_TAIL skb_queue_tail
#define OAL_NETBUF_QUEUE_HEAD_INIT skb_queue_head_init
#define OAL_NETBUF_DEQUEUE skb_dequeue
/* 主机与网络字节序转换 */
#ifdef HAVE_PCLINT_CHECK
#define oal_host2net_short(_x) _x
#define oal_net2host_short(_x) _x
#define oal_host2net_long(_x) _x
#define oal_net2host_long(_x) _x
#define oal_high_half_byte(a) a
#define oal_low_half_byte(a) a
#else
#define oal_host2net_short(_x) hi_swap_byteorder_16(_x)
#define oal_net2host_short(_x) hi_swap_byteorder_16(_x)
#define oal_host2net_long(_x) hi_swap_byteorder_32(_x)
#define oal_net2host_long(_x) hi_swap_byteorder_32(_x)
#define oal_high_half_byte(a) (((a) & 0xF0) >> 4)
#define oal_low_half_byte(a) ((a) & 0x0F)
#endif
typedef hi_u8 oal_mem_state_enum_uint8;
/* 结构体定义 */
typedef gfp_t oal_gfp_enum_uint8;
typedef struct sk_buff oal_netbuf_stru;
typedef struct sk_buff_head oal_netbuf_head_stru;
typedef struct oal_netbuf_stru_tag {
struct oal_netbuf_stru_tag* next;
oal_mem_state_enum_uint8 mem_state_flag; /* 内存块状态 */
hi_u8 subpool_id : 4; /* 记录所属子池id */
hi_u8 is_high_priority : 1;
hi_u8 bit_resv : 3;
hi_u16 us_index;
} oal_dev_netbuf_stru;
typedef struct {
oal_dev_netbuf_stru* next;
oal_dev_netbuf_stru* prev;
hi_u32 num;
} oal_dev_netbuf_head_stru;
typedef struct oal_ip_header {
hi_u8 us_ihl : 4,
version_ihl : 4;
/* liuming modifed proxyst end */
hi_u8 tos;
hi_u16 us_tot_len;
hi_u16 us_id;
hi_u16 us_frag_off;
hi_u8 ttl;
hi_u8 protocol;
hi_u16 us_check;
hi_u32 saddr;
hi_u32 daddr;
/* The options start here */
} oal_ip_header_stru;
typedef struct oal_tcp_header {
hi_u16 us_sport;
hi_u16 us_dport;
hi_u32 seqnum;
hi_u32 acknum;
hi_u8 offset;
hi_u8 flags;
hi_u16 us_window;
hi_u16 us_check;
hi_u16 us_urgent;
} oal_tcp_header_stru;
/* inline 函数定义 */
static inline hi_void oal_netbuf_copy_queue_mapping(oal_netbuf_stru* netbuf_to,
const oal_netbuf_stru* netbuf_from)
{
skb_copy_queue_mapping(netbuf_to, netbuf_from);
}
/*****************************************************************************
功能描述 : 在缓冲区尾部增加数据
输入参数 : pst_netbuf: 缓冲区结构体指针
ul_len: 需要增加数据的长度
*****************************************************************************/
static inline hi_u8* oal_netbuf_put(oal_netbuf_stru* netbuf, hi_u32 len)
{
return skb_put(netbuf, len);
}
/*****************************************************************************
功能描述 : 在缓冲区开头增加数据
*****************************************************************************/
static inline hi_u8* oal_netbuf_push(oal_netbuf_stru* netbuf, hi_u32 len)
{
return skb_push(netbuf, len);
}
/*****************************************************************************
功能描述 : 从skb头部取出数据
输入参数 : pst_netbuf: skb结构体指针
*****************************************************************************/
static inline hi_u8* oal_netbuf_pull(oal_netbuf_stru* netbuf, hi_u32 len)
{
if (len > netbuf->len) {
return HI_NULL;
}
netbuf->len -= len;
return (netbuf->data += len);
}
static inline hi_void oal_set_netbuf_prev(oal_netbuf_stru* netbuf, oal_netbuf_stru* prev)
{
netbuf->prev = prev;
}
/*****************************************************************************
功能描述 : 判断skb list是否为空
*****************************************************************************/
static inline hi_s32 oal_netbuf_list_empty(const oal_netbuf_head_stru* list_head)
{
return skb_queue_empty(list_head);
}
/*****************************************************************************
函 数 名 : oal_netbuf_reserve
功能描述 : 将报文结构体的data指针和tail指针同时下移
输入参数 : pst_netbuf报文结构体指针
len: 预留长度
*****************************************************************************/
static inline hi_void oal_netbuf_reserve(oal_netbuf_stru* netbuf, hi_u32 l_len)
{
skb_reserve(netbuf, l_len);
}
/*****************************************************************************
功能描述 : 释放报文结构体内存空间, 非硬中断环境下使用
输入参数 : pst_netbuf: 报文结构体指针
返 回 值 : 成功返回HI_SUCCESS失败返回HI_ERR_CODE_PTR_NULL
*****************************************************************************/
static inline hi_u32 oal_netbuf_free(oal_netbuf_stru* netbuf)
{
/* 释放调用alloc_skb接口申请的内存 */
dev_kfree_skb(netbuf);
return HI_SUCCESS;
}
/*****************************************************************************
功能描述 : 释放报文结构体内存空间,可用于中断环境
*****************************************************************************/
static inline hi_void oal_netbuf_free_any(oal_netbuf_stru* netbuf)
{
dev_kfree_skb_any(netbuf);
}
/*****************************************************************************
功能描述 : 判断一个skb是否为克隆的是则copy一份新的skb否则直接返回传入的skb
输入参数 : pst_netbuf: skb结构体指针
en_pri: 内存分配的优先级
*****************************************************************************/
static inline oal_netbuf_stru* oal_netbuf_unshare(oal_netbuf_stru* netbuf, oal_gfp_enum_uint8 pri)
{
return skb_unshare(netbuf, pri);
}
/*****************************************************************************
功能描述 : 获取头部空间大小
*****************************************************************************/
static inline hi_u32 oal_netbuf_headroom(const oal_netbuf_stru* netbuf)
{
return (hi_u32)skb_headroom(netbuf);
}
/*****************************************************************************
功能描述 : 获取尾部空间大小
*****************************************************************************/
static inline hi_u32 oal_netbuf_tailroom(const oal_netbuf_stru* netbuf)
{
return (hi_u32)skb_tailroom(netbuf);
}
/*****************************************************************************
功能描述 : skb尾部空间扩充
*****************************************************************************/
static inline oal_netbuf_stru* oal_netbuf_realloc_tailroom(oal_netbuf_stru* netbuf, hi_u32 tailroom)
{
if (pskb_expand_head(netbuf, 0, tailroom, GFP_ATOMIC)) {
netbuf = HI_NULL;
}
return netbuf;
}
/*****************************************************************************
功能描述 : 将skb加入skb链表中
输入参数 : pst_new: 要插入的新skb指针
pst_prev: 尾节点
pst_head: skb链表头指针
*****************************************************************************/
static inline hi_void oal_netbuf_add_to_list(oal_netbuf_stru* netbuf, oal_netbuf_stru* prev, oal_netbuf_stru* next)
{
netbuf->next = next;
netbuf->prev = prev;
next->prev = netbuf;
prev->next = netbuf;
}
/*****************************************************************************
功能描述 : 将skb加入skb链表中的尾部
输入参数 : pst_new: 要插入的新skb指针
pst_head: skb链表头指针
*****************************************************************************/
static inline hi_void oal_netbuf_add_to_list_tail(oal_netbuf_stru* netbuf, oal_netbuf_head_stru* head)
{
skb_queue_tail(head, netbuf);
}
/*****************************************************************************
功能描述 : skb链表出队
*****************************************************************************/
static inline oal_netbuf_stru* oal_netbuf_delist(oal_netbuf_head_stru* list_head)
{
return skb_dequeue(list_head);
}
/*****************************************************************************
功能描述 : skb链表从头部入队
*****************************************************************************/
static inline hi_void oal_netbuf_addlist(oal_netbuf_head_stru* list_head, oal_netbuf_stru* netbuf)
{
skb_queue_head(list_head, netbuf);
}
/*****************************************************************************
功能描述 : 初始化skb队列头
*****************************************************************************/
static inline hi_void oal_netbuf_list_head_init(oal_netbuf_head_stru* list_head)
{
skb_queue_head_init(list_head);
}
/*****************************************************************************
功能描述 : 返回链表中指定节点的下一个节点
*****************************************************************************/
static inline oal_netbuf_stru* oal_netbuf_list_next(const oal_netbuf_stru* netbuf)
{
return netbuf->next;
}
/*****************************************************************************
功能描述 : add a netbuf to skb list
*****************************************************************************/
static inline hi_void oal_netbuf_list_tail(oal_netbuf_head_stru* list, oal_netbuf_stru* netbuf)
{
skb_queue_tail(list, netbuf);
}
/*****************************************************************************
功能描述 : join two skb lists and reinitialise the emptied list
输入参数 : @list: the new list to add
@head: the place to add it in the first list
输出参数 : The list at @list is reinitialised
*****************************************************************************/
static inline hi_void oal_netbuf_splice_init(oal_netbuf_head_stru* list, oal_netbuf_head_stru* head)
{
skb_queue_splice_init(list, head);
}
/*****************************************************************************
功能描述 : join two skb lists and reinitialise the emptied list
输入参数 : @list: the new list to add
@head: the place to add it in the first list
输出参数 : The list at @list is reinitialised
*****************************************************************************/
static inline hi_void oal_netbuf_queue_splice_tail_init(oal_netbuf_head_stru* list, oal_netbuf_head_stru* head)
{
skb_queue_splice_tail_init(list, head);
}
/*****************************************************************************
功能描述 : remove skb from list tail
输入参数 : @head: the place to add it in the first list
输出参数 : The list at @list is reinitialised
返 回 值 : the netbuf removed from the list
*****************************************************************************/
static inline oal_netbuf_stru* oal_netbuf_delist_tail(oal_netbuf_head_stru *head)
{
return skb_dequeue_tail(head);
}
/*****************************************************************************
功能描述 : move head buffs to list
输入参数 : @list: the new list to add
@head: the place to add it in the first list
输出参数 : The list at @list is reinitialised
*****************************************************************************/
static inline hi_void oal_netbuf_splice_sync(oal_netbuf_head_stru* list, oal_netbuf_head_stru* head)
{
oal_netbuf_stru* netbuf = HI_NULL;
for (;;) {
netbuf = oal_netbuf_delist_tail(head);
if (netbuf == NULL) {
break;
}
oal_netbuf_addlist(list, netbuf);
}
}
/*****************************************************************************
功能描述 : init netbuf list
*****************************************************************************/
static inline hi_void oal_netbuf_head_init(oal_netbuf_head_stru* list)
{
skb_queue_head_init(list);
}
/*****************************************************************************
功能描述 : 返回skb链表中的第一个元素
输入参数 : pst_head: skb链表头指针
返 回 值 : 链表中第一个元素
*****************************************************************************/
static inline oal_netbuf_stru* oal_netbuf_peek(const oal_netbuf_head_stru *head)
{
return skb_peek(head);
}
/*****************************************************************************
功能描述 : 返回skb链表中的最后一个元素
输入参数 : pst_head: skb链表头指针
返 回 值 : 链表中最后一个元素
*****************************************************************************/
static inline oal_netbuf_stru* oal_netbuf_tail(const oal_netbuf_head_stru *head)
{
return skb_peek_tail(head);
}
/*****************************************************************************
功能描述 : 获取netbuf双向链表中buf的个数
*****************************************************************************/
static inline hi_u32 oal_netbuf_get_buf_num(const oal_netbuf_head_stru *netbuf_head)
{
return netbuf_head->qlen;
}
/*****************************************************************************
功能描述 : 获取netbuf
*****************************************************************************/
static inline oal_netbuf_stru* oal_netbuf_get(oal_netbuf_stru* netbuf)
{
return skb_get(netbuf);
}
/*****************************************************************************
功能描述 : 将skb中的内容先偏移ul_offset后 按指定长度拷贝到指定内从中
*****************************************************************************/
static inline hi_u32 oal_netbuf_copydata(const oal_netbuf_stru *netbuf, hi_u32 offset, hi_void* dst,
hi_u32 dst_len, hi_u32 len)
{
hi_void* scr = HI_NULL;
scr = oal_netbuf_data(netbuf) + offset;
if (memcpy_s(dst, dst_len, scr, len) != EOK) {
return HI_FAIL;
}
return HI_SUCCESS;
}
/*****************************************************************************
功能描述 : 剥去skb中尾部的信息
*****************************************************************************/
static inline hi_void oal_netbuf_trim(oal_netbuf_stru* netbuf, hi_u32 len)
{
skb_trim(netbuf, netbuf->len - len);
}
/*****************************************************************************
功能描述 : 将skb的数据内容长度设置为指定长度
*****************************************************************************/
static inline hi_void oal_netbuf_set_len(oal_netbuf_stru* netbuf, hi_u32 len)
{
if (netbuf->len > len) {
skb_trim(netbuf, len);
} else {
skb_put(netbuf, (len - netbuf->len));
}
}
/*****************************************************************************
功能描述 : 初始化netbuf
*****************************************************************************/
static inline hi_void oal_netbuf_init(oal_netbuf_stru* netbuf, hi_u32 len)
{
oal_netbuf_set_len(netbuf, len);
netbuf->protocol = ETH_P_CONTROL;
}
static inline oal_dev_netbuf_stru* oal_get_dev_netbuf_next(const oal_dev_netbuf_stru *dev_netbuf)
{
return dev_netbuf->next;
}
/*****************************************************************************
功能描述: 获取netbuf 链表长度
*****************************************************************************/
static inline hi_u32 oal_netbuf_list_len(const oal_netbuf_head_stru *pst_head)
{
return skb_queue_len(pst_head);
}
/*****************************************************************************
功能描述: 扩展netbuf 头部空间
*****************************************************************************/
static inline hi_s32 oal_netbuf_expand_head(oal_netbuf_stru *netbuf, hi_s32 nhead,
hi_s32 ntail, hi_s32 gfp_mask)
{
return pskb_expand_head(netbuf, nhead, ntail, gfp_mask);
}
/* 函数声明 */
oal_netbuf_stru* oal_netbuf_alloc(hi_u32 ul_size, hi_u32 l_reserve, hi_u32 l_align);
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif
#endif