libosmogsm
0.9.6.277-11f2
Osmocom GSM library
|
Osmocom TLV Parser. More...
Files | |
file | tlv.h |
file | tlv_parser.c |
Data Structures | |
struct | tlv_p_entry |
Entry in a TLV parser array. More... | |
struct | tlv_def |
Definition of a single IE (Information Element) More... | |
struct | tlv_definition |
Definition of All 256 IE / TLV. More... | |
struct | tlv_parsed |
result of the TLV parser More... | |
Macros | |
#define | LV_GROSS_LEN(x) (x+1) |
gross length of a LV type field | |
#define | TLV_GROSS_LEN(x) (x+2) |
gross length of a TLV type field | |
#define | TLV16_GROSS_LEN(x) ((2*x)+2) |
gross length of a TLV16 type field | |
#define | TL16V_GROSS_LEN(x) (x+3) |
gross length of a TL16V type field | |
#define | L16TV_GROSS_LEN(x) (x+3) |
gross length of a L16TV type field | |
#define | TVLV_MAX_ONEBYTE 0x7f |
maximum length of TLV of one byte length | |
#define | TLVP_PRESENT(x, y) ((x)->lv[y].val) |
#define | TLVP_LEN(x, y) (x)->lv[y].len |
#define | TLVP_VAL(x, y) (x)->lv[y].val |
#define | TLVP_PRES_LEN(tp, tag, min_len) (TLVP_PRESENT(tp, tag) && TLVP_LEN(tp, tag) >= min_len) |
Enumerations | |
enum | tlv_type { TLV_TYPE_NONE, TLV_TYPE_FIXED, TLV_TYPE_T, TLV_TYPE_TV, TLV_TYPE_TLV, TLV_TYPE_TL16V, TLV_TYPE_TvLV, TLV_TYPE_SINGLE_TV, TLV_TYPE_vTvLV_GAN } |
TLV type. More... | |
Functions | |
static uint16_t | TVLV_GROSS_LEN (uint16_t len) |
gross length of a TVLV type field | |
static uint16_t | VTVL_GAN_GROSS_LEN (uint16_t tag, uint16_t len) |
gross length of vTvL header (tag+len) | |
static uint16_t | VTVLV_GAN_GROSS_LEN (uint16_t tag, uint16_t len) |
gross length of vTvLV (tag+len+val) | |
static uint8_t * | lv_put (uint8_t *buf, uint8_t len, const uint8_t *val) |
put (append) a LV field | |
static uint8_t * | tlv_put (uint8_t *buf, uint8_t tag, uint8_t len, const uint8_t *val) |
put (append) a TLV field | |
static uint8_t * | tlv16_put (uint8_t *buf, uint8_t tag, uint8_t len, const uint16_t *val) |
put (append) a TLV16 field | |
static uint8_t * | tl16v_put (uint8_t *buf, uint8_t tag, uint16_t len, const uint8_t *val) |
put (append) a TL16V field | |
static uint8_t * | tvlv_put (uint8_t *buf, uint8_t tag, uint16_t len, const uint8_t *val) |
put (append) a TvLV field | |
static uint8_t * | vt_gan_put (uint8_t *buf, uint16_t tag) |
put (append) a variable-length tag or variable-length length * | |
static uint8_t * | vtvl_gan_put (uint8_t *buf, uint16_t tag, uint16_t len) |
static uint8_t * | vtvlv_gan_put (uint8_t *buf, uint16_t tag, uint16_t len, const uint8_t *val) |
static uint8_t * | msgb_tlv16_put (struct msgb *msg, uint8_t tag, uint8_t len, const uint16_t *val) |
put (append) a TLV16 field to msgb | |
static uint8_t * | msgb_tl16v_put (struct msgb *msg, uint8_t tag, uint16_t len, const uint8_t *val) |
put (append) a TL16V field to msgb | |
static uint8_t * | msgb_tvlv_put (struct msgb *msg, uint8_t tag, uint16_t len, const uint8_t *val) |
put (append) a TvLV field to msgb | |
static uint8_t * | msgb_vtvlv_gan_put (struct msgb *msg, uint16_t tag, uint16_t len, const uint8_t *val) |
put (append) a vTvLV field to msgb | |
static uint8_t * | msgb_l16tv_put (struct msgb *msg, uint16_t len, uint8_t tag, const uint8_t *val) |
put (append) a L16TV field to msgb | |
static uint8_t * | v_put (uint8_t *buf, uint8_t val) |
put (append) a V field | |
static uint8_t * | tv_put (uint8_t *buf, uint8_t tag, uint8_t val) |
put (append) a TV field | |
static uint8_t * | tv_fixed_put (uint8_t *buf, uint8_t tag, unsigned int len, const uint8_t *val) |
put (append) a TVfixed field | |
static uint8_t * | tv16_put (uint8_t *buf, uint8_t tag, uint16_t val) |
put (append) a TV16 field More... | |
static uint8_t * | msgb_lv_put (struct msgb *msg, uint8_t len, const uint8_t *val) |
put (append) a LV field to a msgb More... | |
static uint8_t * | msgb_tlv_put (struct msgb *msg, uint8_t tag, uint8_t len, const uint8_t *val) |
put (append) a TLV field to a msgb More... | |
static uint8_t * | msgb_tv_put (struct msgb *msg, uint8_t tag, uint8_t val) |
put (append) a TV field to a msgb More... | |
static uint8_t * | msgb_tv_fixed_put (struct msgb *msg, uint8_t tag, unsigned int len, const uint8_t *val) |
put (append) a TVfixed field to a msgb More... | |
static uint8_t * | msgb_v_put (struct msgb *msg, uint8_t val) |
put (append) a V field to a msgb More... | |
static uint8_t * | msgb_tv16_put (struct msgb *msg, uint8_t tag, uint16_t val) |
put (append) a TV16 field to a msgb More... | |
static uint8_t * | msgb_tlv_push (struct msgb *msg, uint8_t tag, uint8_t len, const uint8_t *val) |
push (prepend) a TLV field to a msgb More... | |
static uint8_t * | msgb_tv_push (struct msgb *msg, uint8_t tag, uint8_t val) |
push (prepend) a TV field to a msgb More... | |
static uint8_t * | msgb_tv16_push (struct msgb *msg, uint8_t tag, uint16_t val) |
push (prepend) a TV16 field to a msgb More... | |
static uint8_t * | msgb_tvlv_push (struct msgb *msg, uint8_t tag, uint16_t len, const uint8_t *val) |
push (prepend) a TvLV field to a msgb More... | |
static uint8_t * | msgb_vtvl_gan_push (struct msgb *msg, uint16_t tag, uint16_t len) |
static uint8_t * | msgb_vtvlv_gan_push (struct msgb *msg, uint16_t tag, uint16_t len, const uint8_t *val) |
int | tlv_parse_one (uint8_t *o_tag, uint16_t *o_len, const uint8_t **o_val, const struct tlv_definition *def, const uint8_t *buf, int buf_len) |
Parse a single TLV encoded IE. More... | |
int | tlv_parse (struct tlv_parsed *dec, const struct tlv_definition *def, const uint8_t *buf, int buf_len, uint8_t lv_tag, uint8_t lv_tag2) |
Parse an entire buffer of TLV encoded Information Elements. More... | |
void | tlv_def_patch (struct tlv_definition *dst, const struct tlv_definition *src) |
take a master (src) tlvdev and fill up all empty slots in 'dst' More... | |
static uint16_t | tlvp_val16_unal (const struct tlv_parsed *tp, int pos) |
Align given TLV element with 16 bit value to an even address. More... | |
static uint32_t | tlvp_val32_unal (const struct tlv_parsed *tp, int pos) |
Align given TLV element with 32 bit value to an address that is a multiple of 4. More... | |
static uint16_t | tlvp_val16be (const struct tlv_parsed *tp, int pos) |
Retrieve (possibly unaligned) TLV element and convert to host byte order. More... | |
static uint32_t | tlvp_val32be (const struct tlv_parsed *tp, int pos) |
Retrieve (possibly unaligned) TLV element and convert to host byte order. More... | |
struct tlv_parsed * | osmo_tlvp_copy (const struct tlv_parsed *tp_orig, void *ctx) |
Copy tlv_parsed using given talloc context. More... | |
int | osmo_tlvp_merge (struct tlv_parsed *dst, const struct tlv_parsed *src) |
Merge all tlv_parsed attributes of 'src' into 'dst'. More... | |
int | osmo_shift_v_fixed (uint8_t **data, size_t *data_len, size_t len, uint8_t **value) |
int | osmo_match_shift_tv_fixed (uint8_t **data, size_t *data_len, uint8_t tag, size_t len, uint8_t **value) |
int | osmo_shift_tlv (uint8_t **data, size_t *data_len, uint8_t *tag, uint8_t **value, size_t *value_len) |
int | osmo_match_shift_tlv (uint8_t **data, size_t *data_len, uint8_t tag, uint8_t **value, size_t *value_len) |
int | osmo_shift_lv (uint8_t **data, size_t *data_len, uint8_t **value, size_t *value_len) |
int | tlv_dump (struct tlv_parsed *dec) |
Dump pasred TLV structure to stdout. | |
static | __attribute__ ((constructor)) |
Variables | |
struct tlv_definition | tvlv_att_def |
struct tlv_definition | vtvlv_gan_att_def |
struct tlv_definition | tvlv_att_def |
struct tlv_definition | vtvlv_gan_att_def |
Osmocom TLV Parser.
The Osmocom TLV parser is intended to operate as a low-level C implementation without dynamic memory allocations. Basically, it iterates over the IE (Information Elements) of the message and fills an array of pointers, indexed by the IEI (IE Identifier). The parser output is thus an array of pointers to the start of the respective IE inside the message.
The TLV parser is configured by a TLV parser definition, which determines which if the IEIs for a given protocol are of which particular type. Types are e.g. TV (Tag + single byte value), Tag + fixed-length value, TLV with 8bit length, TLV with 16bit length, TLV with variable-length length field, etc.
enum tlv_type |
TLV type.
|
inlinestatic |
put (append) a LV field to a msgb
References LV_GROSS_LEN, and lv_put().
Referenced by gsm48_encode_bearer_cap(), gsm48_encode_cause(), gsm48_encode_facility(), gsm48_encode_progress(), and gsm48_encode_useruser().
|
inlinestatic |
push (prepend) a TLV field to a msgb
References TLV_GROSS_LEN, and tlv_put().
|
inlinestatic |
put (append) a TLV field to a msgb
References TLV_GROSS_LEN, and tlv_put().
Referenced by gsm0808_create_ass_fail(), gsm0808_create_cipher_complete(), gsm0808_create_classmark_update(), gsm0808_create_clear_command(), gsm0808_create_clear_complete(), gsm0808_create_clear_rqst(), gsm0808_create_layer3_aoip(), gsm0808_create_paging(), gsm0808_create_reset(), gsm48_encode_bearer_cap(), gsm48_encode_called(), gsm48_encode_callerid(), gsm48_encode_cause(), gsm48_encode_cccap(), gsm48_encode_facility(), gsm48_encode_progress(), gsm48_encode_ssversion(), gsm48_encode_useruser(), osmo_gsup_encode(), and osmo_oap_encode().
|
inlinestatic |
push (prepend) a TV16 field to a msgb
References tv16_put().
Referenced by rsl_rll_push_l3().
|
inlinestatic |
put (append) a TV16 field to a msgb
References tv16_put().
|
inlinestatic |
put (append) a TVfixed field to a msgb
References tv_fixed_put().
Referenced by abis_nm_fail_evt_vrep(), and gsm0808_create_ass().
|
inlinestatic |
push (prepend) a TV field to a msgb
References tv_put().
Referenced by gsm0808_create_ass(), gsm0808_create_ass_compl(), gsm0808_create_ass_fail(), gsm0808_create_cipher(), gsm0808_create_cipher_complete(), gsm0808_create_cipher_reject(), gsm0808_create_classmark_update(), gsm0808_create_clear_rqst(), gsm0808_create_layer3_aoip(), gsm0808_create_paging(), gsm0808_create_reset(), gsm0808_create_reset_ack(), and gsm0808_create_sapi_reject().
|
inlinestatic |
put (append) a TV field to a msgb
References tv_put().
Referenced by abis_nm_fail_evt_vrep(), gsm0808_create_ass_compl(), gsm0808_create_ass_fail(), gsm0808_create_cipher(), gsm0808_create_cipher_complete(), gsm0808_create_cipher_reject(), gsm0808_create_clear_command(), gsm0808_create_paging(), gsm48_encode_keypad(), and gsm48_encode_signal().
|
inlinestatic |
push (prepend) a TvLV field to a msgb
References TVLV_GROSS_LEN(), and tvlv_put().
|
inlinestatic |
put (append) a V field to a msgb
References v_put().
Referenced by abis_nm_put_sw_desc(), gsm0808_create_ass(), gsm0808_create_ass_compl(), gsm0808_create_ass_fail(), gsm0808_create_cipher(), gsm0808_create_cipher_complete(), gsm0808_create_classmark_update(), gsm0808_create_clear_command(), gsm0808_create_clear_rqst(), gsm0808_create_layer3_aoip(), gsm0808_create_paging(), gsm0808_create_reset(), gsm0808_create_reset_ack(), gsm0808_create_sapi_reject(), gsm48_encode_notify(), osmo_gsup_encode(), and osmo_oap_encode().
int osmo_match_shift_tlv | ( | uint8_t ** | data, |
size_t * | data_len, | ||
uint8_t | expected_tag, | ||
uint8_t ** | value, | ||
size_t * | value_len | ||
) |
Verify TLV header and advance data / subtract length
data | pointer to the pointer to data | |
data_len | pointer to size_t containing
| |
[in] | expected_tag | the tag (IEI) that we expect at
|
[out] | value | pointer to pointer of value part of IE |
[out] | value_len | pointer to length of
|
References osmo_shift_tlv().
Referenced by osmo_gsup_decode().
int osmo_match_shift_tv_fixed | ( | uint8_t ** | data, |
size_t * | data_len, | ||
uint8_t | tag, | ||
size_t | len, | ||
uint8_t ** | value | ||
) |
Match tag, check length and assign value pointer
data | pointer to the pointer to data | |
data_len | pointer to size_t containing
| |
[in] | tag | the tag (IEI) that we expect at
|
[in] | len | the length that we expect the fixed IE to have |
[out] | value | pointer to pointer of value part of IE |
int osmo_shift_lv | ( | uint8_t ** | data, |
size_t * | data_len, | ||
uint8_t ** | value, | ||
size_t * | value_len | ||
) |
Extract LV and advance data pointer + subtract length
data | pointer to the pointer to data | |
data_len | pointer to size_t containing
| |
[out] | value | extracted pointer to value part of TLV |
[out] | value_len | extracted length of
|
int osmo_shift_tlv | ( | uint8_t ** | data, |
size_t * | data_len, | ||
uint8_t * | tag, | ||
uint8_t ** | value, | ||
size_t * | value_len | ||
) |
Extract TLV and advance data pointer + subtract length
data | pointer to the pointer to data | |
data_len | pointer to size_t containing
| |
[out] | tag | extract the tag (IEI) at start of
|
[out] | value | extracted pointer to value part of TLV |
[out] | value_len | extracted length of
|
Referenced by osmo_gsup_decode(), osmo_match_shift_tlv(), and osmo_oap_decode().
int osmo_shift_v_fixed | ( | uint8_t ** | data, |
size_t * | data_len, | ||
size_t | len, | ||
uint8_t ** | value | ||
) |
Advance the data pointer, subtract length and assign value pointer
data | pointer to the pointer to data | |
data_len | pointer to size_t containing
| |
[in] | len | the length that we expect the fixed IE to hav |
[out] | value | pointer to pointer of value part of IE |
Referenced by osmo_gsup_decode(), and osmo_oap_decode().
struct tlv_parsed * osmo_tlvp_copy | ( | const struct tlv_parsed * | tp_orig, |
void * | ctx | ||
) |
Copy tlv_parsed using given talloc context.
[in] | tp_orig | Parsed TLV structure |
[in] | ctx | Talloc context for allocations |
References tlv_p_entry::len, and tlv_p_entry::val.
int osmo_tlvp_merge | ( | struct tlv_parsed * | dst, |
const struct tlv_parsed * | src | ||
) |
Merge all tlv_parsed attributes of 'src' into 'dst'.
[in] | dst | Parsed TLV structure to merge into |
[in] | src | Parsed TLV structure to merge from |
References tlv_p_entry::len, and tlv_p_entry::val.
void tlv_def_patch | ( | struct tlv_definition * | dst, |
const struct tlv_definition * | src | ||
) |
take a master (src) tlvdev and fill up all empty slots in 'dst'
dst | TLV parser definition that is to be patched | |
[in] | src | TLV parser definition whose content is patched into dst |
References TLV_TYPE_NONE, and tlv_def::type.
int tlv_parse | ( | struct tlv_parsed * | dec, |
const struct tlv_definition * | def, | ||
const uint8_t * | buf, | ||
int | buf_len, | ||
uint8_t | lv_tag, | ||
uint8_t | lv_tag2 | ||
) |
Parse an entire buffer of TLV encoded Information Elements.
[out] | dec | caller-allocated pointer to tlv_parsed |
[in] | def | structure defining the valid TLV tags / configurations |
[in] | buf | the input data buffer to be parsed |
[in] | buf_len | length of the input data buffer |
[in] | lv_tag | an initial LV tag at the start of the buffer |
[in] | lv_tag2 | a second initial LV tag following the lv_tag |
References tlv_p_entry::len, tlv_parse_one(), and tlv_p_entry::val.
Referenced by abis_nm_get_sw_desc().
int tlv_parse_one | ( | uint8_t * | o_tag, |
uint16_t * | o_len, | ||
const uint8_t ** | o_val, | ||
const struct tlv_definition * | def, | ||
const uint8_t * | buf, | ||
int | buf_len | ||
) |
Parse a single TLV encoded IE.
[out] | o_tag | the tag of the IE that was found |
[out] | o_len | length of the IE that was found |
[out] | o_val | pointer to the data of the IE that was found |
[in] | def | structure defining the valid TLV tags / configurations |
[in] | buf | the input data buffer to be parsed |
[in] | buf_len | length of the input data buffer |
References tlv_def::fixed_len, TLV_TYPE_FIXED, TLV_TYPE_SINGLE_TV, TLV_TYPE_T, TLV_TYPE_TL16V, TLV_TYPE_TLV, TLV_TYPE_TV, TLV_TYPE_TvLV, TLV_TYPE_vTvLV_GAN, and tlv_def::type.
Referenced by tlv_parse().
|
inlinestatic |
Align given TLV element with 16 bit value to an even address.
[in] | tp | pointer to tlv_parsed |
[in] | pos | element to return |
|
inlinestatic |
Retrieve (possibly unaligned) TLV element and convert to host byte order.
[in] | tp | pointer to tlv_parsed |
[in] | pos | element to return |
|
inlinestatic |
Align given TLV element with 32 bit value to an address that is a multiple of 4.
[in] | tp | pointer to tlv_parsed |
[in] | pos | element to return |
|
inlinestatic |
Retrieve (possibly unaligned) TLV element and convert to host byte order.
[in] | tp | pointer to tlv_parsed |
[in] | pos | element to return |
|
inlinestatic |
put (append) a TV16 field
[in,out] | buf | data buffer |
[in] | tag | Tag value |
[in] | val | Value (in host byte order!) |
Referenced by msgb_tv16_push(), and msgb_tv16_put().