gprs: Add gprs_shift_tlv function

This function is similar to gprs_match_tlv with the exception, that
the tag is not compared but returned in *tag instead.

Sponsored-by: On-Waves ehf
diff --git a/openbsc/src/gprs/gprs_utils.c b/openbsc/src/gprs/gprs_utils.c
index cec07d7..55bc629 100644
--- a/openbsc/src/gprs/gprs_utils.c
+++ b/openbsc/src/gprs/gprs_utils.c
@@ -271,7 +271,26 @@
 }
 
 int gprs_match_tlv(uint8_t **data, size_t *data_len,
-	      uint8_t tag, uint8_t **value, size_t *value_len)
+	      uint8_t expected_tag, uint8_t **value, size_t *value_len)
+{
+	int rc;
+	uint8_t tag;
+	uint8_t *old_data = *data;
+	size_t old_data_len = *data_len;
+
+	rc = gprs_shift_tlv(data, data_len, &tag, value, value_len);
+
+	if (rc > 0 && tag != expected_tag) {
+		*data = old_data;
+		*data_len = old_data_len;
+		return 0;
+	}
+
+	return rc;
+}
+
+int gprs_shift_tlv(uint8_t **data, size_t *data_len,
+	      uint8_t *tag, uint8_t **value, size_t *value_len)
 {
 	size_t len;
 	size_t ie_len;
@@ -279,13 +298,12 @@
 	if (*data_len < 2)
 		goto fail;
 
-	if ((*data)[0] != tag)
-		return 0;
-
 	len = (*data)[1];
 	if (len > *data_len - 2)
 		goto fail;
 
+	if (tag)
+		*tag = (*data)[0];
 	if (value)
 		*value = *data + 2;
 	if (value_len)