]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - include/net/bluetooth/hci_core.h
Bluetooth: Add __hci_cmd_sync_ev function
[mirror_ubuntu-bionic-kernel.git] / include / net / bluetooth / hci_core.h
CommitLineData
04fafe4e 1/*
1da177e4 2 BlueZ - Bluetooth protocol stack for Linux
2d0a0346 3 Copyright (c) 2000-2001, 2010, Code Aurora Forum. All rights reserved.
1da177e4
LT
4
5 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
6
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;
10
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
04fafe4e
RS
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
1da177e4
LT
18 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
04fafe4e
RS
20 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
1da177e4
LT
22 SOFTWARE IS DISCLAIMED.
23*/
24
25#ifndef __HCI_CORE_H
26#define __HCI_CORE_H
27
1da177e4
LT
28#include <net/bluetooth/hci.h>
29
5e59b791
LAD
30/* HCI priority */
31#define HCI_PRIO_MAX 7
32
1da177e4 33/* HCI Core structures */
1da177e4
LT
34struct inquiry_data {
35 bdaddr_t bdaddr;
36 __u8 pscan_rep_mode;
37 __u8 pscan_period_mode;
38 __u8 pscan_mode;
39 __u8 dev_class[3];
1ebb9252 40 __le16 clock_offset;
1da177e4 41 __s8 rssi;
41a96212 42 __u8 ssp_mode;
1da177e4
LT
43};
44
45struct inquiry_entry {
561aafbc
JH
46 struct list_head all; /* inq_cache.all */
47 struct list_head list; /* unknown or resolve */
48 enum {
49 NAME_NOT_KNOWN,
50 NAME_NEEDED,
51 NAME_PENDING,
52 NAME_KNOWN,
53 } name_state;
1da177e4
LT
54 __u32 timestamp;
55 struct inquiry_data data;
56};
57
30883512 58struct discovery_state {
f64b993f 59 int type;
ff9ef578
JH
60 enum {
61 DISCOVERY_STOPPED,
62 DISCOVERY_STARTING,
343f935b 63 DISCOVERY_FINDING,
30dc78e1 64 DISCOVERY_RESOLVING,
ff9ef578
JH
65 DISCOVERY_STOPPING,
66 } state;
c3c7ea65 67 struct list_head all; /* All devices found during inquiry */
f64b993f
GP
68 struct list_head unknown; /* Name state not known */
69 struct list_head resolve; /* Name needs to be resolved */
70 __u32 timestamp;
1da177e4
LT
71};
72
73struct hci_conn_hash {
74 struct list_head list;
1da177e4 75 unsigned int acl_num;
bd1eb66b 76 unsigned int amp_num;
1da177e4 77 unsigned int sco_num;
fcd89c09 78 unsigned int le_num;
1da177e4
LT
79};
80
f0358568
JH
81struct bdaddr_list {
82 struct list_head list;
83 bdaddr_t bdaddr;
84};
2aeb9a1a
JH
85
86struct bt_uuid {
87 struct list_head list;
88 u8 uuid[16];
83be8eca 89 u8 size;
1aff6f09 90 u8 svc_hint;
2aeb9a1a
JH
91};
92
b899efaf
VCG
93struct smp_ltk {
94 struct list_head list;
95 bdaddr_t bdaddr;
96 u8 bdaddr_type;
97 u8 authenticated;
98 u8 type;
99 u8 enc_size;
100 __le16 ediv;
101 u8 rand[8];
102 u8 val[16];
103} __packed;
104
55ed8ca1
JH
105struct link_key {
106 struct list_head list;
107 bdaddr_t bdaddr;
108 u8 type;
9b3b4460 109 u8 val[HCI_LINK_KEY_SIZE];
55ed8ca1
JH
110 u8 pin_len;
111};
112
2763eda6
SJ
113struct oob_data {
114 struct list_head list;
115 bdaddr_t bdaddr;
116 u8 hash[16];
117 u8 randomizer[16];
118};
119
7ba8b4be
AG
120struct le_scan_params {
121 u8 type;
122 u16 interval;
123 u16 window;
28b75a89 124 int timeout;
7ba8b4be
AG
125};
126
490c5bab
JH
127#define HCI_MAX_SHORT_NAME_LENGTH 10
128
903e4541
AE
129struct amp_assoc {
130 __u16 len;
131 __u16 offset;
93c284ee
AE
132 __u16 rem_len;
133 __u16 len_so_far;
903e4541
AE
134 __u8 data[HCI_MAX_AMP_ASSOC_SIZE];
135};
136
cd4c5391 137#define NUM_REASSEMBLY 4
1da177e4
LT
138struct hci_dev {
139 struct list_head list;
09fd0de5 140 struct mutex lock;
1da177e4
LT
141
142 char name[8];
143 unsigned long flags;
144 __u16 id;
c13854ce 145 __u8 bus;
943da25d 146 __u8 dev_type;
1da177e4 147 bdaddr_t bdaddr;
1f6c6378 148 __u8 dev_name[HCI_MAX_NAME_LENGTH];
490c5bab 149 __u8 short_name[HCI_MAX_SHORT_NAME_LENGTH];
80a1e1db 150 __u8 eir[HCI_MAX_EIR_LENGTH];
a9de9248 151 __u8 dev_class[3];
1aff6f09
JH
152 __u8 major_class;
153 __u8 minor_class;
1da177e4 154 __u8 features[8];
59e29406 155 __u8 host_features[8];
60e77321 156 __u8 le_features[8];
cf1d081f 157 __u8 le_white_list_size;
9b008c04 158 __u8 le_states[8];
a9de9248 159 __u8 commands[64];
1143e5a6
MH
160 __u8 hci_ver;
161 __u16 hci_rev;
d5859e22 162 __u8 lmp_ver;
1143e5a6 163 __u16 manufacturer;
7d69230c 164 __u16 lmp_subver;
1da177e4 165 __u16 voice_setting;
17fa4b9d 166 __u8 io_capability;
91c4e9b1 167 __s8 inq_tx_power;
f332ec66
JH
168 __u16 page_scan_interval;
169 __u16 page_scan_window;
170 __u8 page_scan_type;
171
2b9be137
MH
172 __u16 devid_source;
173 __u16 devid_vendor;
174 __u16 devid_product;
175 __u16 devid_version;
1da177e4
LT
176
177 __u16 pkt_type;
5b7f9909 178 __u16 esco_type;
1da177e4
LT
179 __u16 link_policy;
180 __u16 link_mode;
181
04837f64
MH
182 __u32 idle_timeout;
183 __u16 sniff_min_interval;
184 __u16 sniff_max_interval;
185
928abaa7
AE
186 __u8 amp_status;
187 __u32 amp_total_bw;
188 __u32 amp_max_bw;
189 __u32 amp_min_latency;
190 __u32 amp_max_pdu;
191 __u8 amp_type;
192 __u16 amp_pal_cap;
193 __u16 amp_assoc_size;
194 __u32 amp_max_flush_to;
195 __u32 amp_be_flush_to;
196
903e4541
AE
197 struct amp_assoc loc_assoc;
198
1e89cffb
AE
199 __u8 flow_ctl_mode;
200
9f61656a
JH
201 unsigned int auto_accept_delay;
202
1da177e4
LT
203 unsigned long quirks;
204
205 atomic_t cmd_cnt;
206 unsigned int acl_cnt;
207 unsigned int sco_cnt;
6ed58ec5 208 unsigned int le_cnt;
1da177e4
LT
209
210 unsigned int acl_mtu;
211 unsigned int sco_mtu;
6ed58ec5 212 unsigned int le_mtu;
1da177e4
LT
213 unsigned int acl_pkts;
214 unsigned int sco_pkts;
6ed58ec5 215 unsigned int le_pkts;
1da177e4 216
350ee4cf
AE
217 __u16 block_len;
218 __u16 block_mtu;
219 __u16 num_blocks;
220 __u16 block_cnt;
221
1da177e4
LT
222 unsigned long acl_last_tx;
223 unsigned long sco_last_tx;
6ed58ec5 224 unsigned long le_last_tx;
1da177e4 225
f48fd9c8 226 struct workqueue_struct *workqueue;
6ead1bbc 227 struct workqueue_struct *req_workqueue;
f48fd9c8 228
ab81cbf9 229 struct work_struct power_on;
3243553f 230 struct delayed_work power_off;
ab81cbf9 231
16ab91ab
JH
232 __u16 discov_timeout;
233 struct delayed_work discov_off;
234
7d78525d
JH
235 struct delayed_work service_cache;
236
6bd32326 237 struct timer_list cmd_timer;
b78752cc
MH
238
239 struct work_struct rx_work;
c347b765 240 struct work_struct cmd_work;
3eff45ea 241 struct work_struct tx_work;
1da177e4
LT
242
243 struct sk_buff_head rx_q;
244 struct sk_buff_head raw_q;
245 struct sk_buff_head cmd_q;
246
b6ddb638 247 struct sk_buff *recv_evt;
1da177e4 248 struct sk_buff *sent_cmd;
cd4c5391 249 struct sk_buff *reassembly[NUM_REASSEMBLY];
1da177e4 250
a6a67efd 251 struct mutex req_lock;
1da177e4
LT
252 wait_queue_head_t req_wait_q;
253 __u32 req_status;
254 __u32 req_result;
a5040efa 255
2e58ef3e
JH
256 struct list_head mgmt_pending;
257
30883512 258 struct discovery_state discovery;
1da177e4 259 struct hci_conn_hash conn_hash;
ea4bd8ba 260 struct list_head blacklist;
1da177e4 261
2aeb9a1a
JH
262 struct list_head uuids;
263
55ed8ca1
JH
264 struct list_head link_keys;
265
b899efaf
VCG
266 struct list_head long_term_keys;
267
2763eda6
SJ
268 struct list_head remote_oob_data;
269
1da177e4
LT
270 struct hci_dev_stats stat;
271
272 struct sk_buff_head driver_init;
273
70f23020 274 atomic_t promisc;
1da177e4 275
ca325f69
MH
276 struct dentry *debugfs;
277
a91f2e39 278 struct device dev;
1da177e4 279
611b30f7
MH
280 struct rfkill *rfkill;
281
d23264a8
AG
282 unsigned long dev_flags;
283
7ba8b4be
AG
284 struct delayed_work le_scan_disable;
285
28b75a89
AG
286 struct work_struct le_scan;
287 struct le_scan_params le_scan_params;
288
8fa19098 289 __s8 adv_tx_power;
3f0f524b
JH
290 __u8 adv_data[HCI_MAX_AD_LENGTH];
291 __u8 adv_data_len;
8fa19098 292
1da177e4
LT
293 int (*open)(struct hci_dev *hdev);
294 int (*close)(struct hci_dev *hdev);
295 int (*flush)(struct hci_dev *hdev);
296 int (*send)(struct sk_buff *skb);
1da177e4
LT
297 void (*notify)(struct hci_dev *hdev, unsigned int evt);
298 int (*ioctl)(struct hci_dev *hdev, unsigned int cmd, unsigned long arg);
299};
300
53502d69
AE
301#define HCI_PHY_HANDLE(handle) (handle & 0xff)
302
1da177e4
LT
303struct hci_conn {
304 struct list_head list;
305
adc4266d 306 atomic_t refcnt;
adc4266d
SJ
307
308 bdaddr_t dst;
5a9d0a3f 309 __u8 dst_type;
adc4266d
SJ
310 __u16 handle;
311 __u16 state;
312 __u8 mode;
313 __u8 type;
a0c808b3 314 bool out;
adc4266d
SJ
315 __u8 attempt;
316 __u8 dev_class[3];
317 __u8 features[8];
adc4266d
SJ
318 __u16 interval;
319 __u16 pkt_type;
320 __u16 link_policy;
321 __u32 link_mode;
13d39315 322 __u8 key_type;
adc4266d
SJ
323 __u8 auth_type;
324 __u8 sec_level;
325 __u8 pending_sec_level;
326 __u8 pin_length;
726b4ffc 327 __u8 enc_key_size;
adc4266d 328 __u8 io_capability;
92a25256
JH
329 __u32 passkey_notify;
330 __u8 passkey_entered;
adc4266d 331 __u16 disc_timeout;
51a8efd7 332 unsigned long flags;
04837f64 333
03b555e1 334 __u8 remote_cap;
03b555e1 335 __u8 remote_auth;
3161ae1c 336 __u8 remote_id;
6ec5bcad 337 bool flush_key;
03b555e1 338
adc4266d 339 unsigned int sent;
04837f64 340
1da177e4 341 struct sk_buff_head data_q;
2c33c06a 342 struct list_head chan_list;
1da177e4 343
19c40e3b 344 struct delayed_work disc_work;
04837f64 345 struct timer_list idle_timer;
9f61656a 346 struct timer_list auto_accept_timer;
04837f64 347
b219e3ac 348 struct device dev;
9eba32b8 349 atomic_t devref;
b219e3ac 350
1da177e4
LT
351 struct hci_dev *hdev;
352 void *l2cap_data;
353 void *sco_data;
2b64d153 354 void *smp_conn;
9740e49d 355 struct amp_mgr *amp_mgr;
1da177e4
LT
356
357 struct hci_conn *link;
e9a416b5
JH
358
359 void (*connect_cfm_cb) (struct hci_conn *conn, u8 status);
360 void (*security_cfm_cb) (struct hci_conn *conn, u8 status);
361 void (*disconn_cfm_cb) (struct hci_conn *conn, u8 reason);
1da177e4
LT
362};
363
73d80deb
LAD
364struct hci_chan {
365 struct list_head list;
42c4e53e 366 __u16 handle;
73d80deb
LAD
367 struct hci_conn *conn;
368 struct sk_buff_head data_q;
369 unsigned int sent;
168df8e5 370 __u8 state;
73d80deb
LAD
371};
372
1da177e4
LT
373extern struct list_head hci_dev_list;
374extern struct list_head hci_cb_list;
375extern rwlock_t hci_dev_list_lock;
376extern rwlock_t hci_cb_list_lock;
377
686ebf28
UF
378/* ----- HCI interface to upper protocols ----- */
379extern int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr);
9e664631 380extern void l2cap_connect_cfm(struct hci_conn *hcon, u8 status);
686ebf28 381extern int l2cap_disconn_ind(struct hci_conn *hcon);
9e664631 382extern void l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason);
686ebf28 383extern int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt);
c3c7ea65
GP
384extern int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb,
385 u16 flags);
686ebf28 386
20714bfe 387extern int sco_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags);
9e664631
AE
388extern void sco_connect_cfm(struct hci_conn *hcon, __u8 status);
389extern void sco_disconn_cfm(struct hci_conn *hcon, __u8 reason);
686ebf28
UF
390extern int sco_recv_scodata(struct hci_conn *hcon, struct sk_buff *skb);
391
1da177e4 392/* ----- Inquiry cache ----- */
70f23020
AE
393#define INQUIRY_CACHE_AGE_MAX (HZ*30) /* 30 seconds */
394#define INQUIRY_ENTRY_AGE_MAX (HZ*60) /* 60 seconds */
1da177e4 395
30883512 396static inline void discovery_init(struct hci_dev *hdev)
1da177e4 397{
ff9ef578 398 hdev->discovery.state = DISCOVERY_STOPPED;
30883512
JH
399 INIT_LIST_HEAD(&hdev->discovery.all);
400 INIT_LIST_HEAD(&hdev->discovery.unknown);
401 INIT_LIST_HEAD(&hdev->discovery.resolve);
1da177e4
LT
402}
403
30dc78e1
JH
404bool hci_discovery_active(struct hci_dev *hdev);
405
ff9ef578
JH
406void hci_discovery_set_state(struct hci_dev *hdev, int state);
407
1da177e4
LT
408static inline int inquiry_cache_empty(struct hci_dev *hdev)
409{
30883512 410 return list_empty(&hdev->discovery.all);
1da177e4
LT
411}
412
413static inline long inquiry_cache_age(struct hci_dev *hdev)
414{
30883512 415 struct discovery_state *c = &hdev->discovery;
1da177e4
LT
416 return jiffies - c->timestamp;
417}
418
419static inline long inquiry_entry_age(struct inquiry_entry *e)
420{
421 return jiffies - e->timestamp;
422}
423
5a9d0a3f 424struct inquiry_entry *hci_inquiry_cache_lookup(struct hci_dev *hdev,
04124681 425 bdaddr_t *bdaddr);
561aafbc 426struct inquiry_entry *hci_inquiry_cache_lookup_unknown(struct hci_dev *hdev,
04124681 427 bdaddr_t *bdaddr);
30dc78e1 428struct inquiry_entry *hci_inquiry_cache_lookup_resolve(struct hci_dev *hdev,
04124681
GP
429 bdaddr_t *bdaddr,
430 int state);
a3d4e20a 431void hci_inquiry_cache_update_resolve(struct hci_dev *hdev,
04124681 432 struct inquiry_entry *ie);
3175405b 433bool hci_inquiry_cache_update(struct hci_dev *hdev, struct inquiry_data *data,
04124681 434 bool name_known, bool *ssp);
1da177e4
LT
435
436/* ----- HCI Connections ----- */
437enum {
438 HCI_CONN_AUTH_PEND,
19f8def0 439 HCI_CONN_REAUTH_PEND,
1da177e4 440 HCI_CONN_ENCRYPT_PEND,
04837f64
MH
441 HCI_CONN_RSWITCH_PEND,
442 HCI_CONN_MODE_CHANGE_PEND,
e73439d8 443 HCI_CONN_SCO_SETUP_PEND,
d26a2345 444 HCI_CONN_LE_SMP_PEND,
b644ba33 445 HCI_CONN_MGMT_CONNECTED,
58a681ef
JH
446 HCI_CONN_SSP_ENABLED,
447 HCI_CONN_POWER_SAVE,
448 HCI_CONN_REMOTE_OOB,
1da177e4
LT
449};
450
aa64a8b5
JH
451static inline bool hci_conn_ssp_enabled(struct hci_conn *conn)
452{
453 struct hci_dev *hdev = conn->hdev;
c3c7ea65
GP
454 return test_bit(HCI_SSP_ENABLED, &hdev->dev_flags) &&
455 test_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
aa64a8b5
JH
456}
457
1da177e4
LT
458static inline void hci_conn_hash_add(struct hci_dev *hdev, struct hci_conn *c)
459{
460 struct hci_conn_hash *h = &hdev->conn_hash;
bf4c6325 461 list_add_rcu(&c->list, &h->list);
fcd89c09
VT
462 switch (c->type) {
463 case ACL_LINK:
1da177e4 464 h->acl_num++;
fcd89c09 465 break;
bd1eb66b
AE
466 case AMP_LINK:
467 h->amp_num++;
468 break;
fcd89c09
VT
469 case LE_LINK:
470 h->le_num++;
471 break;
472 case SCO_LINK:
473 case ESCO_LINK:
1da177e4 474 h->sco_num++;
fcd89c09
VT
475 break;
476 }
1da177e4
LT
477}
478
479static inline void hci_conn_hash_del(struct hci_dev *hdev, struct hci_conn *c)
480{
481 struct hci_conn_hash *h = &hdev->conn_hash;
bf4c6325
GP
482
483 list_del_rcu(&c->list);
484 synchronize_rcu();
485
fcd89c09
VT
486 switch (c->type) {
487 case ACL_LINK:
1da177e4 488 h->acl_num--;
fcd89c09 489 break;
bd1eb66b
AE
490 case AMP_LINK:
491 h->amp_num--;
492 break;
fcd89c09
VT
493 case LE_LINK:
494 h->le_num--;
495 break;
496 case SCO_LINK:
497 case ESCO_LINK:
1da177e4 498 h->sco_num--;
fcd89c09
VT
499 break;
500 }
1da177e4
LT
501}
502
52087a79
LAD
503static inline unsigned int hci_conn_num(struct hci_dev *hdev, __u8 type)
504{
505 struct hci_conn_hash *h = &hdev->conn_hash;
506 switch (type) {
507 case ACL_LINK:
508 return h->acl_num;
bd1eb66b
AE
509 case AMP_LINK:
510 return h->amp_num;
52087a79
LAD
511 case LE_LINK:
512 return h->le_num;
513 case SCO_LINK:
514 case ESCO_LINK:
515 return h->sco_num;
516 default:
517 return 0;
518 }
519}
520
1da177e4 521static inline struct hci_conn *hci_conn_hash_lookup_handle(struct hci_dev *hdev,
adc4266d 522 __u16 handle)
1da177e4
LT
523{
524 struct hci_conn_hash *h = &hdev->conn_hash;
1da177e4
LT
525 struct hci_conn *c;
526
bf4c6325
GP
527 rcu_read_lock();
528
529 list_for_each_entry_rcu(c, &h->list, list) {
530 if (c->handle == handle) {
531 rcu_read_unlock();
1da177e4 532 return c;
bf4c6325 533 }
1da177e4 534 }
bf4c6325
GP
535 rcu_read_unlock();
536
1da177e4
LT
537 return NULL;
538}
539
540static inline struct hci_conn *hci_conn_hash_lookup_ba(struct hci_dev *hdev,
adc4266d 541 __u8 type, bdaddr_t *ba)
1da177e4
LT
542{
543 struct hci_conn_hash *h = &hdev->conn_hash;
1da177e4
LT
544 struct hci_conn *c;
545
bf4c6325
GP
546 rcu_read_lock();
547
548 list_for_each_entry_rcu(c, &h->list, list) {
549 if (c->type == type && !bacmp(&c->dst, ba)) {
550 rcu_read_unlock();
1da177e4 551 return c;
bf4c6325 552 }
1da177e4 553 }
bf4c6325
GP
554
555 rcu_read_unlock();
556
1da177e4
LT
557 return NULL;
558}
559
4c67bc74 560static inline struct hci_conn *hci_conn_hash_lookup_state(struct hci_dev *hdev,
adc4266d 561 __u8 type, __u16 state)
4c67bc74
MH
562{
563 struct hci_conn_hash *h = &hdev->conn_hash;
4c67bc74
MH
564 struct hci_conn *c;
565
bf4c6325
GP
566 rcu_read_lock();
567
568 list_for_each_entry_rcu(c, &h->list, list) {
569 if (c->type == type && c->state == state) {
570 rcu_read_unlock();
4c67bc74 571 return c;
bf4c6325 572 }
4c67bc74 573 }
73d80deb 574
bf4c6325 575 rcu_read_unlock();
73d80deb 576
4c67bc74 577 return NULL;
73d80deb
LAD
578}
579
bed71748 580void hci_disconnect(struct hci_conn *conn, __u8 reason);
b6a0dc82 581void hci_setup_sync(struct hci_conn *conn, __u16 handle);
e73439d8 582void hci_sco_setup(struct hci_conn *conn, __u8 status);
1da177e4
LT
583
584struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst);
a9de9248
MH
585int hci_conn_del(struct hci_conn *conn);
586void hci_conn_hash_flush(struct hci_dev *hdev);
587void hci_conn_check_pending(struct hci_dev *hdev);
20714bfe 588void hci_conn_accept(struct hci_conn *conn, int mask);
1da177e4 589
73d80deb 590struct hci_chan *hci_chan_create(struct hci_conn *conn);
9472007c 591void hci_chan_del(struct hci_chan *chan);
2c33c06a 592void hci_chan_list_flush(struct hci_conn *conn);
42c4e53e 593struct hci_chan *hci_chan_lookup_handle(struct hci_dev *hdev, __u16 handle);
73d80deb 594
5a9d0a3f 595struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst,
b12f62cf 596 __u8 dst_type, __u8 sec_level, __u8 auth_type);
e7c29cb1 597int hci_conn_check_link_mode(struct hci_conn *conn);
b3b1b061 598int hci_conn_check_secure(struct hci_conn *conn, __u8 sec_level);
0684e5f9 599int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type);
1da177e4 600int hci_conn_change_link_key(struct hci_conn *conn);
8c1b2355 601int hci_conn_switch_role(struct hci_conn *conn, __u8 role);
1da177e4 602
14b12d0b 603void hci_conn_enter_active_mode(struct hci_conn *conn, __u8 force_active);
1da177e4 604
9eba32b8
MH
605void hci_conn_hold_device(struct hci_conn *conn);
606void hci_conn_put_device(struct hci_conn *conn);
607
1da177e4
LT
608static inline void hci_conn_hold(struct hci_conn *conn)
609{
71becf0c 610 BT_DBG("hcon %p orig refcnt %d", conn, atomic_read(&conn->refcnt));
38b3fef1 611
1da177e4 612 atomic_inc(&conn->refcnt);
2f304d1e 613 cancel_delayed_work(&conn->disc_work);
1da177e4
LT
614}
615
616static inline void hci_conn_put(struct hci_conn *conn)
617{
71becf0c 618 BT_DBG("hcon %p orig refcnt %d", conn, atomic_read(&conn->refcnt));
38b3fef1 619
1da177e4 620 if (atomic_dec_and_test(&conn->refcnt)) {
04837f64 621 unsigned long timeo;
716e4ab5
AE
622
623 switch (conn->type) {
624 case ACL_LINK:
625 case LE_LINK:
04837f64 626 del_timer(&conn->idle_timer);
6ac59344 627 if (conn->state == BT_CONNECTED) {
5f246e89 628 timeo = conn->disc_timeout;
6ac59344 629 if (!conn->out)
052b30b0 630 timeo *= 2;
5a9d0a3f 631 } else {
6ac59344 632 timeo = msecs_to_jiffies(10);
5a9d0a3f 633 }
716e4ab5
AE
634 break;
635
636 case AMP_LINK:
637 timeo = conn->disc_timeout;
638 break;
639
640 default:
04837f64 641 timeo = msecs_to_jiffies(10);
716e4ab5 642 break;
5a9d0a3f 643 }
716e4ab5 644
2f304d1e 645 cancel_delayed_work(&conn->disc_work);
19c40e3b 646 queue_delayed_work(conn->hdev->workqueue,
716e4ab5 647 &conn->disc_work, timeo);
1da177e4
LT
648 }
649}
650
1da177e4 651/* ----- HCI Devices ----- */
dc946bd8 652static inline void hci_dev_put(struct hci_dev *d)
1da177e4 653{
376261ae
AE
654 BT_DBG("%s orig refcnt %d", d->name,
655 atomic_read(&d->dev.kobj.kref.refcount));
656
4c724c71 657 put_device(&d->dev);
1da177e4
LT
658}
659
dc946bd8 660static inline struct hci_dev *hci_dev_hold(struct hci_dev *d)
1da177e4 661{
376261ae
AE
662 BT_DBG("%s orig refcnt %d", d->name,
663 atomic_read(&d->dev.kobj.kref.refcount));
664
4c724c71 665 get_device(&d->dev);
1da177e4
LT
666 return d;
667}
668
09fd0de5
GP
669#define hci_dev_lock(d) mutex_lock(&d->lock)
670#define hci_dev_unlock(d) mutex_unlock(&d->lock)
1da177e4 671
aa2b86d7 672#define to_hci_dev(d) container_of(d, struct hci_dev, dev)
3dc07322 673#define to_hci_conn(c) container_of(c, struct hci_conn, dev)
aa2b86d7 674
155961e8
DH
675static inline void *hci_get_drvdata(struct hci_dev *hdev)
676{
677 return dev_get_drvdata(&hdev->dev);
678}
679
680static inline void hci_set_drvdata(struct hci_dev *hdev, void *data)
681{
682 dev_set_drvdata(&hdev->dev, data);
683}
684
8598d064
AE
685/* hci_dev_list shall be locked */
686static inline uint8_t __hci_num_ctrl(void)
687{
688 uint8_t count = 0;
689 struct list_head *p;
690
691 list_for_each(p, &hci_dev_list) {
692 count++;
693 }
694
695 return count;
696}
697
1da177e4 698struct hci_dev *hci_dev_get(int index);
0c0afedf 699struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src);
1da177e4
LT
700
701struct hci_dev *hci_alloc_dev(void);
702void hci_free_dev(struct hci_dev *hdev);
703int hci_register_dev(struct hci_dev *hdev);
59735631 704void hci_unregister_dev(struct hci_dev *hdev);
1da177e4
LT
705int hci_suspend_dev(struct hci_dev *hdev);
706int hci_resume_dev(struct hci_dev *hdev);
707int hci_dev_open(__u16 dev);
708int hci_dev_close(__u16 dev);
709int hci_dev_reset(__u16 dev);
710int hci_dev_reset_stat(__u16 dev);
711int hci_dev_cmd(unsigned int cmd, void __user *arg);
712int hci_get_dev_list(void __user *arg);
713int hci_get_dev_info(void __user *arg);
714int hci_get_conn_list(void __user *arg);
715int hci_get_conn_info(struct hci_dev *hdev, void __user *arg);
40be492f 716int hci_get_auth_info(struct hci_dev *hdev, void __user *arg);
1da177e4
LT
717int hci_inquiry(void __user *arg);
718
c3c7ea65
GP
719struct bdaddr_list *hci_blacklist_lookup(struct hci_dev *hdev,
720 bdaddr_t *bdaddr);
f0358568 721int hci_blacklist_clear(struct hci_dev *hdev);
88c1fe4b
JH
722int hci_blacklist_add(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type);
723int hci_blacklist_del(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type);
f0358568 724
2aeb9a1a
JH
725int hci_uuids_clear(struct hci_dev *hdev);
726
55ed8ca1
JH
727int hci_link_keys_clear(struct hci_dev *hdev);
728struct link_key *hci_find_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr);
d25e28ab 729int hci_add_link_key(struct hci_dev *hdev, struct hci_conn *conn, int new_key,
04124681 730 bdaddr_t *bdaddr, u8 *val, u8 type, u8 pin_len);
c9839a11
VCG
731struct smp_ltk *hci_find_ltk(struct hci_dev *hdev, __le16 ediv, u8 rand[8]);
732int hci_add_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 addr_type, u8 type,
9a006657
AE
733 int new_key, u8 authenticated, u8 tk[16], u8 enc_size,
734 __le16 ediv, u8 rand[8]);
c9839a11 735struct smp_ltk *hci_find_ltk_by_addr(struct hci_dev *hdev, bdaddr_t *bdaddr,
04124681 736 u8 addr_type);
b899efaf 737int hci_remove_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr);
b899efaf 738int hci_smp_ltks_clear(struct hci_dev *hdev);
55ed8ca1
JH
739int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr);
740
2763eda6
SJ
741int hci_remote_oob_data_clear(struct hci_dev *hdev);
742struct oob_data *hci_find_remote_oob_data(struct hci_dev *hdev,
743 bdaddr_t *bdaddr);
744int hci_add_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 *hash,
745 u8 *randomizer);
746int hci_remove_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr);
747
1da177e4
LT
748void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb);
749
76bca880 750int hci_recv_frame(struct sk_buff *skb);
ef222013 751int hci_recv_fragment(struct hci_dev *hdev, int type, void *data, int count);
99811510 752int hci_recv_stream_fragment(struct hci_dev *hdev, void *data, int count);
ef222013 753
0ac7e700 754void hci_init_sysfs(struct hci_dev *hdev);
ce242970
DH
755int hci_add_sysfs(struct hci_dev *hdev);
756void hci_del_sysfs(struct hci_dev *hdev);
a67e899c 757void hci_conn_init_sysfs(struct hci_conn *conn);
b219e3ac
MH
758void hci_conn_add_sysfs(struct hci_conn *conn);
759void hci_conn_del_sysfs(struct hci_conn *conn);
1da177e4 760
6935e0f5 761#define SET_HCIDEV_DEV(hdev, pdev) ((hdev)->dev.parent = (pdev))
1da177e4
LT
762
763/* ----- LMP capabilities ----- */
04837f64 764#define lmp_encrypt_capable(dev) ((dev)->features[0] & LMP_ENCRYPT)
761f09e4
JH
765#define lmp_rswitch_capable(dev) ((dev)->features[0] & LMP_RSWITCH)
766#define lmp_hold_capable(dev) ((dev)->features[0] & LMP_HOLD)
04837f64 767#define lmp_sniff_capable(dev) ((dev)->features[0] & LMP_SNIFF)
761f09e4
JH
768#define lmp_park_capable(dev) ((dev)->features[1] & LMP_PARK)
769#define lmp_inq_rssi_capable(dev) ((dev)->features[3] & LMP_RSSI_INQ)
5b7f9909 770#define lmp_esco_capable(dev) ((dev)->features[3] & LMP_ESCO)
761f09e4
JH
771#define lmp_bredr_capable(dev) (!((dev)->features[4] & LMP_NO_BREDR))
772#define lmp_le_capable(dev) ((dev)->features[4] & LMP_LE)
773#define lmp_sniffsubr_capable(dev) ((dev)->features[5] & LMP_SNIFF_SUBR)
774#define lmp_pause_enc_capable(dev) ((dev)->features[5] & LMP_PAUSE_ENC)
775#define lmp_ext_inq_capable(dev) ((dev)->features[6] & LMP_EXT_INQ)
ffa88e02 776#define lmp_le_br_capable(dev) !!((dev)->features[6] & LMP_SIMUL_LE_BR)
769be974 777#define lmp_ssp_capable(dev) ((dev)->features[6] & LMP_SIMPLE_PAIR)
e702112f 778#define lmp_no_flush_capable(dev) ((dev)->features[6] & LMP_NO_FLUSH)
761f09e4
JH
779#define lmp_lsto_capable(dev) ((dev)->features[7] & LMP_LSTO)
780#define lmp_inq_tx_pwr_capable(dev) ((dev)->features[7] & LMP_INQ_TX_PWR)
781#define lmp_ext_feat_capable(dev) ((dev)->features[7] & LMP_EXTFEATURES)
1da177e4 782
eead27da 783/* ----- Extended LMP capabilities ----- */
6b4b73ee 784#define lmp_host_ssp_capable(dev) ((dev)->host_features[0] & LMP_HOST_SSP)
ffa88e02
GP
785#define lmp_host_le_capable(dev) !!((dev)->host_features[0] & LMP_HOST_LE)
786#define lmp_host_le_br_capable(dev) !!((dev)->host_features[0] & LMP_HOST_LE_BREDR)
eead27da 787
5d05416e
AE
788/* returns true if at least one AMP active */
789static inline bool hci_amp_capable(void)
790{
791 struct hci_dev *hdev;
792 bool ret = false;
793
794 read_lock(&hci_dev_list_lock);
795 list_for_each_entry(hdev, &hci_dev_list, list)
796 if (hdev->amp_type == HCI_AMP &&
797 test_bit(HCI_UP, &hdev->flags))
798 ret = true;
799 read_unlock(&hci_dev_list_lock);
800
801 return ret;
802}
803
1da177e4 804/* ----- HCI protocols ----- */
20714bfe
FD
805#define HCI_PROTO_DEFER 0x01
806
5a9d0a3f 807static inline int hci_proto_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr,
20714bfe 808 __u8 type, __u8 *flags)
1da177e4 809{
686ebf28
UF
810 switch (type) {
811 case ACL_LINK:
812 return l2cap_connect_ind(hdev, bdaddr);
1da177e4 813
686ebf28
UF
814 case SCO_LINK:
815 case ESCO_LINK:
20714bfe 816 return sco_connect_ind(hdev, bdaddr, flags);
1da177e4 817
686ebf28
UF
818 default:
819 BT_ERR("unknown link type %d", type);
820 return -EINVAL;
821 }
1da177e4
LT
822}
823
824static inline void hci_proto_connect_cfm(struct hci_conn *conn, __u8 status)
825{
686ebf28
UF
826 switch (conn->type) {
827 case ACL_LINK:
828 case LE_LINK:
829 l2cap_connect_cfm(conn, status);
830 break;
1da177e4 831
686ebf28
UF
832 case SCO_LINK:
833 case ESCO_LINK:
834 sco_connect_cfm(conn, status);
835 break;
1da177e4 836
686ebf28
UF
837 default:
838 BT_ERR("unknown link type %d", conn->type);
839 break;
840 }
e9a416b5
JH
841
842 if (conn->connect_cfm_cb)
843 conn->connect_cfm_cb(conn, status);
1da177e4
LT
844}
845
2950f21a 846static inline int hci_proto_disconn_ind(struct hci_conn *conn)
1da177e4 847{
686ebf28
UF
848 if (conn->type != ACL_LINK && conn->type != LE_LINK)
849 return HCI_ERROR_REMOTE_USER_TERM;
1da177e4 850
686ebf28 851 return l2cap_disconn_ind(conn);
2950f21a
MH
852}
853
854static inline void hci_proto_disconn_cfm(struct hci_conn *conn, __u8 reason)
855{
686ebf28
UF
856 switch (conn->type) {
857 case ACL_LINK:
858 case LE_LINK:
859 l2cap_disconn_cfm(conn, reason);
860 break;
2950f21a 861
686ebf28
UF
862 case SCO_LINK:
863 case ESCO_LINK:
864 sco_disconn_cfm(conn, reason);
865 break;
2950f21a 866
bd1eb66b
AE
867 /* L2CAP would be handled for BREDR chan */
868 case AMP_LINK:
869 break;
870
686ebf28
UF
871 default:
872 BT_ERR("unknown link type %d", conn->type);
873 break;
874 }
e9a416b5
JH
875
876 if (conn->disconn_cfm_cb)
877 conn->disconn_cfm_cb(conn, reason);
1da177e4
LT
878}
879
880static inline void hci_proto_auth_cfm(struct hci_conn *conn, __u8 status)
881{
8c1b2355
MH
882 __u8 encrypt;
883
686ebf28
UF
884 if (conn->type != ACL_LINK && conn->type != LE_LINK)
885 return;
886
51a8efd7 887 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags))
8c1b2355
MH
888 return;
889
890 encrypt = (conn->link_mode & HCI_LM_ENCRYPT) ? 0x01 : 0x00;
686ebf28 891 l2cap_security_cfm(conn, status, encrypt);
e9a416b5
JH
892
893 if (conn->security_cfm_cb)
894 conn->security_cfm_cb(conn, status);
1da177e4
LT
895}
896
5a9d0a3f
WR
897static inline void hci_proto_encrypt_cfm(struct hci_conn *conn, __u8 status,
898 __u8 encrypt)
1da177e4 899{
686ebf28
UF
900 if (conn->type != ACL_LINK && conn->type != LE_LINK)
901 return;
1da177e4 902
686ebf28 903 l2cap_security_cfm(conn, status, encrypt);
e9a416b5
JH
904
905 if (conn->security_cfm_cb)
906 conn->security_cfm_cb(conn, status);
1da177e4
LT
907}
908
1da177e4
LT
909/* ----- HCI callbacks ----- */
910struct hci_cb {
911 struct list_head list;
912
913 char *name;
914
5a9d0a3f
WR
915 void (*security_cfm) (struct hci_conn *conn, __u8 status,
916 __u8 encrypt);
1da177e4
LT
917 void (*key_change_cfm) (struct hci_conn *conn, __u8 status);
918 void (*role_switch_cfm) (struct hci_conn *conn, __u8 status, __u8 role);
919};
920
921static inline void hci_auth_cfm(struct hci_conn *conn, __u8 status)
922{
711584ea 923 struct hci_cb *cb;
8c1b2355 924 __u8 encrypt;
1da177e4
LT
925
926 hci_proto_auth_cfm(conn, status);
927
51a8efd7 928 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags))
8c1b2355
MH
929 return;
930
931 encrypt = (conn->link_mode & HCI_LM_ENCRYPT) ? 0x01 : 0x00;
932
f20d09d5 933 read_lock(&hci_cb_list_lock);
711584ea 934 list_for_each_entry(cb, &hci_cb_list, list) {
8c1b2355
MH
935 if (cb->security_cfm)
936 cb->security_cfm(conn, status, encrypt);
1da177e4 937 }
f20d09d5 938 read_unlock(&hci_cb_list_lock);
1da177e4
LT
939}
940
5a9d0a3f
WR
941static inline void hci_encrypt_cfm(struct hci_conn *conn, __u8 status,
942 __u8 encrypt)
1da177e4 943{
711584ea 944 struct hci_cb *cb;
1da177e4 945
435fef20
MH
946 if (conn->sec_level == BT_SECURITY_SDP)
947 conn->sec_level = BT_SECURITY_LOW;
948
88167aed
VCG
949 if (conn->pending_sec_level > conn->sec_level)
950 conn->sec_level = conn->pending_sec_level;
951
9719f8af 952 hci_proto_encrypt_cfm(conn, status, encrypt);
1da177e4 953
f20d09d5 954 read_lock(&hci_cb_list_lock);
711584ea 955 list_for_each_entry(cb, &hci_cb_list, list) {
8c1b2355
MH
956 if (cb->security_cfm)
957 cb->security_cfm(conn, status, encrypt);
1da177e4 958 }
f20d09d5 959 read_unlock(&hci_cb_list_lock);
1da177e4
LT
960}
961
962static inline void hci_key_change_cfm(struct hci_conn *conn, __u8 status)
963{
711584ea 964 struct hci_cb *cb;
1da177e4 965
f20d09d5 966 read_lock(&hci_cb_list_lock);
711584ea 967 list_for_each_entry(cb, &hci_cb_list, list) {
1da177e4
LT
968 if (cb->key_change_cfm)
969 cb->key_change_cfm(conn, status);
970 }
f20d09d5 971 read_unlock(&hci_cb_list_lock);
1da177e4
LT
972}
973
5a9d0a3f
WR
974static inline void hci_role_switch_cfm(struct hci_conn *conn, __u8 status,
975 __u8 role)
1da177e4 976{
711584ea 977 struct hci_cb *cb;
1da177e4 978
f20d09d5 979 read_lock(&hci_cb_list_lock);
711584ea 980 list_for_each_entry(cb, &hci_cb_list, list) {
1da177e4
LT
981 if (cb->role_switch_cfm)
982 cb->role_switch_cfm(conn, status, role);
983 }
f20d09d5 984 read_unlock(&hci_cb_list_lock);
1da177e4
LT
985}
986
6759a675
JH
987static inline bool eir_has_data_type(u8 *data, size_t data_len, u8 type)
988{
84d9d071 989 size_t parsed = 0;
6759a675 990
6c0c331e
JH
991 if (data_len < 2)
992 return false;
993
84d9d071
JH
994 while (parsed < data_len - 1) {
995 u8 field_len = data[0];
6759a675
JH
996
997 if (field_len == 0)
998 break;
999
1000 parsed += field_len + 1;
1001
1002 if (parsed > data_len)
1003 break;
1004
1005 if (data[1] == type)
1006 return true;
1007
1008 data += field_len + 1;
1009 }
1010
1011 return false;
1012}
1013
9d939d94
VA
1014static inline size_t eir_get_length(u8 *eir, size_t eir_len)
1015{
1016 size_t parsed = 0;
1017
1018 while (parsed < eir_len) {
1019 u8 field_len = eir[0];
1020
1021 if (field_len == 0)
1022 return parsed;
1023
1024 parsed += field_len + 1;
1025 eir += field_len + 1;
1026 }
1027
1028 return eir_len;
1029}
1030
1dc06093 1031static inline u16 eir_append_data(u8 *eir, u16 eir_len, u8 type, u8 *data,
04124681 1032 u8 data_len)
1dc06093
JH
1033{
1034 eir[eir_len++] = sizeof(type) + data_len;
1035 eir[eir_len++] = type;
1036 memcpy(&eir[eir_len], data, data_len);
1037 eir_len += data_len;
1038
1039 return eir_len;
1040}
1041
1da177e4
LT
1042int hci_register_cb(struct hci_cb *hcb);
1043int hci_unregister_cb(struct hci_cb *hcb);
1044
3119ae95
JH
1045struct hci_request {
1046 struct hci_dev *hdev;
1047 struct sk_buff_head cmd_q;
5d73e034
AG
1048
1049 /* If something goes wrong when building the HCI request, the error
1050 * value is stored in this field.
1051 */
1052 int err;
3119ae95
JH
1053};
1054
1055void hci_req_init(struct hci_request *req, struct hci_dev *hdev);
1056int hci_req_run(struct hci_request *req, hci_req_complete_t complete);
e348fe6b 1057void hci_req_add(struct hci_request *req, u16 opcode, u32 plen, void *param);
02350a72
JH
1058void hci_req_add_ev(struct hci_request *req, u16 opcode, u32 plen, void *param,
1059 u8 event);
9238f36a 1060void hci_req_cmd_complete(struct hci_dev *hdev, u16 opcode, u8 status);
3119ae95 1061
75e84b7c
JH
1062struct sk_buff *__hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen,
1063 void *param, u32 timeout);
7b1abbbe
JH
1064struct sk_buff *__hci_cmd_sync_ev(struct hci_dev *hdev, u16 opcode, u32 plen,
1065 void *param, u8 event, u32 timeout);
75e84b7c 1066
a9de9248 1067int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen, void *param);
73d80deb 1068void hci_send_acl(struct hci_chan *chan, struct sk_buff *skb, __u16 flags);
0d861d8b 1069void hci_send_sco(struct hci_conn *conn, struct sk_buff *skb);
1da177e4 1070
a9de9248 1071void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 opcode);
1da177e4 1072
1da177e4 1073/* ----- HCI Sockets ----- */
470fe1b5
MH
1074void hci_send_to_sock(struct hci_dev *hdev, struct sk_buff *skb);
1075void hci_send_to_control(struct sk_buff *skb, struct sock *skip_sk);
cd82e61c 1076void hci_send_to_monitor(struct hci_dev *hdev, struct sk_buff *skb);
1da177e4 1077
040030ef
MH
1078void hci_sock_dev_event(struct hci_dev *hdev, int event);
1079
0381101f 1080/* Management interface */
591f47f3
AG
1081#define DISCOV_TYPE_BREDR (BIT(BDADDR_BREDR))
1082#define DISCOV_TYPE_LE (BIT(BDADDR_LE_PUBLIC) | \
1083 BIT(BDADDR_LE_RANDOM))
1084#define DISCOV_TYPE_INTERLEAVED (BIT(BDADDR_BREDR) | \
1085 BIT(BDADDR_LE_PUBLIC) | \
1086 BIT(BDADDR_LE_RANDOM))
f39799f5 1087
0381101f 1088int mgmt_control(struct sock *sk, struct msghdr *msg, size_t len);
744cf19e
JH
1089int mgmt_index_added(struct hci_dev *hdev);
1090int mgmt_index_removed(struct hci_dev *hdev);
1091int mgmt_powered(struct hci_dev *hdev, u8 powered);
1092int mgmt_discoverable(struct hci_dev *hdev, u8 discoverable);
1093int mgmt_connectable(struct hci_dev *hdev, u8 connectable);
1094int mgmt_write_scan_failed(struct hci_dev *hdev, u8 scan, u8 status);
1095int mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key,
745c0ce3 1096 bool persistent);
afc747a6 1097int mgmt_device_connected(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
04124681
GP
1098 u8 addr_type, u32 flags, u8 *name, u8 name_len,
1099 u8 *dev_class);
afc747a6 1100int mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr,
f0d6a0ea 1101 u8 link_type, u8 addr_type, u8 reason);
88c3df13 1102int mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr,
04124681 1103 u8 link_type, u8 addr_type, u8 status);
48264f06 1104int mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
04124681 1105 u8 addr_type, u8 status);
744cf19e
JH
1106int mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure);
1107int mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
04124681 1108 u8 status);
744cf19e 1109int mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
04124681 1110 u8 status);
744cf19e 1111int mgmt_user_confirm_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
04124681
GP
1112 u8 link_type, u8 addr_type, __le32 value,
1113 u8 confirm_hint);
744cf19e 1114int mgmt_user_confirm_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
04124681 1115 u8 link_type, u8 addr_type, u8 status);
272d90df 1116int mgmt_user_confirm_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
04124681 1117 u8 link_type, u8 addr_type, u8 status);
272d90df 1118int mgmt_user_passkey_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
04124681 1119 u8 link_type, u8 addr_type);
604086b7 1120int mgmt_user_passkey_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
04124681 1121 u8 link_type, u8 addr_type, u8 status);
272d90df 1122int mgmt_user_passkey_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
04124681 1123 u8 link_type, u8 addr_type, u8 status);
92a25256
JH
1124int mgmt_user_passkey_notify(struct hci_dev *hdev, bdaddr_t *bdaddr,
1125 u8 link_type, u8 addr_type, u32 passkey,
1126 u8 entered);
bab73cb6 1127int mgmt_auth_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
04124681 1128 u8 addr_type, u8 status);
33ef95ed 1129int mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status);
c0ecddc2 1130int mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status);
7f9a903c 1131int mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class,
04124681 1132 u8 status);
744cf19e
JH
1133int mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status);
1134int mgmt_read_local_oob_data_reply_complete(struct hci_dev *hdev, u8 *hash,
04124681 1135 u8 *randomizer, u8 status);
06199cf8 1136int mgmt_le_enable_complete(struct hci_dev *hdev, u8 enable, u8 status);
48264f06 1137int mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
04124681
GP
1138 u8 addr_type, u8 *dev_class, s8 rssi, u8 cfm_name,
1139 u8 ssp, u8 *eir, u16 eir_len);
b644ba33 1140int mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
04124681 1141 u8 addr_type, s8 rssi, u8 *name, u8 name_len);
7a135109 1142int mgmt_start_discovery_failed(struct hci_dev *hdev, u8 status);
e6d465cb 1143int mgmt_stop_discovery_failed(struct hci_dev *hdev, u8 status);
744cf19e 1144int mgmt_discovering(struct hci_dev *hdev, u8 discovering);
5e0452c0 1145int mgmt_interleaved_discovery(struct hci_dev *hdev);
88c1fe4b
JH
1146int mgmt_device_blocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type);
1147int mgmt_device_unblocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type);
bb4b2a9a 1148bool mgmt_valid_hdev(struct hci_dev *hdev);
346af67b
VCG
1149int mgmt_new_ltk(struct hci_dev *hdev, struct smp_ltk *key, u8 persistent);
1150
1da177e4
LT
1151/* HCI info for socket */
1152#define hci_pi(sk) ((struct hci_pinfo *) sk)
1153
1154struct hci_pinfo {
1155 struct bt_sock bt;
1156 struct hci_dev *hdev;
1157 struct hci_filter filter;
1158 __u32 cmsg_mask;
c02178d2 1159 unsigned short channel;
1da177e4
LT
1160};
1161
1162/* HCI security filter */
1163#define HCI_SFLT_MAX_OGF 5
1164
1165struct hci_sec_filter {
1166 __u32 type_mask;
1167 __u32 event_mask[2];
1168 __u32 ocf_mask[HCI_SFLT_MAX_OGF + 1][4];
1169};
1170
1171/* ----- HCI requests ----- */
1172#define HCI_REQ_DONE 0
1173#define HCI_REQ_PEND 1
1174#define HCI_REQ_CANCELED 2
1175
a6a67efd
TG
1176#define hci_req_lock(d) mutex_lock(&d->req_lock)
1177#define hci_req_unlock(d) mutex_unlock(&d->req_lock)
1da177e4 1178
04b4edcb
JH
1179void hci_update_ad(struct hci_request *req);
1180
2ce603eb
CT
1181void hci_le_conn_update(struct hci_conn *conn, u16 min, u16 max,
1182 u16 latency, u16 to_multiplier);
a7a595f6
VCG
1183void hci_le_start_enc(struct hci_conn *conn, __le16 ediv, __u8 rand[8],
1184 __u8 ltk[16]);
2519a1fc 1185int hci_do_inquiry(struct hci_dev *hdev, u8 length);
023d5049 1186int hci_cancel_inquiry(struct hci_dev *hdev);
28b75a89 1187int hci_le_scan(struct hci_dev *hdev, u8 type, u16 interval, u16 window,
04124681 1188 int timeout);
7dbfac1d 1189int hci_cancel_le_scan(struct hci_dev *hdev);
2519a1fc 1190
31f7956c
AG
1191u8 bdaddr_to_le(u8 bdaddr_type);
1192
1da177e4 1193#endif /* __HCI_CORE_H */