pass in signaling identifier, use correct signaling identifier for l2cap connection parameter update response

This commit is contained in:
Matthias Ringwald 2015-07-29 15:15:41 +02:00
parent 7dba825776
commit 79f53f1d06
5 changed files with 22 additions and 18 deletions

View File

@ -164,7 +164,7 @@ void l2cap_emit_connection_parameter_update_response(uint16_t handle, uint16_t r
}
// copy & paste from src/l2cap_signalin.c
uint16_t l2cap_le_create_connection_parameter_update_request(uint8_t * acl_buffer, uint16_t handle, uint16_t interval_min, uint16_t interval_max, uint16_t slave_latency, uint16_t timeout_multiplier){
uint16_t l2cap_le_create_connection_parameter_update_request(uint8_t * acl_buffer, uint16_t handle, uint8_t identifier, uint16_t interval_min, uint16_t interval_max, uint16_t slave_latency, uint16_t timeout_multiplier){
int pb = hci_non_flushable_packet_boundary_flag_supported() ? 0x00 : 0x02;
@ -174,8 +174,8 @@ uint16_t l2cap_le_create_connection_parameter_update_request(uint8_t * acl_buffe
bt_store_16(acl_buffer, 6, 5);
// 8 - Code
acl_buffer[8] = CONNECTION_PARAMETER_UPDATE_REQUEST;
// 9 - id (!= 0 sequentially)
acl_buffer[9] = 1;
// 9 - id
acl_buffer[9] = identifier;
uint16_t pos = 12;
bt_store_16(acl_buffer, pos, interval_min);
pos += 2;
@ -195,7 +195,7 @@ uint16_t l2cap_le_create_connection_parameter_update_request(uint8_t * acl_buffe
}
// copy & paste from src/l2cap_signalin.c
uint16_t l2cap_le_create_connection_parameter_update_response(uint8_t * acl_buffer, uint16_t handle, uint16_t response){
uint16_t l2cap_le_create_connection_parameter_update_response(uint8_t * acl_buffer, uint16_t handle, uint8_t identifier, uint16_t response){
int pb = hci_non_flushable_packet_boundary_flag_supported() ? 0x00 : 0x02;
@ -205,8 +205,8 @@ uint16_t l2cap_le_create_connection_parameter_update_response(uint8_t * acl_buff
bt_store_16(acl_buffer, 6, 5);
// 8 - Code
acl_buffer[8] = CONNECTION_PARAMETER_UPDATE_RESPONSE;
// 9 - id (!= 0 sequentially)
acl_buffer[9] = 1;
// 9 - id
acl_buffer[9] = identifier;
uint16_t pos = 12;
bt_store_16(acl_buffer, pos, response);
pos += 2;
@ -219,6 +219,7 @@ uint16_t l2cap_le_create_connection_parameter_update_response(uint8_t * acl_buff
return pos;
}
static void l2cap_run(void){
// send l2cap con paramter update if necessary
linked_list_iterator_t it;
@ -244,7 +245,7 @@ static void l2cap_run(void){
hci_reserve_packet_buffer();
uint8_t *acl_buffer = hci_get_outgoing_packet_buffer();
connection->le_con_parameter_update_state = CON_PARAMETER_UPDATE_NONE;
uint16_t len = l2cap_le_create_connection_parameter_update_response(acl_buffer, connection->con_handle, result);
uint16_t len = l2cap_le_create_connection_parameter_update_response(acl_buffer, connection->con_handle, connection->le_con_param_update_identifier, result);
hci_send_acl_packet_buffer(len);
if (result == 0){
connection->le_con_parameter_update_state = CON_PARAMETER_UPDATE_CHANGE_HCI_CON_PARAMETERS;
@ -327,6 +328,7 @@ void l2cap_acl_handler( uint8_t *packet, uint16_t size ){
} else {
connection->le_con_parameter_update_state = CON_PARAMETER_UPDATE_DENY;
}
connection->le_con_param_update_identifier = packet[COMPLETE_L2CAP_HEADER + 1];
}
hci_dump_packet( HCI_EVENT_PACKET, 0, event, sizeof(event));
(*packet_handler)(NULL, HCI_EVENT_PACKET, 0, event, sizeof(event));

View File

@ -522,11 +522,11 @@ typedef struct {
// LE Connection parameter update
le_con_parameter_update_state_t le_con_parameter_update_state;
uint8_t le_con_param_update_identifier;
uint16_t le_conn_interval_min;
uint16_t le_conn_interval_max;
uint16_t le_conn_latency;
uint16_t le_supervision_timeout;
uint16_t le_update_con_parameter_response;
#ifdef HAVE_BLE
// LE Security Manager

View File

@ -724,7 +724,7 @@ void l2cap_run(void){
hci_reserve_packet_buffer();
uint8_t *acl_buffer = hci_get_outgoing_packet_buffer();
connection->le_con_parameter_update_state = CON_PARAMETER_UPDATE_NONE;
uint16_t len = l2cap_le_create_connection_parameter_update_response(acl_buffer, connection->con_handle, result);
uint16_t len = l2cap_le_create_connection_parameter_update_response(acl_buffer, connection->con_handle, connection->le_con_param_update_identifier, result);
hci_send_acl_packet_buffer(len);
if (result == 0){
connection->le_con_parameter_update_state = CON_PARAMETER_UPDATE_CHANGE_HCI_CON_PARAMETERS;
@ -1453,6 +1453,7 @@ void l2cap_acl_handler( uint8_t *packet, uint16_t size ){
} else {
connection->le_con_parameter_update_state = CON_PARAMETER_UPDATE_DENY;
}
connection->le_con_param_update_identifier = packet[COMPLETE_L2CAP_HEADER + 1];
}
hci_dump_packet( HCI_EVENT_PACKET, 0, event, sizeof(event));
@ -1596,7 +1597,8 @@ int l2cap_le_request_connection_parameter_update(uint16_t handle, uint16_t inter
// log_info("l2cap_send_signaling_packet type %u", cmd);
hci_reserve_packet_buffer();
uint8_t *acl_buffer = hci_get_outgoing_packet_buffer();
uint16_t len = l2cap_le_create_connection_parameter_update_request(acl_buffer, handle, interval_min, interval_max, slave_latency, timeout_multiplier);
// TODO: find better way to get signaling identifier
uint16_t len = l2cap_le_create_connection_parameter_update_request(acl_buffer, handle, 1, interval_min, interval_max, slave_latency, timeout_multiplier);
return hci_send_acl_packet_buffer(len);
}
#endif

View File

@ -151,7 +151,7 @@ uint16_t l2cap_create_signaling_le(uint8_t * acl_buffer, hci_con_handle_t handle
return l2cap_create_signaling_internal(acl_buffer, handle, 5, cmd, identifier, argptr);
}
uint16_t l2cap_le_create_connection_parameter_update_request(uint8_t * acl_buffer, uint16_t handle, uint16_t interval_min, uint16_t interval_max, uint16_t slave_latency, uint16_t timeout_multiplier){
uint16_t l2cap_le_create_connection_parameter_update_request(uint8_t * acl_buffer, uint16_t handle, uint8_t identifier, uint16_t interval_min, uint16_t interval_max, uint16_t slave_latency, uint16_t timeout_multiplier){
int pb = hci_non_flushable_packet_boundary_flag_supported() ? 0x00 : 0x02;
@ -161,8 +161,8 @@ uint16_t l2cap_le_create_connection_parameter_update_request(uint8_t * acl_buffe
bt_store_16(acl_buffer, 6, 5);
// 8 - Code
acl_buffer[8] = CONNECTION_PARAMETER_UPDATE_REQUEST;
// 9 - id (!= 0 sequentially)
acl_buffer[9] = 1;
// 9 - id
acl_buffer[9] = identifier;
uint16_t pos = 12;
bt_store_16(acl_buffer, pos, interval_min);
pos += 2;
@ -181,7 +181,7 @@ uint16_t l2cap_le_create_connection_parameter_update_request(uint8_t * acl_buffe
return pos;
}
uint16_t l2cap_le_create_connection_parameter_update_response(uint8_t * acl_buffer, uint16_t handle, uint16_t response){
uint16_t l2cap_le_create_connection_parameter_update_response(uint8_t * acl_buffer, uint16_t handle, uint8_t identifier, uint16_t response){
int pb = hci_non_flushable_packet_boundary_flag_supported() ? 0x00 : 0x02;
@ -191,8 +191,8 @@ uint16_t l2cap_le_create_connection_parameter_update_response(uint8_t * acl_buff
bt_store_16(acl_buffer, 6, 5);
// 8 - Code
acl_buffer[8] = CONNECTION_PARAMETER_UPDATE_RESPONSE;
// 9 - id (!= 0 sequentially)
acl_buffer[9] = 1;
// 9 - id
acl_buffer[9] = identifier;
uint16_t pos = 12;
bt_store_16(acl_buffer, pos, response);
pos += 2;

View File

@ -72,8 +72,8 @@ typedef enum {
uint16_t l2cap_create_signaling_classic(uint8_t * acl_buffer,hci_con_handle_t handle, L2CAP_SIGNALING_COMMANDS cmd, uint8_t identifier, va_list argptr);
uint16_t l2cap_create_signaling_le(uint8_t * acl_buffer, hci_con_handle_t handle, L2CAP_SIGNALING_COMMANDS cmd, uint8_t identifier, va_list argptr);
uint16_t l2cap_le_create_connection_parameter_update_request(uint8_t * acl_buffer, uint16_t handle, uint16_t interval_min, uint16_t interval_max, uint16_t slave_latency, uint16_t timeout_multiplier);
uint16_t l2cap_le_create_connection_parameter_update_response(uint8_t * acl_buffer, uint16_t handle, uint16_t response);
uint16_t l2cap_le_create_connection_parameter_update_request(uint8_t * acl_buffer, uint16_t handle, uint8_t identifier, uint16_t interval_min, uint16_t interval_max, uint16_t slave_latency, uint16_t timeout_multiplier);
uint16_t l2cap_le_create_connection_parameter_update_response(uint8_t * acl_buffer, uint16_t handle, uint8_t identifier, uint16_t response);
uint8_t l2cap_next_sig_id(void);
uint16_t l2cap_next_local_cid(void);