patch-2_6_7-vs1_9_1_12
[linux-2.6.git] / include / net / bluetooth / hci_core.h
1 /* 
2    BlueZ - Bluetooth protocol stack for Linux
3    Copyright (C) 2000-2001 Qualcomm Incorporated
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
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 <linux/proc_fs.h>
29 #include <net/bluetooth/hci.h>
30
31 /* HCI upper protocols */
32 #define HCI_PROTO_L2CAP 0
33 #define HCI_PROTO_SCO   1
34
35 #define HCI_INIT_TIMEOUT (HZ * 10)
36
37 extern struct proc_dir_entry *proc_bt_hci;
38
39 /* HCI Core structures */
40
41 struct inquiry_entry {
42         struct inquiry_entry    *next;
43         __u32                   timestamp;
44         struct inquiry_info     info;
45 };
46
47 struct inquiry_cache {
48         spinlock_t              lock;
49         __u32                   timestamp;
50         struct inquiry_entry    *list;
51 };
52
53 struct hci_conn_hash {
54         struct list_head list;
55         spinlock_t       lock;
56         unsigned int     num;
57 };
58
59 struct hci_dev {
60         struct list_head list;
61         spinlock_t      lock;
62         atomic_t        refcnt;
63
64         char            name[8];
65         unsigned long   flags;
66         __u16           id;
67         __u8            type;
68         bdaddr_t        bdaddr;
69         __u8            features[8];
70         __u16           voice_setting;
71
72         __u16           pkt_type;
73         __u16           link_policy;
74         __u16           link_mode;
75
76         unsigned long   quirks;
77
78         atomic_t        cmd_cnt;
79         unsigned int    acl_cnt;
80         unsigned int    sco_cnt;
81
82         unsigned int    acl_mtu;
83         unsigned int    sco_mtu;
84         unsigned int    acl_pkts;
85         unsigned int    sco_pkts;
86
87         unsigned long   cmd_last_tx;
88         unsigned long   acl_last_tx;
89         unsigned long   sco_last_tx;
90
91         struct tasklet_struct   cmd_task;
92         struct tasklet_struct   rx_task;
93         struct tasklet_struct   tx_task;
94
95         struct sk_buff_head     rx_q;
96         struct sk_buff_head     raw_q;
97         struct sk_buff_head     cmd_q;
98
99         struct sk_buff          *sent_cmd;
100
101         struct semaphore        req_lock;
102         wait_queue_head_t       req_wait_q;
103         __u32                   req_status;
104         __u32                   req_result;
105
106         struct inquiry_cache    inq_cache;
107         struct hci_conn_hash    conn_hash;
108
109         struct hci_dev_stats    stat;
110
111         void                    *driver_data;
112         void                    *core_data;
113
114         atomic_t                promisc;
115
116 #ifdef CONFIG_PROC_FS
117         struct proc_dir_entry   *proc;
118 #endif
119
120         struct class_device     class_dev;
121
122         struct module           *owner;
123
124         int (*open)(struct hci_dev *hdev);
125         int (*close)(struct hci_dev *hdev);
126         int (*flush)(struct hci_dev *hdev);
127         int (*send)(struct sk_buff *skb);
128         void (*destruct)(struct hci_dev *hdev);
129         void (*notify)(struct hci_dev *hdev, unsigned int evt);
130         int (*ioctl)(struct hci_dev *hdev, unsigned int cmd, unsigned long arg);
131 };
132
133 struct hci_conn {
134         struct list_head list;
135
136         atomic_t         refcnt;
137         spinlock_t       lock;
138
139         bdaddr_t         dst;
140         __u16            handle;
141         __u16            state;
142         __u8             type;
143         __u8             out;
144         __u32            link_mode;
145         unsigned long    pend;
146         
147         unsigned int     sent;
148         
149         struct sk_buff_head data_q;
150
151         struct timer_list timer;
152         
153         struct hci_dev  *hdev;
154         void            *l2cap_data;
155         void            *sco_data;
156         void            *priv;
157
158         struct hci_conn *link;
159 };
160
161 extern struct hci_proto *hci_proto[];
162 extern struct list_head hci_dev_list;
163 extern rwlock_t hci_dev_list_lock;
164
165 /* ----- Inquiry cache ----- */
166 #define INQUIRY_CACHE_AGE_MAX   (HZ*30)   // 30 seconds
167 #define INQUIRY_ENTRY_AGE_MAX   (HZ*60)   // 60 seconds
168
169 #define inquiry_cache_lock(c)           spin_lock(&c->lock)
170 #define inquiry_cache_unlock(c)         spin_unlock(&c->lock)
171 #define inquiry_cache_lock_bh(c)        spin_lock_bh(&c->lock)
172 #define inquiry_cache_unlock_bh(c)      spin_unlock_bh(&c->lock)
173
174 static inline void inquiry_cache_init(struct hci_dev *hdev)
175 {
176         struct inquiry_cache *c = &hdev->inq_cache;
177         spin_lock_init(&c->lock);
178         c->list = NULL;
179 }
180
181 static inline int inquiry_cache_empty(struct hci_dev *hdev)
182 {
183         struct inquiry_cache *c = &hdev->inq_cache;
184         return (c->list == NULL);
185 }
186
187 static inline long inquiry_cache_age(struct hci_dev *hdev)
188 {
189         struct inquiry_cache *c = &hdev->inq_cache;
190         return jiffies - c->timestamp;
191 }
192
193 static inline long inquiry_entry_age(struct inquiry_entry *e)
194 {
195         return jiffies - e->timestamp;
196 }
197
198 struct inquiry_entry *inquiry_cache_lookup(struct hci_dev *hdev, bdaddr_t *bdaddr);
199 void inquiry_cache_update(struct hci_dev *hdev, struct inquiry_info *info);
200 void inquiry_cache_flush(struct hci_dev *hdev);
201 int  inquiry_cache_dump(struct hci_dev *hdev, int num, __u8 *buf);
202
203 /* ----- HCI Connections ----- */
204 enum {
205         HCI_CONN_AUTH_PEND,
206         HCI_CONN_ENCRYPT_PEND
207 };
208
209 static inline void hci_conn_hash_init(struct hci_dev *hdev)
210 {
211         struct hci_conn_hash *h = &hdev->conn_hash;
212         INIT_LIST_HEAD(&h->list);
213         spin_lock_init(&h->lock);
214         h->num = 0;
215 }
216
217 static inline void hci_conn_hash_add(struct hci_dev *hdev, struct hci_conn *c)
218 {
219         struct hci_conn_hash *h = &hdev->conn_hash;
220         list_add(&c->list, &h->list);
221         h->num++;
222 }
223
224 static inline void hci_conn_hash_del(struct hci_dev *hdev, struct hci_conn *c)
225 {
226         struct hci_conn_hash *h = &hdev->conn_hash;
227         list_del(&c->list);
228         h->num--;
229 }
230
231 static inline struct hci_conn *hci_conn_hash_lookup_handle(struct hci_dev *hdev,
232                                         __u16 handle)
233 {
234         struct hci_conn_hash *h = &hdev->conn_hash;
235         struct list_head *p;
236         struct hci_conn  *c;
237
238         list_for_each(p, &h->list) {
239                 c = list_entry(p, struct hci_conn, list);
240                 if (c->handle == handle)
241                         return c;
242         }
243         return NULL;
244 }
245
246 static inline struct hci_conn *hci_conn_hash_lookup_ba(struct hci_dev *hdev,
247                                         __u8 type, bdaddr_t *ba)
248 {
249         struct hci_conn_hash *h = &hdev->conn_hash;
250         struct list_head *p;
251         struct hci_conn  *c;
252
253         list_for_each(p, &h->list) {
254                 c = list_entry(p, struct hci_conn, list);
255                 if (c->type == type && !bacmp(&c->dst, ba))
256                         return c;
257         }
258         return NULL;
259 }
260
261 void hci_acl_connect(struct hci_conn *conn);
262 void hci_acl_disconn(struct hci_conn *conn, __u8 reason);
263 void hci_add_sco(struct hci_conn *conn, __u16 handle);
264
265 struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst);
266 int    hci_conn_del(struct hci_conn *conn);
267 void   hci_conn_hash_flush(struct hci_dev *hdev);
268
269 struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *src);
270 int hci_conn_auth(struct hci_conn *conn);
271 int hci_conn_encrypt(struct hci_conn *conn);
272
273 static inline void hci_conn_set_timer(struct hci_conn *conn, unsigned long timeout)
274 {
275         mod_timer(&conn->timer, jiffies + timeout);
276 }
277
278 static inline void hci_conn_del_timer(struct hci_conn *conn)
279 {
280         del_timer(&conn->timer);
281 }
282
283 static inline void hci_conn_hold(struct hci_conn *conn)
284 {
285         atomic_inc(&conn->refcnt);
286         hci_conn_del_timer(conn);
287 }
288
289 static inline void hci_conn_put(struct hci_conn *conn)
290 {
291         if (atomic_dec_and_test(&conn->refcnt)) {
292                 if (conn->type == ACL_LINK) {
293                         unsigned long timeo = (conn->out) ?
294                                 HCI_DISCONN_TIMEOUT : HCI_DISCONN_TIMEOUT * 2;
295                         hci_conn_set_timer(conn, timeo);
296                 } else
297                         hci_conn_set_timer(conn, HZ / 100);
298         }
299 }
300
301 /* ----- HCI tasks ----- */
302 static inline void hci_sched_cmd(struct hci_dev *hdev)
303 {
304         tasklet_schedule(&hdev->cmd_task);
305 }
306
307 static inline void hci_sched_rx(struct hci_dev *hdev)
308 {
309         tasklet_schedule(&hdev->rx_task);
310 }
311
312 static inline void hci_sched_tx(struct hci_dev *hdev)
313 {
314         tasklet_schedule(&hdev->tx_task);
315 }
316
317 /* ----- HCI Devices ----- */
318 static inline void __hci_dev_put(struct hci_dev *d)
319 {
320         if (atomic_dec_and_test(&d->refcnt))
321                 d->destruct(d);
322 }
323
324 static inline void hci_dev_put(struct hci_dev *d)
325
326         __hci_dev_put(d);
327         module_put(d->owner);
328 }
329
330 static inline struct hci_dev *__hci_dev_hold(struct hci_dev *d)
331 {
332         atomic_inc(&d->refcnt);
333         return d;
334 }
335
336 static inline struct hci_dev *hci_dev_hold(struct hci_dev *d)
337 {
338         if (try_module_get(d->owner))
339                 return __hci_dev_hold(d);
340         return NULL;
341 }
342
343 #define hci_dev_lock(d)         spin_lock(&d->lock)
344 #define hci_dev_unlock(d)       spin_unlock(&d->lock)
345 #define hci_dev_lock_bh(d)      spin_lock_bh(&d->lock)
346 #define hci_dev_unlock_bh(d)    spin_unlock_bh(&d->lock)
347
348 struct hci_dev *hci_dev_get(int index);
349 struct hci_dev *hci_get_route(bdaddr_t *src, bdaddr_t *dst);
350
351 struct hci_dev *hci_alloc_dev(void);
352 void hci_free_dev(struct hci_dev *hdev);
353 int hci_register_dev(struct hci_dev *hdev);
354 int hci_unregister_dev(struct hci_dev *hdev);
355 int hci_suspend_dev(struct hci_dev *hdev);
356 int hci_resume_dev(struct hci_dev *hdev);
357 int hci_dev_open(__u16 dev);
358 int hci_dev_close(__u16 dev);
359 int hci_dev_reset(__u16 dev);
360 int hci_dev_reset_stat(__u16 dev);
361 int hci_dev_cmd(unsigned int cmd, void __user *arg);
362 int hci_get_dev_list(void __user *arg);
363 int hci_get_dev_info(void __user *arg);
364 int hci_get_conn_list(void __user *arg);
365 int hci_get_conn_info(struct hci_dev *hdev, void __user *arg);
366 int hci_inquiry(void __user *arg);
367
368 void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb);
369
370 /* Receive frame from HCI drivers */
371 static inline int hci_recv_frame(struct sk_buff *skb)
372 {
373         struct hci_dev *hdev = (struct hci_dev *) skb->dev;
374         if (!hdev || (!test_bit(HCI_UP, &hdev->flags) 
375                         && !test_bit(HCI_INIT, &hdev->flags))) {
376                 kfree_skb(skb);
377                 return -ENXIO;
378         }
379
380         /* Incomming skb */
381         bt_cb(skb)->incoming = 1;
382
383         /* Time stamp */
384         do_gettimeofday(&skb->stamp);
385
386         /* Queue frame for rx task */
387         skb_queue_tail(&hdev->rx_q, skb);
388         hci_sched_rx(hdev);
389         return 0;
390 }
391
392 int hci_register_sysfs(struct hci_dev *hdev);
393 void hci_unregister_sysfs(struct hci_dev *hdev);
394
395 #define SET_HCIDEV_DEV(hdev, pdev) ((hdev)->class_dev.dev = (pdev))
396
397 /* ----- LMP capabilities ----- */
398 #define lmp_rswitch_capable(dev) (dev->features[0] & LMP_RSWITCH)
399 #define lmp_encrypt_capable(dev) (dev->features[0] & LMP_ENCRYPT)
400
401 /* ----- HCI protocols ----- */
402 struct hci_proto {
403         char            *name;
404         unsigned int    id;
405         unsigned long   flags;
406
407         void            *priv;
408
409         int (*connect_ind)      (struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 type);
410         int (*connect_cfm)      (struct hci_conn *conn, __u8 status);
411         int (*disconn_ind)      (struct hci_conn *conn, __u8 reason);
412         int (*recv_acldata)     (struct hci_conn *conn, struct sk_buff *skb, __u16 flags);
413         int (*recv_scodata)     (struct hci_conn *conn, struct sk_buff *skb);
414         int (*auth_cfm)         (struct hci_conn *conn, __u8 status);
415         int (*encrypt_cfm)      (struct hci_conn *conn, __u8 status);
416 };
417
418 static inline int hci_proto_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 type)
419 {
420         register struct hci_proto *hp;
421         int mask = 0;
422         
423         hp = hci_proto[HCI_PROTO_L2CAP];
424         if (hp && hp->connect_ind)
425                 mask |= hp->connect_ind(hdev, bdaddr, type);
426
427         hp = hci_proto[HCI_PROTO_SCO];
428         if (hp && hp->connect_ind)
429                 mask |= hp->connect_ind(hdev, bdaddr, type);
430
431         return mask;
432 }
433
434 static inline void hci_proto_connect_cfm(struct hci_conn *conn, __u8 status)
435 {
436         register struct hci_proto *hp;
437
438         hp = hci_proto[HCI_PROTO_L2CAP];
439         if (hp && hp->connect_cfm)
440                 hp->connect_cfm(conn, status);
441
442         hp = hci_proto[HCI_PROTO_SCO];
443         if (hp && hp->connect_cfm)
444                 hp->connect_cfm(conn, status);
445 }
446
447 static inline void hci_proto_disconn_ind(struct hci_conn *conn, __u8 reason)
448 {
449         register struct hci_proto *hp;
450
451         hp = hci_proto[HCI_PROTO_L2CAP];
452         if (hp && hp->disconn_ind)
453                 hp->disconn_ind(conn, reason);
454
455         hp = hci_proto[HCI_PROTO_SCO];
456         if (hp && hp->disconn_ind)
457                 hp->disconn_ind(conn, reason);
458 }
459
460 static inline void hci_proto_auth_cfm(struct hci_conn *conn, __u8 status)
461 {
462         register struct hci_proto *hp;
463
464         hp = hci_proto[HCI_PROTO_L2CAP];
465         if (hp && hp->auth_cfm)
466                 hp->auth_cfm(conn, status);
467
468         hp = hci_proto[HCI_PROTO_SCO];
469         if (hp && hp->auth_cfm)
470                 hp->auth_cfm(conn, status);
471 }
472
473 static inline void hci_proto_encrypt_cfm(struct hci_conn *conn, __u8 status)
474 {
475         register struct hci_proto *hp;
476
477         hp = hci_proto[HCI_PROTO_L2CAP];
478         if (hp && hp->encrypt_cfm)
479                 hp->encrypt_cfm(conn, status);
480
481         hp = hci_proto[HCI_PROTO_SCO];
482         if (hp && hp->encrypt_cfm)
483                 hp->encrypt_cfm(conn, status);
484 }
485
486 int hci_register_proto(struct hci_proto *hproto);
487 int hci_unregister_proto(struct hci_proto *hproto);
488 int hci_register_notifier(struct notifier_block *nb);
489 int hci_unregister_notifier(struct notifier_block *nb);
490
491 int hci_send_cmd(struct hci_dev *hdev, __u16 ogf, __u16 ocf, __u32 plen, void *param);
492 int hci_send_acl(struct hci_conn *conn, struct sk_buff *skb, __u16 flags);
493 int hci_send_sco(struct hci_conn *conn, struct sk_buff *skb);
494
495 void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 ogf, __u16 ocf);
496
497 void hci_si_event(struct hci_dev *hdev, int type, int dlen, void *data);
498
499 /* ----- HCI Sockets ----- */
500 void hci_send_to_sock(struct hci_dev *hdev, struct sk_buff *skb);
501
502 /* HCI info for socket */
503 #define hci_pi(sk)      ((struct hci_pinfo *)sk->sk_protinfo)
504 struct hci_pinfo {
505         struct hci_dev    *hdev;
506         struct hci_filter filter;
507         __u32             cmsg_mask;
508 };
509
510 /* HCI security filter */
511 #define HCI_SFLT_MAX_OGF  5
512
513 struct hci_sec_filter {
514         __u32 type_mask;
515         __u32 event_mask[2];
516         __u32 ocf_mask[HCI_SFLT_MAX_OGF + 1][4];
517 };
518
519 /* ----- HCI requests ----- */
520 #define HCI_REQ_DONE      0
521 #define HCI_REQ_PEND      1
522 #define HCI_REQ_CANCELED  2
523
524 #define hci_req_lock(d)         down(&d->req_lock)
525 #define hci_req_unlock(d)       up(&d->req_lock)
526
527 void hci_req_complete(struct hci_dev *hdev, int result);
528 void hci_req_cancel(struct hci_dev *hdev, int err);
529
530 #endif /* __HCI_CORE_H */