Fire_RT1052_WHD/src/whd_port/cy_network_buffer.c

72 lines
2.3 KiB
C

#include "whd_buffer_api.h"
/* LwIP provided pbuf management */
#include "lwip/debug.h"
#include "lwip/pbuf.h"
#define SDIO_BLOCK_SIZE (64U)
whd_result_t cy_host_buffer_get(whd_buffer_t *buffer, whd_buffer_dir_t direction, unsigned short size,
unsigned long timeout_ms) {
UNUSED_PARAMETER(direction);
UNUSED_PARAMETER(timeout_ms);
struct pbuf *p_buffer = NULL;
if ((direction == WHD_NETWORK_TX) && (size <= PBUF_POOL_BUFSIZE)) {
p_buffer = pbuf_alloc(PBUF_RAW, size, PBUF_POOL);
} else {
p_buffer = pbuf_alloc(PBUF_RAW, size + SDIO_BLOCK_SIZE, PBUF_RAM);
if (p_buffer != NULL) {
p_buffer->len = size;
p_buffer->tot_len -= SDIO_BLOCK_SIZE;
}
}
if (p_buffer != NULL) {
*buffer = p_buffer;
return WHD_SUCCESS;
} return WHD_BUFFER_ALLOC_FAIL;
}
void cy_buffer_release(whd_buffer_t buffer, whd_buffer_dir_t direction) {
UNUSED_PARAMETER(direction);
(void)pbuf_free((struct pbuf *)buffer);
}
uint8_t *cy_buffer_get_current_piece_data_pointer(whd_buffer_t buffer) {
LWIP_ASSERT("CY network buffer is NULL", buffer != NULL);
struct pbuf *p_buffer = (struct pbuf *)buffer;
return (uint8_t *)p_buffer->payload;
}
uint16_t cy_buffer_get_current_piece_size(whd_buffer_t buffer) {
LWIP_ASSERT("CY network buffer is NULL", buffer != NULL);
struct pbuf *p_buffer = (struct pbuf *)buffer;
return (uint16_t)p_buffer->len;
}
whd_result_t cy_buffer_set_size(whd_buffer_t buffer, unsigned short size) {
LWIP_ASSERT("CY network buffer is NULL", buffer != NULL);
struct pbuf *p_buffer = (struct pbuf *)buffer;
if (size > (unsigned short)WHD_LINK_MTU + LWIP_MEM_ALIGN_SIZE(LWIP_MEM_ALIGN_SIZE(sizeof(struct pbuf))) +
LWIP_MEM_ALIGN_SIZE(size)) {
return WHD_PMK_WRONG_LENGTH;
}
p_buffer->tot_len = size;
p_buffer->len = size;
return CY_RSLT_SUCCESS;
}
whd_result_t cy_buffer_add_remove_at_front(whd_buffer_t *buffer, int32_t add_remove_amount) {
LWIP_ASSERT("CY network buffer is NULL", buffer != NULL);
struct pbuf **p_buffer = (struct pbuf **)buffer;
if ((u8_t)0 != pbuf_header(*p_buffer, (s16_t)(-add_remove_amount))) {
return WHD_PMK_WRONG_LENGTH;
}
return WHD_SUCCESS;
}