Bluetooth: Remove old_key_type from mgmt_ev_new_key
[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);
0684e5f9 425int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type);
1da177e4 426int hci_conn_change_link_key(struct hci_conn *conn);
8c1b2355 427int hci_conn_switch_role(struct hci_conn *conn, __u8 role);
1da177e4 428
04837f64
MH
429void hci_conn_enter_active_mode(struct hci_conn *conn);
430void hci_conn_enter_sniff_mode(struct hci_conn *conn);
1da177e4 431
9eba32b8
MH
432void hci_conn_hold_device(struct hci_conn *conn);
433void hci_conn_put_device(struct hci_conn *conn);
434
1da177e4
LT
435static inline void hci_conn_hold(struct hci_conn *conn)
436{
437 atomic_inc(&conn->refcnt);
04837f64 438 del_timer(&conn->disc_timer);
1da177e4
LT
439}
440
441static inline void hci_conn_put(struct hci_conn *conn)
442{
443 if (atomic_dec_and_test(&conn->refcnt)) {
04837f64 444 unsigned long timeo;
1da177e4 445 if (conn->type == ACL_LINK) {
04837f64 446 del_timer(&conn->idle_timer);
6ac59344 447 if (conn->state == BT_CONNECTED) {
052b30b0 448 timeo = msecs_to_jiffies(conn->disc_timeout);
6ac59344 449 if (!conn->out)
052b30b0 450 timeo *= 2;
6ac59344
MH
451 } else
452 timeo = msecs_to_jiffies(10);
1da177e4 453 } else
04837f64
MH
454 timeo = msecs_to_jiffies(10);
455 mod_timer(&conn->disc_timer, jiffies + timeo);
1da177e4
LT
456 }
457}
458
1da177e4
LT
459/* ----- HCI Devices ----- */
460static inline void __hci_dev_put(struct hci_dev *d)
461{
462 if (atomic_dec_and_test(&d->refcnt))
463 d->destruct(d);
464}
465
466static inline void hci_dev_put(struct hci_dev *d)
04fafe4e 467{
1da177e4
LT
468 __hci_dev_put(d);
469 module_put(d->owner);
470}
471
472static inline struct hci_dev *__hci_dev_hold(struct hci_dev *d)
473{
474 atomic_inc(&d->refcnt);
475 return d;
476}
477
478static inline struct hci_dev *hci_dev_hold(struct hci_dev *d)
479{
480 if (try_module_get(d->owner))
481 return __hci_dev_hold(d);
482 return NULL;
483}
484
485#define hci_dev_lock(d) spin_lock(&d->lock)
486#define hci_dev_unlock(d) spin_unlock(&d->lock)
487#define hci_dev_lock_bh(d) spin_lock_bh(&d->lock)
488#define hci_dev_unlock_bh(d) spin_unlock_bh(&d->lock)
489
490struct hci_dev *hci_dev_get(int index);
491struct hci_dev *hci_get_route(bdaddr_t *src, bdaddr_t *dst);
492
493struct hci_dev *hci_alloc_dev(void);
494void hci_free_dev(struct hci_dev *hdev);
495int hci_register_dev(struct hci_dev *hdev);
496int hci_unregister_dev(struct hci_dev *hdev);
497int hci_suspend_dev(struct hci_dev *hdev);
498int hci_resume_dev(struct hci_dev *hdev);
499int hci_dev_open(__u16 dev);
500int hci_dev_close(__u16 dev);
501int hci_dev_reset(__u16 dev);
502int hci_dev_reset_stat(__u16 dev);
503int hci_dev_cmd(unsigned int cmd, void __user *arg);
504int hci_get_dev_list(void __user *arg);
505int hci_get_dev_info(void __user *arg);
506int hci_get_conn_list(void __user *arg);
507int hci_get_conn_info(struct hci_dev *hdev, void __user *arg);
40be492f 508int hci_get_auth_info(struct hci_dev *hdev, void __user *arg);
1da177e4
LT
509int hci_inquiry(void __user *arg);
510
f0358568
JH
511struct bdaddr_list *hci_blacklist_lookup(struct hci_dev *hdev, bdaddr_t *bdaddr);
512int hci_blacklist_clear(struct hci_dev *hdev);
513
2aeb9a1a
JH
514int hci_uuids_clear(struct hci_dev *hdev);
515
55ed8ca1
JH
516int hci_link_keys_clear(struct hci_dev *hdev);
517struct link_key *hci_find_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr);
d25e28ab
JH
518int hci_add_link_key(struct hci_dev *hdev, struct hci_conn *conn, int new_key,
519 bdaddr_t *bdaddr, u8 *val, u8 type, u8 pin_len);
55ed8ca1
JH
520int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr);
521
2763eda6
SJ
522int hci_remote_oob_data_clear(struct hci_dev *hdev);
523struct oob_data *hci_find_remote_oob_data(struct hci_dev *hdev,
524 bdaddr_t *bdaddr);
525int hci_add_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 *hash,
526 u8 *randomizer);
527int hci_remove_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr);
528
ab81cbf9
JH
529void hci_del_off_timer(struct hci_dev *hdev);
530
1da177e4
LT
531void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb);
532
76bca880 533int hci_recv_frame(struct sk_buff *skb);
ef222013 534int hci_recv_fragment(struct hci_dev *hdev, int type, void *data, int count);
99811510 535int hci_recv_stream_fragment(struct hci_dev *hdev, void *data, int count);
ef222013 536
1da177e4
LT
537int hci_register_sysfs(struct hci_dev *hdev);
538void hci_unregister_sysfs(struct hci_dev *hdev);
a67e899c 539void hci_conn_init_sysfs(struct hci_conn *conn);
b219e3ac
MH
540void hci_conn_add_sysfs(struct hci_conn *conn);
541void hci_conn_del_sysfs(struct hci_conn *conn);
1da177e4 542
a91f2e39 543#define SET_HCIDEV_DEV(hdev, pdev) ((hdev)->parent = (pdev))
1da177e4
LT
544
545/* ----- LMP capabilities ----- */
04837f64
MH
546#define lmp_rswitch_capable(dev) ((dev)->features[0] & LMP_RSWITCH)
547#define lmp_encrypt_capable(dev) ((dev)->features[0] & LMP_ENCRYPT)
548#define lmp_sniff_capable(dev) ((dev)->features[0] & LMP_SNIFF)
549#define lmp_sniffsubr_capable(dev) ((dev)->features[5] & LMP_SNIFF_SUBR)
5b7f9909 550#define lmp_esco_capable(dev) ((dev)->features[3] & LMP_ESCO)
769be974 551#define lmp_ssp_capable(dev) ((dev)->features[6] & LMP_SIMPLE_PAIR)
e702112f 552#define lmp_no_flush_capable(dev) ((dev)->features[6] & LMP_NO_FLUSH)
6ed58ec5 553#define lmp_le_capable(dev) ((dev)->features[4] & LMP_LE)
1da177e4
LT
554
555/* ----- HCI protocols ----- */
556struct hci_proto {
8c1b2355 557 char *name;
1da177e4
LT
558 unsigned int id;
559 unsigned long flags;
560
561 void *priv;
562
8c1b2355 563 int (*connect_ind) (struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 type);
1da177e4 564 int (*connect_cfm) (struct hci_conn *conn, __u8 status);
2950f21a
MH
565 int (*disconn_ind) (struct hci_conn *conn);
566 int (*disconn_cfm) (struct hci_conn *conn, __u8 reason);
1da177e4
LT
567 int (*recv_acldata) (struct hci_conn *conn, struct sk_buff *skb, __u16 flags);
568 int (*recv_scodata) (struct hci_conn *conn, struct sk_buff *skb);
8c1b2355 569 int (*security_cfm) (struct hci_conn *conn, __u8 status, __u8 encrypt);
1da177e4
LT
570};
571
572static inline int hci_proto_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 type)
573{
574 register struct hci_proto *hp;
575 int mask = 0;
8c1b2355 576
1da177e4
LT
577 hp = hci_proto[HCI_PROTO_L2CAP];
578 if (hp && hp->connect_ind)
579 mask |= hp->connect_ind(hdev, bdaddr, type);
580
581 hp = hci_proto[HCI_PROTO_SCO];
582 if (hp && hp->connect_ind)
583 mask |= hp->connect_ind(hdev, bdaddr, type);
584
585 return mask;
586}
587
588static inline void hci_proto_connect_cfm(struct hci_conn *conn, __u8 status)
589{
590 register struct hci_proto *hp;
591
592 hp = hci_proto[HCI_PROTO_L2CAP];
593 if (hp && hp->connect_cfm)
594 hp->connect_cfm(conn, status);
595
596 hp = hci_proto[HCI_PROTO_SCO];
597 if (hp && hp->connect_cfm)
598 hp->connect_cfm(conn, status);
e9a416b5
JH
599
600 if (conn->connect_cfm_cb)
601 conn->connect_cfm_cb(conn, status);
1da177e4
LT
602}
603
2950f21a 604static inline int hci_proto_disconn_ind(struct hci_conn *conn)
1da177e4
LT
605{
606 register struct hci_proto *hp;
2950f21a 607 int reason = 0x13;
1da177e4
LT
608
609 hp = hci_proto[HCI_PROTO_L2CAP];
610 if (hp && hp->disconn_ind)
2950f21a 611 reason = hp->disconn_ind(conn);
1da177e4
LT
612
613 hp = hci_proto[HCI_PROTO_SCO];
614 if (hp && hp->disconn_ind)
2950f21a
MH
615 reason = hp->disconn_ind(conn);
616
617 return reason;
618}
619
620static inline void hci_proto_disconn_cfm(struct hci_conn *conn, __u8 reason)
621{
622 register struct hci_proto *hp;
623
624 hp = hci_proto[HCI_PROTO_L2CAP];
625 if (hp && hp->disconn_cfm)
626 hp->disconn_cfm(conn, reason);
627
628 hp = hci_proto[HCI_PROTO_SCO];
629 if (hp && hp->disconn_cfm)
630 hp->disconn_cfm(conn, reason);
e9a416b5
JH
631
632 if (conn->disconn_cfm_cb)
633 conn->disconn_cfm_cb(conn, reason);
1da177e4
LT
634}
635
636static inline void hci_proto_auth_cfm(struct hci_conn *conn, __u8 status)
637{
638 register struct hci_proto *hp;
8c1b2355
MH
639 __u8 encrypt;
640
641 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend))
642 return;
643
644 encrypt = (conn->link_mode & HCI_LM_ENCRYPT) ? 0x01 : 0x00;
1da177e4
LT
645
646 hp = hci_proto[HCI_PROTO_L2CAP];
8c1b2355
MH
647 if (hp && hp->security_cfm)
648 hp->security_cfm(conn, status, encrypt);
1da177e4
LT
649
650 hp = hci_proto[HCI_PROTO_SCO];
8c1b2355
MH
651 if (hp && hp->security_cfm)
652 hp->security_cfm(conn, status, encrypt);
e9a416b5
JH
653
654 if (conn->security_cfm_cb)
655 conn->security_cfm_cb(conn, status);
1da177e4
LT
656}
657
9719f8af 658static inline void hci_proto_encrypt_cfm(struct hci_conn *conn, __u8 status, __u8 encrypt)
1da177e4
LT
659{
660 register struct hci_proto *hp;
661
662 hp = hci_proto[HCI_PROTO_L2CAP];
8c1b2355
MH
663 if (hp && hp->security_cfm)
664 hp->security_cfm(conn, status, encrypt);
1da177e4
LT
665
666 hp = hci_proto[HCI_PROTO_SCO];
8c1b2355
MH
667 if (hp && hp->security_cfm)
668 hp->security_cfm(conn, status, encrypt);
e9a416b5
JH
669
670 if (conn->security_cfm_cb)
671 conn->security_cfm_cb(conn, status);
1da177e4
LT
672}
673
674int hci_register_proto(struct hci_proto *hproto);
675int hci_unregister_proto(struct hci_proto *hproto);
676
677/* ----- HCI callbacks ----- */
678struct hci_cb {
679 struct list_head list;
680
681 char *name;
682
8c1b2355 683 void (*security_cfm) (struct hci_conn *conn, __u8 status, __u8 encrypt);
1da177e4
LT
684 void (*key_change_cfm) (struct hci_conn *conn, __u8 status);
685 void (*role_switch_cfm) (struct hci_conn *conn, __u8 status, __u8 role);
686};
687
688static inline void hci_auth_cfm(struct hci_conn *conn, __u8 status)
689{
690 struct list_head *p;
8c1b2355 691 __u8 encrypt;
1da177e4
LT
692
693 hci_proto_auth_cfm(conn, status);
694
8c1b2355
MH
695 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend))
696 return;
697
698 encrypt = (conn->link_mode & HCI_LM_ENCRYPT) ? 0x01 : 0x00;
699
1da177e4
LT
700 read_lock_bh(&hci_cb_list_lock);
701 list_for_each(p, &hci_cb_list) {
702 struct hci_cb *cb = list_entry(p, struct hci_cb, list);
8c1b2355
MH
703 if (cb->security_cfm)
704 cb->security_cfm(conn, status, encrypt);
1da177e4
LT
705 }
706 read_unlock_bh(&hci_cb_list_lock);
707}
708
709static inline void hci_encrypt_cfm(struct hci_conn *conn, __u8 status, __u8 encrypt)
710{
711 struct list_head *p;
712
435fef20
MH
713 if (conn->sec_level == BT_SECURITY_SDP)
714 conn->sec_level = BT_SECURITY_LOW;
715
9719f8af 716 hci_proto_encrypt_cfm(conn, status, encrypt);
1da177e4
LT
717
718 read_lock_bh(&hci_cb_list_lock);
719 list_for_each(p, &hci_cb_list) {
720 struct hci_cb *cb = list_entry(p, struct hci_cb, list);
8c1b2355
MH
721 if (cb->security_cfm)
722 cb->security_cfm(conn, status, encrypt);
1da177e4
LT
723 }
724 read_unlock_bh(&hci_cb_list_lock);
725}
726
727static inline void hci_key_change_cfm(struct hci_conn *conn, __u8 status)
728{
729 struct list_head *p;
730
731 read_lock_bh(&hci_cb_list_lock);
732 list_for_each(p, &hci_cb_list) {
733 struct hci_cb *cb = list_entry(p, struct hci_cb, list);
734 if (cb->key_change_cfm)
735 cb->key_change_cfm(conn, status);
736 }
737 read_unlock_bh(&hci_cb_list_lock);
738}
739
740static inline void hci_role_switch_cfm(struct hci_conn *conn, __u8 status, __u8 role)
741{
742 struct list_head *p;
743
744 read_lock_bh(&hci_cb_list_lock);
745 list_for_each(p, &hci_cb_list) {
746 struct hci_cb *cb = list_entry(p, struct hci_cb, list);
747 if (cb->role_switch_cfm)
748 cb->role_switch_cfm(conn, status, role);
749 }
750 read_unlock_bh(&hci_cb_list_lock);
751}
752
753int hci_register_cb(struct hci_cb *hcb);
754int hci_unregister_cb(struct hci_cb *hcb);
755
756int hci_register_notifier(struct notifier_block *nb);
757int hci_unregister_notifier(struct notifier_block *nb);
758
a9de9248 759int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen, void *param);
9a9c6a34 760void hci_send_acl(struct hci_conn *conn, struct sk_buff *skb, __u16 flags);
0d861d8b 761void hci_send_sco(struct hci_conn *conn, struct sk_buff *skb);
1da177e4 762
a9de9248 763void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 opcode);
1da177e4
LT
764
765void hci_si_event(struct hci_dev *hdev, int type, int dlen, void *data);
766
767/* ----- HCI Sockets ----- */
eec8d2bc
JH
768void hci_send_to_sock(struct hci_dev *hdev, struct sk_buff *skb,
769 struct sock *skip_sk);
1da177e4 770
0381101f
JH
771/* Management interface */
772int mgmt_control(struct sock *sk, struct msghdr *msg, size_t len);
c71e97bf
JH
773int mgmt_index_added(u16 index);
774int mgmt_index_removed(u16 index);
5add6af8 775int mgmt_powered(u16 index, u8 powered);
73f22f62 776int mgmt_discoverable(u16 index, u8 discoverable);
9fbcbb45 777int mgmt_connectable(u16 index, u8 connectable);
4748fed2 778int mgmt_new_key(u16 index, struct link_key *key);
f7520543
JH
779int mgmt_connected(u16 index, bdaddr_t *bdaddr);
780int mgmt_disconnected(u16 index, bdaddr_t *bdaddr);
8962ee74 781int mgmt_disconnect_failed(u16 index);
17d5c04c 782int mgmt_connect_failed(u16 index, bdaddr_t *bdaddr, u8 status);
a770bb5a 783int mgmt_pin_code_request(u16 index, bdaddr_t *bdaddr, u8 secure);
980e1a53
JH
784int mgmt_pin_code_reply_complete(u16 index, bdaddr_t *bdaddr, u8 status);
785int mgmt_pin_code_neg_reply_complete(u16 index, bdaddr_t *bdaddr, u8 status);
55bc1a37
JH
786int mgmt_user_confirm_request(u16 index, bdaddr_t *bdaddr, __le32 value,
787 u8 confirm_hint);
a5c29683
JH
788int mgmt_user_confirm_reply_complete(u16 index, bdaddr_t *bdaddr, u8 status);
789int mgmt_user_confirm_neg_reply_complete(u16 index, bdaddr_t *bdaddr,
790 u8 status);
2a611692 791int mgmt_auth_failed(u16 index, bdaddr_t *bdaddr, u8 status);
b312b161 792int mgmt_set_local_name_complete(u16 index, u8 *name, u8 status);
c35938b2
SJ
793int mgmt_read_local_oob_data_reply_complete(u16 index, u8 *hash, u8 *randomizer,
794 u8 status);
e17acd40
JH
795int mgmt_device_found(u16 index, bdaddr_t *bdaddr, u8 *dev_class, s8 rssi,
796 u8 *eir);
a88a9652 797int mgmt_remote_name(u16 index, bdaddr_t *bdaddr, u8 *name);
314b2381 798int mgmt_discovering(u16 index, u8 discovering);
0381101f 799
1da177e4
LT
800/* HCI info for socket */
801#define hci_pi(sk) ((struct hci_pinfo *) sk)
802
803struct hci_pinfo {
804 struct bt_sock bt;
805 struct hci_dev *hdev;
806 struct hci_filter filter;
807 __u32 cmsg_mask;
c02178d2 808 unsigned short channel;
1da177e4
LT
809};
810
811/* HCI security filter */
812#define HCI_SFLT_MAX_OGF 5
813
814struct hci_sec_filter {
815 __u32 type_mask;
816 __u32 event_mask[2];
817 __u32 ocf_mask[HCI_SFLT_MAX_OGF + 1][4];
818};
819
820/* ----- HCI requests ----- */
821#define HCI_REQ_DONE 0
822#define HCI_REQ_PEND 1
823#define HCI_REQ_CANCELED 2
824
a6a67efd
TG
825#define hci_req_lock(d) mutex_lock(&d->req_lock)
826#define hci_req_unlock(d) mutex_unlock(&d->req_lock)
1da177e4 827
23bb5763 828void hci_req_complete(struct hci_dev *hdev, __u16 cmd, int result);
1da177e4 829
2ce603eb
CT
830void hci_le_conn_update(struct hci_conn *conn, u16 min, u16 max,
831 u16 latency, u16 to_multiplier);
1da177e4 832#endif /* __HCI_CORE_H */