emit l2cap disconnect events when basedband connection closes

This commit is contained in:
matthias.ringwald 2009-08-08 21:55:55 +00:00
parent f12adbd6cc
commit 27a923d075
3 changed files with 26 additions and 10 deletions

View File

@ -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

View File

@ -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];

View File

@ -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);