Skip to content

Commit 0493684

Browse files
committed
[Bluetooth] Disable disconnect timer during Simple Pairing
During the Simple Pairing process the HCI disconnect timer must be disabled. The way to do this is by holding a reference count of the HCI connection. The Simple Pairing process on both sides starts with an IO Capabilities Request and ends with Simple Pairing Complete. Signed-off-by: Marcel Holtmann <[email protected]>
1 parent c7bdd50 commit 0493684

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed

include/net/bluetooth/hci.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -794,6 +794,17 @@ struct extended_inquiry_info {
794794
__u8 data[240];
795795
} __attribute__ ((packed));
796796

797+
#define HCI_EV_IO_CAPA_REQUEST 0x31
798+
struct hci_ev_io_capa_request {
799+
bdaddr_t bdaddr;
800+
} __attribute__ ((packed));
801+
802+
#define HCI_EV_SIMPLE_PAIR_COMPLETE 0x36
803+
struct hci_ev_simple_pair_complete {
804+
__u8 status;
805+
bdaddr_t bdaddr;
806+
} __attribute__ ((packed));
807+
797808
/* Internal events generated by Bluetooth stack */
798809
#define HCI_EV_STACK_INTERNAL 0xfd
799810
struct hci_ev_stack_internal {

net/bluetooth/hci_event.c

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1464,6 +1464,38 @@ static inline void hci_extended_inquiry_result_evt(struct hci_dev *hdev, struct
14641464
hci_dev_unlock(hdev);
14651465
}
14661466

1467+
static inline void hci_io_capa_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
1468+
{
1469+
struct hci_ev_io_capa_request *ev = (void *) skb->data;
1470+
struct hci_conn *conn;
1471+
1472+
BT_DBG("%s", hdev->name);
1473+
1474+
hci_dev_lock(hdev);
1475+
1476+
conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
1477+
if (conn)
1478+
hci_conn_hold(conn);
1479+
1480+
hci_dev_unlock(hdev);
1481+
}
1482+
1483+
static inline void hci_simple_pair_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
1484+
{
1485+
struct hci_ev_simple_pair_complete *ev = (void *) skb->data;
1486+
struct hci_conn *conn;
1487+
1488+
BT_DBG("%s", hdev->name);
1489+
1490+
hci_dev_lock(hdev);
1491+
1492+
conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
1493+
if (conn)
1494+
hci_conn_put(conn);
1495+
1496+
hci_dev_unlock(hdev);
1497+
}
1498+
14671499
void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb)
14681500
{
14691501
struct hci_event_hdr *hdr = (void *) skb->data;
@@ -1588,6 +1620,14 @@ void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb)
15881620
hci_extended_inquiry_result_evt(hdev, skb);
15891621
break;
15901622

1623+
case HCI_EV_IO_CAPA_REQUEST:
1624+
hci_io_capa_request_evt(hdev, skb);
1625+
break;
1626+
1627+
case HCI_EV_SIMPLE_PAIR_COMPLETE:
1628+
hci_simple_pair_complete_evt(hdev, skb);
1629+
break;
1630+
15911631
default:
15921632
BT_DBG("%s event 0x%x", hdev->name, event);
15931633
break;

0 commit comments

Comments
 (0)