Bluetooth: Return updated name state with hci_inquiry_cache_update
[GitHub/mt8127/android_kernel_alcatel_ttab.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
a6b7a407 28#include <linux/interrupt.h>
1da177e4
LT
29#include <net/bluetooth/hci.h>
30
5e59b791
LAD
31/* HCI priority */
32#define HCI_PRIO_MAX 7
33
1da177e4 34/* HCI Core structures */
1da177e4
LT
35struct inquiry_data {
36 bdaddr_t bdaddr;
37 __u8 pscan_rep_mode;
38 __u8 pscan_period_mode;
39 __u8 pscan_mode;
40 __u8 dev_class[3];
1ebb9252 41 __le16 clock_offset;
1da177e4 42 __s8 rssi;
41a96212 43 __u8 ssp_mode;
1da177e4
LT
44};
45
46struct inquiry_entry {
561aafbc
JH
47 struct list_head all; /* inq_cache.all */
48 struct list_head list; /* unknown or resolve */
49 enum {
50 NAME_NOT_KNOWN,
51 NAME_NEEDED,
52 NAME_PENDING,
53 NAME_KNOWN,
54 } name_state;
1da177e4
LT
55 __u32 timestamp;
56 struct inquiry_data data;
57};
58
59struct inquiry_cache {
561aafbc
JH
60 struct list_head all; /* All devices found during inquiry */
61 struct list_head unknown; /* Name state not known */
62 struct list_head resolve; /* Name needs to be resolved */
63 __u32 timestamp;
1da177e4
LT
64};
65
66struct hci_conn_hash {
67 struct list_head list;
1da177e4
LT
68 unsigned int acl_num;
69 unsigned int sco_num;
fcd89c09 70 unsigned int le_num;
1da177e4
LT
71};
72
f0358568
JH
73struct bdaddr_list {
74 struct list_head list;
75 bdaddr_t bdaddr;
76};
2aeb9a1a
JH
77
78struct bt_uuid {
79 struct list_head list;
80 u8 uuid[16];
1aff6f09 81 u8 svc_hint;
2aeb9a1a
JH
82};
83
34918cd7
VCG
84struct key_master_id {
85 __le16 ediv;
86 u8 rand[8];
87} __packed;
88
89struct link_key_data {
90 bdaddr_t bdaddr;
91 u8 type;
92 u8 val[16];
93 u8 pin_len;
94 u8 dlen;
95 u8 data[0];
96} __packed;
97
55ed8ca1
JH
98struct link_key {
99 struct list_head list;
100 bdaddr_t bdaddr;
101 u8 type;
102 u8 val[16];
103 u8 pin_len;
34918cd7
VCG
104 u8 dlen;
105 u8 data[0];
55ed8ca1
JH
106};
107
2763eda6
SJ
108struct oob_data {
109 struct list_head list;
110 bdaddr_t bdaddr;
111 u8 hash[16];
112 u8 randomizer[16];
113};
114
76c8686f
AG
115struct adv_entry {
116 struct list_head list;
117 bdaddr_t bdaddr;
118 u8 bdaddr_type;
119};
120
cd4c5391 121#define NUM_REASSEMBLY 4
1da177e4
LT
122struct hci_dev {
123 struct list_head list;
09fd0de5 124 struct mutex lock;
1da177e4
LT
125 atomic_t refcnt;
126
127 char name[8];
128 unsigned long flags;
129 __u16 id;
c13854ce 130 __u8 bus;
943da25d 131 __u8 dev_type;
1da177e4 132 bdaddr_t bdaddr;
1f6c6378 133 __u8 dev_name[HCI_MAX_NAME_LENGTH];
80a1e1db 134 __u8 eir[HCI_MAX_EIR_LENGTH];
a9de9248 135 __u8 dev_class[3];
1aff6f09
JH
136 __u8 major_class;
137 __u8 minor_class;
1da177e4 138 __u8 features[8];
59e29406 139 __u8 host_features[8];
a9de9248 140 __u8 commands[64];
333140b5 141 __u8 ssp_mode;
1143e5a6
MH
142 __u8 hci_ver;
143 __u16 hci_rev;
d5859e22 144 __u8 lmp_ver;
1143e5a6 145 __u16 manufacturer;
d5859e22 146 __le16 lmp_subver;
1da177e4 147 __u16 voice_setting;
17fa4b9d 148 __u8 io_capability;
1da177e4
LT
149
150 __u16 pkt_type;
5b7f9909 151 __u16 esco_type;
1da177e4
LT
152 __u16 link_policy;
153 __u16 link_mode;
154
04837f64
MH
155 __u32 idle_timeout;
156 __u16 sniff_min_interval;
157 __u16 sniff_max_interval;
158
928abaa7
AE
159 __u8 amp_status;
160 __u32 amp_total_bw;
161 __u32 amp_max_bw;
162 __u32 amp_min_latency;
163 __u32 amp_max_pdu;
164 __u8 amp_type;
165 __u16 amp_pal_cap;
166 __u16 amp_assoc_size;
167 __u32 amp_max_flush_to;
168 __u32 amp_be_flush_to;
169
1e89cffb
AE
170 __u8 flow_ctl_mode;
171
9f61656a
JH
172 unsigned int auto_accept_delay;
173
1da177e4
LT
174 unsigned long quirks;
175
176 atomic_t cmd_cnt;
177 unsigned int acl_cnt;
178 unsigned int sco_cnt;
6ed58ec5 179 unsigned int le_cnt;
1da177e4
LT
180
181 unsigned int acl_mtu;
182 unsigned int sco_mtu;
6ed58ec5 183 unsigned int le_mtu;
1da177e4
LT
184 unsigned int acl_pkts;
185 unsigned int sco_pkts;
6ed58ec5 186 unsigned int le_pkts;
1da177e4 187
350ee4cf
AE
188 __u16 block_len;
189 __u16 block_mtu;
190 __u16 num_blocks;
191 __u16 block_cnt;
192
1da177e4
LT
193 unsigned long acl_last_tx;
194 unsigned long sco_last_tx;
6ed58ec5 195 unsigned long le_last_tx;
1da177e4 196
f48fd9c8
MH
197 struct workqueue_struct *workqueue;
198
ab81cbf9 199 struct work_struct power_on;
3243553f 200 struct delayed_work power_off;
ab81cbf9 201
16ab91ab
JH
202 __u16 discov_timeout;
203 struct delayed_work discov_off;
204
7d78525d
JH
205 struct delayed_work service_cache;
206
6bd32326 207 struct timer_list cmd_timer;
b78752cc
MH
208
209 struct work_struct rx_work;
c347b765 210 struct work_struct cmd_work;
3eff45ea 211 struct work_struct tx_work;
1da177e4
LT
212
213 struct sk_buff_head rx_q;
214 struct sk_buff_head raw_q;
215 struct sk_buff_head cmd_q;
216
217 struct sk_buff *sent_cmd;
cd4c5391 218 struct sk_buff *reassembly[NUM_REASSEMBLY];
1da177e4 219
a6a67efd 220 struct mutex req_lock;
1da177e4
LT
221 wait_queue_head_t req_wait_q;
222 __u32 req_status;
223 __u32 req_result;
a5040efa
JH
224
225 __u16 init_last_cmd;
1da177e4 226
2e58ef3e
JH
227 struct list_head mgmt_pending;
228
1da177e4
LT
229 struct inquiry_cache inq_cache;
230 struct hci_conn_hash conn_hash;
ea4bd8ba 231 struct list_head blacklist;
1da177e4 232
2aeb9a1a
JH
233 struct list_head uuids;
234
55ed8ca1
JH
235 struct list_head link_keys;
236
2763eda6
SJ
237 struct list_head remote_oob_data;
238
76c8686f 239 struct list_head adv_entries;
db323f2f 240 struct delayed_work adv_work;
76c8686f 241
1da177e4
LT
242 struct hci_dev_stats stat;
243
244 struct sk_buff_head driver_init;
245
246 void *driver_data;
247 void *core_data;
248
70f23020 249 atomic_t promisc;
1da177e4 250
ca325f69
MH
251 struct dentry *debugfs;
252
a91f2e39
MH
253 struct device *parent;
254 struct device dev;
1da177e4 255
611b30f7
MH
256 struct rfkill *rfkill;
257
70f23020 258 struct module *owner;
1da177e4 259
d23264a8
AG
260 unsigned long dev_flags;
261
1da177e4
LT
262 int (*open)(struct hci_dev *hdev);
263 int (*close)(struct hci_dev *hdev);
264 int (*flush)(struct hci_dev *hdev);
265 int (*send)(struct sk_buff *skb);
266 void (*destruct)(struct hci_dev *hdev);
267 void (*notify)(struct hci_dev *hdev, unsigned int evt);
268 int (*ioctl)(struct hci_dev *hdev, unsigned int cmd, unsigned long arg);
269};
270
271struct hci_conn {
272 struct list_head list;
273
adc4266d 274 atomic_t refcnt;
adc4266d
SJ
275
276 bdaddr_t dst;
5a9d0a3f 277 __u8 dst_type;
adc4266d
SJ
278 __u16 handle;
279 __u16 state;
280 __u8 mode;
281 __u8 type;
282 __u8 out;
283 __u8 attempt;
284 __u8 dev_class[3];
285 __u8 features[8];
286 __u8 ssp_mode;
287 __u16 interval;
288 __u16 pkt_type;
289 __u16 link_policy;
290 __u32 link_mode;
13d39315 291 __u8 key_type;
adc4266d
SJ
292 __u8 auth_type;
293 __u8 sec_level;
294 __u8 pending_sec_level;
295 __u8 pin_length;
726b4ffc 296 __u8 enc_key_size;
adc4266d
SJ
297 __u8 io_capability;
298 __u8 power_save;
299 __u16 disc_timeout;
300 unsigned long pend;
04837f64 301
03b555e1
JH
302 __u8 remote_cap;
303 __u8 remote_oob;
304 __u8 remote_auth;
305
adc4266d 306 unsigned int sent;
04837f64 307
1da177e4 308 struct sk_buff_head data_q;
2c33c06a 309 struct list_head chan_list;
1da177e4 310
19c40e3b 311 struct delayed_work disc_work;
04837f64 312 struct timer_list idle_timer;
9f61656a 313 struct timer_list auto_accept_timer;
04837f64 314
b219e3ac 315 struct device dev;
9eba32b8 316 atomic_t devref;
b219e3ac 317
1da177e4
LT
318 struct hci_dev *hdev;
319 void *l2cap_data;
320 void *sco_data;
2b64d153 321 void *smp_conn;
1da177e4
LT
322
323 struct hci_conn *link;
e9a416b5
JH
324
325 void (*connect_cfm_cb) (struct hci_conn *conn, u8 status);
326 void (*security_cfm_cb) (struct hci_conn *conn, u8 status);
327 void (*disconn_cfm_cb) (struct hci_conn *conn, u8 reason);
1da177e4
LT
328};
329
73d80deb
LAD
330struct hci_chan {
331 struct list_head list;
332
333 struct hci_conn *conn;
334 struct sk_buff_head data_q;
335 unsigned int sent;
336};
337
1da177e4
LT
338extern struct list_head hci_dev_list;
339extern struct list_head hci_cb_list;
340extern rwlock_t hci_dev_list_lock;
341extern rwlock_t hci_cb_list_lock;
342
686ebf28
UF
343/* ----- HCI interface to upper protocols ----- */
344extern int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr);
345extern int l2cap_connect_cfm(struct hci_conn *hcon, u8 status);
346extern int l2cap_disconn_ind(struct hci_conn *hcon);
347extern int l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason);
348extern int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt);
349extern int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags);
350
351extern int sco_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr);
352extern int sco_connect_cfm(struct hci_conn *hcon, __u8 status);
353extern int sco_disconn_cfm(struct hci_conn *hcon, __u8 reason);
354extern int sco_recv_scodata(struct hci_conn *hcon, struct sk_buff *skb);
355
1da177e4 356/* ----- Inquiry cache ----- */
70f23020
AE
357#define INQUIRY_CACHE_AGE_MAX (HZ*30) /* 30 seconds */
358#define INQUIRY_ENTRY_AGE_MAX (HZ*60) /* 60 seconds */
1da177e4 359
1da177e4
LT
360static inline void inquiry_cache_init(struct hci_dev *hdev)
361{
561aafbc
JH
362 INIT_LIST_HEAD(&hdev->inq_cache.all);
363 INIT_LIST_HEAD(&hdev->inq_cache.unknown);
364 INIT_LIST_HEAD(&hdev->inq_cache.resolve);
1da177e4
LT
365}
366
367static inline int inquiry_cache_empty(struct hci_dev *hdev)
368{
561aafbc 369 return list_empty(&hdev->inq_cache.all);
1da177e4
LT
370}
371
372static inline long inquiry_cache_age(struct hci_dev *hdev)
373{
374 struct inquiry_cache *c = &hdev->inq_cache;
375 return jiffies - c->timestamp;
376}
377
378static inline long inquiry_entry_age(struct inquiry_entry *e)
379{
380 return jiffies - e->timestamp;
381}
382
5a9d0a3f
WR
383struct inquiry_entry *hci_inquiry_cache_lookup(struct hci_dev *hdev,
384 bdaddr_t *bdaddr);
561aafbc
JH
385struct inquiry_entry *hci_inquiry_cache_lookup_unknown(struct hci_dev *hdev,
386 bdaddr_t *bdaddr);
3175405b 387bool hci_inquiry_cache_update(struct hci_dev *hdev, struct inquiry_data *data,
561aafbc 388 bool name_known);
1da177e4
LT
389
390/* ----- HCI Connections ----- */
391enum {
392 HCI_CONN_AUTH_PEND,
19f8def0 393 HCI_CONN_REAUTH_PEND,
1da177e4 394 HCI_CONN_ENCRYPT_PEND,
04837f64
MH
395 HCI_CONN_RSWITCH_PEND,
396 HCI_CONN_MODE_CHANGE_PEND,
e73439d8 397 HCI_CONN_SCO_SETUP_PEND,
d26a2345 398 HCI_CONN_LE_SMP_PEND,
1da177e4
LT
399};
400
401static inline void hci_conn_hash_init(struct hci_dev *hdev)
402{
403 struct hci_conn_hash *h = &hdev->conn_hash;
404 INIT_LIST_HEAD(&h->list);
1da177e4
LT
405 h->acl_num = 0;
406 h->sco_num = 0;
dc8ed672 407 h->le_num = 0;
1da177e4
LT
408}
409
410static inline void hci_conn_hash_add(struct hci_dev *hdev, struct hci_conn *c)
411{
412 struct hci_conn_hash *h = &hdev->conn_hash;
bf4c6325 413 list_add_rcu(&c->list, &h->list);
fcd89c09
VT
414 switch (c->type) {
415 case ACL_LINK:
1da177e4 416 h->acl_num++;
fcd89c09
VT
417 break;
418 case LE_LINK:
419 h->le_num++;
420 break;
421 case SCO_LINK:
422 case ESCO_LINK:
1da177e4 423 h->sco_num++;
fcd89c09
VT
424 break;
425 }
1da177e4
LT
426}
427
428static inline void hci_conn_hash_del(struct hci_dev *hdev, struct hci_conn *c)
429{
430 struct hci_conn_hash *h = &hdev->conn_hash;
bf4c6325
GP
431
432 list_del_rcu(&c->list);
433 synchronize_rcu();
434
fcd89c09
VT
435 switch (c->type) {
436 case ACL_LINK:
1da177e4 437 h->acl_num--;
fcd89c09
VT
438 break;
439 case LE_LINK:
440 h->le_num--;
441 break;
442 case SCO_LINK:
443 case ESCO_LINK:
1da177e4 444 h->sco_num--;
fcd89c09
VT
445 break;
446 }
1da177e4
LT
447}
448
52087a79
LAD
449static inline unsigned int hci_conn_num(struct hci_dev *hdev, __u8 type)
450{
451 struct hci_conn_hash *h = &hdev->conn_hash;
452 switch (type) {
453 case ACL_LINK:
454 return h->acl_num;
455 case LE_LINK:
456 return h->le_num;
457 case SCO_LINK:
458 case ESCO_LINK:
459 return h->sco_num;
460 default:
461 return 0;
462 }
463}
464
1da177e4 465static inline struct hci_conn *hci_conn_hash_lookup_handle(struct hci_dev *hdev,
adc4266d 466 __u16 handle)
1da177e4
LT
467{
468 struct hci_conn_hash *h = &hdev->conn_hash;
1da177e4
LT
469 struct hci_conn *c;
470
bf4c6325
GP
471 rcu_read_lock();
472
473 list_for_each_entry_rcu(c, &h->list, list) {
474 if (c->handle == handle) {
475 rcu_read_unlock();
1da177e4 476 return c;
bf4c6325 477 }
1da177e4 478 }
bf4c6325
GP
479 rcu_read_unlock();
480
1da177e4
LT
481 return NULL;
482}
483
484static inline struct hci_conn *hci_conn_hash_lookup_ba(struct hci_dev *hdev,
adc4266d 485 __u8 type, bdaddr_t *ba)
1da177e4
LT
486{
487 struct hci_conn_hash *h = &hdev->conn_hash;
1da177e4
LT
488 struct hci_conn *c;
489
bf4c6325
GP
490 rcu_read_lock();
491
492 list_for_each_entry_rcu(c, &h->list, list) {
493 if (c->type == type && !bacmp(&c->dst, ba)) {
494 rcu_read_unlock();
1da177e4 495 return c;
bf4c6325 496 }
1da177e4 497 }
bf4c6325
GP
498
499 rcu_read_unlock();
500
1da177e4
LT
501 return NULL;
502}
503
4c67bc74 504static inline struct hci_conn *hci_conn_hash_lookup_state(struct hci_dev *hdev,
adc4266d 505 __u8 type, __u16 state)
4c67bc74
MH
506{
507 struct hci_conn_hash *h = &hdev->conn_hash;
4c67bc74
MH
508 struct hci_conn *c;
509
bf4c6325
GP
510 rcu_read_lock();
511
512 list_for_each_entry_rcu(c, &h->list, list) {
513 if (c->type == type && c->state == state) {
514 rcu_read_unlock();
4c67bc74 515 return c;
bf4c6325 516 }
4c67bc74 517 }
73d80deb 518
bf4c6325 519 rcu_read_unlock();
73d80deb 520
4c67bc74 521 return NULL;
73d80deb
LAD
522}
523
4c67bc74 524void hci_acl_connect(struct hci_conn *conn);
1da177e4
LT
525void hci_acl_disconn(struct hci_conn *conn, __u8 reason);
526void hci_add_sco(struct hci_conn *conn, __u16 handle);
b6a0dc82 527void hci_setup_sync(struct hci_conn *conn, __u16 handle);
e73439d8 528void hci_sco_setup(struct hci_conn *conn, __u8 status);
1da177e4
LT
529
530struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst);
a9de9248
MH
531int hci_conn_del(struct hci_conn *conn);
532void hci_conn_hash_flush(struct hci_dev *hdev);
533void hci_conn_check_pending(struct hci_dev *hdev);
1da177e4 534
73d80deb
LAD
535struct hci_chan *hci_chan_create(struct hci_conn *conn);
536int hci_chan_del(struct hci_chan *chan);
2c33c06a 537void hci_chan_list_flush(struct hci_conn *conn);
73d80deb 538
5a9d0a3f
WR
539struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst,
540 __u8 sec_level, __u8 auth_type);
e7c29cb1 541int hci_conn_check_link_mode(struct hci_conn *conn);
b3b1b061 542int hci_conn_check_secure(struct hci_conn *conn, __u8 sec_level);
0684e5f9 543int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type);
1da177e4 544int hci_conn_change_link_key(struct hci_conn *conn);
8c1b2355 545int hci_conn_switch_role(struct hci_conn *conn, __u8 role);
1da177e4 546
14b12d0b 547void hci_conn_enter_active_mode(struct hci_conn *conn, __u8 force_active);
1da177e4 548
9eba32b8
MH
549void hci_conn_hold_device(struct hci_conn *conn);
550void hci_conn_put_device(struct hci_conn *conn);
551
1da177e4
LT
552static inline void hci_conn_hold(struct hci_conn *conn)
553{
554 atomic_inc(&conn->refcnt);
19c40e3b 555 cancel_delayed_work_sync(&conn->disc_work);
1da177e4
LT
556}
557
558static inline void hci_conn_put(struct hci_conn *conn)
559{
560 if (atomic_dec_and_test(&conn->refcnt)) {
04837f64 561 unsigned long timeo;
454d48ff 562 if (conn->type == ACL_LINK || conn->type == LE_LINK) {
04837f64 563 del_timer(&conn->idle_timer);
6ac59344 564 if (conn->state == BT_CONNECTED) {
052b30b0 565 timeo = msecs_to_jiffies(conn->disc_timeout);
6ac59344 566 if (!conn->out)
052b30b0 567 timeo *= 2;
5a9d0a3f 568 } else {
6ac59344 569 timeo = msecs_to_jiffies(10);
5a9d0a3f
WR
570 }
571 } else {
04837f64 572 timeo = msecs_to_jiffies(10);
5a9d0a3f 573 }
19c40e3b
GP
574 cancel_delayed_work_sync(&conn->disc_work);
575 queue_delayed_work(conn->hdev->workqueue,
576 &conn->disc_work, jiffies + timeo);
1da177e4
LT
577 }
578}
579
1da177e4
LT
580/* ----- HCI Devices ----- */
581static inline void __hci_dev_put(struct hci_dev *d)
582{
583 if (atomic_dec_and_test(&d->refcnt))
584 d->destruct(d);
585}
586
1d58996d
PG
587/*
588 * hci_dev_put and hci_dev_hold are macros to avoid dragging all the
589 * overhead of all the modular infrastructure into this header.
590 */
591#define hci_dev_put(d) \
592do { \
593 __hci_dev_put(d); \
594 module_put(d->owner); \
595} while (0)
1da177e4
LT
596
597static inline struct hci_dev *__hci_dev_hold(struct hci_dev *d)
598{
599 atomic_inc(&d->refcnt);
600 return d;
601}
602
1d58996d
PG
603#define hci_dev_hold(d) \
604({ \
605 try_module_get(d->owner) ? __hci_dev_hold(d) : NULL; \
606})
1da177e4 607
09fd0de5
GP
608#define hci_dev_lock(d) mutex_lock(&d->lock)
609#define hci_dev_unlock(d) mutex_unlock(&d->lock)
1da177e4
LT
610
611struct hci_dev *hci_dev_get(int index);
612struct hci_dev *hci_get_route(bdaddr_t *src, bdaddr_t *dst);
613
614struct hci_dev *hci_alloc_dev(void);
615void hci_free_dev(struct hci_dev *hdev);
616int hci_register_dev(struct hci_dev *hdev);
59735631 617void hci_unregister_dev(struct hci_dev *hdev);
1da177e4
LT
618int hci_suspend_dev(struct hci_dev *hdev);
619int hci_resume_dev(struct hci_dev *hdev);
620int hci_dev_open(__u16 dev);
621int hci_dev_close(__u16 dev);
622int hci_dev_reset(__u16 dev);
623int hci_dev_reset_stat(__u16 dev);
624int hci_dev_cmd(unsigned int cmd, void __user *arg);
625int hci_get_dev_list(void __user *arg);
626int hci_get_dev_info(void __user *arg);
627int hci_get_conn_list(void __user *arg);
628int hci_get_conn_info(struct hci_dev *hdev, void __user *arg);
40be492f 629int hci_get_auth_info(struct hci_dev *hdev, void __user *arg);
1da177e4
LT
630int hci_inquiry(void __user *arg);
631
f0358568
JH
632struct bdaddr_list *hci_blacklist_lookup(struct hci_dev *hdev, bdaddr_t *bdaddr);
633int hci_blacklist_clear(struct hci_dev *hdev);
b2a66aad
AJ
634int hci_blacklist_add(struct hci_dev *hdev, bdaddr_t *bdaddr);
635int hci_blacklist_del(struct hci_dev *hdev, bdaddr_t *bdaddr);
f0358568 636
2aeb9a1a
JH
637int hci_uuids_clear(struct hci_dev *hdev);
638
55ed8ca1
JH
639int hci_link_keys_clear(struct hci_dev *hdev);
640struct link_key *hci_find_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr);
d25e28ab
JH
641int hci_add_link_key(struct hci_dev *hdev, struct hci_conn *conn, int new_key,
642 bdaddr_t *bdaddr, u8 *val, u8 type, u8 pin_len);
75d262c2
VCG
643struct link_key *hci_find_ltk(struct hci_dev *hdev, __le16 ediv, u8 rand[8]);
644struct link_key *hci_find_link_key_type(struct hci_dev *hdev,
645 bdaddr_t *bdaddr, u8 type);
646int hci_add_ltk(struct hci_dev *hdev, int new_key, bdaddr_t *bdaddr,
726b4ffc 647 u8 key_size, __le16 ediv, u8 rand[8], u8 ltk[16]);
55ed8ca1
JH
648int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr);
649
2763eda6
SJ
650int hci_remote_oob_data_clear(struct hci_dev *hdev);
651struct oob_data *hci_find_remote_oob_data(struct hci_dev *hdev,
652 bdaddr_t *bdaddr);
653int hci_add_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 *hash,
654 u8 *randomizer);
655int hci_remove_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr);
656
35815085 657#define ADV_CLEAR_TIMEOUT (3*60*HZ) /* Three minutes */
76c8686f
AG
658int hci_adv_entries_clear(struct hci_dev *hdev);
659struct adv_entry *hci_find_adv_entry(struct hci_dev *hdev, bdaddr_t *bdaddr);
660int hci_add_adv_entry(struct hci_dev *hdev,
661 struct hci_ev_le_advertising_info *ev);
662
ab81cbf9
JH
663void hci_del_off_timer(struct hci_dev *hdev);
664
1da177e4
LT
665void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb);
666
76bca880 667int hci_recv_frame(struct sk_buff *skb);
ef222013 668int hci_recv_fragment(struct hci_dev *hdev, int type, void *data, int count);
99811510 669int hci_recv_stream_fragment(struct hci_dev *hdev, void *data, int count);
ef222013 670
0ac7e700 671void hci_init_sysfs(struct hci_dev *hdev);
ce242970
DH
672int hci_add_sysfs(struct hci_dev *hdev);
673void hci_del_sysfs(struct hci_dev *hdev);
a67e899c 674void hci_conn_init_sysfs(struct hci_conn *conn);
b219e3ac
MH
675void hci_conn_add_sysfs(struct hci_conn *conn);
676void hci_conn_del_sysfs(struct hci_conn *conn);
1da177e4 677
a91f2e39 678#define SET_HCIDEV_DEV(hdev, pdev) ((hdev)->parent = (pdev))
1da177e4
LT
679
680/* ----- LMP capabilities ----- */
04837f64
MH
681#define lmp_rswitch_capable(dev) ((dev)->features[0] & LMP_RSWITCH)
682#define lmp_encrypt_capable(dev) ((dev)->features[0] & LMP_ENCRYPT)
683#define lmp_sniff_capable(dev) ((dev)->features[0] & LMP_SNIFF)
684#define lmp_sniffsubr_capable(dev) ((dev)->features[5] & LMP_SNIFF_SUBR)
5b7f9909 685#define lmp_esco_capable(dev) ((dev)->features[3] & LMP_ESCO)
769be974 686#define lmp_ssp_capable(dev) ((dev)->features[6] & LMP_SIMPLE_PAIR)
e702112f 687#define lmp_no_flush_capable(dev) ((dev)->features[6] & LMP_NO_FLUSH)
6ed58ec5 688#define lmp_le_capable(dev) ((dev)->features[4] & LMP_LE)
1da177e4 689
eead27da 690/* ----- Extended LMP capabilities ----- */
59e29406 691#define lmp_host_le_capable(dev) ((dev)->host_features[0] & LMP_HOST_LE)
eead27da 692
1da177e4 693/* ----- HCI protocols ----- */
5a9d0a3f
WR
694static inline int hci_proto_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr,
695 __u8 type)
1da177e4 696{
686ebf28
UF
697 switch (type) {
698 case ACL_LINK:
699 return l2cap_connect_ind(hdev, bdaddr);
1da177e4 700
686ebf28
UF
701 case SCO_LINK:
702 case ESCO_LINK:
703 return sco_connect_ind(hdev, bdaddr);
1da177e4 704
686ebf28
UF
705 default:
706 BT_ERR("unknown link type %d", type);
707 return -EINVAL;
708 }
1da177e4
LT
709}
710
711static inline void hci_proto_connect_cfm(struct hci_conn *conn, __u8 status)
712{
686ebf28
UF
713 switch (conn->type) {
714 case ACL_LINK:
715 case LE_LINK:
716 l2cap_connect_cfm(conn, status);
717 break;
1da177e4 718
686ebf28
UF
719 case SCO_LINK:
720 case ESCO_LINK:
721 sco_connect_cfm(conn, status);
722 break;
1da177e4 723
686ebf28
UF
724 default:
725 BT_ERR("unknown link type %d", conn->type);
726 break;
727 }
e9a416b5
JH
728
729 if (conn->connect_cfm_cb)
730 conn->connect_cfm_cb(conn, status);
1da177e4
LT
731}
732
2950f21a 733static inline int hci_proto_disconn_ind(struct hci_conn *conn)
1da177e4 734{
686ebf28
UF
735 if (conn->type != ACL_LINK && conn->type != LE_LINK)
736 return HCI_ERROR_REMOTE_USER_TERM;
1da177e4 737
686ebf28 738 return l2cap_disconn_ind(conn);
2950f21a
MH
739}
740
741static inline void hci_proto_disconn_cfm(struct hci_conn *conn, __u8 reason)
742{
686ebf28
UF
743 switch (conn->type) {
744 case ACL_LINK:
745 case LE_LINK:
746 l2cap_disconn_cfm(conn, reason);
747 break;
2950f21a 748
686ebf28
UF
749 case SCO_LINK:
750 case ESCO_LINK:
751 sco_disconn_cfm(conn, reason);
752 break;
2950f21a 753
686ebf28
UF
754 default:
755 BT_ERR("unknown link type %d", conn->type);
756 break;
757 }
e9a416b5
JH
758
759 if (conn->disconn_cfm_cb)
760 conn->disconn_cfm_cb(conn, reason);
1da177e4
LT
761}
762
763static inline void hci_proto_auth_cfm(struct hci_conn *conn, __u8 status)
764{
8c1b2355
MH
765 __u8 encrypt;
766
686ebf28
UF
767 if (conn->type != ACL_LINK && conn->type != LE_LINK)
768 return;
769
8c1b2355
MH
770 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend))
771 return;
772
773 encrypt = (conn->link_mode & HCI_LM_ENCRYPT) ? 0x01 : 0x00;
686ebf28 774 l2cap_security_cfm(conn, status, encrypt);
e9a416b5
JH
775
776 if (conn->security_cfm_cb)
777 conn->security_cfm_cb(conn, status);
1da177e4
LT
778}
779
5a9d0a3f
WR
780static inline void hci_proto_encrypt_cfm(struct hci_conn *conn, __u8 status,
781 __u8 encrypt)
1da177e4 782{
686ebf28
UF
783 if (conn->type != ACL_LINK && conn->type != LE_LINK)
784 return;
1da177e4 785
686ebf28 786 l2cap_security_cfm(conn, status, encrypt);
e9a416b5
JH
787
788 if (conn->security_cfm_cb)
789 conn->security_cfm_cb(conn, status);
1da177e4
LT
790}
791
1da177e4
LT
792/* ----- HCI callbacks ----- */
793struct hci_cb {
794 struct list_head list;
795
796 char *name;
797
5a9d0a3f
WR
798 void (*security_cfm) (struct hci_conn *conn, __u8 status,
799 __u8 encrypt);
1da177e4
LT
800 void (*key_change_cfm) (struct hci_conn *conn, __u8 status);
801 void (*role_switch_cfm) (struct hci_conn *conn, __u8 status, __u8 role);
802};
803
804static inline void hci_auth_cfm(struct hci_conn *conn, __u8 status)
805{
806 struct list_head *p;
8c1b2355 807 __u8 encrypt;
1da177e4
LT
808
809 hci_proto_auth_cfm(conn, status);
810
8c1b2355
MH
811 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend))
812 return;
813
814 encrypt = (conn->link_mode & HCI_LM_ENCRYPT) ? 0x01 : 0x00;
815
f20d09d5 816 read_lock(&hci_cb_list_lock);
1da177e4
LT
817 list_for_each(p, &hci_cb_list) {
818 struct hci_cb *cb = list_entry(p, struct hci_cb, list);
8c1b2355
MH
819 if (cb->security_cfm)
820 cb->security_cfm(conn, status, encrypt);
1da177e4 821 }
f20d09d5 822 read_unlock(&hci_cb_list_lock);
1da177e4
LT
823}
824
5a9d0a3f
WR
825static inline void hci_encrypt_cfm(struct hci_conn *conn, __u8 status,
826 __u8 encrypt)
1da177e4
LT
827{
828 struct list_head *p;
829
435fef20
MH
830 if (conn->sec_level == BT_SECURITY_SDP)
831 conn->sec_level = BT_SECURITY_LOW;
832
88167aed
VCG
833 if (conn->pending_sec_level > conn->sec_level)
834 conn->sec_level = conn->pending_sec_level;
835
9719f8af 836 hci_proto_encrypt_cfm(conn, status, encrypt);
1da177e4 837
f20d09d5 838 read_lock(&hci_cb_list_lock);
1da177e4
LT
839 list_for_each(p, &hci_cb_list) {
840 struct hci_cb *cb = list_entry(p, struct hci_cb, list);
8c1b2355
MH
841 if (cb->security_cfm)
842 cb->security_cfm(conn, status, encrypt);
1da177e4 843 }
f20d09d5 844 read_unlock(&hci_cb_list_lock);
1da177e4
LT
845}
846
847static inline void hci_key_change_cfm(struct hci_conn *conn, __u8 status)
848{
849 struct list_head *p;
850
f20d09d5 851 read_lock(&hci_cb_list_lock);
1da177e4
LT
852 list_for_each(p, &hci_cb_list) {
853 struct hci_cb *cb = list_entry(p, struct hci_cb, list);
854 if (cb->key_change_cfm)
855 cb->key_change_cfm(conn, status);
856 }
f20d09d5 857 read_unlock(&hci_cb_list_lock);
1da177e4
LT
858}
859
5a9d0a3f
WR
860static inline void hci_role_switch_cfm(struct hci_conn *conn, __u8 status,
861 __u8 role)
1da177e4
LT
862{
863 struct list_head *p;
864
f20d09d5 865 read_lock(&hci_cb_list_lock);
1da177e4
LT
866 list_for_each(p, &hci_cb_list) {
867 struct hci_cb *cb = list_entry(p, struct hci_cb, list);
868 if (cb->role_switch_cfm)
869 cb->role_switch_cfm(conn, status, role);
870 }
f20d09d5 871 read_unlock(&hci_cb_list_lock);
1da177e4
LT
872}
873
874int hci_register_cb(struct hci_cb *hcb);
875int hci_unregister_cb(struct hci_cb *hcb);
876
877int hci_register_notifier(struct notifier_block *nb);
878int hci_unregister_notifier(struct notifier_block *nb);
879
a9de9248 880int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen, void *param);
73d80deb 881void hci_send_acl(struct hci_chan *chan, struct sk_buff *skb, __u16 flags);
0d861d8b 882void hci_send_sco(struct hci_conn *conn, struct sk_buff *skb);
1da177e4 883
a9de9248 884void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 opcode);
1da177e4
LT
885
886void hci_si_event(struct hci_dev *hdev, int type, int dlen, void *data);
887
888/* ----- HCI Sockets ----- */
eec8d2bc
JH
889void hci_send_to_sock(struct hci_dev *hdev, struct sk_buff *skb,
890 struct sock *skip_sk);
1da177e4 891
0381101f
JH
892/* Management interface */
893int mgmt_control(struct sock *sk, struct msghdr *msg, size_t len);
744cf19e
JH
894int mgmt_index_added(struct hci_dev *hdev);
895int mgmt_index_removed(struct hci_dev *hdev);
896int mgmt_powered(struct hci_dev *hdev, u8 powered);
897int mgmt_discoverable(struct hci_dev *hdev, u8 discoverable);
898int mgmt_connectable(struct hci_dev *hdev, u8 connectable);
899int mgmt_write_scan_failed(struct hci_dev *hdev, u8 scan, u8 status);
900int mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key,
901 u8 persistent);
48264f06
JH
902int mgmt_connected(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
903 u8 addr_type);
904int mgmt_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
905 u8 addr_type);
37d9ef76 906int mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 status);
48264f06
JH
907int mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
908 u8 addr_type, u8 status);
744cf19e
JH
909int mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure);
910int mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
c35938b2 911 u8 status);
744cf19e
JH
912int mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
913 u8 status);
914int mgmt_user_confirm_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
915 __le32 value, u8 confirm_hint);
916int mgmt_user_confirm_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
917 u8 status);
918int mgmt_user_confirm_neg_reply_complete(struct hci_dev *hdev,
919 bdaddr_t *bdaddr, u8 status);
604086b7
BG
920int mgmt_user_passkey_request(struct hci_dev *hdev, bdaddr_t *bdaddr);
921int mgmt_user_passkey_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
922 u8 status);
923int mgmt_user_passkey_neg_reply_complete(struct hci_dev *hdev,
924 bdaddr_t *bdaddr, u8 status);
744cf19e
JH
925int mgmt_auth_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 status);
926int mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status);
927int mgmt_read_local_oob_data_reply_complete(struct hci_dev *hdev, u8 *hash,
928 u8 *randomizer, u8 status);
48264f06 929int mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
561aafbc
JH
930 u8 addr_type, u8 *dev_class, s8 rssi,
931 u8 cfm_name, u8 *eir);
744cf19e 932int mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 *name);
7a135109 933int mgmt_start_discovery_failed(struct hci_dev *hdev, u8 status);
e6d465cb 934int mgmt_stop_discovery_failed(struct hci_dev *hdev, u8 status);
744cf19e
JH
935int mgmt_discovering(struct hci_dev *hdev, u8 discovering);
936int mgmt_device_blocked(struct hci_dev *hdev, bdaddr_t *bdaddr);
937int mgmt_device_unblocked(struct hci_dev *hdev, bdaddr_t *bdaddr);
0381101f 938
1da177e4
LT
939/* HCI info for socket */
940#define hci_pi(sk) ((struct hci_pinfo *) sk)
941
14c0b608
JH
942/* HCI socket flags */
943#define HCI_PI_MGMT_INIT 0
944
1da177e4
LT
945struct hci_pinfo {
946 struct bt_sock bt;
947 struct hci_dev *hdev;
948 struct hci_filter filter;
949 __u32 cmsg_mask;
c02178d2 950 unsigned short channel;
14c0b608 951 unsigned long flags;
1da177e4
LT
952};
953
954/* HCI security filter */
955#define HCI_SFLT_MAX_OGF 5
956
957struct hci_sec_filter {
958 __u32 type_mask;
959 __u32 event_mask[2];
960 __u32 ocf_mask[HCI_SFLT_MAX_OGF + 1][4];
961};
962
963/* ----- HCI requests ----- */
964#define HCI_REQ_DONE 0
965#define HCI_REQ_PEND 1
966#define HCI_REQ_CANCELED 2
967
a6a67efd
TG
968#define hci_req_lock(d) mutex_lock(&d->req_lock)
969#define hci_req_unlock(d) mutex_unlock(&d->req_lock)
1da177e4 970
23bb5763 971void hci_req_complete(struct hci_dev *hdev, __u16 cmd, int result);
1da177e4 972
2ce603eb
CT
973void hci_le_conn_update(struct hci_conn *conn, u16 min, u16 max,
974 u16 latency, u16 to_multiplier);
a7a595f6
VCG
975void hci_le_start_enc(struct hci_conn *conn, __le16 ediv, __u8 rand[8],
976 __u8 ltk[16]);
977void hci_le_ltk_reply(struct hci_conn *conn, u8 ltk[16]);
978void hci_le_ltk_neg_reply(struct hci_conn *conn);
979
2519a1fc 980int hci_do_inquiry(struct hci_dev *hdev, u8 length);
023d5049 981int hci_cancel_inquiry(struct hci_dev *hdev);
2519a1fc 982
1da177e4 983#endif /* __HCI_CORE_H */