1 /*
2 * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 * Description: Header file for oal_net_pkt_rom
15 */
16
17 #ifndef OAL_NET_PKT_ROM_H
18 #define OAL_NET_PKT_ROM_H
19 #include "osal_types.h"
20 #include "soc_osal.h"
21 #include "oal_types_device_rom.h"
22 #ifdef __cplusplus
23 #if __cplusplus
24 extern "C" {
25 #endif
26 #endif
27
28 typedef enum {
29 PKT_BUF_SRC_DMAC = 0,
30 PKT_BUF_SRC_LWIP,
31 PKT_BUF_SRC_HMAC,
32 SKB_BUF_SRC_DMAC,
33 SKB_BUF_SRC_LWIP,
34 SKB_BUF_SRC_HMAC,
35 PBUF_SRC_DMAC,
36 PBUF_SRC_LWIP,
37 PBUF_SRC_HMAC,
38
39 PKT_BUF_SRC_BUTT
40 } oal_pkt_buf_src_type;
41
42 /*****************************************************************************
43 枚举名 : oal_netbuf_id_enum_uint8
44 协议表格:
45 枚举说明: 对外提供netbuf内存池ID
46 *****************************************************************************/
47 typedef enum {
48 OAL_NORMAL_NETBUF = 0, /* 包括短帧、长帧内存池 */
49 OAL_MGMT_NETBUF = 1, /* 管理帧内存池 */
50
51 OAL_NETBUF_POOL_ID_BUTT
52 }oal_netbuf_id_enum;
53 typedef osal_u8 oal_netbuf_id_enum_uint8;
54
55 /*****************************************************************************
56 枚举名 : oal_netbuf_priority_enum_uint8
57 协议表格:
58 枚举说明: netbuf优先级
59 *****************************************************************************/
60 typedef enum {
61 OAL_NETBUF_PRIORITY_LOW = 0, // 最低优先级,不能跨池申请
62 OAL_NETBUF_PRIORITY_MID = 1, // 中间优先级,可以跨池申请,但不能申请大包的最后N片
63 OAL_NETBUF_PRIORITY_HIGH = 2, // 最高优先级,可以跨池申请,且可以申请大包的最后N片
64
65 OAL_NETBUF_PRIORITY_BUTT
66 }oal_netbuf_priority_enum;
67 typedef osal_u8 oal_netbuf_priority_enum_uint8;
68
69 #define OAL_MEM_INFO_SIZE 4
70
71 #define OAL_MACHDR_LEN 80 /* netbuf mac头长度 */
72 #define MAC_HEAD_OFFSET (OAL_MACHDR_LEN - OAL_MAX_MAC_HDR_LEN)
73 #define CB_OFFSET (OAL_MACHDR_LEN - OAL_MAX_MAC_HDR_LEN - OAL_MAX_CB_LEN)
74
75 #define WLAN_MEM_MAX_SUBPOOL_NUM 8 /* 内存池中出netbuf内存池外最大子内存池个数 */
76
77 /*****************************************************************************
78 枚举名 : oal_mem_state_enum_uint8
79 协议表格:
80 枚举说明: 内存块状态
81 *****************************************************************************/
82 typedef enum {
83 OAL_MEM_STATE_FREE = 0, /* 该内存空闲 */
84 OAL_MEM_STATE_ALLOC, /* 该内存已分配 */
85 OAL_MEM_STATE_BUTT
86 } oal_mem_state_enum;
87 typedef osal_u8 oal_mem_state_enum_uint8;
88
89 /*****************************************************************************
90 结构名 : oal_dmac_netbuf_stru
91 结构说明: 描述每一个netbuf内存块信息
92 *****************************************************************************/
93 /* netbuf_stru加dmac */
94 struct oal_dmac_netbuf_stru_tag {
95 struct oal_dmac_netbuf_stru_tag *next;
96 oal_mem_state_enum_uint8 mem_state; /* 内存块状态 */
97 osal_u8 is_high_priority : 1; /* 是否是被高优先级申请 */
98 osal_u8 subpool_id : 3; /* 记录所属子池id */
99 osal_u8 is_ram : 1; /* 是否属于系统内存申请 */
100 osal_u8 resv : 3;
101 osal_u16 index; /* 序号 */
102 osal_s16 pkt_buf_offset;
103 osal_u8 pkt_src;
104 osal_u8 resv1;
105 #ifdef _PRE_MEM_DEBUG
106 osal_u32 return_addr; /* 调用alloc内存的函数地址 */
107 #endif
108 };
109 typedef struct oal_dmac_netbuf_stru_tag oal_dmac_netbuf_stru;
110
111 /* netbuf_stru加dmac */
112 typedef struct {
113 oal_dmac_netbuf_stru *next;
114 oal_dmac_netbuf_stru *prev;
115 osal_u32 num;
116 osal_u8 auc_resv[4]; /* 此处添加4个保留字节是为了让整个结构体与linux下大小一致 */
117 } oal_dmac_netbuf_head_stru;
118
119 oal_dmac_netbuf_stru *oal_mem_netbuf_alloc(osal_u8 netbuf_id, osal_u16 len, oal_netbuf_priority_enum_uint8 flag);
120 osal_void oal_mem_netbuf_free(oal_dmac_netbuf_stru *netbuf);
121 osal_u8 *oal_dmac_netbuf_end(const oal_dmac_netbuf_stru *netbuf);
122 osal_u8 *oal_dmac_netbuf_payload(const oal_dmac_netbuf_stru *netbuf);
123 osal_u8 *oal_netbuf_hcchdr(const oal_dmac_netbuf_stru *netbuf);
124 osal_u8 *oal_netbuf_mac_header(const oal_dmac_netbuf_stru *netbuf);
125 osal_u8 *oal_dmac_netbuf_cb(const oal_dmac_netbuf_stru *netbuf);
126 osal_u8 *oal_netbuf_lwip(const oal_dmac_netbuf_stru *netbuf);
127 osal_u8 *oal_netbuf_skb(const oal_dmac_netbuf_stru *netbuf);
128 typedef osal_u32 (*oal_mem_netbuf_pbuf_free_cb)(oal_dmac_netbuf_stru *netbuf);
129 typedef osal_u32 (*oal_mem_netbuf_alloc_from_ram_cb)(osal_u8 subpool_id, osal_u32 return_addr,
130 oal_dmac_netbuf_stru **out_netbuf);
131 typedef osal_u32 (*oal_mem_netbuf_free_from_ram_cb)(oal_dmac_netbuf_stru *netbuf);
132 osal_u32 oal_mem_get_buf_size(osal_void);
133 osal_u32 oal_mem_get_skb_size(osal_void);
134 osal_u32 oal_mem_get_zerocopy_hdr_size(osal_void);
135
136 /* ****************************************************************************
137 功能描述 : 获取skb数据头部(偏移mac头后的数据)
138 **************************************************************************** */
oal_dmac_netbuf_data(const oal_dmac_netbuf_stru * netbuf)139 static INLINE__ osal_u8 *oal_dmac_netbuf_data(const oal_dmac_netbuf_stru *netbuf)
140 {
141 osal_u8 *payload = oal_dmac_netbuf_payload(netbuf);
142 return (payload + OAL_MACHDR_LEN);
143 }
144
145 #ifdef __cplusplus
146 #if __cplusplus
147 }
148 #endif
149 #endif
150
151 #endif /* end of oal_net_pkt_rom.h */
152
153