blob: db6fbf129be064bfd96115d8f64731196aa33a96 [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
Marcel Holtmann2a517ca2009-02-16 03:20:31 +0100802 if (la.l2_cid)
803 return -EINVAL;
804
Linus Torvalds1da177e2005-04-16 15:20:36 -0700805 lock_sock(sk);
806
807 if (sk->sk_state != BT_OPEN) {
808 err = -EBADFD;
809 goto done;
810 }
811
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100812 if (la.l2_psm && btohs(la.l2_psm) < 0x1001 &&
Marcel Holtmann847641d2007-01-22 22:00:45 +0100813 !capable(CAP_NET_BIND_SERVICE)) {
814 err = -EACCES;
815 goto done;
816 }
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900817
Linus Torvalds1da177e2005-04-16 15:20:36 -0700818 write_lock_bh(&l2cap_sk_list.lock);
819
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100820 if (la.l2_psm && __l2cap_get_sock_by_addr(la.l2_psm, &la.l2_bdaddr)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700821 err = -EADDRINUSE;
822 } else {
823 /* Save source address */
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100824 bacpy(&bt_sk(sk)->src, &la.l2_bdaddr);
825 l2cap_pi(sk)->psm = la.l2_psm;
826 l2cap_pi(sk)->sport = la.l2_psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700827 sk->sk_state = BT_BOUND;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100828
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100829 if (btohs(la.l2_psm) == 0x0001 || btohs(la.l2_psm) == 0x0003)
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100830 l2cap_pi(sk)->sec_level = BT_SECURITY_SDP;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700831 }
832
833 write_unlock_bh(&l2cap_sk_list.lock);
834
835done:
836 release_sock(sk);
837 return err;
838}
839
840static int l2cap_do_connect(struct sock *sk)
841{
842 bdaddr_t *src = &bt_sk(sk)->src;
843 bdaddr_t *dst = &bt_sk(sk)->dst;
844 struct l2cap_conn *conn;
845 struct hci_conn *hcon;
846 struct hci_dev *hdev;
Marcel Holtmann09ab6f42008-09-09 07:19:20 +0200847 __u8 auth_type;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700848 int err = 0;
849
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100850 BT_DBG("%s -> %s psm 0x%2.2x", batostr(src), batostr(dst),
851 l2cap_pi(sk)->psm);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700852
853 if (!(hdev = hci_get_route(dst, src)))
854 return -EHOSTUNREACH;
855
856 hci_dev_lock_bh(hdev);
857
858 err = -ENOMEM;
859
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100860 if (sk->sk_type == SOCK_RAW) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100861 switch (l2cap_pi(sk)->sec_level) {
862 case BT_SECURITY_HIGH:
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100863 auth_type = HCI_AT_DEDICATED_BONDING_MITM;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100864 break;
865 case BT_SECURITY_MEDIUM:
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100866 auth_type = HCI_AT_DEDICATED_BONDING;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100867 break;
868 default:
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100869 auth_type = HCI_AT_NO_BONDING;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100870 break;
871 }
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100872 } else if (l2cap_pi(sk)->psm == cpu_to_le16(0x0001)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100873 if (l2cap_pi(sk)->sec_level == BT_SECURITY_HIGH)
Marcel Holtmann09ab6f42008-09-09 07:19:20 +0200874 auth_type = HCI_AT_NO_BONDING_MITM;
875 else
Marcel Holtmann09ab6f42008-09-09 07:19:20 +0200876 auth_type = HCI_AT_NO_BONDING;
Marcel Holtmann435fef22009-02-09 03:55:28 +0100877
878 if (l2cap_pi(sk)->sec_level == BT_SECURITY_LOW)
879 l2cap_pi(sk)->sec_level = BT_SECURITY_SDP;
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100880 } else {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100881 switch (l2cap_pi(sk)->sec_level) {
882 case BT_SECURITY_HIGH:
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100883 auth_type = HCI_AT_GENERAL_BONDING_MITM;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100884 break;
885 case BT_SECURITY_MEDIUM:
Marcel Holtmann09ab6f42008-09-09 07:19:20 +0200886 auth_type = HCI_AT_GENERAL_BONDING;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100887 break;
888 default:
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100889 auth_type = HCI_AT_NO_BONDING;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100890 break;
891 }
Marcel Holtmann09ab6f42008-09-09 07:19:20 +0200892 }
893
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100894 hcon = hci_connect(hdev, ACL_LINK, dst,
895 l2cap_pi(sk)->sec_level, auth_type);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700896 if (!hcon)
897 goto done;
898
899 conn = l2cap_conn_add(hcon, 0);
900 if (!conn) {
901 hci_conn_put(hcon);
902 goto done;
903 }
904
905 err = 0;
906
907 /* Update source addr of the socket */
908 bacpy(src, conn->src);
909
910 l2cap_chan_add(conn, sk, NULL);
911
912 sk->sk_state = BT_CONNECT;
913 l2cap_sock_set_timer(sk, sk->sk_sndtimeo);
914
915 if (hcon->state == BT_CONNECTED) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200916 if (sk->sk_type != SOCK_SEQPACKET) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700917 l2cap_sock_clear_timer(sk);
918 sk->sk_state = BT_CONNECTED;
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200919 } else
920 l2cap_do_start(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700921 }
922
923done:
924 hci_dev_unlock_bh(hdev);
925 hci_dev_put(hdev);
926 return err;
927}
928
929static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags)
930{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700931 struct sock *sk = sock->sk;
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100932 struct sockaddr_l2 la;
933 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700934
Linus Torvalds1da177e2005-04-16 15:20:36 -0700935 BT_DBG("sk %p", sk);
936
Marcel Holtmann2a517ca2009-02-16 03:20:31 +0100937 if (!addr || addr->sa_family != AF_BLUETOOTH)
938 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700939
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100940 memset(&la, 0, sizeof(la));
941 len = min_t(unsigned int, sizeof(la), alen);
942 memcpy(&la, addr, len);
943
Marcel Holtmann2a517ca2009-02-16 03:20:31 +0100944 if (la.l2_cid)
945 return -EINVAL;
946
947 lock_sock(sk);
948
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100949 if (sk->sk_type == SOCK_SEQPACKET && !la.l2_psm) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700950 err = -EINVAL;
951 goto done;
952 }
953
954 switch(sk->sk_state) {
955 case BT_CONNECT:
956 case BT_CONNECT2:
957 case BT_CONFIG:
958 /* Already connecting */
959 goto wait;
960
961 case BT_CONNECTED:
962 /* Already connected */
963 goto done;
964
965 case BT_OPEN:
966 case BT_BOUND:
967 /* Can connect */
968 break;
969
970 default:
971 err = -EBADFD;
972 goto done;
973 }
974
975 /* Set destination address and psm */
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100976 bacpy(&bt_sk(sk)->dst, &la.l2_bdaddr);
977 l2cap_pi(sk)->psm = la.l2_psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700978
979 if ((err = l2cap_do_connect(sk)))
980 goto done;
981
982wait:
983 err = bt_sock_wait_state(sk, BT_CONNECTED,
984 sock_sndtimeo(sk, flags & O_NONBLOCK));
985done:
986 release_sock(sk);
987 return err;
988}
989
990static int l2cap_sock_listen(struct socket *sock, int backlog)
991{
992 struct sock *sk = sock->sk;
993 int err = 0;
994
995 BT_DBG("sk %p backlog %d", sk, backlog);
996
997 lock_sock(sk);
998
999 if (sk->sk_state != BT_BOUND || sock->type != SOCK_SEQPACKET) {
1000 err = -EBADFD;
1001 goto done;
1002 }
1003
1004 if (!l2cap_pi(sk)->psm) {
1005 bdaddr_t *src = &bt_sk(sk)->src;
1006 u16 psm;
1007
1008 err = -EINVAL;
1009
1010 write_lock_bh(&l2cap_sk_list.lock);
1011
1012 for (psm = 0x1001; psm < 0x1100; psm += 2)
Al Viro6dc0c202007-07-29 00:15:18 -07001013 if (!__l2cap_get_sock_by_addr(htobs(psm), src)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001014 l2cap_pi(sk)->psm = htobs(psm);
1015 l2cap_pi(sk)->sport = htobs(psm);
1016 err = 0;
1017 break;
1018 }
1019
1020 write_unlock_bh(&l2cap_sk_list.lock);
1021
1022 if (err < 0)
1023 goto done;
1024 }
1025
1026 sk->sk_max_ack_backlog = backlog;
1027 sk->sk_ack_backlog = 0;
1028 sk->sk_state = BT_LISTEN;
1029
1030done:
1031 release_sock(sk);
1032 return err;
1033}
1034
1035static int l2cap_sock_accept(struct socket *sock, struct socket *newsock, int flags)
1036{
1037 DECLARE_WAITQUEUE(wait, current);
1038 struct sock *sk = sock->sk, *nsk;
1039 long timeo;
1040 int err = 0;
1041
Peter Zijlstrafcc70d52006-11-08 22:44:35 -08001042 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001043
1044 if (sk->sk_state != BT_LISTEN) {
1045 err = -EBADFD;
1046 goto done;
1047 }
1048
1049 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
1050
1051 BT_DBG("sk %p timeo %ld", sk, timeo);
1052
1053 /* Wait for an incoming connection. (wake-one). */
1054 add_wait_queue_exclusive(sk->sk_sleep, &wait);
1055 while (!(nsk = bt_accept_dequeue(sk, newsock))) {
1056 set_current_state(TASK_INTERRUPTIBLE);
1057 if (!timeo) {
1058 err = -EAGAIN;
1059 break;
1060 }
1061
1062 release_sock(sk);
1063 timeo = schedule_timeout(timeo);
Peter Zijlstrafcc70d52006-11-08 22:44:35 -08001064 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001065
1066 if (sk->sk_state != BT_LISTEN) {
1067 err = -EBADFD;
1068 break;
1069 }
1070
1071 if (signal_pending(current)) {
1072 err = sock_intr_errno(timeo);
1073 break;
1074 }
1075 }
1076 set_current_state(TASK_RUNNING);
1077 remove_wait_queue(sk->sk_sleep, &wait);
1078
1079 if (err)
1080 goto done;
1081
1082 newsock->state = SS_CONNECTED;
1083
1084 BT_DBG("new socket %p", nsk);
1085
1086done:
1087 release_sock(sk);
1088 return err;
1089}
1090
1091static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr, int *len, int peer)
1092{
1093 struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr;
1094 struct sock *sk = sock->sk;
1095
1096 BT_DBG("sock %p, sk %p", sock, sk);
1097
1098 addr->sa_family = AF_BLUETOOTH;
1099 *len = sizeof(struct sockaddr_l2);
1100
Marcel Holtmannf29972d2009-02-12 05:07:45 +01001101 if (peer) {
1102 la->l2_psm = l2cap_pi(sk)->psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001103 bacpy(&la->l2_bdaddr, &bt_sk(sk)->dst);
Marcel Holtmannf29972d2009-02-12 05:07:45 +01001104 la->l2_cid = htobs(l2cap_pi(sk)->dcid);
1105 } else {
1106 la->l2_psm = l2cap_pi(sk)->sport;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001107 bacpy(&la->l2_bdaddr, &bt_sk(sk)->src);
Marcel Holtmannf29972d2009-02-12 05:07:45 +01001108 la->l2_cid = htobs(l2cap_pi(sk)->scid);
1109 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001110
Linus Torvalds1da177e2005-04-16 15:20:36 -07001111 return 0;
1112}
1113
1114static inline int l2cap_do_send(struct sock *sk, struct msghdr *msg, int len)
1115{
1116 struct l2cap_conn *conn = l2cap_pi(sk)->conn;
1117 struct sk_buff *skb, **frag;
1118 int err, hlen, count, sent=0;
1119 struct l2cap_hdr *lh;
1120
1121 BT_DBG("sk %p len %d", sk, len);
1122
1123 /* First fragment (with L2CAP header) */
1124 if (sk->sk_type == SOCK_DGRAM)
1125 hlen = L2CAP_HDR_SIZE + 2;
1126 else
1127 hlen = L2CAP_HDR_SIZE;
1128
1129 count = min_t(unsigned int, (conn->mtu - hlen), len);
1130
1131 skb = bt_skb_send_alloc(sk, hlen + count,
1132 msg->msg_flags & MSG_DONTWAIT, &err);
1133 if (!skb)
1134 return err;
1135
1136 /* Create L2CAP header */
1137 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07001138 lh->cid = cpu_to_le16(l2cap_pi(sk)->dcid);
1139 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001140
1141 if (sk->sk_type == SOCK_DGRAM)
Al Viro8e036fc2007-07-29 00:16:36 -07001142 put_unaligned(l2cap_pi(sk)->psm, (__le16 *) skb_put(skb, 2));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001143
1144 if (memcpy_fromiovec(skb_put(skb, count), msg->msg_iov, count)) {
1145 err = -EFAULT;
1146 goto fail;
1147 }
1148
1149 sent += count;
1150 len -= count;
1151
1152 /* Continuation fragments (no L2CAP header) */
1153 frag = &skb_shinfo(skb)->frag_list;
1154 while (len) {
1155 count = min_t(unsigned int, conn->mtu, len);
1156
1157 *frag = bt_skb_send_alloc(sk, count, msg->msg_flags & MSG_DONTWAIT, &err);
1158 if (!*frag)
1159 goto fail;
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001160
Linus Torvalds1da177e2005-04-16 15:20:36 -07001161 if (memcpy_fromiovec(skb_put(*frag, count), msg->msg_iov, count)) {
1162 err = -EFAULT;
1163 goto fail;
1164 }
1165
1166 sent += count;
1167 len -= count;
1168
1169 frag = &(*frag)->next;
1170 }
1171
1172 if ((err = hci_send_acl(conn->hcon, skb, 0)) < 0)
1173 goto fail;
1174
1175 return sent;
1176
1177fail:
1178 kfree_skb(skb);
1179 return err;
1180}
1181
1182static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len)
1183{
1184 struct sock *sk = sock->sk;
1185 int err = 0;
1186
1187 BT_DBG("sock %p, sk %p", sock, sk);
1188
Benjamin LaHaisec1cbe4b2005-12-13 23:22:19 -08001189 err = sock_error(sk);
1190 if (err)
1191 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001192
1193 if (msg->msg_flags & MSG_OOB)
1194 return -EOPNOTSUPP;
1195
1196 /* Check outgoing MTU */
1197 if (sk->sk_type != SOCK_RAW && len > l2cap_pi(sk)->omtu)
1198 return -EINVAL;
1199
1200 lock_sock(sk);
1201
1202 if (sk->sk_state == BT_CONNECTED)
1203 err = l2cap_do_send(sk, msg, len);
1204 else
1205 err = -ENOTCONN;
1206
1207 release_sock(sk);
1208 return err;
1209}
1210
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001211static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len, int flags)
1212{
1213 struct sock *sk = sock->sk;
1214
1215 lock_sock(sk);
1216
1217 if (sk->sk_state == BT_CONNECT2 && bt_sk(sk)->defer_setup) {
1218 struct l2cap_conn_rsp rsp;
1219
1220 sk->sk_state = BT_CONFIG;
1221
1222 rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid);
1223 rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid);
1224 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
1225 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
1226 l2cap_send_cmd(l2cap_pi(sk)->conn, l2cap_pi(sk)->ident,
1227 L2CAP_CONN_RSP, sizeof(rsp), &rsp);
1228
1229 release_sock(sk);
1230 return 0;
1231 }
1232
1233 release_sock(sk);
1234
1235 return bt_sock_recvmsg(iocb, sock, msg, len, flags);
1236}
1237
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001238static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __user *optval, int optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001239{
1240 struct sock *sk = sock->sk;
1241 struct l2cap_options opts;
Marcel Holtmannf29972d2009-02-12 05:07:45 +01001242 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001243 u32 opt;
1244
1245 BT_DBG("sk %p", sk);
1246
1247 lock_sock(sk);
1248
1249 switch (optname) {
1250 case L2CAP_OPTIONS:
Marcel Holtmann0878b662007-05-05 00:35:59 +02001251 opts.imtu = l2cap_pi(sk)->imtu;
1252 opts.omtu = l2cap_pi(sk)->omtu;
1253 opts.flush_to = l2cap_pi(sk)->flush_to;
Marcel Holtmann6464f352007-10-20 13:39:51 +02001254 opts.mode = L2CAP_MODE_BASIC;
Marcel Holtmann0878b662007-05-05 00:35:59 +02001255
Linus Torvalds1da177e2005-04-16 15:20:36 -07001256 len = min_t(unsigned int, sizeof(opts), optlen);
1257 if (copy_from_user((char *) &opts, optval, len)) {
1258 err = -EFAULT;
1259 break;
1260 }
Marcel Holtmann0878b662007-05-05 00:35:59 +02001261
Linus Torvalds1da177e2005-04-16 15:20:36 -07001262 l2cap_pi(sk)->imtu = opts.imtu;
1263 l2cap_pi(sk)->omtu = opts.omtu;
1264 break;
1265
1266 case L2CAP_LM:
1267 if (get_user(opt, (u32 __user *) optval)) {
1268 err = -EFAULT;
1269 break;
1270 }
1271
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001272 if (opt & L2CAP_LM_AUTH)
1273 l2cap_pi(sk)->sec_level = BT_SECURITY_LOW;
1274 if (opt & L2CAP_LM_ENCRYPT)
1275 l2cap_pi(sk)->sec_level = BT_SECURITY_MEDIUM;
1276 if (opt & L2CAP_LM_SECURE)
1277 l2cap_pi(sk)->sec_level = BT_SECURITY_HIGH;
1278
1279 l2cap_pi(sk)->role_switch = (opt & L2CAP_LM_MASTER);
1280 l2cap_pi(sk)->force_reliable = (opt & L2CAP_LM_RELIABLE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001281 break;
1282
1283 default:
1284 err = -ENOPROTOOPT;
1285 break;
1286 }
1287
1288 release_sock(sk);
1289 return err;
1290}
1291
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001292static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, int optlen)
1293{
1294 struct sock *sk = sock->sk;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001295 struct bt_security sec;
1296 int len, err = 0;
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001297 u32 opt;
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001298
1299 BT_DBG("sk %p", sk);
1300
1301 if (level == SOL_L2CAP)
1302 return l2cap_sock_setsockopt_old(sock, optname, optval, optlen);
1303
Marcel Holtmann0588d942009-01-16 10:06:13 +01001304 if (level != SOL_BLUETOOTH)
1305 return -ENOPROTOOPT;
1306
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001307 lock_sock(sk);
1308
1309 switch (optname) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001310 case BT_SECURITY:
Marcel Holtmann2526d3d2009-02-20 20:54:06 +01001311 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_RAW) {
Marcel Holtmann0588d942009-01-16 10:06:13 +01001312 err = -EINVAL;
1313 break;
1314 }
1315
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001316 sec.level = BT_SECURITY_LOW;
1317
1318 len = min_t(unsigned int, sizeof(sec), optlen);
1319 if (copy_from_user((char *) &sec, optval, len)) {
1320 err = -EFAULT;
1321 break;
1322 }
1323
1324 if (sec.level < BT_SECURITY_LOW ||
1325 sec.level > BT_SECURITY_HIGH) {
1326 err = -EINVAL;
1327 break;
1328 }
1329
1330 l2cap_pi(sk)->sec_level = sec.level;
1331 break;
1332
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001333 case BT_DEFER_SETUP:
1334 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
1335 err = -EINVAL;
1336 break;
1337 }
1338
1339 if (get_user(opt, (u32 __user *) optval)) {
1340 err = -EFAULT;
1341 break;
1342 }
1343
1344 bt_sk(sk)->defer_setup = opt;
1345 break;
1346
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001347 default:
1348 err = -ENOPROTOOPT;
1349 break;
1350 }
1351
1352 release_sock(sk);
1353 return err;
1354}
1355
1356static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, char __user *optval, int __user *optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001357{
1358 struct sock *sk = sock->sk;
1359 struct l2cap_options opts;
1360 struct l2cap_conninfo cinfo;
1361 int len, err = 0;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001362 u32 opt;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001363
1364 BT_DBG("sk %p", sk);
1365
1366 if (get_user(len, optlen))
1367 return -EFAULT;
1368
1369 lock_sock(sk);
1370
1371 switch (optname) {
1372 case L2CAP_OPTIONS:
1373 opts.imtu = l2cap_pi(sk)->imtu;
1374 opts.omtu = l2cap_pi(sk)->omtu;
1375 opts.flush_to = l2cap_pi(sk)->flush_to;
Marcel Holtmann6464f352007-10-20 13:39:51 +02001376 opts.mode = L2CAP_MODE_BASIC;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001377
1378 len = min_t(unsigned int, len, sizeof(opts));
1379 if (copy_to_user(optval, (char *) &opts, len))
1380 err = -EFAULT;
1381
1382 break;
1383
1384 case L2CAP_LM:
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001385 switch (l2cap_pi(sk)->sec_level) {
1386 case BT_SECURITY_LOW:
1387 opt = L2CAP_LM_AUTH;
1388 break;
1389 case BT_SECURITY_MEDIUM:
1390 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT;
1391 break;
1392 case BT_SECURITY_HIGH:
1393 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
1394 L2CAP_LM_SECURE;
1395 break;
1396 default:
1397 opt = 0;
1398 break;
1399 }
1400
1401 if (l2cap_pi(sk)->role_switch)
1402 opt |= L2CAP_LM_MASTER;
1403
1404 if (l2cap_pi(sk)->force_reliable)
1405 opt |= L2CAP_LM_RELIABLE;
1406
1407 if (put_user(opt, (u32 __user *) optval))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001408 err = -EFAULT;
1409 break;
1410
1411 case L2CAP_CONNINFO:
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001412 if (sk->sk_state != BT_CONNECTED &&
1413 !(sk->sk_state == BT_CONNECT2 &&
1414 bt_sk(sk)->defer_setup)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001415 err = -ENOTCONN;
1416 break;
1417 }
1418
1419 cinfo.hci_handle = l2cap_pi(sk)->conn->hcon->handle;
1420 memcpy(cinfo.dev_class, l2cap_pi(sk)->conn->hcon->dev_class, 3);
1421
1422 len = min_t(unsigned int, len, sizeof(cinfo));
1423 if (copy_to_user(optval, (char *) &cinfo, len))
1424 err = -EFAULT;
1425
1426 break;
1427
1428 default:
1429 err = -ENOPROTOOPT;
1430 break;
1431 }
1432
1433 release_sock(sk);
1434 return err;
1435}
1436
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001437static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen)
1438{
1439 struct sock *sk = sock->sk;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001440 struct bt_security sec;
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001441 int len, err = 0;
1442
1443 BT_DBG("sk %p", sk);
1444
1445 if (level == SOL_L2CAP)
1446 return l2cap_sock_getsockopt_old(sock, optname, optval, optlen);
1447
Marcel Holtmann0588d942009-01-16 10:06:13 +01001448 if (level != SOL_BLUETOOTH)
1449 return -ENOPROTOOPT;
1450
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001451 if (get_user(len, optlen))
1452 return -EFAULT;
1453
1454 lock_sock(sk);
1455
1456 switch (optname) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001457 case BT_SECURITY:
Marcel Holtmann2526d3d2009-02-20 20:54:06 +01001458 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_RAW) {
Marcel Holtmann0588d942009-01-16 10:06:13 +01001459 err = -EINVAL;
1460 break;
1461 }
1462
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001463 sec.level = l2cap_pi(sk)->sec_level;
1464
1465 len = min_t(unsigned int, len, sizeof(sec));
1466 if (copy_to_user(optval, (char *) &sec, len))
1467 err = -EFAULT;
1468
1469 break;
1470
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001471 case BT_DEFER_SETUP:
1472 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
1473 err = -EINVAL;
1474 break;
1475 }
1476
1477 if (put_user(bt_sk(sk)->defer_setup, (u32 __user *) optval))
1478 err = -EFAULT;
1479
1480 break;
1481
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001482 default:
1483 err = -ENOPROTOOPT;
1484 break;
1485 }
1486
1487 release_sock(sk);
1488 return err;
1489}
1490
Linus Torvalds1da177e2005-04-16 15:20:36 -07001491static int l2cap_sock_shutdown(struct socket *sock, int how)
1492{
1493 struct sock *sk = sock->sk;
1494 int err = 0;
1495
1496 BT_DBG("sock %p, sk %p", sock, sk);
1497
1498 if (!sk)
1499 return 0;
1500
1501 lock_sock(sk);
1502 if (!sk->sk_shutdown) {
1503 sk->sk_shutdown = SHUTDOWN_MASK;
1504 l2cap_sock_clear_timer(sk);
1505 __l2cap_sock_close(sk, 0);
1506
1507 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime)
Marcel Holtmannb1235d72008-07-14 20:13:54 +02001508 err = bt_sock_wait_state(sk, BT_CLOSED,
1509 sk->sk_lingertime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001510 }
1511 release_sock(sk);
1512 return err;
1513}
1514
1515static int l2cap_sock_release(struct socket *sock)
1516{
1517 struct sock *sk = sock->sk;
1518 int err;
1519
1520 BT_DBG("sock %p, sk %p", sock, sk);
1521
1522 if (!sk)
1523 return 0;
1524
1525 err = l2cap_sock_shutdown(sock, 2);
1526
1527 sock_orphan(sk);
1528 l2cap_sock_kill(sk);
1529 return err;
1530}
1531
Linus Torvalds1da177e2005-04-16 15:20:36 -07001532static void l2cap_chan_ready(struct sock *sk)
1533{
1534 struct sock *parent = bt_sk(sk)->parent;
1535
1536 BT_DBG("sk %p, parent %p", sk, parent);
1537
1538 l2cap_pi(sk)->conf_state = 0;
1539 l2cap_sock_clear_timer(sk);
1540
1541 if (!parent) {
1542 /* Outgoing channel.
1543 * Wake up socket sleeping on connect.
1544 */
1545 sk->sk_state = BT_CONNECTED;
1546 sk->sk_state_change(sk);
1547 } else {
1548 /* Incoming channel.
1549 * Wake up socket sleeping on accept.
1550 */
1551 parent->sk_data_ready(parent, 0);
1552 }
1553}
1554
1555/* Copy frame to all raw sockets on that connection */
1556static void l2cap_raw_recv(struct l2cap_conn *conn, struct sk_buff *skb)
1557{
1558 struct l2cap_chan_list *l = &conn->chan_list;
1559 struct sk_buff *nskb;
1560 struct sock * sk;
1561
1562 BT_DBG("conn %p", conn);
1563
1564 read_lock(&l->lock);
1565 for (sk = l->head; sk; sk = l2cap_pi(sk)->next_c) {
1566 if (sk->sk_type != SOCK_RAW)
1567 continue;
1568
1569 /* Don't send frame to the socket it came from */
1570 if (skb->sk == sk)
1571 continue;
1572
1573 if (!(nskb = skb_clone(skb, GFP_ATOMIC)))
1574 continue;
1575
1576 if (sock_queue_rcv_skb(sk, nskb))
1577 kfree_skb(nskb);
1578 }
1579 read_unlock(&l->lock);
1580}
1581
1582/* ---- L2CAP signalling commands ---- */
1583static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn,
1584 u8 code, u8 ident, u16 dlen, void *data)
1585{
1586 struct sk_buff *skb, **frag;
1587 struct l2cap_cmd_hdr *cmd;
1588 struct l2cap_hdr *lh;
1589 int len, count;
1590
1591 BT_DBG("conn %p, code 0x%2.2x, ident 0x%2.2x, len %d", conn, code, ident, dlen);
1592
1593 len = L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE + dlen;
1594 count = min_t(unsigned int, conn->mtu, len);
1595
1596 skb = bt_skb_alloc(count, GFP_ATOMIC);
1597 if (!skb)
1598 return NULL;
1599
1600 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07001601 lh->len = cpu_to_le16(L2CAP_CMD_HDR_SIZE + dlen);
1602 lh->cid = cpu_to_le16(0x0001);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001603
1604 cmd = (struct l2cap_cmd_hdr *) skb_put(skb, L2CAP_CMD_HDR_SIZE);
1605 cmd->code = code;
1606 cmd->ident = ident;
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07001607 cmd->len = cpu_to_le16(dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001608
1609 if (dlen) {
1610 count -= L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE;
1611 memcpy(skb_put(skb, count), data, count);
1612 data += count;
1613 }
1614
1615 len -= skb->len;
1616
1617 /* Continuation fragments (no L2CAP header) */
1618 frag = &skb_shinfo(skb)->frag_list;
1619 while (len) {
1620 count = min_t(unsigned int, conn->mtu, len);
1621
1622 *frag = bt_skb_alloc(count, GFP_ATOMIC);
1623 if (!*frag)
1624 goto fail;
1625
1626 memcpy(skb_put(*frag, count), data, count);
1627
1628 len -= count;
1629 data += count;
1630
1631 frag = &(*frag)->next;
1632 }
1633
1634 return skb;
1635
1636fail:
1637 kfree_skb(skb);
1638 return NULL;
1639}
1640
1641static inline int l2cap_get_conf_opt(void **ptr, int *type, int *olen, unsigned long *val)
1642{
1643 struct l2cap_conf_opt *opt = *ptr;
1644 int len;
1645
1646 len = L2CAP_CONF_OPT_SIZE + opt->len;
1647 *ptr += len;
1648
1649 *type = opt->type;
1650 *olen = opt->len;
1651
1652 switch (opt->len) {
1653 case 1:
1654 *val = *((u8 *) opt->val);
1655 break;
1656
1657 case 2:
Marcel Holtmann861d6882007-10-20 13:37:06 +02001658 *val = __le16_to_cpu(*((__le16 *) opt->val));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001659 break;
1660
1661 case 4:
Marcel Holtmann861d6882007-10-20 13:37:06 +02001662 *val = __le32_to_cpu(*((__le32 *) opt->val));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001663 break;
1664
1665 default:
1666 *val = (unsigned long) opt->val;
1667 break;
1668 }
1669
1670 BT_DBG("type 0x%2.2x len %d val 0x%lx", *type, opt->len, *val);
1671 return len;
1672}
1673
Linus Torvalds1da177e2005-04-16 15:20:36 -07001674static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val)
1675{
1676 struct l2cap_conf_opt *opt = *ptr;
1677
1678 BT_DBG("type 0x%2.2x len %d val 0x%lx", type, len, val);
1679
1680 opt->type = type;
1681 opt->len = len;
1682
1683 switch (len) {
1684 case 1:
1685 *((u8 *) opt->val) = val;
1686 break;
1687
1688 case 2:
Al Viro8e036fc2007-07-29 00:16:36 -07001689 *((__le16 *) opt->val) = cpu_to_le16(val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001690 break;
1691
1692 case 4:
Al Viro8e036fc2007-07-29 00:16:36 -07001693 *((__le32 *) opt->val) = cpu_to_le32(val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001694 break;
1695
1696 default:
1697 memcpy(opt->val, (void *) val, len);
1698 break;
1699 }
1700
1701 *ptr += L2CAP_CONF_OPT_SIZE + len;
1702}
1703
1704static int l2cap_build_conf_req(struct sock *sk, void *data)
1705{
1706 struct l2cap_pinfo *pi = l2cap_pi(sk);
1707 struct l2cap_conf_req *req = data;
1708 void *ptr = req->data;
1709
1710 BT_DBG("sk %p", sk);
1711
1712 if (pi->imtu != L2CAP_DEFAULT_MTU)
1713 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, pi->imtu);
1714
1715 /* FIXME: Need actual value of the flush timeout */
1716 //if (flush_to != L2CAP_DEFAULT_FLUSH_TO)
1717 // l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO, 2, pi->flush_to);
1718
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07001719 req->dcid = cpu_to_le16(pi->dcid);
1720 req->flags = cpu_to_le16(0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001721
1722 return ptr - data;
1723}
1724
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001725static int l2cap_parse_conf_req(struct sock *sk, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001726{
1727 struct l2cap_pinfo *pi = l2cap_pi(sk);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001728 struct l2cap_conf_rsp *rsp = data;
1729 void *ptr = rsp->data;
1730 void *req = pi->conf_req;
1731 int len = pi->conf_len;
1732 int type, hint, olen;
1733 unsigned long val;
Marcel Holtmann6464f352007-10-20 13:39:51 +02001734 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Marcel Holtmann861d6882007-10-20 13:37:06 +02001735 u16 mtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001736 u16 result = L2CAP_CONF_SUCCESS;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001737
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001738 BT_DBG("sk %p", sk);
Marcel Holtmann820ae1b2006-11-18 22:15:00 +01001739
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001740 while (len >= L2CAP_CONF_OPT_SIZE) {
1741 len -= l2cap_get_conf_opt(&req, &type, &olen, &val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001742
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001743 hint = type & 0x80;
1744 type &= 0x7f;
1745
1746 switch (type) {
1747 case L2CAP_CONF_MTU:
Marcel Holtmann861d6882007-10-20 13:37:06 +02001748 mtu = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001749 break;
1750
1751 case L2CAP_CONF_FLUSH_TO:
1752 pi->flush_to = val;
1753 break;
1754
1755 case L2CAP_CONF_QOS:
1756 break;
1757
Marcel Holtmann6464f352007-10-20 13:39:51 +02001758 case L2CAP_CONF_RFC:
1759 if (olen == sizeof(rfc))
1760 memcpy(&rfc, (void *) val, olen);
1761 break;
1762
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001763 default:
1764 if (hint)
1765 break;
1766
1767 result = L2CAP_CONF_UNKNOWN;
1768 *((u8 *) ptr++) = type;
1769 break;
1770 }
1771 }
1772
1773 if (result == L2CAP_CONF_SUCCESS) {
1774 /* Configure output options and let the other side know
1775 * which ones we don't like. */
1776
Marcel Holtmann6464f352007-10-20 13:39:51 +02001777 if (rfc.mode == L2CAP_MODE_BASIC) {
1778 if (mtu < pi->omtu)
1779 result = L2CAP_CONF_UNACCEPT;
1780 else {
1781 pi->omtu = mtu;
1782 pi->conf_state |= L2CAP_CONF_OUTPUT_DONE;
1783 }
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001784
Marcel Holtmann6464f352007-10-20 13:39:51 +02001785 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, pi->omtu);
1786 } else {
1787 result = L2CAP_CONF_UNACCEPT;
1788
1789 memset(&rfc, 0, sizeof(rfc));
1790 rfc.mode = L2CAP_MODE_BASIC;
1791
1792 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
1793 sizeof(rfc), (unsigned long) &rfc);
1794 }
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001795 }
1796
1797 rsp->scid = cpu_to_le16(pi->dcid);
1798 rsp->result = cpu_to_le16(result);
1799 rsp->flags = cpu_to_le16(0x0000);
1800
1801 return ptr - data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001802}
1803
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001804static int l2cap_build_conf_rsp(struct sock *sk, void *data, u16 result, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001805{
1806 struct l2cap_conf_rsp *rsp = data;
1807 void *ptr = rsp->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001808
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001809 BT_DBG("sk %p", sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001810
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07001811 rsp->scid = cpu_to_le16(l2cap_pi(sk)->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001812 rsp->result = cpu_to_le16(result);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07001813 rsp->flags = cpu_to_le16(flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001814
1815 return ptr - data;
1816}
1817
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001818static inline int l2cap_command_rej(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
1819{
1820 struct l2cap_cmd_rej *rej = (struct l2cap_cmd_rej *) data;
1821
1822 if (rej->reason != 0x0000)
1823 return 0;
1824
1825 if ((conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) &&
1826 cmd->ident == conn->info_ident) {
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001827 del_timer(&conn->info_timer);
Marcel Holtmann984947d2009-02-06 23:35:19 +01001828
1829 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01001830 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01001831
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001832 l2cap_conn_start(conn);
1833 }
1834
1835 return 0;
1836}
1837
Linus Torvalds1da177e2005-04-16 15:20:36 -07001838static inline int l2cap_connect_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
1839{
1840 struct l2cap_chan_list *list = &conn->chan_list;
1841 struct l2cap_conn_req *req = (struct l2cap_conn_req *) data;
1842 struct l2cap_conn_rsp rsp;
1843 struct sock *sk, *parent;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02001844 int result, status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001845
1846 u16 dcid = 0, scid = __le16_to_cpu(req->scid);
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02001847 __le16 psm = req->psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001848
1849 BT_DBG("psm 0x%2.2x scid 0x%4.4x", psm, scid);
1850
1851 /* Check if we have socket listening on psm */
1852 parent = l2cap_get_sock_by_psm(BT_LISTEN, psm, conn->src);
1853 if (!parent) {
1854 result = L2CAP_CR_BAD_PSM;
1855 goto sendresp;
1856 }
1857
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02001858 /* Check if the ACL is secure enough (if not SDP) */
1859 if (psm != cpu_to_le16(0x0001) &&
1860 !hci_conn_check_link_mode(conn->hcon)) {
Marcel Holtmann2950f212009-02-12 14:02:50 +01001861 conn->disc_reason = 0x05;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02001862 result = L2CAP_CR_SEC_BLOCK;
1863 goto response;
1864 }
1865
Linus Torvalds1da177e2005-04-16 15:20:36 -07001866 result = L2CAP_CR_NO_MEM;
1867
1868 /* Check for backlog size */
1869 if (sk_acceptq_is_full(parent)) {
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001870 BT_DBG("backlog full %d", parent->sk_ack_backlog);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001871 goto response;
1872 }
1873
YOSHIFUJI Hideaki3b1e0a62008-03-26 02:26:21 +09001874 sk = l2cap_sock_alloc(sock_net(parent), NULL, BTPROTO_L2CAP, GFP_ATOMIC);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001875 if (!sk)
1876 goto response;
1877
Marcel Holtmannfd1278d2006-07-12 23:00:07 +02001878 write_lock_bh(&list->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001879
1880 /* Check if we already have channel with that dcid */
1881 if (__l2cap_get_chan_by_dcid(list, scid)) {
Marcel Holtmannfd1278d2006-07-12 23:00:07 +02001882 write_unlock_bh(&list->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001883 sock_set_flag(sk, SOCK_ZAPPED);
1884 l2cap_sock_kill(sk);
1885 goto response;
1886 }
1887
1888 hci_conn_hold(conn->hcon);
1889
1890 l2cap_sock_init(sk, parent);
1891 bacpy(&bt_sk(sk)->src, conn->src);
1892 bacpy(&bt_sk(sk)->dst, conn->dst);
1893 l2cap_pi(sk)->psm = psm;
1894 l2cap_pi(sk)->dcid = scid;
1895
1896 __l2cap_chan_add(conn, sk, parent);
1897 dcid = l2cap_pi(sk)->scid;
1898
1899 l2cap_sock_set_timer(sk, sk->sk_sndtimeo);
1900
Linus Torvalds1da177e2005-04-16 15:20:36 -07001901 l2cap_pi(sk)->ident = cmd->ident;
1902
Marcel Holtmann984947d2009-02-06 23:35:19 +01001903 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001904 if (l2cap_check_security(sk)) {
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001905 if (bt_sk(sk)->defer_setup) {
1906 sk->sk_state = BT_CONNECT2;
1907 result = L2CAP_CR_PEND;
1908 status = L2CAP_CS_AUTHOR_PEND;
1909 parent->sk_data_ready(parent, 0);
1910 } else {
1911 sk->sk_state = BT_CONFIG;
1912 result = L2CAP_CR_SUCCESS;
1913 status = L2CAP_CS_NO_INFO;
1914 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001915 } else {
1916 sk->sk_state = BT_CONNECT2;
1917 result = L2CAP_CR_PEND;
1918 status = L2CAP_CS_AUTHEN_PEND;
1919 }
1920 } else {
1921 sk->sk_state = BT_CONNECT2;
1922 result = L2CAP_CR_PEND;
1923 status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001924 }
1925
Marcel Holtmannfd1278d2006-07-12 23:00:07 +02001926 write_unlock_bh(&list->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001927
1928response:
1929 bh_unlock_sock(parent);
1930
1931sendresp:
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07001932 rsp.scid = cpu_to_le16(scid);
1933 rsp.dcid = cpu_to_le16(dcid);
1934 rsp.result = cpu_to_le16(result);
1935 rsp.status = cpu_to_le16(status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001936 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONN_RSP, sizeof(rsp), &rsp);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001937
1938 if (result == L2CAP_CR_PEND && status == L2CAP_CS_NO_INFO) {
1939 struct l2cap_info_req info;
1940 info.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
1941
1942 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
1943 conn->info_ident = l2cap_get_ident(conn);
1944
1945 mod_timer(&conn->info_timer, jiffies +
1946 msecs_to_jiffies(L2CAP_INFO_TIMEOUT));
1947
1948 l2cap_send_cmd(conn, conn->info_ident,
1949 L2CAP_INFO_REQ, sizeof(info), &info);
1950 }
1951
Linus Torvalds1da177e2005-04-16 15:20:36 -07001952 return 0;
1953}
1954
1955static inline int l2cap_connect_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
1956{
1957 struct l2cap_conn_rsp *rsp = (struct l2cap_conn_rsp *) data;
1958 u16 scid, dcid, result, status;
1959 struct sock *sk;
1960 u8 req[128];
1961
1962 scid = __le16_to_cpu(rsp->scid);
1963 dcid = __le16_to_cpu(rsp->dcid);
1964 result = __le16_to_cpu(rsp->result);
1965 status = __le16_to_cpu(rsp->status);
1966
1967 BT_DBG("dcid 0x%4.4x scid 0x%4.4x result 0x%2.2x status 0x%2.2x", dcid, scid, result, status);
1968
1969 if (scid) {
1970 if (!(sk = l2cap_get_chan_by_scid(&conn->chan_list, scid)))
1971 return 0;
1972 } else {
1973 if (!(sk = l2cap_get_chan_by_ident(&conn->chan_list, cmd->ident)))
1974 return 0;
1975 }
1976
1977 switch (result) {
1978 case L2CAP_CR_SUCCESS:
1979 sk->sk_state = BT_CONFIG;
1980 l2cap_pi(sk)->ident = 0;
1981 l2cap_pi(sk)->dcid = dcid;
1982 l2cap_pi(sk)->conf_state |= L2CAP_CONF_REQ_SENT;
1983
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01001984 l2cap_pi(sk)->conf_state &= ~L2CAP_CONF_CONNECT_PEND;
1985
Linus Torvalds1da177e2005-04-16 15:20:36 -07001986 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
1987 l2cap_build_conf_req(sk, req), req);
1988 break;
1989
1990 case L2CAP_CR_PEND:
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01001991 l2cap_pi(sk)->conf_state |= L2CAP_CONF_CONNECT_PEND;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001992 break;
1993
1994 default:
1995 l2cap_chan_del(sk, ECONNREFUSED);
1996 break;
1997 }
1998
1999 bh_unlock_sock(sk);
2000 return 0;
2001}
2002
Al Viro88219a02007-07-29 00:17:25 -07002003static 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 -07002004{
2005 struct l2cap_conf_req *req = (struct l2cap_conf_req *) data;
2006 u16 dcid, flags;
2007 u8 rsp[64];
2008 struct sock *sk;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002009 int len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002010
2011 dcid = __le16_to_cpu(req->dcid);
2012 flags = __le16_to_cpu(req->flags);
2013
2014 BT_DBG("dcid 0x%4.4x flags 0x%2.2x", dcid, flags);
2015
2016 if (!(sk = l2cap_get_chan_by_scid(&conn->chan_list, dcid)))
2017 return -ENOENT;
2018
Marcel Holtmann354f60a2006-11-18 22:15:20 +01002019 if (sk->sk_state == BT_DISCONN)
2020 goto unlock;
2021
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002022 /* Reject if config buffer is too small. */
Al Viro88219a02007-07-29 00:17:25 -07002023 len = cmd_len - sizeof(*req);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002024 if (l2cap_pi(sk)->conf_len + len > sizeof(l2cap_pi(sk)->conf_req)) {
2025 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
2026 l2cap_build_conf_rsp(sk, rsp,
2027 L2CAP_CONF_REJECT, flags), rsp);
2028 goto unlock;
2029 }
2030
2031 /* Store config. */
2032 memcpy(l2cap_pi(sk)->conf_req + l2cap_pi(sk)->conf_len, req->data, len);
2033 l2cap_pi(sk)->conf_len += len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002034
2035 if (flags & 0x0001) {
2036 /* Incomplete config. Send empty response. */
2037 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002038 l2cap_build_conf_rsp(sk, rsp,
2039 L2CAP_CONF_SUCCESS, 0x0001), rsp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002040 goto unlock;
2041 }
2042
2043 /* Complete config. */
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002044 len = l2cap_parse_conf_req(sk, rsp);
2045 if (len < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002046 goto unlock;
2047
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002048 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp);
2049
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002050 /* Reset config buffer. */
2051 l2cap_pi(sk)->conf_len = 0;
2052
Marcel Holtmann876d9482007-10-20 13:35:42 +02002053 if (!(l2cap_pi(sk)->conf_state & L2CAP_CONF_OUTPUT_DONE))
2054 goto unlock;
2055
Linus Torvalds1da177e2005-04-16 15:20:36 -07002056 if (l2cap_pi(sk)->conf_state & L2CAP_CONF_INPUT_DONE) {
2057 sk->sk_state = BT_CONNECTED;
2058 l2cap_chan_ready(sk);
Marcel Holtmann876d9482007-10-20 13:35:42 +02002059 goto unlock;
2060 }
2061
2062 if (!(l2cap_pi(sk)->conf_state & L2CAP_CONF_REQ_SENT)) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02002063 u8 buf[64];
Linus Torvalds1da177e2005-04-16 15:20:36 -07002064 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Marcel Holtmann79d554a2008-07-14 20:13:44 +02002065 l2cap_build_conf_req(sk, buf), buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002066 }
2067
2068unlock:
2069 bh_unlock_sock(sk);
2070 return 0;
2071}
2072
2073static inline int l2cap_config_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
2074{
2075 struct l2cap_conf_rsp *rsp = (struct l2cap_conf_rsp *)data;
2076 u16 scid, flags, result;
2077 struct sock *sk;
2078
2079 scid = __le16_to_cpu(rsp->scid);
2080 flags = __le16_to_cpu(rsp->flags);
2081 result = __le16_to_cpu(rsp->result);
2082
2083 BT_DBG("scid 0x%4.4x flags 0x%2.2x result 0x%2.2x", scid, flags, result);
2084
2085 if (!(sk = l2cap_get_chan_by_scid(&conn->chan_list, scid)))
2086 return 0;
2087
2088 switch (result) {
2089 case L2CAP_CONF_SUCCESS:
2090 break;
2091
2092 case L2CAP_CONF_UNACCEPT:
2093 if (++l2cap_pi(sk)->conf_retry < L2CAP_CONF_MAX_RETRIES) {
2094 char req[128];
2095 /* It does not make sense to adjust L2CAP parameters
2096 * that are currently defined in the spec. We simply
2097 * resend config request that we sent earlier. It is
2098 * stupid, but it helps qualification testing which
2099 * expects at least some response from us. */
2100 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
2101 l2cap_build_conf_req(sk, req), req);
2102 goto done;
2103 }
2104
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09002105 default:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002106 sk->sk_state = BT_DISCONN;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02002107 sk->sk_err = ECONNRESET;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002108 l2cap_sock_set_timer(sk, HZ * 5);
2109 {
2110 struct l2cap_disconn_req req;
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002111 req.dcid = cpu_to_le16(l2cap_pi(sk)->dcid);
2112 req.scid = cpu_to_le16(l2cap_pi(sk)->scid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002113 l2cap_send_cmd(conn, l2cap_get_ident(conn),
2114 L2CAP_DISCONN_REQ, sizeof(req), &req);
2115 }
2116 goto done;
2117 }
2118
2119 if (flags & 0x01)
2120 goto done;
2121
Linus Torvalds1da177e2005-04-16 15:20:36 -07002122 l2cap_pi(sk)->conf_state |= L2CAP_CONF_INPUT_DONE;
2123
2124 if (l2cap_pi(sk)->conf_state & L2CAP_CONF_OUTPUT_DONE) {
2125 sk->sk_state = BT_CONNECTED;
2126 l2cap_chan_ready(sk);
2127 }
2128
2129done:
2130 bh_unlock_sock(sk);
2131 return 0;
2132}
2133
2134static inline int l2cap_disconnect_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
2135{
2136 struct l2cap_disconn_req *req = (struct l2cap_disconn_req *) data;
2137 struct l2cap_disconn_rsp rsp;
2138 u16 dcid, scid;
2139 struct sock *sk;
2140
2141 scid = __le16_to_cpu(req->scid);
2142 dcid = __le16_to_cpu(req->dcid);
2143
2144 BT_DBG("scid 0x%4.4x dcid 0x%4.4x", scid, dcid);
2145
2146 if (!(sk = l2cap_get_chan_by_scid(&conn->chan_list, dcid)))
2147 return 0;
2148
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002149 rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid);
2150 rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002151 l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp);
2152
2153 sk->sk_shutdown = SHUTDOWN_MASK;
2154
2155 l2cap_chan_del(sk, ECONNRESET);
2156 bh_unlock_sock(sk);
2157
2158 l2cap_sock_kill(sk);
2159 return 0;
2160}
2161
2162static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
2163{
2164 struct l2cap_disconn_rsp *rsp = (struct l2cap_disconn_rsp *) data;
2165 u16 dcid, scid;
2166 struct sock *sk;
2167
2168 scid = __le16_to_cpu(rsp->scid);
2169 dcid = __le16_to_cpu(rsp->dcid);
2170
2171 BT_DBG("dcid 0x%4.4x scid 0x%4.4x", dcid, scid);
2172
2173 if (!(sk = l2cap_get_chan_by_scid(&conn->chan_list, scid)))
2174 return 0;
2175
2176 l2cap_chan_del(sk, 0);
2177 bh_unlock_sock(sk);
2178
2179 l2cap_sock_kill(sk);
2180 return 0;
2181}
2182
2183static inline int l2cap_information_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
2184{
2185 struct l2cap_info_req *req = (struct l2cap_info_req *) data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002186 u16 type;
2187
2188 type = __le16_to_cpu(req->type);
2189
2190 BT_DBG("type 0x%4.4x", type);
2191
Marcel Holtmannf0709e02007-10-20 13:38:51 +02002192 if (type == L2CAP_IT_FEAT_MASK) {
2193 u8 buf[8];
2194 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
2195 rsp->type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
2196 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
2197 put_unaligned(cpu_to_le32(l2cap_feat_mask), (__le32 *) rsp->data);
2198 l2cap_send_cmd(conn, cmd->ident,
2199 L2CAP_INFO_RSP, sizeof(buf), buf);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01002200 } else if (type == L2CAP_IT_FIXED_CHAN) {
2201 u8 buf[12];
2202 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
2203 rsp->type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
2204 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
2205 memcpy(buf + 4, l2cap_fixed_chan, 8);
2206 l2cap_send_cmd(conn, cmd->ident,
2207 L2CAP_INFO_RSP, sizeof(buf), buf);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02002208 } else {
2209 struct l2cap_info_rsp rsp;
2210 rsp.type = cpu_to_le16(type);
2211 rsp.result = cpu_to_le16(L2CAP_IR_NOTSUPP);
2212 l2cap_send_cmd(conn, cmd->ident,
2213 L2CAP_INFO_RSP, sizeof(rsp), &rsp);
2214 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002215
2216 return 0;
2217}
2218
2219static inline int l2cap_information_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
2220{
2221 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) data;
2222 u16 type, result;
2223
2224 type = __le16_to_cpu(rsp->type);
2225 result = __le16_to_cpu(rsp->result);
2226
2227 BT_DBG("type 0x%4.4x result 0x%2.2x", type, result);
2228
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02002229 del_timer(&conn->info_timer);
2230
Marcel Holtmann984947d2009-02-06 23:35:19 +01002231 if (type == L2CAP_IT_FEAT_MASK) {
Harvey Harrison83985312008-05-02 16:25:46 -07002232 conn->feat_mask = get_unaligned_le32(rsp->data);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02002233
Marcel Holtmanne1027a72009-02-09 09:18:02 +01002234 if (conn->feat_mask & 0x0080) {
2235 struct l2cap_info_req req;
2236 req.type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
2237
2238 conn->info_ident = l2cap_get_ident(conn);
2239
2240 l2cap_send_cmd(conn, conn->info_ident,
2241 L2CAP_INFO_REQ, sizeof(req), &req);
2242 } else {
2243 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
2244 conn->info_ident = 0;
2245
2246 l2cap_conn_start(conn);
2247 }
2248 } else if (type == L2CAP_IT_FIXED_CHAN) {
Marcel Holtmann984947d2009-02-06 23:35:19 +01002249 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01002250 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01002251
2252 l2cap_conn_start(conn);
2253 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02002254
Linus Torvalds1da177e2005-04-16 15:20:36 -07002255 return 0;
2256}
2257
2258static inline void l2cap_sig_channel(struct l2cap_conn *conn, struct sk_buff *skb)
2259{
2260 u8 *data = skb->data;
2261 int len = skb->len;
2262 struct l2cap_cmd_hdr cmd;
2263 int err = 0;
2264
2265 l2cap_raw_recv(conn, skb);
2266
2267 while (len >= L2CAP_CMD_HDR_SIZE) {
Al Viro88219a02007-07-29 00:17:25 -07002268 u16 cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002269 memcpy(&cmd, data, L2CAP_CMD_HDR_SIZE);
2270 data += L2CAP_CMD_HDR_SIZE;
2271 len -= L2CAP_CMD_HDR_SIZE;
2272
Al Viro88219a02007-07-29 00:17:25 -07002273 cmd_len = le16_to_cpu(cmd.len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002274
Al Viro88219a02007-07-29 00:17:25 -07002275 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 -07002276
Al Viro88219a02007-07-29 00:17:25 -07002277 if (cmd_len > len || !cmd.ident) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002278 BT_DBG("corrupted command");
2279 break;
2280 }
2281
2282 switch (cmd.code) {
2283 case L2CAP_COMMAND_REJ:
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02002284 l2cap_command_rej(conn, &cmd, data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002285 break;
2286
2287 case L2CAP_CONN_REQ:
2288 err = l2cap_connect_req(conn, &cmd, data);
2289 break;
2290
2291 case L2CAP_CONN_RSP:
2292 err = l2cap_connect_rsp(conn, &cmd, data);
2293 break;
2294
2295 case L2CAP_CONF_REQ:
Al Viro88219a02007-07-29 00:17:25 -07002296 err = l2cap_config_req(conn, &cmd, cmd_len, data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002297 break;
2298
2299 case L2CAP_CONF_RSP:
2300 err = l2cap_config_rsp(conn, &cmd, data);
2301 break;
2302
2303 case L2CAP_DISCONN_REQ:
2304 err = l2cap_disconnect_req(conn, &cmd, data);
2305 break;
2306
2307 case L2CAP_DISCONN_RSP:
2308 err = l2cap_disconnect_rsp(conn, &cmd, data);
2309 break;
2310
2311 case L2CAP_ECHO_REQ:
Al Viro88219a02007-07-29 00:17:25 -07002312 l2cap_send_cmd(conn, cmd.ident, L2CAP_ECHO_RSP, cmd_len, data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002313 break;
2314
2315 case L2CAP_ECHO_RSP:
2316 break;
2317
2318 case L2CAP_INFO_REQ:
2319 err = l2cap_information_req(conn, &cmd, data);
2320 break;
2321
2322 case L2CAP_INFO_RSP:
2323 err = l2cap_information_rsp(conn, &cmd, data);
2324 break;
2325
2326 default:
2327 BT_ERR("Unknown signaling command 0x%2.2x", cmd.code);
2328 err = -EINVAL;
2329 break;
2330 }
2331
2332 if (err) {
2333 struct l2cap_cmd_rej rej;
2334 BT_DBG("error %d", err);
2335
2336 /* FIXME: Map err to a valid reason */
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002337 rej.reason = cpu_to_le16(0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002338 l2cap_send_cmd(conn, cmd.ident, L2CAP_COMMAND_REJ, sizeof(rej), &rej);
2339 }
2340
Al Viro88219a02007-07-29 00:17:25 -07002341 data += cmd_len;
2342 len -= cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002343 }
2344
2345 kfree_skb(skb);
2346}
2347
2348static inline int l2cap_data_channel(struct l2cap_conn *conn, u16 cid, struct sk_buff *skb)
2349{
2350 struct sock *sk;
2351
2352 sk = l2cap_get_chan_by_scid(&conn->chan_list, cid);
2353 if (!sk) {
2354 BT_DBG("unknown cid 0x%4.4x", cid);
2355 goto drop;
2356 }
2357
2358 BT_DBG("sk %p, len %d", sk, skb->len);
2359
2360 if (sk->sk_state != BT_CONNECTED)
2361 goto drop;
2362
2363 if (l2cap_pi(sk)->imtu < skb->len)
2364 goto drop;
2365
2366 /* If socket recv buffers overflows we drop data here
2367 * which is *bad* because L2CAP has to be reliable.
2368 * But we don't have any other choice. L2CAP doesn't
2369 * provide flow control mechanism. */
2370
2371 if (!sock_queue_rcv_skb(sk, skb))
2372 goto done;
2373
2374drop:
2375 kfree_skb(skb);
2376
2377done:
Marcel Holtmann01394182006-07-03 10:02:46 +02002378 if (sk)
2379 bh_unlock_sock(sk);
2380
Linus Torvalds1da177e2005-04-16 15:20:36 -07002381 return 0;
2382}
2383
Al Viro8e036fc2007-07-29 00:16:36 -07002384static inline int l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002385{
2386 struct sock *sk;
2387
2388 sk = l2cap_get_sock_by_psm(0, psm, conn->src);
2389 if (!sk)
2390 goto drop;
2391
2392 BT_DBG("sk %p, len %d", sk, skb->len);
2393
2394 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_CONNECTED)
2395 goto drop;
2396
2397 if (l2cap_pi(sk)->imtu < skb->len)
2398 goto drop;
2399
2400 if (!sock_queue_rcv_skb(sk, skb))
2401 goto done;
2402
2403drop:
2404 kfree_skb(skb);
2405
2406done:
2407 if (sk) bh_unlock_sock(sk);
2408 return 0;
2409}
2410
2411static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb)
2412{
2413 struct l2cap_hdr *lh = (void *) skb->data;
Al Viro8e036fc2007-07-29 00:16:36 -07002414 u16 cid, len;
2415 __le16 psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002416
2417 skb_pull(skb, L2CAP_HDR_SIZE);
2418 cid = __le16_to_cpu(lh->cid);
2419 len = __le16_to_cpu(lh->len);
2420
2421 BT_DBG("len %d, cid 0x%4.4x", len, cid);
2422
2423 switch (cid) {
2424 case 0x0001:
2425 l2cap_sig_channel(conn, skb);
2426 break;
2427
2428 case 0x0002:
Al Viro8e036fc2007-07-29 00:16:36 -07002429 psm = get_unaligned((__le16 *) skb->data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002430 skb_pull(skb, 2);
2431 l2cap_conless_channel(conn, psm, skb);
2432 break;
2433
2434 default:
2435 l2cap_data_channel(conn, cid, skb);
2436 break;
2437 }
2438}
2439
2440/* ---- L2CAP interface with lower layer (HCI) ---- */
2441
2442static int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
2443{
2444 int exact = 0, lm1 = 0, lm2 = 0;
2445 register struct sock *sk;
2446 struct hlist_node *node;
2447
2448 if (type != ACL_LINK)
2449 return 0;
2450
2451 BT_DBG("hdev %s, bdaddr %s", hdev->name, batostr(bdaddr));
2452
2453 /* Find listening sockets and check their link_mode */
2454 read_lock(&l2cap_sk_list.lock);
2455 sk_for_each(sk, node, &l2cap_sk_list.head) {
2456 if (sk->sk_state != BT_LISTEN)
2457 continue;
2458
2459 if (!bacmp(&bt_sk(sk)->src, &hdev->bdaddr)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01002460 lm1 |= HCI_LM_ACCEPT;
2461 if (l2cap_pi(sk)->role_switch)
2462 lm1 |= HCI_LM_MASTER;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002463 exact++;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01002464 } else if (!bacmp(&bt_sk(sk)->src, BDADDR_ANY)) {
2465 lm2 |= HCI_LM_ACCEPT;
2466 if (l2cap_pi(sk)->role_switch)
2467 lm2 |= HCI_LM_MASTER;
2468 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002469 }
2470 read_unlock(&l2cap_sk_list.lock);
2471
2472 return exact ? lm1 : lm2;
2473}
2474
2475static int l2cap_connect_cfm(struct hci_conn *hcon, u8 status)
2476{
Marcel Holtmann01394182006-07-03 10:02:46 +02002477 struct l2cap_conn *conn;
2478
Linus Torvalds1da177e2005-04-16 15:20:36 -07002479 BT_DBG("hcon %p bdaddr %s status %d", hcon, batostr(&hcon->dst), status);
2480
2481 if (hcon->type != ACL_LINK)
2482 return 0;
2483
2484 if (!status) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002485 conn = l2cap_conn_add(hcon, status);
2486 if (conn)
2487 l2cap_conn_ready(conn);
Marcel Holtmann01394182006-07-03 10:02:46 +02002488 } else
Linus Torvalds1da177e2005-04-16 15:20:36 -07002489 l2cap_conn_del(hcon, bt_err(status));
2490
2491 return 0;
2492}
2493
Marcel Holtmann2950f212009-02-12 14:02:50 +01002494static int l2cap_disconn_ind(struct hci_conn *hcon)
2495{
2496 struct l2cap_conn *conn = hcon->l2cap_data;
2497
2498 BT_DBG("hcon %p", hcon);
2499
2500 if (hcon->type != ACL_LINK || !conn)
2501 return 0x13;
2502
2503 return conn->disc_reason;
2504}
2505
2506static int l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002507{
2508 BT_DBG("hcon %p reason %d", hcon, reason);
2509
2510 if (hcon->type != ACL_LINK)
2511 return 0;
2512
2513 l2cap_conn_del(hcon, bt_err(reason));
Marcel Holtmann01394182006-07-03 10:02:46 +02002514
Linus Torvalds1da177e2005-04-16 15:20:36 -07002515 return 0;
2516}
2517
Marcel Holtmannf62e4322009-01-15 21:58:44 +01002518static inline void l2cap_check_encryption(struct sock *sk, u8 encrypt)
2519{
Marcel Holtmann255c7602009-02-04 21:07:19 +01002520 if (sk->sk_type != SOCK_SEQPACKET)
2521 return;
2522
Marcel Holtmannf62e4322009-01-15 21:58:44 +01002523 if (encrypt == 0x00) {
2524 if (l2cap_pi(sk)->sec_level == BT_SECURITY_MEDIUM) {
2525 l2cap_sock_clear_timer(sk);
2526 l2cap_sock_set_timer(sk, HZ * 5);
2527 } else if (l2cap_pi(sk)->sec_level == BT_SECURITY_HIGH)
2528 __l2cap_sock_close(sk, ECONNREFUSED);
2529 } else {
2530 if (l2cap_pi(sk)->sec_level == BT_SECURITY_MEDIUM)
2531 l2cap_sock_clear_timer(sk);
2532 }
2533}
2534
Marcel Holtmann8c1b2352009-01-15 21:58:04 +01002535static int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002536{
2537 struct l2cap_chan_list *l;
Marcel Holtmann40be4922008-07-14 20:13:50 +02002538 struct l2cap_conn *conn = hcon->l2cap_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002539 struct sock *sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002540
Marcel Holtmann01394182006-07-03 10:02:46 +02002541 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002542 return 0;
Marcel Holtmann01394182006-07-03 10:02:46 +02002543
Linus Torvalds1da177e2005-04-16 15:20:36 -07002544 l = &conn->chan_list;
2545
2546 BT_DBG("conn %p", conn);
2547
2548 read_lock(&l->lock);
2549
2550 for (sk = l->head; sk; sk = l2cap_pi(sk)->next_c) {
2551 bh_lock_sock(sk);
2552
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01002553 if (l2cap_pi(sk)->conf_state & L2CAP_CONF_CONNECT_PEND) {
2554 bh_unlock_sock(sk);
2555 continue;
2556 }
2557
Marcel Holtmannf62e4322009-01-15 21:58:44 +01002558 if (!status && (sk->sk_state == BT_CONNECTED ||
Marcel Holtmann8c1b2352009-01-15 21:58:04 +01002559 sk->sk_state == BT_CONFIG)) {
Marcel Holtmannf62e4322009-01-15 21:58:44 +01002560 l2cap_check_encryption(sk, encrypt);
Marcel Holtmann9719f8a2008-07-14 20:13:45 +02002561 bh_unlock_sock(sk);
2562 continue;
2563 }
2564
Marcel Holtmannb1235d72008-07-14 20:13:54 +02002565 if (sk->sk_state == BT_CONNECT) {
2566 if (!status) {
2567 struct l2cap_conn_req req;
2568 req.scid = cpu_to_le16(l2cap_pi(sk)->scid);
2569 req.psm = l2cap_pi(sk)->psm;
2570
2571 l2cap_pi(sk)->ident = l2cap_get_ident(conn);
2572
2573 l2cap_send_cmd(conn, l2cap_pi(sk)->ident,
2574 L2CAP_CONN_REQ, sizeof(req), &req);
2575 } else {
2576 l2cap_sock_clear_timer(sk);
2577 l2cap_sock_set_timer(sk, HZ / 10);
2578 }
2579 } else if (sk->sk_state == BT_CONNECT2) {
2580 struct l2cap_conn_rsp rsp;
2581 __u16 result;
2582
2583 if (!status) {
2584 sk->sk_state = BT_CONFIG;
2585 result = L2CAP_CR_SUCCESS;
2586 } else {
2587 sk->sk_state = BT_DISCONN;
2588 l2cap_sock_set_timer(sk, HZ / 10);
2589 result = L2CAP_CR_SEC_BLOCK;
2590 }
2591
2592 rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid);
2593 rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid);
2594 rsp.result = cpu_to_le16(result);
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02002595 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Marcel Holtmannb1235d72008-07-14 20:13:54 +02002596 l2cap_send_cmd(conn, l2cap_pi(sk)->ident,
2597 L2CAP_CONN_RSP, sizeof(rsp), &rsp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002598 }
2599
Linus Torvalds1da177e2005-04-16 15:20:36 -07002600 bh_unlock_sock(sk);
2601 }
2602
2603 read_unlock(&l->lock);
Marcel Holtmannb1235d72008-07-14 20:13:54 +02002604
Linus Torvalds1da177e2005-04-16 15:20:36 -07002605 return 0;
2606}
2607
2608static int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)
2609{
2610 struct l2cap_conn *conn = hcon->l2cap_data;
2611
2612 if (!conn && !(conn = l2cap_conn_add(hcon, 0)))
2613 goto drop;
2614
2615 BT_DBG("conn %p len %d flags 0x%x", conn, skb->len, flags);
2616
2617 if (flags & ACL_START) {
2618 struct l2cap_hdr *hdr;
2619 int len;
2620
2621 if (conn->rx_len) {
2622 BT_ERR("Unexpected start frame (len %d)", skb->len);
2623 kfree_skb(conn->rx_skb);
2624 conn->rx_skb = NULL;
2625 conn->rx_len = 0;
2626 l2cap_conn_unreliable(conn, ECOMM);
2627 }
2628
2629 if (skb->len < 2) {
2630 BT_ERR("Frame is too short (len %d)", skb->len);
2631 l2cap_conn_unreliable(conn, ECOMM);
2632 goto drop;
2633 }
2634
2635 hdr = (struct l2cap_hdr *) skb->data;
2636 len = __le16_to_cpu(hdr->len) + L2CAP_HDR_SIZE;
2637
2638 if (len == skb->len) {
2639 /* Complete frame received */
2640 l2cap_recv_frame(conn, skb);
2641 return 0;
2642 }
2643
2644 BT_DBG("Start: total len %d, frag len %d", len, skb->len);
2645
2646 if (skb->len > len) {
2647 BT_ERR("Frame is too long (len %d, expected len %d)",
2648 skb->len, len);
2649 l2cap_conn_unreliable(conn, ECOMM);
2650 goto drop;
2651 }
2652
2653 /* Allocate skb for the complete frame (with header) */
2654 if (!(conn->rx_skb = bt_skb_alloc(len, GFP_ATOMIC)))
2655 goto drop;
2656
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03002657 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Marcel Holtmanne1027a72009-02-09 09:18:02 +01002658 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002659 conn->rx_len = len - skb->len;
2660 } else {
2661 BT_DBG("Cont: frag len %d (expecting %d)", skb->len, conn->rx_len);
2662
2663 if (!conn->rx_len) {
2664 BT_ERR("Unexpected continuation frame (len %d)", skb->len);
2665 l2cap_conn_unreliable(conn, ECOMM);
2666 goto drop;
2667 }
2668
2669 if (skb->len > conn->rx_len) {
2670 BT_ERR("Fragment is too long (len %d, expected %d)",
2671 skb->len, conn->rx_len);
2672 kfree_skb(conn->rx_skb);
2673 conn->rx_skb = NULL;
2674 conn->rx_len = 0;
2675 l2cap_conn_unreliable(conn, ECOMM);
2676 goto drop;
2677 }
2678
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03002679 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Marcel Holtmanne1027a72009-02-09 09:18:02 +01002680 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002681 conn->rx_len -= skb->len;
2682
2683 if (!conn->rx_len) {
2684 /* Complete frame received */
2685 l2cap_recv_frame(conn, conn->rx_skb);
2686 conn->rx_skb = NULL;
2687 }
2688 }
2689
2690drop:
2691 kfree_skb(skb);
2692 return 0;
2693}
2694
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002695static ssize_t l2cap_sysfs_show(struct class *dev, char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002696{
2697 struct sock *sk;
2698 struct hlist_node *node;
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002699 char *str = buf;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002700
2701 read_lock_bh(&l2cap_sk_list.lock);
2702
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002703 sk_for_each(sk, node, &l2cap_sk_list.head) {
2704 struct l2cap_pinfo *pi = l2cap_pi(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002705
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01002706 str += sprintf(str, "%s %s %d %d 0x%4.4x 0x%4.4x %d %d %d\n",
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002707 batostr(&bt_sk(sk)->src), batostr(&bt_sk(sk)->dst),
Marcel Holtmann73863972007-01-22 22:00:40 +01002708 sk->sk_state, btohs(pi->psm), pi->scid, pi->dcid,
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01002709 pi->imtu, pi->omtu, pi->sec_level);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002710 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002711
Linus Torvalds1da177e2005-04-16 15:20:36 -07002712 read_unlock_bh(&l2cap_sk_list.lock);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002713
2714 return (str - buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002715}
2716
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002717static CLASS_ATTR(l2cap, S_IRUGO, l2cap_sysfs_show, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002718
Eric Dumazet90ddc4f2005-12-22 12:49:22 -08002719static const struct proto_ops l2cap_sock_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002720 .family = PF_BLUETOOTH,
2721 .owner = THIS_MODULE,
2722 .release = l2cap_sock_release,
2723 .bind = l2cap_sock_bind,
2724 .connect = l2cap_sock_connect,
2725 .listen = l2cap_sock_listen,
2726 .accept = l2cap_sock_accept,
2727 .getname = l2cap_sock_getname,
2728 .sendmsg = l2cap_sock_sendmsg,
Marcel Holtmannf66dc812009-01-15 21:57:00 +01002729 .recvmsg = l2cap_sock_recvmsg,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002730 .poll = bt_sock_poll,
Marcel Holtmann3241ad82008-07-14 20:13:50 +02002731 .ioctl = bt_sock_ioctl,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002732 .mmap = sock_no_mmap,
2733 .socketpair = sock_no_socketpair,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002734 .shutdown = l2cap_sock_shutdown,
2735 .setsockopt = l2cap_sock_setsockopt,
2736 .getsockopt = l2cap_sock_getsockopt
2737};
2738
2739static struct net_proto_family l2cap_sock_family_ops = {
2740 .family = PF_BLUETOOTH,
2741 .owner = THIS_MODULE,
2742 .create = l2cap_sock_create,
2743};
2744
2745static struct hci_proto l2cap_hci_proto = {
2746 .name = "L2CAP",
2747 .id = HCI_PROTO_L2CAP,
2748 .connect_ind = l2cap_connect_ind,
2749 .connect_cfm = l2cap_connect_cfm,
2750 .disconn_ind = l2cap_disconn_ind,
Marcel Holtmann2950f212009-02-12 14:02:50 +01002751 .disconn_cfm = l2cap_disconn_cfm,
Marcel Holtmann8c1b2352009-01-15 21:58:04 +01002752 .security_cfm = l2cap_security_cfm,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002753 .recv_acldata = l2cap_recv_acldata
2754};
2755
2756static int __init l2cap_init(void)
2757{
2758 int err;
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002759
Linus Torvalds1da177e2005-04-16 15:20:36 -07002760 err = proto_register(&l2cap_proto, 0);
2761 if (err < 0)
2762 return err;
2763
2764 err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
2765 if (err < 0) {
2766 BT_ERR("L2CAP socket registration failed");
2767 goto error;
2768 }
2769
2770 err = hci_register_proto(&l2cap_hci_proto);
2771 if (err < 0) {
2772 BT_ERR("L2CAP protocol registration failed");
2773 bt_sock_unregister(BTPROTO_L2CAP);
2774 goto error;
2775 }
2776
Marcel Holtmanndf5c37e2006-10-15 17:30:45 +02002777 if (class_create_file(bt_class, &class_attr_l2cap) < 0)
2778 BT_ERR("Failed to create L2CAP info file");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002779
2780 BT_INFO("L2CAP ver %s", VERSION);
2781 BT_INFO("L2CAP socket layer initialized");
2782
2783 return 0;
2784
2785error:
2786 proto_unregister(&l2cap_proto);
2787 return err;
2788}
2789
2790static void __exit l2cap_exit(void)
2791{
Marcel Holtmanna91f2e32006-07-03 10:02:41 +02002792 class_remove_file(bt_class, &class_attr_l2cap);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002793
2794 if (bt_sock_unregister(BTPROTO_L2CAP) < 0)
2795 BT_ERR("L2CAP socket unregistration failed");
2796
2797 if (hci_unregister_proto(&l2cap_hci_proto) < 0)
2798 BT_ERR("L2CAP protocol unregistration failed");
2799
2800 proto_unregister(&l2cap_proto);
2801}
2802
2803void l2cap_load(void)
2804{
2805 /* Dummy function to trigger automatic L2CAP module loading by
2806 * other modules that use L2CAP sockets but don't use any other
2807 * symbols from it. */
2808 return;
2809}
2810EXPORT_SYMBOL(l2cap_load);
2811
2812module_init(l2cap_init);
2813module_exit(l2cap_exit);
2814
Marcel Holtmann63fbd242008-08-18 13:23:53 +02002815MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002816MODULE_DESCRIPTION("Bluetooth L2CAP ver " VERSION);
2817MODULE_VERSION(VERSION);
2818MODULE_LICENSE("GPL");
2819MODULE_ALIAS("bt-proto-0");