blob: b790d3cd825f3d1a1c59b34dce6bf1bc9bb45d65 [file] [log] [blame]
#include <openbsc/tlv.h>
int tlv_parse(struct tlv_parsed *dec, u_int8_t *buf, int buf_len)
{
u_int8_t tag, len = 1;
u_int8_t *pos;
int num_parsed = 0;
memset(dec, 0, sizeof(*dec));
for (pos = buf; pos < buf+buf_len; pos += len) {
tag = *pos;
/* FIXME: use tables for knwon IEI */
if (tag & 0x80) {
/* GSM TS 04.07 11.2.4: Type 1 TV or Type 2 T */
dec->lv[tag].val = pos;
dec->lv[tag].len = 0;
len = 1;
num_parsed++;
} else {
/* GSM TS 04.07 11.2.4: Type 4 TLV */
if (pos + 1 > buf + buf_len)
return -1;
dec->lv[tag].val = pos+2;
dec->lv[tag].len = *(pos+1);
len = dec->lv[tag].len + 2;
if (pos + len > buf + buf_len)
return -2;
num_parsed++;
}
}
return num_parsed;
}