mirror of https://gerrit.osmocom.org/libosmocore
add a regression test for TLV parsing with repeated IEs
Since commitbf383a1d83
tlv_parse() will return the first occurrence of a repeated IE. Add a test to verify this behaviour. This test passes with the current code and fails ifbf383a1d83
is reverted. While here, fix lies in documentation about the return value of tlv_parse() and fix a typo in another comment. Change-Id: I041f38548c5e4236920991d6c681c1c1e04de9ca Related: OS#2904
This commit is contained in:
parent
483f386fd4
commit
c9bebbd325
|
@ -48,7 +48,7 @@
|
|||
struct tlv_definition tvlv_att_def;
|
||||
struct tlv_definition vtvlv_gan_att_def;
|
||||
|
||||
/*! Dump pasred TLV structure to stdout */
|
||||
/*! Dump parsed TLV structure to stdout */
|
||||
int tlv_dump(struct tlv_parsed *dec)
|
||||
{
|
||||
int i;
|
||||
|
@ -227,7 +227,7 @@ tlv: /* GSM TS 04.07 11.2.4: Type 4 TLV */
|
|||
* \param[in] buf_len length of the input data buffer
|
||||
* \param[in] lv_tag an initial LV tag at the start of the buffer
|
||||
* \param[in] lv_tag2 a second initial LV tag following the \a lv_tag
|
||||
* \returns number of bytes consumed by the TLV entry / IE parsed; negative in case of error
|
||||
* \returns number of TLV entries parsed; negative in case of error
|
||||
*/
|
||||
int tlv_parse(struct tlv_parsed *dec, const struct tlv_definition *def,
|
||||
const uint8_t *buf, int buf_len, uint8_t lv_tag,
|
||||
|
|
|
@ -245,11 +245,42 @@ static void test_tlv_shift_functions()
|
|||
}
|
||||
}
|
||||
|
||||
/* Most GSM related protocols clearly indicate that in case of duplicate
|
||||
* IEs, only the first occurrence shall be used, while any further occurrences
|
||||
* shall be ignored. See e.g. 3GPP TS 24.008 Section 8.6.3 */
|
||||
static void test_tlv_repeated_ie()
|
||||
{
|
||||
uint8_t test_data[768];
|
||||
int i, rc;
|
||||
const uint8_t tag = 0x1a;
|
||||
struct tlv_parsed dec;
|
||||
struct tlv_definition def;
|
||||
|
||||
memset(&def, 0, sizeof(def));
|
||||
|
||||
/* tag:1:255, tag:1:254, tag:1:253, ..., tag:1:3, tag:1:2, tag:1:1, tag:1:0 */
|
||||
for (i = 0; i < ARRAY_SIZE(test_data) - 1; i += 3) {
|
||||
test_data[i] = tag;
|
||||
test_data[i + 1] = 1;
|
||||
test_data[i + 2] = (uint8_t)(0xff - i/2);
|
||||
}
|
||||
|
||||
def.def[tag].type = TLV_TYPE_TLV;
|
||||
|
||||
rc = tlv_parse(&dec, &def, &test_data[1], sizeof(test_data) - 1, tag, 0);
|
||||
OSMO_ASSERT(rc == i/3);
|
||||
OSMO_ASSERT(dec.lv[tag].len == 1);
|
||||
/* Value pointer should point at first value in test data array. */
|
||||
OSMO_ASSERT(dec.lv[tag].val == &test_data[2]);
|
||||
OSMO_ASSERT(*dec.lv[tag].val == test_data[2]);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
//osmo_init_logging(&info);
|
||||
|
||||
test_tlv_shift_functions();
|
||||
test_tlv_repeated_ie();
|
||||
|
||||
printf("Done.\n");
|
||||
return EXIT_SUCCESS;
|
||||
|
|
Loading…
Reference in New Issue