blob: 79a4325a1388f2de329a3b6c7e6d3f9fc93a6dd0 [file] [log] [blame]
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 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
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090015 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
Linus Torvalds1da177e2005-04-16 15:20:36 -070018 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090020 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
Linus Torvalds1da177e2005-04-16 15:20:36 -070022 SOFTWARE IS DISCLAIMED.
23*/
24
25/* Bluetooth L2CAP core and sockets. */
26
Linus Torvalds1da177e2005-04-16 15:20:36 -070027#include <linux/module.h>
28
29#include <linux/types.h>
Randy Dunlap4fc268d2006-01-11 12:17:47 -080030#include <linux/capability.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070031#include <linux/errno.h>
32#include <linux/kernel.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070033#include <linux/sched.h>
34#include <linux/slab.h>
35#include <linux/poll.h>
36#include <linux/fcntl.h>
37#include <linux/init.h>
38#include <linux/interrupt.h>
39#include <linux/socket.h>
40#include <linux/skbuff.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070041#include <linux/list.h>
Marcel Holtmannbe9d1222005-11-08 09:57:38 -080042#include <linux/device.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070043#include <net/sock.h>
44
45#include <asm/system.h>
46#include <asm/uaccess.h>
47#include <asm/unaligned.h>
48
49#include <net/bluetooth/bluetooth.h>
50#include <net/bluetooth/hci_core.h>
51#include <net/bluetooth/l2cap.h>
52
Marcel Holtmanne1027a72009-02-09 09:18:02 +010053#define VERSION "2.13"
Marcel Holtmannf0709e02007-10-20 13:38:51 +020054
Marcel Holtmanne1027a72009-02-09 09:18:02 +010055static u32 l2cap_feat_mask = 0x0080;
56static u8 l2cap_fixed_chan[8] = { 0x02, };
Linus Torvalds1da177e2005-04-16 15:20:36 -070057
Eric Dumazet90ddc4f2005-12-22 12:49:22 -080058static const struct proto_ops l2cap_sock_ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -070059
60static struct bt_sock_list l2cap_sk_list = {
Robert P. J. Dayd5fb2962008-03-28 16:17:38 -070061 .lock = __RW_LOCK_UNLOCKED(l2cap_sk_list.lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -070062};
63
Linus Torvalds1da177e2005-04-16 15:20:36 -070064static void __l2cap_sock_close(struct sock *sk, int reason);
65static void l2cap_sock_close(struct sock *sk);
66static void l2cap_sock_kill(struct sock *sk);
67
68static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn,
69 u8 code, u8 ident, u16 dlen, void *data);
70
71/* ---- L2CAP timers ---- */
72static void l2cap_sock_timeout(unsigned long arg)
73{
74 struct sock *sk = (struct sock *) arg;
Marcel Holtmannb1235d72008-07-14 20:13:54 +020075 int reason;
Linus Torvalds1da177e2005-04-16 15:20:36 -070076
77 BT_DBG("sock %p state %d", sk, sk->sk_state);
78
79 bh_lock_sock(sk);
Marcel Holtmannb1235d72008-07-14 20:13:54 +020080
Marcel Holtmannf62e4322009-01-15 21:58:44 +010081 if (sk->sk_state == BT_CONNECTED || sk->sk_state == BT_CONFIG)
82 reason = ECONNREFUSED;
83 else if (sk->sk_state == BT_CONNECT &&
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +010084 l2cap_pi(sk)->sec_level != BT_SECURITY_SDP)
Marcel Holtmannb1235d72008-07-14 20:13:54 +020085 reason = ECONNREFUSED;
86 else
87 reason = ETIMEDOUT;
88
89 __l2cap_sock_close(sk, reason);
90
Linus Torvalds1da177e2005-04-16 15:20:36 -070091 bh_unlock_sock(sk);
92
93 l2cap_sock_kill(sk);
94 sock_put(sk);
95}
96
97static void l2cap_sock_set_timer(struct sock *sk, long timeout)
98{
99 BT_DBG("sk %p state %d timeout %ld", sk, sk->sk_state, timeout);
100 sk_reset_timer(sk, &sk->sk_timer, jiffies + timeout);
101}
102
103static void l2cap_sock_clear_timer(struct sock *sk)
104{
105 BT_DBG("sock %p state %d", sk, sk->sk_state);
106 sk_stop_timer(sk, &sk->sk_timer);
107}
108
Marcel Holtmann01394182006-07-03 10:02:46 +0200109/* ---- L2CAP channels ---- */
110static struct sock *__l2cap_get_chan_by_dcid(struct l2cap_chan_list *l, u16 cid)
111{
112 struct sock *s;
113 for (s = l->head; s; s = l2cap_pi(s)->next_c) {
114 if (l2cap_pi(s)->dcid == cid)
115 break;
116 }
117 return s;
118}
119
120static struct sock *__l2cap_get_chan_by_scid(struct l2cap_chan_list *l, u16 cid)
121{
122 struct sock *s;
123 for (s = l->head; s; s = l2cap_pi(s)->next_c) {
124 if (l2cap_pi(s)->scid == cid)
125 break;
126 }
127 return s;
128}
129
130/* Find channel with given SCID.
131 * Returns locked socket */
132static inline struct sock *l2cap_get_chan_by_scid(struct l2cap_chan_list *l, u16 cid)
133{
134 struct sock *s;
135 read_lock(&l->lock);
136 s = __l2cap_get_chan_by_scid(l, cid);
137 if (s) bh_lock_sock(s);
138 read_unlock(&l->lock);
139 return s;
140}
141
142static struct sock *__l2cap_get_chan_by_ident(struct l2cap_chan_list *l, u8 ident)
143{
144 struct sock *s;
145 for (s = l->head; s; s = l2cap_pi(s)->next_c) {
146 if (l2cap_pi(s)->ident == ident)
147 break;
148 }
149 return s;
150}
151
152static inline struct sock *l2cap_get_chan_by_ident(struct l2cap_chan_list *l, u8 ident)
153{
154 struct sock *s;
155 read_lock(&l->lock);
156 s = __l2cap_get_chan_by_ident(l, ident);
157 if (s) bh_lock_sock(s);
158 read_unlock(&l->lock);
159 return s;
160}
161
162static u16 l2cap_alloc_cid(struct l2cap_chan_list *l)
163{
164 u16 cid = 0x0040;
165
166 for (; cid < 0xffff; cid++) {
167 if(!__l2cap_get_chan_by_scid(l, cid))
168 return cid;
169 }
170
171 return 0;
172}
173
174static inline void __l2cap_chan_link(struct l2cap_chan_list *l, struct sock *sk)
175{
176 sock_hold(sk);
177
178 if (l->head)
179 l2cap_pi(l->head)->prev_c = sk;
180
181 l2cap_pi(sk)->next_c = l->head;
182 l2cap_pi(sk)->prev_c = NULL;
183 l->head = sk;
184}
185
186static inline void l2cap_chan_unlink(struct l2cap_chan_list *l, struct sock *sk)
187{
188 struct sock *next = l2cap_pi(sk)->next_c, *prev = l2cap_pi(sk)->prev_c;
189
Marcel Holtmannfd1278d2006-07-12 23:00:07 +0200190 write_lock_bh(&l->lock);
Marcel Holtmann01394182006-07-03 10:02:46 +0200191 if (sk == l->head)
192 l->head = next;
193
194 if (next)
195 l2cap_pi(next)->prev_c = prev;
196 if (prev)
197 l2cap_pi(prev)->next_c = next;
Marcel Holtmannfd1278d2006-07-12 23:00:07 +0200198 write_unlock_bh(&l->lock);
Marcel Holtmann01394182006-07-03 10:02:46 +0200199
200 __sock_put(sk);
201}
202
203static void __l2cap_chan_add(struct l2cap_conn *conn, struct sock *sk, struct sock *parent)
204{
205 struct l2cap_chan_list *l = &conn->chan_list;
206
207 BT_DBG("conn %p, psm 0x%2.2x, dcid 0x%4.4x", conn, l2cap_pi(sk)->psm, l2cap_pi(sk)->dcid);
208
Marcel Holtmann2950f212009-02-12 14:02:50 +0100209 conn->disc_reason = 0x13;
210
Marcel Holtmann01394182006-07-03 10:02:46 +0200211 l2cap_pi(sk)->conn = conn;
212
213 if (sk->sk_type == SOCK_SEQPACKET) {
214 /* Alloc CID for connection-oriented socket */
215 l2cap_pi(sk)->scid = l2cap_alloc_cid(l);
216 } else if (sk->sk_type == SOCK_DGRAM) {
217 /* Connectionless socket */
218 l2cap_pi(sk)->scid = 0x0002;
219 l2cap_pi(sk)->dcid = 0x0002;
220 l2cap_pi(sk)->omtu = L2CAP_DEFAULT_MTU;
221 } else {
222 /* Raw socket can send/recv signalling messages only */
223 l2cap_pi(sk)->scid = 0x0001;
224 l2cap_pi(sk)->dcid = 0x0001;
225 l2cap_pi(sk)->omtu = L2CAP_DEFAULT_MTU;
226 }
227
228 __l2cap_chan_link(l, sk);
229
230 if (parent)
231 bt_accept_enqueue(parent, sk);
232}
233
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900234/* Delete channel.
Marcel Holtmann01394182006-07-03 10:02:46 +0200235 * Must be called on the locked socket. */
236static void l2cap_chan_del(struct sock *sk, int err)
237{
238 struct l2cap_conn *conn = l2cap_pi(sk)->conn;
239 struct sock *parent = bt_sk(sk)->parent;
240
241 l2cap_sock_clear_timer(sk);
242
243 BT_DBG("sk %p, conn %p, err %d", sk, conn, err);
244
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900245 if (conn) {
Marcel Holtmann01394182006-07-03 10:02:46 +0200246 /* Unlink from channel list */
247 l2cap_chan_unlink(&conn->chan_list, sk);
248 l2cap_pi(sk)->conn = NULL;
249 hci_conn_put(conn->hcon);
250 }
251
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200252 sk->sk_state = BT_CLOSED;
Marcel Holtmann01394182006-07-03 10:02:46 +0200253 sock_set_flag(sk, SOCK_ZAPPED);
254
255 if (err)
256 sk->sk_err = err;
257
258 if (parent) {
259 bt_accept_unlink(sk);
260 parent->sk_data_ready(parent, 0);
261 } else
262 sk->sk_state_change(sk);
263}
264
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200265/* Service level security */
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100266static inline int l2cap_check_security(struct sock *sk)
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200267{
268 struct l2cap_conn *conn = l2cap_pi(sk)->conn;
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100269 __u8 auth_type;
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200270
Marcel Holtmann00ae4af2009-02-12 16:19:45 +0100271 if (l2cap_pi(sk)->psm == cpu_to_le16(0x0001)) {
272 if (l2cap_pi(sk)->sec_level == BT_SECURITY_HIGH)
273 auth_type = HCI_AT_NO_BONDING_MITM;
274 else
275 auth_type = HCI_AT_NO_BONDING;
276
277 if (l2cap_pi(sk)->sec_level == BT_SECURITY_LOW)
278 l2cap_pi(sk)->sec_level = BT_SECURITY_SDP;
279 } else {
280 switch (l2cap_pi(sk)->sec_level) {
281 case BT_SECURITY_HIGH:
282 auth_type = HCI_AT_GENERAL_BONDING_MITM;
283 break;
284 case BT_SECURITY_MEDIUM:
285 auth_type = HCI_AT_GENERAL_BONDING;
286 break;
287 default:
288 auth_type = HCI_AT_NO_BONDING;
289 break;
290 }
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100291 }
292
293 return hci_conn_security(conn->hcon, l2cap_pi(sk)->sec_level,
294 auth_type);
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200295}
296
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200297static inline u8 l2cap_get_ident(struct l2cap_conn *conn)
298{
299 u8 id;
300
301 /* Get next available identificator.
302 * 1 - 128 are used by kernel.
303 * 129 - 199 are reserved.
304 * 200 - 254 are used by utilities like l2ping, etc.
305 */
306
307 spin_lock_bh(&conn->lock);
308
309 if (++conn->tx_ident > 128)
310 conn->tx_ident = 1;
311
312 id = conn->tx_ident;
313
314 spin_unlock_bh(&conn->lock);
315
316 return id;
317}
318
319static inline int l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len, void *data)
320{
321 struct sk_buff *skb = l2cap_build_cmd(conn, code, ident, len, data);
322
323 BT_DBG("code 0x%2.2x", code);
324
325 if (!skb)
326 return -ENOMEM;
327
328 return hci_send_acl(conn->hcon, skb, 0);
329}
330
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200331static void l2cap_do_start(struct sock *sk)
332{
333 struct l2cap_conn *conn = l2cap_pi(sk)->conn;
334
335 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) {
Marcel Holtmann984947d2009-02-06 23:35:19 +0100336 if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE))
337 return;
338
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100339 if (l2cap_check_security(sk)) {
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200340 struct l2cap_conn_req req;
341 req.scid = cpu_to_le16(l2cap_pi(sk)->scid);
342 req.psm = l2cap_pi(sk)->psm;
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200343
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200344 l2cap_pi(sk)->ident = l2cap_get_ident(conn);
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200345
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200346 l2cap_send_cmd(conn, l2cap_pi(sk)->ident,
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200347 L2CAP_CONN_REQ, sizeof(req), &req);
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200348 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200349 } else {
350 struct l2cap_info_req req;
351 req.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
352
353 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
354 conn->info_ident = l2cap_get_ident(conn);
355
356 mod_timer(&conn->info_timer, jiffies +
357 msecs_to_jiffies(L2CAP_INFO_TIMEOUT));
358
359 l2cap_send_cmd(conn, conn->info_ident,
360 L2CAP_INFO_REQ, sizeof(req), &req);
361 }
362}
363
Linus Torvalds1da177e2005-04-16 15:20:36 -0700364/* ---- L2CAP connections ---- */
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200365static void l2cap_conn_start(struct l2cap_conn *conn)
366{
367 struct l2cap_chan_list *l = &conn->chan_list;
368 struct sock *sk;
369
370 BT_DBG("conn %p", conn);
371
372 read_lock(&l->lock);
373
374 for (sk = l->head; sk; sk = l2cap_pi(sk)->next_c) {
375 bh_lock_sock(sk);
376
377 if (sk->sk_type != SOCK_SEQPACKET) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200378 bh_unlock_sock(sk);
379 continue;
380 }
381
382 if (sk->sk_state == BT_CONNECT) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100383 if (l2cap_check_security(sk)) {
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200384 struct l2cap_conn_req req;
385 req.scid = cpu_to_le16(l2cap_pi(sk)->scid);
386 req.psm = l2cap_pi(sk)->psm;
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200387
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200388 l2cap_pi(sk)->ident = l2cap_get_ident(conn);
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200389
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200390 l2cap_send_cmd(conn, l2cap_pi(sk)->ident,
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200391 L2CAP_CONN_REQ, sizeof(req), &req);
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200392 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200393 } else if (sk->sk_state == BT_CONNECT2) {
394 struct l2cap_conn_rsp rsp;
395 rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid);
396 rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid);
397
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100398 if (l2cap_check_security(sk)) {
Marcel Holtmannf66dc812009-01-15 21:57:00 +0100399 if (bt_sk(sk)->defer_setup) {
400 struct sock *parent = bt_sk(sk)->parent;
401 rsp.result = cpu_to_le16(L2CAP_CR_PEND);
402 rsp.status = cpu_to_le16(L2CAP_CS_AUTHOR_PEND);
403 parent->sk_data_ready(parent, 0);
404
405 } else {
406 sk->sk_state = BT_CONFIG;
407 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
408 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
409 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200410 } else {
411 rsp.result = cpu_to_le16(L2CAP_CR_PEND);
412 rsp.status = cpu_to_le16(L2CAP_CS_AUTHEN_PEND);
413 }
414
415 l2cap_send_cmd(conn, l2cap_pi(sk)->ident,
416 L2CAP_CONN_RSP, sizeof(rsp), &rsp);
417 }
418
419 bh_unlock_sock(sk);
420 }
421
422 read_unlock(&l->lock);
423}
424
425static void l2cap_conn_ready(struct l2cap_conn *conn)
426{
427 struct l2cap_chan_list *l = &conn->chan_list;
428 struct sock *sk;
429
430 BT_DBG("conn %p", conn);
431
432 read_lock(&l->lock);
433
434 for (sk = l->head; sk; sk = l2cap_pi(sk)->next_c) {
435 bh_lock_sock(sk);
436
437 if (sk->sk_type != SOCK_SEQPACKET) {
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200438 l2cap_sock_clear_timer(sk);
439 sk->sk_state = BT_CONNECTED;
440 sk->sk_state_change(sk);
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200441 } else if (sk->sk_state == BT_CONNECT)
442 l2cap_do_start(sk);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200443
444 bh_unlock_sock(sk);
445 }
446
447 read_unlock(&l->lock);
448}
449
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200450/* Notify sockets that we cannot guaranty reliability anymore */
451static void l2cap_conn_unreliable(struct l2cap_conn *conn, int err)
452{
453 struct l2cap_chan_list *l = &conn->chan_list;
454 struct sock *sk;
455
456 BT_DBG("conn %p", conn);
457
458 read_lock(&l->lock);
459
460 for (sk = l->head; sk; sk = l2cap_pi(sk)->next_c) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100461 if (l2cap_pi(sk)->force_reliable)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200462 sk->sk_err = err;
463 }
464
465 read_unlock(&l->lock);
466}
467
468static void l2cap_info_timeout(unsigned long arg)
469{
470 struct l2cap_conn *conn = (void *) arg;
471
Marcel Holtmann984947d2009-02-06 23:35:19 +0100472 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +0100473 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +0100474
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200475 l2cap_conn_start(conn);
476}
477
Linus Torvalds1da177e2005-04-16 15:20:36 -0700478static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon, u8 status)
479{
Marcel Holtmann01394182006-07-03 10:02:46 +0200480 struct l2cap_conn *conn = hcon->l2cap_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700481
Marcel Holtmann01394182006-07-03 10:02:46 +0200482 if (conn || status)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700483 return conn;
484
Marcel Holtmann01394182006-07-03 10:02:46 +0200485 conn = kzalloc(sizeof(struct l2cap_conn), GFP_ATOMIC);
486 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700487 return NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700488
489 hcon->l2cap_data = conn;
490 conn->hcon = hcon;
491
Marcel Holtmann01394182006-07-03 10:02:46 +0200492 BT_DBG("hcon %p conn %p", hcon, conn);
493
Linus Torvalds1da177e2005-04-16 15:20:36 -0700494 conn->mtu = hcon->hdev->acl_mtu;
495 conn->src = &hcon->hdev->bdaddr;
496 conn->dst = &hcon->dst;
497
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200498 conn->feat_mask = 0;
499
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200500 setup_timer(&conn->info_timer, l2cap_info_timeout,
501 (unsigned long) conn);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200502
Linus Torvalds1da177e2005-04-16 15:20:36 -0700503 spin_lock_init(&conn->lock);
504 rwlock_init(&conn->chan_list.lock);
505
Marcel Holtmann2950f212009-02-12 14:02:50 +0100506 conn->disc_reason = 0x13;
507
Linus Torvalds1da177e2005-04-16 15:20:36 -0700508 return conn;
509}
510
Marcel Holtmann01394182006-07-03 10:02:46 +0200511static void l2cap_conn_del(struct hci_conn *hcon, int err)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700512{
Marcel Holtmann01394182006-07-03 10:02:46 +0200513 struct l2cap_conn *conn = hcon->l2cap_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700514 struct sock *sk;
515
Marcel Holtmann01394182006-07-03 10:02:46 +0200516 if (!conn)
517 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700518
519 BT_DBG("hcon %p conn %p, err %d", hcon, conn, err);
520
521 if (conn->rx_skb)
522 kfree_skb(conn->rx_skb);
523
524 /* Kill channels */
525 while ((sk = conn->chan_list.head)) {
526 bh_lock_sock(sk);
527 l2cap_chan_del(sk, err);
528 bh_unlock_sock(sk);
529 l2cap_sock_kill(sk);
530 }
531
Dave Young8e8440f2008-03-03 12:18:55 -0800532 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT)
533 del_timer_sync(&conn->info_timer);
Thomas Gleixner3ab22732008-02-26 17:42:56 -0800534
Linus Torvalds1da177e2005-04-16 15:20:36 -0700535 hcon->l2cap_data = NULL;
536 kfree(conn);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700537}
538
539static inline void l2cap_chan_add(struct l2cap_conn *conn, struct sock *sk, struct sock *parent)
540{
541 struct l2cap_chan_list *l = &conn->chan_list;
Marcel Holtmannfd1278d2006-07-12 23:00:07 +0200542 write_lock_bh(&l->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700543 __l2cap_chan_add(conn, sk, parent);
Marcel Holtmannfd1278d2006-07-12 23:00:07 +0200544 write_unlock_bh(&l->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700545}
546
Linus Torvalds1da177e2005-04-16 15:20:36 -0700547/* ---- Socket interface ---- */
Al Viro8e036fc2007-07-29 00:16:36 -0700548static struct sock *__l2cap_get_sock_by_addr(__le16 psm, bdaddr_t *src)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700549{
550 struct sock *sk;
551 struct hlist_node *node;
552 sk_for_each(sk, node, &l2cap_sk_list.head)
553 if (l2cap_pi(sk)->sport == psm && !bacmp(&bt_sk(sk)->src, src))
554 goto found;
555 sk = NULL;
556found:
557 return sk;
558}
559
560/* Find socket with psm and source bdaddr.
561 * Returns closest match.
562 */
Al Viro8e036fc2007-07-29 00:16:36 -0700563static struct sock *__l2cap_get_sock_by_psm(int state, __le16 psm, bdaddr_t *src)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700564{
565 struct sock *sk = NULL, *sk1 = NULL;
566 struct hlist_node *node;
567
568 sk_for_each(sk, node, &l2cap_sk_list.head) {
569 if (state && sk->sk_state != state)
570 continue;
571
572 if (l2cap_pi(sk)->psm == psm) {
573 /* Exact match. */
574 if (!bacmp(&bt_sk(sk)->src, src))
575 break;
576
577 /* Closest match */
578 if (!bacmp(&bt_sk(sk)->src, BDADDR_ANY))
579 sk1 = sk;
580 }
581 }
582 return node ? sk : sk1;
583}
584
585/* Find socket with given address (psm, src).
586 * Returns locked socket */
Al Viro8e036fc2007-07-29 00:16:36 -0700587static inline struct sock *l2cap_get_sock_by_psm(int state, __le16 psm, bdaddr_t *src)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700588{
589 struct sock *s;
590 read_lock(&l2cap_sk_list.lock);
591 s = __l2cap_get_sock_by_psm(state, psm, src);
592 if (s) bh_lock_sock(s);
593 read_unlock(&l2cap_sk_list.lock);
594 return s;
595}
596
597static void l2cap_sock_destruct(struct sock *sk)
598{
599 BT_DBG("sk %p", sk);
600
601 skb_queue_purge(&sk->sk_receive_queue);
602 skb_queue_purge(&sk->sk_write_queue);
603}
604
605static void l2cap_sock_cleanup_listen(struct sock *parent)
606{
607 struct sock *sk;
608
609 BT_DBG("parent %p", parent);
610
611 /* Close not yet accepted channels */
612 while ((sk = bt_accept_dequeue(parent, NULL)))
613 l2cap_sock_close(sk);
614
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200615 parent->sk_state = BT_CLOSED;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700616 sock_set_flag(parent, SOCK_ZAPPED);
617}
618
619/* Kill socket (only if zapped and orphan)
620 * Must be called on unlocked socket.
621 */
622static void l2cap_sock_kill(struct sock *sk)
623{
624 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
625 return;
626
627 BT_DBG("sk %p state %d", sk, sk->sk_state);
628
629 /* Kill poor orphan */
630 bt_sock_unlink(&l2cap_sk_list, sk);
631 sock_set_flag(sk, SOCK_DEAD);
632 sock_put(sk);
633}
634
635static void __l2cap_sock_close(struct sock *sk, int reason)
636{
637 BT_DBG("sk %p state %d socket %p", sk, sk->sk_state, sk->sk_socket);
638
639 switch (sk->sk_state) {
640 case BT_LISTEN:
641 l2cap_sock_cleanup_listen(sk);
642 break;
643
644 case BT_CONNECTED:
645 case BT_CONFIG:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700646 if (sk->sk_type == SOCK_SEQPACKET) {
647 struct l2cap_conn *conn = l2cap_pi(sk)->conn;
648 struct l2cap_disconn_req req;
649
650 sk->sk_state = BT_DISCONN;
651 l2cap_sock_set_timer(sk, sk->sk_sndtimeo);
652
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -0700653 req.dcid = cpu_to_le16(l2cap_pi(sk)->dcid);
654 req.scid = cpu_to_le16(l2cap_pi(sk)->scid);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700655 l2cap_send_cmd(conn, l2cap_get_ident(conn),
656 L2CAP_DISCONN_REQ, sizeof(req), &req);
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200657 } else
Linus Torvalds1da177e2005-04-16 15:20:36 -0700658 l2cap_chan_del(sk, reason);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700659 break;
660
Marcel Holtmannf66dc812009-01-15 21:57:00 +0100661 case BT_CONNECT2:
662 if (sk->sk_type == SOCK_SEQPACKET) {
663 struct l2cap_conn *conn = l2cap_pi(sk)->conn;
664 struct l2cap_conn_rsp rsp;
665 __u16 result;
666
667 if (bt_sk(sk)->defer_setup)
668 result = L2CAP_CR_SEC_BLOCK;
669 else
670 result = L2CAP_CR_BAD_PSM;
671
672 rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid);
673 rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid);
674 rsp.result = cpu_to_le16(result);
675 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
676 l2cap_send_cmd(conn, l2cap_pi(sk)->ident,
677 L2CAP_CONN_RSP, sizeof(rsp), &rsp);
678 } else
679 l2cap_chan_del(sk, reason);
680 break;
681
Linus Torvalds1da177e2005-04-16 15:20:36 -0700682 case BT_CONNECT:
683 case BT_DISCONN:
684 l2cap_chan_del(sk, reason);
685 break;
686
687 default:
688 sock_set_flag(sk, SOCK_ZAPPED);
689 break;
690 }
691}
692
693/* Must be called on unlocked socket. */
694static void l2cap_sock_close(struct sock *sk)
695{
696 l2cap_sock_clear_timer(sk);
697 lock_sock(sk);
698 __l2cap_sock_close(sk, ECONNRESET);
699 release_sock(sk);
700 l2cap_sock_kill(sk);
701}
702
703static void l2cap_sock_init(struct sock *sk, struct sock *parent)
704{
705 struct l2cap_pinfo *pi = l2cap_pi(sk);
706
707 BT_DBG("sk %p", sk);
708
709 if (parent) {
710 sk->sk_type = parent->sk_type;
Marcel Holtmannf66dc812009-01-15 21:57:00 +0100711 bt_sk(sk)->defer_setup = bt_sk(parent)->defer_setup;
712
Linus Torvalds1da177e2005-04-16 15:20:36 -0700713 pi->imtu = l2cap_pi(parent)->imtu;
714 pi->omtu = l2cap_pi(parent)->omtu;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100715 pi->sec_level = l2cap_pi(parent)->sec_level;
716 pi->role_switch = l2cap_pi(parent)->role_switch;
717 pi->force_reliable = l2cap_pi(parent)->force_reliable;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700718 } else {
719 pi->imtu = L2CAP_DEFAULT_MTU;
720 pi->omtu = 0;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100721 pi->sec_level = BT_SECURITY_LOW;
722 pi->role_switch = 0;
723 pi->force_reliable = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700724 }
725
726 /* Default config options */
Marcel Holtmann5dee9e72007-05-24 14:27:19 +0200727 pi->conf_len = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700728 pi->flush_to = L2CAP_DEFAULT_FLUSH_TO;
729}
730
731static struct proto l2cap_proto = {
732 .name = "L2CAP",
733 .owner = THIS_MODULE,
734 .obj_size = sizeof(struct l2cap_pinfo)
735};
736
Eric W. Biederman1b8d7ae2007-10-08 23:24:22 -0700737static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700738{
739 struct sock *sk;
740
Pavel Emelyanov6257ff22007-11-01 00:39:31 -0700741 sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700742 if (!sk)
743 return NULL;
744
745 sock_init_data(sock, sk);
746 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
747
748 sk->sk_destruct = l2cap_sock_destruct;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200749 sk->sk_sndtimeo = msecs_to_jiffies(L2CAP_CONN_TIMEOUT);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700750
751 sock_reset_flag(sk, SOCK_ZAPPED);
752
753 sk->sk_protocol = proto;
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200754 sk->sk_state = BT_OPEN;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700755
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200756 setup_timer(&sk->sk_timer, l2cap_sock_timeout, (unsigned long) sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700757
758 bt_sock_link(&l2cap_sk_list, sk);
759 return sk;
760}
761
Eric W. Biederman1b8d7ae2007-10-08 23:24:22 -0700762static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700763{
764 struct sock *sk;
765
766 BT_DBG("sock %p", sock);
767
768 sock->state = SS_UNCONNECTED;
769
770 if (sock->type != SOCK_SEQPACKET &&
771 sock->type != SOCK_DGRAM && sock->type != SOCK_RAW)
772 return -ESOCKTNOSUPPORT;
773
774 if (sock->type == SOCK_RAW && !capable(CAP_NET_RAW))
775 return -EPERM;
776
777 sock->ops = &l2cap_sock_ops;
778
Eric W. Biederman1b8d7ae2007-10-08 23:24:22 -0700779 sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700780 if (!sk)
781 return -ENOMEM;
782
783 l2cap_sock_init(sk, NULL);
784 return 0;
785}
786
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100787static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700788{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700789 struct sock *sk = sock->sk;
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100790 struct sockaddr_l2 la;
791 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700792
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100793 BT_DBG("sk %p", sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700794
795 if (!addr || addr->sa_family != AF_BLUETOOTH)
796 return -EINVAL;
797
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100798 memset(&la, 0, sizeof(la));
799 len = min_t(unsigned int, sizeof(la), alen);
800 memcpy(&la, addr, len);
801
Linus Torvalds1da177e2005-04-16 15:20:36 -0700802 lock_sock(sk);
803
804 if (sk->sk_state != BT_OPEN) {
805 err = -EBADFD;
806 goto done;
807 }
808
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100809 if (la.l2_psm && btohs(la.l2_psm) < 0x1001 &&
Marcel Holtmann847641d2007-01-22 22:00:45 +0100810 !capable(CAP_NET_BIND_SERVICE)) {
811 err = -EACCES;
812 goto done;
813 }
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900814
Linus Torvalds1da177e2005-04-16 15:20:36 -0700815 write_lock_bh(&l2cap_sk_list.lock);
816
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100817 if (la.l2_psm && __l2cap_get_sock_by_addr(la.l2_psm, &la.l2_bdaddr)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700818 err = -EADDRINUSE;
819 } else {
820 /* Save source address */
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100821 bacpy(&bt_sk(sk)->src, &la.l2_bdaddr);
822 l2cap_pi(sk)->psm = la.l2_psm;
823 l2cap_pi(sk)->sport = la.l2_psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700824 sk->sk_state = BT_BOUND;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100825
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100826 if (btohs(la.l2_psm) == 0x0001 || btohs(la.l2_psm) == 0x0003)
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100827 l2cap_pi(sk)->sec_level = BT_SECURITY_SDP;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700828 }
829
830 write_unlock_bh(&l2cap_sk_list.lock);
831
832done:
833 release_sock(sk);
834 return err;
835}
836
837static int l2cap_do_connect(struct sock *sk)
838{
839 bdaddr_t *src = &bt_sk(sk)->src;
840 bdaddr_t *dst = &bt_sk(sk)->dst;
841 struct l2cap_conn *conn;
842 struct hci_conn *hcon;
843 struct hci_dev *hdev;
Marcel Holtmann09ab6f42008-09-09 07:19:20 +0200844 __u8 auth_type;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700845 int err = 0;
846
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100847 BT_DBG("%s -> %s psm 0x%2.2x", batostr(src), batostr(dst),
848 l2cap_pi(sk)->psm);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700849
850 if (!(hdev = hci_get_route(dst, src)))
851 return -EHOSTUNREACH;
852
853 hci_dev_lock_bh(hdev);
854
855 err = -ENOMEM;
856
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100857 if (sk->sk_type == SOCK_RAW) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100858 switch (l2cap_pi(sk)->sec_level) {
859 case BT_SECURITY_HIGH:
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100860 auth_type = HCI_AT_DEDICATED_BONDING_MITM;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100861 break;
862 case BT_SECURITY_MEDIUM:
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100863 auth_type = HCI_AT_DEDICATED_BONDING;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100864 break;
865 default:
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100866 auth_type = HCI_AT_NO_BONDING;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100867 break;
868 }
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100869 } else if (l2cap_pi(sk)->psm == cpu_to_le16(0x0001)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100870 if (l2cap_pi(sk)->sec_level == BT_SECURITY_HIGH)
Marcel Holtmann09ab6f42008-09-09 07:19:20 +0200871 auth_type = HCI_AT_NO_BONDING_MITM;
872 else
Marcel Holtmann09ab6f42008-09-09 07:19:20 +0200873 auth_type = HCI_AT_NO_BONDING;
Marcel Holtmann435fef22009-02-09 03:55:28 +0100874
875 if (l2cap_pi(sk)->sec_level == BT_SECURITY_LOW)
876 l2cap_pi(sk)->sec_level = BT_SECURITY_SDP;
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100877 } else {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100878 switch (l2cap_pi(sk)->sec_level) {
879 case BT_SECURITY_HIGH:
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100880 auth_type = HCI_AT_GENERAL_BONDING_MITM;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100881 break;
882 case BT_SECURITY_MEDIUM:
Marcel Holtmann09ab6f42008-09-09 07:19:20 +0200883 auth_type = HCI_AT_GENERAL_BONDING;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100884 break;
885 default:
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100886 auth_type = HCI_AT_NO_BONDING;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100887 break;
888 }
Marcel Holtmann09ab6f42008-09-09 07:19:20 +0200889 }
890
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100891 hcon = hci_connect(hdev, ACL_LINK, dst,
892 l2cap_pi(sk)->sec_level, auth_type);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700893 if (!hcon)
894 goto done;
895
896 conn = l2cap_conn_add(hcon, 0);
897 if (!conn) {
898 hci_conn_put(hcon);
899 goto done;
900 }
901
902 err = 0;
903
904 /* Update source addr of the socket */
905 bacpy(src, conn->src);
906
907 l2cap_chan_add(conn, sk, NULL);
908
909 sk->sk_state = BT_CONNECT;
910 l2cap_sock_set_timer(sk, sk->sk_sndtimeo);
911
912 if (hcon->state == BT_CONNECTED) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200913 if (sk->sk_type != SOCK_SEQPACKET) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700914 l2cap_sock_clear_timer(sk);
915 sk->sk_state = BT_CONNECTED;
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200916 } else
917 l2cap_do_start(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700918 }
919
920done:
921 hci_dev_unlock_bh(hdev);
922 hci_dev_put(hdev);
923 return err;
924}
925
926static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags)
927{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700928 struct sock *sk = sock->sk;
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100929 struct sockaddr_l2 la;
930 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700931
932 lock_sock(sk);
933
934 BT_DBG("sk %p", sk);
935
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100936 if (!addr || addr->sa_family != AF_BLUETOOTH) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700937 err = -EINVAL;
938 goto done;
939 }
940
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100941 memset(&la, 0, sizeof(la));
942 len = min_t(unsigned int, sizeof(la), alen);
943 memcpy(&la, addr, len);
944
945 if (sk->sk_type == SOCK_SEQPACKET && !la.l2_psm) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700946 err = -EINVAL;
947 goto done;
948 }
949
950 switch(sk->sk_state) {
951 case BT_CONNECT:
952 case BT_CONNECT2:
953 case BT_CONFIG:
954 /* Already connecting */
955 goto wait;
956
957 case BT_CONNECTED:
958 /* Already connected */
959 goto done;
960
961 case BT_OPEN:
962 case BT_BOUND:
963 /* Can connect */
964 break;
965
966 default:
967 err = -EBADFD;
968 goto done;
969 }
970
971 /* Set destination address and psm */
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100972 bacpy(&bt_sk(sk)->dst, &la.l2_bdaddr);
973 l2cap_pi(sk)->psm = la.l2_psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700974
975 if ((err = l2cap_do_connect(sk)))
976 goto done;
977
978wait:
979 err = bt_sock_wait_state(sk, BT_CONNECTED,
980 sock_sndtimeo(sk, flags & O_NONBLOCK));
981done:
982 release_sock(sk);
983 return err;
984}
985
986static int l2cap_sock_listen(struct socket *sock, int backlog)
987{
988 struct sock *sk = sock->sk;
989 int err = 0;
990
991 BT_DBG("sk %p backlog %d", sk, backlog);
992
993 lock_sock(sk);
994
995 if (sk->sk_state != BT_BOUND || sock->type != SOCK_SEQPACKET) {
996 err = -EBADFD;
997 goto done;
998 }
999
1000 if (!l2cap_pi(sk)->psm) {
1001 bdaddr_t *src = &bt_sk(sk)->src;
1002 u16 psm;
1003
1004 err = -EINVAL;
1005
1006 write_lock_bh(&l2cap_sk_list.lock);
1007
1008 for (psm = 0x1001; psm < 0x1100; psm += 2)
Al Viro6dc0c202007-07-29 00:15:18 -07001009 if (!__l2cap_get_sock_by_addr(htobs(psm), src)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001010 l2cap_pi(sk)->psm = htobs(psm);
1011 l2cap_pi(sk)->sport = htobs(psm);
1012 err = 0;
1013 break;
1014 }
1015
1016 write_unlock_bh(&l2cap_sk_list.lock);
1017
1018 if (err < 0)
1019 goto done;
1020 }
1021
1022 sk->sk_max_ack_backlog = backlog;
1023 sk->sk_ack_backlog = 0;
1024 sk->sk_state = BT_LISTEN;
1025
1026done:
1027 release_sock(sk);
1028 return err;
1029}
1030
1031static int l2cap_sock_accept(struct socket *sock, struct socket *newsock, int flags)
1032{
1033 DECLARE_WAITQUEUE(wait, current);
1034 struct sock *sk = sock->sk, *nsk;
1035 long timeo;
1036 int err = 0;
1037
Peter Zijlstrafcc70d52006-11-08 22:44:35 -08001038 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001039
1040 if (sk->sk_state != BT_LISTEN) {
1041 err = -EBADFD;
1042 goto done;
1043 }
1044
1045 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
1046
1047 BT_DBG("sk %p timeo %ld", sk, timeo);
1048
1049 /* Wait for an incoming connection. (wake-one). */
1050 add_wait_queue_exclusive(sk->sk_sleep, &wait);
1051 while (!(nsk = bt_accept_dequeue(sk, newsock))) {
1052 set_current_state(TASK_INTERRUPTIBLE);
1053 if (!timeo) {
1054 err = -EAGAIN;
1055 break;
1056 }
1057
1058 release_sock(sk);
1059 timeo = schedule_timeout(timeo);
Peter Zijlstrafcc70d52006-11-08 22:44:35 -08001060 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001061
1062 if (sk->sk_state != BT_LISTEN) {
1063 err = -EBADFD;
1064 break;
1065 }
1066
1067 if (signal_pending(current)) {
1068 err = sock_intr_errno(timeo);
1069 break;
1070 }
1071 }
1072 set_current_state(TASK_RUNNING);
1073 remove_wait_queue(sk->sk_sleep, &wait);
1074
1075 if (err)
1076 goto done;
1077
1078 newsock->state = SS_CONNECTED;
1079
1080 BT_DBG("new socket %p", nsk);
1081
1082done:
1083 release_sock(sk);
1084 return err;
1085}
1086
1087static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr, int *len, int peer)
1088{
1089 struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr;
1090 struct sock *sk = sock->sk;
1091
1092 BT_DBG("sock %p, sk %p", sock, sk);
1093
1094 addr->sa_family = AF_BLUETOOTH;
1095 *len = sizeof(struct sockaddr_l2);
1096
Marcel Holtmannf29972d2009-02-12 05:07:45 +01001097 if (peer) {
1098 la->l2_psm = l2cap_pi(sk)->psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001099 bacpy(&la->l2_bdaddr, &bt_sk(sk)->dst);
Marcel Holtmannf29972d2009-02-12 05:07:45 +01001100 la->l2_cid = htobs(l2cap_pi(sk)->dcid);
1101 } else {
1102 la->l2_psm = l2cap_pi(sk)->sport;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001103 bacpy(&la->l2_bdaddr, &bt_sk(sk)->src);
Marcel Holtmannf29972d2009-02-12 05:07:45 +01001104 la->l2_cid = htobs(l2cap_pi(sk)->scid);
1105 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001106
Linus Torvalds1da177e2005-04-16 15:20:36 -07001107 return 0;
1108}
1109
1110static inline int l2cap_do_send(struct sock *sk, struct msghdr *msg, int len)
1111{
1112 struct l2cap_conn *conn = l2cap_pi(sk)->conn;
1113 struct sk_buff *skb, **frag;
1114 int err, hlen, count, sent=0;
1115 struct l2cap_hdr *lh;
1116
1117 BT_DBG("sk %p len %d", sk, len);
1118
1119 /* First fragment (with L2CAP header) */
1120 if (sk->sk_type == SOCK_DGRAM)
1121 hlen = L2CAP_HDR_SIZE + 2;
1122 else
1123 hlen = L2CAP_HDR_SIZE;
1124
1125 count = min_t(unsigned int, (conn->mtu - hlen), len);
1126
1127 skb = bt_skb_send_alloc(sk, hlen + count,
1128 msg->msg_flags & MSG_DONTWAIT, &err);
1129 if (!skb)
1130 return err;
1131
1132 /* Create L2CAP header */
1133 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07001134 lh->cid = cpu_to_le16(l2cap_pi(sk)->dcid);
1135 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001136
1137 if (sk->sk_type == SOCK_DGRAM)
Al Viro8e036fc2007-07-29 00:16:36 -07001138 put_unaligned(l2cap_pi(sk)->psm, (__le16 *) skb_put(skb, 2));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001139
1140 if (memcpy_fromiovec(skb_put(skb, count), msg->msg_iov, count)) {
1141 err = -EFAULT;
1142 goto fail;
1143 }
1144
1145 sent += count;
1146 len -= count;
1147
1148 /* Continuation fragments (no L2CAP header) */
1149 frag = &skb_shinfo(skb)->frag_list;
1150 while (len) {
1151 count = min_t(unsigned int, conn->mtu, len);
1152
1153 *frag = bt_skb_send_alloc(sk, count, msg->msg_flags & MSG_DONTWAIT, &err);
1154 if (!*frag)
1155 goto fail;
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001156
Linus Torvalds1da177e2005-04-16 15:20:36 -07001157 if (memcpy_fromiovec(skb_put(*frag, count), msg->msg_iov, count)) {
1158 err = -EFAULT;
1159 goto fail;
1160 }
1161
1162 sent += count;
1163 len -= count;
1164
1165 frag = &(*frag)->next;
1166 }
1167
1168 if ((err = hci_send_acl(conn->hcon, skb, 0)) < 0)
1169 goto fail;
1170
1171 return sent;
1172
1173fail:
1174 kfree_skb(skb);
1175 return err;
1176}
1177
1178static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len)
1179{
1180 struct sock *sk = sock->sk;
1181 int err = 0;
1182
1183 BT_DBG("sock %p, sk %p", sock, sk);
1184
Benjamin LaHaisec1cbe4b2005-12-13 23:22:19 -08001185 err = sock_error(sk);
1186 if (err)
1187 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001188
1189 if (msg->msg_flags & MSG_OOB)
1190 return -EOPNOTSUPP;
1191
1192 /* Check outgoing MTU */
1193 if (sk->sk_type != SOCK_RAW && len > l2cap_pi(sk)->omtu)
1194 return -EINVAL;
1195
1196 lock_sock(sk);
1197
1198 if (sk->sk_state == BT_CONNECTED)
1199 err = l2cap_do_send(sk, msg, len);
1200 else
1201 err = -ENOTCONN;
1202
1203 release_sock(sk);
1204 return err;
1205}
1206
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001207static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len, int flags)
1208{
1209 struct sock *sk = sock->sk;
1210
1211 lock_sock(sk);
1212
1213 if (sk->sk_state == BT_CONNECT2 && bt_sk(sk)->defer_setup) {
1214 struct l2cap_conn_rsp rsp;
1215
1216 sk->sk_state = BT_CONFIG;
1217
1218 rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid);
1219 rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid);
1220 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
1221 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
1222 l2cap_send_cmd(l2cap_pi(sk)->conn, l2cap_pi(sk)->ident,
1223 L2CAP_CONN_RSP, sizeof(rsp), &rsp);
1224
1225 release_sock(sk);
1226 return 0;
1227 }
1228
1229 release_sock(sk);
1230
1231 return bt_sock_recvmsg(iocb, sock, msg, len, flags);
1232}
1233
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001234static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __user *optval, int optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001235{
1236 struct sock *sk = sock->sk;
1237 struct l2cap_options opts;
Marcel Holtmannf29972d2009-02-12 05:07:45 +01001238 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001239 u32 opt;
1240
1241 BT_DBG("sk %p", sk);
1242
1243 lock_sock(sk);
1244
1245 switch (optname) {
1246 case L2CAP_OPTIONS:
Marcel Holtmann0878b662007-05-05 00:35:59 +02001247 opts.imtu = l2cap_pi(sk)->imtu;
1248 opts.omtu = l2cap_pi(sk)->omtu;
1249 opts.flush_to = l2cap_pi(sk)->flush_to;
Marcel Holtmann6464f352007-10-20 13:39:51 +02001250 opts.mode = L2CAP_MODE_BASIC;
Marcel Holtmann0878b662007-05-05 00:35:59 +02001251
Linus Torvalds1da177e2005-04-16 15:20:36 -07001252 len = min_t(unsigned int, sizeof(opts), optlen);
1253 if (copy_from_user((char *) &opts, optval, len)) {
1254 err = -EFAULT;
1255 break;
1256 }
Marcel Holtmann0878b662007-05-05 00:35:59 +02001257
Linus Torvalds1da177e2005-04-16 15:20:36 -07001258 l2cap_pi(sk)->imtu = opts.imtu;
1259 l2cap_pi(sk)->omtu = opts.omtu;
1260 break;
1261
1262 case L2CAP_LM:
1263 if (get_user(opt, (u32 __user *) optval)) {
1264 err = -EFAULT;
1265 break;
1266 }
1267
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001268 if (opt & L2CAP_LM_AUTH)
1269 l2cap_pi(sk)->sec_level = BT_SECURITY_LOW;
1270 if (opt & L2CAP_LM_ENCRYPT)
1271 l2cap_pi(sk)->sec_level = BT_SECURITY_MEDIUM;
1272 if (opt & L2CAP_LM_SECURE)
1273 l2cap_pi(sk)->sec_level = BT_SECURITY_HIGH;
1274
1275 l2cap_pi(sk)->role_switch = (opt & L2CAP_LM_MASTER);
1276 l2cap_pi(sk)->force_reliable = (opt & L2CAP_LM_RELIABLE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001277 break;
1278
1279 default:
1280 err = -ENOPROTOOPT;
1281 break;
1282 }
1283
1284 release_sock(sk);
1285 return err;
1286}
1287
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001288static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, int optlen)
1289{
1290 struct sock *sk = sock->sk;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001291 struct bt_security sec;
1292 int len, err = 0;
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001293 u32 opt;
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001294
1295 BT_DBG("sk %p", sk);
1296
1297 if (level == SOL_L2CAP)
1298 return l2cap_sock_setsockopt_old(sock, optname, optval, optlen);
1299
Marcel Holtmann0588d942009-01-16 10:06:13 +01001300 if (level != SOL_BLUETOOTH)
1301 return -ENOPROTOOPT;
1302
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001303 lock_sock(sk);
1304
1305 switch (optname) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001306 case BT_SECURITY:
Marcel Holtmann0588d942009-01-16 10:06:13 +01001307 if (sk->sk_type != SOCK_SEQPACKET) {
1308 err = -EINVAL;
1309 break;
1310 }
1311
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001312 sec.level = BT_SECURITY_LOW;
1313
1314 len = min_t(unsigned int, sizeof(sec), optlen);
1315 if (copy_from_user((char *) &sec, optval, len)) {
1316 err = -EFAULT;
1317 break;
1318 }
1319
1320 if (sec.level < BT_SECURITY_LOW ||
1321 sec.level > BT_SECURITY_HIGH) {
1322 err = -EINVAL;
1323 break;
1324 }
1325
1326 l2cap_pi(sk)->sec_level = sec.level;
1327 break;
1328
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001329 case BT_DEFER_SETUP:
1330 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
1331 err = -EINVAL;
1332 break;
1333 }
1334
1335 if (get_user(opt, (u32 __user *) optval)) {
1336 err = -EFAULT;
1337 break;
1338 }
1339
1340 bt_sk(sk)->defer_setup = opt;
1341 break;
1342
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001343 default:
1344 err = -ENOPROTOOPT;
1345 break;
1346 }
1347
1348 release_sock(sk);
1349 return err;
1350}
1351
1352static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, char __user *optval, int __user *optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001353{
1354 struct sock *sk = sock->sk;
1355 struct l2cap_options opts;
1356 struct l2cap_conninfo cinfo;
1357 int len, err = 0;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001358 u32 opt;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001359
1360 BT_DBG("sk %p", sk);
1361
1362 if (get_user(len, optlen))
1363 return -EFAULT;
1364
1365 lock_sock(sk);
1366
1367 switch (optname) {
1368 case L2CAP_OPTIONS:
1369 opts.imtu = l2cap_pi(sk)->imtu;
1370 opts.omtu = l2cap_pi(sk)->omtu;
1371 opts.flush_to = l2cap_pi(sk)->flush_to;
Marcel Holtmann6464f352007-10-20 13:39:51 +02001372 opts.mode = L2CAP_MODE_BASIC;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001373
1374 len = min_t(unsigned int, len, sizeof(opts));
1375 if (copy_to_user(optval, (char *) &opts, len))
1376 err = -EFAULT;
1377
1378 break;
1379
1380 case L2CAP_LM:
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001381 switch (l2cap_pi(sk)->sec_level) {
1382 case BT_SECURITY_LOW:
1383 opt = L2CAP_LM_AUTH;
1384 break;
1385 case BT_SECURITY_MEDIUM:
1386 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT;
1387 break;
1388 case BT_SECURITY_HIGH:
1389 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
1390 L2CAP_LM_SECURE;
1391 break;
1392 default:
1393 opt = 0;
1394 break;
1395 }
1396
1397 if (l2cap_pi(sk)->role_switch)
1398 opt |= L2CAP_LM_MASTER;
1399
1400 if (l2cap_pi(sk)->force_reliable)
1401 opt |= L2CAP_LM_RELIABLE;
1402
1403 if (put_user(opt, (u32 __user *) optval))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001404 err = -EFAULT;
1405 break;
1406
1407 case L2CAP_CONNINFO:
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001408 if (sk->sk_state != BT_CONNECTED &&
1409 !(sk->sk_state == BT_CONNECT2 &&
1410 bt_sk(sk)->defer_setup)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001411 err = -ENOTCONN;
1412 break;
1413 }
1414
1415 cinfo.hci_handle = l2cap_pi(sk)->conn->hcon->handle;
1416 memcpy(cinfo.dev_class, l2cap_pi(sk)->conn->hcon->dev_class, 3);
1417
1418 len = min_t(unsigned int, len, sizeof(cinfo));
1419 if (copy_to_user(optval, (char *) &cinfo, len))
1420 err = -EFAULT;
1421
1422 break;
1423
1424 default:
1425 err = -ENOPROTOOPT;
1426 break;
1427 }
1428
1429 release_sock(sk);
1430 return err;
1431}
1432
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001433static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen)
1434{
1435 struct sock *sk = sock->sk;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001436 struct bt_security sec;
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001437 int len, err = 0;
1438
1439 BT_DBG("sk %p", sk);
1440
1441 if (level == SOL_L2CAP)
1442 return l2cap_sock_getsockopt_old(sock, optname, optval, optlen);
1443
Marcel Holtmann0588d942009-01-16 10:06:13 +01001444 if (level != SOL_BLUETOOTH)
1445 return -ENOPROTOOPT;
1446
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001447 if (get_user(len, optlen))
1448 return -EFAULT;
1449
1450 lock_sock(sk);
1451
1452 switch (optname) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001453 case BT_SECURITY:
Marcel Holtmann0588d942009-01-16 10:06:13 +01001454 if (sk->sk_type != SOCK_SEQPACKET) {
1455 err = -EINVAL;
1456 break;
1457 }
1458
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001459 sec.level = l2cap_pi(sk)->sec_level;
1460
1461 len = min_t(unsigned int, len, sizeof(sec));
1462 if (copy_to_user(optval, (char *) &sec, len))
1463 err = -EFAULT;
1464
1465 break;
1466
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001467 case BT_DEFER_SETUP:
1468 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
1469 err = -EINVAL;
1470 break;
1471 }
1472
1473 if (put_user(bt_sk(sk)->defer_setup, (u32 __user *) optval))
1474 err = -EFAULT;
1475
1476 break;
1477
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001478 default:
1479 err = -ENOPROTOOPT;
1480 break;
1481 }
1482
1483 release_sock(sk);
1484 return err;
1485}
1486
Linus Torvalds1da177e2005-04-16 15:20:36 -07001487static int l2cap_sock_shutdown(struct socket *sock, int how)
1488{
1489 struct sock *sk = sock->sk;
1490 int err = 0;
1491
1492 BT_DBG("sock %p, sk %p", sock, sk);
1493
1494 if (!sk)
1495 return 0;
1496
1497 lock_sock(sk);
1498 if (!sk->sk_shutdown) {
1499 sk->sk_shutdown = SHUTDOWN_MASK;
1500 l2cap_sock_clear_timer(sk);
1501 __l2cap_sock_close(sk, 0);
1502
1503 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime)
Marcel Holtmannb1235d72008-07-14 20:13:54 +02001504 err = bt_sock_wait_state(sk, BT_CLOSED,
1505 sk->sk_lingertime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001506 }
1507 release_sock(sk);
1508 return err;
1509}
1510
1511static int l2cap_sock_release(struct socket *sock)
1512{
1513 struct sock *sk = sock->sk;
1514 int err;
1515
1516 BT_DBG("sock %p, sk %p", sock, sk);
1517
1518 if (!sk)
1519 return 0;
1520
1521 err = l2cap_sock_shutdown(sock, 2);
1522
1523 sock_orphan(sk);
1524 l2cap_sock_kill(sk);
1525 return err;
1526}
1527
Linus Torvalds1da177e2005-04-16 15:20:36 -07001528static void l2cap_chan_ready(struct sock *sk)
1529{
1530 struct sock *parent = bt_sk(sk)->parent;
1531
1532 BT_DBG("sk %p, parent %p", sk, parent);
1533
1534 l2cap_pi(sk)->conf_state = 0;
1535 l2cap_sock_clear_timer(sk);
1536
1537 if (!parent) {
1538 /* Outgoing channel.
1539 * Wake up socket sleeping on connect.
1540 */
1541 sk->sk_state = BT_CONNECTED;
1542 sk->sk_state_change(sk);
1543 } else {
1544 /* Incoming channel.
1545 * Wake up socket sleeping on accept.
1546 */
1547 parent->sk_data_ready(parent, 0);
1548 }
1549}
1550
1551/* Copy frame to all raw sockets on that connection */
1552static void l2cap_raw_recv(struct l2cap_conn *conn, struct sk_buff *skb)
1553{
1554 struct l2cap_chan_list *l = &conn->chan_list;
1555 struct sk_buff *nskb;
1556 struct sock * sk;
1557
1558 BT_DBG("conn %p", conn);
1559
1560 read_lock(&l->lock);
1561 for (sk = l->head; sk; sk = l2cap_pi(sk)->next_c) {
1562 if (sk->sk_type != SOCK_RAW)
1563 continue;
1564
1565 /* Don't send frame to the socket it came from */
1566 if (skb->sk == sk)
1567 continue;
1568
1569 if (!(nskb = skb_clone(skb, GFP_ATOMIC)))
1570 continue;
1571
1572 if (sock_queue_rcv_skb(sk, nskb))
1573 kfree_skb(nskb);
1574 }
1575 read_unlock(&l->lock);
1576}
1577
1578/* ---- L2CAP signalling commands ---- */
1579static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn,
1580 u8 code, u8 ident, u16 dlen, void *data)
1581{
1582 struct sk_buff *skb, **frag;
1583 struct l2cap_cmd_hdr *cmd;
1584 struct l2cap_hdr *lh;
1585 int len, count;
1586
1587 BT_DBG("conn %p, code 0x%2.2x, ident 0x%2.2x, len %d", conn, code, ident, dlen);
1588
1589 len = L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE + dlen;
1590 count = min_t(unsigned int, conn->mtu, len);
1591
1592 skb = bt_skb_alloc(count, GFP_ATOMIC);
1593 if (!skb)
1594 return NULL;
1595
1596 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07001597 lh->len = cpu_to_le16(L2CAP_CMD_HDR_SIZE + dlen);
1598 lh->cid = cpu_to_le16(0x0001);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001599
1600 cmd = (struct l2cap_cmd_hdr *) skb_put(skb, L2CAP_CMD_HDR_SIZE);
1601 cmd->code = code;
1602 cmd->ident = ident;
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07001603 cmd->len = cpu_to_le16(dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001604
1605 if (dlen) {
1606 count -= L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE;
1607 memcpy(skb_put(skb, count), data, count);
1608 data += count;
1609 }
1610
1611 len -= skb->len;
1612
1613 /* Continuation fragments (no L2CAP header) */
1614 frag = &skb_shinfo(skb)->frag_list;
1615 while (len) {
1616 count = min_t(unsigned int, conn->mtu, len);
1617
1618 *frag = bt_skb_alloc(count, GFP_ATOMIC);
1619 if (!*frag)
1620 goto fail;
1621
1622 memcpy(skb_put(*frag, count), data, count);
1623
1624 len -= count;
1625 data += count;
1626
1627 frag = &(*frag)->next;
1628 }
1629
1630 return skb;
1631
1632fail:
1633 kfree_skb(skb);
1634 return NULL;
1635}
1636
1637static inline int l2cap_get_conf_opt(void **ptr, int *type, int *olen, unsigned long *val)
1638{
1639 struct l2cap_conf_opt *opt = *ptr;
1640 int len;
1641
1642 len = L2CAP_CONF_OPT_SIZE + opt->len;
1643 *ptr += len;
1644
1645 *type = opt->type;
1646 *olen = opt->len;
1647
1648 switch (opt->len) {
1649 case 1:
1650 *val = *((u8 *) opt->val);
1651 break;
1652
1653 case 2:
Marcel Holtmann861d6882007-10-20 13:37:06 +02001654 *val = __le16_to_cpu(*((__le16 *) opt->val));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001655 break;
1656
1657 case 4:
Marcel Holtmann861d6882007-10-20 13:37:06 +02001658 *val = __le32_to_cpu(*((__le32 *) opt->val));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001659 break;
1660
1661 default:
1662 *val = (unsigned long) opt->val;
1663 break;
1664 }
1665
1666 BT_DBG("type 0x%2.2x len %d val 0x%lx", *type, opt->len, *val);
1667 return len;
1668}
1669
Linus Torvalds1da177e2005-04-16 15:20:36 -07001670static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val)
1671{
1672 struct l2cap_conf_opt *opt = *ptr;
1673
1674 BT_DBG("type 0x%2.2x len %d val 0x%lx", type, len, val);
1675
1676 opt->type = type;
1677 opt->len = len;
1678
1679 switch (len) {
1680 case 1:
1681 *((u8 *) opt->val) = val;
1682 break;
1683
1684 case 2:
Al Viro8e036fc2007-07-29 00:16:36 -07001685 *((__le16 *) opt->val) = cpu_to_le16(val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001686 break;
1687
1688 case 4:
Al Viro8e036fc2007-07-29 00:16:36 -07001689 *((__le32 *) opt->val) = cpu_to_le32(val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001690 break;
1691
1692 default:
1693 memcpy(opt->val, (void *) val, len);
1694 break;
1695 }
1696
1697 *ptr += L2CAP_CONF_OPT_SIZE + len;
1698}
1699
1700static int l2cap_build_conf_req(struct sock *sk, void *data)
1701{
1702 struct l2cap_pinfo *pi = l2cap_pi(sk);
1703 struct l2cap_conf_req *req = data;
1704 void *ptr = req->data;
1705
1706 BT_DBG("sk %p", sk);
1707
1708 if (pi->imtu != L2CAP_DEFAULT_MTU)
1709 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, pi->imtu);
1710
1711 /* FIXME: Need actual value of the flush timeout */
1712 //if (flush_to != L2CAP_DEFAULT_FLUSH_TO)
1713 // l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO, 2, pi->flush_to);
1714
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07001715 req->dcid = cpu_to_le16(pi->dcid);
1716 req->flags = cpu_to_le16(0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001717
1718 return ptr - data;
1719}
1720
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001721static int l2cap_parse_conf_req(struct sock *sk, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001722{
1723 struct l2cap_pinfo *pi = l2cap_pi(sk);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001724 struct l2cap_conf_rsp *rsp = data;
1725 void *ptr = rsp->data;
1726 void *req = pi->conf_req;
1727 int len = pi->conf_len;
1728 int type, hint, olen;
1729 unsigned long val;
Marcel Holtmann6464f352007-10-20 13:39:51 +02001730 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Marcel Holtmann861d6882007-10-20 13:37:06 +02001731 u16 mtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001732 u16 result = L2CAP_CONF_SUCCESS;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001733
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001734 BT_DBG("sk %p", sk);
Marcel Holtmann820ae1b2006-11-18 22:15:00 +01001735
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001736 while (len >= L2CAP_CONF_OPT_SIZE) {
1737 len -= l2cap_get_conf_opt(&req, &type, &olen, &val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001738
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001739 hint = type & 0x80;
1740 type &= 0x7f;
1741
1742 switch (type) {
1743 case L2CAP_CONF_MTU:
Marcel Holtmann861d6882007-10-20 13:37:06 +02001744 mtu = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001745 break;
1746
1747 case L2CAP_CONF_FLUSH_TO:
1748 pi->flush_to = val;
1749 break;
1750
1751 case L2CAP_CONF_QOS:
1752 break;
1753
Marcel Holtmann6464f352007-10-20 13:39:51 +02001754 case L2CAP_CONF_RFC:
1755 if (olen == sizeof(rfc))
1756 memcpy(&rfc, (void *) val, olen);
1757 break;
1758
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001759 default:
1760 if (hint)
1761 break;
1762
1763 result = L2CAP_CONF_UNKNOWN;
1764 *((u8 *) ptr++) = type;
1765 break;
1766 }
1767 }
1768
1769 if (result == L2CAP_CONF_SUCCESS) {
1770 /* Configure output options and let the other side know
1771 * which ones we don't like. */
1772
Marcel Holtmann6464f352007-10-20 13:39:51 +02001773 if (rfc.mode == L2CAP_MODE_BASIC) {
1774 if (mtu < pi->omtu)
1775 result = L2CAP_CONF_UNACCEPT;
1776 else {
1777 pi->omtu = mtu;
1778 pi->conf_state |= L2CAP_CONF_OUTPUT_DONE;
1779 }
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001780
Marcel Holtmann6464f352007-10-20 13:39:51 +02001781 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, pi->omtu);
1782 } else {
1783 result = L2CAP_CONF_UNACCEPT;
1784
1785 memset(&rfc, 0, sizeof(rfc));
1786 rfc.mode = L2CAP_MODE_BASIC;
1787
1788 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
1789 sizeof(rfc), (unsigned long) &rfc);
1790 }
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001791 }
1792
1793 rsp->scid = cpu_to_le16(pi->dcid);
1794 rsp->result = cpu_to_le16(result);
1795 rsp->flags = cpu_to_le16(0x0000);
1796
1797 return ptr - data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001798}
1799
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001800static int l2cap_build_conf_rsp(struct sock *sk, void *data, u16 result, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001801{
1802 struct l2cap_conf_rsp *rsp = data;
1803 void *ptr = rsp->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001804
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001805 BT_DBG("sk %p", sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001806
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07001807 rsp->scid = cpu_to_le16(l2cap_pi(sk)->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001808 rsp->result = cpu_to_le16(result);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07001809 rsp->flags = cpu_to_le16(flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001810
1811 return ptr - data;
1812}
1813
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001814static inline int l2cap_command_rej(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
1815{
1816 struct l2cap_cmd_rej *rej = (struct l2cap_cmd_rej *) data;
1817
1818 if (rej->reason != 0x0000)
1819 return 0;
1820
1821 if ((conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) &&
1822 cmd->ident == conn->info_ident) {
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001823 del_timer(&conn->info_timer);
Marcel Holtmann984947d2009-02-06 23:35:19 +01001824
1825 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01001826 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01001827
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001828 l2cap_conn_start(conn);
1829 }
1830
1831 return 0;
1832}
1833
Linus Torvalds1da177e2005-04-16 15:20:36 -07001834static inline int l2cap_connect_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
1835{
1836 struct l2cap_chan_list *list = &conn->chan_list;
1837 struct l2cap_conn_req *req = (struct l2cap_conn_req *) data;
1838 struct l2cap_conn_rsp rsp;
1839 struct sock *sk, *parent;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02001840 int result, status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001841
1842 u16 dcid = 0, scid = __le16_to_cpu(req->scid);
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02001843 __le16 psm = req->psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001844
1845 BT_DBG("psm 0x%2.2x scid 0x%4.4x", psm, scid);
1846
1847 /* Check if we have socket listening on psm */
1848 parent = l2cap_get_sock_by_psm(BT_LISTEN, psm, conn->src);
1849 if (!parent) {
1850 result = L2CAP_CR_BAD_PSM;
1851 goto sendresp;
1852 }
1853
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02001854 /* Check if the ACL is secure enough (if not SDP) */
1855 if (psm != cpu_to_le16(0x0001) &&
1856 !hci_conn_check_link_mode(conn->hcon)) {
Marcel Holtmann2950f212009-02-12 14:02:50 +01001857 conn->disc_reason = 0x05;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02001858 result = L2CAP_CR_SEC_BLOCK;
1859 goto response;
1860 }
1861
Linus Torvalds1da177e2005-04-16 15:20:36 -07001862 result = L2CAP_CR_NO_MEM;
1863
1864 /* Check for backlog size */
1865 if (sk_acceptq_is_full(parent)) {
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001866 BT_DBG("backlog full %d", parent->sk_ack_backlog);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001867 goto response;
1868 }
1869
YOSHIFUJI Hideaki3b1e0a62008-03-26 02:26:21 +09001870 sk = l2cap_sock_alloc(sock_net(parent), NULL, BTPROTO_L2CAP, GFP_ATOMIC);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001871 if (!sk)
1872 goto response;
1873
Marcel Holtmannfd1278d2006-07-12 23:00:07 +02001874 write_lock_bh(&list->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001875
1876 /* Check if we already have channel with that dcid */
1877 if (__l2cap_get_chan_by_dcid(list, scid)) {
Marcel Holtmannfd1278d2006-07-12 23:00:07 +02001878 write_unlock_bh(&list->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001879 sock_set_flag(sk, SOCK_ZAPPED);
1880 l2cap_sock_kill(sk);
1881 goto response;
1882 }
1883
1884 hci_conn_hold(conn->hcon);
1885
1886 l2cap_sock_init(sk, parent);
1887 bacpy(&bt_sk(sk)->src, conn->src);
1888 bacpy(&bt_sk(sk)->dst, conn->dst);
1889 l2cap_pi(sk)->psm = psm;
1890 l2cap_pi(sk)->dcid = scid;
1891
1892 __l2cap_chan_add(conn, sk, parent);
1893 dcid = l2cap_pi(sk)->scid;
1894
1895 l2cap_sock_set_timer(sk, sk->sk_sndtimeo);
1896
Linus Torvalds1da177e2005-04-16 15:20:36 -07001897 l2cap_pi(sk)->ident = cmd->ident;
1898
Marcel Holtmann984947d2009-02-06 23:35:19 +01001899 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001900 if (l2cap_check_security(sk)) {
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001901 if (bt_sk(sk)->defer_setup) {
1902 sk->sk_state = BT_CONNECT2;
1903 result = L2CAP_CR_PEND;
1904 status = L2CAP_CS_AUTHOR_PEND;
1905 parent->sk_data_ready(parent, 0);
1906 } else {
1907 sk->sk_state = BT_CONFIG;
1908 result = L2CAP_CR_SUCCESS;
1909 status = L2CAP_CS_NO_INFO;
1910 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001911 } else {
1912 sk->sk_state = BT_CONNECT2;
1913 result = L2CAP_CR_PEND;
1914 status = L2CAP_CS_AUTHEN_PEND;
1915 }
1916 } else {
1917 sk->sk_state = BT_CONNECT2;
1918 result = L2CAP_CR_PEND;
1919 status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001920 }
1921
Marcel Holtmannfd1278d2006-07-12 23:00:07 +02001922 write_unlock_bh(&list->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001923
1924response:
1925 bh_unlock_sock(parent);
1926
1927sendresp:
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07001928 rsp.scid = cpu_to_le16(scid);
1929 rsp.dcid = cpu_to_le16(dcid);
1930 rsp.result = cpu_to_le16(result);
1931 rsp.status = cpu_to_le16(status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001932 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONN_RSP, sizeof(rsp), &rsp);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001933
1934 if (result == L2CAP_CR_PEND && status == L2CAP_CS_NO_INFO) {
1935 struct l2cap_info_req info;
1936 info.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
1937
1938 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
1939 conn->info_ident = l2cap_get_ident(conn);
1940
1941 mod_timer(&conn->info_timer, jiffies +
1942 msecs_to_jiffies(L2CAP_INFO_TIMEOUT));
1943
1944 l2cap_send_cmd(conn, conn->info_ident,
1945 L2CAP_INFO_REQ, sizeof(info), &info);
1946 }
1947
Linus Torvalds1da177e2005-04-16 15:20:36 -07001948 return 0;
1949}
1950
1951static inline int l2cap_connect_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
1952{
1953 struct l2cap_conn_rsp *rsp = (struct l2cap_conn_rsp *) data;
1954 u16 scid, dcid, result, status;
1955 struct sock *sk;
1956 u8 req[128];
1957
1958 scid = __le16_to_cpu(rsp->scid);
1959 dcid = __le16_to_cpu(rsp->dcid);
1960 result = __le16_to_cpu(rsp->result);
1961 status = __le16_to_cpu(rsp->status);
1962
1963 BT_DBG("dcid 0x%4.4x scid 0x%4.4x result 0x%2.2x status 0x%2.2x", dcid, scid, result, status);
1964
1965 if (scid) {
1966 if (!(sk = l2cap_get_chan_by_scid(&conn->chan_list, scid)))
1967 return 0;
1968 } else {
1969 if (!(sk = l2cap_get_chan_by_ident(&conn->chan_list, cmd->ident)))
1970 return 0;
1971 }
1972
1973 switch (result) {
1974 case L2CAP_CR_SUCCESS:
1975 sk->sk_state = BT_CONFIG;
1976 l2cap_pi(sk)->ident = 0;
1977 l2cap_pi(sk)->dcid = dcid;
1978 l2cap_pi(sk)->conf_state |= L2CAP_CONF_REQ_SENT;
1979
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01001980 l2cap_pi(sk)->conf_state &= ~L2CAP_CONF_CONNECT_PEND;
1981
Linus Torvalds1da177e2005-04-16 15:20:36 -07001982 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
1983 l2cap_build_conf_req(sk, req), req);
1984 break;
1985
1986 case L2CAP_CR_PEND:
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01001987 l2cap_pi(sk)->conf_state |= L2CAP_CONF_CONNECT_PEND;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001988 break;
1989
1990 default:
1991 l2cap_chan_del(sk, ECONNREFUSED);
1992 break;
1993 }
1994
1995 bh_unlock_sock(sk);
1996 return 0;
1997}
1998
Al Viro88219a02007-07-29 00:17:25 -07001999static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u16 cmd_len, u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002000{
2001 struct l2cap_conf_req *req = (struct l2cap_conf_req *) data;
2002 u16 dcid, flags;
2003 u8 rsp[64];
2004 struct sock *sk;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002005 int len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002006
2007 dcid = __le16_to_cpu(req->dcid);
2008 flags = __le16_to_cpu(req->flags);
2009
2010 BT_DBG("dcid 0x%4.4x flags 0x%2.2x", dcid, flags);
2011
2012 if (!(sk = l2cap_get_chan_by_scid(&conn->chan_list, dcid)))
2013 return -ENOENT;
2014
Marcel Holtmann354f60a2006-11-18 22:15:20 +01002015 if (sk->sk_state == BT_DISCONN)
2016 goto unlock;
2017
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002018 /* Reject if config buffer is too small. */
Al Viro88219a02007-07-29 00:17:25 -07002019 len = cmd_len - sizeof(*req);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002020 if (l2cap_pi(sk)->conf_len + len > sizeof(l2cap_pi(sk)->conf_req)) {
2021 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
2022 l2cap_build_conf_rsp(sk, rsp,
2023 L2CAP_CONF_REJECT, flags), rsp);
2024 goto unlock;
2025 }
2026
2027 /* Store config. */
2028 memcpy(l2cap_pi(sk)->conf_req + l2cap_pi(sk)->conf_len, req->data, len);
2029 l2cap_pi(sk)->conf_len += len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002030
2031 if (flags & 0x0001) {
2032 /* Incomplete config. Send empty response. */
2033 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002034 l2cap_build_conf_rsp(sk, rsp,
2035 L2CAP_CONF_SUCCESS, 0x0001), rsp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002036 goto unlock;
2037 }
2038
2039 /* Complete config. */
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002040 len = l2cap_parse_conf_req(sk, rsp);
2041 if (len < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002042 goto unlock;
2043
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002044 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp);
2045
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002046 /* Reset config buffer. */
2047 l2cap_pi(sk)->conf_len = 0;
2048
Marcel Holtmann876d9482007-10-20 13:35:42 +02002049 if (!(l2cap_pi(sk)->conf_state & L2CAP_CONF_OUTPUT_DONE))
2050 goto unlock;
2051
Linus Torvalds1da177e2005-04-16 15:20:36 -07002052 if (l2cap_pi(sk)->conf_state & L2CAP_CONF_INPUT_DONE) {
2053 sk->sk_state = BT_CONNECTED;
2054 l2cap_chan_ready(sk);
Marcel Holtmann876d9482007-10-20 13:35:42 +02002055 goto unlock;
2056 }
2057
2058 if (!(l2cap_pi(sk)->conf_state & L2CAP_CONF_REQ_SENT)) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02002059 u8 buf[64];
Linus Torvalds1da177e2005-04-16 15:20:36 -07002060 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Marcel Holtmann79d554a2008-07-14 20:13:44 +02002061 l2cap_build_conf_req(sk, buf), buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002062 }
2063
2064unlock:
2065 bh_unlock_sock(sk);
2066 return 0;
2067}
2068
2069static inline int l2cap_config_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
2070{
2071 struct l2cap_conf_rsp *rsp = (struct l2cap_conf_rsp *)data;
2072 u16 scid, flags, result;
2073 struct sock *sk;
2074
2075 scid = __le16_to_cpu(rsp->scid);
2076 flags = __le16_to_cpu(rsp->flags);
2077 result = __le16_to_cpu(rsp->result);
2078
2079 BT_DBG("scid 0x%4.4x flags 0x%2.2x result 0x%2.2x", scid, flags, result);
2080
2081 if (!(sk = l2cap_get_chan_by_scid(&conn->chan_list, scid)))
2082 return 0;
2083
2084 switch (result) {
2085 case L2CAP_CONF_SUCCESS:
2086 break;
2087
2088 case L2CAP_CONF_UNACCEPT:
2089 if (++l2cap_pi(sk)->conf_retry < L2CAP_CONF_MAX_RETRIES) {
2090 char req[128];
2091 /* It does not make sense to adjust L2CAP parameters
2092 * that are currently defined in the spec. We simply
2093 * resend config request that we sent earlier. It is
2094 * stupid, but it helps qualification testing which
2095 * expects at least some response from us. */
2096 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
2097 l2cap_build_conf_req(sk, req), req);
2098 goto done;
2099 }
2100
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09002101 default:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002102 sk->sk_state = BT_DISCONN;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02002103 sk->sk_err = ECONNRESET;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002104 l2cap_sock_set_timer(sk, HZ * 5);
2105 {
2106 struct l2cap_disconn_req req;
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002107 req.dcid = cpu_to_le16(l2cap_pi(sk)->dcid);
2108 req.scid = cpu_to_le16(l2cap_pi(sk)->scid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002109 l2cap_send_cmd(conn, l2cap_get_ident(conn),
2110 L2CAP_DISCONN_REQ, sizeof(req), &req);
2111 }
2112 goto done;
2113 }
2114
2115 if (flags & 0x01)
2116 goto done;
2117
Linus Torvalds1da177e2005-04-16 15:20:36 -07002118 l2cap_pi(sk)->conf_state |= L2CAP_CONF_INPUT_DONE;
2119
2120 if (l2cap_pi(sk)->conf_state & L2CAP_CONF_OUTPUT_DONE) {
2121 sk->sk_state = BT_CONNECTED;
2122 l2cap_chan_ready(sk);
2123 }
2124
2125done:
2126 bh_unlock_sock(sk);
2127 return 0;
2128}
2129
2130static inline int l2cap_disconnect_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
2131{
2132 struct l2cap_disconn_req *req = (struct l2cap_disconn_req *) data;
2133 struct l2cap_disconn_rsp rsp;
2134 u16 dcid, scid;
2135 struct sock *sk;
2136
2137 scid = __le16_to_cpu(req->scid);
2138 dcid = __le16_to_cpu(req->dcid);
2139
2140 BT_DBG("scid 0x%4.4x dcid 0x%4.4x", scid, dcid);
2141
2142 if (!(sk = l2cap_get_chan_by_scid(&conn->chan_list, dcid)))
2143 return 0;
2144
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002145 rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid);
2146 rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002147 l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp);
2148
2149 sk->sk_shutdown = SHUTDOWN_MASK;
2150
2151 l2cap_chan_del(sk, ECONNRESET);
2152 bh_unlock_sock(sk);
2153
2154 l2cap_sock_kill(sk);
2155 return 0;
2156}
2157
2158static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
2159{
2160 struct l2cap_disconn_rsp *rsp = (struct l2cap_disconn_rsp *) data;
2161 u16 dcid, scid;
2162 struct sock *sk;
2163
2164 scid = __le16_to_cpu(rsp->scid);
2165 dcid = __le16_to_cpu(rsp->dcid);
2166
2167 BT_DBG("dcid 0x%4.4x scid 0x%4.4x", dcid, scid);
2168
2169 if (!(sk = l2cap_get_chan_by_scid(&conn->chan_list, scid)))
2170 return 0;
2171
2172 l2cap_chan_del(sk, 0);
2173 bh_unlock_sock(sk);
2174
2175 l2cap_sock_kill(sk);
2176 return 0;
2177}
2178
2179static inline int l2cap_information_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
2180{
2181 struct l2cap_info_req *req = (struct l2cap_info_req *) data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002182 u16 type;
2183
2184 type = __le16_to_cpu(req->type);
2185
2186 BT_DBG("type 0x%4.4x", type);
2187
Marcel Holtmannf0709e02007-10-20 13:38:51 +02002188 if (type == L2CAP_IT_FEAT_MASK) {
2189 u8 buf[8];
2190 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
2191 rsp->type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
2192 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
2193 put_unaligned(cpu_to_le32(l2cap_feat_mask), (__le32 *) rsp->data);
2194 l2cap_send_cmd(conn, cmd->ident,
2195 L2CAP_INFO_RSP, sizeof(buf), buf);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01002196 } else if (type == L2CAP_IT_FIXED_CHAN) {
2197 u8 buf[12];
2198 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
2199 rsp->type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
2200 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
2201 memcpy(buf + 4, l2cap_fixed_chan, 8);
2202 l2cap_send_cmd(conn, cmd->ident,
2203 L2CAP_INFO_RSP, sizeof(buf), buf);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02002204 } else {
2205 struct l2cap_info_rsp rsp;
2206 rsp.type = cpu_to_le16(type);
2207 rsp.result = cpu_to_le16(L2CAP_IR_NOTSUPP);
2208 l2cap_send_cmd(conn, cmd->ident,
2209 L2CAP_INFO_RSP, sizeof(rsp), &rsp);
2210 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002211
2212 return 0;
2213}
2214
2215static inline int l2cap_information_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
2216{
2217 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) data;
2218 u16 type, result;
2219
2220 type = __le16_to_cpu(rsp->type);
2221 result = __le16_to_cpu(rsp->result);
2222
2223 BT_DBG("type 0x%4.4x result 0x%2.2x", type, result);
2224
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02002225 del_timer(&conn->info_timer);
2226
Marcel Holtmann984947d2009-02-06 23:35:19 +01002227 if (type == L2CAP_IT_FEAT_MASK) {
Harvey Harrison83985312008-05-02 16:25:46 -07002228 conn->feat_mask = get_unaligned_le32(rsp->data);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02002229
Marcel Holtmanne1027a72009-02-09 09:18:02 +01002230 if (conn->feat_mask & 0x0080) {
2231 struct l2cap_info_req req;
2232 req.type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
2233
2234 conn->info_ident = l2cap_get_ident(conn);
2235
2236 l2cap_send_cmd(conn, conn->info_ident,
2237 L2CAP_INFO_REQ, sizeof(req), &req);
2238 } else {
2239 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
2240 conn->info_ident = 0;
2241
2242 l2cap_conn_start(conn);
2243 }
2244 } else if (type == L2CAP_IT_FIXED_CHAN) {
Marcel Holtmann984947d2009-02-06 23:35:19 +01002245 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01002246 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01002247
2248 l2cap_conn_start(conn);
2249 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02002250
Linus Torvalds1da177e2005-04-16 15:20:36 -07002251 return 0;
2252}
2253
2254static inline void l2cap_sig_channel(struct l2cap_conn *conn, struct sk_buff *skb)
2255{
2256 u8 *data = skb->data;
2257 int len = skb->len;
2258 struct l2cap_cmd_hdr cmd;
2259 int err = 0;
2260
2261 l2cap_raw_recv(conn, skb);
2262
2263 while (len >= L2CAP_CMD_HDR_SIZE) {
Al Viro88219a02007-07-29 00:17:25 -07002264 u16 cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002265 memcpy(&cmd, data, L2CAP_CMD_HDR_SIZE);
2266 data += L2CAP_CMD_HDR_SIZE;
2267 len -= L2CAP_CMD_HDR_SIZE;
2268
Al Viro88219a02007-07-29 00:17:25 -07002269 cmd_len = le16_to_cpu(cmd.len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002270
Al Viro88219a02007-07-29 00:17:25 -07002271 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd.code, cmd_len, cmd.ident);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002272
Al Viro88219a02007-07-29 00:17:25 -07002273 if (cmd_len > len || !cmd.ident) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002274 BT_DBG("corrupted command");
2275 break;
2276 }
2277
2278 switch (cmd.code) {
2279 case L2CAP_COMMAND_REJ:
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02002280 l2cap_command_rej(conn, &cmd, data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002281 break;
2282
2283 case L2CAP_CONN_REQ:
2284 err = l2cap_connect_req(conn, &cmd, data);
2285 break;
2286
2287 case L2CAP_CONN_RSP:
2288 err = l2cap_connect_rsp(conn, &cmd, data);
2289 break;
2290
2291 case L2CAP_CONF_REQ:
Al Viro88219a02007-07-29 00:17:25 -07002292 err = l2cap_config_req(conn, &cmd, cmd_len, data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002293 break;
2294
2295 case L2CAP_CONF_RSP:
2296 err = l2cap_config_rsp(conn, &cmd, data);
2297 break;
2298
2299 case L2CAP_DISCONN_REQ:
2300 err = l2cap_disconnect_req(conn, &cmd, data);
2301 break;
2302
2303 case L2CAP_DISCONN_RSP:
2304 err = l2cap_disconnect_rsp(conn, &cmd, data);
2305 break;
2306
2307 case L2CAP_ECHO_REQ:
Al Viro88219a02007-07-29 00:17:25 -07002308 l2cap_send_cmd(conn, cmd.ident, L2CAP_ECHO_RSP, cmd_len, data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002309 break;
2310
2311 case L2CAP_ECHO_RSP:
2312 break;
2313
2314 case L2CAP_INFO_REQ:
2315 err = l2cap_information_req(conn, &cmd, data);
2316 break;
2317
2318 case L2CAP_INFO_RSP:
2319 err = l2cap_information_rsp(conn, &cmd, data);
2320 break;
2321
2322 default:
2323 BT_ERR("Unknown signaling command 0x%2.2x", cmd.code);
2324 err = -EINVAL;
2325 break;
2326 }
2327
2328 if (err) {
2329 struct l2cap_cmd_rej rej;
2330 BT_DBG("error %d", err);
2331
2332 /* FIXME: Map err to a valid reason */
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002333 rej.reason = cpu_to_le16(0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002334 l2cap_send_cmd(conn, cmd.ident, L2CAP_COMMAND_REJ, sizeof(rej), &rej);
2335 }
2336
Al Viro88219a02007-07-29 00:17:25 -07002337 data += cmd_len;
2338 len -= cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002339 }
2340
2341 kfree_skb(skb);
2342}
2343
2344static inline int l2cap_data_channel(struct l2cap_conn *conn, u16 cid, struct sk_buff *skb)
2345{
2346 struct sock *sk;
2347
2348 sk = l2cap_get_chan_by_scid(&conn->chan_list, cid);
2349 if (!sk) {
2350 BT_DBG("unknown cid 0x%4.4x", cid);
2351 goto drop;
2352 }
2353
2354 BT_DBG("sk %p, len %d", sk, skb->len);
2355
2356 if (sk->sk_state != BT_CONNECTED)
2357 goto drop;
2358
2359 if (l2cap_pi(sk)->imtu < skb->len)
2360 goto drop;
2361
2362 /* If socket recv buffers overflows we drop data here
2363 * which is *bad* because L2CAP has to be reliable.
2364 * But we don't have any other choice. L2CAP doesn't
2365 * provide flow control mechanism. */
2366
2367 if (!sock_queue_rcv_skb(sk, skb))
2368 goto done;
2369
2370drop:
2371 kfree_skb(skb);
2372
2373done:
Marcel Holtmann01394182006-07-03 10:02:46 +02002374 if (sk)
2375 bh_unlock_sock(sk);
2376
Linus Torvalds1da177e2005-04-16 15:20:36 -07002377 return 0;
2378}
2379
Al Viro8e036fc2007-07-29 00:16:36 -07002380static inline int l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002381{
2382 struct sock *sk;
2383
2384 sk = l2cap_get_sock_by_psm(0, psm, conn->src);
2385 if (!sk)
2386 goto drop;
2387
2388 BT_DBG("sk %p, len %d", sk, skb->len);
2389
2390 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_CONNECTED)
2391 goto drop;
2392
2393 if (l2cap_pi(sk)->imtu < skb->len)
2394 goto drop;
2395
2396 if (!sock_queue_rcv_skb(sk, skb))
2397 goto done;
2398
2399drop:
2400 kfree_skb(skb);
2401
2402done:
2403 if (sk) bh_unlock_sock(sk);
2404 return 0;
2405}
2406
2407static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb)
2408{
2409 struct l2cap_hdr *lh = (void *) skb->data;
Al Viro8e036fc2007-07-29 00:16:36 -07002410 u16 cid, len;
2411 __le16 psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002412
2413 skb_pull(skb, L2CAP_HDR_SIZE);
2414 cid = __le16_to_cpu(lh->cid);
2415 len = __le16_to_cpu(lh->len);
2416
2417 BT_DBG("len %d, cid 0x%4.4x", len, cid);
2418
2419 switch (cid) {
2420 case 0x0001:
2421 l2cap_sig_channel(conn, skb);
2422 break;
2423
2424 case 0x0002:
Al Viro8e036fc2007-07-29 00:16:36 -07002425 psm = get_unaligned((__le16 *) skb->data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002426 skb_pull(skb, 2);
2427 l2cap_conless_channel(conn, psm, skb);
2428 break;
2429
2430 default:
2431 l2cap_data_channel(conn, cid, skb);
2432 break;
2433 }
2434}
2435
2436/* ---- L2CAP interface with lower layer (HCI) ---- */
2437
2438static int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
2439{
2440 int exact = 0, lm1 = 0, lm2 = 0;
2441 register struct sock *sk;
2442 struct hlist_node *node;
2443
2444 if (type != ACL_LINK)
2445 return 0;
2446
2447 BT_DBG("hdev %s, bdaddr %s", hdev->name, batostr(bdaddr));
2448
2449 /* Find listening sockets and check their link_mode */
2450 read_lock(&l2cap_sk_list.lock);
2451 sk_for_each(sk, node, &l2cap_sk_list.head) {
2452 if (sk->sk_state != BT_LISTEN)
2453 continue;
2454
2455 if (!bacmp(&bt_sk(sk)->src, &hdev->bdaddr)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01002456 lm1 |= HCI_LM_ACCEPT;
2457 if (l2cap_pi(sk)->role_switch)
2458 lm1 |= HCI_LM_MASTER;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002459 exact++;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01002460 } else if (!bacmp(&bt_sk(sk)->src, BDADDR_ANY)) {
2461 lm2 |= HCI_LM_ACCEPT;
2462 if (l2cap_pi(sk)->role_switch)
2463 lm2 |= HCI_LM_MASTER;
2464 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002465 }
2466 read_unlock(&l2cap_sk_list.lock);
2467
2468 return exact ? lm1 : lm2;
2469}
2470
2471static int l2cap_connect_cfm(struct hci_conn *hcon, u8 status)
2472{
Marcel Holtmann01394182006-07-03 10:02:46 +02002473 struct l2cap_conn *conn;
2474
Linus Torvalds1da177e2005-04-16 15:20:36 -07002475 BT_DBG("hcon %p bdaddr %s status %d", hcon, batostr(&hcon->dst), status);
2476
2477 if (hcon->type != ACL_LINK)
2478 return 0;
2479
2480 if (!status) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002481 conn = l2cap_conn_add(hcon, status);
2482 if (conn)
2483 l2cap_conn_ready(conn);
Marcel Holtmann01394182006-07-03 10:02:46 +02002484 } else
Linus Torvalds1da177e2005-04-16 15:20:36 -07002485 l2cap_conn_del(hcon, bt_err(status));
2486
2487 return 0;
2488}
2489
Marcel Holtmann2950f212009-02-12 14:02:50 +01002490static int l2cap_disconn_ind(struct hci_conn *hcon)
2491{
2492 struct l2cap_conn *conn = hcon->l2cap_data;
2493
2494 BT_DBG("hcon %p", hcon);
2495
2496 if (hcon->type != ACL_LINK || !conn)
2497 return 0x13;
2498
2499 return conn->disc_reason;
2500}
2501
2502static int l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002503{
2504 BT_DBG("hcon %p reason %d", hcon, reason);
2505
2506 if (hcon->type != ACL_LINK)
2507 return 0;
2508
2509 l2cap_conn_del(hcon, bt_err(reason));
Marcel Holtmann01394182006-07-03 10:02:46 +02002510
Linus Torvalds1da177e2005-04-16 15:20:36 -07002511 return 0;
2512}
2513
Marcel Holtmannf62e4322009-01-15 21:58:44 +01002514static inline void l2cap_check_encryption(struct sock *sk, u8 encrypt)
2515{
Marcel Holtmann255c7602009-02-04 21:07:19 +01002516 if (sk->sk_type != SOCK_SEQPACKET)
2517 return;
2518
Marcel Holtmannf62e4322009-01-15 21:58:44 +01002519 if (encrypt == 0x00) {
2520 if (l2cap_pi(sk)->sec_level == BT_SECURITY_MEDIUM) {
2521 l2cap_sock_clear_timer(sk);
2522 l2cap_sock_set_timer(sk, HZ * 5);
2523 } else if (l2cap_pi(sk)->sec_level == BT_SECURITY_HIGH)
2524 __l2cap_sock_close(sk, ECONNREFUSED);
2525 } else {
2526 if (l2cap_pi(sk)->sec_level == BT_SECURITY_MEDIUM)
2527 l2cap_sock_clear_timer(sk);
2528 }
2529}
2530
Marcel Holtmann8c1b2352009-01-15 21:58:04 +01002531static int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002532{
2533 struct l2cap_chan_list *l;
Marcel Holtmann40be4922008-07-14 20:13:50 +02002534 struct l2cap_conn *conn = hcon->l2cap_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002535 struct sock *sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002536
Marcel Holtmann01394182006-07-03 10:02:46 +02002537 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002538 return 0;
Marcel Holtmann01394182006-07-03 10:02:46 +02002539
Linus Torvalds1da177e2005-04-16 15:20:36 -07002540 l = &conn->chan_list;
2541
2542 BT_DBG("conn %p", conn);
2543
2544 read_lock(&l->lock);
2545
2546 for (sk = l->head; sk; sk = l2cap_pi(sk)->next_c) {
2547 bh_lock_sock(sk);
2548
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01002549 if (l2cap_pi(sk)->conf_state & L2CAP_CONF_CONNECT_PEND) {
2550 bh_unlock_sock(sk);
2551 continue;
2552 }
2553
Marcel Holtmannf62e4322009-01-15 21:58:44 +01002554 if (!status && (sk->sk_state == BT_CONNECTED ||
Marcel Holtmann8c1b2352009-01-15 21:58:04 +01002555 sk->sk_state == BT_CONFIG)) {
Marcel Holtmannf62e4322009-01-15 21:58:44 +01002556 l2cap_check_encryption(sk, encrypt);
Marcel Holtmann9719f8a2008-07-14 20:13:45 +02002557 bh_unlock_sock(sk);
2558 continue;
2559 }
2560
Marcel Holtmannb1235d72008-07-14 20:13:54 +02002561 if (sk->sk_state == BT_CONNECT) {
2562 if (!status) {
2563 struct l2cap_conn_req req;
2564 req.scid = cpu_to_le16(l2cap_pi(sk)->scid);
2565 req.psm = l2cap_pi(sk)->psm;
2566
2567 l2cap_pi(sk)->ident = l2cap_get_ident(conn);
2568
2569 l2cap_send_cmd(conn, l2cap_pi(sk)->ident,
2570 L2CAP_CONN_REQ, sizeof(req), &req);
2571 } else {
2572 l2cap_sock_clear_timer(sk);
2573 l2cap_sock_set_timer(sk, HZ / 10);
2574 }
2575 } else if (sk->sk_state == BT_CONNECT2) {
2576 struct l2cap_conn_rsp rsp;
2577 __u16 result;
2578
2579 if (!status) {
2580 sk->sk_state = BT_CONFIG;
2581 result = L2CAP_CR_SUCCESS;
2582 } else {
2583 sk->sk_state = BT_DISCONN;
2584 l2cap_sock_set_timer(sk, HZ / 10);
2585 result = L2CAP_CR_SEC_BLOCK;
2586 }
2587
2588 rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid);
2589 rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid);
2590 rsp.result = cpu_to_le16(result);
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02002591 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Marcel Holtmannb1235d72008-07-14 20:13:54 +02002592 l2cap_send_cmd(conn, l2cap_pi(sk)->ident,
2593 L2CAP_CONN_RSP, sizeof(rsp), &rsp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002594 }
2595
Linus Torvalds1da177e2005-04-16 15:20:36 -07002596 bh_unlock_sock(sk);
2597 }
2598
2599 read_unlock(&l->lock);
Marcel Holtmannb1235d72008-07-14 20:13:54 +02002600
Linus Torvalds1da177e2005-04-16 15:20:36 -07002601 return 0;
2602}
2603
2604static int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)
2605{
2606 struct l2cap_conn *conn = hcon->l2cap_data;
2607
2608 if (!conn && !(conn = l2cap_conn_add(hcon, 0)))
2609 goto drop;
2610
2611 BT_DBG("conn %p len %d flags 0x%x", conn, skb->len, flags);
2612
2613 if (flags & ACL_START) {
2614 struct l2cap_hdr *hdr;
2615 int len;
2616
2617 if (conn->rx_len) {
2618 BT_ERR("Unexpected start frame (len %d)", skb->len);
2619 kfree_skb(conn->rx_skb);
2620 conn->rx_skb = NULL;
2621 conn->rx_len = 0;
2622 l2cap_conn_unreliable(conn, ECOMM);
2623 }
2624
2625 if (skb->len < 2) {
2626 BT_ERR("Frame is too short (len %d)", skb->len);
2627 l2cap_conn_unreliable(conn, ECOMM);
2628 goto drop;
2629 }
2630
2631 hdr = (struct l2cap_hdr *) skb->data;
2632 len = __le16_to_cpu(hdr->len) + L2CAP_HDR_SIZE;
2633
2634 if (len == skb->len) {
2635 /* Complete frame received */
2636 l2cap_recv_frame(conn, skb);
2637 return 0;
2638 }
2639
2640 BT_DBG("Start: total len %d, frag len %d", len, skb->len);
2641
2642 if (skb->len > len) {
2643 BT_ERR("Frame is too long (len %d, expected len %d)",
2644 skb->len, len);
2645 l2cap_conn_unreliable(conn, ECOMM);
2646 goto drop;
2647 }
2648
2649 /* Allocate skb for the complete frame (with header) */
2650 if (!(conn->rx_skb = bt_skb_alloc(len, GFP_ATOMIC)))
2651 goto drop;
2652
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03002653 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Marcel Holtmanne1027a72009-02-09 09:18:02 +01002654 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002655 conn->rx_len = len - skb->len;
2656 } else {
2657 BT_DBG("Cont: frag len %d (expecting %d)", skb->len, conn->rx_len);
2658
2659 if (!conn->rx_len) {
2660 BT_ERR("Unexpected continuation frame (len %d)", skb->len);
2661 l2cap_conn_unreliable(conn, ECOMM);
2662 goto drop;
2663 }
2664
2665 if (skb->len > conn->rx_len) {
2666 BT_ERR("Fragment is too long (len %d, expected %d)",
2667 skb->len, conn->rx_len);
2668 kfree_skb(conn->rx_skb);
2669 conn->rx_skb = NULL;
2670 conn->rx_len = 0;
2671 l2cap_conn_unreliable(conn, ECOMM);
2672 goto drop;
2673 }
2674
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03002675 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Marcel Holtmanne1027a72009-02-09 09:18:02 +01002676 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002677 conn->rx_len -= skb->len;
2678
2679 if (!conn->rx_len) {
2680 /* Complete frame received */
2681 l2cap_recv_frame(conn, conn->rx_skb);
2682 conn->rx_skb = NULL;
2683 }
2684 }
2685
2686drop:
2687 kfree_skb(skb);
2688 return 0;
2689}
2690
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002691static ssize_t l2cap_sysfs_show(struct class *dev, char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002692{
2693 struct sock *sk;
2694 struct hlist_node *node;
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002695 char *str = buf;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002696
2697 read_lock_bh(&l2cap_sk_list.lock);
2698
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002699 sk_for_each(sk, node, &l2cap_sk_list.head) {
2700 struct l2cap_pinfo *pi = l2cap_pi(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002701
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01002702 str += sprintf(str, "%s %s %d %d 0x%4.4x 0x%4.4x %d %d %d\n",
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002703 batostr(&bt_sk(sk)->src), batostr(&bt_sk(sk)->dst),
Marcel Holtmann73863972007-01-22 22:00:40 +01002704 sk->sk_state, btohs(pi->psm), pi->scid, pi->dcid,
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01002705 pi->imtu, pi->omtu, pi->sec_level);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002706 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002707
Linus Torvalds1da177e2005-04-16 15:20:36 -07002708 read_unlock_bh(&l2cap_sk_list.lock);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002709
2710 return (str - buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002711}
2712
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002713static CLASS_ATTR(l2cap, S_IRUGO, l2cap_sysfs_show, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002714
Eric Dumazet90ddc4f2005-12-22 12:49:22 -08002715static const struct proto_ops l2cap_sock_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002716 .family = PF_BLUETOOTH,
2717 .owner = THIS_MODULE,
2718 .release = l2cap_sock_release,
2719 .bind = l2cap_sock_bind,
2720 .connect = l2cap_sock_connect,
2721 .listen = l2cap_sock_listen,
2722 .accept = l2cap_sock_accept,
2723 .getname = l2cap_sock_getname,
2724 .sendmsg = l2cap_sock_sendmsg,
Marcel Holtmannf66dc812009-01-15 21:57:00 +01002725 .recvmsg = l2cap_sock_recvmsg,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002726 .poll = bt_sock_poll,
Marcel Holtmann3241ad82008-07-14 20:13:50 +02002727 .ioctl = bt_sock_ioctl,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002728 .mmap = sock_no_mmap,
2729 .socketpair = sock_no_socketpair,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002730 .shutdown = l2cap_sock_shutdown,
2731 .setsockopt = l2cap_sock_setsockopt,
2732 .getsockopt = l2cap_sock_getsockopt
2733};
2734
2735static struct net_proto_family l2cap_sock_family_ops = {
2736 .family = PF_BLUETOOTH,
2737 .owner = THIS_MODULE,
2738 .create = l2cap_sock_create,
2739};
2740
2741static struct hci_proto l2cap_hci_proto = {
2742 .name = "L2CAP",
2743 .id = HCI_PROTO_L2CAP,
2744 .connect_ind = l2cap_connect_ind,
2745 .connect_cfm = l2cap_connect_cfm,
2746 .disconn_ind = l2cap_disconn_ind,
Marcel Holtmann2950f212009-02-12 14:02:50 +01002747 .disconn_cfm = l2cap_disconn_cfm,
Marcel Holtmann8c1b2352009-01-15 21:58:04 +01002748 .security_cfm = l2cap_security_cfm,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002749 .recv_acldata = l2cap_recv_acldata
2750};
2751
2752static int __init l2cap_init(void)
2753{
2754 int err;
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002755
Linus Torvalds1da177e2005-04-16 15:20:36 -07002756 err = proto_register(&l2cap_proto, 0);
2757 if (err < 0)
2758 return err;
2759
2760 err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
2761 if (err < 0) {
2762 BT_ERR("L2CAP socket registration failed");
2763 goto error;
2764 }
2765
2766 err = hci_register_proto(&l2cap_hci_proto);
2767 if (err < 0) {
2768 BT_ERR("L2CAP protocol registration failed");
2769 bt_sock_unregister(BTPROTO_L2CAP);
2770 goto error;
2771 }
2772
Marcel Holtmanndf5c37e2006-10-15 17:30:45 +02002773 if (class_create_file(bt_class, &class_attr_l2cap) < 0)
2774 BT_ERR("Failed to create L2CAP info file");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002775
2776 BT_INFO("L2CAP ver %s", VERSION);
2777 BT_INFO("L2CAP socket layer initialized");
2778
2779 return 0;
2780
2781error:
2782 proto_unregister(&l2cap_proto);
2783 return err;
2784}
2785
2786static void __exit l2cap_exit(void)
2787{
Marcel Holtmanna91f2e32006-07-03 10:02:41 +02002788 class_remove_file(bt_class, &class_attr_l2cap);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002789
2790 if (bt_sock_unregister(BTPROTO_L2CAP) < 0)
2791 BT_ERR("L2CAP socket unregistration failed");
2792
2793 if (hci_unregister_proto(&l2cap_hci_proto) < 0)
2794 BT_ERR("L2CAP protocol unregistration failed");
2795
2796 proto_unregister(&l2cap_proto);
2797}
2798
2799void l2cap_load(void)
2800{
2801 /* Dummy function to trigger automatic L2CAP module loading by
2802 * other modules that use L2CAP sockets but don't use any other
2803 * symbols from it. */
2804 return;
2805}
2806EXPORT_SYMBOL(l2cap_load);
2807
2808module_init(l2cap_init);
2809module_exit(l2cap_exit);
2810
Marcel Holtmann63fbd242008-08-18 13:23:53 +02002811MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002812MODULE_DESCRIPTION("Bluetooth L2CAP ver " VERSION);
2813MODULE_VERSION(VERSION);
2814MODULE_LICENSE("GPL");
2815MODULE_ALIAS("bt-proto-0");