Skip to content

Commit 160b925

Browse files
sjancJohan Hedberg
authored andcommitted
Bluetooth: Add Authentication Failed reason to Disconnected Mgmt event
If link is disconnected due to Authentication Failure (PIN or Key Missing status) userspace will be notified about this with proper error code. Many LE profiles define "PIN or Key Missing" status as indication of remote lost bond so this allows userspace to take action on this. @ Device Connected: 88:63:DF:88:0E:83 (1) flags 0x0000 02 01 1a 05 03 0a 18 0d 18 0b 09 48 65 61 72 74 ...........Heart 20 52 61 74 65 Rate > HCI Event: Command Status (0x0f) plen 4 LE Read Remote Used Features (0x08|0x0016) ncmd 1 Status: Success (0x00) > ACL Data RX: Handle 3585 flags 0x02 dlen 11 ATT: Read By Group Type Request (0x10) len 6 Handle range: 0x0001-0xffff Attribute group type: Primary Service (0x2800) > HCI Event: LE Meta Event (0x3e) plen 12 LE Read Remote Used Features (0x04) Status: Success (0x00) Handle: 3585 Features: 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 LE Encryption < HCI Command: LE Start Encryption (0x08|0x0019) plen 28 Handle: 3585 Random number: 0x0000000000000000 Encrypted diversifier: 0x0000 Long term key: 26201cd479a0921b6f949f0b1fa8dc82 > HCI Event: Command Status (0x0f) plen 4 LE Start Encryption (0x08|0x0019) ncmd 1 Status: Success (0x00) > HCI Event: Encryption Change (0x08) plen 4 Status: PIN or Key Missing (0x06) Handle: 3585 Encryption: Disabled (0x00) < HCI Command: Disconnect (0x01|0x0006) plen 3 Handle: 3585 Reason: Authentication Failure (0x05) > HCI Event: Command Status (0x0f) plen 4 Disconnect (0x01|0x0006) ncmd 1 Status: Success (0x00) > HCI Event: Disconnect Complete (0x05) plen 4 Status: Success (0x00) Handle: 3585 Reason: Connection Terminated By Local Host (0x16) @ Device Disconnected: 88:63:DF:88:0E:83 (1) reason 4 @ Device Connected: C4:43:8F:A3:4D:83 (0) flags 0x0000 08 09 4e 65 78 75 73 20 35 ..Nexus 5 > HCI Event: Command Status (0x0f) plen 4 Authentication Requested (0x01|0x0011) ncmd 1 Status: Success (0x00) > HCI Event: Link Key Request (0x17) plen 6 Address: C4:43:8F:A3:4D:83 (LG Electronics) < HCI Command: Link Key Request Reply (0x01|0x000b) plen 22 Address: C4:43:8F:A3:4D:83 (LG Electronics) Link key: 080812e4aa97a863d11826f71f65a933 > HCI Event: Command Complete (0x0e) plen 10 Link Key Request Reply (0x01|0x000b) ncmd 1 Status: Success (0x00) Address: C4:43:8F:A3:4D:83 (LG Electronics) > HCI Event: Auth Complete (0x06) plen 3 Status: PIN or Key Missing (0x06) Handle: 75 @ Authentication Failed: C4:43:8F:A3:4D:83 (0) status 0x05 < HCI Command: Disconnect (0x01|0x0006) plen 3 Handle: 75 Reason: Remote User Terminated Connection (0x13) > HCI Event: Command Status (0x0f) plen 4 Disconnect (0x01|0x0006) ncmd 1 Status: Success (0x00) > HCI Event: Disconnect Complete (0x05) plen 4 Status: Success (0x00) Handle: 75 Reason: Connection Terminated By Local Host (0x16) @ Device Disconnected: C4:43:8F:A3:4D:83 (0) reason 4 Signed-off-by: Szymon Janc <[email protected]> Signed-off-by: Johan Hedberg <[email protected]>
1 parent 3faf564 commit 160b925

File tree

4 files changed

+18
-1
lines changed

4 files changed

+18
-1
lines changed

