mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-04-17 02:42:33 +00:00
emit l2cap disconnect events when basedband connection closes
This commit is contained in:
parent
f12adbd6cc
commit
27a923d075
5
TODO.txt
5
TODO.txt
@ -1,9 +1,8 @@
|
||||
/* new todo file for BTstack */
|
||||
|
||||
NEXT:
|
||||
- automatic L2CAP & higher disconnects
|
||||
- when client connection breaks, also close open L2CAP channels
|
||||
=== Restart client app without restarting BTdaemon
|
||||
- implement HCI disconnection
|
||||
=== Restart client app without restarting BTdaemon possible
|
||||
- handle HCI link disconnect
|
||||
- broadcast l2cap disconnects,too
|
||||
- implement timers for POSIX run loop
|
||||
|
30
src/l2cap.c
30
src/l2cap.c
@ -125,8 +125,19 @@ void l2cap_event_handler( uint8_t *packet, uint16_t size ){
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// handle disconnection complete events
|
||||
//@TODO:...
|
||||
if (packet[0] == HCI_EVENT_DISCONNECTION_COMPLETE) {
|
||||
// send l2cap disconnect events for all channels on this handle
|
||||
hci_con_handle_t handle = READ_BT_16(packet, 3);
|
||||
linked_item_t *it;
|
||||
for (it = (linked_item_t *) l2cap_channels; it ; it = it->next){
|
||||
l2cap_channel_t * channel = (l2cap_channel_t *) it;
|
||||
if ( channel->handle == handle ){
|
||||
l2cap_finialize_channel_close(channel);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// forward to higher layers
|
||||
(*event_packet_handler)(packet, size);
|
||||
@ -185,18 +196,23 @@ void l2cap_signaling_handler(l2cap_channel_t *channel, uint8_t *packet, uint16_t
|
||||
case L2CAP_STATE_WAIT_DISCONNECT:
|
||||
switch (code) {
|
||||
case DISCONNECTION_RESPONSE:
|
||||
channel->state = L2CAP_STATE_CLOSED;
|
||||
l2cap_emit_channel_closed(channel);
|
||||
|
||||
// discard channel
|
||||
linked_list_remove(&l2cap_channels, (linked_item_t *) channel);
|
||||
free (channel);
|
||||
l2cap_finialize_channel_close(channel);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// finalize closed channel
|
||||
void l2cap_finialize_channel_close(l2cap_channel_t *channel){
|
||||
channel->state = L2CAP_STATE_CLOSED;
|
||||
l2cap_emit_channel_closed(channel);
|
||||
|
||||
// discard channel
|
||||
linked_list_remove(&l2cap_channels, (linked_item_t *) channel);
|
||||
free (channel);
|
||||
}
|
||||
|
||||
// notify client
|
||||
void l2cap_emit_channel_opened(l2cap_channel_t *channel) {
|
||||
uint8_t event[16];
|
||||
|
@ -54,6 +54,7 @@ void l2cap_send_internal(uint16_t source_cid, uint8_t *data, uint16_t len);
|
||||
void l2cap_acl_handler( uint8_t *packet, uint16_t size );
|
||||
void l2cap_event_handler( uint8_t *packet, uint16_t size );
|
||||
|
||||
void l2cap_finialize_channel_close(l2cap_channel_t *channel);
|
||||
|
||||
void l2cap_emit_channel_opened(l2cap_channel_t *channel);
|
||||
void l2cap_emit_channel_closed(l2cap_channel_t *channel);
|
||||
|
Loading…
x
Reference in New Issue
Block a user