diff options
Diffstat (limited to 'net/bluetooth/hci_event.c')
| -rw-r--r-- | net/bluetooth/hci_event.c | 48 | 
1 files changed, 48 insertions, 0 deletions
| diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index 4eefb7f65cf6..94ad124a4ea3 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c @@ -3043,6 +3043,50 @@ static inline void hci_extended_inquiry_result_evt(struct hci_dev *hdev, struct  	hci_dev_unlock(hdev);  } +static void hci_key_refresh_complete_evt(struct hci_dev *hdev, +					 struct sk_buff *skb) +{ +	struct hci_ev_key_refresh_complete *ev = (void *) skb->data; +	struct hci_conn *conn; + +	BT_DBG("%s status %u handle %u", hdev->name, ev->status, +	       __le16_to_cpu(ev->handle)); + +	hci_dev_lock(hdev); + +	conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle)); +	if (!conn) +		goto unlock; + +	if (!ev->status) +		conn->sec_level = conn->pending_sec_level; + +	clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags); + +	if (ev->status && conn->state == BT_CONNECTED) { +		hci_acl_disconn(conn, HCI_ERROR_AUTH_FAILURE); +		hci_conn_put(conn); +		goto unlock; +	} + +	if (conn->state == BT_CONFIG) { +		if (!ev->status) +			conn->state = BT_CONNECTED; + +		hci_proto_connect_cfm(conn, ev->status); +		hci_conn_put(conn); +	} else { +		hci_auth_cfm(conn, ev->status); + +		hci_conn_hold(conn); +		conn->disc_timeout = HCI_DISCONN_TIMEOUT; +		hci_conn_put(conn); +	} + +unlock: +	hci_dev_unlock(hdev); +} +  static inline u8 hci_get_auth_req(struct hci_conn *conn)  {  	/* If remote requests dedicated bonding follow that lead */ @@ -3559,6 +3603,10 @@ void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb)  		hci_extended_inquiry_result_evt(hdev, skb);  		break; +	case HCI_EV_KEY_REFRESH_COMPLETE: +		hci_key_refresh_complete_evt(hdev, skb); +		break; +  	case HCI_EV_IO_CAPA_REQUEST:  		hci_io_capa_request_evt(hdev, skb);  		break; | 
