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