]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - include/net/bluetooth/hci_core.h
Bluetooth: Convert auto accept timer to use delayed work
[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
490c5bab
JH
120#define HCI_MAX_SHORT_NAME_LENGTH 10
121
903e4541
AE
122struct amp_assoc {
123 __u16 len;
124 __u16 offset;
93c284ee
AE
125 __u16 rem_len;
126 __u16 len_so_far;
903e4541
AE
127 __u8 data[HCI_MAX_AMP_ASSOC_SIZE];
128};
129
d2c5d77f 130#define HCI_MAX_PAGES 3
cad718ed 131
cd4c5391 132#define NUM_REASSEMBLY 4
1da177e4
LT
133struct hci_dev {
134 struct list_head list;
09fd0de5 135 struct mutex lock;
1da177e4
LT
136
137 char name[8];
138 unsigned long flags;
139 __u16 id;
c13854ce 140 __u8 bus;
943da25d 141 __u8 dev_type;
1da177e4 142 bdaddr_t bdaddr;
d13eafce 143 bdaddr_t static_addr;
1f6c6378 144 __u8 dev_name[HCI_MAX_NAME_LENGTH];
490c5bab 145 __u8 short_name[HCI_MAX_SHORT_NAME_LENGTH];
80a1e1db 146 __u8 eir[HCI_MAX_EIR_LENGTH];
a9de9248 147 __u8 dev_class[3];
1aff6f09
JH
148 __u8 major_class;
149 __u8 minor_class;
d2c5d77f 150 __u8 max_page;
cad718ed 151 __u8 features[HCI_MAX_PAGES][8];
60e77321 152 __u8 le_features[8];
cf1d081f 153 __u8 le_white_list_size;
9b008c04 154 __u8 le_states[8];
a9de9248 155 __u8 commands[64];
1143e5a6
MH
156 __u8 hci_ver;
157 __u16 hci_rev;
d5859e22 158 __u8 lmp_ver;
1143e5a6 159 __u16 manufacturer;
7d69230c 160 __u16 lmp_subver;
1da177e4 161 __u16 voice_setting;
b4cb9fb2 162 __u8 num_iac;
17fa4b9d 163 __u8 io_capability;
91c4e9b1 164 __s8 inq_tx_power;
f332ec66
JH
165 __u16 page_scan_interval;
166 __u16 page_scan_window;
167 __u8 page_scan_type;
bef64738
MH
168 __u16 le_scan_interval;
169 __u16 le_scan_window;
f332ec66 170
2b9be137
MH
171 __u16 devid_source;
172 __u16 devid_vendor;
173 __u16 devid_product;
174 __u16 devid_version;
1da177e4
LT
175
176 __u16 pkt_type;
5b7f9909 177 __u16 esco_type;
1da177e4
LT
178 __u16 link_policy;
179 __u16 link_mode;
180
04837f64
MH
181 __u32 idle_timeout;
182 __u16 sniff_min_interval;
183 __u16 sniff_max_interval;
184
928abaa7
AE
185 __u8 amp_status;
186 __u32 amp_total_bw;
187 __u32 amp_max_bw;
188 __u32 amp_min_latency;
189 __u32 amp_max_pdu;
190 __u8 amp_type;
191 __u16 amp_pal_cap;
192 __u16 amp_assoc_size;
193 __u32 amp_max_flush_to;
194 __u32 amp_be_flush_to;
195
903e4541
AE
196 struct amp_assoc loc_assoc;
197
1e89cffb
AE
198 __u8 flow_ctl_mode;
199
9f61656a
JH
200 unsigned int auto_accept_delay;
201
1da177e4
LT
202 unsigned long quirks;
203
204 atomic_t cmd_cnt;
205 unsigned int acl_cnt;
206 unsigned int sco_cnt;
6ed58ec5 207 unsigned int le_cnt;
1da177e4
LT
208
209 unsigned int acl_mtu;
210 unsigned int sco_mtu;
6ed58ec5 211 unsigned int le_mtu;
1da177e4
LT
212 unsigned int acl_pkts;
213 unsigned int sco_pkts;
6ed58ec5 214 unsigned int le_pkts;
1da177e4 215
350ee4cf
AE
216 __u16 block_len;
217 __u16 block_mtu;
218 __u16 num_blocks;
219 __u16 block_cnt;
220
1da177e4
LT
221 unsigned long acl_last_tx;
222 unsigned long sco_last_tx;
6ed58ec5 223 unsigned long le_last_tx;
1da177e4 224
f48fd9c8 225 struct workqueue_struct *workqueue;
6ead1bbc 226 struct workqueue_struct *req_workqueue;
f48fd9c8 227
ab81cbf9 228 struct work_struct power_on;
3243553f 229 struct delayed_work power_off;
ab81cbf9 230
16ab91ab
JH
231 __u16 discov_timeout;
232 struct delayed_work discov_off;
233
7d78525d
JH
234 struct delayed_work service_cache;
235
6bd32326 236 struct timer_list cmd_timer;
b78752cc
MH
237
238 struct work_struct rx_work;
c347b765 239 struct work_struct cmd_work;
3eff45ea 240 struct work_struct tx_work;
1da177e4
LT
241
242 struct sk_buff_head rx_q;
243 struct sk_buff_head raw_q;
244 struct sk_buff_head cmd_q;
245
b6ddb638 246 struct sk_buff *recv_evt;
1da177e4 247 struct sk_buff *sent_cmd;
cd4c5391 248 struct sk_buff *reassembly[NUM_REASSEMBLY];
1da177e4 249
a6a67efd 250 struct mutex req_lock;
1da177e4
LT
251 wait_queue_head_t req_wait_q;
252 __u32 req_status;
253 __u32 req_result;
a5040efa 254
2e58ef3e
JH
255 struct list_head mgmt_pending;
256
30883512 257 struct discovery_state discovery;
1da177e4 258 struct hci_conn_hash conn_hash;
ea4bd8ba 259 struct list_head blacklist;
1da177e4 260
2aeb9a1a
JH
261 struct list_head uuids;
262
55ed8ca1
JH
263 struct list_head link_keys;
264
b899efaf
VCG
265 struct list_head long_term_keys;
266
2763eda6
SJ
267 struct list_head remote_oob_data;
268
1da177e4
LT
269 struct hci_dev_stats stat;
270
70f23020 271 atomic_t promisc;
1da177e4 272
ca325f69
MH
273 struct dentry *debugfs;
274
a91f2e39 275 struct device dev;
1da177e4 276
611b30f7
MH
277 struct rfkill *rfkill;
278
d23264a8
AG
279 unsigned long dev_flags;
280
7ba8b4be
AG
281 struct delayed_work le_scan_disable;
282
8fa19098 283 __s8 adv_tx_power;
3f0f524b
JH
284 __u8 adv_data[HCI_MAX_AD_LENGTH];
285 __u8 adv_data_len;
f8e808bd
MH
286 __u8 scan_rsp_data[HCI_MAX_AD_LENGTH];
287 __u8 scan_rsp_data_len;
8fa19098 288
1da177e4
LT
289 int (*open)(struct hci_dev *hdev);
290 int (*close)(struct hci_dev *hdev);
291 int (*flush)(struct hci_dev *hdev);
f41c70c4 292 int (*setup)(struct hci_dev *hdev);
7bd8f09f 293 int (*send)(struct hci_dev *hdev, struct sk_buff *skb);
1da177e4 294 void (*notify)(struct hci_dev *hdev, unsigned int evt);
1da177e4
LT
295};
296
53502d69
AE
297#define HCI_PHY_HANDLE(handle) (handle & 0xff)
298
1da177e4
LT
299struct hci_conn {
300 struct list_head list;
301
adc4266d 302 atomic_t refcnt;
adc4266d
SJ
303
304 bdaddr_t dst;
5a9d0a3f 305 __u8 dst_type;
662e8820 306 bdaddr_t src;
e7c4096e 307 __u8 src_type;
adc4266d
SJ
308 __u16 handle;
309 __u16 state;
310 __u8 mode;
311 __u8 type;
a0c808b3 312 bool out;
adc4266d
SJ
313 __u8 attempt;
314 __u8 dev_class[3];
cad718ed 315 __u8 features[HCI_MAX_PAGES][8];
adc4266d
SJ
316 __u16 interval;
317 __u16 pkt_type;
318 __u16 link_policy;
319 __u32 link_mode;
13d39315 320 __u8 key_type;
adc4266d
SJ
321 __u8 auth_type;
322 __u8 sec_level;
323 __u8 pending_sec_level;
324 __u8 pin_length;
726b4ffc 325 __u8 enc_key_size;
adc4266d 326 __u8 io_capability;
92a25256
JH
327 __u32 passkey_notify;
328 __u8 passkey_entered;
adc4266d 329 __u16 disc_timeout;
10c62ddc 330 __u16 setting;
51a8efd7 331 unsigned long flags;
04837f64 332
03b555e1 333 __u8 remote_cap;
03b555e1 334 __u8 remote_auth;
3161ae1c 335 __u8 remote_id;
6ec5bcad 336 bool flush_key;
03b555e1 337
adc4266d 338 unsigned int sent;
04837f64 339
1da177e4 340 struct sk_buff_head data_q;
2c33c06a 341 struct list_head chan_list;
1da177e4 342
19c40e3b 343 struct delayed_work disc_work;
7bc18d9d 344 struct delayed_work auto_accept_work;
04837f64
MH
345 struct timer_list idle_timer;
346
b219e3ac
MH
347 struct device dev;
348
1da177e4
LT
349 struct hci_dev *hdev;
350 void *l2cap_data;
351 void *sco_data;
2b64d153 352 void *smp_conn;
9740e49d 353 struct amp_mgr *amp_mgr;
1da177e4
LT
354
355 struct hci_conn *link;
e9a416b5
JH
356
357 void (*connect_cfm_cb) (struct hci_conn *conn, u8 status);
358 void (*security_cfm_cb) (struct hci_conn *conn, u8 status);
359 void (*disconn_cfm_cb) (struct hci_conn *conn, u8 reason);
1da177e4
LT
360};
361
73d80deb
LAD
362struct hci_chan {
363 struct list_head list;
42c4e53e 364 __u16 handle;
73d80deb
LAD
365 struct hci_conn *conn;
366 struct sk_buff_head data_q;
367 unsigned int sent;
168df8e5 368 __u8 state;
73d80deb
LAD
369};
370
1da177e4
LT
371extern struct list_head hci_dev_list;
372extern struct list_head hci_cb_list;
373extern rwlock_t hci_dev_list_lock;
374extern rwlock_t hci_cb_list_lock;
375
686ebf28
UF
376/* ----- HCI interface to upper protocols ----- */
377extern int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr);
9e664631 378extern void l2cap_connect_cfm(struct hci_conn *hcon, u8 status);
686ebf28 379extern int l2cap_disconn_ind(struct hci_conn *hcon);
9e664631 380extern void l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason);
686ebf28 381extern int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt);
c3c7ea65
GP
382extern int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb,
383 u16 flags);
686ebf28 384
20714bfe 385extern int sco_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags);
9e664631
AE
386extern void sco_connect_cfm(struct hci_conn *hcon, __u8 status);
387extern void sco_disconn_cfm(struct hci_conn *hcon, __u8 reason);
686ebf28
UF
388extern int sco_recv_scodata(struct hci_conn *hcon, struct sk_buff *skb);
389
1da177e4 390/* ----- Inquiry cache ----- */
70f23020
AE
391#define INQUIRY_CACHE_AGE_MAX (HZ*30) /* 30 seconds */
392#define INQUIRY_ENTRY_AGE_MAX (HZ*60) /* 60 seconds */
1da177e4 393
30883512 394static inline void discovery_init(struct hci_dev *hdev)
1da177e4 395{
ff9ef578 396 hdev->discovery.state = DISCOVERY_STOPPED;
30883512
JH
397 INIT_LIST_HEAD(&hdev->discovery.all);
398 INIT_LIST_HEAD(&hdev->discovery.unknown);
399 INIT_LIST_HEAD(&hdev->discovery.resolve);
1da177e4
LT
400}
401
30dc78e1
JH
402bool hci_discovery_active(struct hci_dev *hdev);
403
ff9ef578
JH
404void hci_discovery_set_state(struct hci_dev *hdev, int state);
405
1da177e4
LT
406static inline int inquiry_cache_empty(struct hci_dev *hdev)
407{
30883512 408 return list_empty(&hdev->discovery.all);
1da177e4
LT
409}
410
411static inline long inquiry_cache_age(struct hci_dev *hdev)
412{
30883512 413 struct discovery_state *c = &hdev->discovery;
1da177e4
LT
414 return jiffies - c->timestamp;
415}
416
417static inline long inquiry_entry_age(struct inquiry_entry *e)
418{
419 return jiffies - e->timestamp;
420}
421
5a9d0a3f 422struct inquiry_entry *hci_inquiry_cache_lookup(struct hci_dev *hdev,
04124681 423 bdaddr_t *bdaddr);
561aafbc 424struct inquiry_entry *hci_inquiry_cache_lookup_unknown(struct hci_dev *hdev,
04124681 425 bdaddr_t *bdaddr);
30dc78e1 426struct inquiry_entry *hci_inquiry_cache_lookup_resolve(struct hci_dev *hdev,
04124681
GP
427 bdaddr_t *bdaddr,
428 int state);
a3d4e20a 429void hci_inquiry_cache_update_resolve(struct hci_dev *hdev,
04124681 430 struct inquiry_entry *ie);
3175405b 431bool hci_inquiry_cache_update(struct hci_dev *hdev, struct inquiry_data *data,
04124681 432 bool name_known, bool *ssp);
1f9b9a5d 433void hci_inquiry_cache_flush(struct hci_dev *hdev);
1da177e4
LT
434
435/* ----- HCI Connections ----- */
436enum {
437 HCI_CONN_AUTH_PEND,
19f8def0 438 HCI_CONN_REAUTH_PEND,
1da177e4 439 HCI_CONN_ENCRYPT_PEND,
04837f64
MH
440 HCI_CONN_RSWITCH_PEND,
441 HCI_CONN_MODE_CHANGE_PEND,
e73439d8 442 HCI_CONN_SCO_SETUP_PEND,
d26a2345 443 HCI_CONN_LE_SMP_PEND,
b644ba33 444 HCI_CONN_MGMT_CONNECTED,
58a681ef
JH
445 HCI_CONN_SSP_ENABLED,
446 HCI_CONN_POWER_SAVE,
447 HCI_CONN_REMOTE_OOB,
1da177e4
LT
448};
449
aa64a8b5
JH
450static inline bool hci_conn_ssp_enabled(struct hci_conn *conn)
451{
452 struct hci_dev *hdev = conn->hdev;
c3c7ea65
GP
453 return test_bit(HCI_SSP_ENABLED, &hdev->dev_flags) &&
454 test_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
aa64a8b5
JH
455}
456
1da177e4
LT
457static inline void hci_conn_hash_add(struct hci_dev *hdev, struct hci_conn *c)
458{
459 struct hci_conn_hash *h = &hdev->conn_hash;
bf4c6325 460 list_add_rcu(&c->list, &h->list);
fcd89c09
VT
461 switch (c->type) {
462 case ACL_LINK:
1da177e4 463 h->acl_num++;
fcd89c09 464 break;
bd1eb66b
AE
465 case AMP_LINK:
466 h->amp_num++;
467 break;
fcd89c09
VT
468 case LE_LINK:
469 h->le_num++;
470 break;
471 case SCO_LINK:
472 case ESCO_LINK:
1da177e4 473 h->sco_num++;
fcd89c09
VT
474 break;
475 }
1da177e4
LT
476}
477
478static inline void hci_conn_hash_del(struct hci_dev *hdev, struct hci_conn *c)
479{
480 struct hci_conn_hash *h = &hdev->conn_hash;
bf4c6325
GP
481
482 list_del_rcu(&c->list);
483 synchronize_rcu();
484
fcd89c09
VT
485 switch (c->type) {
486 case ACL_LINK:
1da177e4 487 h->acl_num--;
fcd89c09 488 break;
bd1eb66b
AE
489 case AMP_LINK:
490 h->amp_num--;
491 break;
fcd89c09
VT
492 case LE_LINK:
493 h->le_num--;
494 break;
495 case SCO_LINK:
496 case ESCO_LINK:
1da177e4 497 h->sco_num--;
fcd89c09
VT
498 break;
499 }
1da177e4
LT
500}
501
52087a79
LAD
502static inline unsigned int hci_conn_num(struct hci_dev *hdev, __u8 type)
503{
504 struct hci_conn_hash *h = &hdev->conn_hash;
505 switch (type) {
506 case ACL_LINK:
507 return h->acl_num;
bd1eb66b
AE
508 case AMP_LINK:
509 return h->amp_num;
52087a79
LAD
510 case LE_LINK:
511 return h->le_num;
512 case SCO_LINK:
513 case ESCO_LINK:
514 return h->sco_num;
515 default:
516 return 0;
517 }
518}
519
1da177e4 520static inline struct hci_conn *hci_conn_hash_lookup_handle(struct hci_dev *hdev,
adc4266d 521 __u16 handle)
1da177e4
LT
522{
523 struct hci_conn_hash *h = &hdev->conn_hash;
1da177e4
LT
524 struct hci_conn *c;
525
bf4c6325
GP
526 rcu_read_lock();
527
528 list_for_each_entry_rcu(c, &h->list, list) {
529 if (c->handle == handle) {
530 rcu_read_unlock();
1da177e4 531 return c;
bf4c6325 532 }
1da177e4 533 }
bf4c6325
GP
534 rcu_read_unlock();
535
1da177e4
LT
536 return NULL;
537}
538
539static inline struct hci_conn *hci_conn_hash_lookup_ba(struct hci_dev *hdev,
adc4266d 540 __u8 type, bdaddr_t *ba)
1da177e4
LT
541{
542 struct hci_conn_hash *h = &hdev->conn_hash;
1da177e4
LT
543 struct hci_conn *c;
544
bf4c6325
GP
545 rcu_read_lock();
546
547 list_for_each_entry_rcu(c, &h->list, list) {
548 if (c->type == type && !bacmp(&c->dst, ba)) {
549 rcu_read_unlock();
1da177e4 550 return c;
bf4c6325 551 }
1da177e4 552 }
bf4c6325
GP
553
554 rcu_read_unlock();
555
1da177e4
LT
556 return NULL;
557}
558
4c67bc74 559static inline struct hci_conn *hci_conn_hash_lookup_state(struct hci_dev *hdev,
adc4266d 560 __u8 type, __u16 state)
4c67bc74
MH
561{
562 struct hci_conn_hash *h = &hdev->conn_hash;
4c67bc74
MH
563 struct hci_conn *c;
564
bf4c6325
GP
565 rcu_read_lock();
566
567 list_for_each_entry_rcu(c, &h->list, list) {
568 if (c->type == type && c->state == state) {
569 rcu_read_unlock();
4c67bc74 570 return c;
bf4c6325 571 }
4c67bc74 572 }
73d80deb 573
bf4c6325 574 rcu_read_unlock();
73d80deb 575
4c67bc74 576 return NULL;
73d80deb
LAD
577}
578
bed71748 579void hci_disconnect(struct hci_conn *conn, __u8 reason);
2dea632f 580bool hci_setup_sync(struct hci_conn *conn, __u16 handle);
e73439d8 581void hci_sco_setup(struct hci_conn *conn, __u8 status);
1da177e4
LT
582
583struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst);
a9de9248
MH
584int hci_conn_del(struct hci_conn *conn);
585void hci_conn_hash_flush(struct hci_dev *hdev);
586void hci_conn_check_pending(struct hci_dev *hdev);
1da177e4 587
73d80deb 588struct hci_chan *hci_chan_create(struct hci_conn *conn);
9472007c 589void hci_chan_del(struct hci_chan *chan);
2c33c06a 590void hci_chan_list_flush(struct hci_conn *conn);
42c4e53e 591struct hci_chan *hci_chan_lookup_handle(struct hci_dev *hdev, __u16 handle);
73d80deb 592
5a9d0a3f 593struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst,
b12f62cf 594 __u8 dst_type, __u8 sec_level, __u8 auth_type);
10c62ddc
FD
595struct hci_conn *hci_connect_sco(struct hci_dev *hdev, int type, bdaddr_t *dst,
596 __u16 setting);
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
8d12356f
DH
605/*
606 * hci_conn_get() and hci_conn_put() are used to control the life-time of an
607 * "hci_conn" object. They do not guarantee that the hci_conn object is running,
608 * working or anything else. They just guarantee that the object is available
609 * and can be dereferenced. So you can use its locks, local variables and any
610 * other constant data.
611 * Before accessing runtime data, you _must_ lock the object and then check that
612 * it is still running. As soon as you release the locks, the connection might
613 * get dropped, though.
614 *
615 * On the other hand, hci_conn_hold() and hci_conn_drop() are used to control
616 * how long the underlying connection is held. So every channel that runs on the
617 * hci_conn object calls this to prevent the connection from disappearing. As
618 * long as you hold a device, you must also guarantee that you have a valid
619 * reference to the device via hci_conn_get() (or the initial reference from
620 * hci_conn_add()).
621 * The hold()/drop() ref-count is known to drop below 0 sometimes, which doesn't
622 * break because nobody cares for that. But this means, we cannot use
623 * _get()/_drop() in it, but require the caller to have a valid ref (FIXME).
624 */
625
626static inline void hci_conn_get(struct hci_conn *conn)
627{
628 get_device(&conn->dev);
629}
630
631static inline void hci_conn_put(struct hci_conn *conn)
632{
633 put_device(&conn->dev);
634}
635
1da177e4
LT
636static inline void hci_conn_hold(struct hci_conn *conn)
637{
71becf0c 638 BT_DBG("hcon %p orig refcnt %d", conn, atomic_read(&conn->refcnt));
38b3fef1 639
1da177e4 640 atomic_inc(&conn->refcnt);
2f304d1e 641 cancel_delayed_work(&conn->disc_work);
1da177e4
LT
642}
643
76a68ba0 644static inline void hci_conn_drop(struct hci_conn *conn)
1da177e4 645{
71becf0c 646 BT_DBG("hcon %p orig refcnt %d", conn, atomic_read(&conn->refcnt));
38b3fef1 647
1da177e4 648 if (atomic_dec_and_test(&conn->refcnt)) {
04837f64 649 unsigned long timeo;
716e4ab5
AE
650
651 switch (conn->type) {
652 case ACL_LINK:
653 case LE_LINK:
04837f64 654 del_timer(&conn->idle_timer);
6ac59344 655 if (conn->state == BT_CONNECTED) {
5f246e89 656 timeo = conn->disc_timeout;
6ac59344 657 if (!conn->out)
052b30b0 658 timeo *= 2;
5a9d0a3f 659 } else {
6ac59344 660 timeo = msecs_to_jiffies(10);
5a9d0a3f 661 }
716e4ab5
AE
662 break;
663
664 case AMP_LINK:
665 timeo = conn->disc_timeout;
666 break;
667
668 default:
04837f64 669 timeo = msecs_to_jiffies(10);
716e4ab5 670 break;
5a9d0a3f 671 }
716e4ab5 672
2f304d1e 673 cancel_delayed_work(&conn->disc_work);
19c40e3b 674 queue_delayed_work(conn->hdev->workqueue,
716e4ab5 675 &conn->disc_work, timeo);
1da177e4
LT
676 }
677}
678
1da177e4 679/* ----- HCI Devices ----- */
dc946bd8 680static inline void hci_dev_put(struct hci_dev *d)
1da177e4 681{
376261ae
AE
682 BT_DBG("%s orig refcnt %d", d->name,
683 atomic_read(&d->dev.kobj.kref.refcount));
684
4c724c71 685 put_device(&d->dev);
1da177e4
LT
686}
687
dc946bd8 688static inline struct hci_dev *hci_dev_hold(struct hci_dev *d)
1da177e4 689{
376261ae
AE
690 BT_DBG("%s orig refcnt %d", d->name,
691 atomic_read(&d->dev.kobj.kref.refcount));
692
4c724c71 693 get_device(&d->dev);
1da177e4
LT
694 return d;
695}
696
09fd0de5
GP
697#define hci_dev_lock(d) mutex_lock(&d->lock)
698#define hci_dev_unlock(d) mutex_unlock(&d->lock)
1da177e4 699
aa2b86d7 700#define to_hci_dev(d) container_of(d, struct hci_dev, dev)
3dc07322 701#define to_hci_conn(c) container_of(c, struct hci_conn, dev)
aa2b86d7 702
155961e8
DH
703static inline void *hci_get_drvdata(struct hci_dev *hdev)
704{
705 return dev_get_drvdata(&hdev->dev);
706}
707
708static inline void hci_set_drvdata(struct hci_dev *hdev, void *data)
709{
710 dev_set_drvdata(&hdev->dev, data);
711}
712
1da177e4 713struct hci_dev *hci_dev_get(int index);
0c0afedf 714struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src);
1da177e4
LT
715
716struct hci_dev *hci_alloc_dev(void);
717void hci_free_dev(struct hci_dev *hdev);
718int hci_register_dev(struct hci_dev *hdev);
59735631 719void hci_unregister_dev(struct hci_dev *hdev);
1da177e4
LT
720int hci_suspend_dev(struct hci_dev *hdev);
721int hci_resume_dev(struct hci_dev *hdev);
722int hci_dev_open(__u16 dev);
723int hci_dev_close(__u16 dev);
724int hci_dev_reset(__u16 dev);
725int hci_dev_reset_stat(__u16 dev);
726int hci_dev_cmd(unsigned int cmd, void __user *arg);
727int hci_get_dev_list(void __user *arg);
728int hci_get_dev_info(void __user *arg);
729int hci_get_conn_list(void __user *arg);
730int hci_get_conn_info(struct hci_dev *hdev, void __user *arg);
40be492f 731int hci_get_auth_info(struct hci_dev *hdev, void __user *arg);
1da177e4
LT
732int hci_inquiry(void __user *arg);
733
c3c7ea65
GP
734struct bdaddr_list *hci_blacklist_lookup(struct hci_dev *hdev,
735 bdaddr_t *bdaddr);
f0358568 736int hci_blacklist_clear(struct hci_dev *hdev);
88c1fe4b
JH
737int hci_blacklist_add(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type);
738int hci_blacklist_del(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type);
f0358568 739
2aeb9a1a
JH
740int hci_uuids_clear(struct hci_dev *hdev);
741
55ed8ca1
JH
742int hci_link_keys_clear(struct hci_dev *hdev);
743struct link_key *hci_find_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr);
d25e28ab 744int hci_add_link_key(struct hci_dev *hdev, struct hci_conn *conn, int new_key,
04124681 745 bdaddr_t *bdaddr, u8 *val, u8 type, u8 pin_len);
c9839a11
VCG
746struct smp_ltk *hci_find_ltk(struct hci_dev *hdev, __le16 ediv, u8 rand[8]);
747int hci_add_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 addr_type, u8 type,
9a006657
AE
748 int new_key, u8 authenticated, u8 tk[16], u8 enc_size,
749 __le16 ediv, u8 rand[8]);
c9839a11 750struct smp_ltk *hci_find_ltk_by_addr(struct hci_dev *hdev, bdaddr_t *bdaddr,
04124681 751 u8 addr_type);
b899efaf 752int hci_remove_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr);
b899efaf 753int hci_smp_ltks_clear(struct hci_dev *hdev);
55ed8ca1
JH
754int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr);
755
2763eda6
SJ
756int hci_remote_oob_data_clear(struct hci_dev *hdev);
757struct oob_data *hci_find_remote_oob_data(struct hci_dev *hdev,
758 bdaddr_t *bdaddr);
759int hci_add_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 *hash,
760 u8 *randomizer);
761int hci_remove_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr);
762
1da177e4
LT
763void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb);
764
e1a26170 765int hci_recv_frame(struct hci_dev *hdev, struct sk_buff *skb);
ef222013 766int hci_recv_fragment(struct hci_dev *hdev, int type, void *data, int count);
99811510 767int hci_recv_stream_fragment(struct hci_dev *hdev, void *data, int count);
ef222013 768
0ac7e700 769void hci_init_sysfs(struct hci_dev *hdev);
ce242970
DH
770int hci_add_sysfs(struct hci_dev *hdev);
771void hci_del_sysfs(struct hci_dev *hdev);
a67e899c 772void hci_conn_init_sysfs(struct hci_conn *conn);
b219e3ac
MH
773void hci_conn_add_sysfs(struct hci_conn *conn);
774void hci_conn_del_sysfs(struct hci_conn *conn);
1da177e4 775
6935e0f5 776#define SET_HCIDEV_DEV(hdev, pdev) ((hdev)->dev.parent = (pdev))
1da177e4
LT
777
778/* ----- LMP capabilities ----- */
cad718ed
JH
779#define lmp_encrypt_capable(dev) ((dev)->features[0][0] & LMP_ENCRYPT)
780#define lmp_rswitch_capable(dev) ((dev)->features[0][0] & LMP_RSWITCH)
781#define lmp_hold_capable(dev) ((dev)->features[0][0] & LMP_HOLD)
782#define lmp_sniff_capable(dev) ((dev)->features[0][0] & LMP_SNIFF)
783#define lmp_park_capable(dev) ((dev)->features[0][1] & LMP_PARK)
784#define lmp_inq_rssi_capable(dev) ((dev)->features[0][3] & LMP_RSSI_INQ)
785#define lmp_esco_capable(dev) ((dev)->features[0][3] & LMP_ESCO)
786#define lmp_bredr_capable(dev) (!((dev)->features[0][4] & LMP_NO_BREDR))
787#define lmp_le_capable(dev) ((dev)->features[0][4] & LMP_LE)
788#define lmp_sniffsubr_capable(dev) ((dev)->features[0][5] & LMP_SNIFF_SUBR)
789#define lmp_pause_enc_capable(dev) ((dev)->features[0][5] & LMP_PAUSE_ENC)
790#define lmp_ext_inq_capable(dev) ((dev)->features[0][6] & LMP_EXT_INQ)
791#define lmp_le_br_capable(dev) (!!((dev)->features[0][6] & LMP_SIMUL_LE_BR))
792#define lmp_ssp_capable(dev) ((dev)->features[0][6] & LMP_SIMPLE_PAIR)
793#define lmp_no_flush_capable(dev) ((dev)->features[0][6] & LMP_NO_FLUSH)
794#define lmp_lsto_capable(dev) ((dev)->features[0][7] & LMP_LSTO)
795#define lmp_inq_tx_pwr_capable(dev) ((dev)->features[0][7] & LMP_INQ_TX_PWR)
796#define lmp_ext_feat_capable(dev) ((dev)->features[0][7] & LMP_EXTFEATURES)
07a5c61e 797#define lmp_transp_capable(dev) ((dev)->features[0][2] & LMP_TRANSPARENT)
1da177e4 798
eead27da 799/* ----- Extended LMP capabilities ----- */
cad718ed
JH
800#define lmp_host_ssp_capable(dev) ((dev)->features[1][0] & LMP_HOST_SSP)
801#define lmp_host_le_capable(dev) (!!((dev)->features[1][0] & LMP_HOST_LE))
802#define lmp_host_le_br_capable(dev) (!!((dev)->features[1][0] & LMP_HOST_LE_BREDR))
eead27da 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
1da177e4
LT
1014int hci_register_cb(struct hci_cb *hcb);
1015int hci_unregister_cb(struct hci_cb *hcb);
1016
3119ae95
JH
1017struct hci_request {
1018 struct hci_dev *hdev;
1019 struct sk_buff_head cmd_q;
5d73e034
AG
1020
1021 /* If something goes wrong when building the HCI request, the error
1022 * value is stored in this field.
1023 */
1024 int err;
3119ae95
JH
1025};
1026
1027void hci_req_init(struct hci_request *req, struct hci_dev *hdev);
1028int hci_req_run(struct hci_request *req, hci_req_complete_t complete);
07dc93dd
JH
1029void hci_req_add(struct hci_request *req, u16 opcode, u32 plen,
1030 const void *param);
1031void hci_req_add_ev(struct hci_request *req, u16 opcode, u32 plen,
1032 const void *param, u8 event);
9238f36a 1033void hci_req_cmd_complete(struct hci_dev *hdev, u16 opcode, u8 status);
3119ae95 1034
75e84b7c 1035struct sk_buff *__hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen,
07dc93dd 1036 const void *param, u32 timeout);
7b1abbbe 1037struct sk_buff *__hci_cmd_sync_ev(struct hci_dev *hdev, u16 opcode, u32 plen,
07dc93dd 1038 const void *param, u8 event, u32 timeout);
75e84b7c 1039
07dc93dd
JH
1040int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen,
1041 const void *param);
73d80deb 1042void hci_send_acl(struct hci_chan *chan, struct sk_buff *skb, __u16 flags);
0d861d8b 1043void hci_send_sco(struct hci_conn *conn, struct sk_buff *skb);
1da177e4 1044
a9de9248 1045void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 opcode);
1da177e4 1046
1da177e4 1047/* ----- HCI Sockets ----- */
470fe1b5
MH
1048void hci_send_to_sock(struct hci_dev *hdev, struct sk_buff *skb);
1049void hci_send_to_control(struct sk_buff *skb, struct sock *skip_sk);
cd82e61c 1050void hci_send_to_monitor(struct hci_dev *hdev, struct sk_buff *skb);
1da177e4 1051
040030ef
MH
1052void hci_sock_dev_event(struct hci_dev *hdev, int event);
1053
0381101f 1054/* Management interface */
591f47f3
AG
1055#define DISCOV_TYPE_BREDR (BIT(BDADDR_BREDR))
1056#define DISCOV_TYPE_LE (BIT(BDADDR_LE_PUBLIC) | \
1057 BIT(BDADDR_LE_RANDOM))
1058#define DISCOV_TYPE_INTERLEAVED (BIT(BDADDR_BREDR) | \
1059 BIT(BDADDR_LE_PUBLIC) | \
1060 BIT(BDADDR_LE_RANDOM))
f39799f5 1061
0d8cc935
AG
1062/* These LE scan and inquiry parameters were chosen according to LE General
1063 * Discovery Procedure specification.
1064 */
1065#define DISCOV_LE_SCAN_WIN 0x12
1066#define DISCOV_LE_SCAN_INT 0x12
1067#define DISCOV_LE_TIMEOUT msecs_to_jiffies(10240)
1068#define DISCOV_INTERLEAVED_TIMEOUT msecs_to_jiffies(5120)
1069#define DISCOV_INTERLEAVED_INQUIRY_LEN 0x04
1070#define DISCOV_BREDR_INQUIRY_LEN 0x08
1071
0381101f 1072int mgmt_control(struct sock *sk, struct msghdr *msg, size_t len);
bf6b56db
MH
1073void mgmt_index_added(struct hci_dev *hdev);
1074void mgmt_index_removed(struct hci_dev *hdev);
3eec705e 1075void mgmt_set_powered_failed(struct hci_dev *hdev, int err);
744cf19e 1076int mgmt_powered(struct hci_dev *hdev, u8 powered);
d1967ff8 1077void mgmt_discoverable_timeout(struct hci_dev *hdev);
86a75645 1078void mgmt_discoverable(struct hci_dev *hdev, u8 discoverable);
a330916c 1079void mgmt_connectable(struct hci_dev *hdev, u8 connectable);
4796e8af 1080void mgmt_write_scan_failed(struct hci_dev *hdev, u8 scan, u8 status);
dc4a5ee2
MH
1081void mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key,
1082 bool persistent);
ecd90ae7
MH
1083void mgmt_device_connected(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
1084 u8 addr_type, u32 flags, u8 *name, u8 name_len,
1085 u8 *dev_class);
9b80ec5e
MH
1086void mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr,
1087 u8 link_type, u8 addr_type, u8 reason);
7892924c
MH
1088void mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr,
1089 u8 link_type, u8 addr_type, u8 status);
445608d0
MH
1090void mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
1091 u8 addr_type, u8 status);
ce0e4a0d 1092void mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure);
e669cf80
MH
1093void mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
1094 u8 status);
3eb38528
MH
1095void mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
1096 u8 status);
744cf19e 1097int mgmt_user_confirm_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
04124681
GP
1098 u8 link_type, u8 addr_type, __le32 value,
1099 u8 confirm_hint);
744cf19e 1100int mgmt_user_confirm_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
04124681 1101 u8 link_type, u8 addr_type, u8 status);
272d90df 1102int mgmt_user_confirm_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
04124681 1103 u8 link_type, u8 addr_type, u8 status);
272d90df 1104int mgmt_user_passkey_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
04124681 1105 u8 link_type, u8 addr_type);
604086b7 1106int mgmt_user_passkey_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
04124681 1107 u8 link_type, u8 addr_type, u8 status);
272d90df 1108int mgmt_user_passkey_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
04124681 1109 u8 link_type, u8 addr_type, u8 status);
92a25256
JH
1110int mgmt_user_passkey_notify(struct hci_dev *hdev, bdaddr_t *bdaddr,
1111 u8 link_type, u8 addr_type, u32 passkey,
1112 u8 entered);
e546099c
MH
1113void mgmt_auth_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
1114 u8 addr_type, u8 status);
464996ae 1115void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status);
3e248560 1116void mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status);
4e1b0245
MH
1117void mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class,
1118 u8 status);
7667da34 1119void mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status);
3edaf092
MH
1120void mgmt_read_local_oob_data_reply_complete(struct hci_dev *hdev, u8 *hash,
1121 u8 *randomizer, u8 status);
901801b9
MH
1122void mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
1123 u8 addr_type, u8 *dev_class, s8 rssi, u8 cfm_name,
1124 u8 ssp, u8 *eir, u16 eir_len);
9cf12aee
MH
1125void mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
1126 u8 addr_type, s8 rssi, u8 *name, u8 name_len);
2f1e063b 1127void mgmt_discovering(struct hci_dev *hdev, u8 discovering);
88c1fe4b
JH
1128int mgmt_device_blocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type);
1129int mgmt_device_unblocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type);
083368f7 1130void mgmt_new_ltk(struct hci_dev *hdev, struct smp_ltk *key, u8 persistent);
5976e608 1131void mgmt_reenable_advertising(struct hci_dev *hdev);
346af67b 1132
1da177e4
LT
1133/* HCI info for socket */
1134#define hci_pi(sk) ((struct hci_pinfo *) sk)
1135
1136struct hci_pinfo {
1137 struct bt_sock bt;
1138 struct hci_dev *hdev;
1139 struct hci_filter filter;
1140 __u32 cmsg_mask;
c02178d2 1141 unsigned short channel;
1da177e4
LT
1142};
1143
1144/* HCI security filter */
1145#define HCI_SFLT_MAX_OGF 5
1146
1147struct hci_sec_filter {
1148 __u32 type_mask;
1149 __u32 event_mask[2];
1150 __u32 ocf_mask[HCI_SFLT_MAX_OGF + 1][4];
1151};
1152
1153/* ----- HCI requests ----- */
1154#define HCI_REQ_DONE 0
1155#define HCI_REQ_PEND 1
1156#define HCI_REQ_CANCELED 2
1157
a6a67efd
TG
1158#define hci_req_lock(d) mutex_lock(&d->req_lock)
1159#define hci_req_unlock(d) mutex_unlock(&d->req_lock)
1da177e4 1160
2ce603eb
CT
1161void hci_le_conn_update(struct hci_conn *conn, u16 min, u16 max,
1162 u16 latency, u16 to_multiplier);
a7a595f6
VCG
1163void hci_le_start_enc(struct hci_conn *conn, __le16 ediv, __u8 rand[8],
1164 __u8 ltk[16]);
2519a1fc 1165
5d4d62f6
FD
1166#define SCO_AIRMODE_MASK 0x0003
1167#define SCO_AIRMODE_CVSD 0x0000
1168#define SCO_AIRMODE_TRANSP 0x0003
1169
1da177e4 1170#endif /* __HCI_CORE_H */