open5gs/lib/core/include/core_tlv.h

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__ */