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