]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - include/net/bluetooth/hci_core.h
Bluetooth: Make mgmt_auth_enable_complete() return void
[mirror_ubuntu-artful-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;
8fa19098 286
1da177e4
LT
287 int (*open)(struct hci_dev *hdev);
288 int (*close)(struct hci_dev *hdev);
289 int (*flush)(struct hci_dev *hdev);
f41c70c4 290 int (*setup)(struct hci_dev *hdev);
7bd8f09f 291 int (*send)(struct hci_dev *hdev, struct sk_buff *skb);
1da177e4 292 void (*notify)(struct hci_dev *hdev, unsigned int evt);
1da177e4
LT
293};
294
53502d69
AE
295#define HCI_PHY_HANDLE(handle) (handle & 0xff)
296
1da177e4
LT
297struct hci_conn {
298 struct list_head list;
299
adc4266d 300 atomic_t refcnt;
adc4266d
SJ
301
302 bdaddr_t dst;
5a9d0a3f 303 __u8 dst_type;
662e8820 304 bdaddr_t src;
e7c4096e 305 __u8 src_type;
adc4266d
SJ
306 __u16 handle;
307 __u16 state;
308 __u8 mode;
309 __u8 type;
a0c808b3 310 bool out;
adc4266d
SJ
311 __u8 attempt;
312 __u8 dev_class[3];
cad718ed 313 __u8 features[HCI_MAX_PAGES][8];
adc4266d
SJ
314 __u16 interval;
315 __u16 pkt_type;
316 __u16 link_policy;
317 __u32 link_mode;
13d39315 318 __u8 key_type;
adc4266d
SJ
319 __u8 auth_type;
320 __u8 sec_level;
321 __u8 pending_sec_level;
322 __u8 pin_length;
726b4ffc 323 __u8 enc_key_size;
adc4266d 324 __u8 io_capability;
92a25256
JH
325 __u32 passkey_notify;
326 __u8 passkey_entered;
adc4266d 327 __u16 disc_timeout;
10c62ddc 328 __u16 setting;
51a8efd7 329 unsigned long flags;
04837f64 330
03b555e1 331 __u8 remote_cap;
03b555e1 332 __u8 remote_auth;
3161ae1c 333 __u8 remote_id;
6ec5bcad 334 bool flush_key;
03b555e1 335
adc4266d 336 unsigned int sent;
04837f64 337
1da177e4 338 struct sk_buff_head data_q;
2c33c06a 339 struct list_head chan_list;
1da177e4 340
19c40e3b 341 struct delayed_work disc_work;
04837f64 342 struct timer_list idle_timer;
9f61656a 343 struct timer_list auto_accept_timer;
04837f64 344
b219e3ac
MH
345 struct device dev;
346
1da177e4
LT
347 struct hci_dev *hdev;
348 void *l2cap_data;
349 void *sco_data;
2b64d153 350 void *smp_conn;
9740e49d 351 struct amp_mgr *amp_mgr;
1da177e4
LT
352
353 struct hci_conn *link;
e9a416b5
JH
354
355 void (*connect_cfm_cb) (struct hci_conn *conn, u8 status);
356 void (*security_cfm_cb) (struct hci_conn *conn, u8 status);
357 void (*disconn_cfm_cb) (struct hci_conn *conn, u8 reason);
1da177e4
LT
358};
359
73d80deb
LAD
360struct hci_chan {
361 struct list_head list;
42c4e53e 362 __u16 handle;
73d80deb
LAD
363 struct hci_conn *conn;
364 struct sk_buff_head data_q;
365 unsigned int sent;
168df8e5 366 __u8 state;
73d80deb
LAD
367};
368
1da177e4
LT
369extern struct list_head hci_dev_list;
370extern struct list_head hci_cb_list;
371extern rwlock_t hci_dev_list_lock;
372extern rwlock_t hci_cb_list_lock;
373
686ebf28
UF
374/* ----- HCI interface to upper protocols ----- */
375extern int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr);
9e664631 376extern void l2cap_connect_cfm(struct hci_conn *hcon, u8 status);
686ebf28 377extern int l2cap_disconn_ind(struct hci_conn *hcon);
9e664631 378extern void l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason);
686ebf28 379extern int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt);
c3c7ea65
GP
380extern int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb,
381 u16 flags);
686ebf28 382
20714bfe 383extern int sco_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags);
9e664631
AE
384extern void sco_connect_cfm(struct hci_conn *hcon, __u8 status);
385extern void sco_disconn_cfm(struct hci_conn *hcon, __u8 reason);
686ebf28
UF
386extern int sco_recv_scodata(struct hci_conn *hcon, struct sk_buff *skb);
387
1da177e4 388/* ----- Inquiry cache ----- */
70f23020
AE
389#define INQUIRY_CACHE_AGE_MAX (HZ*30) /* 30 seconds */
390#define INQUIRY_ENTRY_AGE_MAX (HZ*60) /* 60 seconds */
1da177e4 391
30883512 392static inline void discovery_init(struct hci_dev *hdev)
1da177e4 393{
ff9ef578 394 hdev->discovery.state = DISCOVERY_STOPPED;
30883512
JH
395 INIT_LIST_HEAD(&hdev->discovery.all);
396 INIT_LIST_HEAD(&hdev->discovery.unknown);
397 INIT_LIST_HEAD(&hdev->discovery.resolve);
1da177e4
LT
398}
399
30dc78e1
JH
400bool hci_discovery_active(struct hci_dev *hdev);
401
ff9ef578
JH
402void hci_discovery_set_state(struct hci_dev *hdev, int state);
403
1da177e4
LT
404static inline int inquiry_cache_empty(struct hci_dev *hdev)
405{
30883512 406 return list_empty(&hdev->discovery.all);
1da177e4
LT
407}
408
409static inline long inquiry_cache_age(struct hci_dev *hdev)
410{
30883512 411 struct discovery_state *c = &hdev->discovery;
1da177e4
LT
412 return jiffies - c->timestamp;
413}
414
415static inline long inquiry_entry_age(struct inquiry_entry *e)
416{
417 return jiffies - e->timestamp;
418}
419
5a9d0a3f 420struct inquiry_entry *hci_inquiry_cache_lookup(struct hci_dev *hdev,
04124681 421 bdaddr_t *bdaddr);
561aafbc 422struct inquiry_entry *hci_inquiry_cache_lookup_unknown(struct hci_dev *hdev,
04124681 423 bdaddr_t *bdaddr);
30dc78e1 424struct inquiry_entry *hci_inquiry_cache_lookup_resolve(struct hci_dev *hdev,
04124681
GP
425 bdaddr_t *bdaddr,
426 int state);
a3d4e20a 427void hci_inquiry_cache_update_resolve(struct hci_dev *hdev,
04124681 428 struct inquiry_entry *ie);
3175405b 429bool hci_inquiry_cache_update(struct hci_dev *hdev, struct inquiry_data *data,
04124681 430 bool name_known, bool *ssp);
1f9b9a5d 431void hci_inquiry_cache_flush(struct hci_dev *hdev);
1da177e4
LT
432
433/* ----- HCI Connections ----- */
434enum {
435 HCI_CONN_AUTH_PEND,
19f8def0 436 HCI_CONN_REAUTH_PEND,
1da177e4 437 HCI_CONN_ENCRYPT_PEND,
04837f64
MH
438 HCI_CONN_RSWITCH_PEND,
439 HCI_CONN_MODE_CHANGE_PEND,
e73439d8 440 HCI_CONN_SCO_SETUP_PEND,
d26a2345 441 HCI_CONN_LE_SMP_PEND,
b644ba33 442 HCI_CONN_MGMT_CONNECTED,
58a681ef
JH
443 HCI_CONN_SSP_ENABLED,
444 HCI_CONN_POWER_SAVE,
445 HCI_CONN_REMOTE_OOB,
1da177e4
LT
446};
447
aa64a8b5
JH
448static inline bool hci_conn_ssp_enabled(struct hci_conn *conn)
449{
450 struct hci_dev *hdev = conn->hdev;
c3c7ea65
GP
451 return test_bit(HCI_SSP_ENABLED, &hdev->dev_flags) &&
452 test_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
aa64a8b5
JH
453}
454
1da177e4
LT
455static inline void hci_conn_hash_add(struct hci_dev *hdev, struct hci_conn *c)
456{
457 struct hci_conn_hash *h = &hdev->conn_hash;
bf4c6325 458 list_add_rcu(&c->list, &h->list);
fcd89c09
VT
459 switch (c->type) {
460 case ACL_LINK:
1da177e4 461 h->acl_num++;
fcd89c09 462 break;
bd1eb66b
AE
463 case AMP_LINK:
464 h->amp_num++;
465 break;
fcd89c09
VT
466 case LE_LINK:
467 h->le_num++;
468 break;
469 case SCO_LINK:
470 case ESCO_LINK:
1da177e4 471 h->sco_num++;
fcd89c09
VT
472 break;
473 }
1da177e4
LT
474}
475
476static inline void hci_conn_hash_del(struct hci_dev *hdev, struct hci_conn *c)
477{
478 struct hci_conn_hash *h = &hdev->conn_hash;
bf4c6325
GP
479
480 list_del_rcu(&c->list);
481 synchronize_rcu();
482
fcd89c09
VT
483 switch (c->type) {
484 case ACL_LINK:
1da177e4 485 h->acl_num--;
fcd89c09 486 break;
bd1eb66b
AE
487 case AMP_LINK:
488 h->amp_num--;
489 break;
fcd89c09
VT
490 case LE_LINK:
491 h->le_num--;
492 break;
493 case SCO_LINK:
494 case ESCO_LINK:
1da177e4 495 h->sco_num--;
fcd89c09
VT
496 break;
497 }
1da177e4
LT
498}
499
52087a79
LAD
500static inline unsigned int hci_conn_num(struct hci_dev *hdev, __u8 type)
501{
502 struct hci_conn_hash *h = &hdev->conn_hash;
503 switch (type) {
504 case ACL_LINK:
505 return h->acl_num;
bd1eb66b
AE
506 case AMP_LINK:
507 return h->amp_num;
52087a79
LAD
508 case LE_LINK:
509 return h->le_num;
510 case SCO_LINK:
511 case ESCO_LINK:
512 return h->sco_num;
513 default:
514 return 0;
515 }
516}
517
1da177e4 518static inline struct hci_conn *hci_conn_hash_lookup_handle(struct hci_dev *hdev,
adc4266d 519 __u16 handle)
1da177e4
LT
520{
521 struct hci_conn_hash *h = &hdev->conn_hash;
1da177e4
LT
522 struct hci_conn *c;
523
bf4c6325
GP
524 rcu_read_lock();
525
526 list_for_each_entry_rcu(c, &h->list, list) {
527 if (c->handle == handle) {
528 rcu_read_unlock();
1da177e4 529 return c;
bf4c6325 530 }
1da177e4 531 }
bf4c6325
GP
532 rcu_read_unlock();
533
1da177e4
LT
534 return NULL;
535}
536
537static inline struct hci_conn *hci_conn_hash_lookup_ba(struct hci_dev *hdev,
adc4266d 538 __u8 type, bdaddr_t *ba)
1da177e4
LT
539{
540 struct hci_conn_hash *h = &hdev->conn_hash;
1da177e4
LT
541 struct hci_conn *c;
542
bf4c6325
GP
543 rcu_read_lock();
544
545 list_for_each_entry_rcu(c, &h->list, list) {
546 if (c->type == type && !bacmp(&c->dst, ba)) {
547 rcu_read_unlock();
1da177e4 548 return c;
bf4c6325 549 }
1da177e4 550 }
bf4c6325
GP
551
552 rcu_read_unlock();
553
1da177e4
LT
554 return NULL;
555}
556
4c67bc74 557static inline struct hci_conn *hci_conn_hash_lookup_state(struct hci_dev *hdev,
adc4266d 558 __u8 type, __u16 state)
4c67bc74
MH
559{
560 struct hci_conn_hash *h = &hdev->conn_hash;
4c67bc74
MH
561 struct hci_conn *c;
562
bf4c6325
GP
563 rcu_read_lock();
564
565 list_for_each_entry_rcu(c, &h->list, list) {
566 if (c->type == type && c->state == state) {
567 rcu_read_unlock();
4c67bc74 568 return c;
bf4c6325 569 }
4c67bc74 570 }
73d80deb 571
bf4c6325 572 rcu_read_unlock();
73d80deb 573
4c67bc74 574 return NULL;
73d80deb
LAD
575}
576
bed71748 577void hci_disconnect(struct hci_conn *conn, __u8 reason);
2dea632f 578bool hci_setup_sync(struct hci_conn *conn, __u16 handle);
e73439d8 579void hci_sco_setup(struct hci_conn *conn, __u8 status);
1da177e4
LT
580
581struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst);
a9de9248
MH
582int hci_conn_del(struct hci_conn *conn);
583void hci_conn_hash_flush(struct hci_dev *hdev);
584void hci_conn_check_pending(struct hci_dev *hdev);
1da177e4 585
73d80deb 586struct hci_chan *hci_chan_create(struct hci_conn *conn);
9472007c 587void hci_chan_del(struct hci_chan *chan);
2c33c06a 588void hci_chan_list_flush(struct hci_conn *conn);
42c4e53e 589struct hci_chan *hci_chan_lookup_handle(struct hci_dev *hdev, __u16 handle);
73d80deb 590
5a9d0a3f 591struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst,
b12f62cf 592 __u8 dst_type, __u8 sec_level, __u8 auth_type);
10c62ddc
FD
593struct hci_conn *hci_connect_sco(struct hci_dev *hdev, int type, bdaddr_t *dst,
594 __u16 setting);
e7c29cb1 595int hci_conn_check_link_mode(struct hci_conn *conn);
b3b1b061 596int hci_conn_check_secure(struct hci_conn *conn, __u8 sec_level);
0684e5f9 597int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type);
1da177e4 598int hci_conn_change_link_key(struct hci_conn *conn);
8c1b2355 599int hci_conn_switch_role(struct hci_conn *conn, __u8 role);
1da177e4 600
14b12d0b 601void hci_conn_enter_active_mode(struct hci_conn *conn, __u8 force_active);
1da177e4 602
8d12356f
DH
603/*
604 * hci_conn_get() and hci_conn_put() are used to control the life-time of an
605 * "hci_conn" object. They do not guarantee that the hci_conn object is running,
606 * working or anything else. They just guarantee that the object is available
607 * and can be dereferenced. So you can use its locks, local variables and any
608 * other constant data.
609 * Before accessing runtime data, you _must_ lock the object and then check that
610 * it is still running. As soon as you release the locks, the connection might
611 * get dropped, though.
612 *
613 * On the other hand, hci_conn_hold() and hci_conn_drop() are used to control
614 * how long the underlying connection is held. So every channel that runs on the
615 * hci_conn object calls this to prevent the connection from disappearing. As
616 * long as you hold a device, you must also guarantee that you have a valid
617 * reference to the device via hci_conn_get() (or the initial reference from
618 * hci_conn_add()).
619 * The hold()/drop() ref-count is known to drop below 0 sometimes, which doesn't
620 * break because nobody cares for that. But this means, we cannot use
621 * _get()/_drop() in it, but require the caller to have a valid ref (FIXME).
622 */
623
624static inline void hci_conn_get(struct hci_conn *conn)
625{
626 get_device(&conn->dev);
627}
628
629static inline void hci_conn_put(struct hci_conn *conn)
630{
631 put_device(&conn->dev);
632}
633
1da177e4
LT
634static inline void hci_conn_hold(struct hci_conn *conn)
635{
71becf0c 636 BT_DBG("hcon %p orig refcnt %d", conn, atomic_read(&conn->refcnt));
38b3fef1 637
1da177e4 638 atomic_inc(&conn->refcnt);
2f304d1e 639 cancel_delayed_work(&conn->disc_work);
1da177e4
LT
640}
641
76a68ba0 642static inline void hci_conn_drop(struct hci_conn *conn)
1da177e4 643{
71becf0c 644 BT_DBG("hcon %p orig refcnt %d", conn, atomic_read(&conn->refcnt));
38b3fef1 645
1da177e4 646 if (atomic_dec_and_test(&conn->refcnt)) {
04837f64 647 unsigned long timeo;
716e4ab5
AE
648
649 switch (conn->type) {
650 case ACL_LINK:
651 case LE_LINK:
04837f64 652 del_timer(&conn->idle_timer);
6ac59344 653 if (conn->state == BT_CONNECTED) {
5f246e89 654 timeo = conn->disc_timeout;
6ac59344 655 if (!conn->out)
052b30b0 656 timeo *= 2;
5a9d0a3f 657 } else {
6ac59344 658 timeo = msecs_to_jiffies(10);
5a9d0a3f 659 }
716e4ab5
AE
660 break;
661
662 case AMP_LINK:
663 timeo = conn->disc_timeout;
664 break;
665
666 default:
04837f64 667 timeo = msecs_to_jiffies(10);
716e4ab5 668 break;
5a9d0a3f 669 }
716e4ab5 670
2f304d1e 671 cancel_delayed_work(&conn->disc_work);
19c40e3b 672 queue_delayed_work(conn->hdev->workqueue,
716e4ab5 673 &conn->disc_work, timeo);
1da177e4
LT
674 }
675}
676
1da177e4 677/* ----- HCI Devices ----- */
dc946bd8 678static inline void hci_dev_put(struct hci_dev *d)
1da177e4 679{
376261ae
AE
680 BT_DBG("%s orig refcnt %d", d->name,
681 atomic_read(&d->dev.kobj.kref.refcount));
682
4c724c71 683 put_device(&d->dev);
1da177e4
LT
684}
685
dc946bd8 686static inline struct hci_dev *hci_dev_hold(struct hci_dev *d)
1da177e4 687{
376261ae
AE
688 BT_DBG("%s orig refcnt %d", d->name,
689 atomic_read(&d->dev.kobj.kref.refcount));
690
4c724c71 691 get_device(&d->dev);
1da177e4
LT
692 return d;
693}
694
09fd0de5
GP
695#define hci_dev_lock(d) mutex_lock(&d->lock)
696#define hci_dev_unlock(d) mutex_unlock(&d->lock)
1da177e4 697
aa2b86d7 698#define to_hci_dev(d) container_of(d, struct hci_dev, dev)
3dc07322 699#define to_hci_conn(c) container_of(c, struct hci_conn, dev)
aa2b86d7 700
155961e8
DH
701static inline void *hci_get_drvdata(struct hci_dev *hdev)
702{
703 return dev_get_drvdata(&hdev->dev);
704}
705
706static inline void hci_set_drvdata(struct hci_dev *hdev, void *data)
707{
708 dev_set_drvdata(&hdev->dev, data);
709}
710
1da177e4 711struct hci_dev *hci_dev_get(int index);
0c0afedf 712struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src);
1da177e4
LT
713
714struct hci_dev *hci_alloc_dev(void);
715void hci_free_dev(struct hci_dev *hdev);
716int hci_register_dev(struct hci_dev *hdev);
59735631 717void hci_unregister_dev(struct hci_dev *hdev);
1da177e4
LT
718int hci_suspend_dev(struct hci_dev *hdev);
719int hci_resume_dev(struct hci_dev *hdev);
720int hci_dev_open(__u16 dev);
721int hci_dev_close(__u16 dev);
722int hci_dev_reset(__u16 dev);
723int hci_dev_reset_stat(__u16 dev);
724int hci_dev_cmd(unsigned int cmd, void __user *arg);
725int hci_get_dev_list(void __user *arg);
726int hci_get_dev_info(void __user *arg);
727int hci_get_conn_list(void __user *arg);
728int hci_get_conn_info(struct hci_dev *hdev, void __user *arg);
40be492f 729int hci_get_auth_info(struct hci_dev *hdev, void __user *arg);
1da177e4
LT
730int hci_inquiry(void __user *arg);
731
c3c7ea65
GP
732struct bdaddr_list *hci_blacklist_lookup(struct hci_dev *hdev,
733 bdaddr_t *bdaddr);
f0358568 734int hci_blacklist_clear(struct hci_dev *hdev);
88c1fe4b
JH
735int hci_blacklist_add(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type);
736int hci_blacklist_del(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type);
f0358568 737
2aeb9a1a
JH
738int hci_uuids_clear(struct hci_dev *hdev);
739
55ed8ca1
JH
740int hci_link_keys_clear(struct hci_dev *hdev);
741struct link_key *hci_find_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr);
d25e28ab 742int hci_add_link_key(struct hci_dev *hdev, struct hci_conn *conn, int new_key,
04124681 743 bdaddr_t *bdaddr, u8 *val, u8 type, u8 pin_len);
c9839a11
VCG
744struct smp_ltk *hci_find_ltk(struct hci_dev *hdev, __le16 ediv, u8 rand[8]);
745int hci_add_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 addr_type, u8 type,
9a006657
AE
746 int new_key, u8 authenticated, u8 tk[16], u8 enc_size,
747 __le16 ediv, u8 rand[8]);
c9839a11 748struct smp_ltk *hci_find_ltk_by_addr(struct hci_dev *hdev, bdaddr_t *bdaddr,
04124681 749 u8 addr_type);
b899efaf 750int hci_remove_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr);
b899efaf 751int hci_smp_ltks_clear(struct hci_dev *hdev);
55ed8ca1
JH
752int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr);
753
2763eda6
SJ
754int hci_remote_oob_data_clear(struct hci_dev *hdev);
755struct oob_data *hci_find_remote_oob_data(struct hci_dev *hdev,
756 bdaddr_t *bdaddr);
757int hci_add_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 *hash,
758 u8 *randomizer);
759int hci_remove_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr);
760
1da177e4
LT
761void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb);
762
e1a26170 763int hci_recv_frame(struct hci_dev *hdev, struct sk_buff *skb);
ef222013 764int hci_recv_fragment(struct hci_dev *hdev, int type, void *data, int count);
99811510 765int hci_recv_stream_fragment(struct hci_dev *hdev, void *data, int count);
ef222013 766
0ac7e700 767void hci_init_sysfs(struct hci_dev *hdev);
ce242970
DH
768int hci_add_sysfs(struct hci_dev *hdev);
769void hci_del_sysfs(struct hci_dev *hdev);
a67e899c 770void hci_conn_init_sysfs(struct hci_conn *conn);
b219e3ac
MH
771void hci_conn_add_sysfs(struct hci_conn *conn);
772void hci_conn_del_sysfs(struct hci_conn *conn);
1da177e4 773
6935e0f5 774#define SET_HCIDEV_DEV(hdev, pdev) ((hdev)->dev.parent = (pdev))
1da177e4
LT
775
776/* ----- LMP capabilities ----- */
cad718ed
JH
777#define lmp_encrypt_capable(dev) ((dev)->features[0][0] & LMP_ENCRYPT)
778#define lmp_rswitch_capable(dev) ((dev)->features[0][0] & LMP_RSWITCH)
779#define lmp_hold_capable(dev) ((dev)->features[0][0] & LMP_HOLD)
780#define lmp_sniff_capable(dev) ((dev)->features[0][0] & LMP_SNIFF)
781#define lmp_park_capable(dev) ((dev)->features[0][1] & LMP_PARK)
782#define lmp_inq_rssi_capable(dev) ((dev)->features[0][3] & LMP_RSSI_INQ)
783#define lmp_esco_capable(dev) ((dev)->features[0][3] & LMP_ESCO)
784#define lmp_bredr_capable(dev) (!((dev)->features[0][4] & LMP_NO_BREDR))
785#define lmp_le_capable(dev) ((dev)->features[0][4] & LMP_LE)
786#define lmp_sniffsubr_capable(dev) ((dev)->features[0][5] & LMP_SNIFF_SUBR)
787#define lmp_pause_enc_capable(dev) ((dev)->features[0][5] & LMP_PAUSE_ENC)
788#define lmp_ext_inq_capable(dev) ((dev)->features[0][6] & LMP_EXT_INQ)
789#define lmp_le_br_capable(dev) (!!((dev)->features[0][6] & LMP_SIMUL_LE_BR))
790#define lmp_ssp_capable(dev) ((dev)->features[0][6] & LMP_SIMPLE_PAIR)
791#define lmp_no_flush_capable(dev) ((dev)->features[0][6] & LMP_NO_FLUSH)
792#define lmp_lsto_capable(dev) ((dev)->features[0][7] & LMP_LSTO)
793#define lmp_inq_tx_pwr_capable(dev) ((dev)->features[0][7] & LMP_INQ_TX_PWR)
794#define lmp_ext_feat_capable(dev) ((dev)->features[0][7] & LMP_EXTFEATURES)
07a5c61e 795#define lmp_transp_capable(dev) ((dev)->features[0][2] & LMP_TRANSPARENT)
1da177e4 796
eead27da 797/* ----- Extended LMP capabilities ----- */
cad718ed
JH
798#define lmp_host_ssp_capable(dev) ((dev)->features[1][0] & LMP_HOST_SSP)
799#define lmp_host_le_capable(dev) (!!((dev)->features[1][0] & LMP_HOST_LE))
800#define lmp_host_le_br_capable(dev) (!!((dev)->features[1][0] & LMP_HOST_LE_BREDR))
eead27da 801
1da177e4 802/* ----- HCI protocols ----- */
20714bfe
FD
803#define HCI_PROTO_DEFER 0x01
804
5a9d0a3f 805static inline int hci_proto_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr,
20714bfe 806 __u8 type, __u8 *flags)
1da177e4 807{
686ebf28
UF
808 switch (type) {
809 case ACL_LINK:
810 return l2cap_connect_ind(hdev, bdaddr);
1da177e4 811
686ebf28
UF
812 case SCO_LINK:
813 case ESCO_LINK:
20714bfe 814 return sco_connect_ind(hdev, bdaddr, flags);
1da177e4 815
686ebf28
UF
816 default:
817 BT_ERR("unknown link type %d", type);
818 return -EINVAL;
819 }
1da177e4
LT
820}
821
822static inline void hci_proto_connect_cfm(struct hci_conn *conn, __u8 status)
823{
686ebf28
UF
824 switch (conn->type) {
825 case ACL_LINK:
826 case LE_LINK:
827 l2cap_connect_cfm(conn, status);
828 break;
1da177e4 829
686ebf28
UF
830 case SCO_LINK:
831 case ESCO_LINK:
832 sco_connect_cfm(conn, status);
833 break;
1da177e4 834
686ebf28
UF
835 default:
836 BT_ERR("unknown link type %d", conn->type);
837 break;
838 }
e9a416b5
JH
839
840 if (conn->connect_cfm_cb)
841 conn->connect_cfm_cb(conn, status);
1da177e4
LT
842}
843
2950f21a 844static inline int hci_proto_disconn_ind(struct hci_conn *conn)
1da177e4 845{
686ebf28
UF
846 if (conn->type != ACL_LINK && conn->type != LE_LINK)
847 return HCI_ERROR_REMOTE_USER_TERM;
1da177e4 848
686ebf28 849 return l2cap_disconn_ind(conn);
2950f21a
MH
850}
851
852static inline void hci_proto_disconn_cfm(struct hci_conn *conn, __u8 reason)
853{
686ebf28
UF
854 switch (conn->type) {
855 case ACL_LINK:
856 case LE_LINK:
857 l2cap_disconn_cfm(conn, reason);
858 break;
2950f21a 859
686ebf28
UF
860 case SCO_LINK:
861 case ESCO_LINK:
862 sco_disconn_cfm(conn, reason);
863 break;
2950f21a 864
bd1eb66b
AE
865 /* L2CAP would be handled for BREDR chan */
866 case AMP_LINK:
867 break;
868
686ebf28
UF
869 default:
870 BT_ERR("unknown link type %d", conn->type);
871 break;
872 }
e9a416b5
JH
873
874 if (conn->disconn_cfm_cb)
875 conn->disconn_cfm_cb(conn, reason);
1da177e4
LT
876}
877
878static inline void hci_proto_auth_cfm(struct hci_conn *conn, __u8 status)
879{
8c1b2355
MH
880 __u8 encrypt;
881
686ebf28
UF
882 if (conn->type != ACL_LINK && conn->type != LE_LINK)
883 return;
884
51a8efd7 885 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags))
8c1b2355
MH
886 return;
887
888 encrypt = (conn->link_mode & HCI_LM_ENCRYPT) ? 0x01 : 0x00;
686ebf28 889 l2cap_security_cfm(conn, status, encrypt);
e9a416b5
JH
890
891 if (conn->security_cfm_cb)
892 conn->security_cfm_cb(conn, status);
1da177e4
LT
893}
894
5a9d0a3f
WR
895static inline void hci_proto_encrypt_cfm(struct hci_conn *conn, __u8 status,
896 __u8 encrypt)
1da177e4 897{
686ebf28
UF
898 if (conn->type != ACL_LINK && conn->type != LE_LINK)
899 return;
1da177e4 900
686ebf28 901 l2cap_security_cfm(conn, status, encrypt);
e9a416b5
JH
902
903 if (conn->security_cfm_cb)
904 conn->security_cfm_cb(conn, status);
1da177e4
LT
905}
906
1da177e4
LT
907/* ----- HCI callbacks ----- */
908struct hci_cb {
909 struct list_head list;
910
911 char *name;
912
5a9d0a3f
WR
913 void (*security_cfm) (struct hci_conn *conn, __u8 status,
914 __u8 encrypt);
1da177e4
LT
915 void (*key_change_cfm) (struct hci_conn *conn, __u8 status);
916 void (*role_switch_cfm) (struct hci_conn *conn, __u8 status, __u8 role);
917};
918
919static inline void hci_auth_cfm(struct hci_conn *conn, __u8 status)
920{
711584ea 921 struct hci_cb *cb;
8c1b2355 922 __u8 encrypt;
1da177e4
LT
923
924 hci_proto_auth_cfm(conn, status);
925
51a8efd7 926 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags))
8c1b2355
MH
927 return;
928
929 encrypt = (conn->link_mode & HCI_LM_ENCRYPT) ? 0x01 : 0x00;
930
f20d09d5 931 read_lock(&hci_cb_list_lock);
711584ea 932 list_for_each_entry(cb, &hci_cb_list, list) {
8c1b2355
MH
933 if (cb->security_cfm)
934 cb->security_cfm(conn, status, encrypt);
1da177e4 935 }
f20d09d5 936 read_unlock(&hci_cb_list_lock);
1da177e4
LT
937}
938
5a9d0a3f
WR
939static inline void hci_encrypt_cfm(struct hci_conn *conn, __u8 status,
940 __u8 encrypt)
1da177e4 941{
711584ea 942 struct hci_cb *cb;
1da177e4 943
435fef20
MH
944 if (conn->sec_level == BT_SECURITY_SDP)
945 conn->sec_level = BT_SECURITY_LOW;
946
88167aed
VCG
947 if (conn->pending_sec_level > conn->sec_level)
948 conn->sec_level = conn->pending_sec_level;
949
9719f8af 950 hci_proto_encrypt_cfm(conn, status, encrypt);
1da177e4 951
f20d09d5 952 read_lock(&hci_cb_list_lock);
711584ea 953 list_for_each_entry(cb, &hci_cb_list, list) {
8c1b2355
MH
954 if (cb->security_cfm)
955 cb->security_cfm(conn, status, encrypt);
1da177e4 956 }
f20d09d5 957 read_unlock(&hci_cb_list_lock);
1da177e4
LT
958}
959
960static inline void hci_key_change_cfm(struct hci_conn *conn, __u8 status)
961{
711584ea 962 struct hci_cb *cb;
1da177e4 963
f20d09d5 964 read_lock(&hci_cb_list_lock);
711584ea 965 list_for_each_entry(cb, &hci_cb_list, list) {
1da177e4
LT
966 if (cb->key_change_cfm)
967 cb->key_change_cfm(conn, status);
968 }
f20d09d5 969 read_unlock(&hci_cb_list_lock);
1da177e4
LT
970}
971
5a9d0a3f
WR
972static inline void hci_role_switch_cfm(struct hci_conn *conn, __u8 status,
973 __u8 role)
1da177e4 974{
711584ea 975 struct hci_cb *cb;
1da177e4 976
f20d09d5 977 read_lock(&hci_cb_list_lock);
711584ea 978 list_for_each_entry(cb, &hci_cb_list, list) {
1da177e4
LT
979 if (cb->role_switch_cfm)
980 cb->role_switch_cfm(conn, status, role);
981 }
f20d09d5 982 read_unlock(&hci_cb_list_lock);
1da177e4
LT
983}
984
6759a675
JH
985static inline bool eir_has_data_type(u8 *data, size_t data_len, u8 type)
986{
84d9d071 987 size_t parsed = 0;
6759a675 988
6c0c331e
JH
989 if (data_len < 2)
990 return false;
991
84d9d071
JH
992 while (parsed < data_len - 1) {
993 u8 field_len = data[0];
6759a675
JH
994
995 if (field_len == 0)
996 break;
997
998 parsed += field_len + 1;
999
1000 if (parsed > data_len)
1001 break;
1002
1003 if (data[1] == type)
1004 return true;
1005
1006 data += field_len + 1;
1007 }
1008
1009 return false;
1010}
1011
1da177e4
LT
1012int hci_register_cb(struct hci_cb *hcb);
1013int hci_unregister_cb(struct hci_cb *hcb);
1014
3119ae95
JH
1015struct hci_request {
1016 struct hci_dev *hdev;
1017 struct sk_buff_head cmd_q;
5d73e034
AG
1018
1019 /* If something goes wrong when building the HCI request, the error
1020 * value is stored in this field.
1021 */
1022 int err;
3119ae95
JH
1023};
1024
1025void hci_req_init(struct hci_request *req, struct hci_dev *hdev);
1026int hci_req_run(struct hci_request *req, hci_req_complete_t complete);
07dc93dd
JH
1027void hci_req_add(struct hci_request *req, u16 opcode, u32 plen,
1028 const void *param);
1029void hci_req_add_ev(struct hci_request *req, u16 opcode, u32 plen,
1030 const void *param, u8 event);
9238f36a 1031void hci_req_cmd_complete(struct hci_dev *hdev, u16 opcode, u8 status);
3119ae95 1032
75e84b7c 1033struct sk_buff *__hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen,
07dc93dd 1034 const void *param, u32 timeout);
7b1abbbe 1035struct sk_buff *__hci_cmd_sync_ev(struct hci_dev *hdev, u16 opcode, u32 plen,
07dc93dd 1036 const void *param, u8 event, u32 timeout);
75e84b7c 1037
07dc93dd
JH
1038int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen,
1039 const void *param);
73d80deb 1040void hci_send_acl(struct hci_chan *chan, struct sk_buff *skb, __u16 flags);
0d861d8b 1041void hci_send_sco(struct hci_conn *conn, struct sk_buff *skb);
1da177e4 1042
a9de9248 1043void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 opcode);
1da177e4 1044
1da177e4 1045/* ----- HCI Sockets ----- */
470fe1b5
MH
1046void hci_send_to_sock(struct hci_dev *hdev, struct sk_buff *skb);
1047void hci_send_to_control(struct sk_buff *skb, struct sock *skip_sk);
cd82e61c 1048void hci_send_to_monitor(struct hci_dev *hdev, struct sk_buff *skb);
1da177e4 1049
040030ef
MH
1050void hci_sock_dev_event(struct hci_dev *hdev, int event);
1051
0381101f 1052/* Management interface */
591f47f3
AG
1053#define DISCOV_TYPE_BREDR (BIT(BDADDR_BREDR))
1054#define DISCOV_TYPE_LE (BIT(BDADDR_LE_PUBLIC) | \
1055 BIT(BDADDR_LE_RANDOM))
1056#define DISCOV_TYPE_INTERLEAVED (BIT(BDADDR_BREDR) | \
1057 BIT(BDADDR_LE_PUBLIC) | \
1058 BIT(BDADDR_LE_RANDOM))
f39799f5 1059
0d8cc935
AG
1060/* These LE scan and inquiry parameters were chosen according to LE General
1061 * Discovery Procedure specification.
1062 */
1063#define DISCOV_LE_SCAN_WIN 0x12
1064#define DISCOV_LE_SCAN_INT 0x12
1065#define DISCOV_LE_TIMEOUT msecs_to_jiffies(10240)
1066#define DISCOV_INTERLEAVED_TIMEOUT msecs_to_jiffies(5120)
1067#define DISCOV_INTERLEAVED_INQUIRY_LEN 0x04
1068#define DISCOV_BREDR_INQUIRY_LEN 0x08
1069
0381101f 1070int mgmt_control(struct sock *sk, struct msghdr *msg, size_t len);
bf6b56db
MH
1071void mgmt_index_added(struct hci_dev *hdev);
1072void mgmt_index_removed(struct hci_dev *hdev);
3eec705e 1073void mgmt_set_powered_failed(struct hci_dev *hdev, int err);
744cf19e 1074int mgmt_powered(struct hci_dev *hdev, u8 powered);
d1967ff8 1075void mgmt_discoverable_timeout(struct hci_dev *hdev);
86a75645 1076void mgmt_discoverable(struct hci_dev *hdev, u8 discoverable);
a330916c 1077void mgmt_connectable(struct hci_dev *hdev, u8 connectable);
4796e8af 1078void mgmt_write_scan_failed(struct hci_dev *hdev, u8 scan, u8 status);
dc4a5ee2
MH
1079void mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key,
1080 bool persistent);
ecd90ae7
MH
1081void mgmt_device_connected(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
1082 u8 addr_type, u32 flags, u8 *name, u8 name_len,
1083 u8 *dev_class);
9b80ec5e
MH
1084void mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr,
1085 u8 link_type, u8 addr_type, u8 reason);
7892924c
MH
1086void mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr,
1087 u8 link_type, u8 addr_type, u8 status);
445608d0
MH
1088void mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
1089 u8 addr_type, u8 status);
ce0e4a0d 1090void mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure);
e669cf80
MH
1091void mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
1092 u8 status);
3eb38528
MH
1093void mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
1094 u8 status);
744cf19e 1095int mgmt_user_confirm_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
04124681
GP
1096 u8 link_type, u8 addr_type, __le32 value,
1097 u8 confirm_hint);
744cf19e 1098int mgmt_user_confirm_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
04124681 1099 u8 link_type, u8 addr_type, u8 status);
272d90df 1100int mgmt_user_confirm_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
04124681 1101 u8 link_type, u8 addr_type, u8 status);
272d90df 1102int mgmt_user_passkey_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
04124681 1103 u8 link_type, u8 addr_type);
604086b7 1104int mgmt_user_passkey_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
04124681 1105 u8 link_type, u8 addr_type, u8 status);
272d90df 1106int mgmt_user_passkey_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
04124681 1107 u8 link_type, u8 addr_type, u8 status);
92a25256
JH
1108int mgmt_user_passkey_notify(struct hci_dev *hdev, bdaddr_t *bdaddr,
1109 u8 link_type, u8 addr_type, u32 passkey,
1110 u8 entered);
e546099c
MH
1111void mgmt_auth_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
1112 u8 addr_type, u8 status);
464996ae 1113void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status);
c0ecddc2 1114int mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status);
7f9a903c 1115int mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class,
04124681 1116 u8 status);
744cf19e
JH
1117int mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status);
1118int mgmt_read_local_oob_data_reply_complete(struct hci_dev *hdev, u8 *hash,
04124681 1119 u8 *randomizer, u8 status);
901801b9
MH
1120void mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
1121 u8 addr_type, u8 *dev_class, s8 rssi, u8 cfm_name,
1122 u8 ssp, u8 *eir, u16 eir_len);
9cf12aee
MH
1123void mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
1124 u8 addr_type, s8 rssi, u8 *name, u8 name_len);
2f1e063b 1125void mgmt_discovering(struct hci_dev *hdev, u8 discovering);
88c1fe4b
JH
1126int mgmt_device_blocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type);
1127int mgmt_device_unblocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type);
346af67b 1128int mgmt_new_ltk(struct hci_dev *hdev, struct smp_ltk *key, u8 persistent);
5976e608 1129void mgmt_reenable_advertising(struct hci_dev *hdev);
346af67b 1130
1da177e4
LT
1131/* HCI info for socket */
1132#define hci_pi(sk) ((struct hci_pinfo *) sk)
1133
1134struct hci_pinfo {
1135 struct bt_sock bt;
1136 struct hci_dev *hdev;
1137 struct hci_filter filter;
1138 __u32 cmsg_mask;
c02178d2 1139 unsigned short channel;
1da177e4
LT
1140};
1141
1142/* HCI security filter */
1143#define HCI_SFLT_MAX_OGF 5
1144
1145struct hci_sec_filter {
1146 __u32 type_mask;
1147 __u32 event_mask[2];
1148 __u32 ocf_mask[HCI_SFLT_MAX_OGF + 1][4];
1149};
1150
1151/* ----- HCI requests ----- */
1152#define HCI_REQ_DONE 0
1153#define HCI_REQ_PEND 1
1154#define HCI_REQ_CANCELED 2
1155
a6a67efd
TG
1156#define hci_req_lock(d) mutex_lock(&d->req_lock)
1157#define hci_req_unlock(d) mutex_unlock(&d->req_lock)
1da177e4 1158
2ce603eb
CT
1159void hci_le_conn_update(struct hci_conn *conn, u16 min, u16 max,
1160 u16 latency, u16 to_multiplier);
a7a595f6
VCG
1161void hci_le_start_enc(struct hci_conn *conn, __le16 ediv, __u8 rand[8],
1162 __u8 ltk[16]);
2519a1fc 1163
5d4d62f6
FD
1164#define SCO_AIRMODE_MASK 0x0003
1165#define SCO_AIRMODE_CVSD 0x0000
1166#define SCO_AIRMODE_TRANSP 0x0003
1167
1da177e4 1168#endif /* __HCI_CORE_H */