Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[linux-2.6-block.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
6d5d2ee6 28#include <linux/leds.h>
1da177e4 29#include <net/bluetooth/hci.h>
f49daa81 30#include <net/bluetooth/hci_sock.h>
1da177e4 31
5e59b791
LAD
32/* HCI priority */
33#define HCI_PRIO_MAX 7
34
1da177e4 35/* HCI Core structures */
1da177e4
LT
36struct inquiry_data {
37 bdaddr_t bdaddr;
38 __u8 pscan_rep_mode;
39 __u8 pscan_period_mode;
40 __u8 pscan_mode;
41 __u8 dev_class[3];
1ebb9252 42 __le16 clock_offset;
1da177e4 43 __s8 rssi;
41a96212 44 __u8 ssp_mode;
1da177e4
LT
45};
46
47struct inquiry_entry {
561aafbc
JH
48 struct list_head all; /* inq_cache.all */
49 struct list_head list; /* unknown or resolve */
50 enum {
51 NAME_NOT_KNOWN,
52 NAME_NEEDED,
53 NAME_PENDING,
54 NAME_KNOWN,
55 } name_state;
1da177e4
LT
56 __u32 timestamp;
57 struct inquiry_data data;
58};
59
30883512 60struct discovery_state {
f64b993f 61 int type;
ff9ef578
JH
62 enum {
63 DISCOVERY_STOPPED,
64 DISCOVERY_STARTING,
343f935b 65 DISCOVERY_FINDING,
30dc78e1 66 DISCOVERY_RESOLVING,
ff9ef578
JH
67 DISCOVERY_STOPPING,
68 } state;
c3c7ea65 69 struct list_head all; /* All devices found during inquiry */
f64b993f
GP
70 struct list_head unknown; /* Name state not known */
71 struct list_head resolve; /* Name needs to be resolved */
72 __u32 timestamp;
b9a6328f
JH
73 bdaddr_t last_adv_addr;
74 u8 last_adv_addr_type;
ff5cd29f 75 s8 last_adv_rssi;
c70a7e4c 76 u32 last_adv_flags;
b9a6328f
JH
77 u8 last_adv_data[HCI_MAX_AD_LENGTH];
78 u8 last_adv_data_len;
da25cf6a 79 bool report_invalid_rssi;
82f8b651 80 bool result_filtering;
78b781ca 81 bool limited;
37eab042
JP
82 s8 rssi;
83 u16 uuid_count;
84 u8 (*uuids)[16];
2d28cfe7
JP
85 unsigned long scan_start;
86 unsigned long scan_duration;
1da177e4
LT
87};
88
89struct hci_conn_hash {
90 struct list_head list;
1da177e4 91 unsigned int acl_num;
bd1eb66b 92 unsigned int amp_num;
1da177e4 93 unsigned int sco_num;
fcd89c09 94 unsigned int le_num;
f8218dc6 95 unsigned int le_num_slave;
1da177e4
LT
96};
97
f0358568
JH
98struct bdaddr_list {
99 struct list_head list;
100 bdaddr_t bdaddr;
b9ee0a78 101 u8 bdaddr_type;
f0358568 102};
2aeb9a1a
JH
103
104struct bt_uuid {
105 struct list_head list;
106 u8 uuid[16];
83be8eca 107 u8 size;
1aff6f09 108 u8 svc_hint;
2aeb9a1a
JH
109};
110
7ee4ea36
MH
111struct smp_csrk {
112 bdaddr_t bdaddr;
113 u8 bdaddr_type;
4cd3928a 114 u8 type;
7ee4ea36
MH
115 u8 val[16];
116};
117
b899efaf
VCG
118struct smp_ltk {
119 struct list_head list;
970d0f1b 120 struct rcu_head rcu;
b899efaf
VCG
121 bdaddr_t bdaddr;
122 u8 bdaddr_type;
123 u8 authenticated;
124 u8 type;
125 u8 enc_size;
126 __le16 ediv;
fe39c7b2 127 __le64 rand;
b899efaf 128 u8 val[16];
03c515d7 129};
b899efaf 130
970c4e46
JH
131struct smp_irk {
132 struct list_head list;
adae20cb 133 struct rcu_head rcu;
970c4e46
JH
134 bdaddr_t rpa;
135 bdaddr_t bdaddr;
136 u8 addr_type;
137 u8 val[16];
138};
139
55ed8ca1
JH
140struct link_key {
141 struct list_head list;
0378b597 142 struct rcu_head rcu;
55ed8ca1
JH
143 bdaddr_t bdaddr;
144 u8 type;
9b3b4460 145 u8 val[HCI_LINK_KEY_SIZE];
55ed8ca1
JH
146 u8 pin_len;
147};
148
2763eda6
SJ
149struct oob_data {
150 struct list_head list;
151 bdaddr_t bdaddr;
6928a924 152 u8 bdaddr_type;
f7697b16 153 u8 present;
519ca9d0 154 u8 hash192[16];
38da1703 155 u8 rand192[16];
519ca9d0 156 u8 hash256[16];
38da1703 157 u8 rand256[16];
2763eda6
SJ
158};
159
203fea01 160struct adv_info {
d2609b34 161 struct list_head list;
fffd38bc 162 bool pending;
203fea01
AU
163 __u8 instance;
164 __u32 flags;
912098a6 165 __u16 timeout;
5d900e46 166 __u16 remaining_time;
d2609b34 167 __u16 duration;
203fea01
AU
168 __u16 adv_data_len;
169 __u8 adv_data[HCI_MAX_AD_LENGTH];
170 __u16 scan_rsp_len;
171 __u8 scan_rsp_data[HCI_MAX_AD_LENGTH];
172};
173
db25be66 174#define HCI_MAX_ADV_INSTANCES 5
d2609b34
FG
175#define HCI_DEFAULT_ADV_DURATION 2
176
490c5bab
JH
177#define HCI_MAX_SHORT_NAME_LENGTH 10
178
d6bfd59c
JH
179/* Default LE RPA expiry time, 15 minutes */
180#define HCI_DEFAULT_RPA_TIMEOUT (15 * 60)
181
31ad1691
AK
182/* Default min/max age of connection information (1s/3s) */
183#define DEFAULT_CONN_INFO_MIN_AGE 1000
184#define DEFAULT_CONN_INFO_MAX_AGE 3000
185
903e4541
AE
186struct amp_assoc {
187 __u16 len;
188 __u16 offset;
93c284ee
AE
189 __u16 rem_len;
190 __u16 len_so_far;
903e4541
AE
191 __u8 data[HCI_MAX_AMP_ASSOC_SIZE];
192};
193
d2c5d77f 194#define HCI_MAX_PAGES 3
cad718ed 195
1da177e4
LT
196struct hci_dev {
197 struct list_head list;
09fd0de5 198 struct mutex lock;
1da177e4
LT
199
200 char name[8];
201 unsigned long flags;
202 __u16 id;
c13854ce 203 __u8 bus;
943da25d 204 __u8 dev_type;
1da177e4 205 bdaddr_t bdaddr;
e30d3f5f 206 bdaddr_t setup_addr;
24c457e2 207 bdaddr_t public_addr;
7a4cd51d 208 bdaddr_t random_addr;
d13eafce 209 bdaddr_t static_addr;
56ed2cb8 210 __u8 adv_addr_type;
1f6c6378 211 __u8 dev_name[HCI_MAX_NAME_LENGTH];
490c5bab 212 __u8 short_name[HCI_MAX_SHORT_NAME_LENGTH];
80a1e1db 213 __u8 eir[HCI_MAX_EIR_LENGTH];
a9de9248 214 __u8 dev_class[3];
1aff6f09
JH
215 __u8 major_class;
216 __u8 minor_class;
d2c5d77f 217 __u8 max_page;
cad718ed 218 __u8 features[HCI_MAX_PAGES][8];
60e77321 219 __u8 le_features[8];
cf1d081f 220 __u8 le_white_list_size;
9b008c04 221 __u8 le_states[8];
a9de9248 222 __u8 commands[64];
1143e5a6
MH
223 __u8 hci_ver;
224 __u16 hci_rev;
d5859e22 225 __u8 lmp_ver;
1143e5a6 226 __u16 manufacturer;
7d69230c 227 __u16 lmp_subver;
1da177e4 228 __u16 voice_setting;
b4cb9fb2 229 __u8 num_iac;
c2f0f979
MH
230 __u8 stored_max_keys;
231 __u8 stored_num_keys;
17fa4b9d 232 __u8 io_capability;
91c4e9b1 233 __s8 inq_tx_power;
f332ec66
JH
234 __u16 page_scan_interval;
235 __u16 page_scan_window;
236 __u8 page_scan_type;
3f959d46 237 __u8 le_adv_channel_map;
628531c9
GL
238 __u16 le_adv_min_interval;
239 __u16 le_adv_max_interval;
533553f8 240 __u8 le_scan_type;
bef64738
MH
241 __u16 le_scan_interval;
242 __u16 le_scan_window;
4e70c7e7
MH
243 __u16 le_conn_min_interval;
244 __u16 le_conn_max_interval;
04fb7d90
MH
245 __u16 le_conn_latency;
246 __u16 le_supv_timeout;
a8e1bfaa
MH
247 __u16 le_def_tx_len;
248 __u16 le_def_tx_time;
249 __u16 le_max_tx_len;
250 __u16 le_max_tx_time;
251 __u16 le_max_rx_len;
252 __u16 le_max_rx_time;
b9a7a61e 253 __u16 discov_interleaved_timeout;
31ad1691
AK
254 __u16 conn_info_min_age;
255 __u16 conn_info_max_age;
06f5b778 256 __u8 ssp_debug_mode;
c7741d16 257 __u8 hw_error_code;
33f35721 258 __u32 clock;
f332ec66 259
2b9be137
MH
260 __u16 devid_source;
261 __u16 devid_vendor;
262 __u16 devid_product;
263 __u16 devid_version;
1da177e4
LT
264
265 __u16 pkt_type;
5b7f9909 266 __u16 esco_type;
1da177e4
LT
267 __u16 link_policy;
268 __u16 link_mode;
269
04837f64
MH
270 __u32 idle_timeout;
271 __u16 sniff_min_interval;
272 __u16 sniff_max_interval;
273
928abaa7
AE
274 __u8 amp_status;
275 __u32 amp_total_bw;
276 __u32 amp_max_bw;
277 __u32 amp_min_latency;
278 __u32 amp_max_pdu;
279 __u8 amp_type;
280 __u16 amp_pal_cap;
281 __u16 amp_assoc_size;
282 __u32 amp_max_flush_to;
283 __u32 amp_be_flush_to;
284
903e4541
AE
285 struct amp_assoc loc_assoc;
286
1e89cffb
AE
287 __u8 flow_ctl_mode;
288
9f61656a
JH
289 unsigned int auto_accept_delay;
290
1da177e4
LT
291 unsigned long quirks;
292
293 atomic_t cmd_cnt;
294 unsigned int acl_cnt;
295 unsigned int sco_cnt;
6ed58ec5 296 unsigned int le_cnt;
1da177e4
LT
297
298 unsigned int acl_mtu;
299 unsigned int sco_mtu;
6ed58ec5 300 unsigned int le_mtu;
1da177e4
LT
301 unsigned int acl_pkts;
302 unsigned int sco_pkts;
6ed58ec5 303 unsigned int le_pkts;
1da177e4 304
350ee4cf
AE
305 __u16 block_len;
306 __u16 block_mtu;
307 __u16 num_blocks;
308 __u16 block_cnt;
309
1da177e4
LT
310 unsigned long acl_last_tx;
311 unsigned long sco_last_tx;
6ed58ec5 312 unsigned long le_last_tx;
1da177e4 313
f48fd9c8 314 struct workqueue_struct *workqueue;
6ead1bbc 315 struct workqueue_struct *req_workqueue;
f48fd9c8 316
ab81cbf9 317 struct work_struct power_on;
3243553f 318 struct delayed_work power_off;
c7741d16 319 struct work_struct error_reset;
ab81cbf9 320
16ab91ab
JH
321 __u16 discov_timeout;
322 struct delayed_work discov_off;
323
7d78525d
JH
324 struct delayed_work service_cache;
325
65cc2b49 326 struct delayed_work cmd_timer;
b78752cc
MH
327
328 struct work_struct rx_work;
c347b765 329 struct work_struct cmd_work;
3eff45ea 330 struct work_struct tx_work;
1da177e4 331
e68f072b 332 struct work_struct discov_update;
2e93e53b 333 struct work_struct bg_scan_update;
01b1cb87 334 struct work_struct scan_update;
53c0ba74 335 struct work_struct connectable_update;
aed1a885 336 struct work_struct discoverable_update;
7c1fbed2
JH
337 struct delayed_work le_scan_disable;
338 struct delayed_work le_scan_restart;
2e93e53b 339
1da177e4
LT
340 struct sk_buff_head rx_q;
341 struct sk_buff_head raw_q;
342 struct sk_buff_head cmd_q;
343
344 struct sk_buff *sent_cmd;
345
a6a67efd 346 struct mutex req_lock;
1da177e4
LT
347 wait_queue_head_t req_wait_q;
348 __u32 req_status;
349 __u32 req_result;
f60cb305 350 struct sk_buff *req_skb;
a5040efa 351
70db83c4 352 void *smp_data;
ef8efe4b 353 void *smp_bredr_data;
2e58ef3e 354
30883512 355 struct discovery_state discovery;
1da177e4
LT
356 struct hci_conn_hash conn_hash;
357
5c136e90
AG
358 struct list_head mgmt_pending;
359 struct list_head blacklist;
6659358e 360 struct list_head whitelist;
2aeb9a1a 361 struct list_head uuids;
55ed8ca1 362 struct list_head link_keys;
b899efaf 363 struct list_head long_term_keys;
970c4e46 364 struct list_head identity_resolving_keys;
2763eda6 365 struct list_head remote_oob_data;
d2ab0ac1 366 struct list_head le_white_list;
15819a70 367 struct list_head le_conn_params;
77a77a30 368 struct list_head pend_le_conns;
66f8455a 369 struct list_head pend_le_reports;
2763eda6 370
1da177e4
LT
371 struct hci_dev_stats stat;
372
70f23020 373 atomic_t promisc;
1da177e4 374
5177a838
MH
375 const char *hw_info;
376 const char *fw_info;
ca325f69
MH
377 struct dentry *debugfs;
378
a91f2e39 379 struct device dev;
1da177e4 380
611b30f7
MH
381 struct rfkill *rfkill;
382
eacb44df 383 DECLARE_BITMAP(dev_flags, __HCI_NUM_FLAGS);
d23264a8 384
8fa19098 385 __s8 adv_tx_power;
3f0f524b
JH
386 __u8 adv_data[HCI_MAX_AD_LENGTH];
387 __u8 adv_data_len;
f8e808bd
MH
388 __u8 scan_rsp_data[HCI_MAX_AD_LENGTH];
389 __u8 scan_rsp_data_len;
8fa19098 390
d2609b34
FG
391 struct list_head adv_instances;
392 unsigned int adv_instance_cnt;
393 __u8 cur_adv_instance;
5d900e46
FG
394 __u16 adv_instance_timeout;
395 struct delayed_work adv_instance_expire;
203fea01 396
863efaf2 397 __u8 irk[16];
d6bfd59c
JH
398 __u32 rpa_timeout;
399 struct delayed_work rpa_expired;
2b5224dc 400 bdaddr_t rpa;
863efaf2 401
6d5d2ee6
HK
402 struct led_trigger *power_led;
403
1da177e4
LT
404 int (*open)(struct hci_dev *hdev);
405 int (*close)(struct hci_dev *hdev);
406 int (*flush)(struct hci_dev *hdev);
f41c70c4 407 int (*setup)(struct hci_dev *hdev);
a44fecbd 408 int (*shutdown)(struct hci_dev *hdev);
7bd8f09f 409 int (*send)(struct hci_dev *hdev, struct sk_buff *skb);
1da177e4 410 void (*notify)(struct hci_dev *hdev, unsigned int evt);
c7741d16 411 void (*hw_error)(struct hci_dev *hdev, u8 code);
98a63aaf 412 int (*post_init)(struct hci_dev *hdev);
4b4113d6 413 int (*set_diag)(struct hci_dev *hdev, bool enable);
24c457e2 414 int (*set_bdaddr)(struct hci_dev *hdev, const bdaddr_t *bdaddr);
1da177e4
LT
415};
416
53502d69
AE
417#define HCI_PHY_HANDLE(handle) (handle & 0xff)
418
1da177e4
LT
419struct hci_conn {
420 struct list_head list;
421
adc4266d 422 atomic_t refcnt;
adc4266d
SJ
423
424 bdaddr_t dst;
5a9d0a3f 425 __u8 dst_type;
662e8820 426 bdaddr_t src;
e7c4096e 427 __u8 src_type;
cb1d68f7
JH
428 bdaddr_t init_addr;
429 __u8 init_addr_type;
430 bdaddr_t resp_addr;
431 __u8 resp_addr_type;
adc4266d
SJ
432 __u16 handle;
433 __u16 state;
434 __u8 mode;
435 __u8 type;
40bef302 436 __u8 role;
a0c808b3 437 bool out;
adc4266d
SJ
438 __u8 attempt;
439 __u8 dev_class[3];
cad718ed 440 __u8 features[HCI_MAX_PAGES][8];
adc4266d
SJ
441 __u16 pkt_type;
442 __u16 link_policy;
13d39315 443 __u8 key_type;
adc4266d
SJ
444 __u8 auth_type;
445 __u8 sec_level;
446 __u8 pending_sec_level;
447 __u8 pin_length;
726b4ffc 448 __u8 enc_key_size;
adc4266d 449 __u8 io_capability;
92a25256
JH
450 __u32 passkey_notify;
451 __u8 passkey_entered;
adc4266d 452 __u16 disc_timeout;
09ae260b 453 __u16 conn_timeout;
10c62ddc 454 __u16 setting;
1e406eef
AG
455 __u16 le_conn_min_interval;
456 __u16 le_conn_max_interval;
e04fde60
MH
457 __u16 le_conn_interval;
458 __u16 le_conn_latency;
459 __u16 le_supv_timeout;
fd45ada9
AA
460 __u8 le_adv_data[HCI_MAX_AD_LENGTH];
461 __u8 le_adv_data_len;
5ae76a94 462 __s8 rssi;
5a134fae 463 __s8 tx_power;
d0455ed9 464 __s8 max_tx_power;
51a8efd7 465 unsigned long flags;
04837f64 466
33f35721
JH
467 __u32 clock;
468 __u16 clock_accuracy;
469
dd983808
AK
470 unsigned long conn_info_timestamp;
471
03b555e1 472 __u8 remote_cap;
03b555e1 473 __u8 remote_auth;
3161ae1c 474 __u8 remote_id;
03b555e1 475
adc4266d 476 unsigned int sent;
04837f64 477
1da177e4 478 struct sk_buff_head data_q;
2c33c06a 479 struct list_head chan_list;
1da177e4 480
19c40e3b 481 struct delayed_work disc_work;
7bc18d9d 482 struct delayed_work auto_accept_work;
a74a84f6 483 struct delayed_work idle_work;
9489eca4 484 struct delayed_work le_conn_timeout;
8ce783dc 485 struct work_struct le_scan_cleanup;
04837f64 486
b219e3ac 487 struct device dev;
23b9ceb7 488 struct dentry *debugfs;
b219e3ac 489
1da177e4
LT
490 struct hci_dev *hdev;
491 void *l2cap_data;
492 void *sco_data;
9740e49d 493 struct amp_mgr *amp_mgr;
1da177e4
LT
494
495 struct hci_conn *link;
e9a416b5
JH
496
497 void (*connect_cfm_cb) (struct hci_conn *conn, u8 status);
498 void (*security_cfm_cb) (struct hci_conn *conn, u8 status);
499 void (*disconn_cfm_cb) (struct hci_conn *conn, u8 reason);
1da177e4
LT
500};
501
73d80deb
LAD
502struct hci_chan {
503 struct list_head list;
42c4e53e 504 __u16 handle;
73d80deb
LAD
505 struct hci_conn *conn;
506 struct sk_buff_head data_q;
507 unsigned int sent;
168df8e5 508 __u8 state;
73d80deb
LAD
509};
510
15819a70
AG
511struct hci_conn_params {
512 struct list_head list;
93450c75 513 struct list_head action;
15819a70
AG
514
515 bdaddr_t addr;
516 u8 addr_type;
517
518 u16 conn_min_interval;
519 u16 conn_max_interval;
f044eb05
MH
520 u16 conn_latency;
521 u16 supervision_timeout;
9fcb18ef
AG
522
523 enum {
524 HCI_AUTO_CONN_DISABLED,
a3451d27 525 HCI_AUTO_CONN_REPORT,
4b9e7e75 526 HCI_AUTO_CONN_DIRECT,
9fcb18ef
AG
527 HCI_AUTO_CONN_ALWAYS,
528 HCI_AUTO_CONN_LINK_LOSS,
158e9218 529 HCI_AUTO_CONN_EXPLICIT,
9fcb18ef 530 } auto_connect;
f161dd41
JH
531
532 struct hci_conn *conn;
158e9218 533 bool explicit_connect;
15819a70
AG
534};
535
1da177e4
LT
536extern struct list_head hci_dev_list;
537extern struct list_head hci_cb_list;
538extern rwlock_t hci_dev_list_lock;
fba7ecf0 539extern struct mutex hci_cb_list_lock;
1da177e4 540
eacb44df
MH
541#define hci_dev_set_flag(hdev, nr) set_bit((nr), (hdev)->dev_flags)
542#define hci_dev_clear_flag(hdev, nr) clear_bit((nr), (hdev)->dev_flags)
543#define hci_dev_change_flag(hdev, nr) change_bit((nr), (hdev)->dev_flags)
544#define hci_dev_test_flag(hdev, nr) test_bit((nr), (hdev)->dev_flags)
545#define hci_dev_test_and_set_flag(hdev, nr) test_and_set_bit((nr), (hdev)->dev_flags)
546#define hci_dev_test_and_clear_flag(hdev, nr) test_and_clear_bit((nr), (hdev)->dev_flags)
547#define hci_dev_test_and_change_flag(hdev, nr) test_and_change_bit((nr), (hdev)->dev_flags)
548
549#define hci_dev_clear_volatile_flags(hdev) \
550 do { \
551 hci_dev_clear_flag(hdev, HCI_LE_SCAN); \
552 hci_dev_clear_flag(hdev, HCI_LE_ADV); \
553 hci_dev_clear_flag(hdev, HCI_PERIODIC_INQ); \
554 } while (0)
516018a9 555
686ebf28 556/* ----- HCI interface to upper protocols ----- */
e74e58f8 557int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr);
e74e58f8 558int l2cap_disconn_ind(struct hci_conn *hcon);
9b4c3336 559void l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags);
e74e58f8 560
ff50e8af 561#if IS_ENABLED(CONFIG_BT_BREDR)
e74e58f8 562int sco_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags);
9b4c3336 563void sco_recv_scodata(struct hci_conn *hcon, struct sk_buff *skb);
ff50e8af
AW
564#else
565static inline int sco_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr,
566 __u8 *flags)
567{
568 return 0;
569}
570
571static inline void sco_recv_scodata(struct hci_conn *hcon, struct sk_buff *skb)
572{
573}
574#endif
686ebf28 575
1da177e4 576/* ----- Inquiry cache ----- */
70f23020
AE
577#define INQUIRY_CACHE_AGE_MAX (HZ*30) /* 30 seconds */
578#define INQUIRY_ENTRY_AGE_MAX (HZ*60) /* 60 seconds */
1da177e4 579
30883512 580static inline void discovery_init(struct hci_dev *hdev)
1da177e4 581{
ff9ef578 582 hdev->discovery.state = DISCOVERY_STOPPED;
30883512
JH
583 INIT_LIST_HEAD(&hdev->discovery.all);
584 INIT_LIST_HEAD(&hdev->discovery.unknown);
585 INIT_LIST_HEAD(&hdev->discovery.resolve);
da25cf6a 586 hdev->discovery.report_invalid_rssi = true;
37eab042 587 hdev->discovery.rssi = HCI_RSSI_INVALID;
1da177e4
LT
588}
589
0256325e
MH
590static inline void hci_discovery_filter_clear(struct hci_dev *hdev)
591{
82f8b651 592 hdev->discovery.result_filtering = false;
da25cf6a 593 hdev->discovery.report_invalid_rssi = true;
0256325e
MH
594 hdev->discovery.rssi = HCI_RSSI_INVALID;
595 hdev->discovery.uuid_count = 0;
596 kfree(hdev->discovery.uuids);
597 hdev->discovery.uuids = NULL;
2d28cfe7
JP
598 hdev->discovery.scan_start = 0;
599 hdev->discovery.scan_duration = 0;
0256325e
MH
600}
601
30dc78e1
JH
602bool hci_discovery_active(struct hci_dev *hdev);
603
ff9ef578
JH
604void hci_discovery_set_state(struct hci_dev *hdev, int state);
605
1da177e4
LT
606static inline int inquiry_cache_empty(struct hci_dev *hdev)
607{
30883512 608 return list_empty(&hdev->discovery.all);
1da177e4
LT
609}
610
611static inline long inquiry_cache_age(struct hci_dev *hdev)
612{
30883512 613 struct discovery_state *c = &hdev->discovery;
1da177e4
LT
614 return jiffies - c->timestamp;
615}
616
617static inline long inquiry_entry_age(struct inquiry_entry *e)
618{
619 return jiffies - e->timestamp;
620}
621
5a9d0a3f 622struct inquiry_entry *hci_inquiry_cache_lookup(struct hci_dev *hdev,
04124681 623 bdaddr_t *bdaddr);
561aafbc 624struct inquiry_entry *hci_inquiry_cache_lookup_unknown(struct hci_dev *hdev,
04124681 625 bdaddr_t *bdaddr);
30dc78e1 626struct inquiry_entry *hci_inquiry_cache_lookup_resolve(struct hci_dev *hdev,
04124681
GP
627 bdaddr_t *bdaddr,
628 int state);
a3d4e20a 629void hci_inquiry_cache_update_resolve(struct hci_dev *hdev,
04124681 630 struct inquiry_entry *ie);
af58925c
MH
631u32 hci_inquiry_cache_update(struct hci_dev *hdev, struct inquiry_data *data,
632 bool name_known);
1f9b9a5d 633void hci_inquiry_cache_flush(struct hci_dev *hdev);
1da177e4
LT
634
635/* ----- HCI Connections ----- */
636enum {
637 HCI_CONN_AUTH_PEND,
19f8def0 638 HCI_CONN_REAUTH_PEND,
1da177e4 639 HCI_CONN_ENCRYPT_PEND,
04837f64
MH
640 HCI_CONN_RSWITCH_PEND,
641 HCI_CONN_MODE_CHANGE_PEND,
e73439d8 642 HCI_CONN_SCO_SETUP_PEND,
b644ba33 643 HCI_CONN_MGMT_CONNECTED,
58a681ef 644 HCI_CONN_SSP_ENABLED,
eb9a8f3f 645 HCI_CONN_SC_ENABLED,
abf76bad 646 HCI_CONN_AES_CCM,
58a681ef 647 HCI_CONN_POWER_SAVE,
af6a9c32 648 HCI_CONN_FLUSH_KEY,
4dae2798
JH
649 HCI_CONN_ENCRYPT,
650 HCI_CONN_AUTH,
651 HCI_CONN_SECURE,
652 HCI_CONN_FIPS,
fe59a05f 653 HCI_CONN_STK_ENCRYPT,
977f8fce 654 HCI_CONN_AUTH_INITIATOR,
f94b665d 655 HCI_CONN_DROP,
89cbb063 656 HCI_CONN_PARAM_REMOVAL_PEND,
fe8bc5ac 657 HCI_CONN_NEW_LINK_KEY,
158e9218 658 HCI_CONN_SCANNING,
160b9251 659 HCI_CONN_AUTH_FAILURE,
1da177e4
LT
660};
661
aa64a8b5
JH
662static inline bool hci_conn_ssp_enabled(struct hci_conn *conn)
663{
664 struct hci_dev *hdev = conn->hdev;
d7a5a11d 665 return hci_dev_test_flag(hdev, HCI_SSP_ENABLED) &&
c3c7ea65 666 test_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
aa64a8b5
JH
667}
668
eb9a8f3f
MH
669static inline bool hci_conn_sc_enabled(struct hci_conn *conn)
670{
671 struct hci_dev *hdev = conn->hdev;
d7a5a11d 672 return hci_dev_test_flag(hdev, HCI_SC_ENABLED) &&
eb9a8f3f
MH
673 test_bit(HCI_CONN_SC_ENABLED, &conn->flags);
674}
675
1da177e4
LT
676static inline void hci_conn_hash_add(struct hci_dev *hdev, struct hci_conn *c)
677{
678 struct hci_conn_hash *h = &hdev->conn_hash;
bf4c6325 679 list_add_rcu(&c->list, &h->list);
fcd89c09
VT
680 switch (c->type) {
681 case ACL_LINK:
1da177e4 682 h->acl_num++;
fcd89c09 683 break;
bd1eb66b
AE
684 case AMP_LINK:
685 h->amp_num++;
686 break;
fcd89c09
VT
687 case LE_LINK:
688 h->le_num++;
f8218dc6
JH
689 if (c->role == HCI_ROLE_SLAVE)
690 h->le_num_slave++;
fcd89c09
VT
691 break;
692 case SCO_LINK:
693 case ESCO_LINK:
1da177e4 694 h->sco_num++;
fcd89c09
VT
695 break;
696 }
1da177e4
LT
697}
698
699static inline void hci_conn_hash_del(struct hci_dev *hdev, struct hci_conn *c)
700{
701 struct hci_conn_hash *h = &hdev->conn_hash;
bf4c6325
GP
702
703 list_del_rcu(&c->list);
704 synchronize_rcu();
705
fcd89c09
VT
706 switch (c->type) {
707 case ACL_LINK:
1da177e4 708 h->acl_num--;
fcd89c09 709 break;
bd1eb66b
AE
710 case AMP_LINK:
711 h->amp_num--;
712 break;
fcd89c09
VT
713 case LE_LINK:
714 h->le_num--;
f8218dc6
JH
715 if (c->role == HCI_ROLE_SLAVE)
716 h->le_num_slave--;
fcd89c09
VT
717 break;
718 case SCO_LINK:
719 case ESCO_LINK:
1da177e4 720 h->sco_num--;
fcd89c09
VT
721 break;
722 }
1da177e4
LT
723}
724
52087a79
LAD
725static inline unsigned int hci_conn_num(struct hci_dev *hdev, __u8 type)
726{
727 struct hci_conn_hash *h = &hdev->conn_hash;
728 switch (type) {
729 case ACL_LINK:
730 return h->acl_num;
bd1eb66b
AE
731 case AMP_LINK:
732 return h->amp_num;
52087a79
LAD
733 case LE_LINK:
734 return h->le_num;
735 case SCO_LINK:
736 case ESCO_LINK:
737 return h->sco_num;
738 default:
739 return 0;
740 }
741}
742
f4f07505
JH
743static inline unsigned int hci_conn_count(struct hci_dev *hdev)
744{
745 struct hci_conn_hash *c = &hdev->conn_hash;
746
747 return c->acl_num + c->amp_num + c->sco_num + c->le_num;
748}
749
845472e8
MH
750static inline __u8 hci_conn_lookup_type(struct hci_dev *hdev, __u16 handle)
751{
752 struct hci_conn_hash *h = &hdev->conn_hash;
753 struct hci_conn *c;
754 __u8 type = INVALID_LINK;
755
756 rcu_read_lock();
757
758 list_for_each_entry_rcu(c, &h->list, list) {
759 if (c->handle == handle) {
760 type = c->type;
761 break;
762 }
763 }
764
765 rcu_read_unlock();
766
767 return type;
768}
769
1da177e4 770static inline struct hci_conn *hci_conn_hash_lookup_handle(struct hci_dev *hdev,
adc4266d 771 __u16 handle)
1da177e4
LT
772{
773 struct hci_conn_hash *h = &hdev->conn_hash;
1da177e4
LT
774 struct hci_conn *c;
775
bf4c6325
GP
776 rcu_read_lock();
777
778 list_for_each_entry_rcu(c, &h->list, list) {
779 if (c->handle == handle) {
780 rcu_read_unlock();
1da177e4 781 return c;
bf4c6325 782 }
1da177e4 783 }
bf4c6325
GP
784 rcu_read_unlock();
785
1da177e4
LT
786 return NULL;
787}
788
789static inline struct hci_conn *hci_conn_hash_lookup_ba(struct hci_dev *hdev,
adc4266d 790 __u8 type, bdaddr_t *ba)
1da177e4
LT
791{
792 struct hci_conn_hash *h = &hdev->conn_hash;
1da177e4
LT
793 struct hci_conn *c;
794
bf4c6325
GP
795 rcu_read_lock();
796
797 list_for_each_entry_rcu(c, &h->list, list) {
798 if (c->type == type && !bacmp(&c->dst, ba)) {
799 rcu_read_unlock();
1da177e4 800 return c;
bf4c6325 801 }
1da177e4 802 }
bf4c6325
GP
803
804 rcu_read_unlock();
805
1da177e4
LT
806 return NULL;
807}
808
1b51c7b6
JH
809static inline struct hci_conn *hci_conn_hash_lookup_le(struct hci_dev *hdev,
810 bdaddr_t *ba,
811 __u8 ba_type)
812{
813 struct hci_conn_hash *h = &hdev->conn_hash;
814 struct hci_conn *c;
815
816 rcu_read_lock();
817
818 list_for_each_entry_rcu(c, &h->list, list) {
819 if (c->type != LE_LINK)
820 continue;
821
822 if (ba_type == c->dst_type && !bacmp(&c->dst, ba)) {
823 rcu_read_unlock();
824 return c;
825 }
826 }
827
828 rcu_read_unlock();
829
830 return NULL;
831}
832
4c67bc74 833static inline struct hci_conn *hci_conn_hash_lookup_state(struct hci_dev *hdev,
adc4266d 834 __u8 type, __u16 state)
4c67bc74
MH
835{
836 struct hci_conn_hash *h = &hdev->conn_hash;
4c67bc74
MH
837 struct hci_conn *c;
838
bf4c6325
GP
839 rcu_read_lock();
840
841 list_for_each_entry_rcu(c, &h->list, list) {
842 if (c->type == type && c->state == state) {
843 rcu_read_unlock();
4c67bc74 844 return c;
bf4c6325 845 }
4c67bc74 846 }
73d80deb 847
bf4c6325 848 rcu_read_unlock();
73d80deb 849
4c67bc74 850 return NULL;
73d80deb
LAD
851}
852
e7d9ab73
JP
853static inline struct hci_conn *hci_lookup_le_connect(struct hci_dev *hdev)
854{
855 struct hci_conn_hash *h = &hdev->conn_hash;
856 struct hci_conn *c;
857
858 rcu_read_lock();
859
860 list_for_each_entry_rcu(c, &h->list, list) {
861 if (c->type == LE_LINK && c->state == BT_CONNECT &&
862 !test_bit(HCI_CONN_SCANNING, &c->flags)) {
863 rcu_read_unlock();
864 return c;
865 }
866 }
867
868 rcu_read_unlock();
869
870 return NULL;
871}
872
e3b679d5 873int hci_disconnect(struct hci_conn *conn, __u8 reason);
2dea632f 874bool hci_setup_sync(struct hci_conn *conn, __u16 handle);
e73439d8 875void hci_sco_setup(struct hci_conn *conn, __u8 status);
1da177e4 876
a5c4e309
JH
877struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst,
878 u8 role);
a9de9248
MH
879int hci_conn_del(struct hci_conn *conn);
880void hci_conn_hash_flush(struct hci_dev *hdev);
881void hci_conn_check_pending(struct hci_dev *hdev);
1da177e4 882
73d80deb 883struct hci_chan *hci_chan_create(struct hci_conn *conn);
9472007c 884void hci_chan_del(struct hci_chan *chan);
2c33c06a 885void hci_chan_list_flush(struct hci_conn *conn);
42c4e53e 886struct hci_chan *hci_chan_lookup_handle(struct hci_dev *hdev, __u16 handle);
73d80deb 887
f75113a2
JP
888struct hci_conn *hci_connect_le_scan(struct hci_dev *hdev, bdaddr_t *dst,
889 u8 dst_type, u8 sec_level,
0ad06aa6 890 u16 conn_timeout);
04a6c589 891struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst,
cdd6275e 892 u8 dst_type, u8 sec_level, u16 conn_timeout,
e804d25d 893 u8 role);
04a6c589
AG
894struct hci_conn *hci_connect_acl(struct hci_dev *hdev, bdaddr_t *dst,
895 u8 sec_level, u8 auth_type);
10c62ddc
FD
896struct hci_conn *hci_connect_sco(struct hci_dev *hdev, int type, bdaddr_t *dst,
897 __u16 setting);
e7c29cb1 898int hci_conn_check_link_mode(struct hci_conn *conn);
b3b1b061 899int hci_conn_check_secure(struct hci_conn *conn, __u8 sec_level);
e7cafc45
JH
900int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type,
901 bool initiator);
8c1b2355 902int hci_conn_switch_role(struct hci_conn *conn, __u8 role);
1da177e4 903
14b12d0b 904void hci_conn_enter_active_mode(struct hci_conn *conn, __u8 force_active);
1da177e4 905
06c053fb
AG
906void hci_le_conn_failed(struct hci_conn *conn, u8 status);
907
8d12356f
DH
908/*
909 * hci_conn_get() and hci_conn_put() are used to control the life-time of an
910 * "hci_conn" object. They do not guarantee that the hci_conn object is running,
911 * working or anything else. They just guarantee that the object is available
912 * and can be dereferenced. So you can use its locks, local variables and any
913 * other constant data.
914 * Before accessing runtime data, you _must_ lock the object and then check that
915 * it is still running. As soon as you release the locks, the connection might
916 * get dropped, though.
917 *
918 * On the other hand, hci_conn_hold() and hci_conn_drop() are used to control
919 * how long the underlying connection is held. So every channel that runs on the
920 * hci_conn object calls this to prevent the connection from disappearing. As
921 * long as you hold a device, you must also guarantee that you have a valid
922 * reference to the device via hci_conn_get() (or the initial reference from
923 * hci_conn_add()).
924 * The hold()/drop() ref-count is known to drop below 0 sometimes, which doesn't
925 * break because nobody cares for that. But this means, we cannot use
926 * _get()/_drop() in it, but require the caller to have a valid ref (FIXME).
927 */
928
51bb8457 929static inline struct hci_conn *hci_conn_get(struct hci_conn *conn)
8d12356f
DH
930{
931 get_device(&conn->dev);
51bb8457 932 return conn;
8d12356f
DH
933}
934
935static inline void hci_conn_put(struct hci_conn *conn)
936{
937 put_device(&conn->dev);
938}
939
1da177e4
LT
940static inline void hci_conn_hold(struct hci_conn *conn)
941{
71becf0c 942 BT_DBG("hcon %p orig refcnt %d", conn, atomic_read(&conn->refcnt));
38b3fef1 943
1da177e4 944 atomic_inc(&conn->refcnt);
2f304d1e 945 cancel_delayed_work(&conn->disc_work);
1da177e4
LT
946}
947
76a68ba0 948static inline void hci_conn_drop(struct hci_conn *conn)
1da177e4 949{
71becf0c 950 BT_DBG("hcon %p orig refcnt %d", conn, atomic_read(&conn->refcnt));
38b3fef1 951
1da177e4 952 if (atomic_dec_and_test(&conn->refcnt)) {
04837f64 953 unsigned long timeo;
716e4ab5
AE
954
955 switch (conn->type) {
956 case ACL_LINK:
957 case LE_LINK:
a74a84f6 958 cancel_delayed_work(&conn->idle_work);
6ac59344 959 if (conn->state == BT_CONNECTED) {
5f246e89 960 timeo = conn->disc_timeout;
6ac59344 961 if (!conn->out)
052b30b0 962 timeo *= 2;
5a9d0a3f 963 } else {
eb78d7e5 964 timeo = 0;
5a9d0a3f 965 }
716e4ab5
AE
966 break;
967
968 case AMP_LINK:
969 timeo = conn->disc_timeout;
970 break;
971
972 default:
eb78d7e5 973 timeo = 0;
716e4ab5 974 break;
5a9d0a3f 975 }
716e4ab5 976
2f304d1e 977 cancel_delayed_work(&conn->disc_work);
19c40e3b 978 queue_delayed_work(conn->hdev->workqueue,
716e4ab5 979 &conn->disc_work, timeo);
1da177e4
LT
980 }
981}
982
1da177e4 983/* ----- HCI Devices ----- */
dc946bd8 984static inline void hci_dev_put(struct hci_dev *d)
1da177e4 985{
376261ae
AE
986 BT_DBG("%s orig refcnt %d", d->name,
987 atomic_read(&d->dev.kobj.kref.refcount));
988
4c724c71 989 put_device(&d->dev);
1da177e4
LT
990}
991
dc946bd8 992static inline struct hci_dev *hci_dev_hold(struct hci_dev *d)
1da177e4 993{
376261ae
AE
994 BT_DBG("%s orig refcnt %d", d->name,
995 atomic_read(&d->dev.kobj.kref.refcount));
996
4c724c71 997 get_device(&d->dev);
1da177e4
LT
998 return d;
999}
1000
09fd0de5
GP
1001#define hci_dev_lock(d) mutex_lock(&d->lock)
1002#define hci_dev_unlock(d) mutex_unlock(&d->lock)
1da177e4 1003
aa2b86d7 1004#define to_hci_dev(d) container_of(d, struct hci_dev, dev)
3dc07322 1005#define to_hci_conn(c) container_of(c, struct hci_conn, dev)
aa2b86d7 1006
155961e8
DH
1007static inline void *hci_get_drvdata(struct hci_dev *hdev)
1008{
1009 return dev_get_drvdata(&hdev->dev);
1010}
1011
1012static inline void hci_set_drvdata(struct hci_dev *hdev, void *data)
1013{
1014 dev_set_drvdata(&hdev->dev, data);
1015}
1016
1da177e4 1017struct hci_dev *hci_dev_get(int index);
0c0afedf 1018struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src);
1da177e4
LT
1019
1020struct hci_dev *hci_alloc_dev(void);
1021void hci_free_dev(struct hci_dev *hdev);
1022int hci_register_dev(struct hci_dev *hdev);
59735631 1023void hci_unregister_dev(struct hci_dev *hdev);
1da177e4
LT
1024int hci_suspend_dev(struct hci_dev *hdev);
1025int hci_resume_dev(struct hci_dev *hdev);
75e0569f 1026int hci_reset_dev(struct hci_dev *hdev);
f962fe32
MH
1027int hci_recv_frame(struct hci_dev *hdev, struct sk_buff *skb);
1028int hci_recv_diag(struct hci_dev *hdev, struct sk_buff *skb);
5177a838
MH
1029void hci_set_hw_info(struct hci_dev *hdev, const char *fmt, ...);
1030void hci_set_fw_info(struct hci_dev *hdev, const char *fmt, ...);
1da177e4
LT
1031int hci_dev_open(__u16 dev);
1032int hci_dev_close(__u16 dev);
6b3cc1db 1033int hci_dev_do_close(struct hci_dev *hdev);
1da177e4
LT
1034int hci_dev_reset(__u16 dev);
1035int hci_dev_reset_stat(__u16 dev);
1036int hci_dev_cmd(unsigned int cmd, void __user *arg);
1037int hci_get_dev_list(void __user *arg);
1038int hci_get_dev_info(void __user *arg);
1039int hci_get_conn_list(void __user *arg);
1040int hci_get_conn_info(struct hci_dev *hdev, void __user *arg);
40be492f 1041int hci_get_auth_info(struct hci_dev *hdev, void __user *arg);
1da177e4
LT
1042int hci_inquiry(void __user *arg);
1043
dcc36c16
JH
1044struct bdaddr_list *hci_bdaddr_list_lookup(struct list_head *list,
1045 bdaddr_t *bdaddr, u8 type);
1046int hci_bdaddr_list_add(struct list_head *list, bdaddr_t *bdaddr, u8 type);
1047int hci_bdaddr_list_del(struct list_head *list, bdaddr_t *bdaddr, u8 type);
1048void hci_bdaddr_list_clear(struct list_head *list);
d2ab0ac1 1049
15819a70
AG
1050struct hci_conn_params *hci_conn_params_lookup(struct hci_dev *hdev,
1051 bdaddr_t *addr, u8 addr_type);
51d167c0
MH
1052struct hci_conn_params *hci_conn_params_add(struct hci_dev *hdev,
1053 bdaddr_t *addr, u8 addr_type);
15819a70 1054void hci_conn_params_del(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type);
55af49a8 1055void hci_conn_params_clear_disabled(struct hci_dev *hdev);
15819a70 1056
501f8827
JH
1057struct hci_conn_params *hci_pend_le_action_lookup(struct list_head *list,
1058 bdaddr_t *addr,
1059 u8 addr_type);
77a77a30 1060
35f7498a 1061void hci_uuids_clear(struct hci_dev *hdev);
2aeb9a1a 1062
35f7498a 1063void hci_link_keys_clear(struct hci_dev *hdev);
55ed8ca1 1064struct link_key *hci_find_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr);
567fa2aa 1065struct link_key *hci_add_link_key(struct hci_dev *hdev, struct hci_conn *conn,
7652ff6a
JH
1066 bdaddr_t *bdaddr, u8 *val, u8 type,
1067 u8 pin_len, bool *persistent);
ca9142b8 1068struct smp_ltk *hci_add_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr,
35d70271 1069 u8 addr_type, u8 type, u8 authenticated,
fe39c7b2 1070 u8 tk[16], u8 enc_size, __le16 ediv, __le64 rand);
f3a73d97
JH
1071struct smp_ltk *hci_find_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr,
1072 u8 addr_type, u8 role);
e0b2b27e 1073int hci_remove_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 bdaddr_type);
35f7498a 1074void hci_smp_ltks_clear(struct hci_dev *hdev);
55ed8ca1
JH
1075int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr);
1076
970c4e46
JH
1077struct smp_irk *hci_find_irk_by_rpa(struct hci_dev *hdev, bdaddr_t *rpa);
1078struct smp_irk *hci_find_irk_by_addr(struct hci_dev *hdev, bdaddr_t *bdaddr,
1079 u8 addr_type);
ca9142b8
JH
1080struct smp_irk *hci_add_irk(struct hci_dev *hdev, bdaddr_t *bdaddr,
1081 u8 addr_type, u8 val[16], bdaddr_t *rpa);
a7ec7338 1082void hci_remove_irk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 addr_type);
970c4e46
JH
1083void hci_smp_irks_clear(struct hci_dev *hdev);
1084
55e76b38
JH
1085bool hci_bdaddr_is_paired(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type);
1086
35f7498a 1087void hci_remote_oob_data_clear(struct hci_dev *hdev);
2763eda6 1088struct oob_data *hci_find_remote_oob_data(struct hci_dev *hdev,
6928a924 1089 bdaddr_t *bdaddr, u8 bdaddr_type);
0798872e 1090int hci_add_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr,
6928a924 1091 u8 bdaddr_type, u8 *hash192, u8 *rand192,
81328d5c 1092 u8 *hash256, u8 *rand256);
6928a924
JH
1093int hci_remove_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr,
1094 u8 bdaddr_type);
2763eda6 1095
d2609b34
FG
1096void hci_adv_instances_clear(struct hci_dev *hdev);
1097struct adv_info *hci_find_adv_instance(struct hci_dev *hdev, u8 instance);
1098struct adv_info *hci_get_next_instance(struct hci_dev *hdev, u8 instance);
1099int hci_add_adv_instance(struct hci_dev *hdev, u8 instance, u32 flags,
1100 u16 adv_data_len, u8 *adv_data,
1101 u16 scan_rsp_len, u8 *scan_rsp_data,
1102 u16 timeout, u16 duration);
1103int hci_remove_adv_instance(struct hci_dev *hdev, u8 instance);
1104
1da177e4
LT
1105void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb);
1106
0ac7e700 1107void hci_init_sysfs(struct hci_dev *hdev);
a67e899c 1108void hci_conn_init_sysfs(struct hci_conn *conn);
b219e3ac
MH
1109void hci_conn_add_sysfs(struct hci_conn *conn);
1110void hci_conn_del_sysfs(struct hci_conn *conn);
1da177e4 1111
6935e0f5 1112#define SET_HCIDEV_DEV(hdev, pdev) ((hdev)->dev.parent = (pdev))
1da177e4
LT
1113
1114/* ----- LMP capabilities ----- */
cad718ed
JH
1115#define lmp_encrypt_capable(dev) ((dev)->features[0][0] & LMP_ENCRYPT)
1116#define lmp_rswitch_capable(dev) ((dev)->features[0][0] & LMP_RSWITCH)
1117#define lmp_hold_capable(dev) ((dev)->features[0][0] & LMP_HOLD)
1118#define lmp_sniff_capable(dev) ((dev)->features[0][0] & LMP_SNIFF)
1119#define lmp_park_capable(dev) ((dev)->features[0][1] & LMP_PARK)
1120#define lmp_inq_rssi_capable(dev) ((dev)->features[0][3] & LMP_RSSI_INQ)
1121#define lmp_esco_capable(dev) ((dev)->features[0][3] & LMP_ESCO)
1122#define lmp_bredr_capable(dev) (!((dev)->features[0][4] & LMP_NO_BREDR))
1123#define lmp_le_capable(dev) ((dev)->features[0][4] & LMP_LE)
1124#define lmp_sniffsubr_capable(dev) ((dev)->features[0][5] & LMP_SNIFF_SUBR)
1125#define lmp_pause_enc_capable(dev) ((dev)->features[0][5] & LMP_PAUSE_ENC)
1126#define lmp_ext_inq_capable(dev) ((dev)->features[0][6] & LMP_EXT_INQ)
1127#define lmp_le_br_capable(dev) (!!((dev)->features[0][6] & LMP_SIMUL_LE_BR))
1128#define lmp_ssp_capable(dev) ((dev)->features[0][6] & LMP_SIMPLE_PAIR)
1129#define lmp_no_flush_capable(dev) ((dev)->features[0][6] & LMP_NO_FLUSH)
1130#define lmp_lsto_capable(dev) ((dev)->features[0][7] & LMP_LSTO)
1131#define lmp_inq_tx_pwr_capable(dev) ((dev)->features[0][7] & LMP_INQ_TX_PWR)
1132#define lmp_ext_feat_capable(dev) ((dev)->features[0][7] & LMP_EXTFEATURES)
07a5c61e 1133#define lmp_transp_capable(dev) ((dev)->features[0][2] & LMP_TRANSPARENT)
1da177e4 1134
eead27da 1135/* ----- Extended LMP capabilities ----- */
53b834d2
MH
1136#define lmp_csb_master_capable(dev) ((dev)->features[2][0] & LMP_CSB_MASTER)
1137#define lmp_csb_slave_capable(dev) ((dev)->features[2][0] & LMP_CSB_SLAVE)
1138#define lmp_sync_train_capable(dev) ((dev)->features[2][0] & LMP_SYNC_TRAIN)
1139#define lmp_sync_scan_capable(dev) ((dev)->features[2][0] & LMP_SYNC_SCAN)
d5991585
MH
1140#define lmp_sc_capable(dev) ((dev)->features[2][1] & LMP_SC)
1141#define lmp_ping_capable(dev) ((dev)->features[2][1] & LMP_PING)
53b834d2
MH
1142
1143/* ----- Host capabilities ----- */
cad718ed 1144#define lmp_host_ssp_capable(dev) ((dev)->features[1][0] & LMP_HOST_SSP)
d5991585 1145#define lmp_host_sc_capable(dev) ((dev)->features[1][0] & LMP_HOST_SC)
cad718ed
JH
1146#define lmp_host_le_capable(dev) (!!((dev)->features[1][0] & LMP_HOST_LE))
1147#define lmp_host_le_br_capable(dev) (!!((dev)->features[1][0] & LMP_HOST_LE_BREDR))
eead27da 1148
d7a5a11d
MH
1149#define hdev_is_powered(dev) (test_bit(HCI_UP, &(dev)->flags) && \
1150 !hci_dev_test_flag(dev, HCI_AUTO_OFF))
1151#define bredr_sc_enabled(dev) (lmp_sc_capable(dev) && \
1152 hci_dev_test_flag(dev, HCI_SC_ENABLED))
432df05e 1153
1da177e4 1154/* ----- HCI protocols ----- */
20714bfe
FD
1155#define HCI_PROTO_DEFER 0x01
1156
5a9d0a3f 1157static inline int hci_proto_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr,
20714bfe 1158 __u8 type, __u8 *flags)
1da177e4 1159{
686ebf28
UF
1160 switch (type) {
1161 case ACL_LINK:
1162 return l2cap_connect_ind(hdev, bdaddr);
1da177e4 1163
686ebf28
UF
1164 case SCO_LINK:
1165 case ESCO_LINK:
20714bfe 1166 return sco_connect_ind(hdev, bdaddr, flags);
1da177e4 1167
686ebf28
UF
1168 default:
1169 BT_ERR("unknown link type %d", type);
1170 return -EINVAL;
1171 }
1da177e4
LT
1172}
1173
2950f21a 1174static inline int hci_proto_disconn_ind(struct hci_conn *conn)
1da177e4 1175{
686ebf28
UF
1176 if (conn->type != ACL_LINK && conn->type != LE_LINK)
1177 return HCI_ERROR_REMOTE_USER_TERM;
1da177e4 1178
686ebf28 1179 return l2cap_disconn_ind(conn);
2950f21a
MH
1180}
1181
1da177e4
LT
1182/* ----- HCI callbacks ----- */
1183struct hci_cb {
1184 struct list_head list;
1185
1186 char *name;
1187
539c496d 1188 void (*connect_cfm) (struct hci_conn *conn, __u8 status);
3a6d576b 1189 void (*disconn_cfm) (struct hci_conn *conn, __u8 status);
5a9d0a3f
WR
1190 void (*security_cfm) (struct hci_conn *conn, __u8 status,
1191 __u8 encrypt);
1da177e4
LT
1192 void (*key_change_cfm) (struct hci_conn *conn, __u8 status);
1193 void (*role_switch_cfm) (struct hci_conn *conn, __u8 status, __u8 role);
1194};
1195
539c496d
JH
1196static inline void hci_connect_cfm(struct hci_conn *conn, __u8 status)
1197{
1198 struct hci_cb *cb;
1199
1200 mutex_lock(&hci_cb_list_lock);
1201 list_for_each_entry(cb, &hci_cb_list, list) {
1202 if (cb->connect_cfm)
1203 cb->connect_cfm(conn, status);
1204 }
1205 mutex_unlock(&hci_cb_list_lock);
1206
1207 if (conn->connect_cfm_cb)
1208 conn->connect_cfm_cb(conn, status);
1209}
1210
3a6d576b
JH
1211static inline void hci_disconn_cfm(struct hci_conn *conn, __u8 reason)
1212{
1213 struct hci_cb *cb;
1214
1215 mutex_lock(&hci_cb_list_lock);
1216 list_for_each_entry(cb, &hci_cb_list, list) {
1217 if (cb->disconn_cfm)
1218 cb->disconn_cfm(conn, reason);
1219 }
1220 mutex_unlock(&hci_cb_list_lock);
1221
1222 if (conn->disconn_cfm_cb)
1223 conn->disconn_cfm_cb(conn, reason);
1224}
1225
1da177e4
LT
1226static inline void hci_auth_cfm(struct hci_conn *conn, __u8 status)
1227{
711584ea 1228 struct hci_cb *cb;
8c1b2355 1229 __u8 encrypt;
1da177e4 1230
51a8efd7 1231 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags))
8c1b2355
MH
1232 return;
1233
4dae2798 1234 encrypt = test_bit(HCI_CONN_ENCRYPT, &conn->flags) ? 0x01 : 0x00;
8c1b2355 1235
fba7ecf0 1236 mutex_lock(&hci_cb_list_lock);
711584ea 1237 list_for_each_entry(cb, &hci_cb_list, list) {
8c1b2355
MH
1238 if (cb->security_cfm)
1239 cb->security_cfm(conn, status, encrypt);
1da177e4 1240 }
fba7ecf0 1241 mutex_unlock(&hci_cb_list_lock);
354fe804
JH
1242
1243 if (conn->security_cfm_cb)
1244 conn->security_cfm_cb(conn, status);
1da177e4
LT
1245}
1246
5a9d0a3f
WR
1247static inline void hci_encrypt_cfm(struct hci_conn *conn, __u8 status,
1248 __u8 encrypt)
1da177e4 1249{
711584ea 1250 struct hci_cb *cb;
1da177e4 1251
435fef20
MH
1252 if (conn->sec_level == BT_SECURITY_SDP)
1253 conn->sec_level = BT_SECURITY_LOW;
1254
88167aed
VCG
1255 if (conn->pending_sec_level > conn->sec_level)
1256 conn->sec_level = conn->pending_sec_level;
1257
fba7ecf0 1258 mutex_lock(&hci_cb_list_lock);
711584ea 1259 list_for_each_entry(cb, &hci_cb_list, list) {
8c1b2355
MH
1260 if (cb->security_cfm)
1261 cb->security_cfm(conn, status, encrypt);
1da177e4 1262 }
fba7ecf0 1263 mutex_unlock(&hci_cb_list_lock);
354fe804
JH
1264
1265 if (conn->security_cfm_cb)
1266 conn->security_cfm_cb(conn, status);
1da177e4
LT
1267}
1268
1269static inline void hci_key_change_cfm(struct hci_conn *conn, __u8 status)
1270{
711584ea 1271 struct hci_cb *cb;
1da177e4 1272
fba7ecf0 1273 mutex_lock(&hci_cb_list_lock);
711584ea 1274 list_for_each_entry(cb, &hci_cb_list, list) {
1da177e4
LT
1275 if (cb->key_change_cfm)
1276 cb->key_change_cfm(conn, status);
1277 }
fba7ecf0 1278 mutex_unlock(&hci_cb_list_lock);
1da177e4
LT
1279}
1280
5a9d0a3f
WR
1281static inline void hci_role_switch_cfm(struct hci_conn *conn, __u8 status,
1282 __u8 role)
1da177e4 1283{
711584ea 1284 struct hci_cb *cb;
1da177e4 1285
fba7ecf0 1286 mutex_lock(&hci_cb_list_lock);
711584ea 1287 list_for_each_entry(cb, &hci_cb_list, list) {
1da177e4
LT
1288 if (cb->role_switch_cfm)
1289 cb->role_switch_cfm(conn, status, role);
1290 }
fba7ecf0 1291 mutex_unlock(&hci_cb_list_lock);
1da177e4
LT
1292}
1293
0d3b7f64
JH
1294static inline void *eir_get_data(u8 *eir, size_t eir_len, u8 type,
1295 size_t *data_len)
6759a675 1296{
84d9d071 1297 size_t parsed = 0;
6759a675 1298
0d3b7f64
JH
1299 if (eir_len < 2)
1300 return NULL;
6c0c331e 1301
0d3b7f64
JH
1302 while (parsed < eir_len - 1) {
1303 u8 field_len = eir[0];
6759a675
JH
1304
1305 if (field_len == 0)
1306 break;
1307
1308 parsed += field_len + 1;
1309
0d3b7f64 1310 if (parsed > eir_len)
6759a675
JH
1311 break;
1312
0d3b7f64
JH
1313 if (eir[1] != type) {
1314 eir += field_len + 1;
1315 continue;
1316 }
1317
1318 /* Zero length data */
1319 if (field_len == 1)
1320 return NULL;
6759a675 1321
0d3b7f64
JH
1322 if (data_len)
1323 *data_len = field_len - 1;
1324
1325 return &eir[2];
6759a675
JH
1326 }
1327
0d3b7f64 1328 return NULL;
6759a675
JH
1329}
1330
301cb2d8
JH
1331static inline bool hci_bdaddr_is_rpa(bdaddr_t *bdaddr, u8 addr_type)
1332{
dbbfa2ab 1333 if (addr_type != ADDR_LE_DEV_RANDOM)
301cb2d8
JH
1334 return false;
1335
1336 if ((bdaddr->b[5] & 0xc0) == 0x40)
1337 return true;
1338
1339 return false;
1340}
1341
c46245b3
JH
1342static inline bool hci_is_identity_address(bdaddr_t *addr, u8 addr_type)
1343{
1344 if (addr_type == ADDR_LE_DEV_PUBLIC)
1345 return true;
1346
1347 /* Check for Random Static address type */
1348 if ((addr->b[5] & 0xc0) == 0xc0)
1349 return true;
1350
1351 return false;
1352}
1353
2426f3a5
JH
1354static inline struct smp_irk *hci_get_irk(struct hci_dev *hdev,
1355 bdaddr_t *bdaddr, u8 addr_type)
1356{
1357 if (!hci_bdaddr_is_rpa(bdaddr, addr_type))
1358 return NULL;
1359
1360 return hci_find_irk_by_rpa(hdev, bdaddr);
1361}
1362
d4905f24
AG
1363static inline int hci_check_conn_params(u16 min, u16 max, u16 latency,
1364 u16 to_multiplier)
1365{
1366 u16 max_latency;
1367
1368 if (min > max || min < 6 || max > 3200)
1369 return -EINVAL;
1370
1371 if (to_multiplier < 10 || to_multiplier > 3200)
1372 return -EINVAL;
1373
1374 if (max >= to_multiplier * 8)
1375 return -EINVAL;
1376
8757825b 1377 max_latency = (to_multiplier * 4 / max) - 1;
d4905f24
AG
1378 if (latency > 499 || latency > max_latency)
1379 return -EINVAL;
1380
1381 return 0;
1382}
1383
1da177e4
LT
1384int hci_register_cb(struct hci_cb *hcb);
1385int hci_unregister_cb(struct hci_cb *hcb);
1386
75e84b7c 1387struct sk_buff *__hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen,
07dc93dd 1388 const void *param, u32 timeout);
7b1abbbe 1389struct sk_buff *__hci_cmd_sync_ev(struct hci_dev *hdev, u16 opcode, u32 plen,
07dc93dd 1390 const void *param, u8 event, u32 timeout);
75e84b7c 1391
07dc93dd
JH
1392int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen,
1393 const void *param);
73d80deb 1394void hci_send_acl(struct hci_chan *chan, struct sk_buff *skb, __u16 flags);
0d861d8b 1395void hci_send_sco(struct hci_conn *conn, struct sk_buff *skb);
1da177e4 1396
a9de9248 1397void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 opcode);
1da177e4 1398
fbef168f
LP
1399struct sk_buff *hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen,
1400 const void *param, u32 timeout);
1401
1da177e4 1402/* ----- HCI Sockets ----- */
470fe1b5 1403void hci_send_to_sock(struct hci_dev *hdev, struct sk_buff *skb);
7129069e 1404void hci_send_to_channel(unsigned short channel, struct sk_buff *skb,
c08b1a1d 1405 int flag, struct sock *skip_sk);
cd82e61c 1406void hci_send_to_monitor(struct hci_dev *hdev, struct sk_buff *skb);
1da177e4 1407
040030ef
MH
1408void hci_sock_dev_event(struct hci_dev *hdev, int event);
1409
a958452a
MH
1410#define HCI_MGMT_VAR_LEN BIT(0)
1411#define HCI_MGMT_NO_HDEV BIT(1)
1412#define HCI_MGMT_UNTRUSTED BIT(2)
1413#define HCI_MGMT_UNCONFIGURED BIT(3)
b9a245fb 1414
801c1e8d
JH
1415struct hci_mgmt_handler {
1416 int (*func) (struct sock *sk, struct hci_dev *hdev, void *data,
1417 u16 data_len);
801c1e8d 1418 size_t data_len;
b9a245fb 1419 unsigned long flags;
801c1e8d
JH
1420};
1421
1422struct hci_mgmt_chan {
1423 struct list_head list;
1424 unsigned short channel;
1425 size_t handler_count;
1426 const struct hci_mgmt_handler *handlers;
88b94ce9 1427 void (*hdev_init) (struct sock *sk, struct hci_dev *hdev);
801c1e8d
JH
1428};
1429
1430int hci_mgmt_chan_register(struct hci_mgmt_chan *c);
1431void hci_mgmt_chan_unregister(struct hci_mgmt_chan *c);
1432
0381101f 1433/* Management interface */
591f47f3
AG
1434#define DISCOV_TYPE_BREDR (BIT(BDADDR_BREDR))
1435#define DISCOV_TYPE_LE (BIT(BDADDR_LE_PUBLIC) | \
1436 BIT(BDADDR_LE_RANDOM))
1437#define DISCOV_TYPE_INTERLEAVED (BIT(BDADDR_BREDR) | \
1438 BIT(BDADDR_LE_PUBLIC) | \
1439 BIT(BDADDR_LE_RANDOM))
f39799f5 1440
0d8cc935
AG
1441/* These LE scan and inquiry parameters were chosen according to LE General
1442 * Discovery Procedure specification.
1443 */
1444#define DISCOV_LE_SCAN_WIN 0x12
1445#define DISCOV_LE_SCAN_INT 0x12
3d5a76f0 1446#define DISCOV_LE_TIMEOUT 10240 /* msec */
ae55f598 1447#define DISCOV_INTERLEAVED_TIMEOUT 5120 /* msec */
0d8cc935
AG
1448#define DISCOV_INTERLEAVED_INQUIRY_LEN 0x04
1449#define DISCOV_BREDR_INQUIRY_LEN 0x08
4b0e0ced 1450#define DISCOV_LE_RESTART_DELAY msecs_to_jiffies(200) /* msec */
0d8cc935 1451
91a668b0 1452int mgmt_new_settings(struct hci_dev *hdev);
bf6b56db
MH
1453void mgmt_index_added(struct hci_dev *hdev);
1454void mgmt_index_removed(struct hci_dev *hdev);
3eec705e 1455void mgmt_set_powered_failed(struct hci_dev *hdev, int err);
2ff13894
JH
1456void mgmt_power_on(struct hci_dev *hdev, int err);
1457void __mgmt_power_off(struct hci_dev *hdev);
dc4a5ee2
MH
1458void mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key,
1459 bool persistent);
48ec92fa
AA
1460void mgmt_device_connected(struct hci_dev *hdev, struct hci_conn *conn,
1461 u32 flags, u8 *name, u8 name_len);
9b80ec5e 1462void mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr,
12d4a3b2
JH
1463 u8 link_type, u8 addr_type, u8 reason,
1464 bool mgmt_connected);
7892924c
MH
1465void mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr,
1466 u8 link_type, u8 addr_type, u8 status);
445608d0
MH
1467void mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
1468 u8 addr_type, u8 status);
ce0e4a0d 1469void mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure);
e669cf80
MH
1470void mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
1471 u8 status);
3eb38528
MH
1472void mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
1473 u8 status);
744cf19e 1474int mgmt_user_confirm_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
39adbffe 1475 u8 link_type, u8 addr_type, u32 value,
04124681 1476 u8 confirm_hint);
744cf19e 1477int mgmt_user_confirm_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
04124681 1478 u8 link_type, u8 addr_type, u8 status);
272d90df 1479int mgmt_user_confirm_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
04124681 1480 u8 link_type, u8 addr_type, u8 status);
272d90df 1481int mgmt_user_passkey_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
04124681 1482 u8 link_type, u8 addr_type);
604086b7 1483int mgmt_user_passkey_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
04124681 1484 u8 link_type, u8 addr_type, u8 status);
272d90df 1485int mgmt_user_passkey_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
04124681 1486 u8 link_type, u8 addr_type, u8 status);
92a25256
JH
1487int mgmt_user_passkey_notify(struct hci_dev *hdev, bdaddr_t *bdaddr,
1488 u8 link_type, u8 addr_type, u32 passkey,
1489 u8 entered);
e1e930f5 1490void mgmt_auth_failed(struct hci_conn *conn, u8 status);
464996ae 1491void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status);
3e248560 1492void mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status);
4e1b0245
MH
1493void mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class,
1494 u8 status);
7667da34 1495void mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status);
e68f072b 1496void mgmt_start_discovery_complete(struct hci_dev *hdev, u8 status);
2154d3f4 1497void mgmt_stop_discovery_complete(struct hci_dev *hdev, u8 status);
901801b9 1498void mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
af58925c
MH
1499 u8 addr_type, u8 *dev_class, s8 rssi, u32 flags,
1500 u8 *eir, u16 eir_len, u8 *scan_rsp, u8 scan_rsp_len);
9cf12aee
MH
1501void mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
1502 u8 addr_type, s8 rssi, u8 *name, u8 name_len);
2f1e063b 1503void mgmt_discovering(struct hci_dev *hdev, u8 discovering);
84c61d92 1504bool mgmt_powering_down(struct hci_dev *hdev);
53ac6ab6 1505void mgmt_new_ltk(struct hci_dev *hdev, struct smp_ltk *key, bool persistent);
cad20c27 1506void mgmt_new_irk(struct hci_dev *hdev, struct smp_irk *irk, bool persistent);
53ac6ab6
MH
1507void mgmt_new_csrk(struct hci_dev *hdev, struct smp_csrk *csrk,
1508 bool persistent);
ffb5a827 1509void mgmt_new_conn_param(struct hci_dev *hdev, bdaddr_t *bdaddr,
f4869e2a
JH
1510 u8 bdaddr_type, u8 store_hint, u16 min_interval,
1511 u16 max_interval, u16 latency, u16 timeout);
f4a407be 1512void mgmt_smp_complete(struct hci_conn *conn, bool complete);
f2252570 1513bool mgmt_get_connectable(struct hci_dev *hdev);
53c0ba74 1514void mgmt_set_connectable_complete(struct hci_dev *hdev, u8 status);
aed1a885 1515void mgmt_set_discoverable_complete(struct hci_dev *hdev, u8 status);
f2252570
JH
1516u8 mgmt_get_adv_discov_flags(struct hci_dev *hdev);
1517void mgmt_advertising_added(struct sock *sk, struct hci_dev *hdev,
1518 u8 instance);
1519void mgmt_advertising_removed(struct sock *sk, struct hci_dev *hdev,
1520 u8 instance);
346af67b 1521
7d6ca693
JH
1522u8 hci_le_conn_update(struct hci_conn *conn, u16 min, u16 max, u16 latency,
1523 u16 to_multiplier);
fe39c7b2 1524void hci_le_start_enc(struct hci_conn *conn, __le16 ediv, __le64 rand,
8b76ce34 1525 __u8 ltk[16], __u8 key_size);
2519a1fc 1526
a1f4c318
JH
1527void hci_copy_identity_address(struct hci_dev *hdev, bdaddr_t *bdaddr,
1528 u8 *bdaddr_type);
ebd3a747 1529
5d4d62f6
FD
1530#define SCO_AIRMODE_MASK 0x0003
1531#define SCO_AIRMODE_CVSD 0x0000
1532#define SCO_AIRMODE_TRANSP 0x0003
1533
1da177e4 1534#endif /* __HCI_CORE_H */