Bluetooth: Add skeleton for handling disconnect complete events

This patch adds a simple event handler for the LE Disconnection
Complete HCI event. An extra thing the handler needs to do is to
re-enable advertising if necessary, since it will have been implicitly
disabled by the controller upon a connection event.

Change-Id: Ie6f2eecb8c1d7de16fea24c8fd1533545f41baa5
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
This commit is contained in:
Johan Hedberg 2015-04-18 18:52:54 +03:00 committed by Anas Nashif
commit 58c5689531
2 changed files with 29 additions and 0 deletions

View file

@ -163,6 +163,13 @@ struct bt_hci_cp_le_set_adv_enable {
/* Event definitions */ /* Event definitions */
#define BT_HCI_EVT_DISCONN_COMPLETE 0x05
struct bt_hci_evt_disconn_complete {
uint8_t status;
uint16_t handle;
uint8_t reason;
} PACK_STRUCT;
#define BT_HCI_EVT_CMD_COMPLETE 0x0e #define BT_HCI_EVT_CMD_COMPLETE 0x0e
struct hci_evt_cmd_complete { struct hci_evt_cmd_complete {
uint8_t ncmd; uint8_t ncmd;

View file

@ -203,6 +203,25 @@ static void hci_acl(struct bt_buf *buf)
/* HCI event processing */ /* HCI event processing */
static void hci_disconn_complete(struct bt_buf *buf)
{
struct bt_hci_evt_disconn_complete *evt = (void *)buf->data;
uint16_t handle = bt_acl_handle(sys_le16_to_cpu(evt->handle));
BT_DBG("status %u handle %u reason %u\n", evt->status, handle,
evt->reason);
if (dev.adv_enable) {
struct bt_buf *buf;
buf = bt_hci_cmd_create(BT_HCI_OP_LE_SET_ADV_ENABLE, 1);
if (buf) {
memcpy(bt_buf_add(buf, 1), &dev.adv_enable, 1);
bt_hci_cmd_send(BT_HCI_OP_LE_SET_ADV_ENABLE, buf);
}
}
}
static void hci_reset_complete(struct bt_buf *buf) static void hci_reset_complete(struct bt_buf *buf)
{ {
uint8_t status = buf->data[0]; uint8_t status = buf->data[0];
@ -428,6 +447,9 @@ static void hci_event(struct bt_buf *buf)
bt_buf_pull(buf, sizeof(*hdr)); bt_buf_pull(buf, sizeof(*hdr));
switch (hdr->evt) { switch (hdr->evt) {
case BT_HCI_EVT_DISCONN_COMPLETE:
hci_disconn_complete(buf);
break;
case BT_HCI_EVT_CMD_COMPLETE: case BT_HCI_EVT_CMD_COMPLETE:
hci_cmd_complete(buf); hci_cmd_complete(buf);
break; break;