libosmogsm 0.9.6-23.20170220git32ee5af8.fc42
Osmocom GSM library
|
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) |
gross length of a LV type field | |
#define | TLV_GROSS_LEN(x) |
gross length of a TLV type field | |
#define | TLV16_GROSS_LEN(x) |
gross length of a TLV16 type field | |
#define | TL16V_GROSS_LEN(x) |
gross length of a TL16V type field | |
#define | L16TV_GROSS_LEN(x) |
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) |
#define | TLVP_LEN(x, y) |
#define | TLVP_VAL(x, y) |
#define | TLVP_PRES_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 | |
static uint8_t * | msgb_lv_put (struct msgb *msg, uint8_t len, const uint8_t *val) |
put (append) a LV field to a msgb | |
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 | |
static uint8_t * | msgb_tv_put (struct msgb *msg, uint8_t tag, uint8_t val) |
put (append) a TV field to a msgb | |
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 | |
static uint8_t * | msgb_v_put (struct msgb *msg, uint8_t val) |
put (append) a V field to a msgb | |
static uint8_t * | msgb_tv16_put (struct msgb *msg, uint8_t tag, uint16_t val) |
put (append) a TV16 field to a msgb | |
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 | |
static uint8_t * | msgb_tv_push (struct msgb *msg, uint8_t tag, uint8_t val) |
push (prepend) a TV field to a msgb | |
static uint8_t * | msgb_tv16_push (struct msgb *msg, uint8_t tag, uint16_t val) |
push (prepend) a TV16 field to a msgb | |
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 | |
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. | |
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. | |
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' | |
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. | |
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. | |
struct tlv_parsed * | osmo_tlvp_copy (const struct tlv_parsed *tp_orig, void *ctx) |
Copy tlv_parsed using given talloc context. | |
int | osmo_tlvp_merge (struct tlv_parsed *dst, const struct tlv_parsed *src) |
Merge all tlv_parsed attributes of 'src' into 'dst'. | |
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 |
#define L16TV_GROSS_LEN | ( | x | ) |
#define LV_GROSS_LEN | ( | x | ) |
#define TL16V_GROSS_LEN | ( | x | ) |
gross length of a TL16V type field
Referenced by msgb_tl16v_put(), TVLV_GROSS_LEN(), and VTVLV_GAN_GROSS_LEN().
#define TLV16_GROSS_LEN | ( | x | ) |
#define TLV_GROSS_LEN | ( | x | ) |
gross length of a TLV type field
Referenced by msgb_tlv_push(), msgb_tlv_put(), TVLV_GROSS_LEN(), and VTVLV_GAN_GROSS_LEN().
#define TLVP_LEN | ( | x, | |
y ) |
#define TLVP_PRES_LEN | ( | tp, | |
tag, | |||
min_len ) |
#define TLVP_PRESENT | ( | x, | |
y ) |
#define TLVP_VAL | ( | x, | |
y ) |
enum tlv_type |
TLV type.
|
inlinestatic |
put (append) a LV field to a msgb
References LV_GROSS_LEN, and lv_put().
|
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().
|
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().
|
inlinestatic |
push (prepend) a TV field to a msgb
References tv_put().
|
inlinestatic |
put (append) a TV field to a msgb
References tv_put().
Referenced by abis_nm_fail_evt_vrep().
|
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().
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().
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_match_shift_tlv().
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 |
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.
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.
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 |
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 |
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().