2 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2000-2001 Qualcomm Incorporated
5 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License version 2 as
9 published by the Free Software Foundation;
11 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
12 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
14 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
15 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
16 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
22 SOFTWARE IS DISCLAIMED.
25 /* Bluetooth HCI event handling. */
27 #include <linux/config.h>
28 #include <linux/module.h>
30 #include <linux/types.h>
31 #include <linux/errno.h>
32 #include <linux/kernel.h>
33 #include <linux/sched.h>
34 #include <linux/slab.h>
35 #include <linux/poll.h>
36 #include <linux/fcntl.h>
37 #include <linux/init.h>
38 #include <linux/skbuff.h>
39 #include <linux/interrupt.h>
40 #include <linux/notifier.h>
43 #include <asm/system.h>
44 #include <asm/uaccess.h>
45 #include <asm/unaligned.h>
47 #include <net/bluetooth/bluetooth.h>
48 #include <net/bluetooth/hci_core.h>
50 #ifndef CONFIG_BT_HCI_CORE_DEBUG
55 /* Handle HCI Event packets */
57 /* Command Complete OGF LINK_CTL */
58 static void hci_cc_link_ctl(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb)
62 BT_DBG("%s ocf 0x%x", hdev->name, ocf);
65 case OCF_INQUIRY_CANCEL:
66 status = *((__u8 *) skb->data);
69 BT_DBG("%s Inquiry cancel error: status 0x%x", hdev->name, status);
71 clear_bit(HCI_INQUIRY, &hdev->flags);
72 hci_req_complete(hdev, status);
77 BT_DBG("%s Command complete: ogf LINK_CTL ocf %x", hdev->name, ocf);
82 /* Command Complete OGF LINK_POLICY */
83 static void hci_cc_link_policy(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb)
85 struct hci_conn *conn;
86 struct hci_rp_role_discovery *rd;
88 BT_DBG("%s ocf 0x%x", hdev->name, ocf);
91 case OCF_ROLE_DISCOVERY:
92 rd = (void *) skb->data;
99 conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rd->handle));
102 conn->link_mode &= ~HCI_LM_MASTER;
104 conn->link_mode |= HCI_LM_MASTER;
107 hci_dev_unlock(hdev);
111 BT_DBG("%s: Command complete: ogf LINK_POLICY ocf %x",
117 /* Command Complete OGF HOST_CTL */
118 static void hci_cc_host_ctl(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb)
122 struct hci_rp_read_voice_setting *vs;
125 BT_DBG("%s ocf 0x%x", hdev->name, ocf);
129 status = *((__u8 *) skb->data);
130 hci_req_complete(hdev, status);
133 case OCF_SET_EVENT_FLT:
134 status = *((__u8 *) skb->data);
136 BT_DBG("%s SET_EVENT_FLT failed %d", hdev->name, status);
138 BT_DBG("%s SET_EVENT_FLT succeseful", hdev->name);
142 case OCF_WRITE_AUTH_ENABLE:
143 sent = hci_sent_cmd_data(hdev, OGF_HOST_CTL, OCF_WRITE_AUTH_ENABLE);
147 status = *((__u8 *) skb->data);
148 param = *((__u8 *) sent);
151 if (param == AUTH_ENABLED)
152 set_bit(HCI_AUTH, &hdev->flags);
154 clear_bit(HCI_AUTH, &hdev->flags);
156 hci_req_complete(hdev, status);
159 case OCF_WRITE_ENCRYPT_MODE:
160 sent = hci_sent_cmd_data(hdev, OGF_HOST_CTL, OCF_WRITE_ENCRYPT_MODE);
164 status = *((__u8 *) skb->data);
165 param = *((__u8 *) sent);
169 set_bit(HCI_ENCRYPT, &hdev->flags);
171 clear_bit(HCI_ENCRYPT, &hdev->flags);
173 hci_req_complete(hdev, status);
176 case OCF_WRITE_CA_TIMEOUT:
177 status = *((__u8 *) skb->data);
179 BT_DBG("%s OCF_WRITE_CA_TIMEOUT failed %d", hdev->name, status);
181 BT_DBG("%s OCF_WRITE_CA_TIMEOUT succeseful", hdev->name);
185 case OCF_WRITE_PG_TIMEOUT:
186 status = *((__u8 *) skb->data);
188 BT_DBG("%s OCF_WRITE_PG_TIMEOUT failed %d", hdev->name, status);
190 BT_DBG("%s: OCF_WRITE_PG_TIMEOUT succeseful", hdev->name);
194 case OCF_WRITE_SCAN_ENABLE:
195 sent = hci_sent_cmd_data(hdev, OGF_HOST_CTL, OCF_WRITE_SCAN_ENABLE);
199 status = *((__u8 *) skb->data);
200 param = *((__u8 *) sent);
202 BT_DBG("param 0x%x", param);
205 clear_bit(HCI_PSCAN, &hdev->flags);
206 clear_bit(HCI_ISCAN, &hdev->flags);
207 if (param & SCAN_INQUIRY)
208 set_bit(HCI_ISCAN, &hdev->flags);
210 if (param & SCAN_PAGE)
211 set_bit(HCI_PSCAN, &hdev->flags);
213 hci_req_complete(hdev, status);
216 case OCF_READ_VOICE_SETTING:
217 vs = (struct hci_rp_read_voice_setting *) skb->data;
220 BT_DBG("%s READ_VOICE_SETTING failed %d", hdev->name, vs->status);
224 setting = __le16_to_cpu(vs->voice_setting);
226 if (hdev->voice_setting != setting ) {
227 hdev->voice_setting = setting;
229 BT_DBG("%s: voice setting 0x%04x", hdev->name, setting);
232 tasklet_disable(&hdev->tx_task);
233 hdev->notify(hdev, HCI_NOTIFY_VOICE_SETTING);
234 tasklet_enable(&hdev->tx_task);
239 case OCF_WRITE_VOICE_SETTING:
240 sent = hci_sent_cmd_data(hdev, OGF_HOST_CTL, OCF_WRITE_VOICE_SETTING);
244 status = *((__u8 *) skb->data);
245 setting = __le16_to_cpu(get_unaligned((__le16 *) sent));
247 if (!status && hdev->voice_setting != setting) {
248 hdev->voice_setting = setting;
250 BT_DBG("%s: voice setting 0x%04x", hdev->name, setting);
253 tasklet_disable(&hdev->tx_task);
254 hdev->notify(hdev, HCI_NOTIFY_VOICE_SETTING);
255 tasklet_enable(&hdev->tx_task);
258 hci_req_complete(hdev, status);
261 case OCF_HOST_BUFFER_SIZE:
262 status = *((__u8 *) skb->data);
264 BT_DBG("%s OCF_BUFFER_SIZE failed %d", hdev->name, status);
265 hci_req_complete(hdev, status);
270 BT_DBG("%s Command complete: ogf HOST_CTL ocf %x", hdev->name, ocf);
275 /* Command Complete OGF INFO_PARAM */
276 static void hci_cc_info_param(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb)
278 struct hci_rp_read_loc_features *lf;
279 struct hci_rp_read_buffer_size *bs;
280 struct hci_rp_read_bd_addr *ba;
282 BT_DBG("%s ocf 0x%x", hdev->name, ocf);
285 case OCF_READ_LOCAL_FEATURES:
286 lf = (struct hci_rp_read_loc_features *) skb->data;
289 BT_DBG("%s READ_LOCAL_FEATURES failed %d", hdev->name, lf->status);
293 memcpy(hdev->features, lf->features, sizeof(hdev->features));
295 /* Adjust default settings according to features
296 * supported by device. */
297 if (hdev->features[0] & LMP_3SLOT)
298 hdev->pkt_type |= (HCI_DM3 | HCI_DH3);
300 if (hdev->features[0] & LMP_5SLOT)
301 hdev->pkt_type |= (HCI_DM5 | HCI_DH5);
303 if (hdev->features[1] & LMP_HV2)
304 hdev->pkt_type |= (HCI_HV2);
306 if (hdev->features[1] & LMP_HV3)
307 hdev->pkt_type |= (HCI_HV3);
309 BT_DBG("%s: features 0x%x 0x%x 0x%x", hdev->name, lf->features[0], lf->features[1], lf->features[2]);
313 case OCF_READ_BUFFER_SIZE:
314 bs = (struct hci_rp_read_buffer_size *) skb->data;
317 BT_DBG("%s READ_BUFFER_SIZE failed %d", hdev->name, bs->status);
318 hci_req_complete(hdev, bs->status);
322 hdev->acl_mtu = __le16_to_cpu(bs->acl_mtu);
323 hdev->sco_mtu = bs->sco_mtu ? bs->sco_mtu : 64;
324 hdev->acl_pkts = hdev->acl_cnt = __le16_to_cpu(bs->acl_max_pkt);
325 hdev->sco_pkts = hdev->sco_cnt = __le16_to_cpu(bs->sco_max_pkt);
327 BT_DBG("%s mtu: acl %d, sco %d max_pkt: acl %d, sco %d", hdev->name,
328 hdev->acl_mtu, hdev->sco_mtu, hdev->acl_pkts, hdev->sco_pkts);
331 case OCF_READ_BD_ADDR:
332 ba = (struct hci_rp_read_bd_addr *) skb->data;
335 bacpy(&hdev->bdaddr, &ba->bdaddr);
337 BT_DBG("%s: READ_BD_ADDR failed %d", hdev->name, ba->status);
340 hci_req_complete(hdev, ba->status);
344 BT_DBG("%s Command complete: ogf INFO_PARAM ocf %x", hdev->name, ocf);
349 /* Command Status OGF LINK_CTL */
350 static inline void hci_cs_create_conn(struct hci_dev *hdev, __u8 status)
352 struct hci_conn *conn;
353 struct hci_cp_create_conn *cp = hci_sent_cmd_data(hdev, OGF_LINK_CTL, OCF_CREATE_CONN);
360 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
362 BT_DBG("%s status 0x%x bdaddr %s conn %p", hdev->name,
363 status, batostr(&cp->bdaddr), conn);
366 if (conn && conn->state == BT_CONNECT) {
367 conn->state = BT_CLOSED;
368 hci_proto_connect_cfm(conn, status);
373 conn = hci_conn_add(hdev, ACL_LINK, &cp->bdaddr);
376 conn->link_mode |= HCI_LM_MASTER;
378 BT_ERR("No memmory for new connection");
382 hci_dev_unlock(hdev);
385 static void hci_cs_link_ctl(struct hci_dev *hdev, __u16 ocf, __u8 status)
387 BT_DBG("%s ocf 0x%x", hdev->name, ocf);
390 case OCF_CREATE_CONN:
391 hci_cs_create_conn(hdev, status);
396 struct hci_conn *acl, *sco;
397 struct hci_cp_add_sco *cp = hci_sent_cmd_data(hdev, OGF_LINK_CTL, OCF_ADD_SCO);
403 handle = __le16_to_cpu(cp->handle);
405 BT_DBG("%s Add SCO error: handle %d status 0x%x", hdev->name, handle, status);
409 acl = hci_conn_hash_lookup_handle(hdev, handle);
410 if (acl && (sco = acl->link)) {
411 sco->state = BT_CLOSED;
413 hci_proto_connect_cfm(sco, status);
417 hci_dev_unlock(hdev);
423 BT_DBG("%s Inquiry error: status 0x%x", hdev->name, status);
424 hci_req_complete(hdev, status);
426 set_bit(HCI_INQUIRY, &hdev->flags);
431 BT_DBG("%s Command status: ogf LINK_CTL ocf %x status %d",
432 hdev->name, ocf, status);
437 /* Command Status OGF LINK_POLICY */
438 static void hci_cs_link_policy(struct hci_dev *hdev, __u16 ocf, __u8 status)
440 BT_DBG("%s ocf 0x%x", hdev->name, ocf);
444 BT_DBG("%s Command status: ogf HOST_POLICY ocf %x", hdev->name, ocf);
449 /* Command Status OGF HOST_CTL */
450 static void hci_cs_host_ctl(struct hci_dev *hdev, __u16 ocf, __u8 status)
452 BT_DBG("%s ocf 0x%x", hdev->name, ocf);
456 BT_DBG("%s Command status: ogf HOST_CTL ocf %x", hdev->name, ocf);
461 /* Command Status OGF INFO_PARAM */
462 static void hci_cs_info_param(struct hci_dev *hdev, __u16 ocf, __u8 status)
464 BT_DBG("%s: hci_cs_info_param: ocf 0x%x", hdev->name, ocf);
468 BT_DBG("%s Command status: ogf INFO_PARAM ocf %x", hdev->name, ocf);
473 /* Inquiry Complete */
474 static inline void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
476 __u8 status = *((__u8 *) skb->data);
478 BT_DBG("%s status %d", hdev->name, status);
480 clear_bit(HCI_INQUIRY, &hdev->flags);
481 hci_req_complete(hdev, status);
485 static inline void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb)
487 struct inquiry_data data;
488 struct inquiry_info *info = (struct inquiry_info *) (skb->data + 1);
489 int num_rsp = *((__u8 *) skb->data);
491 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
498 for (; num_rsp; num_rsp--) {
499 bacpy(&data.bdaddr, &info->bdaddr);
500 data.pscan_rep_mode = info->pscan_rep_mode;
501 data.pscan_period_mode = info->pscan_period_mode;
502 data.pscan_mode = info->pscan_mode;
503 memcpy(data.dev_class, info->dev_class, 3);
504 data.clock_offset = info->clock_offset;
507 hci_inquiry_cache_update(hdev, &data);
510 hci_dev_unlock(hdev);
513 /* Inquiry Result With RSSI */
514 static inline void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev, struct sk_buff *skb)
516 struct inquiry_data data;
517 int num_rsp = *((__u8 *) skb->data);
519 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
526 if ((skb->len - 1) / num_rsp != sizeof(struct inquiry_info_with_rssi)) {
527 struct inquiry_info_with_rssi_and_pscan_mode *info =
528 (struct inquiry_info_with_rssi_and_pscan_mode *) (skb->data + 1);
530 for (; num_rsp; num_rsp--) {
531 bacpy(&data.bdaddr, &info->bdaddr);
532 data.pscan_rep_mode = info->pscan_rep_mode;
533 data.pscan_period_mode = info->pscan_period_mode;
534 data.pscan_mode = info->pscan_mode;
535 memcpy(data.dev_class, info->dev_class, 3);
536 data.clock_offset = info->clock_offset;
537 data.rssi = info->rssi;
539 hci_inquiry_cache_update(hdev, &data);
542 struct inquiry_info_with_rssi *info =
543 (struct inquiry_info_with_rssi *) (skb->data + 1);
545 for (; num_rsp; num_rsp--) {
546 bacpy(&data.bdaddr, &info->bdaddr);
547 data.pscan_rep_mode = info->pscan_rep_mode;
548 data.pscan_period_mode = info->pscan_period_mode;
549 data.pscan_mode = 0x00;
550 memcpy(data.dev_class, info->dev_class, 3);
551 data.clock_offset = info->clock_offset;
552 data.rssi = info->rssi;
554 hci_inquiry_cache_update(hdev, &data);
558 hci_dev_unlock(hdev);
561 /* Extended Inquiry Result */
562 static inline void hci_extended_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb)
564 struct inquiry_data data;
565 struct extended_inquiry_info *info = (struct extended_inquiry_info *) (skb->data + 1);
566 int num_rsp = *((__u8 *) skb->data);
568 BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
575 for (; num_rsp; num_rsp--) {
576 bacpy(&data.bdaddr, &info->bdaddr);
577 data.pscan_rep_mode = info->pscan_rep_mode;
578 data.pscan_period_mode = info->pscan_period_mode;
579 data.pscan_mode = 0x00;
580 memcpy(data.dev_class, info->dev_class, 3);
581 data.clock_offset = info->clock_offset;
582 data.rssi = info->rssi;
584 hci_inquiry_cache_update(hdev, &data);
587 hci_dev_unlock(hdev);
590 /* Connect Request */
591 static inline void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
593 struct hci_ev_conn_request *ev = (struct hci_ev_conn_request *) skb->data;
594 int mask = hdev->link_mode;
596 BT_DBG("%s Connection request: %s type 0x%x", hdev->name,
597 batostr(&ev->bdaddr), ev->link_type);
599 mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, ev->link_type);
601 if (mask & HCI_LM_ACCEPT) {
602 /* Connection accepted */
603 struct hci_conn *conn;
604 struct hci_cp_accept_conn_req cp;
607 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
609 if (!(conn = hci_conn_add(hdev, ev->link_type, &ev->bdaddr))) {
610 BT_ERR("No memmory for new connection");
611 hci_dev_unlock(hdev);
615 memcpy(conn->dev_class, ev->dev_class, 3);
616 conn->state = BT_CONNECT;
617 hci_dev_unlock(hdev);
619 bacpy(&cp.bdaddr, &ev->bdaddr);
621 if (lmp_rswitch_capable(hdev) && (mask & HCI_LM_MASTER))
622 cp.role = 0x00; /* Become master */
624 cp.role = 0x01; /* Remain slave */
626 hci_send_cmd(hdev, OGF_LINK_CTL, OCF_ACCEPT_CONN_REQ, sizeof(cp), &cp);
628 /* Connection rejected */
629 struct hci_cp_reject_conn_req cp;
631 bacpy(&cp.bdaddr, &ev->bdaddr);
633 hci_send_cmd(hdev, OGF_LINK_CTL, OCF_REJECT_CONN_REQ, sizeof(cp), &cp);
637 /* Connect Complete */
638 static inline void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
640 struct hci_ev_conn_complete *ev = (struct hci_ev_conn_complete *) skb->data;
641 struct hci_conn *conn = NULL;
643 BT_DBG("%s", hdev->name);
647 conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
649 hci_dev_unlock(hdev);
654 conn->handle = __le16_to_cpu(ev->handle);
655 conn->state = BT_CONNECTED;
657 if (test_bit(HCI_AUTH, &hdev->flags))
658 conn->link_mode |= HCI_LM_AUTH;
660 if (test_bit(HCI_ENCRYPT, &hdev->flags))
661 conn->link_mode |= HCI_LM_ENCRYPT;
663 /* Set link policy */
664 if (conn->type == ACL_LINK && hdev->link_policy) {
665 struct hci_cp_write_link_policy cp;
666 cp.handle = ev->handle;
667 cp.policy = __cpu_to_le16(hdev->link_policy);
668 hci_send_cmd(hdev, OGF_LINK_POLICY, OCF_WRITE_LINK_POLICY, sizeof(cp), &cp);
671 /* Set packet type for incoming connection */
673 struct hci_cp_change_conn_ptype cp;
674 cp.handle = ev->handle;
675 cp.pkt_type = (conn->type == ACL_LINK) ?
676 __cpu_to_le16(hdev->pkt_type & ACL_PTYPE_MASK):
677 __cpu_to_le16(hdev->pkt_type & SCO_PTYPE_MASK);
679 hci_send_cmd(hdev, OGF_LINK_CTL, OCF_CHANGE_CONN_PTYPE, sizeof(cp), &cp);
682 conn->state = BT_CLOSED;
684 if (conn->type == ACL_LINK) {
685 struct hci_conn *sco = conn->link;
688 hci_add_sco(sco, conn->handle);
690 hci_proto_connect_cfm(sco, ev->status);
696 hci_proto_connect_cfm(conn, ev->status);
700 hci_dev_unlock(hdev);
703 /* Disconnect Complete */
704 static inline void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
706 struct hci_ev_disconn_complete *ev = (struct hci_ev_disconn_complete *) skb->data;
707 struct hci_conn *conn = NULL;
708 __u16 handle = __le16_to_cpu(ev->handle);
710 BT_DBG("%s status %d", hdev->name, ev->status);
717 conn = hci_conn_hash_lookup_handle(hdev, handle);
719 conn->state = BT_CLOSED;
720 hci_proto_disconn_ind(conn, ev->reason);
724 hci_dev_unlock(hdev);
727 /* Number of completed packets */
728 static inline void hci_num_comp_pkts_evt(struct hci_dev *hdev, struct sk_buff *skb)
730 struct hci_ev_num_comp_pkts *ev = (struct hci_ev_num_comp_pkts *) skb->data;
734 skb_pull(skb, sizeof(*ev));
736 BT_DBG("%s num_hndl %d", hdev->name, ev->num_hndl);
738 if (skb->len < ev->num_hndl * 4) {
739 BT_DBG("%s bad parameters", hdev->name);
743 tasklet_disable(&hdev->tx_task);
745 for (i = 0, ptr = (__le16 *) skb->data; i < ev->num_hndl; i++) {
746 struct hci_conn *conn;
749 handle = __le16_to_cpu(get_unaligned(ptr++));
750 count = __le16_to_cpu(get_unaligned(ptr++));
752 conn = hci_conn_hash_lookup_handle(hdev, handle);
756 if (conn->type == SCO_LINK) {
757 if ((hdev->sco_cnt += count) > hdev->sco_pkts)
758 hdev->sco_cnt = hdev->sco_pkts;
760 if ((hdev->acl_cnt += count) > hdev->acl_pkts)
761 hdev->acl_cnt = hdev->acl_pkts;
767 tasklet_enable(&hdev->tx_task);
771 static inline void hci_role_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
773 struct hci_ev_role_change *ev = (struct hci_ev_role_change *) skb->data;
774 struct hci_conn *conn = NULL;
776 BT_DBG("%s status %d", hdev->name, ev->status);
780 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr);
784 conn->link_mode &= ~HCI_LM_MASTER;
786 conn->link_mode |= HCI_LM_MASTER;
789 clear_bit(HCI_CONN_RSWITCH_PEND, &conn->pend);
791 hci_role_switch_cfm(conn, ev->status, ev->role);
794 hci_dev_unlock(hdev);
797 /* Authentication Complete */
798 static inline void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
800 struct hci_ev_auth_complete *ev = (struct hci_ev_auth_complete *) skb->data;
801 struct hci_conn *conn = NULL;
802 __u16 handle = __le16_to_cpu(ev->handle);
804 BT_DBG("%s status %d", hdev->name, ev->status);
808 conn = hci_conn_hash_lookup_handle(hdev, handle);
811 conn->link_mode |= HCI_LM_AUTH;
813 clear_bit(HCI_CONN_AUTH_PEND, &conn->pend);
815 hci_auth_cfm(conn, ev->status);
817 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend)) {
819 struct hci_cp_set_conn_encrypt cp;
820 cp.handle = __cpu_to_le16(conn->handle);
822 hci_send_cmd(conn->hdev, OGF_LINK_CTL,
823 OCF_SET_CONN_ENCRYPT,
826 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend);
827 hci_encrypt_cfm(conn, ev->status, 0x00);
832 hci_dev_unlock(hdev);
835 /* Encryption Change */
836 static inline void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
838 struct hci_ev_encrypt_change *ev = (struct hci_ev_encrypt_change *) skb->data;
839 struct hci_conn *conn = NULL;
840 __u16 handle = __le16_to_cpu(ev->handle);
842 BT_DBG("%s status %d", hdev->name, ev->status);
846 conn = hci_conn_hash_lookup_handle(hdev, handle);
850 conn->link_mode |= HCI_LM_ENCRYPT;
852 conn->link_mode &= ~HCI_LM_ENCRYPT;
855 clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend);
857 hci_encrypt_cfm(conn, ev->status, ev->encrypt);
860 hci_dev_unlock(hdev);
863 /* Change Connection Link Key Complete */
864 static inline void hci_change_conn_link_key_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
866 struct hci_ev_change_conn_link_key_complete *ev = (struct hci_ev_change_conn_link_key_complete *) skb->data;
867 struct hci_conn *conn = NULL;
868 __u16 handle = __le16_to_cpu(ev->handle);
870 BT_DBG("%s status %d", hdev->name, ev->status);
874 conn = hci_conn_hash_lookup_handle(hdev, handle);
877 conn->link_mode |= HCI_LM_SECURE;
879 clear_bit(HCI_CONN_AUTH_PEND, &conn->pend);
881 hci_key_change_cfm(conn, ev->status);
884 hci_dev_unlock(hdev);
887 /* Pin Code Request*/
888 static inline void hci_pin_code_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
892 /* Link Key Request */
893 static inline void hci_link_key_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
897 /* Link Key Notification */
898 static inline void hci_link_key_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
903 static inline void hci_clock_offset_evt(struct hci_dev *hdev, struct sk_buff *skb)
905 struct hci_ev_clock_offset *ev = (struct hci_ev_clock_offset *) skb->data;
906 struct hci_conn *conn = NULL;
907 __u16 handle = __le16_to_cpu(ev->handle);
909 BT_DBG("%s status %d", hdev->name, ev->status);
913 conn = hci_conn_hash_lookup_handle(hdev, handle);
914 if (conn && !ev->status) {
915 struct inquiry_entry *ie;
917 if ((ie = hci_inquiry_cache_lookup(hdev, &conn->dst))) {
918 ie->data.clock_offset = ev->clock_offset;
919 ie->timestamp = jiffies;
923 hci_dev_unlock(hdev);
926 /* Page Scan Repetition Mode */
927 static inline void hci_pscan_rep_mode_evt(struct hci_dev *hdev, struct sk_buff *skb)
929 struct hci_ev_pscan_rep_mode *ev = (struct hci_ev_pscan_rep_mode *) skb->data;
930 struct inquiry_entry *ie;
932 BT_DBG("%s", hdev->name);
936 if ((ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr))) {
937 ie->data.pscan_rep_mode = ev->pscan_rep_mode;
938 ie->timestamp = jiffies;
941 hci_dev_unlock(hdev);
944 void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb)
946 struct hci_event_hdr *hdr = (struct hci_event_hdr *) skb->data;
947 struct hci_ev_cmd_complete *ec;
948 struct hci_ev_cmd_status *cs;
949 u16 opcode, ocf, ogf;
951 skb_pull(skb, HCI_EVENT_HDR_SIZE);
953 BT_DBG("%s evt 0x%x", hdev->name, hdr->evt);
956 case HCI_EV_NUM_COMP_PKTS:
957 hci_num_comp_pkts_evt(hdev, skb);
960 case HCI_EV_INQUIRY_COMPLETE:
961 hci_inquiry_complete_evt(hdev, skb);
964 case HCI_EV_INQUIRY_RESULT:
965 hci_inquiry_result_evt(hdev, skb);
968 case HCI_EV_INQUIRY_RESULT_WITH_RSSI:
969 hci_inquiry_result_with_rssi_evt(hdev, skb);
972 case HCI_EV_EXTENDED_INQUIRY_RESULT:
973 hci_extended_inquiry_result_evt(hdev, skb);
976 case HCI_EV_CONN_REQUEST:
977 hci_conn_request_evt(hdev, skb);
980 case HCI_EV_CONN_COMPLETE:
981 hci_conn_complete_evt(hdev, skb);
984 case HCI_EV_DISCONN_COMPLETE:
985 hci_disconn_complete_evt(hdev, skb);
988 case HCI_EV_ROLE_CHANGE:
989 hci_role_change_evt(hdev, skb);
992 case HCI_EV_AUTH_COMPLETE:
993 hci_auth_complete_evt(hdev, skb);
996 case HCI_EV_ENCRYPT_CHANGE:
997 hci_encrypt_change_evt(hdev, skb);
1000 case HCI_EV_CHANGE_CONN_LINK_KEY_COMPLETE:
1001 hci_change_conn_link_key_complete_evt(hdev, skb);
1004 case HCI_EV_PIN_CODE_REQ:
1005 hci_pin_code_request_evt(hdev, skb);
1008 case HCI_EV_LINK_KEY_REQ:
1009 hci_link_key_request_evt(hdev, skb);
1012 case HCI_EV_LINK_KEY_NOTIFY:
1013 hci_link_key_notify_evt(hdev, skb);
1016 case HCI_EV_CLOCK_OFFSET:
1017 hci_clock_offset_evt(hdev, skb);
1020 case HCI_EV_PSCAN_REP_MODE:
1021 hci_pscan_rep_mode_evt(hdev, skb);
1024 case HCI_EV_CMD_STATUS:
1025 cs = (struct hci_ev_cmd_status *) skb->data;
1026 skb_pull(skb, sizeof(cs));
1028 opcode = __le16_to_cpu(cs->opcode);
1029 ogf = hci_opcode_ogf(opcode);
1030 ocf = hci_opcode_ocf(opcode);
1033 case OGF_INFO_PARAM:
1034 hci_cs_info_param(hdev, ocf, cs->status);
1038 hci_cs_host_ctl(hdev, ocf, cs->status);
1042 hci_cs_link_ctl(hdev, ocf, cs->status);
1045 case OGF_LINK_POLICY:
1046 hci_cs_link_policy(hdev, ocf, cs->status);
1050 BT_DBG("%s Command Status OGF %x", hdev->name, ogf);
1055 atomic_set(&hdev->cmd_cnt, 1);
1056 if (!skb_queue_empty(&hdev->cmd_q))
1057 hci_sched_cmd(hdev);
1061 case HCI_EV_CMD_COMPLETE:
1062 ec = (struct hci_ev_cmd_complete *) skb->data;
1063 skb_pull(skb, sizeof(*ec));
1065 opcode = __le16_to_cpu(ec->opcode);
1066 ogf = hci_opcode_ogf(opcode);
1067 ocf = hci_opcode_ocf(opcode);
1070 case OGF_INFO_PARAM:
1071 hci_cc_info_param(hdev, ocf, skb);
1075 hci_cc_host_ctl(hdev, ocf, skb);
1079 hci_cc_link_ctl(hdev, ocf, skb);
1082 case OGF_LINK_POLICY:
1083 hci_cc_link_policy(hdev, ocf, skb);
1087 BT_DBG("%s Command Completed OGF %x", hdev->name, ogf);
1092 atomic_set(&hdev->cmd_cnt, 1);
1093 if (!skb_queue_empty(&hdev->cmd_q))
1094 hci_sched_cmd(hdev);
1100 hdev->stat.evt_rx++;
1103 /* Generate internal stack event */
1104 void hci_si_event(struct hci_dev *hdev, int type, int dlen, void *data)
1106 struct hci_event_hdr *hdr;
1107 struct hci_ev_stack_internal *ev;
1108 struct sk_buff *skb;
1110 skb = bt_skb_alloc(HCI_EVENT_HDR_SIZE + sizeof(*ev) + dlen, GFP_ATOMIC);
1114 hdr = (void *) skb_put(skb, HCI_EVENT_HDR_SIZE);
1115 hdr->evt = HCI_EV_STACK_INTERNAL;
1116 hdr->plen = sizeof(*ev) + dlen;
1118 ev = (void *) skb_put(skb, sizeof(*ev) + dlen);
1120 memcpy(ev->data, data, dlen);
1122 bt_cb(skb)->incoming = 1;
1123 __net_timestamp(skb);
1125 bt_cb(skb)->pkt_type = HCI_EVENT_PKT;
1126 skb->dev = (void *) hdev;
1127 hci_send_to_sock(hdev, skb);