avdtp: extend AVDTP_SUBEVENT_SIGNALING_CONNECTION_ESTABLISHED event with con_handle

This commit is contained in:
Milanka Ringwald 2020-09-30 11:39:03 +02:00
parent 287379cc24
commit 146fc0fb6e
6 changed files with 44 additions and 17 deletions

View File

@ -1724,10 +1724,11 @@ typedef uint8_t sm_key_t[16];
#define AVDTP_SUBEVENT_SIGNALING_GENERAL_REJECT 0x03
/**
* @format 12B1
* @format 12B21
* @param subevent_code
* @param avdtp_cid
* @param bd_addr
* @param con_handle
* @param status 0 == OK
*/
#define AVDTP_SUBEVENT_SIGNALING_CONNECTION_ESTABLISHED 0x04
@ -2070,10 +2071,11 @@ typedef uint8_t sm_key_t[16];
#define A2DP_SUBEVENT_COMMAND_REJECTED 0x0A
/**
* @format 12B1
* @format 12B21
* @param subevent_code
* @param a2dp_cid
* @param bd_addr
* @param con_handle
* @param status 0 == OK
*/
#define A2DP_SUBEVENT_SIGNALING_CONNECTION_ESTABLISHED 0x0B

View File

@ -4415,6 +4415,15 @@ static inline uint16_t avdtp_subevent_signaling_connection_established_get_avdtp
static inline void avdtp_subevent_signaling_connection_established_get_bd_addr(const uint8_t * event, bd_addr_t bd_addr){
reverse_bytes(&event[5], bd_addr, 6);
}
/**
* @brief Get field con_handle from event AVDTP_SUBEVENT_SIGNALING_CONNECTION_ESTABLISHED
* @param event packet
* @return con_handle
* @note: btstack_type 2
*/
static inline uint16_t avdtp_subevent_signaling_connection_established_get_con_handle(const uint8_t * event){
return little_endian_read_16(event, 11);
}
/**
* @brief Get field status from event AVDTP_SUBEVENT_SIGNALING_CONNECTION_ESTABLISHED
* @param event packet
@ -4422,7 +4431,7 @@ static inline void avdtp_subevent_signaling_connection_established_get_bd_addr(c
* @note: btstack_type 1
*/
static inline uint8_t avdtp_subevent_signaling_connection_established_get_status(const uint8_t * event){
return event[11];
return event[13];
}
/**
@ -5750,6 +5759,15 @@ static inline uint16_t a2dp_subevent_signaling_connection_established_get_a2dp_c
static inline void a2dp_subevent_signaling_connection_established_get_bd_addr(const uint8_t * event, bd_addr_t bd_addr){
reverse_bytes(&event[5], bd_addr, 6);
}
/**
* @brief Get field con_handle from event A2DP_SUBEVENT_SIGNALING_CONNECTION_ESTABLISHED
* @param event packet
* @return con_handle
* @note: btstack_type 2
*/
static inline uint16_t a2dp_subevent_signaling_connection_established_get_con_handle(const uint8_t * event){
return little_endian_read_16(event, 11);
}
/**
* @brief Get field status from event A2DP_SUBEVENT_SIGNALING_CONNECTION_ESTABLISHED
* @param event packet
@ -5757,7 +5775,7 @@ static inline void a2dp_subevent_signaling_connection_established_get_bd_addr(co
* @note: btstack_type 1
*/
static inline uint8_t a2dp_subevent_signaling_connection_established_get_status(const uint8_t * event){
return event[11];
return event[13];
}
/**

View File

@ -570,7 +570,7 @@ static void avdtp_handle_sdp_query_failed(avdtp_connection_t * connection, uint8
switch (connection->state){
case AVDTP_SIGNALING_W4_SDP_QUERY_FOR_REMOTE_SINK_COMPLETE:
case AVDTP_SIGNALING_W4_SDP_QUERY_FOR_REMOTE_SOURCE_COMPLETE:
avdtp_signaling_emit_connection_established(connection->avdtp_cid, connection->remote_addr, status);
avdtp_signaling_emit_connection_established(connection->avdtp_cid, connection->remote_addr, connection->con_handle, status);
break;
case AVDTP_SIGNALING_CONNECTION_OPENED:
@ -698,7 +698,7 @@ static void avdtp_handle_sdp_client_query_result(uint8_t packet_type, uint16_t c
(void) sdp_client_register_query_callback(&avdtp_handle_sdp_client_query_request);
}
static avdtp_connection_t * avdtp_handle_incoming_connection(avdtp_connection_t * connection, bd_addr_t event_addr, uint16_t local_cid){
static avdtp_connection_t * avdtp_handle_incoming_connection(avdtp_connection_t * connection, bd_addr_t event_addr, hci_con_handle_t con_handle, uint16_t local_cid){
if (connection == NULL){
uint16_t cid = avdtp_get_next_cid();
connection = avdtp_create_connection(event_addr, cid);
@ -707,6 +707,7 @@ static avdtp_connection_t * avdtp_handle_incoming_connection(avdtp_connection_t
if (connection) {
connection->state = AVDTP_SIGNALING_CONNECTION_W4_L2CAP_CONNECTED;
connection->l2cap_signaling_cid = local_cid;
connection->con_handle = con_handle;
btstack_run_loop_remove_timer(&connection->retry_timer);
}
return connection;
@ -741,6 +742,7 @@ void avdtp_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet
uint16_t local_cid;
uint8_t status;
uint16_t l2cap_mtu;
hci_con_handle_t con_handle;
bool accept_streaming_connection;
bool outoing_signaling_active;
@ -792,7 +794,7 @@ void avdtp_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet
case L2CAP_EVENT_INCOMING_CONNECTION:
l2cap_event_incoming_connection_get_address(packet, event_addr);
local_cid = l2cap_event_incoming_connection_get_local_cid(packet);
con_handle = l2cap_event_incoming_connection_get_handle(packet);
outoing_signaling_active = false;
accept_streaming_connection = false;
@ -817,7 +819,7 @@ void avdtp_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet
decline_connection = outoing_signaling_active && !accept_streaming_connection;
if (outoing_signaling_active == false){
connection = avdtp_handle_incoming_connection(connection, event_addr, local_cid);
connection = avdtp_handle_incoming_connection(connection, event_addr, con_handle, local_cid);
if (connection == NULL){
decline_connection = true;
}
@ -859,6 +861,8 @@ void avdtp_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet
break;
}
con_handle = l2cap_event_channel_opened_get_handle(packet);
switch (connection->state){
case AVDTP_SIGNALING_CONNECTION_W4_L2CAP_CONNECTED:
switch (status){
@ -866,10 +870,10 @@ void avdtp_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet
connection->l2cap_signaling_cid = local_cid;
connection->incoming_declined = false;
connection->l2cap_mtu = l2cap_mtu;
connection->con_handle = con_handle;
connection->state = AVDTP_SIGNALING_CONNECTION_OPENED;
log_info("Connection opened l2cap_signaling_cid 0x%02x, avdtp_cid 0x%02x", connection->l2cap_signaling_cid, connection->avdtp_cid);
avdtp_signaling_emit_connection_established(connection->avdtp_cid, event_addr,
status);
log_info("Connection opened l2cap_signaling_cid 0x%02x, avdtp_cid 0x%02x, con_handle 0x%02x", connection->l2cap_signaling_cid, connection->avdtp_cid, con_handle);
avdtp_signaling_emit_connection_established(connection->avdtp_cid, event_addr, con_handle, status);
return;
case L2CAP_CONNECTION_RESPONSE_RESULT_REFUSED_RESOURCES:
if (connection->incoming_declined == true) {
@ -884,7 +888,7 @@ void avdtp_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet
log_info("Connection to %s failed. status code 0x%02x", bd_addr_to_str(event_addr), status);
break;
}
avdtp_signaling_emit_connection_established(connection->avdtp_cid, event_addr, status);
avdtp_signaling_emit_connection_established(connection->avdtp_cid, event_addr, con_handle, status);
avdtp_finalize_connection(connection);
break;

View File

@ -426,7 +426,8 @@ typedef struct {
bd_addr_t remote_addr;
uint16_t avdtp_cid;
hci_con_handle_t con_handle;
// SDP results
uint16_t avdtp_l2cap_psm;
uint16_t avdtp_version;

View File

@ -482,8 +482,8 @@ int avdtp_signaling_create_fragment(uint16_t cid, avdtp_signaling_packet_t * sig
}
void avdtp_signaling_emit_connection_established(uint16_t avdtp_cid, bd_addr_t addr, uint8_t status) {
uint8_t event[12];
void avdtp_signaling_emit_connection_established(uint16_t avdtp_cid, bd_addr_t addr, hci_con_handle_t con_handle, uint8_t status) {
uint8_t event[14];
int pos = 0;
event[pos++] = HCI_EVENT_AVDTP_META;
event[pos++] = sizeof(event) - 2;
@ -492,6 +492,8 @@ void avdtp_signaling_emit_connection_established(uint16_t avdtp_cid, bd_addr_t a
pos += 2;
reverse_bd_addr(addr,&event[pos]);
pos += 6;
little_endian_store_16(event, pos, con_handle);
pos += 2;
event[pos++] = status;
avdtp_emit_sink_and_source(event, pos);
}
@ -1053,7 +1055,7 @@ void a2dp_emit_signaling_connection_established(btstack_packet_handler_t callbac
btstack_assert(callback != NULL);
packet[0] = HCI_EVENT_A2DP_META;
packet[2] = A2DP_SUBEVENT_SIGNALING_CONNECTION_ESTABLISHED;
packet[10] = status;
packet[13] = status;
(*callback)(HCI_EVENT_PACKET, 0, packet, size);
}

View File

@ -69,7 +69,7 @@ uint16_t avdtp_unpack_service_capabilities(avdtp_connection_t * connection, avdt
void avdtp_prepare_capabilities(avdtp_signaling_packet_t * signaling_packet, uint8_t transaction_label, uint16_t service_categories, avdtp_capabilities_t capabilities, uint8_t identifier);
int avdtp_signaling_create_fragment(uint16_t cid, avdtp_signaling_packet_t * signaling_packet, uint8_t * out_buffer);
void avdtp_signaling_emit_connection_established(uint16_t avdtp_cid, bd_addr_t addr, uint8_t status);
void avdtp_signaling_emit_connection_established(uint16_t avdtp_cid, bd_addr_t addr, hci_con_handle_t con_handle, uint8_t status);
void avdtp_signaling_emit_connection_released(uint16_t avdtp_cid);