diff options
author | Jacob Erlbeck <jerlbeck@sysmocom.de> | 2014-12-11 12:05:29 +0100 |
---|---|---|
committer | Holger Hans Peter Freyther <holger@moiji-mobile.com> | 2014-12-23 15:10:24 +0100 |
commit | 697a534ed64e76de3cfb8b558e40d081f70b31ff (patch) | |
tree | 10748cc45a5f35f422c853e9bf87e022daefc113 /openbsc/src/gprs/gprs_utils.c | |
parent | dcfd456640b6e15f15c94f175eb145220b96ee1a (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.c | 26 |
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) |