implement type1TV or type 2 detection

diff --git a/src/tlv_parser.c b/src/tlv_parser.c
index 182c54d..b790d3c 100644
--- a/src/tlv_parser.c
+++ b/src/tlv_parser.c
@@ -1,25 +1,33 @@
 #include <openbsc/tlv.h>
 
-int tlv_parse(struct tlv_parser *parser, u_int8_t *data, int data_len)
+int tlv_parse(struct tlv_parsed *dec, u_int8_t *buf, int buf_len)
 {
-	u_int8_t *cur = data;
-	memset(parser, 0, sizeof(*parser));
+	u_int8_t tag, len = 1;
+	u_int8_t *pos;
+	int num_parsed = 0;
 
-	while (cur +2 <= data + data_len) {
-		u_int8_t tag, len;
-		u_int8_t *val;
+	memset(dec, 0, sizeof(*dec));
 
-		tag = *cur++;
-		len = *cur++;
-		val = cur;
-
-		parser->lv[tag].len = len;
-		parser->lv[tag].val = val;
-
-		if (cur + len > data + data_len)
-			break;
-
-		cur += len;
+	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 0;
+	return num_parsed;
 }