GSM L3 compatible TLV parser

## 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'
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...
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

## Detailed Description

## Enumeration Type Documentation

enum tlv_type

TLV type.

Enumerator
TLV_TYPE_NONE | no type
TLV_TYPE_FIXED | fixed-length value-only
TLV_TYPE_T | tag-only
TLV_TYPE_TV | tag-value (8bit)
TLV_TYPE_TLV | tag-length-value
TLV_TYPE_TL16V | tag, 16 bit length, value
TLV_TYPE_TvLV | tag, variable length, value
TLV_TYPE_SINGLE_TV | tag and value (both 4 bit) in 1 byte
TLV_TYPE_vTvLV_GAN | variable-length tag, variable-length length

## Function Documentation

static uint8_t* msgb_lv_put | ( | struct msgb * | msg,
|  | uint8_t | len,
|  | const uint8_t * | val
| ) |  |

inline static

put (append) a LV field to a msgb

Returns
  pointer to first byte after newly-put information

References LV_GROSS_LEN, and lv_put().

static uint8_t* msgb_tlv_push | ( | struct msgb * | msg,
|  | uint8_t | tag,
|  | uint8_t | len,
|  | const uint8_t * | val
| ) |  |

inline static

push (prepend) a TLV field to a msgb

Returns
  pointer to first byte of newly-pushed information

References TLV_GROSS_LEN, and tlv_put().

static uint8_t* msgb_tlv_put | ( | struct msgb * | msg,
|  | uint8_t | tag,
|  | uint8_t | len,
|  | const uint8_t * | val
| ) |  |

inline static

put (append) a TLV field to a msgb

Returns
  pointer to first byte after newly-put information

References TLV_GROSS_LEN, and tlv_put().

Referenced by lapdm_phsap_dequeue_prim().

static uint8_t* msgb_tv16_push | ( | struct msgb * | msg,
|  | uint8_t | tag,
|  | uint16_t | val
| ) |  |

inline static

push (prepend) a TV16 field to a msgb

Returns
  pointer to first byte of newly-pushed information

References tv16_put().

Referenced by lapdm_phsap_dequeue_prim(), and rsl_rll_push_l3().

static uint8_t* msgb_tv16_put | ( | struct msgb * | msg,
|  | uint8_t | tag,
|  | uint16_t | val
| ) |  |

inline static

put (append) a TV16 field to a msgb

Returns
  pointer to first byte after newly-put information

References tv16_put().

static uint8_t* msgb_tv_fixed_put | ( | struct msgb * | msg,
|  | uint8_t | tag,
|  | unsigned int | len,
|  | const uint8_t * | val
| ) |  |

inline static

put (append) a TVfixed field to a msgb

Returns
  pointer to first byte after newly-put information

References tv_fixed_put().

Referenced by lapdm_phsap_dequeue_prim().

static uint8_t* msgb_tv_push | ( | struct msgb * | msg,
|  | uint8_t | tag,
|  | uint8_t | val
| ) |  |

inline static

push (prepend) a TV field to a msgb

Returns
  pointer to first byte of newly-pushed information

References tv_put().

static uint8_t* msgb_tv_put | ( | struct msgb * | msg,
|  | uint8_t | tag,
|  | uint8_t | val
| ) |  |

inline static

put (append) a TV field to a msgb

Returns
  pointer to first byte after newly-put information

References tv_put().

Referenced by lapdm_phsap_dequeue_prim().

static uint8_t* msgb_tvlv_push | ( | struct msgb * | msg,
|  | uint8_t | tag,
|  | uint16_t | len,
|  | const uint8_t * | val
| ) |  |

inline static

push (prepend) a TvLV field to a msgb

Returns
  pointer to first byte of newly-pushed information

References TVLV_GROSS_LEN(), tvlv_put(), VTVL_GAN_GROSS_LEN(), and VTVLV_GAN_GROSS_LEN().

static uint8_t* msgb_v_put | ( | struct msgb * | msg,
|  | uint8_t | val
| ) |  |

inline static

put (append) a V field to a msgb

Returns
  pointer to first byte after newly-put information

References v_put().

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.

Parameters

  [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

Returns
  number of bytes consumed by the TLV entry / IE parsed

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.

Parameters

  [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

Returns
  number of bytes consumed by the TLV entry / IE parsed

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().

static uint16_t tlvp_val16_unal | ( | const struct tlv_parsed * | tp,
|  | int | pos
| ) |  |

inline static

Align given TLV element with 16 bit value to an even address.

Parameters

  [in] | tp | pointer to tlv_parsed
  [in] | pos | element to return

Returns
  aligned 16 bit value

static uint32_t tlvp_val32_unal | ( | const struct tlv_parsed * | tp,
|  | int | pos
| ) |  |

inline static

Align given TLV element with 32 bit value to an address that is a multiple of 4.

Parameters

  [in] | tp | pointer to tlv_parsed
  [in] | pos | element to return

Returns
  aligned 32 bit value

static uint8_t* tv16_put | ( | uint8_t * | buf,
|  | uint8_t | tag,
|  | uint16_t | val
| ) |  |

inline static

put (append) a TV16 field

Parameters

  [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().