Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/include/net/bluetooth/hci_core.h
10818 views
1
/*
2
BlueZ - Bluetooth protocol stack for Linux
3
Copyright (c) 2000-2001, 2010, Code Aurora Forum. All rights reserved.
4
5
Written 2000,2001 by Maxim Krasnyansky <[email protected]>
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
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
18
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
20
ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21
COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
22
SOFTWARE IS DISCLAIMED.
23
*/
24
25
#ifndef __HCI_CORE_H
26
#define __HCI_CORE_H
27
28
#include <net/bluetooth/hci.h>
29
30
/* HCI upper protocols */
31
#define HCI_PROTO_L2CAP 0
32
#define HCI_PROTO_SCO 1
33
34
/* HCI Core structures */
35
struct 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];
41
__le16 clock_offset;
42
__s8 rssi;
43
__u8 ssp_mode;
44
};
45
46
struct inquiry_entry {
47
struct inquiry_entry *next;
48
__u32 timestamp;
49
struct inquiry_data data;
50
};
51
52
struct inquiry_cache {
53
spinlock_t lock;
54
__u32 timestamp;
55
struct inquiry_entry *list;
56
};
57
58
struct hci_conn_hash {
59
struct list_head list;
60
spinlock_t lock;
61
unsigned int acl_num;
62
unsigned int sco_num;
63
unsigned int le_num;
64
};
65
66
struct bdaddr_list {
67
struct list_head list;
68
bdaddr_t bdaddr;
69
};
70
71
struct bt_uuid {
72
struct list_head list;
73
u8 uuid[16];
74
u8 svc_hint;
75
};
76
77
struct link_key {
78
struct list_head list;
79
bdaddr_t bdaddr;
80
u8 type;
81
u8 val[16];
82
u8 pin_len;
83
};
84
85
struct oob_data {
86
struct list_head list;
87
bdaddr_t bdaddr;
88
u8 hash[16];
89
u8 randomizer[16];
90
};
91
92
#define NUM_REASSEMBLY 4
93
struct 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;
101
__u8 bus;
102
__u8 dev_type;
103
bdaddr_t bdaddr;
104
__u8 dev_name[HCI_MAX_NAME_LENGTH];
105
__u8 eir[HCI_MAX_EIR_LENGTH];
106
__u8 dev_class[3];
107
__u8 major_class;
108
__u8 minor_class;
109
__u8 features[8];
110
__u8 commands[64];
111
__u8 ssp_mode;
112
__u8 hci_ver;
113
__u16 hci_rev;
114
__u8 lmp_ver;
115
__u16 manufacturer;
116
__le16 lmp_subver;
117
__u16 voice_setting;
118
__u8 io_capability;
119
120
__u16 pkt_type;
121
__u16 esco_type;
122
__u16 link_policy;
123
__u16 link_mode;
124
125
__u32 idle_timeout;
126
__u16 sniff_min_interval;
127
__u16 sniff_max_interval;
128
129
unsigned int auto_accept_delay;
130
131
unsigned long quirks;
132
133
atomic_t cmd_cnt;
134
unsigned int acl_cnt;
135
unsigned int sco_cnt;
136
unsigned int le_cnt;
137
138
unsigned int acl_mtu;
139
unsigned int sco_mtu;
140
unsigned int le_mtu;
141
unsigned int acl_pkts;
142
unsigned int sco_pkts;
143
unsigned int le_pkts;
144
145
unsigned long acl_last_tx;
146
unsigned long sco_last_tx;
147
unsigned long le_last_tx;
148
149
struct workqueue_struct *workqueue;
150
151
struct work_struct power_on;
152
struct work_struct power_off;
153
struct timer_list off_timer;
154
155
struct timer_list cmd_timer;
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;
165
struct sk_buff *reassembly[NUM_REASSEMBLY];
166
167
struct mutex req_lock;
168
wait_queue_head_t req_wait_q;
169
__u32 req_status;
170
__u32 req_result;
171
172
__u16 init_last_cmd;
173
174
struct inquiry_cache inq_cache;
175
struct hci_conn_hash conn_hash;
176
struct list_head blacklist;
177
178
struct list_head uuids;
179
180
struct list_head link_keys;
181
182
struct list_head remote_oob_data;
183
184
struct hci_dev_stats stat;
185
186
struct sk_buff_head driver_init;
187
188
void *driver_data;
189
void *core_data;
190
191
atomic_t promisc;
192
193
struct dentry *debugfs;
194
195
struct device *parent;
196
struct device dev;
197
198
struct rfkill *rfkill;
199
200
struct module *owner;
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
211
struct hci_conn {
212
struct list_head list;
213
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;
231
__u8 key_type;
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;
240
241
__u8 remote_cap;
242
__u8 remote_oob;
243
__u8 remote_auth;
244
245
unsigned int sent;
246
247
struct sk_buff_head data_q;
248
249
struct timer_list disc_timer;
250
struct timer_list idle_timer;
251
struct timer_list auto_accept_timer;
252
253
struct work_struct work_add;
254
struct work_struct work_del;
255
256
struct device dev;
257
atomic_t devref;
258
259
struct hci_dev *hdev;
260
void *l2cap_data;
261
void *sco_data;
262
void *priv;
263
264
struct hci_conn *link;
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);
269
};
270
271
extern struct hci_proto *hci_proto[];
272
extern struct list_head hci_dev_list;
273
extern struct list_head hci_cb_list;
274
extern rwlock_t hci_dev_list_lock;
275
extern rwlock_t hci_cb_list_lock;
276
277
/* ----- Inquiry cache ----- */
278
#define INQUIRY_CACHE_AGE_MAX (HZ*30) /* 30 seconds */
279
#define INQUIRY_ENTRY_AGE_MAX (HZ*60) /* 60 seconds */
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
286
static 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
293
static inline int inquiry_cache_empty(struct hci_dev *hdev)
294
{
295
struct inquiry_cache *c = &hdev->inq_cache;
296
return c->list == NULL;
297
}
298
299
static 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
305
static inline long inquiry_entry_age(struct inquiry_entry *e)
306
{
307
return jiffies - e->timestamp;
308
}
309
310
struct inquiry_entry *hci_inquiry_cache_lookup(struct hci_dev *hdev, bdaddr_t *bdaddr);
311
void hci_inquiry_cache_update(struct hci_dev *hdev, struct inquiry_data *data);
312
313
/* ----- HCI Connections ----- */
314
enum {
315
HCI_CONN_AUTH_PEND,
316
HCI_CONN_ENCRYPT_PEND,
317
HCI_CONN_RSWITCH_PEND,
318
HCI_CONN_MODE_CHANGE_PEND,
319
HCI_CONN_SCO_SETUP_PEND,
320
};
321
322
static 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
331
static 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);
335
switch (c->type) {
336
case ACL_LINK:
337
h->acl_num++;
338
break;
339
case LE_LINK:
340
h->le_num++;
341
break;
342
case SCO_LINK:
343
case ESCO_LINK:
344
h->sco_num++;
345
break;
346
}
347
}
348
349
static 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);
353
switch (c->type) {
354
case ACL_LINK:
355
h->acl_num--;
356
break;
357
case LE_LINK:
358
h->le_num--;
359
break;
360
case SCO_LINK:
361
case ESCO_LINK:
362
h->sco_num--;
363
break;
364
}
365
}
366
367
static inline struct hci_conn *hci_conn_hash_lookup_handle(struct hci_dev *hdev,
368
__u16 handle)
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
382
static inline struct hci_conn *hci_conn_hash_lookup_ba(struct hci_dev *hdev,
383
__u8 type, bdaddr_t *ba)
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
397
static inline struct hci_conn *hci_conn_hash_lookup_state(struct hci_dev *hdev,
398
__u8 type, __u16 state)
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
412
void hci_acl_connect(struct hci_conn *conn);
413
void hci_acl_disconn(struct hci_conn *conn, __u8 reason);
414
void hci_add_sco(struct hci_conn *conn, __u16 handle);
415
void hci_setup_sync(struct hci_conn *conn, __u16 handle);
416
void hci_sco_setup(struct hci_conn *conn, __u8 status);
417
418
struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst);
419
int hci_conn_del(struct hci_conn *conn);
420
void hci_conn_hash_flush(struct hci_dev *hdev);
421
void hci_conn_check_pending(struct hci_dev *hdev);
422
423
struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst, __u8 sec_level, __u8 auth_type);
424
int hci_conn_check_link_mode(struct hci_conn *conn);
425
int hci_conn_check_secure(struct hci_conn *conn, __u8 sec_level);
426
int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type);
427
int hci_conn_change_link_key(struct hci_conn *conn);
428
int hci_conn_switch_role(struct hci_conn *conn, __u8 role);
429
430
void hci_conn_enter_active_mode(struct hci_conn *conn);
431
void hci_conn_enter_sniff_mode(struct hci_conn *conn);
432
433
void hci_conn_hold_device(struct hci_conn *conn);
434
void hci_conn_put_device(struct hci_conn *conn);
435
436
static inline void hci_conn_hold(struct hci_conn *conn)
437
{
438
atomic_inc(&conn->refcnt);
439
del_timer(&conn->disc_timer);
440
}
441
442
static inline void hci_conn_put(struct hci_conn *conn)
443
{
444
if (atomic_dec_and_test(&conn->refcnt)) {
445
unsigned long timeo;
446
if (conn->type == ACL_LINK) {
447
del_timer(&conn->idle_timer);
448
if (conn->state == BT_CONNECTED) {
449
timeo = msecs_to_jiffies(conn->disc_timeout);
450
if (!conn->out)
451
timeo *= 2;
452
} else
453
timeo = msecs_to_jiffies(10);
454
} else
455
timeo = msecs_to_jiffies(10);
456
mod_timer(&conn->disc_timer, jiffies + timeo);
457
}
458
}
459
460
/* ----- HCI Devices ----- */
461
static inline void __hci_dev_put(struct hci_dev *d)
462
{
463
if (atomic_dec_and_test(&d->refcnt))
464
d->destruct(d);
465
}
466
467
static inline void hci_dev_put(struct hci_dev *d)
468
{
469
__hci_dev_put(d);
470
module_put(d->owner);
471
}
472
473
static inline struct hci_dev *__hci_dev_hold(struct hci_dev *d)
474
{
475
atomic_inc(&d->refcnt);
476
return d;
477
}
478
479
static 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
491
struct hci_dev *hci_dev_get(int index);
492
struct hci_dev *hci_get_route(bdaddr_t *src, bdaddr_t *dst);
493
494
struct hci_dev *hci_alloc_dev(void);
495
void hci_free_dev(struct hci_dev *hdev);
496
int hci_register_dev(struct hci_dev *hdev);
497
int hci_unregister_dev(struct hci_dev *hdev);
498
int hci_suspend_dev(struct hci_dev *hdev);
499
int hci_resume_dev(struct hci_dev *hdev);
500
int hci_dev_open(__u16 dev);
501
int hci_dev_close(__u16 dev);
502
int hci_dev_reset(__u16 dev);
503
int hci_dev_reset_stat(__u16 dev);
504
int hci_dev_cmd(unsigned int cmd, void __user *arg);
505
int hci_get_dev_list(void __user *arg);
506
int hci_get_dev_info(void __user *arg);
507
int hci_get_conn_list(void __user *arg);
508
int hci_get_conn_info(struct hci_dev *hdev, void __user *arg);
509
int hci_get_auth_info(struct hci_dev *hdev, void __user *arg);
510
int hci_inquiry(void __user *arg);
511
512
struct bdaddr_list *hci_blacklist_lookup(struct hci_dev *hdev, bdaddr_t *bdaddr);
513
int hci_blacklist_clear(struct hci_dev *hdev);
514
515
int hci_uuids_clear(struct hci_dev *hdev);
516
517
int hci_link_keys_clear(struct hci_dev *hdev);
518
struct link_key *hci_find_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr);
519
int 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);
521
int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr);
522
523
int hci_remote_oob_data_clear(struct hci_dev *hdev);
524
struct oob_data *hci_find_remote_oob_data(struct hci_dev *hdev,
525
bdaddr_t *bdaddr);
526
int hci_add_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 *hash,
527
u8 *randomizer);
528
int hci_remove_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr);
529
530
void hci_del_off_timer(struct hci_dev *hdev);
531
532
void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb);
533
534
int hci_recv_frame(struct sk_buff *skb);
535
int hci_recv_fragment(struct hci_dev *hdev, int type, void *data, int count);
536
int hci_recv_stream_fragment(struct hci_dev *hdev, void *data, int count);
537
538
int hci_register_sysfs(struct hci_dev *hdev);
539
void hci_unregister_sysfs(struct hci_dev *hdev);
540
void hci_conn_init_sysfs(struct hci_conn *conn);
541
void hci_conn_add_sysfs(struct hci_conn *conn);
542
void hci_conn_del_sysfs(struct hci_conn *conn);
543
544
#define SET_HCIDEV_DEV(hdev, pdev) ((hdev)->parent = (pdev))
545
546
/* ----- LMP capabilities ----- */
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)
551
#define lmp_esco_capable(dev) ((dev)->features[3] & LMP_ESCO)
552
#define lmp_ssp_capable(dev) ((dev)->features[6] & LMP_SIMPLE_PAIR)
553
#define lmp_no_flush_capable(dev) ((dev)->features[6] & LMP_NO_FLUSH)
554
#define lmp_le_capable(dev) ((dev)->features[4] & LMP_LE)
555
556
/* ----- HCI protocols ----- */
557
struct hci_proto {
558
char *name;
559
unsigned int id;
560
unsigned long flags;
561
562
void *priv;
563
564
int (*connect_ind) (struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 type);
565
int (*connect_cfm) (struct hci_conn *conn, __u8 status);
566
int (*disconn_ind) (struct hci_conn *conn);
567
int (*disconn_cfm) (struct hci_conn *conn, __u8 reason);
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);
570
int (*security_cfm) (struct hci_conn *conn, __u8 status, __u8 encrypt);
571
};
572
573
static 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;
577
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
589
static 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);
600
601
if (conn->connect_cfm_cb)
602
conn->connect_cfm_cb(conn, status);
603
}
604
605
static inline int hci_proto_disconn_ind(struct hci_conn *conn)
606
{
607
register struct hci_proto *hp;
608
int reason = 0x13;
609
610
hp = hci_proto[HCI_PROTO_L2CAP];
611
if (hp && hp->disconn_ind)
612
reason = hp->disconn_ind(conn);
613
614
hp = hci_proto[HCI_PROTO_SCO];
615
if (hp && hp->disconn_ind)
616
reason = hp->disconn_ind(conn);
617
618
return reason;
619
}
620
621
static 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);
632
633
if (conn->disconn_cfm_cb)
634
conn->disconn_cfm_cb(conn, reason);
635
}
636
637
static inline void hci_proto_auth_cfm(struct hci_conn *conn, __u8 status)
638
{
639
register struct hci_proto *hp;
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;
646
647
hp = hci_proto[HCI_PROTO_L2CAP];
648
if (hp && hp->security_cfm)
649
hp->security_cfm(conn, status, encrypt);
650
651
hp = hci_proto[HCI_PROTO_SCO];
652
if (hp && hp->security_cfm)
653
hp->security_cfm(conn, status, encrypt);
654
655
if (conn->security_cfm_cb)
656
conn->security_cfm_cb(conn, status);
657
}
658
659
static inline void hci_proto_encrypt_cfm(struct hci_conn *conn, __u8 status, __u8 encrypt)
660
{
661
register struct hci_proto *hp;
662
663
hp = hci_proto[HCI_PROTO_L2CAP];
664
if (hp && hp->security_cfm)
665
hp->security_cfm(conn, status, encrypt);
666
667
hp = hci_proto[HCI_PROTO_SCO];
668
if (hp && hp->security_cfm)
669
hp->security_cfm(conn, status, encrypt);
670
671
if (conn->security_cfm_cb)
672
conn->security_cfm_cb(conn, status);
673
}
674
675
int hci_register_proto(struct hci_proto *hproto);
676
int hci_unregister_proto(struct hci_proto *hproto);
677
678
/* ----- HCI callbacks ----- */
679
struct hci_cb {
680
struct list_head list;
681
682
char *name;
683
684
void (*security_cfm) (struct hci_conn *conn, __u8 status, __u8 encrypt);
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
689
static inline void hci_auth_cfm(struct hci_conn *conn, __u8 status)
690
{
691
struct list_head *p;
692
__u8 encrypt;
693
694
hci_proto_auth_cfm(conn, status);
695
696
if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend))
697
return;
698
699
encrypt = (conn->link_mode & HCI_LM_ENCRYPT) ? 0x01 : 0x00;
700
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);
704
if (cb->security_cfm)
705
cb->security_cfm(conn, status, encrypt);
706
}
707
read_unlock_bh(&hci_cb_list_lock);
708
}
709
710
static inline void hci_encrypt_cfm(struct hci_conn *conn, __u8 status, __u8 encrypt)
711
{
712
struct list_head *p;
713
714
if (conn->sec_level == BT_SECURITY_SDP)
715
conn->sec_level = BT_SECURITY_LOW;
716
717
hci_proto_encrypt_cfm(conn, status, encrypt);
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);
722
if (cb->security_cfm)
723
cb->security_cfm(conn, status, encrypt);
724
}
725
read_unlock_bh(&hci_cb_list_lock);
726
}
727
728
static 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
741
static 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
754
int hci_register_cb(struct hci_cb *hcb);
755
int hci_unregister_cb(struct hci_cb *hcb);
756
757
int hci_register_notifier(struct notifier_block *nb);
758
int hci_unregister_notifier(struct notifier_block *nb);
759
760
int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen, void *param);
761
void hci_send_acl(struct hci_conn *conn, struct sk_buff *skb, __u16 flags);
762
void hci_send_sco(struct hci_conn *conn, struct sk_buff *skb);
763
764
void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 opcode);
765
766
void hci_si_event(struct hci_dev *hdev, int type, int dlen, void *data);
767
768
/* ----- HCI Sockets ----- */
769
void hci_send_to_sock(struct hci_dev *hdev, struct sk_buff *skb,
770
struct sock *skip_sk);
771
772
/* Management interface */
773
int mgmt_control(struct sock *sk, struct msghdr *msg, size_t len);
774
int mgmt_index_added(u16 index);
775
int mgmt_index_removed(u16 index);
776
int mgmt_powered(u16 index, u8 powered);
777
int mgmt_discoverable(u16 index, u8 discoverable);
778
int mgmt_connectable(u16 index, u8 connectable);
779
int mgmt_new_key(u16 index, struct link_key *key, u8 persistent);
780
int mgmt_connected(u16 index, bdaddr_t *bdaddr);
781
int mgmt_disconnected(u16 index, bdaddr_t *bdaddr);
782
int mgmt_disconnect_failed(u16 index);
783
int mgmt_connect_failed(u16 index, bdaddr_t *bdaddr, u8 status);
784
int mgmt_pin_code_request(u16 index, bdaddr_t *bdaddr, u8 secure);
785
int mgmt_pin_code_reply_complete(u16 index, bdaddr_t *bdaddr, u8 status);
786
int mgmt_pin_code_neg_reply_complete(u16 index, bdaddr_t *bdaddr, u8 status);
787
int mgmt_user_confirm_request(u16 index, bdaddr_t *bdaddr, __le32 value,
788
u8 confirm_hint);
789
int mgmt_user_confirm_reply_complete(u16 index, bdaddr_t *bdaddr, u8 status);
790
int mgmt_user_confirm_neg_reply_complete(u16 index, bdaddr_t *bdaddr,
791
u8 status);
792
int mgmt_auth_failed(u16 index, bdaddr_t *bdaddr, u8 status);
793
int mgmt_set_local_name_complete(u16 index, u8 *name, u8 status);
794
int mgmt_read_local_oob_data_reply_complete(u16 index, u8 *hash, u8 *randomizer,
795
u8 status);
796
int mgmt_device_found(u16 index, bdaddr_t *bdaddr, u8 *dev_class, s8 rssi,
797
u8 *eir);
798
int mgmt_remote_name(u16 index, bdaddr_t *bdaddr, u8 *name);
799
int mgmt_discovering(u16 index, u8 discovering);
800
801
/* HCI info for socket */
802
#define hci_pi(sk) ((struct hci_pinfo *) sk)
803
804
struct hci_pinfo {
805
struct bt_sock bt;
806
struct hci_dev *hdev;
807
struct hci_filter filter;
808
__u32 cmsg_mask;
809
unsigned short channel;
810
};
811
812
/* HCI security filter */
813
#define HCI_SFLT_MAX_OGF 5
814
815
struct 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
826
#define hci_req_lock(d) mutex_lock(&d->req_lock)
827
#define hci_req_unlock(d) mutex_unlock(&d->req_lock)
828
829
void hci_req_complete(struct hci_dev *hdev, __u16 cmd, int result);
830
831
void hci_le_conn_update(struct hci_conn *conn, u16 min, u16 max,
832
u16 latency, u16 to_multiplier);
833
#endif /* __HCI_CORE_H */
834
835