pass in att_connection to PDU handlers

This commit is contained in:
matthias.ringwald@gmail.com 2014-01-06 15:44:47 +00:00
parent c63eb6a1d7
commit 270d89073e
2 changed files with 44 additions and 41 deletions

View File

@ -269,7 +269,7 @@ static uint16_t handle_exchange_mtu_request(att_connection_t * att_connection, u
// //
// TODO: handle other types then GATT_PRIMARY_SERVICE_UUID and GATT_SECONDARY_SERVICE_UUID // TODO: handle other types then GATT_PRIMARY_SERVICE_UUID and GATT_SECONDARY_SERVICE_UUID
// //
static uint16_t handle_find_information_request2(uint8_t * response_buffer, uint16_t response_buffer_size, static uint16_t handle_find_information_request2(att_connection_t * att_connection, uint8_t * response_buffer, uint16_t response_buffer_size,
uint16_t start_handle, uint16_t end_handle){ uint16_t start_handle, uint16_t end_handle){
printf("ATT_FIND_INFORMATION_REQUEST: from %04X to %04X\n", start_handle, end_handle); printf("ATT_FIND_INFORMATION_REQUEST: from %04X to %04X\n", start_handle, end_handle);
@ -323,9 +323,9 @@ static uint16_t handle_find_information_request2(uint8_t * response_buffer, uint
return offset; return offset;
} }
static uint16_t handle_find_information_request(uint8_t * request_buffer, uint16_t request_len, static uint16_t handle_find_information_request(att_connection_t * att_connection, uint8_t * request_buffer, uint16_t request_len,
uint8_t * response_buffer, uint16_t response_buffer_size){ uint8_t * response_buffer, uint16_t response_buffer_size){
return handle_find_information_request2(response_buffer, response_buffer_size, READ_BT_16(request_buffer, 1), READ_BT_16(request_buffer, 3)); return handle_find_information_request2(att_connection, response_buffer, response_buffer_size, READ_BT_16(request_buffer, 1), READ_BT_16(request_buffer, 3));
} }
// //
@ -340,7 +340,7 @@ static uint16_t handle_find_information_request(uint8_t * request_buffer, uint1
// NOTE: doesn't handle DYNAMIC values // NOTE: doesn't handle DYNAMIC values
// NOTE: only supports 16 bit UUIDs // NOTE: only supports 16 bit UUIDs
// //
static uint16_t handle_find_by_type_value_request2(uint8_t * response_buffer, uint16_t response_buffer_size, static uint16_t handle_find_by_type_value_request2(att_connection_t * att_connection, uint8_t * response_buffer, uint16_t response_buffer_size,
uint16_t start_handle, uint16_t end_handle, uint16_t start_handle, uint16_t end_handle,
uint16_t attribute_type, uint16_t attribute_len, uint8_t* attribute_value){ uint16_t attribute_type, uint16_t attribute_len, uint8_t* attribute_value){
@ -394,17 +394,17 @@ static uint16_t handle_find_by_type_value_request2(uint8_t * response_buffer, ui
return offset; return offset;
} }
static uint16_t handle_find_by_type_value_request(uint8_t * request_buffer, uint16_t request_len, static uint16_t handle_find_by_type_value_request(att_connection_t * att_connection, uint8_t * request_buffer, uint16_t request_len,
uint8_t * response_buffer, uint16_t response_buffer_size){ uint8_t * response_buffer, uint16_t response_buffer_size){
int attribute_len = request_len - 7; int attribute_len = request_len - 7;
return handle_find_by_type_value_request2(response_buffer, response_buffer_size, READ_BT_16(request_buffer, 1), return handle_find_by_type_value_request2(att_connection, response_buffer, response_buffer_size, READ_BT_16(request_buffer, 1),
READ_BT_16(request_buffer, 3), READ_BT_16(request_buffer, 5), attribute_len, &request_buffer[7]); READ_BT_16(request_buffer, 3), READ_BT_16(request_buffer, 5), attribute_len, &request_buffer[7]);
} }
// //
// MARK: ATT_READ_BY_TYPE_REQUEST // MARK: ATT_READ_BY_TYPE_REQUEST
// //
static uint16_t handle_read_by_type_request2(uint8_t * response_buffer, uint16_t response_buffer_size, static uint16_t handle_read_by_type_request2(att_connection_t * att_connection, uint8_t * response_buffer, uint16_t response_buffer_size,
uint16_t start_handle, uint16_t end_handle, uint16_t start_handle, uint16_t end_handle,
uint16_t attribute_type_len, uint8_t * attribute_type){ uint16_t attribute_type_len, uint8_t * attribute_type){
@ -464,7 +464,7 @@ static uint16_t handle_read_by_type_request2(uint8_t * response_buffer, uint16_t
return offset; return offset;
} }
static uint16_t handle_read_by_type_request(uint8_t * request_buffer, uint16_t request_len, static uint16_t handle_read_by_type_request(att_connection_t * att_connection, uint8_t * request_buffer, uint16_t request_len,
uint8_t * response_buffer, uint16_t response_buffer_size){ uint8_t * response_buffer, uint16_t response_buffer_size){
int attribute_type_len; int attribute_type_len;
if (request_len <= 7){ if (request_len <= 7){
@ -472,13 +472,13 @@ static uint16_t handle_read_by_type_request(uint8_t * request_buffer, uint16_t
} else { } else {
attribute_type_len = 16; attribute_type_len = 16;
} }
return handle_read_by_type_request2(response_buffer, response_buffer_size, READ_BT_16(request_buffer, 1), READ_BT_16(request_buffer, 3), attribute_type_len, &request_buffer[5]); return handle_read_by_type_request2(att_connection, response_buffer, response_buffer_size, READ_BT_16(request_buffer, 1), READ_BT_16(request_buffer, 3), attribute_type_len, &request_buffer[5]);
} }
// //
// MARK: ATT_READ_BY_TYPE_REQUEST // MARK: ATT_READ_BY_TYPE_REQUEST
// //
static uint16_t handle_read_request2(uint8_t * response_buffer, uint16_t response_buffer_size, uint16_t handle){ static uint16_t handle_read_request2(att_connection_t * att_connection, uint8_t * response_buffer, uint16_t response_buffer_size, uint16_t handle){
printf("ATT_READ_REQUEST: handle %04x\n", handle); printf("ATT_READ_REQUEST: handle %04x\n", handle);
@ -504,15 +504,15 @@ static uint16_t handle_read_request2(uint8_t * response_buffer, uint16_t respons
return offset; return offset;
} }
static uint16_t handle_read_request(uint8_t * request_buffer, uint16_t request_len, static uint16_t handle_read_request(att_connection_t * att_connection, uint8_t * request_buffer, uint16_t request_len,
uint8_t * response_buffer, uint16_t response_buffer_size){ uint8_t * response_buffer, uint16_t response_buffer_size){
return handle_read_request2(response_buffer, response_buffer_size, READ_BT_16(request_buffer, 1)); return handle_read_request2(att_connection, response_buffer, response_buffer_size, READ_BT_16(request_buffer, 1));
} }
// //
// MARK: ATT_READ_BLOB_REQUEST 0x0c // MARK: ATT_READ_BLOB_REQUEST 0x0c
// //
static uint16_t handle_read_blob_request2(uint8_t * response_buffer, uint16_t response_buffer_size, uint16_t handle, uint16_t value_offset){ static uint16_t handle_read_blob_request2(att_connection_t * att_connection, uint8_t * response_buffer, uint16_t response_buffer_size, uint16_t handle, uint16_t value_offset){
printf("ATT_READ_BLOB_REQUEST: handle %04x, offset %u\n", handle, value_offset); printf("ATT_READ_BLOB_REQUEST: handle %04x, offset %u\n", handle, value_offset);
att_iterator_t it; att_iterator_t it;
@ -541,15 +541,15 @@ static uint16_t handle_read_blob_request2(uint8_t * response_buffer, uint16_t re
return offset; return offset;
} }
uint16_t handle_read_blob_request(uint8_t * request_buffer, uint16_t request_len, uint16_t handle_read_blob_request(att_connection_t * att_connection, uint8_t * request_buffer, uint16_t request_len,
uint8_t * response_buffer, uint16_t response_buffer_size){ uint8_t * response_buffer, uint16_t response_buffer_size){
return handle_read_blob_request2(response_buffer, response_buffer_size, READ_BT_16(request_buffer, 1), READ_BT_16(request_buffer, 3)); return handle_read_blob_request2(att_connection, response_buffer, response_buffer_size, READ_BT_16(request_buffer, 1), READ_BT_16(request_buffer, 3));
} }
// //
// MARK: ATT_READ_MULTIPLE_REQUEST 0x0e // MARK: ATT_READ_MULTIPLE_REQUEST 0x0e
// //
static uint16_t handle_read_multiple_request2(uint8_t * response_buffer, uint16_t response_buffer_size, uint16_t num_handles, uint16_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, uint16_t * handles){
printf("ATT_READ_MULTIPLE_REQUEST: num handles %u\n", num_handles); printf("ATT_READ_MULTIPLE_REQUEST: num handles %u\n", num_handles);
uint16_t offset = 1; uint16_t offset = 1;
@ -584,10 +584,10 @@ static uint16_t handle_read_multiple_request2(uint8_t * response_buffer, uint16_
response_buffer[0] = ATT_READ_MULTIPLE_RESPONSE; response_buffer[0] = ATT_READ_MULTIPLE_RESPONSE;
return offset; return offset;
} }
uint16_t handle_read_multiple_request(uint8_t * request_buffer, uint16_t request_len, 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){ uint8_t * response_buffer, uint16_t response_buffer_size){
int num_handles = (request_len - 1) >> 1; int num_handles = (request_len - 1) >> 1;
return handle_read_multiple_request2(response_buffer, response_buffer_size, num_handles, (uint16_t*) &request_buffer[1]); return handle_read_multiple_request2(att_connection, response_buffer, response_buffer_size, num_handles, (uint16_t*) &request_buffer[1]);
} }
// //
@ -597,7 +597,7 @@ uint16_t handle_read_multiple_request(uint8_t * request_buffer, uint16_t reques
// //
// NOTE: doesn't handle DYNAMIC values // NOTE: doesn't handle DYNAMIC values
// //
static uint16_t handle_read_by_group_type_request2(uint8_t * response_buffer, uint16_t response_buffer_size, static uint16_t handle_read_by_group_type_request2(att_connection_t * att_connection, uint8_t * response_buffer, uint16_t response_buffer_size,
uint16_t start_handle, uint16_t end_handle, uint16_t start_handle, uint16_t end_handle,
uint16_t attribute_type_len, uint8_t * attribute_type){ uint16_t attribute_type_len, uint8_t * attribute_type){
@ -676,7 +676,7 @@ static uint16_t handle_read_by_group_type_request2(uint8_t * response_buffer, ui
response_buffer[0] = ATT_READ_BY_GROUP_TYPE_RESPONSE; response_buffer[0] = ATT_READ_BY_GROUP_TYPE_RESPONSE;
return offset; return offset;
} }
uint16_t handle_read_by_group_type_request(uint8_t * request_buffer, uint16_t request_len, uint16_t handle_read_by_group_type_request(att_connection_t * att_connection, uint8_t * request_buffer, uint16_t request_len,
uint8_t * response_buffer, uint16_t response_buffer_size){ uint8_t * response_buffer, uint16_t response_buffer_size){
int attribute_type_len; int attribute_type_len;
if (request_len <= 7){ if (request_len <= 7){
@ -684,22 +684,22 @@ uint16_t handle_read_by_group_type_request(uint8_t * request_buffer, uint16_t r
} else { } else {
attribute_type_len = 16; attribute_type_len = 16;
} }
return handle_read_by_group_type_request2(response_buffer, response_buffer_size, READ_BT_16(request_buffer, 1), READ_BT_16(request_buffer, 3), attribute_type_len, &request_buffer[5]); return handle_read_by_group_type_request2(att_connection, response_buffer, response_buffer_size, READ_BT_16(request_buffer, 1), READ_BT_16(request_buffer, 3), attribute_type_len, &request_buffer[5]);
} }
// //
// MARK: ATT_WRITE_REQUEST 0x12 // MARK: ATT_WRITE_REQUEST 0x12
static uint16_t handle_write_request(uint8_t * request_buffer, uint16_t request_len, static uint16_t handle_write_request(att_connection_t * att_connection, uint8_t * request_buffer, uint16_t request_len,
uint8_t * response_buffer, uint16_t response_buffer_size){ uint8_t * response_buffer, uint16_t response_buffer_size){
uint16_t handle = READ_BT_16(request_buffer, 1); uint16_t handle = READ_BT_16(request_buffer, 1);
if (!att_write_callback) {
return setup_error_write_not_permited(response_buffer, ATT_WRITE_REQUEST, handle);
}
att_iterator_t it; att_iterator_t it;
int ok = att_find_handle(&it, handle); int ok = att_find_handle(&it, handle);
if (!ok) { if (!ok) {
return setup_error_atribute_not_found(response_buffer, ATT_WRITE_REQUEST, handle); return setup_error_atribute_not_found(response_buffer, ATT_WRITE_REQUEST, handle);
} }
if (!att_write_callback) {
return setup_error_write_not_permited(response_buffer, ATT_WRITE_REQUEST, handle);
}
if ((it.flags & ATT_PROPERTY_DYNAMIC) == 0) { if ((it.flags & ATT_PROPERTY_DYNAMIC) == 0) {
return setup_error_write_not_permited(response_buffer, ATT_WRITE_REQUEST, handle); return setup_error_write_not_permited(response_buffer, ATT_WRITE_REQUEST, handle);
} }
@ -710,7 +710,7 @@ static uint16_t handle_write_request(uint8_t * request_buffer, uint16_t request
// //
// MARK: ATT_PREPARE_WRITE_REQUEST 0x16 // MARK: ATT_PREPARE_WRITE_REQUEST 0x16
static uint16_t handle_prepare_write_request(uint8_t * request_buffer, uint16_t request_len, static uint16_t handle_prepare_write_request(att_connection_t * att_connection, uint8_t * request_buffer, uint16_t request_len,
uint8_t * response_buffer, uint16_t response_buffer_size){ uint8_t * response_buffer, uint16_t response_buffer_size){
uint16_t handle = READ_BT_16(request_buffer, 1); uint16_t handle = READ_BT_16(request_buffer, 1);
if (!att_write_callback) { if (!att_write_callback) {
@ -733,7 +733,7 @@ static uint16_t handle_prepare_write_request(uint8_t * request_buffer, uint16_t
} }
// MARK: ATT_EXECUTE_WRITE_REQUEST 0x18 // MARK: ATT_EXECUTE_WRITE_REQUEST 0x18
static uint16_t handle_execute_write_request(uint8_t * request_buffer, uint16_t request_len, static uint16_t handle_execute_write_request(att_connection_t * att_connection, uint8_t * request_buffer, uint16_t request_len,
uint8_t * response_buffer, uint16_t response_buffer_size){ uint8_t * response_buffer, uint16_t response_buffer_size){
if (!att_write_callback) { if (!att_write_callback) {
return setup_error_write_not_permited(response_buffer, ATT_EXECUTE_WRITE_REQUEST, 0); return setup_error_write_not_permited(response_buffer, ATT_EXECUTE_WRITE_REQUEST, 0);
@ -748,7 +748,7 @@ static uint16_t handle_execute_write_request(uint8_t * request_buffer, uint16_t
} }
// MARK: ATT_WRITE_COMMAND 0x52 // MARK: ATT_WRITE_COMMAND 0x52
static void handle_write_command(uint8_t * request_buffer, uint16_t request_len, static void handle_write_command(att_connection_t * att_connection, uint8_t * request_buffer, uint16_t request_len,
uint8_t * response_buffer, uint16_t response_buffer_size){ uint8_t * response_buffer, uint16_t response_buffer_size){
if (!att_write_callback) return; if (!att_write_callback) return;
uint16_t handle = READ_BT_16(request_buffer, 1); uint16_t handle = READ_BT_16(request_buffer, 1);
@ -760,7 +760,7 @@ static void handle_write_command(uint8_t * request_buffer, uint16_t request_len
} }
// MARK: ATT_SIGNED_WRITE_COMAND 0xD2 // MARK: ATT_SIGNED_WRITE_COMAND 0xD2
static void handle_signed_write_command(uint8_t * request_buffer, uint16_t request_len, static void handle_signed_write_command(att_connection_t * att_connection, uint8_t * request_buffer, uint16_t request_len,
uint8_t * response_buffer, uint16_t response_buffer_size){ uint8_t * response_buffer, uint16_t response_buffer_size){
if (request_len < 15) return; if (request_len < 15) return;
@ -822,40 +822,40 @@ uint16_t att_handle_request(att_connection_t * att_connection,
response_len = handle_exchange_mtu_request(att_connection, request_buffer, request_len, response_buffer); response_len = handle_exchange_mtu_request(att_connection, request_buffer, request_len, response_buffer);
break; break;
case ATT_FIND_INFORMATION_REQUEST: case ATT_FIND_INFORMATION_REQUEST:
response_len = handle_find_information_request(request_buffer, request_len,response_buffer, response_buffer_size); response_len = handle_find_information_request(att_connection, request_buffer, request_len,response_buffer, response_buffer_size);
break; break;
case ATT_FIND_BY_TYPE_VALUE_REQUEST: case ATT_FIND_BY_TYPE_VALUE_REQUEST:
response_len = handle_find_by_type_value_request(request_buffer, request_len, response_buffer, response_buffer_size); response_len = handle_find_by_type_value_request(att_connection, request_buffer, request_len, response_buffer, response_buffer_size);
break; break;
case ATT_READ_BY_TYPE_REQUEST: case ATT_READ_BY_TYPE_REQUEST:
response_len = handle_read_by_type_request(request_buffer, request_len, response_buffer, response_buffer_size); response_len = handle_read_by_type_request(att_connection, request_buffer, request_len, response_buffer, response_buffer_size);
break; break;
case ATT_READ_REQUEST: case ATT_READ_REQUEST:
response_len = handle_read_request(request_buffer, request_len, response_buffer, response_buffer_size); response_len = handle_read_request(att_connection, request_buffer, request_len, response_buffer, response_buffer_size);
break; break;
case ATT_READ_BLOB_REQUEST: case ATT_READ_BLOB_REQUEST:
response_len = handle_read_blob_request(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(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);
break; break;
case ATT_READ_BY_GROUP_TYPE_REQUEST: case ATT_READ_BY_GROUP_TYPE_REQUEST:
response_len = handle_read_by_group_type_request(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:
response_len = handle_write_request(request_buffer, request_len, response_buffer, response_buffer_size); response_len = handle_write_request(att_connection, request_buffer, request_len, response_buffer, response_buffer_size);
break; break;
case ATT_PREPARE_WRITE_REQUEST: case ATT_PREPARE_WRITE_REQUEST:
response_len = handle_prepare_write_request(request_buffer, request_len, response_buffer, response_buffer_size); response_len = handle_prepare_write_request(att_connection, request_buffer, request_len, response_buffer, response_buffer_size);
break; break;
case ATT_EXECUTE_WRITE_REQUEST: case ATT_EXECUTE_WRITE_REQUEST:
response_len = handle_execute_write_request(request_buffer, request_len, response_buffer, response_buffer_size); response_len = handle_execute_write_request(att_connection, request_buffer, request_len, response_buffer, response_buffer_size);
break; break;
case ATT_WRITE_COMMAND: case ATT_WRITE_COMMAND:
handle_write_command(request_buffer, request_len, response_buffer, response_buffer_size); handle_write_command(att_connection, request_buffer, request_len, response_buffer, response_buffer_size);
break; break;
case ATT_SIGNED_WRITE_COMAND: case ATT_SIGNED_WRITE_COMAND:
handle_signed_write_command(request_buffer, request_len, response_buffer, response_buffer_size); handle_signed_write_command(att_connection, request_buffer, request_len, response_buffer, response_buffer_size);
break; break;
default: default:
printf("Unhandled ATT Command: %02X, DATA: ", request_buffer[0]); printf("Unhandled ATT Command: %02X, DATA: ", request_buffer[0]);

View File

@ -136,6 +136,9 @@ extern "C" {
typedef struct att_connection { typedef struct att_connection {
uint16_t mtu; uint16_t mtu;
uint8_t encryption_key_size;
uint8_t authenticated;
uint8_t authorized;
} att_connection_t; } att_connection_t;
typedef uint8_t signature_t[12]; typedef uint8_t signature_t[12];