Skip to content

Commit

Permalink
Bluetooth: Add connected/disconnected management events
Browse files Browse the repository at this point in the history
This patch adds connected and disconnected managment events to track the
connection status to remote devices. The events map directly to
successful connection complete and disconnection complete HCI events for
ACL links.

Signed-off-by: Johan Hedberg <johan.hedberg@nokia.com>
Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi>
  • Loading branch information
Johan Hedberg authored and Gustavo F. Padovan committed Feb 8, 2011
1 parent 55ed8ca commit f752054
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 5 deletions.
2 changes: 2 additions & 0 deletions include/net/bluetooth/hci_core.h
Original file line number Diff line number Diff line change
Expand Up @@ -714,6 +714,8 @@ int mgmt_powered(u16 index, u8 powered);
int mgmt_discoverable(u16 index, u8 discoverable);
int mgmt_connectable(u16 index, u8 connectable);
int mgmt_new_key(u16 index, struct link_key *key, u8 old_key_type);
int mgmt_connected(u16 index, bdaddr_t *bdaddr);
int mgmt_disconnected(u16 index, bdaddr_t *bdaddr);

/* HCI info for socket */
#define hci_pi(sk) ((struct hci_pinfo *) sk)
Expand Down
12 changes: 12 additions & 0 deletions include/net/bluetooth/mgmt.h
Original file line number Diff line number Diff line change
Expand Up @@ -162,3 +162,15 @@ struct mgmt_ev_new_key {
struct mgmt_key_info key;
__u8 old_key_type;
} __packed;

#define MGMT_EV_CONNECTED 0x000B
struct mgmt_ev_connected {
__le16 index;
bdaddr_t bdaddr;
} __packed;

#define MGMT_EV_DISCONNECTED 0x000C
struct mgmt_ev_disconnected {
__le16 index;
bdaddr_t bdaddr;
} __packed;
16 changes: 11 additions & 5 deletions net/bluetooth/hci_event.c
Original file line number Diff line number Diff line change
Expand Up @@ -1137,6 +1137,7 @@ static inline void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *s
conn->state = BT_CONFIG;
hci_conn_hold(conn);
conn->disc_timeout = HCI_DISCONN_TIMEOUT;
mgmt_connected(hdev->id, &ev->bdaddr);
} else
conn->state = BT_CONNECTED;

Expand Down Expand Up @@ -1269,13 +1270,18 @@ static inline void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff
hci_dev_lock(hdev);

conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
if (conn) {
conn->state = BT_CLOSED;
if (!conn)
goto unlock;

hci_proto_disconn_cfm(conn, ev->reason);
hci_conn_del(conn);
}
conn->state = BT_CLOSED;

if (conn->type == ACL_LINK)
mgmt_disconnected(hdev->id, &conn->dst);

hci_proto_disconn_cfm(conn, ev->reason);
hci_conn_del(conn);

unlock:
hci_dev_unlock(hdev);
}

Expand Down
20 changes: 20 additions & 0 deletions net/bluetooth/mgmt.c
Original file line number Diff line number Diff line change
Expand Up @@ -1090,3 +1090,23 @@ int mgmt_new_key(u16 index, struct link_key *key, u8 old_key_type)

return mgmt_event(MGMT_EV_NEW_KEY, &ev, sizeof(ev), NULL);
}

int mgmt_connected(u16 index, bdaddr_t *bdaddr)
{
struct mgmt_ev_connected ev;

put_unaligned_le16(index, &ev.index);
bacpy(&ev.bdaddr, bdaddr);

return mgmt_event(MGMT_EV_CONNECTED, &ev, sizeof(ev), NULL);
}

int mgmt_disconnected(u16 index, bdaddr_t *bdaddr)
{
struct mgmt_ev_disconnected ev;

put_unaligned_le16(index, &ev.index);
bacpy(&ev.bdaddr, bdaddr);

return mgmt_event(MGMT_EV_DISCONNECTED, &ev, sizeof(ev), NULL);
}

0 comments on commit f752054

Please sign in to comment.