diff options
| -rw-r--r-- | src/gsm/tlv_parser.c | 4 | ||||
| -rw-r--r-- | tests/tlv/tlv_test.c | 31 | 
2 files changed, 33 insertions, 2 deletions
diff --git a/src/gsm/tlv_parser.c b/src/gsm/tlv_parser.c index b8c7149f..f6939713 100644 --- a/src/gsm/tlv_parser.c +++ b/src/gsm/tlv_parser.c @@ -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, diff --git a/tests/tlv/tlv_test.c b/tests/tlv/tlv_test.c index 87b002f0..2e28e548 100644 --- a/tests/tlv/tlv_test.c +++ b/tests/tlv/tlv_test.c @@ -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;  | 