include/net/bluetooth/hci.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,7 @@ enum {
445445
/* ---- HCI Error Codes ---- */
446446
#define HCI_ERROR_UNKNOWN_CONN_ID 0x02
447447
#define HCI_ERROR_AUTH_FAILURE 0x05
448+
#define HCI_ERROR_PIN_OR_KEY_MISSING 0x06
448449
#define HCI_ERROR_MEMORY_EXCEEDED 0x07
449450
#define HCI_ERROR_CONNECTION_TIMEOUT 0x08
450451
#define HCI_ERROR_REJ_LIMITED_RESOURCES 0x0d

include/net/bluetooth/hci_core.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -654,6 +654,7 @@ enum {
654654
HCI_CONN_PARAM_REMOVAL_PEND,
655655
HCI_CONN_NEW_LINK_KEY,
656656
HCI_CONN_SCANNING,
657+
HCI_CONN_AUTH_FAILURE,
657658
};
658659

659660
static inline bool hci_conn_ssp_enabled(struct hci_conn *conn)

include/net/bluetooth/mgmt.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -645,6 +645,7 @@ struct mgmt_ev_device_connected {
645645
#define MGMT_DEV_DISCONN_TIMEOUT 0x01
646646
#define MGMT_DEV_DISCONN_LOCAL_HOST 0x02
647647
#define MGMT_DEV_DISCONN_REMOTE 0x03
648+
#define MGMT_DEV_DISCONN_AUTH_FAILURE 0x04
648649

649650
#define MGMT_EV_DEVICE_DISCONNECTED 0x000C
650651
struct mgmt_ev_device_disconnected {

net/bluetooth/hci_event.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2332,7 +2332,7 @@ static u8 hci_to_mgmt_reason(u8 err)
23322332
static void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
23332333
{
23342334
struct hci_ev_disconn_complete *ev = (void *) skb->data;
2335-
u8 reason = hci_to_mgmt_reason(ev->reason);
2335+
u8 reason;
23362336
struct hci_conn_params *params;
23372337
struct hci_conn *conn;
23382338
bool mgmt_connected;
@@ -2355,6 +2355,12 @@ static void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
23552355
conn->state = BT_CLOSED;
23562356

23572357
mgmt_connected = test_and_clear_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags);
2358+
2359+
if (test_bit(HCI_CONN_AUTH_FAILURE, &conn->flags))
2360+
reason = MGMT_DEV_DISCONN_AUTH_FAILURE;
2361+
else
2362+
reason = hci_to_mgmt_reason(ev->reason);
2363+
23582364
mgmt_device_disconnected(hdev, &conn->dst, conn->type, conn->dst_type,
23592365
reason, mgmt_connected);
23602366

@@ -2421,6 +2427,8 @@ static void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
24212427
goto unlock;
24222428

24232429
if (!ev->status) {
2430+
clear_bit(HCI_CONN_AUTH_FAILURE, &conn->flags);
2431+
24242432
if (!hci_conn_ssp_enabled(conn) &&
24252433
test_bit(HCI_CONN_REAUTH_PEND, &conn->flags)) {
24262434
BT_INFO("re-auth of legacy device is not possible.");
@@ -2429,6 +2437,9 @@ static void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
24292437
conn->sec_level = conn->pending_sec_level;
24302438
}
24312439
} else {
2440+
if (ev->status == HCI_ERROR_PIN_OR_KEY_MISSING)
2441+
set_bit(HCI_CONN_AUTH_FAILURE, &conn->flags);
2442+
24322443
mgmt_auth_failed(conn, ev->status);
24332444
}
24342445

@@ -2613,6 +2624,9 @@ static void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
26132624
clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
26142625

26152626
if (ev->status && conn->state == BT_CONNECTED) {
2627+
if (ev->status == HCI_ERROR_PIN_OR_KEY_MISSING)
2628+
set_bit(HCI_CONN_AUTH_FAILURE, &conn->flags);
2629+
26162630
hci_disconnect(conn, HCI_ERROR_AUTH_FAILURE);
26172631
hci_conn_drop(conn);
26182632
goto unlock;

0 commit comments

Comments
 (0)