Commit 3e797d16 authored by Marcel Holtmann's avatar Marcel Holtmann Committed by Marcel Holtmann

[Bluetooth] Add function for triggering a link key change

This patch adds the hci_conn_change_link_key() function that allows
to trigger a link key change for an existing connection.
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent 4e941a9b
...@@ -366,6 +366,11 @@ struct hci_cp_set_conn_encrypt { ...@@ -366,6 +366,11 @@ struct hci_cp_set_conn_encrypt {
__u8 encrypt; __u8 encrypt;
} __attribute__ ((packed)); } __attribute__ ((packed));
#define OCF_CHANGE_CONN_LINK_KEY 0x0015
struct hci_cp_change_conn_link_key {
__u16 handle;
} __attribute__ ((packed));
#define OCF_READ_REMOTE_FEATURES 0x001B #define OCF_READ_REMOTE_FEATURES 0x001B
struct hci_cp_read_rmt_features { struct hci_cp_read_rmt_features {
__u16 handle; __u16 handle;
...@@ -482,6 +487,12 @@ struct hci_ev_encrypt_change { ...@@ -482,6 +487,12 @@ struct hci_ev_encrypt_change {
__u8 encrypt; __u8 encrypt;
} __attribute__ ((packed)); } __attribute__ ((packed));
#define HCI_EV_CHANGE_CONN_LINK_KEY_COMPLETE 0x09
struct hci_ev_change_conn_link_key_complete {
__u8 status;
__u16 handle;
} __attribute__ ((packed));
#define HCI_EV_QOS_SETUP_COMPLETE 0x0D #define HCI_EV_QOS_SETUP_COMPLETE 0x0D
struct hci_qos { struct hci_qos {
__u8 service_type; __u8 service_type;
...@@ -522,6 +533,14 @@ struct hci_ev_role_change { ...@@ -522,6 +533,14 @@ struct hci_ev_role_change {
__u8 role; __u8 role;
} __attribute__ ((packed)); } __attribute__ ((packed));
#define HCI_EV_MODE_CHANGE 0x14
struct hci_ev_mode_change {
__u8 status;
__u16 handle;
__u8 mode;
__u16 interval;
} __attribute__ ((packed));
#define HCI_EV_PIN_CODE_REQ 0x16 #define HCI_EV_PIN_CODE_REQ 0x16
struct hci_ev_pin_code_req { struct hci_ev_pin_code_req {
bdaddr_t bdaddr; bdaddr_t bdaddr;
......
...@@ -277,6 +277,7 @@ void hci_conn_hash_flush(struct hci_dev *hdev); ...@@ -277,6 +277,7 @@ void hci_conn_hash_flush(struct hci_dev *hdev);
struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *src); struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *src);
int hci_conn_auth(struct hci_conn *conn); int hci_conn_auth(struct hci_conn *conn);
int hci_conn_encrypt(struct hci_conn *conn); int hci_conn_encrypt(struct hci_conn *conn);
int hci_conn_change_link_key(struct hci_conn *conn);
static inline void hci_conn_set_timer(struct hci_conn *conn, unsigned long timeout) static inline void hci_conn_set_timer(struct hci_conn *conn, unsigned long timeout)
{ {
......
...@@ -333,6 +333,20 @@ int hci_conn_encrypt(struct hci_conn *conn) ...@@ -333,6 +333,20 @@ int hci_conn_encrypt(struct hci_conn *conn)
} }
EXPORT_SYMBOL(hci_conn_encrypt); EXPORT_SYMBOL(hci_conn_encrypt);
/* Change link key */
int hci_conn_change_link_key(struct hci_conn *conn)
{
BT_DBG("conn %p", conn);
if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->pend)) {
struct hci_cp_change_conn_link_key cp;
cp.handle = __cpu_to_le16(conn->handle);
hci_send_cmd(conn->hdev, OGF_LINK_CTL, OCF_CHANGE_CONN_LINK_KEY, sizeof(cp), &cp);
}
return 0;
}
EXPORT_SYMBOL(hci_conn_change_link_key);
/* Drop all connection on the device */ /* Drop all connection on the device */
void hci_conn_hash_flush(struct hci_dev *hdev) void hci_conn_hash_flush(struct hci_dev *hdev)
{ {
......
...@@ -786,6 +786,11 @@ static inline void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff * ...@@ -786,6 +786,11 @@ static inline void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff *
hci_dev_unlock(hdev); hci_dev_unlock(hdev);
} }
/* Change Connection Link Key Complete */
static inline void hci_change_conn_link_key_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
{
}
/* Pin Code Request*/ /* Pin Code Request*/
static inline void hci_pin_code_request_evt(struct hci_dev *hdev, struct sk_buff *skb) static inline void hci_pin_code_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
{ {
...@@ -853,6 +858,10 @@ void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb) ...@@ -853,6 +858,10 @@ void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb)
hci_encrypt_change_evt(hdev, skb); hci_encrypt_change_evt(hdev, skb);
break; break;
case HCI_EV_CHANGE_CONN_LINK_KEY_COMPLETE:
hci_change_conn_link_key_complete_evt(hdev, skb);
break;
case HCI_EV_PIN_CODE_REQ: case HCI_EV_PIN_CODE_REQ:
hci_pin_code_request_evt(hdev, skb); hci_pin_code_request_evt(hdev, skb);
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment