177 lines
4.6 KiB
C
177 lines
4.6 KiB
C
/***************************************************************************
|
|
*
|
|
* Copyright 2015-2019 BES.
|
|
* All rights reserved. All unpublished rights reserved.
|
|
*
|
|
* No part of this work may be used or reproduced in any form or by any
|
|
* means, or stored in a database or retrieval system, without prior written
|
|
* permission of BES.
|
|
*
|
|
* Use of this work is governed by a license granted by BES.
|
|
* This work contains confidential and proprietary information of
|
|
* BES. which is protected by copyright, trade secret,
|
|
* trademark and other intellectual property rights.
|
|
*
|
|
****************************************************************************/
|
|
|
|
|
|
#ifndef __HCI_BUFF_H__
|
|
#define __HCI_BUFF_H__
|
|
|
|
// abbrs
|
|
// HCI_BUFF -> HB hb
|
|
// HCI_BUFF_TYPE -> HBT
|
|
// HCI_BUFF_DATA_HEAD_TYPE -> HBDHT
|
|
|
|
#include "string.h"
|
|
#include "btlib_type.h"
|
|
#include "stdint.h"
|
|
#include "bt_co_list.h"
|
|
|
|
#define DUMP_PUSH_POP_TIME 0
|
|
|
|
#if defined(__cplusplus)
|
|
extern "C" {
|
|
#endif
|
|
|
|
// hci buffer type
|
|
#define HBT_COMMAND 0x01
|
|
#define HBT_COMMAND_SYNC 0x11
|
|
#define HBT_RX_ACL 0x02
|
|
#define HBT_RX_SCO 0x03
|
|
#define HBT_EVENT 0x04
|
|
#define HBT_TX_ACL 0x05
|
|
#define HBT_TX_SCO 0x06
|
|
#define HBT_RX_BLE 0x07
|
|
#define HBT_TX_BLE 0x08
|
|
#define HBT_RX 0x09
|
|
|
|
#define HB_TYPE(hci_buff) (hci_buff->type)
|
|
#define HB_OPCODE(hci_buff) (hci_buff->u.opcode)
|
|
#define HB_HANDLE(hci_buff) (hci_buff->u.handle)
|
|
#define HB_DATA(hci_buff) (hci_buff->data)
|
|
#define HB_DATA_LEN(hci_buff) (hci_buff->data_len)
|
|
#define HB_PRIV(hci_buff) (hci_buff->priv)
|
|
#define HB_SHOULD_FREE(hci_buff) (hci_buff->should_free)
|
|
|
|
typedef struct {
|
|
struct list_node node;
|
|
uint8 type;
|
|
uint8 should_free;
|
|
union {
|
|
uint16 handle;
|
|
uint16 opcode;
|
|
} u;
|
|
uint16 data_len;
|
|
uint8 *data;
|
|
void *priv;
|
|
#if defined(DUMP_PUSH_POP_TIME)
|
|
uint32 push_time;
|
|
#endif
|
|
} hci_buff_t;
|
|
|
|
#define hci_buff_list_iter_begin(type,hci_buff,error) \
|
|
do{ \
|
|
hci_buff_t *__hci_buff = NULL; \
|
|
struct list_node *__list = hci_buff_get_pend_list(type); \
|
|
struct list_node *__pos = NULL, *__next = NULL; \
|
|
error = 0; \
|
|
if (__list == NULL) { \
|
|
error = 1; \
|
|
break; \
|
|
} \
|
|
colist_iterate_safe(__pos, __next, __list) \
|
|
{ \
|
|
__hci_buff = colist_structure(__pos, hci_buff_t, node); \
|
|
if (__hci_buff == NULL) { \
|
|
error = 2; \
|
|
} else {\
|
|
hci_buff = __hci_buff; \
|
|
}
|
|
|
|
#define hci_buff_list_iter_end() \
|
|
} \
|
|
}while(0);
|
|
|
|
/*
|
|
@brief To init list (add buff to free list, pend list is empty)
|
|
@return SUCCESS/FAILURE
|
|
*/
|
|
int8 hci_buff_list_init(void);
|
|
/*
|
|
@brief To get pend list
|
|
@param type - buffer type
|
|
@return list
|
|
*/
|
|
struct list_node *hci_buff_get_pend_list(uint8 type);
|
|
/*
|
|
@brief To push buff to list tail
|
|
@param type - buffer type
|
|
@param buff - buffer
|
|
@return SUCCESS/FAILURE
|
|
*/
|
|
int8 hci_buff_list_push(hci_buff_t *buff);
|
|
/*
|
|
@brief To push buff to list head
|
|
@param type - buffer type
|
|
@param buff - buffer
|
|
@return SUCCESS/FAILURE
|
|
*/
|
|
int8 hci_buff_list_push_front(hci_buff_t *buff);
|
|
/*
|
|
@brief To see list head but no delete operation
|
|
@param type - buffer type
|
|
@param buff - buffer to store head
|
|
@return SUCCESS/FAILURE
|
|
*/
|
|
int8 hci_buff_list_peek(uint8 type, hci_buff_t **buff);
|
|
/*
|
|
@brief To get list head and delete it from list
|
|
@param type - buffer type
|
|
@param buff - buffer to store head
|
|
@return SUCCESS/FAILURE
|
|
*/
|
|
int8 hci_buff_list_pop(uint8 type, hci_buff_t **buff);
|
|
/*
|
|
@brief To remove a buffer from pending buffer
|
|
@param buff - buffer to remove
|
|
@return SUCCESS/FAILURE
|
|
*/
|
|
int8 hci_buff_list_remove(hci_buff_t *buff);
|
|
/*
|
|
@brief To see if list is empty
|
|
@param type - buffer type
|
|
@return 1 - empty, 0 - empty
|
|
*/
|
|
int8 hci_buff_list_is_empty(uint8 type);
|
|
/*
|
|
@brief To dump list
|
|
@param type - buffer type
|
|
*/
|
|
void hci_buff_list_dump(uint8 type);
|
|
/*
|
|
@brief To alloc a buffer
|
|
@param type - buffer type
|
|
@param buff - buffer to store head
|
|
@return SUCCESS/FAILURE
|
|
*/
|
|
int8 hci_buff_alloc(uint8 type, hci_buff_t **buff);
|
|
/*
|
|
@brief To free a buffer
|
|
@param type - buffer type
|
|
@param buff - buffer to store head
|
|
@return SUCCESS/FAILURE
|
|
*/
|
|
int8 hci_buff_free(hci_buff_t *buff);
|
|
/*
|
|
@brief To print hcibuff statistic
|
|
@return SUCCESS/FAILURE
|
|
*/
|
|
int8 hci_buff_print_statistic(void);
|
|
int8 hci_buff_rx_print_statistic(void);
|
|
void hci_buff_list_filter_handle_peek(uint8 type,uint16 handle,bool equal,hci_buff_t **peek_buff);
|
|
#if defined(__cplusplus)
|
|
}
|
|
#endif
|
|
|
|
#endif /* __HCI_BUFF_H__ */ |