mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-04-16 08:42:28 +00:00
att_db: implement read multiple variable request/response
This commit is contained in:
parent
5683a8e461
commit
2c4384eb9a
@ -865,11 +865,12 @@ static uint16_t handle_read_blob_request(att_connection_t * att_connection, uint
|
|||||||
|
|
||||||
//
|
//
|
||||||
// MARK: ATT_READ_MULTIPLE_REQUEST 0x0e
|
// MARK: ATT_READ_MULTIPLE_REQUEST 0x0e
|
||||||
|
// MARK: ATT_READ_MULTIPLE_REQUEST 0x20
|
||||||
//
|
//
|
||||||
static uint16_t handle_read_multiple_request2(att_connection_t * att_connection, uint8_t * response_buffer, uint16_t response_buffer_size, uint16_t num_handles, uint8_t * handles){
|
static uint16_t handle_read_multiple_request2(att_connection_t * att_connection, uint8_t * response_buffer, uint16_t response_buffer_size, uint16_t num_handles, uint8_t * handles, bool store_length){
|
||||||
log_info("ATT_READ_MULTIPLE_REQUEST: num handles %u", num_handles);
|
log_info("ATT_READ_MULTIPLE_(VARIABLE_)REQUEST: num handles %u", num_handles);
|
||||||
uint8_t request_type = ATT_READ_MULTIPLE_REQUEST;
|
uint8_t request_type = store_length ? ATT_READ_MULTIPLE_VARIABLE_REQ : ATT_READ_MULTIPLE_REQUEST;
|
||||||
|
uint8_t response_type = store_length ? ATT_READ_MULTIPLE_VARIABLE_RSP : ATT_READ_MULTIPLE_RESPONSE;
|
||||||
uint16_t offset = 1;
|
uint16_t offset = 1;
|
||||||
|
|
||||||
uint16_t i;
|
uint16_t i;
|
||||||
@ -882,11 +883,11 @@ static uint16_t handle_read_multiple_request2(att_connection_t * att_connection,
|
|||||||
|
|
||||||
for (i=0; i<num_handles; i++){
|
for (i=0; i<num_handles; i++){
|
||||||
handle = little_endian_read_16(handles, i << 1);
|
handle = little_endian_read_16(handles, i << 1);
|
||||||
|
|
||||||
if (handle == 0u){
|
if (handle == 0u){
|
||||||
return setup_error_invalid_handle(response_buffer, request_type, handle);
|
return setup_error_invalid_handle(response_buffer, request_type, handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
att_iterator_t it;
|
att_iterator_t it;
|
||||||
|
|
||||||
int ok = att_find_handle(&it, handle);
|
int ok = att_find_handle(&it, handle);
|
||||||
@ -907,7 +908,7 @@ static uint16_t handle_read_multiple_request2(att_connection_t * att_connection,
|
|||||||
}
|
}
|
||||||
|
|
||||||
att_update_value_len(&it, 0, att_connection->con_handle);
|
att_update_value_len(&it, 0, att_connection->con_handle);
|
||||||
|
|
||||||
#ifdef ENABLE_ATT_DELAYED_RESPONSE
|
#ifdef ENABLE_ATT_DELAYED_RESPONSE
|
||||||
if (it.value_len == (uint16_t)ATT_READ_RESPONSE_PENDING) {
|
if (it.value_len == (uint16_t)ATT_READ_RESPONSE_PENDING) {
|
||||||
read_request_pending = true;
|
read_request_pending = true;
|
||||||
@ -923,28 +924,50 @@ static uint16_t handle_read_multiple_request2(att_connection_t * att_connection,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// store
|
#ifdef ENABLE_GATT_OVER_EATT
|
||||||
|
// assert that at least Value Length can be stored
|
||||||
|
if (store_length && ((offset + 2) >= response_buffer_size)){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// skip length field
|
||||||
|
uint16_t offset_value_length = offset;
|
||||||
|
if (store_length){
|
||||||
|
offset += 2;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
// store data
|
||||||
uint16_t bytes_copied = att_copy_value(&it, 0, response_buffer + offset, response_buffer_size - offset, att_connection->con_handle);
|
uint16_t bytes_copied = att_copy_value(&it, 0, response_buffer + offset, response_buffer_size - offset, att_connection->con_handle);
|
||||||
offset += bytes_copied;
|
offset += bytes_copied;
|
||||||
|
#ifdef ENABLE_GATT_OVER_EATT
|
||||||
|
// set length field
|
||||||
|
if (store_length) {
|
||||||
|
little_endian_store_16(response_buffer, offset_value_length, bytes_copied);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (error_code != 0u){
|
if (error_code != 0u){
|
||||||
return setup_error(response_buffer, request_type, handle, error_code);
|
return setup_error(response_buffer, request_type, handle, error_code);
|
||||||
}
|
}
|
||||||
|
|
||||||
response_buffer[0] = (uint8_t)ATT_READ_MULTIPLE_RESPONSE;
|
response_buffer[0] = (uint8_t)response_type;
|
||||||
return offset;
|
return offset;
|
||||||
}
|
}
|
||||||
static uint16_t handle_read_multiple_request(att_connection_t * att_connection, uint8_t * request_buffer, uint16_t request_len,
|
|
||||||
uint8_t * response_buffer, uint16_t response_buffer_size){
|
static uint16_t
|
||||||
|
handle_read_multiple_request(att_connection_t *att_connection, uint8_t *request_buffer, uint16_t request_len,
|
||||||
|
uint8_t *response_buffer, uint16_t response_buffer_size, bool store_length) {
|
||||||
|
|
||||||
|
uint8_t request_type = store_length ? ATT_READ_MULTIPLE_VARIABLE_REQ : ATT_READ_MULTIPLE_REQUEST;
|
||||||
|
|
||||||
// 1 byte opcode + two or more attribute handles (2 bytes each)
|
// 1 byte opcode + two or more attribute handles (2 bytes each)
|
||||||
if ( (request_len < 5u) || ((request_len & 1u) == 0u) ){
|
if ( (request_len < 5u) || ((request_len & 1u) == 0u) ){
|
||||||
return setup_error_invalid_pdu(response_buffer, ATT_READ_MULTIPLE_REQUEST);
|
return setup_error_invalid_pdu(response_buffer, request_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
int num_handles = (request_len - 1u) >> 1u;
|
uint8_t num_handles = (request_len - 1u) >> 1u;
|
||||||
return handle_read_multiple_request2(att_connection, response_buffer, response_buffer_size, num_handles, &request_buffer[1]);
|
return handle_read_multiple_request2(att_connection, response_buffer, response_buffer_size, num_handles,
|
||||||
|
&request_buffer[1], store_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -1331,9 +1354,14 @@ uint16_t att_handle_request(att_connection_t * att_connection,
|
|||||||
response_len = handle_read_blob_request(att_connection, request_buffer, request_len, response_buffer, response_buffer_size);
|
response_len = handle_read_blob_request(att_connection, request_buffer, request_len, response_buffer, response_buffer_size);
|
||||||
break;
|
break;
|
||||||
case ATT_READ_MULTIPLE_REQUEST:
|
case ATT_READ_MULTIPLE_REQUEST:
|
||||||
response_len = handle_read_multiple_request(att_connection, request_buffer, request_len, response_buffer, response_buffer_size);
|
response_len = handle_read_multiple_request(att_connection, request_buffer, request_len, response_buffer,
|
||||||
|
response_buffer_size, false);
|
||||||
break;
|
break;
|
||||||
case ATT_READ_BY_GROUP_TYPE_REQUEST:
|
case ATT_READ_MULTIPLE_VARIABLE_REQ:
|
||||||
|
response_len = handle_read_multiple_request(att_connection, request_buffer, request_len, response_buffer,
|
||||||
|
response_buffer_size, true);
|
||||||
|
break;
|
||||||
|
case ATT_READ_BY_GROUP_TYPE_REQUEST:
|
||||||
response_len = handle_read_by_group_type_request(att_connection, request_buffer, request_len, response_buffer, response_buffer_size);
|
response_len = handle_read_by_group_type_request(att_connection, request_buffer, request_len, response_buffer, response_buffer_size);
|
||||||
break;
|
break;
|
||||||
case ATT_WRITE_REQUEST:
|
case ATT_WRITE_REQUEST:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user