blob: 810a3c1a4188f0a6f48e0fcaf0843712b0f83e36 [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>
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -030043#include <linux/uaccess.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070044#include <net/sock.h>
45
46#include <asm/system.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070047#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 Holtmann44dd46d2009-05-02 19:09:01 -070053#define VERSION "2.14"
54
55static int enable_ertm = 0;
Marcel Holtmannf0709e02007-10-20 13:38:51 +020056
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -070057static u32 l2cap_feat_mask = L2CAP_FEAT_FIXED_CHAN;
Marcel Holtmanne1027a72009-02-09 09:18:02 +010058static u8 l2cap_fixed_chan[8] = { 0x02, };
Linus Torvalds1da177e2005-04-16 15:20:36 -070059
Eric Dumazet90ddc4f2005-12-22 12:49:22 -080060static const struct proto_ops l2cap_sock_ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -070061
62static struct bt_sock_list l2cap_sk_list = {
Robert P. J. Dayd5fb2962008-03-28 16:17:38 -070063 .lock = __RW_LOCK_UNLOCKED(l2cap_sk_list.lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -070064};
65
Linus Torvalds1da177e2005-04-16 15:20:36 -070066static void __l2cap_sock_close(struct sock *sk, int reason);
67static void l2cap_sock_close(struct sock *sk);
68static void l2cap_sock_kill(struct sock *sk);
69
70static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn,
71 u8 code, u8 ident, u16 dlen, void *data);
72
73/* ---- L2CAP timers ---- */
74static void l2cap_sock_timeout(unsigned long arg)
75{
76 struct sock *sk = (struct sock *) arg;
Marcel Holtmannb1235d72008-07-14 20:13:54 +020077 int reason;
Linus Torvalds1da177e2005-04-16 15:20:36 -070078
79 BT_DBG("sock %p state %d", sk, sk->sk_state);
80
81 bh_lock_sock(sk);
Marcel Holtmannb1235d72008-07-14 20:13:54 +020082
Marcel Holtmannf62e4322009-01-15 21:58:44 +010083 if (sk->sk_state == BT_CONNECTED || sk->sk_state == BT_CONFIG)
84 reason = ECONNREFUSED;
85 else if (sk->sk_state == BT_CONNECT &&
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +010086 l2cap_pi(sk)->sec_level != BT_SECURITY_SDP)
Marcel Holtmannb1235d72008-07-14 20:13:54 +020087 reason = ECONNREFUSED;
88 else
89 reason = ETIMEDOUT;
90
91 __l2cap_sock_close(sk, reason);
92
Linus Torvalds1da177e2005-04-16 15:20:36 -070093 bh_unlock_sock(sk);
94
95 l2cap_sock_kill(sk);
96 sock_put(sk);
97}
98
99static void l2cap_sock_set_timer(struct sock *sk, long timeout)
100{
101 BT_DBG("sk %p state %d timeout %ld", sk, sk->sk_state, timeout);
102 sk_reset_timer(sk, &sk->sk_timer, jiffies + timeout);
103}
104
105static void l2cap_sock_clear_timer(struct sock *sk)
106{
107 BT_DBG("sock %p state %d", sk, sk->sk_state);
108 sk_stop_timer(sk, &sk->sk_timer);
109}
110
Marcel Holtmann01394182006-07-03 10:02:46 +0200111/* ---- L2CAP channels ---- */
112static struct sock *__l2cap_get_chan_by_dcid(struct l2cap_chan_list *l, u16 cid)
113{
114 struct sock *s;
115 for (s = l->head; s; s = l2cap_pi(s)->next_c) {
116 if (l2cap_pi(s)->dcid == cid)
117 break;
118 }
119 return s;
120}
121
122static struct sock *__l2cap_get_chan_by_scid(struct l2cap_chan_list *l, u16 cid)
123{
124 struct sock *s;
125 for (s = l->head; s; s = l2cap_pi(s)->next_c) {
126 if (l2cap_pi(s)->scid == cid)
127 break;
128 }
129 return s;
130}
131
132/* Find channel with given SCID.
133 * Returns locked socket */
134static inline struct sock *l2cap_get_chan_by_scid(struct l2cap_chan_list *l, u16 cid)
135{
136 struct sock *s;
137 read_lock(&l->lock);
138 s = __l2cap_get_chan_by_scid(l, cid);
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -0300139 if (s)
140 bh_lock_sock(s);
Marcel Holtmann01394182006-07-03 10:02:46 +0200141 read_unlock(&l->lock);
142 return s;
143}
144
145static struct sock *__l2cap_get_chan_by_ident(struct l2cap_chan_list *l, u8 ident)
146{
147 struct sock *s;
148 for (s = l->head; s; s = l2cap_pi(s)->next_c) {
149 if (l2cap_pi(s)->ident == ident)
150 break;
151 }
152 return s;
153}
154
155static inline struct sock *l2cap_get_chan_by_ident(struct l2cap_chan_list *l, u8 ident)
156{
157 struct sock *s;
158 read_lock(&l->lock);
159 s = __l2cap_get_chan_by_ident(l, ident);
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -0300160 if (s)
161 bh_lock_sock(s);
Marcel Holtmann01394182006-07-03 10:02:46 +0200162 read_unlock(&l->lock);
163 return s;
164}
165
166static u16 l2cap_alloc_cid(struct l2cap_chan_list *l)
167{
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -0300168 u16 cid = L2CAP_CID_DYN_START;
Marcel Holtmann01394182006-07-03 10:02:46 +0200169
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -0300170 for (; cid < L2CAP_CID_DYN_END; cid++) {
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -0300171 if (!__l2cap_get_chan_by_scid(l, cid))
Marcel Holtmann01394182006-07-03 10:02:46 +0200172 return cid;
173 }
174
175 return 0;
176}
177
178static inline void __l2cap_chan_link(struct l2cap_chan_list *l, struct sock *sk)
179{
180 sock_hold(sk);
181
182 if (l->head)
183 l2cap_pi(l->head)->prev_c = sk;
184
185 l2cap_pi(sk)->next_c = l->head;
186 l2cap_pi(sk)->prev_c = NULL;
187 l->head = sk;
188}
189
190static inline void l2cap_chan_unlink(struct l2cap_chan_list *l, struct sock *sk)
191{
192 struct sock *next = l2cap_pi(sk)->next_c, *prev = l2cap_pi(sk)->prev_c;
193
Marcel Holtmannfd1278d2006-07-12 23:00:07 +0200194 write_lock_bh(&l->lock);
Marcel Holtmann01394182006-07-03 10:02:46 +0200195 if (sk == l->head)
196 l->head = next;
197
198 if (next)
199 l2cap_pi(next)->prev_c = prev;
200 if (prev)
201 l2cap_pi(prev)->next_c = next;
Marcel Holtmannfd1278d2006-07-12 23:00:07 +0200202 write_unlock_bh(&l->lock);
Marcel Holtmann01394182006-07-03 10:02:46 +0200203
204 __sock_put(sk);
205}
206
207static void __l2cap_chan_add(struct l2cap_conn *conn, struct sock *sk, struct sock *parent)
208{
209 struct l2cap_chan_list *l = &conn->chan_list;
210
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -0300211 BT_DBG("conn %p, psm 0x%2.2x, dcid 0x%4.4x", conn,
212 l2cap_pi(sk)->psm, l2cap_pi(sk)->dcid);
Marcel Holtmann01394182006-07-03 10:02:46 +0200213
Marcel Holtmann2950f212009-02-12 14:02:50 +0100214 conn->disc_reason = 0x13;
215
Marcel Holtmann01394182006-07-03 10:02:46 +0200216 l2cap_pi(sk)->conn = conn;
217
218 if (sk->sk_type == SOCK_SEQPACKET) {
219 /* Alloc CID for connection-oriented socket */
220 l2cap_pi(sk)->scid = l2cap_alloc_cid(l);
221 } else if (sk->sk_type == SOCK_DGRAM) {
222 /* Connectionless socket */
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -0300223 l2cap_pi(sk)->scid = L2CAP_CID_CONN_LESS;
224 l2cap_pi(sk)->dcid = L2CAP_CID_CONN_LESS;
Marcel Holtmann01394182006-07-03 10:02:46 +0200225 l2cap_pi(sk)->omtu = L2CAP_DEFAULT_MTU;
226 } else {
227 /* Raw socket can send/recv signalling messages only */
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -0300228 l2cap_pi(sk)->scid = L2CAP_CID_SIGNALING;
229 l2cap_pi(sk)->dcid = L2CAP_CID_SIGNALING;
Marcel Holtmann01394182006-07-03 10:02:46 +0200230 l2cap_pi(sk)->omtu = L2CAP_DEFAULT_MTU;
231 }
232
233 __l2cap_chan_link(l, sk);
234
235 if (parent)
236 bt_accept_enqueue(parent, sk);
237}
238
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900239/* Delete channel.
Marcel Holtmann01394182006-07-03 10:02:46 +0200240 * Must be called on the locked socket. */
241static void l2cap_chan_del(struct sock *sk, int err)
242{
243 struct l2cap_conn *conn = l2cap_pi(sk)->conn;
244 struct sock *parent = bt_sk(sk)->parent;
245
246 l2cap_sock_clear_timer(sk);
247
248 BT_DBG("sk %p, conn %p, err %d", sk, conn, err);
249
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900250 if (conn) {
Marcel Holtmann01394182006-07-03 10:02:46 +0200251 /* Unlink from channel list */
252 l2cap_chan_unlink(&conn->chan_list, sk);
253 l2cap_pi(sk)->conn = NULL;
254 hci_conn_put(conn->hcon);
255 }
256
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200257 sk->sk_state = BT_CLOSED;
Marcel Holtmann01394182006-07-03 10:02:46 +0200258 sock_set_flag(sk, SOCK_ZAPPED);
259
260 if (err)
261 sk->sk_err = err;
262
263 if (parent) {
264 bt_accept_unlink(sk);
265 parent->sk_data_ready(parent, 0);
266 } else
267 sk->sk_state_change(sk);
268}
269
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200270/* Service level security */
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100271static inline int l2cap_check_security(struct sock *sk)
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200272{
273 struct l2cap_conn *conn = l2cap_pi(sk)->conn;
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100274 __u8 auth_type;
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200275
Marcel Holtmann00ae4af2009-02-12 16:19:45 +0100276 if (l2cap_pi(sk)->psm == cpu_to_le16(0x0001)) {
277 if (l2cap_pi(sk)->sec_level == BT_SECURITY_HIGH)
278 auth_type = HCI_AT_NO_BONDING_MITM;
279 else
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -0300280 auth_type = HCI_AT_NO_BONDING;
Marcel Holtmann00ae4af2009-02-12 16:19:45 +0100281
282 if (l2cap_pi(sk)->sec_level == BT_SECURITY_LOW)
283 l2cap_pi(sk)->sec_level = BT_SECURITY_SDP;
284 } else {
285 switch (l2cap_pi(sk)->sec_level) {
286 case BT_SECURITY_HIGH:
287 auth_type = HCI_AT_GENERAL_BONDING_MITM;
288 break;
289 case BT_SECURITY_MEDIUM:
290 auth_type = HCI_AT_GENERAL_BONDING;
291 break;
292 default:
293 auth_type = HCI_AT_NO_BONDING;
294 break;
295 }
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100296 }
297
298 return hci_conn_security(conn->hcon, l2cap_pi(sk)->sec_level,
299 auth_type);
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200300}
301
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200302static inline u8 l2cap_get_ident(struct l2cap_conn *conn)
303{
304 u8 id;
305
306 /* Get next available identificator.
307 * 1 - 128 are used by kernel.
308 * 129 - 199 are reserved.
309 * 200 - 254 are used by utilities like l2ping, etc.
310 */
311
312 spin_lock_bh(&conn->lock);
313
314 if (++conn->tx_ident > 128)
315 conn->tx_ident = 1;
316
317 id = conn->tx_ident;
318
319 spin_unlock_bh(&conn->lock);
320
321 return id;
322}
323
324static inline int l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len, void *data)
325{
326 struct sk_buff *skb = l2cap_build_cmd(conn, code, ident, len, data);
327
328 BT_DBG("code 0x%2.2x", code);
329
330 if (!skb)
331 return -ENOMEM;
332
333 return hci_send_acl(conn->hcon, skb, 0);
334}
335
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200336static void l2cap_do_start(struct sock *sk)
337{
338 struct l2cap_conn *conn = l2cap_pi(sk)->conn;
339
340 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) {
Marcel Holtmann984947d2009-02-06 23:35:19 +0100341 if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE))
342 return;
343
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100344 if (l2cap_check_security(sk)) {
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200345 struct l2cap_conn_req req;
346 req.scid = cpu_to_le16(l2cap_pi(sk)->scid);
347 req.psm = l2cap_pi(sk)->psm;
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200348
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200349 l2cap_pi(sk)->ident = l2cap_get_ident(conn);
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200350
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200351 l2cap_send_cmd(conn, l2cap_pi(sk)->ident,
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200352 L2CAP_CONN_REQ, sizeof(req), &req);
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200353 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200354 } else {
355 struct l2cap_info_req req;
356 req.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
357
358 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
359 conn->info_ident = l2cap_get_ident(conn);
360
361 mod_timer(&conn->info_timer, jiffies +
362 msecs_to_jiffies(L2CAP_INFO_TIMEOUT));
363
364 l2cap_send_cmd(conn, conn->info_ident,
365 L2CAP_INFO_REQ, sizeof(req), &req);
366 }
367}
368
Linus Torvalds1da177e2005-04-16 15:20:36 -0700369/* ---- L2CAP connections ---- */
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200370static void l2cap_conn_start(struct l2cap_conn *conn)
371{
372 struct l2cap_chan_list *l = &conn->chan_list;
373 struct sock *sk;
374
375 BT_DBG("conn %p", conn);
376
377 read_lock(&l->lock);
378
379 for (sk = l->head; sk; sk = l2cap_pi(sk)->next_c) {
380 bh_lock_sock(sk);
381
382 if (sk->sk_type != SOCK_SEQPACKET) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200383 bh_unlock_sock(sk);
384 continue;
385 }
386
387 if (sk->sk_state == BT_CONNECT) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100388 if (l2cap_check_security(sk)) {
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200389 struct l2cap_conn_req req;
390 req.scid = cpu_to_le16(l2cap_pi(sk)->scid);
391 req.psm = l2cap_pi(sk)->psm;
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200392
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200393 l2cap_pi(sk)->ident = l2cap_get_ident(conn);
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200394
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200395 l2cap_send_cmd(conn, l2cap_pi(sk)->ident,
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200396 L2CAP_CONN_REQ, sizeof(req), &req);
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200397 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200398 } else if (sk->sk_state == BT_CONNECT2) {
399 struct l2cap_conn_rsp rsp;
400 rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid);
401 rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid);
402
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100403 if (l2cap_check_security(sk)) {
Marcel Holtmannf66dc812009-01-15 21:57:00 +0100404 if (bt_sk(sk)->defer_setup) {
405 struct sock *parent = bt_sk(sk)->parent;
406 rsp.result = cpu_to_le16(L2CAP_CR_PEND);
407 rsp.status = cpu_to_le16(L2CAP_CS_AUTHOR_PEND);
408 parent->sk_data_ready(parent, 0);
409
410 } else {
411 sk->sk_state = BT_CONFIG;
412 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
413 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
414 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200415 } else {
416 rsp.result = cpu_to_le16(L2CAP_CR_PEND);
417 rsp.status = cpu_to_le16(L2CAP_CS_AUTHEN_PEND);
418 }
419
420 l2cap_send_cmd(conn, l2cap_pi(sk)->ident,
421 L2CAP_CONN_RSP, sizeof(rsp), &rsp);
422 }
423
424 bh_unlock_sock(sk);
425 }
426
427 read_unlock(&l->lock);
428}
429
430static void l2cap_conn_ready(struct l2cap_conn *conn)
431{
432 struct l2cap_chan_list *l = &conn->chan_list;
433 struct sock *sk;
434
435 BT_DBG("conn %p", conn);
436
437 read_lock(&l->lock);
438
439 for (sk = l->head; sk; sk = l2cap_pi(sk)->next_c) {
440 bh_lock_sock(sk);
441
442 if (sk->sk_type != SOCK_SEQPACKET) {
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200443 l2cap_sock_clear_timer(sk);
444 sk->sk_state = BT_CONNECTED;
445 sk->sk_state_change(sk);
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200446 } else if (sk->sk_state == BT_CONNECT)
447 l2cap_do_start(sk);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200448
449 bh_unlock_sock(sk);
450 }
451
452 read_unlock(&l->lock);
453}
454
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200455/* Notify sockets that we cannot guaranty reliability anymore */
456static void l2cap_conn_unreliable(struct l2cap_conn *conn, int err)
457{
458 struct l2cap_chan_list *l = &conn->chan_list;
459 struct sock *sk;
460
461 BT_DBG("conn %p", conn);
462
463 read_lock(&l->lock);
464
465 for (sk = l->head; sk; sk = l2cap_pi(sk)->next_c) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100466 if (l2cap_pi(sk)->force_reliable)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200467 sk->sk_err = err;
468 }
469
470 read_unlock(&l->lock);
471}
472
473static void l2cap_info_timeout(unsigned long arg)
474{
475 struct l2cap_conn *conn = (void *) arg;
476
Marcel Holtmann984947d2009-02-06 23:35:19 +0100477 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +0100478 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +0100479
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200480 l2cap_conn_start(conn);
481}
482
Linus Torvalds1da177e2005-04-16 15:20:36 -0700483static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon, u8 status)
484{
Marcel Holtmann01394182006-07-03 10:02:46 +0200485 struct l2cap_conn *conn = hcon->l2cap_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700486
Marcel Holtmann01394182006-07-03 10:02:46 +0200487 if (conn || status)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700488 return conn;
489
Marcel Holtmann01394182006-07-03 10:02:46 +0200490 conn = kzalloc(sizeof(struct l2cap_conn), GFP_ATOMIC);
491 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700492 return NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700493
494 hcon->l2cap_data = conn;
495 conn->hcon = hcon;
496
Marcel Holtmann01394182006-07-03 10:02:46 +0200497 BT_DBG("hcon %p conn %p", hcon, conn);
498
Linus Torvalds1da177e2005-04-16 15:20:36 -0700499 conn->mtu = hcon->hdev->acl_mtu;
500 conn->src = &hcon->hdev->bdaddr;
501 conn->dst = &hcon->dst;
502
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200503 conn->feat_mask = 0;
504
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200505 setup_timer(&conn->info_timer, l2cap_info_timeout,
506 (unsigned long) conn);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200507
Linus Torvalds1da177e2005-04-16 15:20:36 -0700508 spin_lock_init(&conn->lock);
509 rwlock_init(&conn->chan_list.lock);
510
Marcel Holtmann2950f212009-02-12 14:02:50 +0100511 conn->disc_reason = 0x13;
512
Linus Torvalds1da177e2005-04-16 15:20:36 -0700513 return conn;
514}
515
Marcel Holtmann01394182006-07-03 10:02:46 +0200516static void l2cap_conn_del(struct hci_conn *hcon, int err)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700517{
Marcel Holtmann01394182006-07-03 10:02:46 +0200518 struct l2cap_conn *conn = hcon->l2cap_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700519 struct sock *sk;
520
Marcel Holtmann01394182006-07-03 10:02:46 +0200521 if (!conn)
522 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700523
524 BT_DBG("hcon %p conn %p, err %d", hcon, conn, err);
525
Wei Yongjun7585b972009-02-25 18:29:52 +0800526 kfree_skb(conn->rx_skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700527
528 /* Kill channels */
529 while ((sk = conn->chan_list.head)) {
530 bh_lock_sock(sk);
531 l2cap_chan_del(sk, err);
532 bh_unlock_sock(sk);
533 l2cap_sock_kill(sk);
534 }
535
Dave Young8e8440f2008-03-03 12:18:55 -0800536 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT)
537 del_timer_sync(&conn->info_timer);
Thomas Gleixner3ab22732008-02-26 17:42:56 -0800538
Linus Torvalds1da177e2005-04-16 15:20:36 -0700539 hcon->l2cap_data = NULL;
540 kfree(conn);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700541}
542
543static inline void l2cap_chan_add(struct l2cap_conn *conn, struct sock *sk, struct sock *parent)
544{
545 struct l2cap_chan_list *l = &conn->chan_list;
Marcel Holtmannfd1278d2006-07-12 23:00:07 +0200546 write_lock_bh(&l->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700547 __l2cap_chan_add(conn, sk, parent);
Marcel Holtmannfd1278d2006-07-12 23:00:07 +0200548 write_unlock_bh(&l->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700549}
550
Linus Torvalds1da177e2005-04-16 15:20:36 -0700551/* ---- Socket interface ---- */
Al Viro8e036fc2007-07-29 00:16:36 -0700552static struct sock *__l2cap_get_sock_by_addr(__le16 psm, bdaddr_t *src)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700553{
554 struct sock *sk;
555 struct hlist_node *node;
556 sk_for_each(sk, node, &l2cap_sk_list.head)
557 if (l2cap_pi(sk)->sport == psm && !bacmp(&bt_sk(sk)->src, src))
558 goto found;
559 sk = NULL;
560found:
561 return sk;
562}
563
564/* Find socket with psm and source bdaddr.
565 * Returns closest match.
566 */
Al Viro8e036fc2007-07-29 00:16:36 -0700567static struct sock *__l2cap_get_sock_by_psm(int state, __le16 psm, bdaddr_t *src)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700568{
569 struct sock *sk = NULL, *sk1 = NULL;
570 struct hlist_node *node;
571
572 sk_for_each(sk, node, &l2cap_sk_list.head) {
573 if (state && sk->sk_state != state)
574 continue;
575
576 if (l2cap_pi(sk)->psm == psm) {
577 /* Exact match. */
578 if (!bacmp(&bt_sk(sk)->src, src))
579 break;
580
581 /* Closest match */
582 if (!bacmp(&bt_sk(sk)->src, BDADDR_ANY))
583 sk1 = sk;
584 }
585 }
586 return node ? sk : sk1;
587}
588
589/* Find socket with given address (psm, src).
590 * Returns locked socket */
Al Viro8e036fc2007-07-29 00:16:36 -0700591static inline struct sock *l2cap_get_sock_by_psm(int state, __le16 psm, bdaddr_t *src)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700592{
593 struct sock *s;
594 read_lock(&l2cap_sk_list.lock);
595 s = __l2cap_get_sock_by_psm(state, psm, src);
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -0300596 if (s)
597 bh_lock_sock(s);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700598 read_unlock(&l2cap_sk_list.lock);
599 return s;
600}
601
602static void l2cap_sock_destruct(struct sock *sk)
603{
604 BT_DBG("sk %p", sk);
605
606 skb_queue_purge(&sk->sk_receive_queue);
607 skb_queue_purge(&sk->sk_write_queue);
608}
609
610static void l2cap_sock_cleanup_listen(struct sock *parent)
611{
612 struct sock *sk;
613
614 BT_DBG("parent %p", parent);
615
616 /* Close not yet accepted channels */
617 while ((sk = bt_accept_dequeue(parent, NULL)))
618 l2cap_sock_close(sk);
619
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200620 parent->sk_state = BT_CLOSED;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700621 sock_set_flag(parent, SOCK_ZAPPED);
622}
623
624/* Kill socket (only if zapped and orphan)
625 * Must be called on unlocked socket.
626 */
627static void l2cap_sock_kill(struct sock *sk)
628{
629 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
630 return;
631
632 BT_DBG("sk %p state %d", sk, sk->sk_state);
633
634 /* Kill poor orphan */
635 bt_sock_unlink(&l2cap_sk_list, sk);
636 sock_set_flag(sk, SOCK_DEAD);
637 sock_put(sk);
638}
639
640static void __l2cap_sock_close(struct sock *sk, int reason)
641{
642 BT_DBG("sk %p state %d socket %p", sk, sk->sk_state, sk->sk_socket);
643
644 switch (sk->sk_state) {
645 case BT_LISTEN:
646 l2cap_sock_cleanup_listen(sk);
647 break;
648
649 case BT_CONNECTED:
650 case BT_CONFIG:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700651 if (sk->sk_type == SOCK_SEQPACKET) {
652 struct l2cap_conn *conn = l2cap_pi(sk)->conn;
653 struct l2cap_disconn_req req;
654
655 sk->sk_state = BT_DISCONN;
656 l2cap_sock_set_timer(sk, sk->sk_sndtimeo);
657
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -0700658 req.dcid = cpu_to_le16(l2cap_pi(sk)->dcid);
659 req.scid = cpu_to_le16(l2cap_pi(sk)->scid);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700660 l2cap_send_cmd(conn, l2cap_get_ident(conn),
661 L2CAP_DISCONN_REQ, sizeof(req), &req);
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200662 } else
Linus Torvalds1da177e2005-04-16 15:20:36 -0700663 l2cap_chan_del(sk, reason);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700664 break;
665
Marcel Holtmannf66dc812009-01-15 21:57:00 +0100666 case BT_CONNECT2:
667 if (sk->sk_type == SOCK_SEQPACKET) {
668 struct l2cap_conn *conn = l2cap_pi(sk)->conn;
669 struct l2cap_conn_rsp rsp;
670 __u16 result;
671
672 if (bt_sk(sk)->defer_setup)
673 result = L2CAP_CR_SEC_BLOCK;
674 else
675 result = L2CAP_CR_BAD_PSM;
676
677 rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid);
678 rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid);
679 rsp.result = cpu_to_le16(result);
680 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
681 l2cap_send_cmd(conn, l2cap_pi(sk)->ident,
682 L2CAP_CONN_RSP, sizeof(rsp), &rsp);
683 } else
684 l2cap_chan_del(sk, reason);
685 break;
686
Linus Torvalds1da177e2005-04-16 15:20:36 -0700687 case BT_CONNECT:
688 case BT_DISCONN:
689 l2cap_chan_del(sk, reason);
690 break;
691
692 default:
693 sock_set_flag(sk, SOCK_ZAPPED);
694 break;
695 }
696}
697
698/* Must be called on unlocked socket. */
699static void l2cap_sock_close(struct sock *sk)
700{
701 l2cap_sock_clear_timer(sk);
702 lock_sock(sk);
703 __l2cap_sock_close(sk, ECONNRESET);
704 release_sock(sk);
705 l2cap_sock_kill(sk);
706}
707
708static void l2cap_sock_init(struct sock *sk, struct sock *parent)
709{
710 struct l2cap_pinfo *pi = l2cap_pi(sk);
711
712 BT_DBG("sk %p", sk);
713
714 if (parent) {
715 sk->sk_type = parent->sk_type;
Marcel Holtmannf66dc812009-01-15 21:57:00 +0100716 bt_sk(sk)->defer_setup = bt_sk(parent)->defer_setup;
717
Linus Torvalds1da177e2005-04-16 15:20:36 -0700718 pi->imtu = l2cap_pi(parent)->imtu;
719 pi->omtu = l2cap_pi(parent)->omtu;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100720 pi->sec_level = l2cap_pi(parent)->sec_level;
721 pi->role_switch = l2cap_pi(parent)->role_switch;
722 pi->force_reliable = l2cap_pi(parent)->force_reliable;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700723 } else {
724 pi->imtu = L2CAP_DEFAULT_MTU;
725 pi->omtu = 0;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100726 pi->sec_level = BT_SECURITY_LOW;
727 pi->role_switch = 0;
728 pi->force_reliable = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700729 }
730
731 /* Default config options */
Marcel Holtmann5dee9e72007-05-24 14:27:19 +0200732 pi->conf_len = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700733 pi->flush_to = L2CAP_DEFAULT_FLUSH_TO;
734}
735
736static struct proto l2cap_proto = {
737 .name = "L2CAP",
738 .owner = THIS_MODULE,
739 .obj_size = sizeof(struct l2cap_pinfo)
740};
741
Eric W. Biederman1b8d7ae2007-10-08 23:24:22 -0700742static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700743{
744 struct sock *sk;
745
Pavel Emelyanov6257ff22007-11-01 00:39:31 -0700746 sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700747 if (!sk)
748 return NULL;
749
750 sock_init_data(sock, sk);
751 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
752
753 sk->sk_destruct = l2cap_sock_destruct;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200754 sk->sk_sndtimeo = msecs_to_jiffies(L2CAP_CONN_TIMEOUT);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700755
756 sock_reset_flag(sk, SOCK_ZAPPED);
757
758 sk->sk_protocol = proto;
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200759 sk->sk_state = BT_OPEN;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700760
Marcel Holtmannb1235d72008-07-14 20:13:54 +0200761 setup_timer(&sk->sk_timer, l2cap_sock_timeout, (unsigned long) sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700762
763 bt_sock_link(&l2cap_sk_list, sk);
764 return sk;
765}
766
Eric W. Biederman1b8d7ae2007-10-08 23:24:22 -0700767static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700768{
769 struct sock *sk;
770
771 BT_DBG("sock %p", sock);
772
773 sock->state = SS_UNCONNECTED;
774
775 if (sock->type != SOCK_SEQPACKET &&
776 sock->type != SOCK_DGRAM && sock->type != SOCK_RAW)
777 return -ESOCKTNOSUPPORT;
778
779 if (sock->type == SOCK_RAW && !capable(CAP_NET_RAW))
780 return -EPERM;
781
782 sock->ops = &l2cap_sock_ops;
783
Eric W. Biederman1b8d7ae2007-10-08 23:24:22 -0700784 sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700785 if (!sk)
786 return -ENOMEM;
787
788 l2cap_sock_init(sk, NULL);
789 return 0;
790}
791
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100792static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700793{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700794 struct sock *sk = sock->sk;
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100795 struct sockaddr_l2 la;
796 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700797
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100798 BT_DBG("sk %p", sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700799
800 if (!addr || addr->sa_family != AF_BLUETOOTH)
801 return -EINVAL;
802
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100803 memset(&la, 0, sizeof(la));
804 len = min_t(unsigned int, sizeof(la), alen);
805 memcpy(&la, addr, len);
806
Marcel Holtmann2a517ca2009-02-16 03:20:31 +0100807 if (la.l2_cid)
808 return -EINVAL;
809
Linus Torvalds1da177e2005-04-16 15:20:36 -0700810 lock_sock(sk);
811
812 if (sk->sk_state != BT_OPEN) {
813 err = -EBADFD;
814 goto done;
815 }
816
Marcel Holtmannb4324b52009-06-07 18:06:51 +0200817 if (la.l2_psm && __le16_to_cpu(la.l2_psm) < 0x1001 &&
Marcel Holtmann847641d2007-01-22 22:00:45 +0100818 !capable(CAP_NET_BIND_SERVICE)) {
819 err = -EACCES;
820 goto done;
821 }
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900822
Linus Torvalds1da177e2005-04-16 15:20:36 -0700823 write_lock_bh(&l2cap_sk_list.lock);
824
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100825 if (la.l2_psm && __l2cap_get_sock_by_addr(la.l2_psm, &la.l2_bdaddr)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700826 err = -EADDRINUSE;
827 } else {
828 /* Save source address */
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100829 bacpy(&bt_sk(sk)->src, &la.l2_bdaddr);
830 l2cap_pi(sk)->psm = la.l2_psm;
831 l2cap_pi(sk)->sport = la.l2_psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700832 sk->sk_state = BT_BOUND;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100833
Marcel Holtmannb4324b52009-06-07 18:06:51 +0200834 if (__le16_to_cpu(la.l2_psm) == 0x0001 ||
835 __le16_to_cpu(la.l2_psm) == 0x0003)
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100836 l2cap_pi(sk)->sec_level = BT_SECURITY_SDP;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700837 }
838
839 write_unlock_bh(&l2cap_sk_list.lock);
840
841done:
842 release_sock(sk);
843 return err;
844}
845
846static int l2cap_do_connect(struct sock *sk)
847{
848 bdaddr_t *src = &bt_sk(sk)->src;
849 bdaddr_t *dst = &bt_sk(sk)->dst;
850 struct l2cap_conn *conn;
851 struct hci_conn *hcon;
852 struct hci_dev *hdev;
Marcel Holtmann09ab6f42008-09-09 07:19:20 +0200853 __u8 auth_type;
Marcel Holtmann44d0e482009-04-20 07:09:16 +0200854 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700855
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100856 BT_DBG("%s -> %s psm 0x%2.2x", batostr(src), batostr(dst),
857 l2cap_pi(sk)->psm);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700858
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -0300859 hdev = hci_get_route(dst, src);
860 if (!hdev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700861 return -EHOSTUNREACH;
862
863 hci_dev_lock_bh(hdev);
864
865 err = -ENOMEM;
866
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100867 if (sk->sk_type == SOCK_RAW) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100868 switch (l2cap_pi(sk)->sec_level) {
869 case BT_SECURITY_HIGH:
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100870 auth_type = HCI_AT_DEDICATED_BONDING_MITM;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100871 break;
872 case BT_SECURITY_MEDIUM:
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100873 auth_type = HCI_AT_DEDICATED_BONDING;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100874 break;
875 default:
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100876 auth_type = HCI_AT_NO_BONDING;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100877 break;
878 }
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100879 } else if (l2cap_pi(sk)->psm == cpu_to_le16(0x0001)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100880 if (l2cap_pi(sk)->sec_level == BT_SECURITY_HIGH)
Marcel Holtmann09ab6f42008-09-09 07:19:20 +0200881 auth_type = HCI_AT_NO_BONDING_MITM;
882 else
Marcel Holtmann09ab6f42008-09-09 07:19:20 +0200883 auth_type = HCI_AT_NO_BONDING;
Marcel Holtmann435fef22009-02-09 03:55:28 +0100884
885 if (l2cap_pi(sk)->sec_level == BT_SECURITY_LOW)
886 l2cap_pi(sk)->sec_level = BT_SECURITY_SDP;
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100887 } else {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100888 switch (l2cap_pi(sk)->sec_level) {
889 case BT_SECURITY_HIGH:
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100890 auth_type = HCI_AT_GENERAL_BONDING_MITM;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100891 break;
892 case BT_SECURITY_MEDIUM:
Marcel Holtmann09ab6f42008-09-09 07:19:20 +0200893 auth_type = HCI_AT_GENERAL_BONDING;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100894 break;
895 default:
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100896 auth_type = HCI_AT_NO_BONDING;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100897 break;
898 }
Marcel Holtmann09ab6f42008-09-09 07:19:20 +0200899 }
900
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +0100901 hcon = hci_connect(hdev, ACL_LINK, dst,
902 l2cap_pi(sk)->sec_level, auth_type);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700903 if (!hcon)
904 goto done;
905
906 conn = l2cap_conn_add(hcon, 0);
907 if (!conn) {
908 hci_conn_put(hcon);
909 goto done;
910 }
911
912 err = 0;
913
914 /* Update source addr of the socket */
915 bacpy(src, conn->src);
916
917 l2cap_chan_add(conn, sk, NULL);
918
919 sk->sk_state = BT_CONNECT;
920 l2cap_sock_set_timer(sk, sk->sk_sndtimeo);
921
922 if (hcon->state == BT_CONNECTED) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200923 if (sk->sk_type != SOCK_SEQPACKET) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700924 l2cap_sock_clear_timer(sk);
925 sk->sk_state = BT_CONNECTED;
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200926 } else
927 l2cap_do_start(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700928 }
929
930done:
931 hci_dev_unlock_bh(hdev);
932 hci_dev_put(hdev);
933 return err;
934}
935
936static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags)
937{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700938 struct sock *sk = sock->sk;
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100939 struct sockaddr_l2 la;
940 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700941
Linus Torvalds1da177e2005-04-16 15:20:36 -0700942 BT_DBG("sk %p", sk);
943
Marcel Holtmann2a517ca2009-02-16 03:20:31 +0100944 if (!addr || addr->sa_family != AF_BLUETOOTH)
945 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700946
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100947 memset(&la, 0, sizeof(la));
948 len = min_t(unsigned int, sizeof(la), alen);
949 memcpy(&la, addr, len);
950
Marcel Holtmann2a517ca2009-02-16 03:20:31 +0100951 if (la.l2_cid)
952 return -EINVAL;
953
954 lock_sock(sk);
955
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100956 if (sk->sk_type == SOCK_SEQPACKET && !la.l2_psm) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700957 err = -EINVAL;
958 goto done;
959 }
960
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -0300961 switch (sk->sk_state) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700962 case BT_CONNECT:
963 case BT_CONNECT2:
964 case BT_CONFIG:
965 /* Already connecting */
966 goto wait;
967
968 case BT_CONNECTED:
969 /* Already connected */
970 goto done;
971
972 case BT_OPEN:
973 case BT_BOUND:
974 /* Can connect */
975 break;
976
977 default:
978 err = -EBADFD;
979 goto done;
980 }
981
982 /* Set destination address and psm */
Marcel Holtmannf29972d2009-02-12 05:07:45 +0100983 bacpy(&bt_sk(sk)->dst, &la.l2_bdaddr);
984 l2cap_pi(sk)->psm = la.l2_psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700985
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -0300986 err = l2cap_do_connect(sk);
987 if (err)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700988 goto done;
989
990wait:
991 err = bt_sock_wait_state(sk, BT_CONNECTED,
992 sock_sndtimeo(sk, flags & O_NONBLOCK));
993done:
994 release_sock(sk);
995 return err;
996}
997
998static int l2cap_sock_listen(struct socket *sock, int backlog)
999{
1000 struct sock *sk = sock->sk;
1001 int err = 0;
1002
1003 BT_DBG("sk %p backlog %d", sk, backlog);
1004
1005 lock_sock(sk);
1006
1007 if (sk->sk_state != BT_BOUND || sock->type != SOCK_SEQPACKET) {
1008 err = -EBADFD;
1009 goto done;
1010 }
1011
1012 if (!l2cap_pi(sk)->psm) {
1013 bdaddr_t *src = &bt_sk(sk)->src;
1014 u16 psm;
1015
1016 err = -EINVAL;
1017
1018 write_lock_bh(&l2cap_sk_list.lock);
1019
1020 for (psm = 0x1001; psm < 0x1100; psm += 2)
Marcel Holtmannb4324b52009-06-07 18:06:51 +02001021 if (!__l2cap_get_sock_by_addr(cpu_to_le16(psm), src)) {
1022 l2cap_pi(sk)->psm = cpu_to_le16(psm);
1023 l2cap_pi(sk)->sport = cpu_to_le16(psm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001024 err = 0;
1025 break;
1026 }
1027
1028 write_unlock_bh(&l2cap_sk_list.lock);
1029
1030 if (err < 0)
1031 goto done;
1032 }
1033
1034 sk->sk_max_ack_backlog = backlog;
1035 sk->sk_ack_backlog = 0;
1036 sk->sk_state = BT_LISTEN;
1037
1038done:
1039 release_sock(sk);
1040 return err;
1041}
1042
1043static int l2cap_sock_accept(struct socket *sock, struct socket *newsock, int flags)
1044{
1045 DECLARE_WAITQUEUE(wait, current);
1046 struct sock *sk = sock->sk, *nsk;
1047 long timeo;
1048 int err = 0;
1049
Peter Zijlstrafcc70d52006-11-08 22:44:35 -08001050 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001051
1052 if (sk->sk_state != BT_LISTEN) {
1053 err = -EBADFD;
1054 goto done;
1055 }
1056
1057 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
1058
1059 BT_DBG("sk %p timeo %ld", sk, timeo);
1060
1061 /* Wait for an incoming connection. (wake-one). */
1062 add_wait_queue_exclusive(sk->sk_sleep, &wait);
1063 while (!(nsk = bt_accept_dequeue(sk, newsock))) {
1064 set_current_state(TASK_INTERRUPTIBLE);
1065 if (!timeo) {
1066 err = -EAGAIN;
1067 break;
1068 }
1069
1070 release_sock(sk);
1071 timeo = schedule_timeout(timeo);
Peter Zijlstrafcc70d52006-11-08 22:44:35 -08001072 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001073
1074 if (sk->sk_state != BT_LISTEN) {
1075 err = -EBADFD;
1076 break;
1077 }
1078
1079 if (signal_pending(current)) {
1080 err = sock_intr_errno(timeo);
1081 break;
1082 }
1083 }
1084 set_current_state(TASK_RUNNING);
1085 remove_wait_queue(sk->sk_sleep, &wait);
1086
1087 if (err)
1088 goto done;
1089
1090 newsock->state = SS_CONNECTED;
1091
1092 BT_DBG("new socket %p", nsk);
1093
1094done:
1095 release_sock(sk);
1096 return err;
1097}
1098
1099static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr, int *len, int peer)
1100{
1101 struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr;
1102 struct sock *sk = sock->sk;
1103
1104 BT_DBG("sock %p, sk %p", sock, sk);
1105
1106 addr->sa_family = AF_BLUETOOTH;
1107 *len = sizeof(struct sockaddr_l2);
1108
Marcel Holtmannf29972d2009-02-12 05:07:45 +01001109 if (peer) {
1110 la->l2_psm = l2cap_pi(sk)->psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001111 bacpy(&la->l2_bdaddr, &bt_sk(sk)->dst);
Marcel Holtmannb4324b52009-06-07 18:06:51 +02001112 la->l2_cid = cpu_to_le16(l2cap_pi(sk)->dcid);
Marcel Holtmannf29972d2009-02-12 05:07:45 +01001113 } else {
1114 la->l2_psm = l2cap_pi(sk)->sport;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001115 bacpy(&la->l2_bdaddr, &bt_sk(sk)->src);
Marcel Holtmannb4324b52009-06-07 18:06:51 +02001116 la->l2_cid = cpu_to_le16(l2cap_pi(sk)->scid);
Marcel Holtmannf29972d2009-02-12 05:07:45 +01001117 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001118
Linus Torvalds1da177e2005-04-16 15:20:36 -07001119 return 0;
1120}
1121
1122static inline int l2cap_do_send(struct sock *sk, struct msghdr *msg, int len)
1123{
1124 struct l2cap_conn *conn = l2cap_pi(sk)->conn;
1125 struct sk_buff *skb, **frag;
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -03001126 int err, hlen, count, sent = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001127 struct l2cap_hdr *lh;
1128
1129 BT_DBG("sk %p len %d", sk, len);
1130
1131 /* First fragment (with L2CAP header) */
1132 if (sk->sk_type == SOCK_DGRAM)
1133 hlen = L2CAP_HDR_SIZE + 2;
1134 else
1135 hlen = L2CAP_HDR_SIZE;
1136
1137 count = min_t(unsigned int, (conn->mtu - hlen), len);
1138
1139 skb = bt_skb_send_alloc(sk, hlen + count,
1140 msg->msg_flags & MSG_DONTWAIT, &err);
1141 if (!skb)
1142 return err;
1143
1144 /* Create L2CAP header */
1145 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07001146 lh->cid = cpu_to_le16(l2cap_pi(sk)->dcid);
1147 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001148
1149 if (sk->sk_type == SOCK_DGRAM)
Al Viro8e036fc2007-07-29 00:16:36 -07001150 put_unaligned(l2cap_pi(sk)->psm, (__le16 *) skb_put(skb, 2));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001151
1152 if (memcpy_fromiovec(skb_put(skb, count), msg->msg_iov, count)) {
1153 err = -EFAULT;
1154 goto fail;
1155 }
1156
1157 sent += count;
1158 len -= count;
1159
1160 /* Continuation fragments (no L2CAP header) */
1161 frag = &skb_shinfo(skb)->frag_list;
1162 while (len) {
1163 count = min_t(unsigned int, conn->mtu, len);
1164
1165 *frag = bt_skb_send_alloc(sk, count, msg->msg_flags & MSG_DONTWAIT, &err);
1166 if (!*frag)
1167 goto fail;
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001168
Linus Torvalds1da177e2005-04-16 15:20:36 -07001169 if (memcpy_fromiovec(skb_put(*frag, count), msg->msg_iov, count)) {
1170 err = -EFAULT;
1171 goto fail;
1172 }
1173
1174 sent += count;
1175 len -= count;
1176
1177 frag = &(*frag)->next;
1178 }
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -03001179 err = hci_send_acl(conn->hcon, skb, 0);
1180 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001181 goto fail;
1182
1183 return sent;
1184
1185fail:
1186 kfree_skb(skb);
1187 return err;
1188}
1189
1190static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len)
1191{
1192 struct sock *sk = sock->sk;
1193 int err = 0;
1194
1195 BT_DBG("sock %p, sk %p", sock, sk);
1196
Benjamin LaHaisec1cbe4b2005-12-13 23:22:19 -08001197 err = sock_error(sk);
1198 if (err)
1199 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001200
1201 if (msg->msg_flags & MSG_OOB)
1202 return -EOPNOTSUPP;
1203
1204 /* Check outgoing MTU */
1205 if (sk->sk_type != SOCK_RAW && len > l2cap_pi(sk)->omtu)
1206 return -EINVAL;
1207
1208 lock_sock(sk);
1209
1210 if (sk->sk_state == BT_CONNECTED)
1211 err = l2cap_do_send(sk, msg, len);
1212 else
1213 err = -ENOTCONN;
1214
1215 release_sock(sk);
1216 return err;
1217}
1218
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001219static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len, int flags)
1220{
1221 struct sock *sk = sock->sk;
1222
1223 lock_sock(sk);
1224
1225 if (sk->sk_state == BT_CONNECT2 && bt_sk(sk)->defer_setup) {
1226 struct l2cap_conn_rsp rsp;
1227
1228 sk->sk_state = BT_CONFIG;
1229
1230 rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid);
1231 rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid);
1232 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
1233 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
1234 l2cap_send_cmd(l2cap_pi(sk)->conn, l2cap_pi(sk)->ident,
1235 L2CAP_CONN_RSP, sizeof(rsp), &rsp);
1236
1237 release_sock(sk);
1238 return 0;
1239 }
1240
1241 release_sock(sk);
1242
1243 return bt_sock_recvmsg(iocb, sock, msg, len, flags);
1244}
1245
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001246static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __user *optval, int optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001247{
1248 struct sock *sk = sock->sk;
1249 struct l2cap_options opts;
Marcel Holtmannf29972d2009-02-12 05:07:45 +01001250 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001251 u32 opt;
1252
1253 BT_DBG("sk %p", sk);
1254
1255 lock_sock(sk);
1256
1257 switch (optname) {
1258 case L2CAP_OPTIONS:
Marcel Holtmann0878b662007-05-05 00:35:59 +02001259 opts.imtu = l2cap_pi(sk)->imtu;
1260 opts.omtu = l2cap_pi(sk)->omtu;
1261 opts.flush_to = l2cap_pi(sk)->flush_to;
Marcel Holtmann6464f352007-10-20 13:39:51 +02001262 opts.mode = L2CAP_MODE_BASIC;
Marcel Holtmann0878b662007-05-05 00:35:59 +02001263
Linus Torvalds1da177e2005-04-16 15:20:36 -07001264 len = min_t(unsigned int, sizeof(opts), optlen);
1265 if (copy_from_user((char *) &opts, optval, len)) {
1266 err = -EFAULT;
1267 break;
1268 }
Marcel Holtmann0878b662007-05-05 00:35:59 +02001269
Linus Torvalds1da177e2005-04-16 15:20:36 -07001270 l2cap_pi(sk)->imtu = opts.imtu;
1271 l2cap_pi(sk)->omtu = opts.omtu;
1272 break;
1273
1274 case L2CAP_LM:
1275 if (get_user(opt, (u32 __user *) optval)) {
1276 err = -EFAULT;
1277 break;
1278 }
1279
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001280 if (opt & L2CAP_LM_AUTH)
1281 l2cap_pi(sk)->sec_level = BT_SECURITY_LOW;
1282 if (opt & L2CAP_LM_ENCRYPT)
1283 l2cap_pi(sk)->sec_level = BT_SECURITY_MEDIUM;
1284 if (opt & L2CAP_LM_SECURE)
1285 l2cap_pi(sk)->sec_level = BT_SECURITY_HIGH;
1286
1287 l2cap_pi(sk)->role_switch = (opt & L2CAP_LM_MASTER);
1288 l2cap_pi(sk)->force_reliable = (opt & L2CAP_LM_RELIABLE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001289 break;
1290
1291 default:
1292 err = -ENOPROTOOPT;
1293 break;
1294 }
1295
1296 release_sock(sk);
1297 return err;
1298}
1299
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001300static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, int optlen)
1301{
1302 struct sock *sk = sock->sk;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001303 struct bt_security sec;
1304 int len, err = 0;
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001305 u32 opt;
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001306
1307 BT_DBG("sk %p", sk);
1308
1309 if (level == SOL_L2CAP)
1310 return l2cap_sock_setsockopt_old(sock, optname, optval, optlen);
1311
Marcel Holtmann0588d942009-01-16 10:06:13 +01001312 if (level != SOL_BLUETOOTH)
1313 return -ENOPROTOOPT;
1314
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001315 lock_sock(sk);
1316
1317 switch (optname) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001318 case BT_SECURITY:
Marcel Holtmann2526d3d2009-02-20 20:54:06 +01001319 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_RAW) {
Marcel Holtmann0588d942009-01-16 10:06:13 +01001320 err = -EINVAL;
1321 break;
1322 }
1323
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001324 sec.level = BT_SECURITY_LOW;
1325
1326 len = min_t(unsigned int, sizeof(sec), optlen);
1327 if (copy_from_user((char *) &sec, optval, len)) {
1328 err = -EFAULT;
1329 break;
1330 }
1331
1332 if (sec.level < BT_SECURITY_LOW ||
1333 sec.level > BT_SECURITY_HIGH) {
1334 err = -EINVAL;
1335 break;
1336 }
1337
1338 l2cap_pi(sk)->sec_level = sec.level;
1339 break;
1340
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001341 case BT_DEFER_SETUP:
1342 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
1343 err = -EINVAL;
1344 break;
1345 }
1346
1347 if (get_user(opt, (u32 __user *) optval)) {
1348 err = -EFAULT;
1349 break;
1350 }
1351
1352 bt_sk(sk)->defer_setup = opt;
1353 break;
1354
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001355 default:
1356 err = -ENOPROTOOPT;
1357 break;
1358 }
1359
1360 release_sock(sk);
1361 return err;
1362}
1363
1364static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, char __user *optval, int __user *optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001365{
1366 struct sock *sk = sock->sk;
1367 struct l2cap_options opts;
1368 struct l2cap_conninfo cinfo;
1369 int len, err = 0;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001370 u32 opt;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001371
1372 BT_DBG("sk %p", sk);
1373
1374 if (get_user(len, optlen))
1375 return -EFAULT;
1376
1377 lock_sock(sk);
1378
1379 switch (optname) {
1380 case L2CAP_OPTIONS:
1381 opts.imtu = l2cap_pi(sk)->imtu;
1382 opts.omtu = l2cap_pi(sk)->omtu;
1383 opts.flush_to = l2cap_pi(sk)->flush_to;
Marcel Holtmann6464f352007-10-20 13:39:51 +02001384 opts.mode = L2CAP_MODE_BASIC;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001385
1386 len = min_t(unsigned int, len, sizeof(opts));
1387 if (copy_to_user(optval, (char *) &opts, len))
1388 err = -EFAULT;
1389
1390 break;
1391
1392 case L2CAP_LM:
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001393 switch (l2cap_pi(sk)->sec_level) {
1394 case BT_SECURITY_LOW:
1395 opt = L2CAP_LM_AUTH;
1396 break;
1397 case BT_SECURITY_MEDIUM:
1398 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT;
1399 break;
1400 case BT_SECURITY_HIGH:
1401 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
1402 L2CAP_LM_SECURE;
1403 break;
1404 default:
1405 opt = 0;
1406 break;
1407 }
1408
1409 if (l2cap_pi(sk)->role_switch)
1410 opt |= L2CAP_LM_MASTER;
1411
1412 if (l2cap_pi(sk)->force_reliable)
1413 opt |= L2CAP_LM_RELIABLE;
1414
1415 if (put_user(opt, (u32 __user *) optval))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001416 err = -EFAULT;
1417 break;
1418
1419 case L2CAP_CONNINFO:
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001420 if (sk->sk_state != BT_CONNECTED &&
1421 !(sk->sk_state == BT_CONNECT2 &&
1422 bt_sk(sk)->defer_setup)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001423 err = -ENOTCONN;
1424 break;
1425 }
1426
1427 cinfo.hci_handle = l2cap_pi(sk)->conn->hcon->handle;
1428 memcpy(cinfo.dev_class, l2cap_pi(sk)->conn->hcon->dev_class, 3);
1429
1430 len = min_t(unsigned int, len, sizeof(cinfo));
1431 if (copy_to_user(optval, (char *) &cinfo, len))
1432 err = -EFAULT;
1433
1434 break;
1435
1436 default:
1437 err = -ENOPROTOOPT;
1438 break;
1439 }
1440
1441 release_sock(sk);
1442 return err;
1443}
1444
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001445static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen)
1446{
1447 struct sock *sk = sock->sk;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001448 struct bt_security sec;
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001449 int len, err = 0;
1450
1451 BT_DBG("sk %p", sk);
1452
1453 if (level == SOL_L2CAP)
1454 return l2cap_sock_getsockopt_old(sock, optname, optval, optlen);
1455
Marcel Holtmann0588d942009-01-16 10:06:13 +01001456 if (level != SOL_BLUETOOTH)
1457 return -ENOPROTOOPT;
1458
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001459 if (get_user(len, optlen))
1460 return -EFAULT;
1461
1462 lock_sock(sk);
1463
1464 switch (optname) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001465 case BT_SECURITY:
Marcel Holtmann2526d3d2009-02-20 20:54:06 +01001466 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_RAW) {
Marcel Holtmann0588d942009-01-16 10:06:13 +01001467 err = -EINVAL;
1468 break;
1469 }
1470
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001471 sec.level = l2cap_pi(sk)->sec_level;
1472
1473 len = min_t(unsigned int, len, sizeof(sec));
1474 if (copy_to_user(optval, (char *) &sec, len))
1475 err = -EFAULT;
1476
1477 break;
1478
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001479 case BT_DEFER_SETUP:
1480 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
1481 err = -EINVAL;
1482 break;
1483 }
1484
1485 if (put_user(bt_sk(sk)->defer_setup, (u32 __user *) optval))
1486 err = -EFAULT;
1487
1488 break;
1489
Marcel Holtmannd58daf42009-01-15 21:52:14 +01001490 default:
1491 err = -ENOPROTOOPT;
1492 break;
1493 }
1494
1495 release_sock(sk);
1496 return err;
1497}
1498
Linus Torvalds1da177e2005-04-16 15:20:36 -07001499static int l2cap_sock_shutdown(struct socket *sock, int how)
1500{
1501 struct sock *sk = sock->sk;
1502 int err = 0;
1503
1504 BT_DBG("sock %p, sk %p", sock, sk);
1505
1506 if (!sk)
1507 return 0;
1508
1509 lock_sock(sk);
1510 if (!sk->sk_shutdown) {
1511 sk->sk_shutdown = SHUTDOWN_MASK;
1512 l2cap_sock_clear_timer(sk);
1513 __l2cap_sock_close(sk, 0);
1514
1515 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime)
Marcel Holtmannb1235d72008-07-14 20:13:54 +02001516 err = bt_sock_wait_state(sk, BT_CLOSED,
1517 sk->sk_lingertime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001518 }
1519 release_sock(sk);
1520 return err;
1521}
1522
1523static int l2cap_sock_release(struct socket *sock)
1524{
1525 struct sock *sk = sock->sk;
1526 int err;
1527
1528 BT_DBG("sock %p, sk %p", sock, sk);
1529
1530 if (!sk)
1531 return 0;
1532
1533 err = l2cap_sock_shutdown(sock, 2);
1534
1535 sock_orphan(sk);
1536 l2cap_sock_kill(sk);
1537 return err;
1538}
1539
Linus Torvalds1da177e2005-04-16 15:20:36 -07001540static void l2cap_chan_ready(struct sock *sk)
1541{
1542 struct sock *parent = bt_sk(sk)->parent;
1543
1544 BT_DBG("sk %p, parent %p", sk, parent);
1545
1546 l2cap_pi(sk)->conf_state = 0;
1547 l2cap_sock_clear_timer(sk);
1548
1549 if (!parent) {
1550 /* Outgoing channel.
1551 * Wake up socket sleeping on connect.
1552 */
1553 sk->sk_state = BT_CONNECTED;
1554 sk->sk_state_change(sk);
1555 } else {
1556 /* Incoming channel.
1557 * Wake up socket sleeping on accept.
1558 */
1559 parent->sk_data_ready(parent, 0);
1560 }
1561}
1562
1563/* Copy frame to all raw sockets on that connection */
1564static void l2cap_raw_recv(struct l2cap_conn *conn, struct sk_buff *skb)
1565{
1566 struct l2cap_chan_list *l = &conn->chan_list;
1567 struct sk_buff *nskb;
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -03001568 struct sock *sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001569
1570 BT_DBG("conn %p", conn);
1571
1572 read_lock(&l->lock);
1573 for (sk = l->head; sk; sk = l2cap_pi(sk)->next_c) {
1574 if (sk->sk_type != SOCK_RAW)
1575 continue;
1576
1577 /* Don't send frame to the socket it came from */
1578 if (skb->sk == sk)
1579 continue;
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -03001580 nskb = skb_clone(skb, GFP_ATOMIC);
1581 if (!nskb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001582 continue;
1583
1584 if (sock_queue_rcv_skb(sk, nskb))
1585 kfree_skb(nskb);
1586 }
1587 read_unlock(&l->lock);
1588}
1589
1590/* ---- L2CAP signalling commands ---- */
1591static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn,
1592 u8 code, u8 ident, u16 dlen, void *data)
1593{
1594 struct sk_buff *skb, **frag;
1595 struct l2cap_cmd_hdr *cmd;
1596 struct l2cap_hdr *lh;
1597 int len, count;
1598
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -03001599 BT_DBG("conn %p, code 0x%2.2x, ident 0x%2.2x, len %d",
1600 conn, code, ident, dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001601
1602 len = L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE + dlen;
1603 count = min_t(unsigned int, conn->mtu, len);
1604
1605 skb = bt_skb_alloc(count, GFP_ATOMIC);
1606 if (!skb)
1607 return NULL;
1608
1609 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07001610 lh->len = cpu_to_le16(L2CAP_CMD_HDR_SIZE + dlen);
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03001611 lh->cid = cpu_to_le16(L2CAP_CID_SIGNALING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001612
1613 cmd = (struct l2cap_cmd_hdr *) skb_put(skb, L2CAP_CMD_HDR_SIZE);
1614 cmd->code = code;
1615 cmd->ident = ident;
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07001616 cmd->len = cpu_to_le16(dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001617
1618 if (dlen) {
1619 count -= L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE;
1620 memcpy(skb_put(skb, count), data, count);
1621 data += count;
1622 }
1623
1624 len -= skb->len;
1625
1626 /* Continuation fragments (no L2CAP header) */
1627 frag = &skb_shinfo(skb)->frag_list;
1628 while (len) {
1629 count = min_t(unsigned int, conn->mtu, len);
1630
1631 *frag = bt_skb_alloc(count, GFP_ATOMIC);
1632 if (!*frag)
1633 goto fail;
1634
1635 memcpy(skb_put(*frag, count), data, count);
1636
1637 len -= count;
1638 data += count;
1639
1640 frag = &(*frag)->next;
1641 }
1642
1643 return skb;
1644
1645fail:
1646 kfree_skb(skb);
1647 return NULL;
1648}
1649
1650static inline int l2cap_get_conf_opt(void **ptr, int *type, int *olen, unsigned long *val)
1651{
1652 struct l2cap_conf_opt *opt = *ptr;
1653 int len;
1654
1655 len = L2CAP_CONF_OPT_SIZE + opt->len;
1656 *ptr += len;
1657
1658 *type = opt->type;
1659 *olen = opt->len;
1660
1661 switch (opt->len) {
1662 case 1:
1663 *val = *((u8 *) opt->val);
1664 break;
1665
1666 case 2:
Marcel Holtmann861d6882007-10-20 13:37:06 +02001667 *val = __le16_to_cpu(*((__le16 *) opt->val));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001668 break;
1669
1670 case 4:
Marcel Holtmann861d6882007-10-20 13:37:06 +02001671 *val = __le32_to_cpu(*((__le32 *) opt->val));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001672 break;
1673
1674 default:
1675 *val = (unsigned long) opt->val;
1676 break;
1677 }
1678
1679 BT_DBG("type 0x%2.2x len %d val 0x%lx", *type, opt->len, *val);
1680 return len;
1681}
1682
Linus Torvalds1da177e2005-04-16 15:20:36 -07001683static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val)
1684{
1685 struct l2cap_conf_opt *opt = *ptr;
1686
1687 BT_DBG("type 0x%2.2x len %d val 0x%lx", type, len, val);
1688
1689 opt->type = type;
1690 opt->len = len;
1691
1692 switch (len) {
1693 case 1:
1694 *((u8 *) opt->val) = val;
1695 break;
1696
1697 case 2:
Al Viro8e036fc2007-07-29 00:16:36 -07001698 *((__le16 *) opt->val) = cpu_to_le16(val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001699 break;
1700
1701 case 4:
Al Viro8e036fc2007-07-29 00:16:36 -07001702 *((__le32 *) opt->val) = cpu_to_le32(val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001703 break;
1704
1705 default:
1706 memcpy(opt->val, (void *) val, len);
1707 break;
1708 }
1709
1710 *ptr += L2CAP_CONF_OPT_SIZE + len;
1711}
1712
1713static int l2cap_build_conf_req(struct sock *sk, void *data)
1714{
1715 struct l2cap_pinfo *pi = l2cap_pi(sk);
1716 struct l2cap_conf_req *req = data;
1717 void *ptr = req->data;
1718
1719 BT_DBG("sk %p", sk);
1720
1721 if (pi->imtu != L2CAP_DEFAULT_MTU)
1722 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, pi->imtu);
1723
1724 /* FIXME: Need actual value of the flush timeout */
1725 //if (flush_to != L2CAP_DEFAULT_FLUSH_TO)
1726 // l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO, 2, pi->flush_to);
1727
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07001728 req->dcid = cpu_to_le16(pi->dcid);
1729 req->flags = cpu_to_le16(0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001730
1731 return ptr - data;
1732}
1733
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001734static int l2cap_parse_conf_req(struct sock *sk, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001735{
1736 struct l2cap_pinfo *pi = l2cap_pi(sk);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001737 struct l2cap_conf_rsp *rsp = data;
1738 void *ptr = rsp->data;
1739 void *req = pi->conf_req;
1740 int len = pi->conf_len;
1741 int type, hint, olen;
1742 unsigned long val;
Marcel Holtmann6464f352007-10-20 13:39:51 +02001743 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Marcel Holtmann861d6882007-10-20 13:37:06 +02001744 u16 mtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001745 u16 result = L2CAP_CONF_SUCCESS;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001746
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001747 BT_DBG("sk %p", sk);
Marcel Holtmann820ae1b2006-11-18 22:15:00 +01001748
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001749 while (len >= L2CAP_CONF_OPT_SIZE) {
1750 len -= l2cap_get_conf_opt(&req, &type, &olen, &val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001751
Gustavo F. Padovan589d2742009-04-20 01:31:07 -03001752 hint = type & L2CAP_CONF_HINT;
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07001753 type &= L2CAP_CONF_MASK;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001754
1755 switch (type) {
1756 case L2CAP_CONF_MTU:
Marcel Holtmann861d6882007-10-20 13:37:06 +02001757 mtu = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001758 break;
1759
1760 case L2CAP_CONF_FLUSH_TO:
1761 pi->flush_to = val;
1762 break;
1763
1764 case L2CAP_CONF_QOS:
1765 break;
1766
Marcel Holtmann6464f352007-10-20 13:39:51 +02001767 case L2CAP_CONF_RFC:
1768 if (olen == sizeof(rfc))
1769 memcpy(&rfc, (void *) val, olen);
1770 break;
1771
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001772 default:
1773 if (hint)
1774 break;
1775
1776 result = L2CAP_CONF_UNKNOWN;
1777 *((u8 *) ptr++) = type;
1778 break;
1779 }
1780 }
1781
1782 if (result == L2CAP_CONF_SUCCESS) {
1783 /* Configure output options and let the other side know
1784 * which ones we don't like. */
1785
Marcel Holtmann6464f352007-10-20 13:39:51 +02001786 if (rfc.mode == L2CAP_MODE_BASIC) {
1787 if (mtu < pi->omtu)
1788 result = L2CAP_CONF_UNACCEPT;
1789 else {
1790 pi->omtu = mtu;
1791 pi->conf_state |= L2CAP_CONF_OUTPUT_DONE;
1792 }
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001793
Marcel Holtmann6464f352007-10-20 13:39:51 +02001794 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, pi->omtu);
1795 } else {
1796 result = L2CAP_CONF_UNACCEPT;
1797
1798 memset(&rfc, 0, sizeof(rfc));
1799 rfc.mode = L2CAP_MODE_BASIC;
1800
1801 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
1802 sizeof(rfc), (unsigned long) &rfc);
1803 }
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001804 }
1805
1806 rsp->scid = cpu_to_le16(pi->dcid);
1807 rsp->result = cpu_to_le16(result);
1808 rsp->flags = cpu_to_le16(0x0000);
1809
1810 return ptr - data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001811}
1812
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001813static int l2cap_build_conf_rsp(struct sock *sk, void *data, u16 result, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001814{
1815 struct l2cap_conf_rsp *rsp = data;
1816 void *ptr = rsp->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001817
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001818 BT_DBG("sk %p", sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001819
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07001820 rsp->scid = cpu_to_le16(l2cap_pi(sk)->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02001821 rsp->result = cpu_to_le16(result);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07001822 rsp->flags = cpu_to_le16(flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001823
1824 return ptr - data;
1825}
1826
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001827static inline int l2cap_command_rej(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
1828{
1829 struct l2cap_cmd_rej *rej = (struct l2cap_cmd_rej *) data;
1830
1831 if (rej->reason != 0x0000)
1832 return 0;
1833
1834 if ((conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) &&
1835 cmd->ident == conn->info_ident) {
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001836 del_timer(&conn->info_timer);
Marcel Holtmann984947d2009-02-06 23:35:19 +01001837
1838 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01001839 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01001840
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001841 l2cap_conn_start(conn);
1842 }
1843
1844 return 0;
1845}
1846
Linus Torvalds1da177e2005-04-16 15:20:36 -07001847static inline int l2cap_connect_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
1848{
1849 struct l2cap_chan_list *list = &conn->chan_list;
1850 struct l2cap_conn_req *req = (struct l2cap_conn_req *) data;
1851 struct l2cap_conn_rsp rsp;
1852 struct sock *sk, *parent;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02001853 int result, status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001854
1855 u16 dcid = 0, scid = __le16_to_cpu(req->scid);
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02001856 __le16 psm = req->psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001857
1858 BT_DBG("psm 0x%2.2x scid 0x%4.4x", psm, scid);
1859
1860 /* Check if we have socket listening on psm */
1861 parent = l2cap_get_sock_by_psm(BT_LISTEN, psm, conn->src);
1862 if (!parent) {
1863 result = L2CAP_CR_BAD_PSM;
1864 goto sendresp;
1865 }
1866
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02001867 /* Check if the ACL is secure enough (if not SDP) */
1868 if (psm != cpu_to_le16(0x0001) &&
1869 !hci_conn_check_link_mode(conn->hcon)) {
Marcel Holtmann2950f212009-02-12 14:02:50 +01001870 conn->disc_reason = 0x05;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02001871 result = L2CAP_CR_SEC_BLOCK;
1872 goto response;
1873 }
1874
Linus Torvalds1da177e2005-04-16 15:20:36 -07001875 result = L2CAP_CR_NO_MEM;
1876
1877 /* Check for backlog size */
1878 if (sk_acceptq_is_full(parent)) {
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001879 BT_DBG("backlog full %d", parent->sk_ack_backlog);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001880 goto response;
1881 }
1882
YOSHIFUJI Hideaki3b1e0a62008-03-26 02:26:21 +09001883 sk = l2cap_sock_alloc(sock_net(parent), NULL, BTPROTO_L2CAP, GFP_ATOMIC);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001884 if (!sk)
1885 goto response;
1886
Marcel Holtmannfd1278d2006-07-12 23:00:07 +02001887 write_lock_bh(&list->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001888
1889 /* Check if we already have channel with that dcid */
1890 if (__l2cap_get_chan_by_dcid(list, scid)) {
Marcel Holtmannfd1278d2006-07-12 23:00:07 +02001891 write_unlock_bh(&list->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001892 sock_set_flag(sk, SOCK_ZAPPED);
1893 l2cap_sock_kill(sk);
1894 goto response;
1895 }
1896
1897 hci_conn_hold(conn->hcon);
1898
1899 l2cap_sock_init(sk, parent);
1900 bacpy(&bt_sk(sk)->src, conn->src);
1901 bacpy(&bt_sk(sk)->dst, conn->dst);
1902 l2cap_pi(sk)->psm = psm;
1903 l2cap_pi(sk)->dcid = scid;
1904
1905 __l2cap_chan_add(conn, sk, parent);
1906 dcid = l2cap_pi(sk)->scid;
1907
1908 l2cap_sock_set_timer(sk, sk->sk_sndtimeo);
1909
Linus Torvalds1da177e2005-04-16 15:20:36 -07001910 l2cap_pi(sk)->ident = cmd->ident;
1911
Marcel Holtmann984947d2009-02-06 23:35:19 +01001912 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01001913 if (l2cap_check_security(sk)) {
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001914 if (bt_sk(sk)->defer_setup) {
1915 sk->sk_state = BT_CONNECT2;
1916 result = L2CAP_CR_PEND;
1917 status = L2CAP_CS_AUTHOR_PEND;
1918 parent->sk_data_ready(parent, 0);
1919 } else {
1920 sk->sk_state = BT_CONFIG;
1921 result = L2CAP_CR_SUCCESS;
1922 status = L2CAP_CS_NO_INFO;
1923 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001924 } else {
1925 sk->sk_state = BT_CONNECT2;
1926 result = L2CAP_CR_PEND;
1927 status = L2CAP_CS_AUTHEN_PEND;
1928 }
1929 } else {
1930 sk->sk_state = BT_CONNECT2;
1931 result = L2CAP_CR_PEND;
1932 status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001933 }
1934
Marcel Holtmannfd1278d2006-07-12 23:00:07 +02001935 write_unlock_bh(&list->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001936
1937response:
1938 bh_unlock_sock(parent);
1939
1940sendresp:
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07001941 rsp.scid = cpu_to_le16(scid);
1942 rsp.dcid = cpu_to_le16(dcid);
1943 rsp.result = cpu_to_le16(result);
1944 rsp.status = cpu_to_le16(status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001945 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONN_RSP, sizeof(rsp), &rsp);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001946
1947 if (result == L2CAP_CR_PEND && status == L2CAP_CS_NO_INFO) {
1948 struct l2cap_info_req info;
1949 info.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
1950
1951 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
1952 conn->info_ident = l2cap_get_ident(conn);
1953
1954 mod_timer(&conn->info_timer, jiffies +
1955 msecs_to_jiffies(L2CAP_INFO_TIMEOUT));
1956
1957 l2cap_send_cmd(conn, conn->info_ident,
1958 L2CAP_INFO_REQ, sizeof(info), &info);
1959 }
1960
Linus Torvalds1da177e2005-04-16 15:20:36 -07001961 return 0;
1962}
1963
1964static inline int l2cap_connect_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
1965{
1966 struct l2cap_conn_rsp *rsp = (struct l2cap_conn_rsp *) data;
1967 u16 scid, dcid, result, status;
1968 struct sock *sk;
1969 u8 req[128];
1970
1971 scid = __le16_to_cpu(rsp->scid);
1972 dcid = __le16_to_cpu(rsp->dcid);
1973 result = __le16_to_cpu(rsp->result);
1974 status = __le16_to_cpu(rsp->status);
1975
1976 BT_DBG("dcid 0x%4.4x scid 0x%4.4x result 0x%2.2x status 0x%2.2x", dcid, scid, result, status);
1977
1978 if (scid) {
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -03001979 sk = l2cap_get_chan_by_scid(&conn->chan_list, scid);
1980 if (!sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001981 return 0;
1982 } else {
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -03001983 sk = l2cap_get_chan_by_ident(&conn->chan_list, cmd->ident);
1984 if (!sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001985 return 0;
1986 }
1987
1988 switch (result) {
1989 case L2CAP_CR_SUCCESS:
1990 sk->sk_state = BT_CONFIG;
1991 l2cap_pi(sk)->ident = 0;
1992 l2cap_pi(sk)->dcid = dcid;
1993 l2cap_pi(sk)->conf_state |= L2CAP_CONF_REQ_SENT;
1994
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01001995 l2cap_pi(sk)->conf_state &= ~L2CAP_CONF_CONNECT_PEND;
1996
Linus Torvalds1da177e2005-04-16 15:20:36 -07001997 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
1998 l2cap_build_conf_req(sk, req), req);
1999 break;
2000
2001 case L2CAP_CR_PEND:
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01002002 l2cap_pi(sk)->conf_state |= L2CAP_CONF_CONNECT_PEND;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002003 break;
2004
2005 default:
2006 l2cap_chan_del(sk, ECONNREFUSED);
2007 break;
2008 }
2009
2010 bh_unlock_sock(sk);
2011 return 0;
2012}
2013
Al Viro88219a02007-07-29 00:17:25 -07002014static 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 -07002015{
2016 struct l2cap_conf_req *req = (struct l2cap_conf_req *) data;
2017 u16 dcid, flags;
2018 u8 rsp[64];
2019 struct sock *sk;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002020 int len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002021
2022 dcid = __le16_to_cpu(req->dcid);
2023 flags = __le16_to_cpu(req->flags);
2024
2025 BT_DBG("dcid 0x%4.4x flags 0x%2.2x", dcid, flags);
2026
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -03002027 sk = l2cap_get_chan_by_scid(&conn->chan_list, dcid);
2028 if (!sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002029 return -ENOENT;
2030
Marcel Holtmann354f60a2006-11-18 22:15:20 +01002031 if (sk->sk_state == BT_DISCONN)
2032 goto unlock;
2033
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002034 /* Reject if config buffer is too small. */
Al Viro88219a02007-07-29 00:17:25 -07002035 len = cmd_len - sizeof(*req);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002036 if (l2cap_pi(sk)->conf_len + len > sizeof(l2cap_pi(sk)->conf_req)) {
2037 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
2038 l2cap_build_conf_rsp(sk, rsp,
2039 L2CAP_CONF_REJECT, flags), rsp);
2040 goto unlock;
2041 }
2042
2043 /* Store config. */
2044 memcpy(l2cap_pi(sk)->conf_req + l2cap_pi(sk)->conf_len, req->data, len);
2045 l2cap_pi(sk)->conf_len += len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002046
2047 if (flags & 0x0001) {
2048 /* Incomplete config. Send empty response. */
2049 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002050 l2cap_build_conf_rsp(sk, rsp,
2051 L2CAP_CONF_SUCCESS, 0x0001), rsp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002052 goto unlock;
2053 }
2054
2055 /* Complete config. */
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002056 len = l2cap_parse_conf_req(sk, rsp);
2057 if (len < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002058 goto unlock;
2059
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002060 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp);
2061
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02002062 /* Reset config buffer. */
2063 l2cap_pi(sk)->conf_len = 0;
2064
Marcel Holtmann876d9482007-10-20 13:35:42 +02002065 if (!(l2cap_pi(sk)->conf_state & L2CAP_CONF_OUTPUT_DONE))
2066 goto unlock;
2067
Linus Torvalds1da177e2005-04-16 15:20:36 -07002068 if (l2cap_pi(sk)->conf_state & L2CAP_CONF_INPUT_DONE) {
2069 sk->sk_state = BT_CONNECTED;
2070 l2cap_chan_ready(sk);
Marcel Holtmann876d9482007-10-20 13:35:42 +02002071 goto unlock;
2072 }
2073
2074 if (!(l2cap_pi(sk)->conf_state & L2CAP_CONF_REQ_SENT)) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02002075 u8 buf[64];
Linus Torvalds1da177e2005-04-16 15:20:36 -07002076 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Marcel Holtmann79d554a2008-07-14 20:13:44 +02002077 l2cap_build_conf_req(sk, buf), buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002078 }
2079
2080unlock:
2081 bh_unlock_sock(sk);
2082 return 0;
2083}
2084
2085static inline int l2cap_config_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
2086{
2087 struct l2cap_conf_rsp *rsp = (struct l2cap_conf_rsp *)data;
2088 u16 scid, flags, result;
2089 struct sock *sk;
2090
2091 scid = __le16_to_cpu(rsp->scid);
2092 flags = __le16_to_cpu(rsp->flags);
2093 result = __le16_to_cpu(rsp->result);
2094
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -03002095 BT_DBG("scid 0x%4.4x flags 0x%2.2x result 0x%2.2x",
2096 scid, flags, result);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002097
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -03002098 sk = l2cap_get_chan_by_scid(&conn->chan_list, scid);
2099 if (!sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002100 return 0;
2101
2102 switch (result) {
2103 case L2CAP_CONF_SUCCESS:
2104 break;
2105
2106 case L2CAP_CONF_UNACCEPT:
2107 if (++l2cap_pi(sk)->conf_retry < L2CAP_CONF_MAX_RETRIES) {
2108 char req[128];
2109 /* It does not make sense to adjust L2CAP parameters
2110 * that are currently defined in the spec. We simply
2111 * resend config request that we sent earlier. It is
2112 * stupid, but it helps qualification testing which
2113 * expects at least some response from us. */
2114 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
2115 l2cap_build_conf_req(sk, req), req);
2116 goto done;
2117 }
2118
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09002119 default:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002120 sk->sk_state = BT_DISCONN;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02002121 sk->sk_err = ECONNRESET;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002122 l2cap_sock_set_timer(sk, HZ * 5);
2123 {
2124 struct l2cap_disconn_req req;
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002125 req.dcid = cpu_to_le16(l2cap_pi(sk)->dcid);
2126 req.scid = cpu_to_le16(l2cap_pi(sk)->scid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002127 l2cap_send_cmd(conn, l2cap_get_ident(conn),
2128 L2CAP_DISCONN_REQ, sizeof(req), &req);
2129 }
2130 goto done;
2131 }
2132
2133 if (flags & 0x01)
2134 goto done;
2135
Linus Torvalds1da177e2005-04-16 15:20:36 -07002136 l2cap_pi(sk)->conf_state |= L2CAP_CONF_INPUT_DONE;
2137
2138 if (l2cap_pi(sk)->conf_state & L2CAP_CONF_OUTPUT_DONE) {
2139 sk->sk_state = BT_CONNECTED;
2140 l2cap_chan_ready(sk);
2141 }
2142
2143done:
2144 bh_unlock_sock(sk);
2145 return 0;
2146}
2147
2148static inline int l2cap_disconnect_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
2149{
2150 struct l2cap_disconn_req *req = (struct l2cap_disconn_req *) data;
2151 struct l2cap_disconn_rsp rsp;
2152 u16 dcid, scid;
2153 struct sock *sk;
2154
2155 scid = __le16_to_cpu(req->scid);
2156 dcid = __le16_to_cpu(req->dcid);
2157
2158 BT_DBG("scid 0x%4.4x dcid 0x%4.4x", scid, dcid);
2159
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -03002160 sk = l2cap_get_chan_by_scid(&conn->chan_list, dcid);
2161 if (!sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002162 return 0;
2163
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002164 rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid);
2165 rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002166 l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp);
2167
2168 sk->sk_shutdown = SHUTDOWN_MASK;
2169
2170 l2cap_chan_del(sk, ECONNRESET);
2171 bh_unlock_sock(sk);
2172
2173 l2cap_sock_kill(sk);
2174 return 0;
2175}
2176
2177static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
2178{
2179 struct l2cap_disconn_rsp *rsp = (struct l2cap_disconn_rsp *) data;
2180 u16 dcid, scid;
2181 struct sock *sk;
2182
2183 scid = __le16_to_cpu(rsp->scid);
2184 dcid = __le16_to_cpu(rsp->dcid);
2185
2186 BT_DBG("dcid 0x%4.4x scid 0x%4.4x", dcid, scid);
2187
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -03002188 sk = l2cap_get_chan_by_scid(&conn->chan_list, scid);
2189 if (!sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002190 return 0;
2191
2192 l2cap_chan_del(sk, 0);
2193 bh_unlock_sock(sk);
2194
2195 l2cap_sock_kill(sk);
2196 return 0;
2197}
2198
2199static inline int l2cap_information_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
2200{
2201 struct l2cap_info_req *req = (struct l2cap_info_req *) data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002202 u16 type;
2203
2204 type = __le16_to_cpu(req->type);
2205
2206 BT_DBG("type 0x%4.4x", type);
2207
Marcel Holtmannf0709e02007-10-20 13:38:51 +02002208 if (type == L2CAP_IT_FEAT_MASK) {
2209 u8 buf[8];
Marcel Holtmann44dd46d2009-05-02 19:09:01 -07002210 u32 feat_mask = l2cap_feat_mask;
Marcel Holtmannf0709e02007-10-20 13:38:51 +02002211 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
2212 rsp->type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
2213 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
Marcel Holtmann44dd46d2009-05-02 19:09:01 -07002214 if (enable_ertm)
2215 feat_mask |= L2CAP_FEAT_ERTM;
2216 put_unaligned(cpu_to_le32(feat_mask), (__le32 *) rsp->data);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02002217 l2cap_send_cmd(conn, cmd->ident,
2218 L2CAP_INFO_RSP, sizeof(buf), buf);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01002219 } else if (type == L2CAP_IT_FIXED_CHAN) {
2220 u8 buf[12];
2221 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
2222 rsp->type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
2223 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
2224 memcpy(buf + 4, l2cap_fixed_chan, 8);
2225 l2cap_send_cmd(conn, cmd->ident,
2226 L2CAP_INFO_RSP, sizeof(buf), buf);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02002227 } else {
2228 struct l2cap_info_rsp rsp;
2229 rsp.type = cpu_to_le16(type);
2230 rsp.result = cpu_to_le16(L2CAP_IR_NOTSUPP);
2231 l2cap_send_cmd(conn, cmd->ident,
2232 L2CAP_INFO_RSP, sizeof(rsp), &rsp);
2233 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002234
2235 return 0;
2236}
2237
2238static inline int l2cap_information_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data)
2239{
2240 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) data;
2241 u16 type, result;
2242
2243 type = __le16_to_cpu(rsp->type);
2244 result = __le16_to_cpu(rsp->result);
2245
2246 BT_DBG("type 0x%4.4x result 0x%2.2x", type, result);
2247
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02002248 del_timer(&conn->info_timer);
2249
Marcel Holtmann984947d2009-02-06 23:35:19 +01002250 if (type == L2CAP_IT_FEAT_MASK) {
Harvey Harrison83985312008-05-02 16:25:46 -07002251 conn->feat_mask = get_unaligned_le32(rsp->data);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02002252
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07002253 if (conn->feat_mask & L2CAP_FEAT_FIXED_CHAN) {
Marcel Holtmanne1027a72009-02-09 09:18:02 +01002254 struct l2cap_info_req req;
2255 req.type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
2256
2257 conn->info_ident = l2cap_get_ident(conn);
2258
2259 l2cap_send_cmd(conn, conn->info_ident,
2260 L2CAP_INFO_REQ, sizeof(req), &req);
2261 } else {
2262 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
2263 conn->info_ident = 0;
2264
2265 l2cap_conn_start(conn);
2266 }
2267 } else if (type == L2CAP_IT_FIXED_CHAN) {
Marcel Holtmann984947d2009-02-06 23:35:19 +01002268 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01002269 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01002270
2271 l2cap_conn_start(conn);
2272 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02002273
Linus Torvalds1da177e2005-04-16 15:20:36 -07002274 return 0;
2275}
2276
2277static inline void l2cap_sig_channel(struct l2cap_conn *conn, struct sk_buff *skb)
2278{
2279 u8 *data = skb->data;
2280 int len = skb->len;
2281 struct l2cap_cmd_hdr cmd;
2282 int err = 0;
2283
2284 l2cap_raw_recv(conn, skb);
2285
2286 while (len >= L2CAP_CMD_HDR_SIZE) {
Al Viro88219a02007-07-29 00:17:25 -07002287 u16 cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002288 memcpy(&cmd, data, L2CAP_CMD_HDR_SIZE);
2289 data += L2CAP_CMD_HDR_SIZE;
2290 len -= L2CAP_CMD_HDR_SIZE;
2291
Al Viro88219a02007-07-29 00:17:25 -07002292 cmd_len = le16_to_cpu(cmd.len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002293
Al Viro88219a02007-07-29 00:17:25 -07002294 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 -07002295
Al Viro88219a02007-07-29 00:17:25 -07002296 if (cmd_len > len || !cmd.ident) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002297 BT_DBG("corrupted command");
2298 break;
2299 }
2300
2301 switch (cmd.code) {
2302 case L2CAP_COMMAND_REJ:
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02002303 l2cap_command_rej(conn, &cmd, data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002304 break;
2305
2306 case L2CAP_CONN_REQ:
2307 err = l2cap_connect_req(conn, &cmd, data);
2308 break;
2309
2310 case L2CAP_CONN_RSP:
2311 err = l2cap_connect_rsp(conn, &cmd, data);
2312 break;
2313
2314 case L2CAP_CONF_REQ:
Al Viro88219a02007-07-29 00:17:25 -07002315 err = l2cap_config_req(conn, &cmd, cmd_len, data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002316 break;
2317
2318 case L2CAP_CONF_RSP:
2319 err = l2cap_config_rsp(conn, &cmd, data);
2320 break;
2321
2322 case L2CAP_DISCONN_REQ:
2323 err = l2cap_disconnect_req(conn, &cmd, data);
2324 break;
2325
2326 case L2CAP_DISCONN_RSP:
2327 err = l2cap_disconnect_rsp(conn, &cmd, data);
2328 break;
2329
2330 case L2CAP_ECHO_REQ:
Al Viro88219a02007-07-29 00:17:25 -07002331 l2cap_send_cmd(conn, cmd.ident, L2CAP_ECHO_RSP, cmd_len, data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002332 break;
2333
2334 case L2CAP_ECHO_RSP:
2335 break;
2336
2337 case L2CAP_INFO_REQ:
2338 err = l2cap_information_req(conn, &cmd, data);
2339 break;
2340
2341 case L2CAP_INFO_RSP:
2342 err = l2cap_information_rsp(conn, &cmd, data);
2343 break;
2344
2345 default:
2346 BT_ERR("Unknown signaling command 0x%2.2x", cmd.code);
2347 err = -EINVAL;
2348 break;
2349 }
2350
2351 if (err) {
2352 struct l2cap_cmd_rej rej;
2353 BT_DBG("error %d", err);
2354
2355 /* FIXME: Map err to a valid reason */
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002356 rej.reason = cpu_to_le16(0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002357 l2cap_send_cmd(conn, cmd.ident, L2CAP_COMMAND_REJ, sizeof(rej), &rej);
2358 }
2359
Al Viro88219a02007-07-29 00:17:25 -07002360 data += cmd_len;
2361 len -= cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002362 }
2363
2364 kfree_skb(skb);
2365}
2366
2367static inline int l2cap_data_channel(struct l2cap_conn *conn, u16 cid, struct sk_buff *skb)
2368{
2369 struct sock *sk;
2370
2371 sk = l2cap_get_chan_by_scid(&conn->chan_list, cid);
2372 if (!sk) {
2373 BT_DBG("unknown cid 0x%4.4x", cid);
2374 goto drop;
2375 }
2376
2377 BT_DBG("sk %p, len %d", sk, skb->len);
2378
2379 if (sk->sk_state != BT_CONNECTED)
2380 goto drop;
2381
2382 if (l2cap_pi(sk)->imtu < skb->len)
2383 goto drop;
2384
2385 /* If socket recv buffers overflows we drop data here
2386 * which is *bad* because L2CAP has to be reliable.
2387 * But we don't have any other choice. L2CAP doesn't
2388 * provide flow control mechanism. */
2389
2390 if (!sock_queue_rcv_skb(sk, skb))
2391 goto done;
2392
2393drop:
2394 kfree_skb(skb);
2395
2396done:
Marcel Holtmann01394182006-07-03 10:02:46 +02002397 if (sk)
2398 bh_unlock_sock(sk);
2399
Linus Torvalds1da177e2005-04-16 15:20:36 -07002400 return 0;
2401}
2402
Al Viro8e036fc2007-07-29 00:16:36 -07002403static inline int l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002404{
2405 struct sock *sk;
2406
2407 sk = l2cap_get_sock_by_psm(0, psm, conn->src);
2408 if (!sk)
2409 goto drop;
2410
2411 BT_DBG("sk %p, len %d", sk, skb->len);
2412
2413 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_CONNECTED)
2414 goto drop;
2415
2416 if (l2cap_pi(sk)->imtu < skb->len)
2417 goto drop;
2418
2419 if (!sock_queue_rcv_skb(sk, skb))
2420 goto done;
2421
2422drop:
2423 kfree_skb(skb);
2424
2425done:
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -03002426 if (sk)
2427 bh_unlock_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002428 return 0;
2429}
2430
2431static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb)
2432{
2433 struct l2cap_hdr *lh = (void *) skb->data;
Al Viro8e036fc2007-07-29 00:16:36 -07002434 u16 cid, len;
2435 __le16 psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002436
2437 skb_pull(skb, L2CAP_HDR_SIZE);
2438 cid = __le16_to_cpu(lh->cid);
2439 len = __le16_to_cpu(lh->len);
2440
2441 BT_DBG("len %d, cid 0x%4.4x", len, cid);
2442
2443 switch (cid) {
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03002444 case L2CAP_CID_SIGNALING:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002445 l2cap_sig_channel(conn, skb);
2446 break;
2447
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03002448 case L2CAP_CID_CONN_LESS:
Al Viro8e036fc2007-07-29 00:16:36 -07002449 psm = get_unaligned((__le16 *) skb->data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002450 skb_pull(skb, 2);
2451 l2cap_conless_channel(conn, psm, skb);
2452 break;
2453
2454 default:
2455 l2cap_data_channel(conn, cid, skb);
2456 break;
2457 }
2458}
2459
2460/* ---- L2CAP interface with lower layer (HCI) ---- */
2461
2462static int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
2463{
2464 int exact = 0, lm1 = 0, lm2 = 0;
2465 register struct sock *sk;
2466 struct hlist_node *node;
2467
2468 if (type != ACL_LINK)
2469 return 0;
2470
2471 BT_DBG("hdev %s, bdaddr %s", hdev->name, batostr(bdaddr));
2472
2473 /* Find listening sockets and check their link_mode */
2474 read_lock(&l2cap_sk_list.lock);
2475 sk_for_each(sk, node, &l2cap_sk_list.head) {
2476 if (sk->sk_state != BT_LISTEN)
2477 continue;
2478
2479 if (!bacmp(&bt_sk(sk)->src, &hdev->bdaddr)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01002480 lm1 |= HCI_LM_ACCEPT;
2481 if (l2cap_pi(sk)->role_switch)
2482 lm1 |= HCI_LM_MASTER;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002483 exact++;
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01002484 } else if (!bacmp(&bt_sk(sk)->src, BDADDR_ANY)) {
2485 lm2 |= HCI_LM_ACCEPT;
2486 if (l2cap_pi(sk)->role_switch)
2487 lm2 |= HCI_LM_MASTER;
2488 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002489 }
2490 read_unlock(&l2cap_sk_list.lock);
2491
2492 return exact ? lm1 : lm2;
2493}
2494
2495static int l2cap_connect_cfm(struct hci_conn *hcon, u8 status)
2496{
Marcel Holtmann01394182006-07-03 10:02:46 +02002497 struct l2cap_conn *conn;
2498
Linus Torvalds1da177e2005-04-16 15:20:36 -07002499 BT_DBG("hcon %p bdaddr %s status %d", hcon, batostr(&hcon->dst), status);
2500
2501 if (hcon->type != ACL_LINK)
2502 return 0;
2503
2504 if (!status) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002505 conn = l2cap_conn_add(hcon, status);
2506 if (conn)
2507 l2cap_conn_ready(conn);
Marcel Holtmann01394182006-07-03 10:02:46 +02002508 } else
Linus Torvalds1da177e2005-04-16 15:20:36 -07002509 l2cap_conn_del(hcon, bt_err(status));
2510
2511 return 0;
2512}
2513
Marcel Holtmann2950f212009-02-12 14:02:50 +01002514static int l2cap_disconn_ind(struct hci_conn *hcon)
2515{
2516 struct l2cap_conn *conn = hcon->l2cap_data;
2517
2518 BT_DBG("hcon %p", hcon);
2519
2520 if (hcon->type != ACL_LINK || !conn)
2521 return 0x13;
2522
2523 return conn->disc_reason;
2524}
2525
2526static int l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002527{
2528 BT_DBG("hcon %p reason %d", hcon, reason);
2529
2530 if (hcon->type != ACL_LINK)
2531 return 0;
2532
2533 l2cap_conn_del(hcon, bt_err(reason));
Marcel Holtmann01394182006-07-03 10:02:46 +02002534
Linus Torvalds1da177e2005-04-16 15:20:36 -07002535 return 0;
2536}
2537
Marcel Holtmannf62e4322009-01-15 21:58:44 +01002538static inline void l2cap_check_encryption(struct sock *sk, u8 encrypt)
2539{
Marcel Holtmann255c7602009-02-04 21:07:19 +01002540 if (sk->sk_type != SOCK_SEQPACKET)
2541 return;
2542
Marcel Holtmannf62e4322009-01-15 21:58:44 +01002543 if (encrypt == 0x00) {
2544 if (l2cap_pi(sk)->sec_level == BT_SECURITY_MEDIUM) {
2545 l2cap_sock_clear_timer(sk);
2546 l2cap_sock_set_timer(sk, HZ * 5);
2547 } else if (l2cap_pi(sk)->sec_level == BT_SECURITY_HIGH)
2548 __l2cap_sock_close(sk, ECONNREFUSED);
2549 } else {
2550 if (l2cap_pi(sk)->sec_level == BT_SECURITY_MEDIUM)
2551 l2cap_sock_clear_timer(sk);
2552 }
2553}
2554
Marcel Holtmann8c1b2352009-01-15 21:58:04 +01002555static int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002556{
2557 struct l2cap_chan_list *l;
Marcel Holtmann40be4922008-07-14 20:13:50 +02002558 struct l2cap_conn *conn = hcon->l2cap_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002559 struct sock *sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002560
Marcel Holtmann01394182006-07-03 10:02:46 +02002561 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002562 return 0;
Marcel Holtmann01394182006-07-03 10:02:46 +02002563
Linus Torvalds1da177e2005-04-16 15:20:36 -07002564 l = &conn->chan_list;
2565
2566 BT_DBG("conn %p", conn);
2567
2568 read_lock(&l->lock);
2569
2570 for (sk = l->head; sk; sk = l2cap_pi(sk)->next_c) {
2571 bh_lock_sock(sk);
2572
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01002573 if (l2cap_pi(sk)->conf_state & L2CAP_CONF_CONNECT_PEND) {
2574 bh_unlock_sock(sk);
2575 continue;
2576 }
2577
Marcel Holtmannf62e4322009-01-15 21:58:44 +01002578 if (!status && (sk->sk_state == BT_CONNECTED ||
Marcel Holtmann8c1b2352009-01-15 21:58:04 +01002579 sk->sk_state == BT_CONFIG)) {
Marcel Holtmannf62e4322009-01-15 21:58:44 +01002580 l2cap_check_encryption(sk, encrypt);
Marcel Holtmann9719f8a2008-07-14 20:13:45 +02002581 bh_unlock_sock(sk);
2582 continue;
2583 }
2584
Marcel Holtmannb1235d72008-07-14 20:13:54 +02002585 if (sk->sk_state == BT_CONNECT) {
2586 if (!status) {
2587 struct l2cap_conn_req req;
2588 req.scid = cpu_to_le16(l2cap_pi(sk)->scid);
2589 req.psm = l2cap_pi(sk)->psm;
2590
2591 l2cap_pi(sk)->ident = l2cap_get_ident(conn);
2592
2593 l2cap_send_cmd(conn, l2cap_pi(sk)->ident,
2594 L2CAP_CONN_REQ, sizeof(req), &req);
2595 } else {
2596 l2cap_sock_clear_timer(sk);
2597 l2cap_sock_set_timer(sk, HZ / 10);
2598 }
2599 } else if (sk->sk_state == BT_CONNECT2) {
2600 struct l2cap_conn_rsp rsp;
2601 __u16 result;
2602
2603 if (!status) {
2604 sk->sk_state = BT_CONFIG;
2605 result = L2CAP_CR_SUCCESS;
2606 } else {
2607 sk->sk_state = BT_DISCONN;
2608 l2cap_sock_set_timer(sk, HZ / 10);
2609 result = L2CAP_CR_SEC_BLOCK;
2610 }
2611
2612 rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid);
2613 rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid);
2614 rsp.result = cpu_to_le16(result);
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02002615 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Marcel Holtmannb1235d72008-07-14 20:13:54 +02002616 l2cap_send_cmd(conn, l2cap_pi(sk)->ident,
2617 L2CAP_CONN_RSP, sizeof(rsp), &rsp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002618 }
2619
Linus Torvalds1da177e2005-04-16 15:20:36 -07002620 bh_unlock_sock(sk);
2621 }
2622
2623 read_unlock(&l->lock);
Marcel Holtmannb1235d72008-07-14 20:13:54 +02002624
Linus Torvalds1da177e2005-04-16 15:20:36 -07002625 return 0;
2626}
2627
2628static int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)
2629{
2630 struct l2cap_conn *conn = hcon->l2cap_data;
2631
2632 if (!conn && !(conn = l2cap_conn_add(hcon, 0)))
2633 goto drop;
2634
2635 BT_DBG("conn %p len %d flags 0x%x", conn, skb->len, flags);
2636
2637 if (flags & ACL_START) {
2638 struct l2cap_hdr *hdr;
2639 int len;
2640
2641 if (conn->rx_len) {
2642 BT_ERR("Unexpected start frame (len %d)", skb->len);
2643 kfree_skb(conn->rx_skb);
2644 conn->rx_skb = NULL;
2645 conn->rx_len = 0;
2646 l2cap_conn_unreliable(conn, ECOMM);
2647 }
2648
2649 if (skb->len < 2) {
2650 BT_ERR("Frame is too short (len %d)", skb->len);
2651 l2cap_conn_unreliable(conn, ECOMM);
2652 goto drop;
2653 }
2654
2655 hdr = (struct l2cap_hdr *) skb->data;
2656 len = __le16_to_cpu(hdr->len) + L2CAP_HDR_SIZE;
2657
2658 if (len == skb->len) {
2659 /* Complete frame received */
2660 l2cap_recv_frame(conn, skb);
2661 return 0;
2662 }
2663
2664 BT_DBG("Start: total len %d, frag len %d", len, skb->len);
2665
2666 if (skb->len > len) {
2667 BT_ERR("Frame is too long (len %d, expected len %d)",
2668 skb->len, len);
2669 l2cap_conn_unreliable(conn, ECOMM);
2670 goto drop;
2671 }
2672
2673 /* Allocate skb for the complete frame (with header) */
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -03002674 conn->rx_skb = bt_skb_alloc(len, GFP_ATOMIC);
2675 if (!conn->rx_skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002676 goto drop;
2677
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03002678 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Marcel Holtmanne1027a72009-02-09 09:18:02 +01002679 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002680 conn->rx_len = len - skb->len;
2681 } else {
2682 BT_DBG("Cont: frag len %d (expecting %d)", skb->len, conn->rx_len);
2683
2684 if (!conn->rx_len) {
2685 BT_ERR("Unexpected continuation frame (len %d)", skb->len);
2686 l2cap_conn_unreliable(conn, ECOMM);
2687 goto drop;
2688 }
2689
2690 if (skb->len > conn->rx_len) {
2691 BT_ERR("Fragment is too long (len %d, expected %d)",
2692 skb->len, conn->rx_len);
2693 kfree_skb(conn->rx_skb);
2694 conn->rx_skb = NULL;
2695 conn->rx_len = 0;
2696 l2cap_conn_unreliable(conn, ECOMM);
2697 goto drop;
2698 }
2699
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03002700 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Marcel Holtmanne1027a72009-02-09 09:18:02 +01002701 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002702 conn->rx_len -= skb->len;
2703
2704 if (!conn->rx_len) {
2705 /* Complete frame received */
2706 l2cap_recv_frame(conn, conn->rx_skb);
2707 conn->rx_skb = NULL;
2708 }
2709 }
2710
2711drop:
2712 kfree_skb(skb);
2713 return 0;
2714}
2715
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002716static ssize_t l2cap_sysfs_show(struct class *dev, char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002717{
2718 struct sock *sk;
2719 struct hlist_node *node;
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002720 char *str = buf;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002721
2722 read_lock_bh(&l2cap_sk_list.lock);
2723
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002724 sk_for_each(sk, node, &l2cap_sk_list.head) {
2725 struct l2cap_pinfo *pi = l2cap_pi(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002726
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01002727 str += sprintf(str, "%s %s %d %d 0x%4.4x 0x%4.4x %d %d %d\n",
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002728 batostr(&bt_sk(sk)->src), batostr(&bt_sk(sk)->dst),
Marcel Holtmannb4324b52009-06-07 18:06:51 +02002729 sk->sk_state, __le16_to_cpu(pi->psm), pi->scid,
2730 pi->dcid, pi->imtu, pi->omtu, pi->sec_level);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002731 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002732
Linus Torvalds1da177e2005-04-16 15:20:36 -07002733 read_unlock_bh(&l2cap_sk_list.lock);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002734
Gustavo F. Padovanaf05b302009-04-20 01:31:08 -03002735 return str - buf;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002736}
2737
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002738static CLASS_ATTR(l2cap, S_IRUGO, l2cap_sysfs_show, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002739
Eric Dumazet90ddc4f2005-12-22 12:49:22 -08002740static const struct proto_ops l2cap_sock_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002741 .family = PF_BLUETOOTH,
2742 .owner = THIS_MODULE,
2743 .release = l2cap_sock_release,
2744 .bind = l2cap_sock_bind,
2745 .connect = l2cap_sock_connect,
2746 .listen = l2cap_sock_listen,
2747 .accept = l2cap_sock_accept,
2748 .getname = l2cap_sock_getname,
2749 .sendmsg = l2cap_sock_sendmsg,
Marcel Holtmannf66dc812009-01-15 21:57:00 +01002750 .recvmsg = l2cap_sock_recvmsg,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002751 .poll = bt_sock_poll,
Marcel Holtmann3241ad82008-07-14 20:13:50 +02002752 .ioctl = bt_sock_ioctl,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002753 .mmap = sock_no_mmap,
2754 .socketpair = sock_no_socketpair,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002755 .shutdown = l2cap_sock_shutdown,
2756 .setsockopt = l2cap_sock_setsockopt,
2757 .getsockopt = l2cap_sock_getsockopt
2758};
2759
2760static struct net_proto_family l2cap_sock_family_ops = {
2761 .family = PF_BLUETOOTH,
2762 .owner = THIS_MODULE,
2763 .create = l2cap_sock_create,
2764};
2765
2766static struct hci_proto l2cap_hci_proto = {
2767 .name = "L2CAP",
2768 .id = HCI_PROTO_L2CAP,
2769 .connect_ind = l2cap_connect_ind,
2770 .connect_cfm = l2cap_connect_cfm,
2771 .disconn_ind = l2cap_disconn_ind,
Marcel Holtmann2950f212009-02-12 14:02:50 +01002772 .disconn_cfm = l2cap_disconn_cfm,
Marcel Holtmann8c1b2352009-01-15 21:58:04 +01002773 .security_cfm = l2cap_security_cfm,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002774 .recv_acldata = l2cap_recv_acldata
2775};
2776
2777static int __init l2cap_init(void)
2778{
2779 int err;
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002780
Linus Torvalds1da177e2005-04-16 15:20:36 -07002781 err = proto_register(&l2cap_proto, 0);
2782 if (err < 0)
2783 return err;
2784
2785 err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
2786 if (err < 0) {
2787 BT_ERR("L2CAP socket registration failed");
2788 goto error;
2789 }
2790
2791 err = hci_register_proto(&l2cap_hci_proto);
2792 if (err < 0) {
2793 BT_ERR("L2CAP protocol registration failed");
2794 bt_sock_unregister(BTPROTO_L2CAP);
2795 goto error;
2796 }
2797
Marcel Holtmanndf5c37e2006-10-15 17:30:45 +02002798 if (class_create_file(bt_class, &class_attr_l2cap) < 0)
2799 BT_ERR("Failed to create L2CAP info file");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002800
2801 BT_INFO("L2CAP ver %s", VERSION);
2802 BT_INFO("L2CAP socket layer initialized");
2803
2804 return 0;
2805
2806error:
2807 proto_unregister(&l2cap_proto);
2808 return err;
2809}
2810
2811static void __exit l2cap_exit(void)
2812{
Marcel Holtmanna91f2e32006-07-03 10:02:41 +02002813 class_remove_file(bt_class, &class_attr_l2cap);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002814
2815 if (bt_sock_unregister(BTPROTO_L2CAP) < 0)
2816 BT_ERR("L2CAP socket unregistration failed");
2817
2818 if (hci_unregister_proto(&l2cap_hci_proto) < 0)
2819 BT_ERR("L2CAP protocol unregistration failed");
2820
2821 proto_unregister(&l2cap_proto);
2822}
2823
2824void l2cap_load(void)
2825{
2826 /* Dummy function to trigger automatic L2CAP module loading by
2827 * other modules that use L2CAP sockets but don't use any other
2828 * symbols from it. */
2829 return;
2830}
2831EXPORT_SYMBOL(l2cap_load);
2832
2833module_init(l2cap_init);
2834module_exit(l2cap_exit);
2835
Marcel Holtmann44dd46d2009-05-02 19:09:01 -07002836module_param(enable_ertm, bool, 0644);
2837MODULE_PARM_DESC(enable_ertm, "Enable enhanced retransmission mode");
2838
Marcel Holtmann63fbd242008-08-18 13:23:53 +02002839MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002840MODULE_DESCRIPTION("Bluetooth L2CAP ver " VERSION);
2841MODULE_VERSION(VERSION);
2842MODULE_LICENSE("GPL");
2843MODULE_ALIAS("bt-proto-0");