89 lines
2.5 KiB
C
89 lines
2.5 KiB
C
#ifndef __CORE_TLV_H__
|
|
#define __CORE_TLV_H__
|
|
|
|
#include "core.h"
|
|
#include "core_pool.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif /* __cplusplus */
|
|
|
|
|
|
#define TLV_MODE_T1_L1 1
|
|
#define TLV_MODE_T1_L2 2
|
|
#define TLV_MODE_T1_L2_I1 3
|
|
#define TLV_MODE_T2_L2 4
|
|
|
|
#define NUM_OF_TLV_NODE 100
|
|
|
|
/* tlv_t struncture */
|
|
|
|
typedef struct _tlv_t
|
|
{
|
|
/* for tlv management */
|
|
struct _tlv_t* head;
|
|
struct _tlv_t* tail; /* this is used only for head tlv_t */
|
|
struct _tlv_t* next;
|
|
|
|
struct _tlv_t* parent;
|
|
struct _tlv_t* embedded;
|
|
|
|
|
|
/* tlv basic element */
|
|
c_uint32_t type;
|
|
c_uint32_t length;
|
|
c_uint8_t instance;
|
|
void* value;
|
|
|
|
/* can be needed in encoding tlv_t*/
|
|
c_uint8_t buff_allocated;
|
|
c_uint32_t buff_len;
|
|
c_uint8_t* buff_ptr;
|
|
c_uint8_t* buff;
|
|
} tlv_t;
|
|
|
|
#define tlv_type(pTlv) pTlv->type
|
|
#define tlv_length(pTlv) pTlv->length
|
|
#define tlv_instance(pTlv) pTlv->instance
|
|
#define tlv_value(pTlv) pTlv->value
|
|
|
|
/* tlv_t pool related functions */
|
|
CORE_DECLARE(tlv_t*) tlv_get(void);
|
|
CORE_DECLARE(void) tlv_free(tlv_t *pTlv);
|
|
CORE_DECLARE(void) tlv_free_all(tlv_t *rootTlv);
|
|
|
|
CORE_DECLARE(status_t) tlv_init(void);
|
|
CORE_DECLARE(status_t) tlv_final(void);
|
|
|
|
/* tlv_t encoding functions */
|
|
CORE_DECLARE(tlv_t*) tlv_add(tlv_t *headTlv,
|
|
c_uint32_t type, c_uint32_t length, c_uint8_t instance, c_uint8_t *value);
|
|
CORE_DECLARE(tlv_t*) tlv_copy(c_uint8_t *buff, c_uint32_t buff_len,
|
|
c_uint32_t type, c_uint32_t length, c_uint8_t instance, c_uint8_t *value);
|
|
CORE_DECLARE(tlv_t*) tlv_embed(tlv_t *parent_tlv,
|
|
c_uint32_t type, c_uint32_t length, c_uint8_t instance, c_uint8_t *value);
|
|
|
|
CORE_DECLARE(c_uint32_t) tlv_render(
|
|
tlv_t *rootTlv, c_uint8_t *blk, c_uint32_t length, c_uint8_t mode);
|
|
|
|
/* tlv_t parsing functions */
|
|
CORE_DECLARE(tlv_t*) tlv_parse_block(
|
|
c_uint32_t length, c_uint8_t *blk, c_uint8_t mode);
|
|
CORE_DECLARE(tlv_t*) tlv_parse_embedded_block(tlv_t* pTlv, c_uint8_t mode);
|
|
|
|
/* tlv operation-related function */
|
|
CORE_DECLARE(tlv_t*) tlv_find(tlv_t* pTlv, c_uint32_t type);
|
|
CORE_DECLARE(tlv_t*) tlv_find_root(tlv_t* pTlv);
|
|
CORE_DECLARE(c_uint32_t) tlv_pool_avail(void);
|
|
CORE_DECLARE(c_uint32_t) tlv_calc_length(tlv_t *p_tlv, c_uint8_t mode);
|
|
CORE_DECLARE(c_uint32_t) tlv_calc_count(tlv_t *p_tlv);
|
|
CORE_DECLARE(c_uint8_t) tlv_value_8(tlv_t *tlv);
|
|
CORE_DECLARE(c_uint16_t) tlv_value_16(tlv_t *tlv);
|
|
CORE_DECLARE(c_uint32_t) tlv_value_32(tlv_t *tlv);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif /* __cplusplus */
|
|
|
|
#endif /* !__CORE_TLV_H__ */
|