mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-02-24 03:40:07 +00:00
sdp_util: assert 16-bit DES is used for builder functions
This commit is contained in:
parent
2ea455e190
commit
80a6e57ee9
@ -206,70 +206,79 @@ void de_create_sequence(uint8_t *header){
|
|||||||
de_store_descriptor_with_len( header, DE_DES, DE_SIZE_VAR_16, 0); // DES, 2 Byte Length
|
de_store_descriptor_with_len( header, DE_DES, DE_SIZE_VAR_16, 0); // DES, 2 Byte Length
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void de_assert_des_16bit(uint8_t * element){
|
||||||
|
btstack_assert(element[0] == ((DE_DES << 3) | DE_SIZE_VAR_16));
|
||||||
|
}
|
||||||
|
|
||||||
/* starts a sub-sequence, @return handle for sub-sequence */
|
/* starts a sub-sequence, @return handle for sub-sequence */
|
||||||
uint8_t * de_push_sequence(uint8_t *header){
|
uint8_t * de_push_sequence(uint8_t *sequence){
|
||||||
int element_len = de_get_len(header);
|
de_assert_des_16bit(sequence);
|
||||||
de_store_descriptor_with_len(header+element_len, DE_DES, DE_SIZE_VAR_16, 0); // DES, 2 Byte Length
|
int element_len = de_get_len(sequence);
|
||||||
return header + element_len;
|
de_store_descriptor_with_len(sequence + element_len, DE_DES, DE_SIZE_VAR_16, 0); // DES, 2 Byte Length
|
||||||
|
return sequence + element_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* closes the current sequence and updates the parent sequence */
|
/* closes the current sequence and updates the parent sequence */
|
||||||
void de_pop_sequence(uint8_t * parent, uint8_t * child){
|
void de_pop_sequence(uint8_t * parent, uint8_t * child){
|
||||||
|
de_assert_des_16bit(parent);
|
||||||
int child_len = de_get_len(child);
|
int child_len = de_get_len(child);
|
||||||
int data_size_parent = big_endian_read_16(parent,1);
|
int data_size_parent = big_endian_read_16(parent,1);
|
||||||
big_endian_store_16(parent, 1, data_size_parent + child_len);
|
big_endian_store_16(parent, 1, data_size_parent + child_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* adds a single number value and 16+32 bit UUID to the sequence */
|
/* adds a single number value and 16+32 bit UUID to the sequence */
|
||||||
void de_add_number(uint8_t *seq, de_type_t type, de_size_t size, uint32_t value){
|
void de_add_number(uint8_t *sequence, de_type_t type, de_size_t size, uint32_t value){
|
||||||
int data_size = big_endian_read_16(seq,1);
|
de_assert_des_16bit(sequence);
|
||||||
|
int data_size = big_endian_read_16(sequence, 1);
|
||||||
int element_size = 1; // e.g. for DE_TYPE_NIL
|
int element_size = 1; // e.g. for DE_TYPE_NIL
|
||||||
de_store_descriptor(seq+3+data_size, type, size);
|
de_store_descriptor(sequence + 3 + data_size, type, size);
|
||||||
switch (size){
|
switch (size){
|
||||||
case DE_SIZE_8:
|
case DE_SIZE_8:
|
||||||
if (type != DE_NIL){
|
if (type != DE_NIL){
|
||||||
seq[4+data_size] = value;
|
sequence[4 + data_size] = value;
|
||||||
element_size = 2;
|
element_size = 2;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case DE_SIZE_16:
|
case DE_SIZE_16:
|
||||||
big_endian_store_16(seq, 4+data_size, value);
|
big_endian_store_16(sequence, 4 + data_size, value);
|
||||||
element_size = 3;
|
element_size = 3;
|
||||||
break;
|
break;
|
||||||
case DE_SIZE_32:
|
case DE_SIZE_32:
|
||||||
big_endian_store_32(seq, 4+data_size, value);
|
big_endian_store_32(sequence, 4 + data_size, value);
|
||||||
element_size = 5;
|
element_size = 5;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
big_endian_store_16(seq, 1, data_size+element_size);
|
big_endian_store_16(sequence, 1, data_size + element_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* add a single block of data, e.g. as DE_STRING, DE_URL */
|
/* add a single block of data, e.g. as DE_STRING, DE_URL */
|
||||||
void de_add_data( uint8_t *seq, de_type_t type, uint16_t size, uint8_t *data){
|
void de_add_data(uint8_t *sequence, de_type_t type, uint16_t size, uint8_t *data){
|
||||||
int data_size = big_endian_read_16(seq,1);
|
de_assert_des_16bit(sequence);
|
||||||
|
int data_size = big_endian_read_16(sequence, 1);
|
||||||
if (size > 0xff) {
|
if (size > 0xff) {
|
||||||
// use 16-bit lengh information (3 byte header)
|
// use 16-bit length information (3 byte header)
|
||||||
de_store_descriptor_with_len(seq+3+data_size, type, DE_SIZE_VAR_16, size);
|
de_store_descriptor_with_len(sequence + 3 + data_size, type, DE_SIZE_VAR_16, size);
|
||||||
data_size += 3;
|
data_size += 3;
|
||||||
} else {
|
} else {
|
||||||
// use 8-bit lengh information (2 byte header)
|
// use 8-bit length information (2 byte header)
|
||||||
de_store_descriptor_with_len(seq+3+data_size, type, DE_SIZE_VAR_8, size);
|
de_store_descriptor_with_len(sequence + 3 + data_size, type, DE_SIZE_VAR_8, size);
|
||||||
data_size += 2;
|
data_size += 2;
|
||||||
}
|
}
|
||||||
if (size > 0){
|
if (size > 0){
|
||||||
(void)memcpy(seq + 3 + data_size, data, size);
|
(void)memcpy(sequence + 3 + data_size, data, size);
|
||||||
data_size += size;
|
data_size += size;
|
||||||
}
|
}
|
||||||
big_endian_store_16(seq, 1, data_size);
|
big_endian_store_16(sequence, 1, data_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void de_add_uuid128(uint8_t * seq, uint8_t * uuid){
|
void de_add_uuid128(uint8_t * sequence, uint8_t * uuid){
|
||||||
int data_size = big_endian_read_16(seq,1);
|
de_assert_des_16bit(sequence);
|
||||||
de_store_descriptor(seq+3+data_size, DE_UUID, DE_SIZE_128);
|
int data_size = big_endian_read_16(sequence, 1);
|
||||||
(void)memcpy(seq + 4 + data_size, uuid, 16);
|
de_store_descriptor(sequence + 3 + data_size, DE_UUID, DE_SIZE_128);
|
||||||
big_endian_store_16(seq, 1, data_size+1+16);
|
(void)memcpy(sequence + 4 + data_size, uuid, 16);
|
||||||
|
big_endian_store_16(sequence, 1, data_size + 1 + 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: DES iterator
|
// MARK: DES iterator
|
||||||
|
@ -111,12 +111,12 @@ uint32_t de_get_uuid32(const uint8_t * element);
|
|||||||
int de_get_normalized_uuid(uint8_t *uuid128, const uint8_t *element);
|
int de_get_normalized_uuid(uint8_t *uuid128, const uint8_t *element);
|
||||||
void de_create_sequence(uint8_t * header);
|
void de_create_sequence(uint8_t * header);
|
||||||
void de_store_descriptor_with_len(uint8_t * header, de_type_t type, de_size_t size, uint32_t len);
|
void de_store_descriptor_with_len(uint8_t * header, de_type_t type, de_size_t size, uint32_t len);
|
||||||
uint8_t * de_push_sequence(uint8_t *header);
|
uint8_t * de_push_sequence(uint8_t *sequence);
|
||||||
void de_pop_sequence(uint8_t * parent, uint8_t * child);
|
void de_pop_sequence(uint8_t * parent, uint8_t * child);
|
||||||
void de_add_number(uint8_t *seq, de_type_t type, de_size_t size, uint32_t value);
|
void de_add_number(uint8_t *sequence, de_type_t type, de_size_t size, uint32_t value);
|
||||||
void de_add_data( uint8_t *seq, de_type_t type, uint16_t size, uint8_t *data);
|
void de_add_data(uint8_t *sequence, de_type_t type, uint16_t size, uint8_t *data);
|
||||||
|
|
||||||
void de_add_uuid128(uint8_t * seq, uint8_t * uuid);
|
void de_add_uuid128(uint8_t * sequence, uint8_t * uuid);
|
||||||
|
|
||||||
// returns data element len if date element is smaller than size
|
// returns data element len if date element is smaller than size
|
||||||
uint32_t de_get_len_safe(const uint8_t * header, uint32_t size);
|
uint32_t de_get_len_safe(const uint8_t * header, uint32_t size);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user