mirror of https://gerrit.osmocom.org/libosmocore
tlv: Fix length returned by t{l16,16l}v_put
Every other function returns a pointer to the first byte after the tlv that was just written. tl16v seems to be a copy and paste error from tlv16 above and t16lv seems to count the 16-bit tag twice. The new tests verify that the return value of *_put(buf, tag, len, val) points to buf + *_GROSS_LEN(len). Change-Id: I268a7e11fb5dce67ce1bd7974ab86c4d2bd002f7
This commit is contained in:
parent
d290439b4a
commit
2fa0e9df68
|
@ -148,7 +148,7 @@ static inline uint8_t *tl16v_put(uint8_t *buf, uint8_t tag, uint16_t len,
|
||||||
*buf++ = len >> 8;
|
*buf++ = len >> 8;
|
||||||
*buf++ = len & 0xff;
|
*buf++ = len & 0xff;
|
||||||
memcpy(buf, val, len);
|
memcpy(buf, val, len);
|
||||||
return buf + len*2;
|
return buf + len;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! put (append) a TL16 field. */
|
/*! put (append) a TL16 field. */
|
||||||
|
@ -168,7 +168,7 @@ static inline uint8_t *t16lv_put(uint8_t *buf, uint16_t tag, uint8_t len,
|
||||||
*buf++ = tag & 0xff;
|
*buf++ = tag & 0xff;
|
||||||
*buf++ = len;
|
*buf++ = len;
|
||||||
memcpy(buf, val, len);
|
memcpy(buf, val, len);
|
||||||
return buf + len + 2;
|
return buf + len;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! put (append) a TvLV field */
|
/*! put (append) a TvLV field */
|
||||||
|
|
|
@ -423,6 +423,37 @@ static void test_tlv_parser_bounds()
|
||||||
OSMO_ASSERT(TLVP_VAL(&dec, 0x23) == NULL);
|
OSMO_ASSERT(TLVP_VAL(&dec, 0x23) == NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_tlv_lens()
|
||||||
|
{
|
||||||
|
uint16_t buf_len;
|
||||||
|
uint8_t buf[512];
|
||||||
|
uint8_t val[512] = { 0 };
|
||||||
|
uint16_t x;
|
||||||
|
|
||||||
|
|
||||||
|
for (x = 0; x < 16; x++) {
|
||||||
|
buf_len = lv_put(buf, x, val) - buf;
|
||||||
|
OSMO_ASSERT(buf_len == LV_GROSS_LEN(x));
|
||||||
|
buf_len = tlv_put(buf, 0x23, x, val) - buf;
|
||||||
|
OSMO_ASSERT(buf_len == TLV_GROSS_LEN(x));
|
||||||
|
buf_len = tlv16_put(buf, 0x23, x, (uint16_t *) val) - buf;
|
||||||
|
OSMO_ASSERT(buf_len == TLV16_GROSS_LEN(x));
|
||||||
|
buf_len = tl16v_put(buf, 0x23, x, val) - buf;
|
||||||
|
OSMO_ASSERT(buf_len == TL16V_GROSS_LEN(x));
|
||||||
|
buf_len = t16lv_put(buf, 0x2342, x, val) - buf;
|
||||||
|
OSMO_ASSERT(buf_len == T16LV_GROSS_LEN(x));
|
||||||
|
buf_len = tvlv_put(buf, 0x23, x, val) - buf;
|
||||||
|
OSMO_ASSERT(buf_len == TVLV_GROSS_LEN(x));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (x = 250; x < 300; x++) {
|
||||||
|
buf_len = tl16v_put(buf, 0x23, x, val) - buf;
|
||||||
|
OSMO_ASSERT(buf_len == TL16V_GROSS_LEN(x));
|
||||||
|
buf_len = tvlv_put(buf, 0x23, x, val) - buf;
|
||||||
|
OSMO_ASSERT(buf_len == TVLV_GROSS_LEN(x));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
//osmo_init_logging2(ctx, &info);
|
//osmo_init_logging2(ctx, &info);
|
||||||
|
@ -431,6 +462,7 @@ int main(int argc, char **argv)
|
||||||
test_tlv_repeated_ie();
|
test_tlv_repeated_ie();
|
||||||
test_tlv_encoder();
|
test_tlv_encoder();
|
||||||
test_tlv_parser_bounds();
|
test_tlv_parser_bounds();
|
||||||
|
test_tlv_lens();
|
||||||
|
|
||||||
printf("Done.\n");
|
printf("Done.\n");
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
|
|
Loading…
Reference in New Issue