diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2008-07-14 14:13:45 -0400 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2008-07-14 14:13:45 -0400 |
commit | 9719f8afce34d3d04e884873a8a5e3483e30974c (patch) | |
tree | aee26f7df7e2d92aa54d4b9da88c4ff5987191dd /include/net/bluetooth | |
parent | 77db1980565626471a980f0d2d17299e4bd5e7a5 (diff) |
[Bluetooth] Disconnect when encryption gets disabled
The Bluetooth specification allows to enable or disable the encryption
of an ACL link at any time by either the peer or the remote device. If
a L2CAP or RFCOMM connection requested an encrypted link, they will now
disconnect that link if the encryption gets disabled. Higher protocols
that don't care about encryption (like SDP) are not affected.
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'include/net/bluetooth')
-rw-r--r-- | include/net/bluetooth/hci_core.h | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index ea13baa3851b..c8255adee8f5 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h | |||
@@ -474,7 +474,7 @@ struct hci_proto { | |||
474 | int (*recv_acldata) (struct hci_conn *conn, struct sk_buff *skb, __u16 flags); | 474 | int (*recv_acldata) (struct hci_conn *conn, struct sk_buff *skb, __u16 flags); |
475 | int (*recv_scodata) (struct hci_conn *conn, struct sk_buff *skb); | 475 | int (*recv_scodata) (struct hci_conn *conn, struct sk_buff *skb); |
476 | int (*auth_cfm) (struct hci_conn *conn, __u8 status); | 476 | int (*auth_cfm) (struct hci_conn *conn, __u8 status); |
477 | int (*encrypt_cfm) (struct hci_conn *conn, __u8 status); | 477 | int (*encrypt_cfm) (struct hci_conn *conn, __u8 status, __u8 encrypt); |
478 | }; | 478 | }; |
479 | 479 | ||
480 | static inline int hci_proto_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 type) | 480 | static inline int hci_proto_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 type) |
@@ -532,17 +532,17 @@ static inline void hci_proto_auth_cfm(struct hci_conn *conn, __u8 status) | |||
532 | hp->auth_cfm(conn, status); | 532 | hp->auth_cfm(conn, status); |
533 | } | 533 | } |
534 | 534 | ||
535 | static inline void hci_proto_encrypt_cfm(struct hci_conn *conn, __u8 status) | 535 | static inline void hci_proto_encrypt_cfm(struct hci_conn *conn, __u8 status, __u8 encrypt) |
536 | { | 536 | { |
537 | register struct hci_proto *hp; | 537 | register struct hci_proto *hp; |
538 | 538 | ||
539 | hp = hci_proto[HCI_PROTO_L2CAP]; | 539 | hp = hci_proto[HCI_PROTO_L2CAP]; |
540 | if (hp && hp->encrypt_cfm) | 540 | if (hp && hp->encrypt_cfm) |
541 | hp->encrypt_cfm(conn, status); | 541 | hp->encrypt_cfm(conn, status, encrypt); |
542 | 542 | ||
543 | hp = hci_proto[HCI_PROTO_SCO]; | 543 | hp = hci_proto[HCI_PROTO_SCO]; |
544 | if (hp && hp->encrypt_cfm) | 544 | if (hp && hp->encrypt_cfm) |
545 | hp->encrypt_cfm(conn, status); | 545 | hp->encrypt_cfm(conn, status, encrypt); |
546 | } | 546 | } |
547 | 547 | ||
548 | int hci_register_proto(struct hci_proto *hproto); | 548 | int hci_register_proto(struct hci_proto *hproto); |
@@ -579,7 +579,7 @@ static inline void hci_encrypt_cfm(struct hci_conn *conn, __u8 status, __u8 encr | |||
579 | { | 579 | { |
580 | struct list_head *p; | 580 | struct list_head *p; |
581 | 581 | ||
582 | hci_proto_encrypt_cfm(conn, status); | 582 | hci_proto_encrypt_cfm(conn, status, encrypt); |
583 | 583 | ||
584 | read_lock_bh(&hci_cb_list_lock); | 584 | read_lock_bh(&hci_cb_list_lock); |
585 | list_for_each(p, &hci_cb_list) { | 585 | list_for_each(p, &hci_cb_list) { |