ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / net / bluetooth / hci_conn.c
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 /*
26  * HCI Connection handling.
27  *
28  * $Id: hci_conn.c,v 1.2 2002/04/17 17:37:16 maxk Exp $
29  */
30
31 #include <linux/config.h>
32 #include <linux/module.h>
33
34 #include <linux/types.h>
35 #include <linux/errno.h>
36 #include <linux/kernel.h>
37 #include <linux/major.h>
38 #include <linux/sched.h>
39 #include <linux/slab.h>
40 #include <linux/poll.h>
41 #include <linux/fcntl.h>
42 #include <linux/init.h>
43 #include <linux/skbuff.h>
44 #include <linux/interrupt.h>
45 #include <linux/notifier.h>
46 #include <net/sock.h>
47
48 #include <asm/system.h>
49 #include <asm/uaccess.h>
50 #include <asm/unaligned.h>
51
52 #include <net/bluetooth/bluetooth.h>
53 #include <net/bluetooth/hci_core.h>
54
55 #ifndef CONFIG_BT_HCI_CORE_DEBUG
56 #undef  BT_DBG
57 #define BT_DBG( A... )
58 #endif
59
60 void hci_acl_connect(struct hci_conn *conn)
61 {
62         struct hci_dev *hdev = conn->hdev;
63         struct inquiry_entry *ie;
64         struct hci_cp_create_conn cp;
65
66         BT_DBG("%p", conn);
67
68         conn->state = BT_CONNECT;
69         conn->out   = 1;
70         conn->link_mode = HCI_LM_MASTER;
71
72         memset(&cp, 0, sizeof(cp));
73         bacpy(&cp.bdaddr, &conn->dst);
74         cp.pscan_rep_mode = 0x02;
75
76         if ((ie = inquiry_cache_lookup(hdev, &conn->dst)) &&
77                         inquiry_entry_age(ie) <= INQUIRY_ENTRY_AGE_MAX) {
78                 cp.pscan_rep_mode = ie->info.pscan_rep_mode;
79                 cp.pscan_mode     = ie->info.pscan_mode;
80                 cp.clock_offset   = ie->info.clock_offset | __cpu_to_le16(0x8000);
81         }
82
83         cp.pkt_type = __cpu_to_le16(hdev->pkt_type & ACL_PTYPE_MASK);
84         if (lmp_rswitch_capable(hdev) && !(hdev->link_mode & HCI_LM_MASTER))
85                 cp.role_switch  = 0x01;
86         else
87                 cp.role_switch  = 0x00;
88                 
89         hci_send_cmd(hdev, OGF_LINK_CTL, OCF_CREATE_CONN, sizeof(cp), &cp);
90 }
91
92 void hci_acl_disconn(struct hci_conn *conn, __u8 reason)
93 {
94         struct hci_cp_disconnect cp;
95
96         BT_DBG("%p", conn);
97
98         conn->state = BT_DISCONN;
99
100         cp.handle = __cpu_to_le16(conn->handle);
101         cp.reason = reason;
102         hci_send_cmd(conn->hdev, OGF_LINK_CTL, OCF_DISCONNECT, sizeof(cp), &cp);
103 }
104
105 void hci_add_sco(struct hci_conn *conn, __u16 handle)
106 {
107         struct hci_dev *hdev = conn->hdev;
108         struct hci_cp_add_sco cp;
109
110         BT_DBG("%p", conn);
111
112         conn->state = BT_CONNECT;
113         conn->out = 1;
114
115         cp.pkt_type = __cpu_to_le16(hdev->pkt_type & SCO_PTYPE_MASK);
116         cp.handle   = __cpu_to_le16(handle);
117
118         hci_send_cmd(hdev, OGF_LINK_CTL, OCF_ADD_SCO, sizeof(cp), &cp);
119 }
120
121 static void hci_conn_timeout(unsigned long arg)
122 {
123         struct hci_conn *conn = (void *)arg;
124         struct hci_dev  *hdev = conn->hdev;
125
126         BT_DBG("conn %p state %d", conn, conn->state);
127
128         if (atomic_read(&conn->refcnt))
129                 return;
130
131         hci_dev_lock(hdev);
132         if (conn->state == BT_CONNECTED)
133                 hci_acl_disconn(conn, 0x13);
134         else
135                 conn->state = BT_CLOSED;
136         hci_dev_unlock(hdev);
137         return;
138 }
139
140 static void hci_conn_init_timer(struct hci_conn *conn)
141 {
142         init_timer(&conn->timer);
143         conn->timer.function = hci_conn_timeout;
144         conn->timer.data = (unsigned long)conn;
145 }
146
147 struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst)
148 {
149         struct hci_conn *conn;
150
151         BT_DBG("%s dst %s", hdev->name, batostr(dst));
152
153         if (!(conn = kmalloc(sizeof(struct hci_conn), GFP_ATOMIC)))
154                 return NULL;
155         memset(conn, 0, sizeof(struct hci_conn));
156
157         bacpy(&conn->dst, dst);
158         conn->type   = type;
159         conn->hdev   = hdev;
160         conn->state  = BT_OPEN;
161
162         skb_queue_head_init(&conn->data_q);
163         hci_conn_init_timer(conn);
164
165         atomic_set(&conn->refcnt, 0);
166
167         hci_dev_hold(hdev);
168
169         tasklet_disable(&hdev->tx_task);
170         hci_conn_hash_add(hdev, conn);
171         tasklet_enable(&hdev->tx_task);
172
173         if (hdev->notify)
174                 hdev->notify(hdev, HCI_NOTIFY_CONN_ADD);
175
176         return conn;
177 }
178
179 int hci_conn_del(struct hci_conn *conn)
180 {
181         struct hci_dev  *hdev = conn->hdev;
182
183         BT_DBG("%s conn %p handle %d", hdev->name, conn, conn->handle);
184         
185         hci_conn_del_timer(conn);
186
187         if (conn->type == SCO_LINK) {
188                 struct hci_conn *acl = conn->link;
189                 if (acl) {
190                         acl->link = NULL;
191                         hci_conn_put(acl);
192                 }
193         } else {
194                 struct hci_conn *sco = conn->link;
195                 if (sco)
196                         sco->link = NULL;
197
198                 /* Unacked frames */
199                 hdev->acl_cnt += conn->sent;
200         }
201
202         if (hdev->notify)
203                 hdev->notify(hdev, HCI_NOTIFY_CONN_DEL);
204
205         tasklet_disable(&hdev->tx_task);
206         hci_conn_hash_del(hdev, conn);
207         tasklet_enable(&hdev->tx_task);
208
209         skb_queue_purge(&conn->data_q);
210
211         hci_dev_put(hdev);
212
213         kfree(conn);
214         return 0;
215 }
216
217 struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src)
218 {
219         int use_src = bacmp(src, BDADDR_ANY);
220         struct hci_dev *hdev = NULL;
221         struct list_head *p;
222
223         BT_DBG("%s -> %s", batostr(src), batostr(dst));
224
225         read_lock_bh(&hci_dev_list_lock);
226
227         list_for_each(p, &hci_dev_list) {
228                 struct hci_dev *d = list_entry(p, struct hci_dev, list);
229                 
230                 if (!test_bit(HCI_UP, &d->flags))
231                         continue;
232
233                 /* Simple routing: 
234                  *      No source address - find interface with bdaddr != dst 
235                  *      Source address    - find interface with bdaddr == src 
236                  */
237
238                 if (use_src) {
239                         if (!bacmp(&d->bdaddr, src)) {
240                                 hdev = d; break;
241                         }
242                 } else {
243                         if (bacmp(&d->bdaddr, dst)) {
244                                 hdev = d; break;
245                         }
246                 }
247         }
248
249         if (hdev)
250                 hdev = hci_dev_hold(hdev);
251
252         read_unlock_bh(&hci_dev_list_lock);
253         return hdev;
254 }
255
256 /* Create SCO or ACL connection.
257  * Device _must_ be locked */
258 struct hci_conn * hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst)
259 {
260         struct hci_conn *acl;
261
262         BT_DBG("%s dst %s", hdev->name, batostr(dst));
263
264         if (!(acl = hci_conn_hash_lookup_ba(hdev, ACL_LINK, dst))) {
265                 if (!(acl = hci_conn_add(hdev, ACL_LINK, dst)))
266                         return NULL;
267         }
268
269         hci_conn_hold(acl);
270
271         if (acl->state == BT_OPEN || acl->state == BT_CLOSED)
272                 hci_acl_connect(acl);
273
274         if (type == SCO_LINK) {
275                 struct hci_conn *sco;
276
277                 if (!(sco = hci_conn_hash_lookup_ba(hdev, SCO_LINK, dst))) {
278                         if (!(sco = hci_conn_add(hdev, SCO_LINK, dst))) {
279                                 hci_conn_put(acl);
280                                 return NULL;
281                         }
282                 }
283                 acl->link = sco;
284                 sco->link = acl;
285
286                 hci_conn_hold(sco);
287
288                 if (acl->state == BT_CONNECTED && 
289                                 (sco->state == BT_OPEN || sco->state == BT_CLOSED))
290                         hci_add_sco(sco, acl->handle);
291
292                 return sco;
293         } else {
294                 return acl;
295         }
296 }
297
298 /* Authenticate remote device */
299 int hci_conn_auth(struct hci_conn *conn)
300 {
301         BT_DBG("conn %p", conn);
302         
303         if (conn->link_mode & HCI_LM_AUTH)
304                 return 1;
305         
306         if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->pend)) {
307                 struct hci_cp_auth_requested cp;
308                 cp.handle = __cpu_to_le16(conn->handle);
309                 hci_send_cmd(conn->hdev, OGF_LINK_CTL, OCF_AUTH_REQUESTED, sizeof(cp), &cp);
310         }
311         return 0;
312 }
313
314 /* Enable encryption */
315 int hci_conn_encrypt(struct hci_conn *conn)
316 {
317         BT_DBG("conn %p", conn);
318         
319         if (conn->link_mode & HCI_LM_ENCRYPT)
320                 return 1;
321         
322         if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend))
323                 return 0;
324
325         if (hci_conn_auth(conn)) {
326                 struct hci_cp_set_conn_encrypt cp;
327                 cp.handle  = __cpu_to_le16(conn->handle);
328                 cp.encrypt = 1; 
329                 hci_send_cmd(conn->hdev, OGF_LINK_CTL, OCF_SET_CONN_ENCRYPT, sizeof(cp), &cp);
330         }
331         return 0;
332 }
333
334 /* Drop all connection on the device */
335 void hci_conn_hash_flush(struct hci_dev *hdev)
336 {
337         struct hci_conn_hash *h = &hdev->conn_hash;
338         struct list_head *p;
339
340         BT_DBG("hdev %s", hdev->name);
341
342         p = h->list.next;
343         while (p != &h->list) {
344                 struct hci_conn *c;
345
346                 c = list_entry(p, struct hci_conn, list);
347                 p = p->next;
348
349                 c->state = BT_CLOSED;
350
351                 hci_proto_disconn_ind(c, 0x16);
352                 hci_conn_del(c);
353         }
354 }
355
356 int hci_get_conn_list(unsigned long arg)
357 {
358         struct hci_conn_list_req req, *cl;
359         struct hci_conn_info *ci;
360         struct hci_dev *hdev;
361         struct list_head *p;
362         int n = 0, size, err;
363
364         if (copy_from_user(&req, (void *) arg, sizeof(req)))
365                 return -EFAULT;
366
367         if (!req.conn_num || req.conn_num > (PAGE_SIZE * 2) / sizeof(*ci))
368                 return -EINVAL;
369
370         size = sizeof(req) + req.conn_num * sizeof(*ci);
371
372         if (!(cl = (void *) kmalloc(size, GFP_KERNEL)))
373                 return -ENOMEM;
374
375         if (!(hdev = hci_dev_get(req.dev_id))) {
376                 kfree(cl);
377                 return -ENODEV;
378         }
379
380         ci = cl->conn_info;
381
382         hci_dev_lock_bh(hdev);
383         list_for_each(p, &hdev->conn_hash.list) {
384                 register struct hci_conn *c;
385                 c = list_entry(p, struct hci_conn, list);
386
387                 bacpy(&(ci + n)->bdaddr, &c->dst);
388                 (ci + n)->handle = c->handle;
389                 (ci + n)->type  = c->type;
390                 (ci + n)->out   = c->out;
391                 (ci + n)->state = c->state;
392                 (ci + n)->link_mode = c->link_mode;
393                 if (++n >= req.conn_num)
394                         break;
395         }
396         hci_dev_unlock_bh(hdev);
397
398         cl->dev_id = hdev->id;
399         cl->conn_num = n;
400         size = sizeof(req) + n * sizeof(*ci);
401
402         hci_dev_put(hdev);
403
404         err = copy_to_user((void *) arg, cl, size);
405         kfree(cl);
406
407         return err ? -EFAULT : 0;
408 }
409
410 int hci_get_conn_info(struct hci_dev *hdev, unsigned long arg)
411 {
412         struct hci_conn_info_req req;
413         struct hci_conn_info ci;
414         struct hci_conn *conn;
415         char *ptr = (void *) arg + sizeof(req);
416
417         if (copy_from_user(&req, (void *) arg, sizeof(req)))
418                 return -EFAULT;
419
420         hci_dev_lock_bh(hdev);
421         conn = hci_conn_hash_lookup_ba(hdev, req.type, &req.bdaddr);
422         if (conn) {
423                 bacpy(&ci.bdaddr, &conn->dst);
424                 ci.handle = conn->handle;
425                 ci.type  = conn->type;
426                 ci.out   = conn->out;
427                 ci.state = conn->state;
428                 ci.link_mode = conn->link_mode;
429         }
430         hci_dev_unlock_bh(hdev);
431
432         if (!conn)
433                 return -ENOENT;
434
435         return copy_to_user(ptr, &ci, sizeof(ci)) ? -EFAULT : 0;
436 }