Files
LuckFox-RV1103-1106/sysdrv/drv_ko/wifi/hichannel/oal/oal_netbuf.c
T
2023-08-08 20:36:47 +08:00

117 lines
3.8 KiB
C

/*
* Copyright (c) Hisilicon Technologies Co., Ltd. 2020-2020. All rights reserved.
* Description: oal_netbuff.c.
* Author: Hisilicon
* Create: 2020-08-04
*/
/*****************************************************************************
1 头文件包含
*****************************************************************************/
#include "oal_netbuf.h"
#include "oam_ext_if.h"
#include "oal_util.h"
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif
/*****************************************************************************
3 函数实现
*****************************************************************************/
/*****************************************************************************
功能描述 : 向netbu_head的尾部串接netbuf
*****************************************************************************/
hi_u32 oal_netbuf_concat(oal_netbuf_stru* netbuf_head, oal_netbuf_stru* netbuf)
{
/* 判断空间是否足够 */
if (((hi_u32)netbuf_head->end - (hi_u32)netbuf_head->tail) < netbuf->len) {
oal_netbuf_free(netbuf);
oam_error_log3("oal_netbuf_concat::no enough space: end:%d, tail:%d, len:%d.",
netbuf_head->end, netbuf_head->tail, netbuf->len);
return HI_FAIL;
}
if (memcpy_s(skb_tail_pointer(netbuf_head), netbuf->len, netbuf->data, netbuf->len) != EOK) {
oam_error_log0("oal_netbuf_concat:: memcpy_s failed");
oal_netbuf_free(netbuf);
return HI_FAIL;
}
skb_put(netbuf_head, netbuf->len);
oal_netbuf_free(netbuf);
return HI_SUCCESS;
}
/*****************************************************************************
功能描述 : 判断ipv4 tcp报文是否为tcp ack
*****************************************************************************/
hi_u8 oal_netbuf_is_tcp_ack(oal_ip_header_stru *ip_hdr)
{
oal_tcp_header_stru *tcp_hdr = HI_NULL;
hi_u32 ip_pkt_len;
hi_u32 ip_hdr_len;
hi_u32 tcp_hdr_len;
tcp_hdr = (oal_tcp_header_stru *)(ip_hdr + 1);
ip_pkt_len = oal_net2host_short(ip_hdr->us_tot_len);
ip_hdr_len = (oal_low_half_byte(ip_hdr->us_ihl)) << 2; /* 2: 左移2位 */
tcp_hdr_len = (oal_high_half_byte(tcp_hdr->offset)) << 2; /* 2: 左移2位 */
if (tcp_hdr_len + ip_hdr_len == ip_pkt_len) {
return HI_TRUE;
}
return HI_FALSE;
}
/*****************************************************************************
功能描述 : 为netbuf申请内存
输入参数 : ul_size: 分配内存的大小
l_reserve: data跟指针头之间要预留的长度
ul_align: 需要几字节对齐
返 回 值 : 成功返回结构体指针;失败返回OAL_PTR_NULL
*****************************************************************************/
oal_netbuf_stru* oal_netbuf_alloc(hi_u32 ul_size, hi_u32 l_reserve, hi_u32 l_align)
{
oal_netbuf_stru *pst_netbuf = HI_NULL;
hi_u32 ul_offset;
/* 保证data部分的size不会再字节对齐后小于预先想分配的大小 */
if (l_align) {
ul_size += (l_align - 1);
}
if (NET_SKB_PAD < 64) { /* net skb pad less than 64 */
pst_netbuf = dev_alloc_skb(ul_size + 32); /* 预留32字节给头部使其满足需求 */
} else {
pst_netbuf = dev_alloc_skb(ul_size);
}
if (oal_unlikely(pst_netbuf == HI_NULL)) {
return HI_NULL;
}
if (NET_SKB_PAD < 64) { /* net skb pad less than 64 */
skb_reserve(pst_netbuf, l_reserve + 32); /* 预留32字节给头部使其满足需求 */
} else {
skb_reserve(pst_netbuf, l_reserve);
}
if (l_align) {
/* 计算为了能使4字节对齐的偏移量 */
ul_offset = (hi_u32)(((unsigned long)pst_netbuf->data) % (unsigned long)l_align);
if (ul_offset) {
skb_reserve(pst_netbuf, l_align - ul_offset);
}
}
return pst_netbuf;
}
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif