aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src/gprs/gprs_utils.c
diff options
context:
space:
mode:
authorJacob Erlbeck <jerlbeck@sysmocom.de>2014-12-11 12:05:29 +0100
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2014-12-23 15:10:24 +0100
commit697a534ed64e76de3cfb8b558e40d081f70b31ff (patch)
tree10748cc45a5f35f422c853e9bf87e022daefc113 /openbsc/src/gprs/gprs_utils.c
parentdcfd456640b6e15f15c94f175eb145220b96ee1a (diff)
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
Diffstat (limited to 'openbsc/src/gprs/gprs_utils.c')
-rw-r--r--openbsc/src/gprs/gprs_utils.c26
1 files changed, 22 insertions, 4 deletions
diff --git a/openbsc/src/gprs/gprs_utils.c b/openbsc/src/gprs/gprs_utils.c
index cec07d7ec..55bc629e8 100644
--- a/openbsc/src/gprs/gprs_utils.c
+++ b/openbsc/src/gprs/gprs_utils.c
@@ -271,7 +271,26 @@ fail:
}
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 @@ int gprs_match_tlv(uint8_t **data, size_t *data_len,
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)