]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - include/net/bluetooth/hci_core.h
Bluetooth: Add enable_le module parameter
[mirror_ubuntu-bionic-kernel.git] / include / net / bluetooth / hci_core.h
CommitLineData
04fafe4e 1/*
1da177e4 2 BlueZ - Bluetooth protocol stack for Linux
2d0a0346 3 Copyright (c) 2000-2001, 2010, Code Aurora Forum. All rights reserved.
1da177e4
LT
4
5 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License version 2 as
9 published by the Free Software Foundation;
10
11 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
12 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
14 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
04fafe4e
RS
15 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
16 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1da177e4
LT
18 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
04fafe4e
RS
20 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
1da177e4
LT
22 SOFTWARE IS DISCLAIMED.
23*/
24
25#ifndef __HCI_CORE_H
26#define __HCI_CORE_H
27
1da177e4
LT
28#include <net/bluetooth/hci.h>
29
30/* HCI upper protocols */
31#define HCI_PROTO_L2CAP 0
32#define HCI_PROTO_SCO 1
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 {
70f23020 47 struct inquiry_entry *next;
1da177e4
LT
48 __u32 timestamp;
49 struct inquiry_data data;
50};
51
52struct inquiry_cache {
70f23020 53 spinlock_t lock;
1da177e4 54 __u32 timestamp;
70f23020 55 struct inquiry_entry *list;
1da177e4
LT
56};
57
58struct hci_conn_hash {
59 struct list_head list;
60 spinlock_t lock;
61 unsigned int acl_num;
62 unsigned int sco_num;
fcd89c09 63 unsigned int le_num;
1da177e4
LT
64};
65
f0358568
JH
66struct bdaddr_list {
67 struct list_head list;
68 bdaddr_t bdaddr;
69};
2aeb9a1a
JH
70
71struct bt_uuid {
72 struct list_head list;
73 u8 uuid[16];
1aff6f09 74 u8 svc_hint;
2aeb9a1a
JH
75};
76
55ed8ca1
JH
77struct link_key {
78 struct list_head list;
79 bdaddr_t bdaddr;
80 u8 type;
81 u8 val[16];
82 u8 pin_len;
83};
84
2763eda6
SJ
85struct oob_data {
86 struct list_head list;
87 bdaddr_t bdaddr;
88 u8 hash[16];
89 u8 randomizer[16];
90};
91
76c8686f
AG
92struct adv_entry {
93 struct list_head list;
94 bdaddr_t bdaddr;
95 u8 bdaddr_type;
96};
97
cd4c5391 98#define NUM_REASSEMBLY 4
1da177e4
LT
99struct hci_dev {
100 struct list_head list;
101 spinlock_t lock;
102 atomic_t refcnt;
103
104 char name[8];
105 unsigned long flags;
106 __u16 id;
c13854ce 107 __u8 bus;
943da25d 108 __u8 dev_type;
1da177e4 109 bdaddr_t bdaddr;
1f6c6378 110 __u8 dev_name[HCI_MAX_NAME_LENGTH];
80a1e1db 111 __u8 eir[HCI_MAX_EIR_LENGTH];
a9de9248 112 __u8 dev_class[3];
1aff6f09
JH
113 __u8 major_class;
114 __u8 minor_class;
1da177e4 115 __u8 features[8];
971e3a4b 116 __u8 extfeatures[8];
a9de9248 117 __u8 commands[64];
333140b5 118 __u8 ssp_mode;
1143e5a6
MH
119 __u8 hci_ver;
120 __u16 hci_rev;
d5859e22 121 __u8 lmp_ver;
1143e5a6 122 __u16 manufacturer;
d5859e22 123 __le16 lmp_subver;
1da177e4 124 __u16 voice_setting;
17fa4b9d 125 __u8 io_capability;
1da177e4
LT
126
127 __u16 pkt_type;
5b7f9909 128 __u16 esco_type;
1da177e4
LT
129 __u16 link_policy;
130 __u16 link_mode;
131
04837f64
MH
132 __u32 idle_timeout;
133 __u16 sniff_min_interval;
134 __u16 sniff_max_interval;
135
9f61656a
JH
136 unsigned int auto_accept_delay;
137
1da177e4
LT
138 unsigned long quirks;
139
140 atomic_t cmd_cnt;
141 unsigned int acl_cnt;
142 unsigned int sco_cnt;
6ed58ec5 143 unsigned int le_cnt;
1da177e4
LT
144
145 unsigned int acl_mtu;
146 unsigned int sco_mtu;
6ed58ec5 147 unsigned int le_mtu;
1da177e4
LT
148 unsigned int acl_pkts;
149 unsigned int sco_pkts;
6ed58ec5 150 unsigned int le_pkts;
1da177e4 151
1da177e4
LT
152 unsigned long acl_last_tx;
153 unsigned long sco_last_tx;
6ed58ec5 154 unsigned long le_last_tx;
1da177e4 155
f48fd9c8
MH
156 struct workqueue_struct *workqueue;
157
ab81cbf9
JH
158 struct work_struct power_on;
159 struct work_struct power_off;
160 struct timer_list off_timer;
161
6bd32326 162 struct timer_list cmd_timer;
1da177e4
LT
163 struct tasklet_struct cmd_task;
164 struct tasklet_struct rx_task;
165 struct tasklet_struct tx_task;
166
167 struct sk_buff_head rx_q;
168 struct sk_buff_head raw_q;
169 struct sk_buff_head cmd_q;
170
171 struct sk_buff *sent_cmd;
cd4c5391 172 struct sk_buff *reassembly[NUM_REASSEMBLY];
1da177e4 173
a6a67efd 174 struct mutex req_lock;
1da177e4
LT
175 wait_queue_head_t req_wait_q;
176 __u32 req_status;
177 __u32 req_result;
a5040efa
JH
178
179 __u16 init_last_cmd;
1da177e4 180
3a0259bb
VCG
181 struct crypto_blkcipher *tfm;
182
1da177e4
LT
183 struct inquiry_cache inq_cache;
184 struct hci_conn_hash conn_hash;
ea4bd8ba 185 struct list_head blacklist;
1da177e4 186
2aeb9a1a
JH
187 struct list_head uuids;
188
55ed8ca1
JH
189 struct list_head link_keys;
190
2763eda6
SJ
191 struct list_head remote_oob_data;
192
76c8686f 193 struct list_head adv_entries;
35815085 194 struct timer_list adv_timer;
76c8686f 195
1da177e4
LT
196 struct hci_dev_stats stat;
197
198 struct sk_buff_head driver_init;
199
200 void *driver_data;
201 void *core_data;
202
70f23020 203 atomic_t promisc;
1da177e4 204
ca325f69
MH
205 struct dentry *debugfs;
206
a91f2e39
MH
207 struct device *parent;
208 struct device dev;
1da177e4 209
611b30f7
MH
210 struct rfkill *rfkill;
211
70f23020 212 struct module *owner;
1da177e4
LT
213
214 int (*open)(struct hci_dev *hdev);
215 int (*close)(struct hci_dev *hdev);
216 int (*flush)(struct hci_dev *hdev);
217 int (*send)(struct sk_buff *skb);
218 void (*destruct)(struct hci_dev *hdev);
219 void (*notify)(struct hci_dev *hdev, unsigned int evt);
220 int (*ioctl)(struct hci_dev *hdev, unsigned int cmd, unsigned long arg);
221};
222
223struct hci_conn {
224 struct list_head list;
225
adc4266d 226 atomic_t refcnt;
adc4266d
SJ
227
228 bdaddr_t dst;
5a9d0a3f 229 __u8 dst_type;
adc4266d
SJ
230 __u16 handle;
231 __u16 state;
232 __u8 mode;
233 __u8 type;
234 __u8 out;
235 __u8 attempt;
236 __u8 dev_class[3];
237 __u8 features[8];
238 __u8 ssp_mode;
239 __u16 interval;
240 __u16 pkt_type;
241 __u16 link_policy;
242 __u32 link_mode;
13d39315 243 __u8 key_type;
adc4266d
SJ
244 __u8 auth_type;
245 __u8 sec_level;
246 __u8 pending_sec_level;
247 __u8 pin_length;
248 __u8 io_capability;
249 __u8 power_save;
250 __u16 disc_timeout;
251 unsigned long pend;
a7a595f6 252 __u8 ltk[16];
04837f64 253
03b555e1
JH
254 __u8 remote_cap;
255 __u8 remote_oob;
256 __u8 remote_auth;
257
adc4266d 258 unsigned int sent;
04837f64 259
1da177e4
LT
260 struct sk_buff_head data_q;
261
04837f64
MH
262 struct timer_list disc_timer;
263 struct timer_list idle_timer;
9f61656a 264 struct timer_list auto_accept_timer;
04837f64 265
f3784d83
RQ
266 struct work_struct work_add;
267 struct work_struct work_del;
b219e3ac
MH
268
269 struct device dev;
9eba32b8 270 atomic_t devref;
b219e3ac 271
1da177e4
LT
272 struct hci_dev *hdev;
273 void *l2cap_data;
274 void *sco_data;
1da177e4
LT
275
276 struct hci_conn *link;
e9a416b5
JH
277
278 void (*connect_cfm_cb) (struct hci_conn *conn, u8 status);
279 void (*security_cfm_cb) (struct hci_conn *conn, u8 status);
280 void (*disconn_cfm_cb) (struct hci_conn *conn, u8 reason);
1da177e4
LT
281};
282
283extern struct hci_proto *hci_proto[];
284extern struct list_head hci_dev_list;
285extern struct list_head hci_cb_list;
286extern rwlock_t hci_dev_list_lock;
287extern rwlock_t hci_cb_list_lock;
288
289/* ----- Inquiry cache ----- */
70f23020
AE
290#define INQUIRY_CACHE_AGE_MAX (HZ*30) /* 30 seconds */
291#define INQUIRY_ENTRY_AGE_MAX (HZ*60) /* 60 seconds */
1da177e4
LT
292
293#define inquiry_cache_lock(c) spin_lock(&c->lock)
294#define inquiry_cache_unlock(c) spin_unlock(&c->lock)
295#define inquiry_cache_lock_bh(c) spin_lock_bh(&c->lock)
296#define inquiry_cache_unlock_bh(c) spin_unlock_bh(&c->lock)
297
298static inline void inquiry_cache_init(struct hci_dev *hdev)
299{
300 struct inquiry_cache *c = &hdev->inq_cache;
301 spin_lock_init(&c->lock);
302 c->list = NULL;
303}
304
305static inline int inquiry_cache_empty(struct hci_dev *hdev)
306{
307 struct inquiry_cache *c = &hdev->inq_cache;
a02cec21 308 return c->list == NULL;
1da177e4
LT
309}
310
311static inline long inquiry_cache_age(struct hci_dev *hdev)
312{
313 struct inquiry_cache *c = &hdev->inq_cache;
314 return jiffies - c->timestamp;
315}
316
317static inline long inquiry_entry_age(struct inquiry_entry *e)
318{
319 return jiffies - e->timestamp;
320}
321
5a9d0a3f
WR
322struct inquiry_entry *hci_inquiry_cache_lookup(struct hci_dev *hdev,
323 bdaddr_t *bdaddr);
1da177e4
LT
324void hci_inquiry_cache_update(struct hci_dev *hdev, struct inquiry_data *data);
325
326/* ----- HCI Connections ----- */
327enum {
328 HCI_CONN_AUTH_PEND,
19f8def0 329 HCI_CONN_REAUTH_PEND,
1da177e4 330 HCI_CONN_ENCRYPT_PEND,
04837f64
MH
331 HCI_CONN_RSWITCH_PEND,
332 HCI_CONN_MODE_CHANGE_PEND,
e73439d8 333 HCI_CONN_SCO_SETUP_PEND,
1da177e4
LT
334};
335
336static inline void hci_conn_hash_init(struct hci_dev *hdev)
337{
338 struct hci_conn_hash *h = &hdev->conn_hash;
339 INIT_LIST_HEAD(&h->list);
340 spin_lock_init(&h->lock);
341 h->acl_num = 0;
342 h->sco_num = 0;
343}
344
345static inline void hci_conn_hash_add(struct hci_dev *hdev, struct hci_conn *c)
346{
347 struct hci_conn_hash *h = &hdev->conn_hash;
348 list_add(&c->list, &h->list);
fcd89c09
VT
349 switch (c->type) {
350 case ACL_LINK:
1da177e4 351 h->acl_num++;
fcd89c09
VT
352 break;
353 case LE_LINK:
354 h->le_num++;
355 break;
356 case SCO_LINK:
357 case ESCO_LINK:
1da177e4 358 h->sco_num++;
fcd89c09
VT
359 break;
360 }
1da177e4
LT
361}
362
363static inline void hci_conn_hash_del(struct hci_dev *hdev, struct hci_conn *c)
364{
365 struct hci_conn_hash *h = &hdev->conn_hash;
366 list_del(&c->list);
fcd89c09
VT
367 switch (c->type) {
368 case ACL_LINK:
1da177e4 369 h->acl_num--;
fcd89c09
VT
370 break;
371 case LE_LINK:
372 h->le_num--;
373 break;
374 case SCO_LINK:
375 case ESCO_LINK:
1da177e4 376 h->sco_num--;
fcd89c09
VT
377 break;
378 }
1da177e4
LT
379}
380
381static inline struct hci_conn *hci_conn_hash_lookup_handle(struct hci_dev *hdev,
adc4266d 382 __u16 handle)
1da177e4
LT
383{
384 struct hci_conn_hash *h = &hdev->conn_hash;
385 struct list_head *p;
386 struct hci_conn *c;
387
388 list_for_each(p, &h->list) {
389 c = list_entry(p, struct hci_conn, list);
390 if (c->handle == handle)
391 return c;
392 }
393 return NULL;
394}
395
396static inline struct hci_conn *hci_conn_hash_lookup_ba(struct hci_dev *hdev,
adc4266d 397 __u8 type, bdaddr_t *ba)
1da177e4
LT
398{
399 struct hci_conn_hash *h = &hdev->conn_hash;
400 struct list_head *p;
401 struct hci_conn *c;
402
403 list_for_each(p, &h->list) {
404 c = list_entry(p, struct hci_conn, list);
405 if (c->type == type && !bacmp(&c->dst, ba))
406 return c;
407 }
408 return NULL;
409}
410
4c67bc74 411static inline struct hci_conn *hci_conn_hash_lookup_state(struct hci_dev *hdev,
adc4266d 412 __u8 type, __u16 state)
4c67bc74
MH
413{
414 struct hci_conn_hash *h = &hdev->conn_hash;
415 struct list_head *p;
416 struct hci_conn *c;
417
418 list_for_each(p, &h->list) {
419 c = list_entry(p, struct hci_conn, list);
420 if (c->type == type && c->state == state)
421 return c;
422 }
423 return NULL;
424}
425
426void hci_acl_connect(struct hci_conn *conn);
1da177e4
LT
427void hci_acl_disconn(struct hci_conn *conn, __u8 reason);
428void hci_add_sco(struct hci_conn *conn, __u16 handle);
b6a0dc82 429void hci_setup_sync(struct hci_conn *conn, __u16 handle);
e73439d8 430void hci_sco_setup(struct hci_conn *conn, __u8 status);
1da177e4
LT
431
432struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst);
a9de9248
MH
433int hci_conn_del(struct hci_conn *conn);
434void hci_conn_hash_flush(struct hci_dev *hdev);
435void hci_conn_check_pending(struct hci_dev *hdev);
1da177e4 436
5a9d0a3f
WR
437struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst,
438 __u8 sec_level, __u8 auth_type);
e7c29cb1 439int hci_conn_check_link_mode(struct hci_conn *conn);
b3b1b061 440int hci_conn_check_secure(struct hci_conn *conn, __u8 sec_level);
0684e5f9 441int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type);
1da177e4 442int hci_conn_change_link_key(struct hci_conn *conn);
8c1b2355 443int hci_conn_switch_role(struct hci_conn *conn, __u8 role);
1da177e4 444
14b12d0b 445void hci_conn_enter_active_mode(struct hci_conn *conn, __u8 force_active);
04837f64 446void hci_conn_enter_sniff_mode(struct hci_conn *conn);
1da177e4 447
9eba32b8
MH
448void hci_conn_hold_device(struct hci_conn *conn);
449void hci_conn_put_device(struct hci_conn *conn);
450
1da177e4
LT
451static inline void hci_conn_hold(struct hci_conn *conn)
452{
453 atomic_inc(&conn->refcnt);
04837f64 454 del_timer(&conn->disc_timer);
1da177e4
LT
455}
456
457static inline void hci_conn_put(struct hci_conn *conn)
458{
459 if (atomic_dec_and_test(&conn->refcnt)) {
04837f64 460 unsigned long timeo;
1da177e4 461 if (conn->type == ACL_LINK) {
04837f64 462 del_timer(&conn->idle_timer);
6ac59344 463 if (conn->state == BT_CONNECTED) {
052b30b0 464 timeo = msecs_to_jiffies(conn->disc_timeout);
6ac59344 465 if (!conn->out)
052b30b0 466 timeo *= 2;
5a9d0a3f 467 } else {
6ac59344 468 timeo = msecs_to_jiffies(10);
5a9d0a3f
WR
469 }
470 } else {
04837f64 471 timeo = msecs_to_jiffies(10);
5a9d0a3f 472 }
04837f64 473 mod_timer(&conn->disc_timer, jiffies + timeo);
1da177e4
LT
474 }
475}
476
1da177e4
LT
477/* ----- HCI Devices ----- */
478static inline void __hci_dev_put(struct hci_dev *d)
479{
480 if (atomic_dec_and_test(&d->refcnt))
481 d->destruct(d);
482}
483
484static inline void hci_dev_put(struct hci_dev *d)
04fafe4e 485{
1da177e4
LT
486 __hci_dev_put(d);
487 module_put(d->owner);
488}
489
490static inline struct hci_dev *__hci_dev_hold(struct hci_dev *d)
491{
492 atomic_inc(&d->refcnt);
493 return d;
494}
495
496static inline struct hci_dev *hci_dev_hold(struct hci_dev *d)
497{
498 if (try_module_get(d->owner))
499 return __hci_dev_hold(d);
500 return NULL;
501}
502
503#define hci_dev_lock(d) spin_lock(&d->lock)
504#define hci_dev_unlock(d) spin_unlock(&d->lock)
505#define hci_dev_lock_bh(d) spin_lock_bh(&d->lock)
506#define hci_dev_unlock_bh(d) spin_unlock_bh(&d->lock)
507
508struct hci_dev *hci_dev_get(int index);
509struct hci_dev *hci_get_route(bdaddr_t *src, bdaddr_t *dst);
510
511struct hci_dev *hci_alloc_dev(void);
512void hci_free_dev(struct hci_dev *hdev);
513int hci_register_dev(struct hci_dev *hdev);
514int hci_unregister_dev(struct hci_dev *hdev);
515int hci_suspend_dev(struct hci_dev *hdev);
516int hci_resume_dev(struct hci_dev *hdev);
517int hci_dev_open(__u16 dev);
518int hci_dev_close(__u16 dev);
519int hci_dev_reset(__u16 dev);
520int hci_dev_reset_stat(__u16 dev);
521int hci_dev_cmd(unsigned int cmd, void __user *arg);
522int hci_get_dev_list(void __user *arg);
523int hci_get_dev_info(void __user *arg);
524int hci_get_conn_list(void __user *arg);
525int hci_get_conn_info(struct hci_dev *hdev, void __user *arg);
40be492f 526int hci_get_auth_info(struct hci_dev *hdev, void __user *arg);
1da177e4
LT
527int hci_inquiry(void __user *arg);
528
f0358568
JH
529struct bdaddr_list *hci_blacklist_lookup(struct hci_dev *hdev, bdaddr_t *bdaddr);
530int hci_blacklist_clear(struct hci_dev *hdev);
b2a66aad
AJ
531int hci_blacklist_add(struct hci_dev *hdev, bdaddr_t *bdaddr);
532int hci_blacklist_del(struct hci_dev *hdev, bdaddr_t *bdaddr);
f0358568 533
2aeb9a1a
JH
534int hci_uuids_clear(struct hci_dev *hdev);
535
55ed8ca1
JH
536int hci_link_keys_clear(struct hci_dev *hdev);
537struct link_key *hci_find_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr);
d25e28ab
JH
538int hci_add_link_key(struct hci_dev *hdev, struct hci_conn *conn, int new_key,
539 bdaddr_t *bdaddr, u8 *val, u8 type, u8 pin_len);
55ed8ca1
JH
540int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr);
541
2763eda6
SJ
542int hci_remote_oob_data_clear(struct hci_dev *hdev);
543struct oob_data *hci_find_remote_oob_data(struct hci_dev *hdev,
544 bdaddr_t *bdaddr);
545int hci_add_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 *hash,
546 u8 *randomizer);
547int hci_remove_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr);
548
35815085 549#define ADV_CLEAR_TIMEOUT (3*60*HZ) /* Three minutes */
76c8686f
AG
550int hci_adv_entries_clear(struct hci_dev *hdev);
551struct adv_entry *hci_find_adv_entry(struct hci_dev *hdev, bdaddr_t *bdaddr);
552int hci_add_adv_entry(struct hci_dev *hdev,
553 struct hci_ev_le_advertising_info *ev);
554
ab81cbf9
JH
555void hci_del_off_timer(struct hci_dev *hdev);
556
1da177e4
LT
557void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb);
558
76bca880 559int hci_recv_frame(struct sk_buff *skb);
ef222013 560int hci_recv_fragment(struct hci_dev *hdev, int type, void *data, int count);
99811510 561int hci_recv_stream_fragment(struct hci_dev *hdev, void *data, int count);
ef222013 562
1da177e4
LT
563int hci_register_sysfs(struct hci_dev *hdev);
564void hci_unregister_sysfs(struct hci_dev *hdev);
a67e899c 565void hci_conn_init_sysfs(struct hci_conn *conn);
b219e3ac
MH
566void hci_conn_add_sysfs(struct hci_conn *conn);
567void hci_conn_del_sysfs(struct hci_conn *conn);
1da177e4 568
a91f2e39 569#define SET_HCIDEV_DEV(hdev, pdev) ((hdev)->parent = (pdev))
1da177e4
LT
570
571/* ----- LMP capabilities ----- */
04837f64
MH
572#define lmp_rswitch_capable(dev) ((dev)->features[0] & LMP_RSWITCH)
573#define lmp_encrypt_capable(dev) ((dev)->features[0] & LMP_ENCRYPT)
574#define lmp_sniff_capable(dev) ((dev)->features[0] & LMP_SNIFF)
575#define lmp_sniffsubr_capable(dev) ((dev)->features[5] & LMP_SNIFF_SUBR)
5b7f9909 576#define lmp_esco_capable(dev) ((dev)->features[3] & LMP_ESCO)
769be974 577#define lmp_ssp_capable(dev) ((dev)->features[6] & LMP_SIMPLE_PAIR)
e702112f 578#define lmp_no_flush_capable(dev) ((dev)->features[6] & LMP_NO_FLUSH)
6ed58ec5 579#define lmp_le_capable(dev) ((dev)->features[4] & LMP_LE)
1da177e4
LT
580
581/* ----- HCI protocols ----- */
582struct hci_proto {
8c1b2355 583 char *name;
1da177e4
LT
584 unsigned int id;
585 unsigned long flags;
586
587 void *priv;
588
5a9d0a3f
WR
589 int (*connect_ind) (struct hci_dev *hdev, bdaddr_t *bdaddr,
590 __u8 type);
1da177e4 591 int (*connect_cfm) (struct hci_conn *conn, __u8 status);
2950f21a
MH
592 int (*disconn_ind) (struct hci_conn *conn);
593 int (*disconn_cfm) (struct hci_conn *conn, __u8 reason);
5a9d0a3f
WR
594 int (*recv_acldata) (struct hci_conn *conn, struct sk_buff *skb,
595 __u16 flags);
1da177e4 596 int (*recv_scodata) (struct hci_conn *conn, struct sk_buff *skb);
5a9d0a3f
WR
597 int (*security_cfm) (struct hci_conn *conn, __u8 status,
598 __u8 encrypt);
1da177e4
LT
599};
600
5a9d0a3f
WR
601static inline int hci_proto_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr,
602 __u8 type)
1da177e4
LT
603{
604 register struct hci_proto *hp;
605 int mask = 0;
8c1b2355 606
1da177e4
LT
607 hp = hci_proto[HCI_PROTO_L2CAP];
608 if (hp && hp->connect_ind)
609 mask |= hp->connect_ind(hdev, bdaddr, type);
610
611 hp = hci_proto[HCI_PROTO_SCO];
612 if (hp && hp->connect_ind)
613 mask |= hp->connect_ind(hdev, bdaddr, type);
614
615 return mask;
616}
617
618static inline void hci_proto_connect_cfm(struct hci_conn *conn, __u8 status)
619{
620 register struct hci_proto *hp;
621
622 hp = hci_proto[HCI_PROTO_L2CAP];
623 if (hp && hp->connect_cfm)
624 hp->connect_cfm(conn, status);
625
626 hp = hci_proto[HCI_PROTO_SCO];
627 if (hp && hp->connect_cfm)
628 hp->connect_cfm(conn, status);
e9a416b5
JH
629
630 if (conn->connect_cfm_cb)
631 conn->connect_cfm_cb(conn, status);
1da177e4
LT
632}
633
2950f21a 634static inline int hci_proto_disconn_ind(struct hci_conn *conn)
1da177e4
LT
635{
636 register struct hci_proto *hp;
2950f21a 637 int reason = 0x13;
1da177e4
LT
638
639 hp = hci_proto[HCI_PROTO_L2CAP];
640 if (hp && hp->disconn_ind)
2950f21a 641 reason = hp->disconn_ind(conn);
1da177e4
LT
642
643 hp = hci_proto[HCI_PROTO_SCO];
644 if (hp && hp->disconn_ind)
2950f21a
MH
645 reason = hp->disconn_ind(conn);
646
647 return reason;
648}
649
650static inline void hci_proto_disconn_cfm(struct hci_conn *conn, __u8 reason)
651{
652 register struct hci_proto *hp;
653
654 hp = hci_proto[HCI_PROTO_L2CAP];
655 if (hp && hp->disconn_cfm)
656 hp->disconn_cfm(conn, reason);
657
658 hp = hci_proto[HCI_PROTO_SCO];
659 if (hp && hp->disconn_cfm)
660 hp->disconn_cfm(conn, reason);
e9a416b5
JH
661
662 if (conn->disconn_cfm_cb)
663 conn->disconn_cfm_cb(conn, reason);
1da177e4
LT
664}
665
666static inline void hci_proto_auth_cfm(struct hci_conn *conn, __u8 status)
667{
668 register struct hci_proto *hp;
8c1b2355
MH
669 __u8 encrypt;
670
671 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend))
672 return;
673
674 encrypt = (conn->link_mode & HCI_LM_ENCRYPT) ? 0x01 : 0x00;
1da177e4
LT
675
676 hp = hci_proto[HCI_PROTO_L2CAP];
8c1b2355
MH
677 if (hp && hp->security_cfm)
678 hp->security_cfm(conn, status, encrypt);
1da177e4
LT
679
680 hp = hci_proto[HCI_PROTO_SCO];
8c1b2355
MH
681 if (hp && hp->security_cfm)
682 hp->security_cfm(conn, status, encrypt);
e9a416b5
JH
683
684 if (conn->security_cfm_cb)
685 conn->security_cfm_cb(conn, status);
1da177e4
LT
686}
687
5a9d0a3f
WR
688static inline void hci_proto_encrypt_cfm(struct hci_conn *conn, __u8 status,
689 __u8 encrypt)
1da177e4
LT
690{
691 register struct hci_proto *hp;
692
693 hp = hci_proto[HCI_PROTO_L2CAP];
8c1b2355
MH
694 if (hp && hp->security_cfm)
695 hp->security_cfm(conn, status, encrypt);
1da177e4
LT
696
697 hp = hci_proto[HCI_PROTO_SCO];
8c1b2355
MH
698 if (hp && hp->security_cfm)
699 hp->security_cfm(conn, status, encrypt);
e9a416b5
JH
700
701 if (conn->security_cfm_cb)
702 conn->security_cfm_cb(conn, status);
1da177e4
LT
703}
704
705int hci_register_proto(struct hci_proto *hproto);
706int hci_unregister_proto(struct hci_proto *hproto);
707
708/* ----- HCI callbacks ----- */
709struct hci_cb {
710 struct list_head list;
711
712 char *name;
713
5a9d0a3f
WR
714 void (*security_cfm) (struct hci_conn *conn, __u8 status,
715 __u8 encrypt);
1da177e4
LT
716 void (*key_change_cfm) (struct hci_conn *conn, __u8 status);
717 void (*role_switch_cfm) (struct hci_conn *conn, __u8 status, __u8 role);
718};
719
720static inline void hci_auth_cfm(struct hci_conn *conn, __u8 status)
721{
722 struct list_head *p;
8c1b2355 723 __u8 encrypt;
1da177e4
LT
724
725 hci_proto_auth_cfm(conn, status);
726
8c1b2355
MH
727 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend))
728 return;
729
730 encrypt = (conn->link_mode & HCI_LM_ENCRYPT) ? 0x01 : 0x00;
731
1da177e4
LT
732 read_lock_bh(&hci_cb_list_lock);
733 list_for_each(p, &hci_cb_list) {
734 struct hci_cb *cb = list_entry(p, struct hci_cb, list);
8c1b2355
MH
735 if (cb->security_cfm)
736 cb->security_cfm(conn, status, encrypt);
1da177e4
LT
737 }
738 read_unlock_bh(&hci_cb_list_lock);
739}
740
5a9d0a3f
WR
741static inline void hci_encrypt_cfm(struct hci_conn *conn, __u8 status,
742 __u8 encrypt)
1da177e4
LT
743{
744 struct list_head *p;
745
435fef20
MH
746 if (conn->sec_level == BT_SECURITY_SDP)
747 conn->sec_level = BT_SECURITY_LOW;
748
88167aed
VCG
749 if (conn->pending_sec_level > conn->sec_level)
750 conn->sec_level = conn->pending_sec_level;
751
9719f8af 752 hci_proto_encrypt_cfm(conn, status, encrypt);
1da177e4
LT
753
754 read_lock_bh(&hci_cb_list_lock);
755 list_for_each(p, &hci_cb_list) {
756 struct hci_cb *cb = list_entry(p, struct hci_cb, list);
8c1b2355
MH
757 if (cb->security_cfm)
758 cb->security_cfm(conn, status, encrypt);
1da177e4
LT
759 }
760 read_unlock_bh(&hci_cb_list_lock);
761}
762
763static inline void hci_key_change_cfm(struct hci_conn *conn, __u8 status)
764{
765 struct list_head *p;
766
767 read_lock_bh(&hci_cb_list_lock);
768 list_for_each(p, &hci_cb_list) {
769 struct hci_cb *cb = list_entry(p, struct hci_cb, list);
770 if (cb->key_change_cfm)
771 cb->key_change_cfm(conn, status);
772 }
773 read_unlock_bh(&hci_cb_list_lock);
774}
775
5a9d0a3f
WR
776static inline void hci_role_switch_cfm(struct hci_conn *conn, __u8 status,
777 __u8 role)
1da177e4
LT
778{
779 struct list_head *p;
780
781 read_lock_bh(&hci_cb_list_lock);
782 list_for_each(p, &hci_cb_list) {
783 struct hci_cb *cb = list_entry(p, struct hci_cb, list);
784 if (cb->role_switch_cfm)
785 cb->role_switch_cfm(conn, status, role);
786 }
787 read_unlock_bh(&hci_cb_list_lock);
788}
789
790int hci_register_cb(struct hci_cb *hcb);
791int hci_unregister_cb(struct hci_cb *hcb);
792
793int hci_register_notifier(struct notifier_block *nb);
794int hci_unregister_notifier(struct notifier_block *nb);
795
a9de9248 796int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen, void *param);
9a9c6a34 797void hci_send_acl(struct hci_conn *conn, struct sk_buff *skb, __u16 flags);
0d861d8b 798void hci_send_sco(struct hci_conn *conn, struct sk_buff *skb);
1da177e4 799
a9de9248 800void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 opcode);
1da177e4
LT
801
802void hci_si_event(struct hci_dev *hdev, int type, int dlen, void *data);
803
804/* ----- HCI Sockets ----- */
eec8d2bc
JH
805void hci_send_to_sock(struct hci_dev *hdev, struct sk_buff *skb,
806 struct sock *skip_sk);
1da177e4 807
0381101f
JH
808/* Management interface */
809int mgmt_control(struct sock *sk, struct msghdr *msg, size_t len);
c71e97bf
JH
810int mgmt_index_added(u16 index);
811int mgmt_index_removed(u16 index);
5add6af8 812int mgmt_powered(u16 index, u8 powered);
73f22f62 813int mgmt_discoverable(u16 index, u8 discoverable);
9fbcbb45 814int mgmt_connectable(u16 index, u8 connectable);
4df378a1 815int mgmt_new_key(u16 index, struct link_key *key, u8 persistent);
f7520543
JH
816int mgmt_connected(u16 index, bdaddr_t *bdaddr);
817int mgmt_disconnected(u16 index, bdaddr_t *bdaddr);
8962ee74 818int mgmt_disconnect_failed(u16 index);
17d5c04c 819int mgmt_connect_failed(u16 index, bdaddr_t *bdaddr, u8 status);
a770bb5a 820int mgmt_pin_code_request(u16 index, bdaddr_t *bdaddr, u8 secure);
980e1a53
JH
821int mgmt_pin_code_reply_complete(u16 index, bdaddr_t *bdaddr, u8 status);
822int mgmt_pin_code_neg_reply_complete(u16 index, bdaddr_t *bdaddr, u8 status);
55bc1a37
JH
823int mgmt_user_confirm_request(u16 index, bdaddr_t *bdaddr, __le32 value,
824 u8 confirm_hint);
a5c29683
JH
825int mgmt_user_confirm_reply_complete(u16 index, bdaddr_t *bdaddr, u8 status);
826int mgmt_user_confirm_neg_reply_complete(u16 index, bdaddr_t *bdaddr,
827 u8 status);
2a611692 828int mgmt_auth_failed(u16 index, bdaddr_t *bdaddr, u8 status);
b312b161 829int mgmt_set_local_name_complete(u16 index, u8 *name, u8 status);
c35938b2
SJ
830int mgmt_read_local_oob_data_reply_complete(u16 index, u8 *hash, u8 *randomizer,
831 u8 status);
e17acd40
JH
832int mgmt_device_found(u16 index, bdaddr_t *bdaddr, u8 *dev_class, s8 rssi,
833 u8 *eir);
a88a9652 834int mgmt_remote_name(u16 index, bdaddr_t *bdaddr, u8 *name);
314b2381 835int mgmt_discovering(u16 index, u8 discovering);
0381101f 836
1da177e4
LT
837/* HCI info for socket */
838#define hci_pi(sk) ((struct hci_pinfo *) sk)
839
840struct hci_pinfo {
841 struct bt_sock bt;
842 struct hci_dev *hdev;
843 struct hci_filter filter;
844 __u32 cmsg_mask;
c02178d2 845 unsigned short channel;
1da177e4
LT
846};
847
848/* HCI security filter */
849#define HCI_SFLT_MAX_OGF 5
850
851struct hci_sec_filter {
852 __u32 type_mask;
853 __u32 event_mask[2];
854 __u32 ocf_mask[HCI_SFLT_MAX_OGF + 1][4];
855};
856
857/* ----- HCI requests ----- */
858#define HCI_REQ_DONE 0
859#define HCI_REQ_PEND 1
860#define HCI_REQ_CANCELED 2
861
a6a67efd
TG
862#define hci_req_lock(d) mutex_lock(&d->req_lock)
863#define hci_req_unlock(d) mutex_unlock(&d->req_lock)
1da177e4 864
23bb5763 865void hci_req_complete(struct hci_dev *hdev, __u16 cmd, int result);
1da177e4 866
2ce603eb
CT
867void hci_le_conn_update(struct hci_conn *conn, u16 min, u16 max,
868 u16 latency, u16 to_multiplier);
a7a595f6
VCG
869void hci_le_start_enc(struct hci_conn *conn, __le16 ediv, __u8 rand[8],
870 __u8 ltk[16]);
871void hci_le_ltk_reply(struct hci_conn *conn, u8 ltk[16]);
872void hci_le_ltk_neg_reply(struct hci_conn *conn);
873
1da177e4 874#endif /* __HCI_CORE_H */